X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=tapi%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Ftapi%2Fconnectivity%2FConnectivityUtils.java;h=392ae6d60736019cd6486a7e43d0a68a824c9b63;hb=268165cb2822b6ce4c55f00cac63eed2bb222ec7;hp=df390295c8930a388be6af7bbb9d86bc9d45a1b0;hpb=e4106d346bc8313726b154af4d30e3cc875b4706;p=transportpce.git diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/connectivity/ConnectivityUtils.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/connectivity/ConnectivityUtils.java index df390295c..392ae6d60 100644 --- a/tapi/src/main/java/org/opendaylight/transportpce/tapi/connectivity/ConnectivityUtils.java +++ b/tapi/src/main/java/org/opendaylight/transportpce/tapi/connectivity/ConnectivityUtils.java @@ -9,45 +9,63 @@ package org.opendaylight.transportpce.tapi.connectivity; import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.Collection; 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.common.api.LogicalDatastoreType; +import org.opendaylight.transportpce.common.network.NetworkTransactionService; import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations; -import org.opendaylight.transportpce.tapi.topology.TopologyUtils; +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.openroadm.common.equipment.types.rev181130.OpticTypes; -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.rev190531.ConnectionType; -import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.RpcActions; -import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.Service; -import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.sdnc.request.header.SdncRequestHeaderBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.endpoint.RxDirectionBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.endpoint.TxDirectionBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.lgx.LgxBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.port.PortBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev190531.ServiceFormat; -import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.ServiceCreateInput; -import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.ServiceCreateInputBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.service.create.input.ServiceAEnd; -import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.service.create.input.ServiceAEndBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.service.create.input.ServiceZEnd; -import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.service.create.input.ServiceZEndBuilder; -import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210.PathDescription; -import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210.path.description.atoz.direction.AToZ; -import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210.path.description.atoz.direction.AToZKey; -import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210.path.description.ztoa.direction.ZToA; -import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210.path.description.ztoa.direction.ZToAKey; -import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210.pce.resource.resource.resource.Node; -import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210.pce.resource.resource.resource.TerminationPoint; +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.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.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.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; @@ -59,12 +77,18 @@ import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capa 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; @@ -77,29 +101,25 @@ import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev18121 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.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.Uint16; import org.opendaylight.yangtools.yang.common.Uint32; import org.opendaylight.yangtools.yang.common.Uint64; +import org.opendaylight.yangtools.yang.common.Uint8; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class ConnectivityUtils { - private static final String LGX_PORT_NAME = "Some lgx-port-name"; - private static final String PORT_TYPE = "some port type"; - private static final String LGX_DEVICE_NAME = "Some lgx-device-name"; - private static final String PORT_RACK_VALUE = "000000.00"; - private static final String DSR = "DSR"; - private static final String ODU = "ODU"; - private static final String E_ODU = "eODU"; - private static final String I_ODU = "iODU"; - private static final String OTSI = "OTSi"; - private static final String E_OTSI = "eOTSi"; - private static final String I_OTSI = "iOTSi"; - private static final String PHTNC_MEDIA = "PHOTONIC_MEDIA"; - private static final String MC = "MEDIA_CHANNEL"; - private static final String OTSI_MC = "OTSi_MEDIA_CHANNEL"; - private static final String TP = "TerminationPoint"; - private static final String NODE = "Node"; + private final Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER + .getBytes(Charset.forName("UTF-8"))).toString()); private static final Logger LOG = LoggerFactory.getLogger(ConnectivityUtils.class); private final ServiceDataStoreOperations serviceDataStoreOperations; @@ -109,14 +129,17 @@ public final class ConnectivityUtils { .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 + private final NetworkTransactionService networkTransactionService; // TODO -> handle cases for which node id is ROADM-A1 and not ROADMA01 or XPDR-A1 and not XPDRA01 public ConnectivityUtils(ServiceDataStoreOperations serviceDataStoreOperations, - Map sipMap, TapiContext tapiContext) { + Map sipMap, TapiContext tapiContext, + NetworkTransactionService networkTransactionService) { this.serviceDataStoreOperations = serviceDataStoreOperations; this.tapiContext = tapiContext; this.sipMap = sipMap; this.connectionFullMap = new HashMap<>(); + this.networkTransactionService = networkTransactionService; } public static ServiceCreateInput buildServiceCreateInput(GenericServiceEndpoint sepA, GenericServiceEndpoint sepZ) { @@ -148,36 +171,36 @@ public final class ConnectivityUtils { .setOpticType(OpticTypes.Gray) .setServiceFormat(ServiceFormat.Ethernet) .setServiceRate(Uint32.valueOf(100)) - .setTxDirection(new TxDirectionBuilder() + .setTxDirection(Map.of(new TxDirectionKey(Uint8.ZERO), new TxDirectionBuilder() .setPort(new PortBuilder() .setPortDeviceName(txPortDeviceName) .setPortName(txPortName) - .setPortRack(PORT_RACK_VALUE) + .setPortRack(TapiStringConstants.PORT_RACK_VALUE) .setPortShelf("00") - .setPortType(PORT_TYPE) + .setPortType(TapiStringConstants.PORT_TYPE) .build()) .setLgx(new LgxBuilder() - .setLgxDeviceName(LGX_DEVICE_NAME) - .setLgxPortName(LGX_PORT_NAME) - .setLgxPortRack(PORT_RACK_VALUE) + .setLgxDeviceName(TapiStringConstants.LGX_DEVICE_NAME) + .setLgxPortName(TapiStringConstants.LGX_PORT_NAME) + .setLgxPortRack(TapiStringConstants.PORT_RACK_VALUE) .setLgxPortShelf("00") .build()) - .build()) - .setRxDirection(new RxDirectionBuilder() + .build())) + .setRxDirection(Map.of(new RxDirectionKey(Uint8.ZERO), new RxDirectionBuilder() .setPort(new PortBuilder() .setPortDeviceName(rxPortDeviceName) .setPortName(rxPortName) - .setPortRack(PORT_RACK_VALUE) + .setPortRack(TapiStringConstants.PORT_RACK_VALUE) .setPortShelf("00") - .setPortType(PORT_TYPE) + .setPortType(TapiStringConstants.PORT_TYPE) .build()) .setLgx(new LgxBuilder() - .setLgxDeviceName(LGX_DEVICE_NAME) - .setLgxPortName(LGX_PORT_NAME) - .setLgxPortRack(PORT_RACK_VALUE) + .setLgxDeviceName(TapiStringConstants.LGX_DEVICE_NAME) + .setLgxPortName(TapiStringConstants.LGX_PORT_NAME) + .setLgxPortRack(TapiStringConstants.PORT_RACK_VALUE) .setLgxPortShelf("00") .build()) - .build()) + .build())) .build(); } @@ -187,36 +210,36 @@ public final class ConnectivityUtils { .setOpticType(OpticTypes.Gray) .setServiceFormat(ServiceFormat.Ethernet) .setServiceRate(Uint32.valueOf(100)) - .setTxDirection(new TxDirectionBuilder() + .setTxDirection(Map.of(new TxDirectionKey(Uint8.ZERO), new TxDirectionBuilder() .setPort(new PortBuilder() .setPortDeviceName(txPortDeviceName) .setPortName(txPortName) - .setPortRack(PORT_RACK_VALUE) + .setPortRack(TapiStringConstants.PORT_RACK_VALUE) .setPortShelf("00") - .setPortType(PORT_TYPE) + .setPortType(TapiStringConstants.PORT_TYPE) .build()) .setLgx(new LgxBuilder() - .setLgxDeviceName(LGX_DEVICE_NAME) - .setLgxPortName(LGX_PORT_NAME) - .setLgxPortRack(PORT_RACK_VALUE) + .setLgxDeviceName(TapiStringConstants.LGX_DEVICE_NAME) + .setLgxPortName(TapiStringConstants.LGX_PORT_NAME) + .setLgxPortRack(TapiStringConstants.PORT_RACK_VALUE) .setLgxPortShelf("00") .build()) - .build()) - .setRxDirection(new RxDirectionBuilder() + .build())) + .setRxDirection(Map.of(new RxDirectionKey(Uint8.ZERO), new RxDirectionBuilder() .setPort(new PortBuilder() .setPortDeviceName(rxPortDeviceName) .setPortName(rxPortName) - .setPortRack(PORT_RACK_VALUE) + .setPortRack(TapiStringConstants.PORT_RACK_VALUE) .setPortShelf("00") - .setPortType(PORT_TYPE) + .setPortType(TapiStringConstants.PORT_TYPE) .build()) .setLgx(new LgxBuilder() - .setLgxDeviceName(LGX_DEVICE_NAME) - .setLgxPortName(LGX_PORT_NAME) - .setLgxPortRack(PORT_RACK_VALUE) + .setLgxDeviceName(TapiStringConstants.LGX_DEVICE_NAME) + .setLgxPortName(TapiStringConstants.LGX_PORT_NAME) + .setLgxPortRack(TapiStringConstants.PORT_RACK_VALUE) .setLgxPortShelf("00") .build()) - .build()) + .build())) .build(); } @@ -256,11 +279,11 @@ public final class ConnectivityUtils { ServicePaths servicePaths = optServicePaths.get(); PathDescription pathDescription = servicePaths.getPathDescription(); LOG.info("Path description of service = {}", pathDescription); - org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.ServiceAEnd serviceAEnd + org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceAEnd serviceAEnd = service.getServiceAEnd(); // Endpoint creation EndPoint endPoint1 = mapServiceAEndPoint(serviceAEnd, pathDescription); - org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.ServiceZEnd serviceZEnd + org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceZEnd serviceZEnd = service.getServiceZEnd(); EndPoint endPoint2 = mapServiceZEndPoint(serviceZEnd, pathDescription); Map endPointMap = new HashMap<>(); @@ -280,6 +303,8 @@ public final class ConnectivityUtils { .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) .setName(Map.of(name.key(), name)) .setConnection(connMap) @@ -287,10 +312,44 @@ public final class ConnectivityUtils { .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 createConnectionsFromService( - org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.ServiceAEnd + 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.rev190531.service.ServiceZEnd + org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceZEnd serviceZEnd, PathDescription pathDescription) { Map connectionServMap = new HashMap<>(); @@ -308,7 +367,7 @@ public final class ConnectivityUtils { .sorted(Comparator.comparing(AToZ::getId)).collect(Collectors.toList())) { resourceType = elem.getResource().getResource().implementedInterface().getSimpleName(); switch (resourceType) { - case TP: + case TapiStringConstants.TP: TerminationPoint tp = (TerminationPoint) elem.getResource().getResource(); String tpID = tp.getTpId(); String tpNode; @@ -339,7 +398,7 @@ public final class ConnectivityUtils { } } break; - case NODE: + case TapiStringConstants.NODE: Node node = (Node) elem.getResource().getResource(); String nodeId = node.getNodeId(); if (nodeId.contains("XPDR") || nodeId.contains("SPDR") || nodeId.contains("MXPDR")) { @@ -380,7 +439,12 @@ 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 -> better mechanism to map services??? + // 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: // Identify number of ROADMs @@ -404,26 +468,35 @@ public final class ConnectivityUtils { connectionServMap.putAll(createXpdrCepsAndConnectionsPht(xpdrNetworkTplist, xpdrNodelist)); break; case ODU: - // Check if OC and OTU are created - if (!rdmNodelist.isEmpty()) { - connectionServMap.putAll(createRoadmCepsAndConnections(rdmAddDropTplist, rdmDegTplist, rdmNodelist, - edgeRoadm1, edgeRoadm2)); - connectionServMap.putAll(createXpdrCepsAndConnectionsPht(xpdrNetworkTplist, xpdrNodelist)); - } // - XC Connection OTSi betwwen iODU and eODU of xpdr // - Top connection in the ODU layer, between xpdr eODU ports (?) connectionServMap.putAll(createXpdrCepsAndConnectionsOdu(xpdrNetworkTplist, xpdrNodelist)); break; case Ethernet: // Check if OC, OTU and ODU are created - if (!rdmNodelist.isEmpty()) { + if (openroadmNodeType.equals(OpenroadmNodeType.TPDR)) { + LOG.info("WDM ETH service"); 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)); + } + 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)); } - // Top connection in the DSR layer, between client ports of the xpdrs - connectionServMap.putAll(createXpdrCepsAndConnectionsDsr(xpdrClientTplist, xpdrNodelist)); break; default: LOG.error("Service type format not supported"); @@ -431,21 +504,90 @@ public final class ConnectivityUtils { return connectionServMap; } + private Map createXpdrCepsAndConnectionsEth(List xpdrClientTplist, + List xpdrNodelist, + Map 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 xcMap = new HashMap<>(); + for (Connection lowConn: lowerConn.values()) { + LowerConnection conn = new LowerConnectionBuilder().setConnectionUuid(lowConn.getConnectionUuid()).build(); + xcMap.put(conn.key(), conn); + } + Map connServMap = new HashMap<>(); + Map 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 createXpdrCepsAndConnectionsDsr(List xpdrClientTplist, + List xpdrNetworkTplist, List xpdrNodelist) { Map connServMap = new HashMap<>(); Map cepMap = new HashMap<>(); + ConnectionEndPoint> cepMapDsr = new HashMap<>(); + Map 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 xcMap = new HashMap<>(); - // Create 1 cep per Xpdr in the CLIENT and a top connection DSR between the CLIENT xpdrs + // 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, DSR, DSR, LayerProtocolName.DSR); - putXpdrCepInTopologyContext(xpdr, spcXpdrClient, DSR, DSR, netCep1); + ConnectionEndPoint netCep1 = createCepXpdr(spcXpdrClient, TapiStringConstants.DSR, TapiStringConstants.DSR, + LayerProtocolName.DSR); + putXpdrCepInTopologyContext(xpdr, spcXpdrClient, TapiStringConstants.DSR, TapiStringConstants.DSR, netCep1); - cepMap.put(netCep1.key(), 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); } // DSR top connection between edge xpdr CLIENT DSR @@ -453,13 +595,26 @@ public final class ConnectivityUtils { .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 - connection = createTopConnection(spcXpdr1, spcXpdr2, cepMap, DSR, LayerProtocolName.DSR); - this.connectionFullMap.put(connection.key(), 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 - Connection conn = new ConnectionBuilder().setConnectionUuid(connection.getUuid()).build(); + 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); + + 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; } @@ -469,38 +624,32 @@ public final class ConnectivityUtils { Map connServMap = new HashMap<>(); Map cepMap = new HashMap<>(); - // Create 1 cep per Xpdr in the I_ODU and E_ODU, X connection between iODU and eODU and a top + // 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 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, E_ODU, DSR, LayerProtocolName.ODU); - putXpdrCepInTopologyContext(xpdr, spcXpdrNetwork, E_ODU, DSR, netCep1); - ConnectionEndPoint netCep2 = createCepXpdr(spcXpdrNetwork, I_ODU, DSR, LayerProtocolName.ODU); - putXpdrCepInTopologyContext(xpdr, spcXpdrNetwork, I_ODU, DSR, netCep2); + 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); - cepMap.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(netCep1, netCep2, spcXpdrNetwork, spcXpdrNetwork, ODU, - LayerProtocolName.ODU); - this.connectionFullMap.put(connection.key(), connection); - - // Create X connection that will be added to the service object - Connection conn = new ConnectionBuilder().setConnectionUuid(connection.getUuid()).build(); - connServMap.put(conn.key(), conn); } - // ODU top connection between edge xpdr e_ODU + // 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, E_ODU, LayerProtocolName.ODU); + 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 @@ -515,6 +664,9 @@ public final class ConnectivityUtils { Map connServMap = new HashMap<>(); Map 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 xcMap = new HashMap<>(); // create ceps and x connections within xpdr for (String xpdr:xpdrNodelist) { @@ -524,26 +676,31 @@ public final class ConnectivityUtils { // 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, PHTNC_MEDIA, OTSI, - LayerProtocolName.PHOTONICMEDIA); - putXpdrCepInTopologyContext(xpdr, spcXpdrNetwork, PHTNC_MEDIA, OTSI, netCep1); - ConnectionEndPoint netCep2 = createCepXpdr(spcXpdrNetwork, E_OTSI, OTSI, LayerProtocolName.PHOTONICMEDIA); - putXpdrCepInTopologyContext(xpdr, spcXpdrNetwork, E_OTSI, OTSI, netCep2); - ConnectionEndPoint netCep3 = createCepXpdr(spcXpdrNetwork, I_OTSI, OTSI, LayerProtocolName.PHOTONICMEDIA); - putXpdrCepInTopologyContext(xpdr, spcXpdrNetwork, I_OTSI, OTSI, netCep3); + 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, OTSI, - LayerProtocolName.PHOTONICMEDIA); + 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 - Connection conn = new ConnectionBuilder().setConnectionUuid(connection.getUuid()).build(); - connServMap.put(conn.key(), conn); + 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 @@ -551,7 +708,8 @@ public final class ConnectivityUtils { 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, I_OTSI, LayerProtocolName.PHOTONICMEDIA); + 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 @@ -566,10 +724,11 @@ public final class ConnectivityUtils { List rdmDegTplist, List rdmNodelist, String edgeRoadm1, String edgeRoadm2) { - // TODO: will need to check if things exist already or not + // TODO: when the number of roadms between 2 SPDR/XPDR is more thatn 1, we need to refine this code Map connServMap = new HashMap<>(); Map cepMap = new HashMap<>(); + Map xcMap = new HashMap<>(); // create ceps and x connections within roadm for (String roadm : rdmNodelist) { LOG.info("Creating ceps and xc for roadm {}", roadm); @@ -581,12 +740,12 @@ public final class ConnectivityUtils { // 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, PHTNC_MEDIA); - putRdmCepInTopologyContext(roadm, spcRdmAD, PHTNC_MEDIA, adCep1); - ConnectionEndPoint adCep2 = createCepRoadm(spcRdmAD, MC); - putRdmCepInTopologyContext(roadm, spcRdmAD, MC, adCep2); - ConnectionEndPoint adCep3 = createCepRoadm(spcRdmAD, OTSI_MC); - putRdmCepInTopologyContext(roadm, spcRdmAD, OTSI_MC, adCep3); + 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); @@ -594,12 +753,12 @@ public final class ConnectivityUtils { String spcRdmDEG = rdmDegTplist.stream().filter(adp -> adp.contains(roadm)).findFirst().get(); LOG.info("Degree port of ROADm {} = {}", roadm, spcRdmDEG); - ConnectionEndPoint degCep1 = createCepRoadm(spcRdmDEG, PHTNC_MEDIA); - putRdmCepInTopologyContext(roadm, spcRdmDEG, PHTNC_MEDIA, degCep1); - ConnectionEndPoint degCep2 = createCepRoadm(spcRdmDEG, MC); - putRdmCepInTopologyContext(roadm, spcRdmDEG, MC, degCep2); - ConnectionEndPoint degCep3 = createCepRoadm(spcRdmDEG, OTSI_MC); - putRdmCepInTopologyContext(roadm, spcRdmDEG, OTSI_MC, degCep3); + 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); @@ -607,21 +766,22 @@ public final class ConnectivityUtils { 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, MC, + 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, OTSI_MC, + 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 - Connection conn1 = new ConnectionBuilder().setConnectionUuid(connection1.getUuid()).build(); - Connection conn2 = new ConnectionBuilder().setConnectionUuid(connection2.getUuid()).build(); - connServMap.put(conn1.key(), conn1); - connServMap.put(conn2.key(), conn2); + 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 @@ -639,13 +799,16 @@ public final class ConnectivityUtils { // 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, MC, LayerProtocolName.PHOTONICMEDIA); + 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); } // OTSiMC top connection between edge roadms @@ -653,8 +816,8 @@ public final class ConnectivityUtils { 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, OTSI_MC, - LayerProtocolName.PHOTONICMEDIA); + connection = createTopConnection(spcRdmAD1, spcRdmAD2, cepMap, TapiStringConstants.OTSI_MC, + LayerProtocolName.PHOTONICMEDIA, xcMap); this.connectionFullMap.put(connection.key(), connection); LOG.info("Top connection created = {}", connection); @@ -668,7 +831,8 @@ public final class ConnectivityUtils { createTopConnection(String tp1, String tp2, Map cepMap, String qual, LayerProtocolName topPortocol) { + ConnectionEndPoint> cepMap, String qual, LayerProtocolName topPortocol, + Map 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 = @@ -728,6 +892,7 @@ public final class ConnectivityUtils { .setLayerProtocolName(topPortocol) .setLifecycleState(LifecycleState.INSTALLED) .setDirection(ForwardingDirection.BIDIRECTIONAL) + .setLowerConnection(xcMap) .build(); } @@ -798,7 +963,7 @@ public final class ConnectivityUtils { .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+",id.split("\\+")[0], qualifier)).getBytes(Charset.forName("UTF-8"))) .toString())) - .setTopologyUuid(new Uuid(UUID.nameUUIDFromBytes(TopologyUtils.T0_FULL_MULTILAYER + .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...) @@ -831,7 +996,7 @@ public final class ConnectivityUtils { .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+",id.split("\\+")[0], nodeLayer)).getBytes(Charset.forName("UTF-8"))) .toString())) - .setTopologyUuid(new Uuid(UUID.nameUUIDFromBytes(TopologyUtils.T0_FULL_MULTILAYER + .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...) @@ -851,7 +1016,7 @@ public final class ConnectivityUtils { } private EndPoint mapServiceZEndPoint( - org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.ServiceZEnd + org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceZEnd serviceZEnd, PathDescription pathDescription) { EndPointBuilder endPointBuilder = new EndPointBuilder(); // 1. Service Format: ODU, OTU, ETH @@ -876,10 +1041,18 @@ 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() + .setValueName("OpenROADM info") + .setValue(String.join("-", serviceZEnd.getClli(), + serviceZEnd.getTxDirection().values().stream().findFirst().get().getPort().getPortDeviceName(), + serviceZEnd.getTxDirection().values().stream().findFirst().get().getPort().getPortName())) + .build(); return endPointBuilder .setServiceInterfacePoint(new ServiceInterfacePointBuilder() .setServiceInterfacePointUuid(sipUuid) .build()) + .setName(Map.of(name.key(), name)) .setAdministrativeState(AdministrativeState.UNLOCKED) .setDirection(PortDirection.BIDIRECTIONAL) .setLifecycleState(LifecycleState.INSTALLED) @@ -894,12 +1067,13 @@ public final class ConnectivityUtils { .build()) .setProtectionRole(ProtectionRole.WORK) .setRole(PortRole.SYMMETRIC) - .setLocalId(serviceNodeId) + .setLocalId(serviceZEnd.getTxDirection().values().stream().findFirst().get() + .getPort().getPortDeviceName()) .build(); } private EndPoint mapServiceAEndPoint( - org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.ServiceAEnd + org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceAEnd serviceAEnd, PathDescription pathDescription) { EndPointBuilder endPointBuilder = new EndPointBuilder(); // 1. Service Format: ODU, OTU, ETH @@ -924,10 +1098,18 @@ 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() + .setValueName("OpenROADM info") + .setValue(String.join("-", serviceAEnd.getClli(), + serviceAEnd.getTxDirection().values().stream().findFirst().get().getPort().getPortDeviceName(), + serviceAEnd.getTxDirection().values().stream().findFirst().get().getPort().getPortName())) + .build(); return endPointBuilder .setServiceInterfacePoint(new ServiceInterfacePointBuilder() .setServiceInterfacePointUuid(sipUuid) .build()) + .setName(Map.of(name.key(), name)) .setAdministrativeState(AdministrativeState.UNLOCKED) .setDirection(PortDirection.BIDIRECTIONAL) .setLifecycleState(LifecycleState.INSTALLED) @@ -942,7 +1124,7 @@ public final class ConnectivityUtils { .build()) .setProtectionRole(ProtectionRole.WORK) .setRole(PortRole.SYMMETRIC) - .setLocalId(serviceNodeId) + .setLocalId(serviceAEnd.getTxDirection().values().stream().findFirst().get().getPort().getPortDeviceName()) .build(); } @@ -954,9 +1136,9 @@ public final class ConnectivityUtils { ZToA firstElement = mapztoa.values().stream().filter(ztoa -> ztoa.getId().equals("0")).findFirst().get(); TerminationPoint tp = (TerminationPoint) firstElement.getResource().getResource(); Uuid sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP", - tp.getTpNodeId(), MC, tp.getTpId())).getBytes(Charset.forName("UTF-8"))) + tp.getTpNodeId(), TapiStringConstants.MC, tp.getTpId())).getBytes(Charset.forName("UTF-8"))) .toString()); - LOG.info("SIP name = {}", String.join("+", tp.getTpNodeId(), MC, tp.getTpId())); + 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()); @@ -976,27 +1158,31 @@ public final class ConnectivityUtils { 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(), E_ODU, tp.getTpId())).getBytes(Charset.forName("UTF-8"))) + tp.getTpNodeId(), TapiStringConstants.I_ODU, tp.getTpId())).getBytes(Charset.forName("UTF-8"))) .toString()); - LOG.info("SIP name = {}", String.join("+", tp.getTpNodeId(), E_ODU, tp.getTpId())); + 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(), I_OTSI, tp.getTpId())).getBytes(Charset.forName("UTF-8"))) + tp.getTpNodeId(), TapiStringConstants.I_OTSI, tp.getTpId())).getBytes(Charset.forName("UTF-8"))) .toString()); - LOG.info("SIP name = {}", String.join("+", tp.getTpNodeId(), I_OTSI, tp.getTpId())); + 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(), DSR, tp.getTpId())).getBytes(Charset.forName("UTF-8"))) + tp.getTpNodeId(), TapiStringConstants.DSR, tp.getTpId())).getBytes(Charset.forName("UTF-8"))) .toString()); - LOG.info("SIP name = {}", String.join("+", tp.getTpNodeId(), DSR, tp.getTpId())); + LOG.info("SIP name = {}", String.join("+", tp.getTpNodeId(), TapiStringConstants.DSR, + tp.getTpId())); break; default: sipUuid = null; @@ -1025,9 +1211,10 @@ public final class ConnectivityUtils { 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(), MC, tp.getTpId())).getBytes(Charset.forName("UTF-8"))) + tp.getTpNodeId(), TapiStringConstants.MC, tp.getTpId())).getBytes(Charset.forName("UTF-8"))) .toString()); - LOG.info("ROADM SIP name = {}", String.join("+", tp.getTpNodeId(), MC, tp.getTpId())); + 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()); @@ -1047,27 +1234,31 @@ public final class ConnectivityUtils { 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(), E_ODU, tp.getTpId())).getBytes(Charset.forName("UTF-8"))) + tp.getTpNodeId(), TapiStringConstants.I_ODU, tp.getTpId())).getBytes(Charset.forName("UTF-8"))) .toString()); - LOG.info("ODU XPDR SIP name = {}", String.join("+", tp.getTpNodeId(), E_ODU, tp.getTpId())); + 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(), I_OTSI, tp.getTpId())).getBytes(Charset.forName("UTF-8"))) + tp.getTpNodeId(), TapiStringConstants.I_OTSI, tp.getTpId())).getBytes(Charset.forName("UTF-8"))) .toString()); - LOG.info("OTU XPDR SIP name = {}", String.join("+", tp.getTpNodeId(), I_OTSI, tp.getTpId())); + 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(), DSR, tp.getTpId())).getBytes(Charset.forName("UTF-8"))) + tp.getTpNodeId(), TapiStringConstants.DSR, tp.getTpId())).getBytes(Charset.forName("UTF-8"))) .toString()); - LOG.info("DSR XPDR SIP name = {}", String.join("+", tp.getTpNodeId(), DSR, tp.getTpId())); + LOG.info("DSR XPDR SIP name = {}", String.join("+", tp.getTpNodeId(), + TapiStringConstants.DSR, tp.getTpId())); break; default: sipUuid = null; @@ -1087,11 +1278,11 @@ public final class ConnectivityUtils { 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, PHTNC_MEDIA)); + 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(TopologyUtils.T0_FULL_MULTILAYER + 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, PHTNC_MEDIA) + 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()); @@ -1101,7 +1292,7 @@ public final class ConnectivityUtils { 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(TopologyUtils.T0_FULL_MULTILAYER + 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()); @@ -1118,7 +1309,412 @@ public final class ConnectivityUtils { } 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]; + return nodeid.matches("[A-Z]{5}-[A-Z0-9]{2}-.*") ? String.join("-", nodeid.split("-")[0], + nodeid.split("-")[1]) : nodeid.split("-")[0]; + } + + public ServiceCreateInput createORServiceInput(CreateConnectivityServiceInput input, Uuid serviceUuid) { + // TODO: not taking into account all the constraints. Only using EndPoints and Connectivity Constraint. + Map + 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 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) { + // 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 = + this.tapiContext.getTapiNode(this.tapiTopoUuid, nodeUuid); + if (node == null) { + LOG.error("Node not found in datastore"); + return null; + } + // TODO -> in case of a DSR service, for some requests we need the NETWORK PORT and not the CLIENT although the + // 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))) { + nep = onep; + break; + } + } + if (nep == null) { + LOG.error("Nep not found in datastore"); + return null; + } + String nodeName = endPoint.getName().values().stream().findFirst().get().getValue(); + String nodeid = String.join("-", nodeName.split("-")[0], nodeName.split("-")[1]); + String nepName = nep.getName().values().stream().findFirst().get().getValue(); + String txPortDeviceName = nepName.split("\\+")[0]; + String txPortName = nepName.split("\\+")[2]; + String rxPortDeviceName = txPortDeviceName; + String rxPortName = txPortName; + LOG.debug("Node z id = {}, txportDeviceName = {}, txPortName = {}", nodeid, txPortDeviceName, txPortName); + LOG.debug("Node z id = {}, rxportDeviceName = {}, rxPortName = {}", nodeid, rxPortDeviceName, rxPortName); + // TODO --> get clli from datastore? + String clli = "NodeSC"; + LOG.info("Node z id = {}, txportDeviceName = {}, txPortName = {}", nodeid, txPortDeviceName, txPortName); + LOG.info("Node z id = {}, rxportDeviceName = {}, rxPortName = {}", nodeid, rxPortDeviceName, rxPortName); + ServiceZEndBuilder serviceZEndBuilder = new ServiceZEndBuilder() + .setClli(clli) + .setNodeId(new NodeIdType(nodeid)) + .setOpticType(OpticTypes.Gray) + .setServiceFormat(serviceFormat) + .setServiceRate(Uint32.valueOf(capacity)) + .setEthernetAttributes(new EthernetAttributesBuilder().setSubrateEthSla(new SubrateEthSlaBuilder() + .setCommittedBurstSize(Uint16.valueOf(64)) + .setCommittedInfoRate(Uint32.valueOf(100000)) + .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()) + .setIndex(Uint8.ZERO) + .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()) + .setIndex(Uint8.ZERO) + .build())); + if (serviceFormat.equals(ServiceFormat.ODU)) { + serviceZEndBuilder.setOduServiceRate(ODU4.class); + } + if (serviceFormat.equals(ServiceFormat.OTU)) { + serviceZEndBuilder.setOtuServiceRate(OTU4.class); + } + if (!serviceLayer.equals(LayerProtocolName.ETH)) { + serviceZEndBuilder + .setEthernetAttributes(new EthernetAttributesBuilder().setSubrateEthSla(new SubrateEthSlaBuilder() + .setCommittedBurstSize(Uint16.valueOf(64)) + .setCommittedInfoRate(Uint32.valueOf(100000)) + .build()) + .build()); + } + return serviceZEndBuilder.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) { + // 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 = + this.tapiContext.getTapiNode(this.tapiTopoUuid, nodeUuid); + if (node == null) { + LOG.error("Node not found in datastore"); + return null; + } + // TODO -> in case of a DSR service, for some requests we need the NETWORK PORT and not the CLIENT although the + // 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))) { + nep = onep; + break; + } + } + if (nep == null) { + LOG.error("Nep not found in datastore"); + return null; + } + String nodeName = endPoint.getName().values().stream().findFirst().get().getValue(); + String nodeid = String.join("-", nodeName.split("-")[0], nodeName.split("-")[1]); + String nepName = nep.getName().values().stream().findFirst().get().getValue(); + String txPortDeviceName = nepName.split("\\+")[0]; + String txPortName = nepName.split("\\+")[2]; + String rxPortDeviceName = txPortDeviceName; + String rxPortName = txPortName; + LOG.debug("Node a id = {}, txportDeviceName = {}, txPortName = {}", nodeid, txPortDeviceName, txPortName); + LOG.debug("Node a id = {}, rxportDeviceName = {}, rxPortName = {}", nodeid, rxPortDeviceName, rxPortName); + // TODO --> get clli from datastore? + String clli = "NodeSA"; + LOG.info("Node a id = {}, txportDeviceName = {}, txPortName = {}", nodeid, txPortDeviceName, txPortName); + LOG.info("Node a id = {}, rxportDeviceName = {}, rxPortName = {}", nodeid, rxPortDeviceName, rxPortName); + ServiceAEndBuilder serviceAEndBuilder = new ServiceAEndBuilder() + .setClli(clli) + .setNodeId(new NodeIdType(nodeid)) + .setOpticType(OpticTypes.Gray) + .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()) + .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()) + .setIndex(Uint8.ZERO) + .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()) + .setIndex(Uint8.ZERO) + .build())); + if (serviceFormat.equals(ServiceFormat.ODU)) { + serviceAEndBuilder.setOduServiceRate(ODU4.class); + } + 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)) + .build()) + .build()); + } + return serviceAEndBuilder.build(); + } + + private ConnectionType getConnectionTypePhtnc(Collection endPoints) { + if (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; + } + + private ServiceFormat getServiceFormatPhtnc(Collection endPoints) { + if (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; + } + + 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); + } + + private String getAssociatedNetworkPort(String spcXpdrClient, List xpdrNetworkTplist) { + for (String networkPort:xpdrNetworkTplist) { + if (networkPort.split("\\+")[0].equals(spcXpdrClient.split("\\+")[0])) { + return networkPort; + } + } + return null; + } + + private List getAssociatedClientsPort(List xpdrNetworkTplist) { + List 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 mapIID = InstanceIdentifier.builder(Network.class) + .child(Nodes.class, new NodesKey(nodeId)) + .child(Mapping.class, new MappingKey(tpId)).build(); + try { + Optional 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; + } + + private OpenroadmNodeType getOpenRoadmNodeType(List xpdrNodelist) { + List 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 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 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); } }