From 6eca761ea7b65b2eb996a0a845efe5df6da526e8 Mon Sep 17 00:00:00 2001 From: shweta Date: Tue, 10 Dec 2019 16:31:04 +0100 Subject: [PATCH] init Renderer code for OTN Services JIRA: TRNSPRTPCE-174 Signed-off-by: shweta Change-Id: I1b95a4402038ce450822e3ba84f85f4b677927b6 --- .gitignore | 4 +- .../yang/transportpce-olm@2017-04-18.yang | 2 +- .../common/crossconnect/CrossConnect.java | 5 + .../common/crossconnect/CrossConnectImpl.java | 7 + .../crossconnect/CrossConnectImpl221.java | 73 +++- .../OpenRoadmInterfaces.java | 24 ++ .../OpenRoadmInterfacesImpl.java | 14 + .../OpenRoadmInterfaceFactory.java | 35 +- .../OpenRoadmOTNInterface.java | 313 ++++++++++++++++++ .../OtnDeviceRendererService.java | 17 + .../OtnDeviceRendererServiceImpl.java | 139 ++++++++ .../otn/OtnDeviceOperations.java | 39 +++ .../otn/OtnDeviceOperationsImpl.java | 137 ++++++++ .../renderer/rpcs/DeviceRendererRPCImpl.java | 17 +- .../OSGI-INF/blueprint/renderer-blueprint.xml | 13 + ...ceRendererServiceImplCreateOtsOmsTest.java | 4 +- ...ndererServiceOperationsImplDeleteTest.java | 4 +- .../RendererServiceOperationsImplTest.java | 4 +- .../rpcs/DeviceRendererRPCImplTest.java | 4 +- .../renderer/stub/MountPointStub.java | 1 - 20 files changed, 832 insertions(+), 24 deletions(-) create mode 100644 renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmOTNInterface.java create mode 100644 renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/OtnDeviceRendererService.java create mode 100644 renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/OtnDeviceRendererServiceImpl.java create mode 100644 renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/otn/OtnDeviceOperations.java create mode 100644 renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/otn/OtnDeviceOperationsImpl.java diff --git a/.gitignore b/.gitignore index 1c5724bbe..688e2cd8b 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ classes ordmodels/src/main/java tests/config.xml tests/models +<<<<<<< HEAD *.log *.log.* __pycache__ @@ -31,7 +32,8 @@ __pycache__ *.swp nosetests.xml api/src/main/java +api/src/main/java/org/opendaylight/yang/gen/v1/gnpy/path/rev190502/TeTpIdBuilder.java +api/src/main/java/org/opendaylight/yang/gen/v1/gnpy/path/rev190502/AccumulatedMetricTypeBuilder.java # Sphinx documentation .tox/ docs/_build/ - diff --git a/api/src/main/yang/transportpce-olm@2017-04-18.yang b/api/src/main/yang/transportpce-olm@2017-04-18.yang index 1ae23a155..bb1e2b8ab 100644 --- a/api/src/main/yang/transportpce-olm@2017-04-18.yang +++ b/api/src/main/yang/transportpce-olm@2017-04-18.yang @@ -112,7 +112,7 @@ module transportpce-olm { } } description - "Soruce type defines whether RPC runs for all links or given link Id"; + "Source type defines whether RPC runs for all links or given link Id"; } leaf link-id { when "../src-type = 'link'"; diff --git a/common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnect.java b/common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnect.java index faf887f64..3d5c1ae87 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnect.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnect.java @@ -12,6 +12,7 @@ import java.math.BigDecimal; import java.util.List; import java.util.Optional; import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException; +import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev200128.otn.renderer.input.Nodes; public interface CrossConnect { @@ -97,4 +98,8 @@ public interface CrossConnect { */ boolean setPowerLevel(String deviceId, Enum mode, BigDecimal powerValue, String connectionNumber); + + Optional postOtnCrossConnect(List createdOduInterfaces, Nodes node) throws + OpenRoadmInterfaceException; + } diff --git a/common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl.java b/common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl.java index 8ec33c505..c4bde346f 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl.java @@ -18,6 +18,7 @@ import java.util.Optional; import org.opendaylight.transportpce.common.device.DeviceTransactionManager; import org.opendaylight.transportpce.common.mapping.MappingUtils; import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException; +import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev200128.otn.renderer.input.Nodes; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -103,4 +104,10 @@ public class CrossConnectImpl implements CrossConnect { } return false; } + + @Override + public Optional postOtnCrossConnect(List createdOduInterfaces, Nodes node) + throws OpenRoadmInterfaceException { + return crossConnectImpl221.postOtnCrossConnect(createdOduInterfaces, node); + } } diff --git a/common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl221.java b/common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl221.java index bbe54cea8..341bd61ec 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl221.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl221.java @@ -29,14 +29,18 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.Op import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.PowerDBm; 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.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.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.rev200128.otn.renderer.input.Nodes; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; @@ -60,19 +64,17 @@ public class CrossConnectImpl221 { public Optional postCrossConnect(String deviceId, Long waveNumber, String srcTp, String destTp) { - RoadmConnectionsBuilder rdmConnBldr = new RoadmConnectionsBuilder(); String connectionNumber = generateConnectionName(srcTp, destTp, waveNumber); - rdmConnBldr.setConnectionName(connectionNumber); + RoadmConnectionsBuilder rdmConnBldr = new RoadmConnectionsBuilder() + .setConnectionName(connectionNumber) + .setOpticalControlMode(OpticalControlMode.Off) + .setSource(new SourceBuilder().setSrcIf(srcTp + "-nmc-" + waveNumber).build()) + .setDestination(new DestinationBuilder().setDstIf(destTp + "-nmc-" + waveNumber) + .build()); - rdmConnBldr.setOpticalControlMode(OpticalControlMode.Off); - - rdmConnBldr.setSource(new SourceBuilder().setSrcIf(srcTp + "-nmc-" + waveNumber).build()); - - rdmConnBldr.setDestination(new DestinationBuilder().setDstIf(destTp + "-nmc-" + waveNumber).build()); - - - InstanceIdentifier rdmConnectionIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) - .child(RoadmConnections.class, new RoadmConnectionsKey(rdmConnBldr.getConnectionName())); + InstanceIdentifier rdmConnectionIID = + InstanceIdentifier.create(OrgOpenroadmDevice.class) + .child(RoadmConnections.class, new RoadmConnectionsKey(rdmConnBldr.getConnectionName())); Future> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(deviceId); DeviceTransaction deviceTx; @@ -246,4 +248,53 @@ public class CrossConnectImpl221 { private String generateConnectionName(String srcTp, String destTp, Long waveNumber) { return srcTp + "-" + destTp + "-" + waveNumber; } + + public Optional postOtnCrossConnect(List 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 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> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(deviceId); + DeviceTransaction deviceTx; + try { + Optional deviceTxOpt = deviceTxFuture.get(); + if (deviceTxOpt.isPresent()) { + deviceTx = deviceTxOpt.get(); + } else { + LOG.error("Device transaction for device {} was not found!", deviceId); + return Optional.empty(); + } + } catch (InterruptedException | ExecutionException e) { + LOG.error("Unable to obtain device transaction for device {}!", deviceId, e); + return Optional.empty(); + } + + // post the cross connect on the device + deviceTx.merge(LogicalDatastoreType.CONFIGURATION, oduConnectionIID, oduConnectionBuilder.build()); + FluentFuture 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); + } catch (InterruptedException | ExecutionException e) { + LOG.warn("Failed to post {}. Exception: {}", oduConnectionBuilder.build(), e); + } + return Optional.empty(); + } } diff --git a/common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfaces.java b/common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfaces.java index e6b236010..1c5622d88 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfaces.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfaces.java @@ -81,4 +81,28 @@ public interface OpenRoadmInterfaces { */ void deleteInterface(String nodeId, String interfaceName) throws OpenRoadmInterfaceException; + /** + * This methods does an edit-config operation on the openROADM device in + * order to create the OTN given interface. + * + * @param nodeId node ID + * @param ifBuilder Builder object containing the data to post + * @throws OpenRoadmInterfaceException OpenRoadm Interface Exception + */ + void postOTNInterface(String nodeId, T ifBuilder) throws OpenRoadmInterfaceException; + + /** + * This methods does an edit-config operation on the openROADM device in + * order to manages the equipment-state status of the circuit pack on which + * OTN interfaces are created. + * + * @param nodeId node ID + * @param circuitPackName Circtuit-Pack name + * @param activate activate or not + * + * @throws OpenRoadmInterfaceException OpenRoadm Interface Exception + */ + void postOTNEquipmentState(String nodeId, String circuitPackName, boolean activate) + throws OpenRoadmInterfaceException; + } diff --git a/common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfacesImpl.java b/common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfacesImpl.java index 7684df1e1..9363a44b8 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfacesImpl.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfacesImpl.java @@ -101,6 +101,20 @@ public class OpenRoadmInterfacesImpl implements OpenRoadmInterfaces { } + @Override + public void postOTNInterface(String nodeId, T ifBuilder) throws OpenRoadmInterfaceException { + org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.InterfaceBuilder + ifBuilder22 = (org.opendaylight.yang.gen.v1.http.org.openroadm + .device.rev181019.interfaces.grp.InterfaceBuilder) ifBuilder; + openRoadmInterfacesImpl221.postInterface(nodeId,ifBuilder22); + } + + @Override + public void postOTNEquipmentState(String nodeId, String circuitPackName, boolean activate) + throws OpenRoadmInterfaceException { + openRoadmInterfacesImpl221.postEquipmentState(nodeId, circuitPackName, activate); + } + private T convertInstanceOfInterface(Object object, Class classToCast) { try { return classToCast.cast(object); diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterfaceFactory.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterfaceFactory.java index 608b0e47b..19ac75bd1 100644 --- a/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterfaceFactory.java +++ b/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterfaceFactory.java @@ -23,13 +23,14 @@ public class OpenRoadmInterfaceFactory { private final MappingUtils mappingUtils; private final OpenRoadmInterface121 openRoadmInterface121; private final OpenRoadmInterface221 openRoadmInterface221; - + private final OpenRoadmOTNInterface openRoadmOTNInterface; public OpenRoadmInterfaceFactory(MappingUtils mappingUtils, OpenRoadmInterface121 openRoadmInterface121, - OpenRoadmInterface221 openRoadmInterface221) { + OpenRoadmInterface221 openRoadmInterface221, OpenRoadmOTNInterface openRoadmOTNInterface) { this.mappingUtils = mappingUtils; this.openRoadmInterface121 = openRoadmInterface121; this.openRoadmInterface221 = openRoadmInterface221; + this.openRoadmOTNInterface = openRoadmOTNInterface; } public String createOpenRoadmEthInterface(String nodeId, String logicalConnPoint) @@ -175,5 +176,35 @@ public class OpenRoadmInterfaceFactory { } } + public String createOpenRoadmEth1GInterface(String nodeId, + String logicalConnPoint) throws OpenRoadmInterfaceException { + return openRoadmOTNInterface.createOpenRoadmEth1GInterface(nodeId,logicalConnPoint); + } + + public String createOpenRoadmEth10GInterface(String nodeId, + String logicalConnPoint) throws OpenRoadmInterfaceException { + return openRoadmOTNInterface.createOpenRoadmEth10GInterface(nodeId,logicalConnPoint); + } + + public String createOpenRoadmOdu0Interface(String nodeId, String logicalConnPoint, String servicename, + String payLoad, boolean isNetworkPort, int tribPortNumber, int tribSlot) + throws OpenRoadmInterfaceException { + return openRoadmOTNInterface.createOpenRoadmOdu0Interface(nodeId, logicalConnPoint, servicename, payLoad, + isNetworkPort, tribPortNumber, tribSlot); + } + + public String createOpenRoadmOdu2Interface(String nodeId, String logicalConnPoint, String servicename, + String payLoad, boolean isNetworkPort) + throws OpenRoadmInterfaceException { + return openRoadmOTNInterface.createOpenRoadmOdu2Interface(nodeId, logicalConnPoint, servicename, payLoad, + isNetworkPort); + } + + public String createOpenRoadmOdu2eInterface(String nodeId, String logicalConnPoint, String servicename, + String payLoad, boolean isNetworkPort) + throws OpenRoadmInterfaceException { + return openRoadmOTNInterface.createOpenRoadmOdu2eInterface(nodeId, logicalConnPoint, servicename, payLoad, + isNetworkPort); + } } diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmOTNInterface.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmOTNInterface.java new file mode 100644 index 000000000..187c842cb --- /dev/null +++ b/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmOTNInterface.java @@ -0,0 +1,313 @@ +/* + * Copyright © 2019 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.openroadminterface; + +import java.util.ArrayList; +import java.util.List; +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.rev200128.network.nodes.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; +import org.opendaylight.yang.gen.v1.http.org.openroadm.ethernet.interfaces.rev181019.EthAttributes; +import org.opendaylight.yang.gen.v1.http.org.openroadm.ethernet.interfaces.rev181019.Interface1; +import org.opendaylight.yang.gen.v1.http.org.openroadm.ethernet.interfaces.rev181019.Interface1Builder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.ethernet.interfaces.rev181019.ethernet.container.EthernetBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev161014.EthernetCsmacd; +import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev161014.InterfaceType; +import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev161014.OtnOdu; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev171215.ODU0; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev171215.ODU2; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev171215.ODU2e; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev171215.ODUCTP; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev171215.ODUTTPCTP; +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.OduAttributes; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.odu.container.OduBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.opu.OpuBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.parent.odu.allocation.ParentOduAllocationBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class OpenRoadmOTNInterface { + + private final PortMapping portMapping; + private final OpenRoadmInterfaces openRoadmInterfaces; + private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmInterfaceFactory.class); + + public OpenRoadmOTNInterface(PortMapping portMapping, OpenRoadmInterfaces openRoadmInterfaces) { + this.portMapping = portMapping; + this.openRoadmInterfaces = openRoadmInterfaces; + } + + public String createOpenRoadmEth1GInterface(String nodeId, String logicalConnPoint) + 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 % and" + + " logical connection port %s", nodeId, logicalConnPoint)); + } + + // Ethernet interface specific data + EthernetBuilder ethIfBuilder = new EthernetBuilder() + .setAutoNegotiation(EthAttributes.AutoNegotiation.Disabled) + .setSpeed(1000L) + .setMtu(9000L); + //.setCurrSpeed("1000L") + //.setCurrDuplex("FULL"); + InterfaceBuilder ethInterfaceBldr = + createGenericInterfaceBuilder(portMap, EthernetCsmacd.class, logicalConnPoint + "-ETHERNET1G"); + // Create Interface1 type object required for adding as augmentation + Interface1Builder ethIf1Builder = new Interface1Builder(); + ethInterfaceBldr.addAugmentation(Interface1.class, ethIf1Builder.setEthernet(ethIfBuilder.build()).build()); + // Post interface on the device + this.openRoadmInterfaces.postOTNInterface(nodeId, ethInterfaceBldr); + // Post the equipment-state change on the device circuit-pack + this.openRoadmInterfaces.postOTNEquipmentState(nodeId, portMap.getSupportingCircuitPackName(), true); + this.portMapping.updateMapping(nodeId,portMap); + String ethernetInterfaceName = ethInterfaceBldr.getName(); + + return ethernetInterfaceName; + } + + private InterfaceBuilder createGenericInterfaceBuilder(Mapping portMap, + Class type, String key) { + InterfaceBuilder interfaceBuilder = new InterfaceBuilder() + //.setDescription(" TBD ") + //.setCircuitId(" TBD ") + .setSupportingCircuitPackName(portMap.getSupportingCircuitPackName()) + .setSupportingPort(portMap.getSupportingPort()) + .setAdministrativeState(AdminStates.InService) + //TODO get rid of unchecked cast warning + .setType( + (Class) + type + ) + .setName(key) + .withKey(new InterfaceKey(key)); + return interfaceBuilder; + } + + public String createOpenRoadmEth10GInterface(String nodeId, String logicalConnPoint) + 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 % and logical connection port %s", + nodeId, logicalConnPoint)); + } + + // Ethernet interface specific data + EthernetBuilder ethIfBuilder = new EthernetBuilder() + .setAutoNegotiation(EthAttributes.AutoNegotiation.Disabled) + .setSpeed(10000L) + .setMtu(9000L); + //.setCurrSpeed("1000L") + //.setCurrDuplex("FULL"); + // Create Interface1 type object required for adding as augmentation + Interface1Builder ethIf1Builder = new Interface1Builder(); + InterfaceBuilder ethInterfaceBldr = + createGenericInterfaceBuilder(portMap, EthernetCsmacd.class, logicalConnPoint + "-ETHERNET10G") + .addAugmentation(Interface1.class, ethIf1Builder.setEthernet(ethIfBuilder.build()).build()); + // Post interface on the device + this.openRoadmInterfaces.postOTNInterface(nodeId, ethInterfaceBldr); + // Post the equipment-state change on the device circuit-pack + this.openRoadmInterfaces.postOTNEquipmentState(nodeId, portMap.getSupportingCircuitPackName(), true); + this.portMapping.updateMapping(nodeId,portMap); + String ethernetInterfaceName = ethInterfaceBldr.getName(); + + return ethernetInterfaceName; + } + + + public String createOpenRoadmOdu2eInterface(String nodeId, String logicalConnPoint, String serviceName, + String payLoad, boolean isNetworkPort) + 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 % and logical connection port %s", + nodeId, logicalConnPoint)); + } + String supportingInterface = null; + + if (isNetworkPort) { + supportingInterface = portMap.getSupportingOdu4(); + + } else { + // supportingInterface = portMap.getSupportingEthernet(); + supportingInterface = logicalConnPoint + "-ETHERNET10G"; + } + InterfaceBuilder oduInterfaceBldr = + createGenericInterfaceBuilder(portMap, OtnOdu.class, logicalConnPoint + "-ODU2e-" + serviceName) + .setSupportingInterface(supportingInterface); + + // ODU interface specific data + OduBuilder oduIfBuilder = new OduBuilder() + .setRate(ODU2e.class) + .setOduFunction(ODUTTPCTP.class) + .setMonitoringMode(OduAttributes.MonitoringMode.Terminated); + if (isNetworkPort) { + List tribSlots = new ArrayList<>(); + //add trib slots + tribSlots.add(45); + ParentOduAllocationBuilder parentOduAllocationBuilder = new ParentOduAllocationBuilder() + //set trib port numbers + .setTribPortNumber(24) + .setTribSlots(tribSlots); + oduIfBuilder.setOduFunction(ODUCTP.class) + .setMonitoringMode(OduAttributes.MonitoringMode.NotTerminated) + .setParentOduAllocation(parentOduAllocationBuilder.build()); + } + else { + // Set Opu attributes + OpuBuilder opuBldr = new OpuBuilder() + .setPayloadType(new PayloadTypeDef(payLoad)) + .setExpPayloadType(new PayloadTypeDef(payLoad)); + //.setRxPayloadType("07") + //.setPayloadInterface(payLoad); + oduIfBuilder.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( + org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1.class, + oduIf1Builder.setOdu(oduIfBuilder.build()).build()); + + // Post interface on the device + this.openRoadmInterfaces.postOTNInterface(nodeId, oduInterfaceBldr); + LOG.info("returning the ODU2e inteface {}", oduInterfaceBldr.getName()); + return oduInterfaceBldr.getName(); + } + + public String createOpenRoadmOdu0Interface(String nodeId, String logicalConnPoint, String serviceName, + String payLoad, boolean isNetworkPort, int tribPortNumber, int tribSlot) + throws OpenRoadmInterfaceException { + Mapping portMap = this.portMapping.getMapping(nodeId, logicalConnPoint); + String supportingInterface = null; + + if (isNetworkPort) { + supportingInterface = portMap.getSupportingOdu4(); + } else { + // supportingInterface = portMap.getSupportingEthernet(); + supportingInterface = logicalConnPoint + "-ETHERNET1G"; + } + if (portMap == null) { + throw new OpenRoadmInterfaceException( + String.format("Unable to get mapping from PortMapping for node % and logical connection port %s", + nodeId, logicalConnPoint)); + } + InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(portMap, OtnOdu.class, logicalConnPoint + + "-ODU0-" + serviceName); + oduInterfaceBldr.setSupportingInterface(supportingInterface); + + // ODU interface specific data + OduBuilder oduIfBuilder = new OduBuilder() + .setRate(ODU0.class) + .setOduFunction(ODUTTPCTP.class) + .setMonitoringMode(OduAttributes.MonitoringMode.Terminated); + if (isNetworkPort) { + List tribSlots = new ArrayList<>(); + tribSlots.add(tribSlot); //add trib slots + ParentOduAllocationBuilder parentOduAllocationBuilder = new ParentOduAllocationBuilder() + //set trib port numbers + .setTribPortNumber(tribPortNumber) + .setTribSlots(tribSlots); + oduIfBuilder.setOduFunction(ODUCTP.class) + .setMonitoringMode(OduAttributes.MonitoringMode.NotTerminated) + .setParentOduAllocation(parentOduAllocationBuilder.build()); + } + else { + // Set Opu attributes + OpuBuilder opuBldr = new OpuBuilder() + .setPayloadType(new PayloadTypeDef(payLoad)) + .setExpPayloadType(new PayloadTypeDef(payLoad)); + //.setRxPayloadType("07") + //.setPayloadInterface(payLoad); + oduIfBuilder.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( + org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1.class, + oduIf1Builder.setOdu(oduIfBuilder.build()).build()); + + // Post interface on the device + this.openRoadmInterfaces.postOTNInterface(nodeId, oduInterfaceBldr); + LOG.info("returning the ODU0 inteface {}", oduInterfaceBldr.getName()); + return oduInterfaceBldr.getName(); + } + + public String createOpenRoadmOdu2Interface(String nodeId, String logicalConnPoint, String serviceName, + String payLoad, boolean isNetworkPort) + throws OpenRoadmInterfaceException { + Mapping portMap = this.portMapping.getMapping(nodeId, logicalConnPoint); + String supportingInterface = null; + if (portMap == null) { + throw new OpenRoadmInterfaceException( + String.format("Unable to get mapping from PortMapping for node % and logical connection port %s", + nodeId, logicalConnPoint)); + } + if (isNetworkPort) { + supportingInterface = portMap.getSupportingOdu4(); + } else { + supportingInterface = portMap.getSupportingEthernet(); + } + InterfaceBuilder oduInterfaceBldr = + createGenericInterfaceBuilder(portMap, OtnOdu.class, logicalConnPoint + "-ODU2-" + serviceName) + .setSupportingInterface(supportingInterface); + + OduBuilder oduIfBuilder = new OduBuilder() + .setRate(ODU2.class) + .setOduFunction(ODUTTPCTP.class) + .setMonitoringMode(OduAttributes.MonitoringMode.Terminated); + if (isNetworkPort) { + List tribSlots = new ArrayList<>(); + tribSlots.add(45); //add trib slots + ParentOduAllocationBuilder parentOduAllocationBuilder = new ParentOduAllocationBuilder() + //set trib port numbers + .setTribPortNumber(24) + .setTribSlots(tribSlots); + oduIfBuilder.setOduFunction(ODUCTP.class) + .setMonitoringMode(OduAttributes.MonitoringMode.NotTerminated) + .setParentOduAllocation(parentOduAllocationBuilder.build()); + } + else { + // Set Opu attributes + OpuBuilder opuBldr = new OpuBuilder() + .setPayloadType(new PayloadTypeDef(payLoad)) + .setExpPayloadType(new PayloadTypeDef(payLoad)); + //.setRxPayloadType("07") + //.setPayloadInterface(payLoad); + oduIfBuilder.setOpu(opuBldr.build()); + } + + // Create Interface1 type object required for adding as augmentation + // TODO look at imports of different versions of 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.odu.interfaces.rev181019.Interface1Builder oduIf1Builder = + new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1Builder(); + oduInterfaceBldr.addAugmentation( + org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1.class, + oduIf1Builder.setOdu(oduIfBuilder.build()).build()); + + // Post interface on the device + this.openRoadmInterfaces.postOTNInterface(nodeId, oduInterfaceBldr); + LOG.info("returning the ODU2 inteface {}", oduInterfaceBldr.getName()); + return oduInterfaceBldr.getName(); + } +} diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/OtnDeviceRendererService.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/OtnDeviceRendererService.java new file mode 100644 index 000000000..6f1717a51 --- /dev/null +++ b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/OtnDeviceRendererService.java @@ -0,0 +1,17 @@ +/* + * Copyright © 2019 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.provisiondevice; + +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.device.rev200128.OtnServicePathInput; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.device.rev200128.OtnServicePathOutput; + +public interface OtnDeviceRendererService { + OtnServicePathOutput setupOtnServicePath(OtnServicePathInput input); + + OtnServicePathOutput deleteOtnServicePath(OtnServicePathInput input); +} diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/OtnDeviceRendererServiceImpl.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/OtnDeviceRendererServiceImpl.java new file mode 100644 index 000000000..706a7bb06 --- /dev/null +++ b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/OtnDeviceRendererServiceImpl.java @@ -0,0 +1,139 @@ +/* + * Copyright © 2019 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.provisiondevice; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import org.opendaylight.transportpce.common.crossconnect.CrossConnect; +import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException; +import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaceFactory; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.device.rev200128.OtnServicePathInput; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.device.rev200128.OtnServicePathOutput; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.device.rev200128.OtnServicePathOutputBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev200128.node.interfaces.NodeInterface; +import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev200128.node.interfaces.NodeInterfaceBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev200128.node.interfaces.NodeInterfaceKey; +import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev200128.otn.renderer.input.Nodes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService { + private static final Logger LOG = LoggerFactory.getLogger(OtnDeviceRendererServiceImpl.class); + private final OpenRoadmInterfaceFactory openRoadmInterfaceFactory; + private final CrossConnect crossConnect; + + public OtnDeviceRendererServiceImpl(OpenRoadmInterfaceFactory openRoadmInterfaceFactory, + CrossConnect crossConnect) { + this.openRoadmInterfaceFactory = openRoadmInterfaceFactory; + this.crossConnect = crossConnect; + } + + @Override + public OtnServicePathOutput setupOtnServicePath(OtnServicePathInput input) { + boolean success = true; + List nodeInterfaces = new ArrayList<>(); + List results = new ArrayList<>(); + if (input.getServiceType().equals("Ethernet")) { + try { + nodeInterfaces = createInterface(input); + } + catch (OpenRoadmInterfaceException e) { + //handle exception + LOG.warn("Set up service path failed"); + success = false; + } + } + if (success) { + for (NodeInterface nodeInterface: nodeInterfaces) { + results.add("Otn Service path was set up successfully for node :" + nodeInterface.getNodeId()); + } + } + OtnServicePathOutputBuilder otnServicePathOutputBuilder = new OtnServicePathOutputBuilder() + .setSuccess(success) + .setNodeInterface(nodeInterfaces) + .setResult(String.join("\n", results)); + return otnServicePathOutputBuilder.build(); + } + + @Override + public OtnServicePathOutput deleteOtnServicePath(OtnServicePathInput input) { + OtnServicePathOutputBuilder otnServicePathOutputBuilder = new OtnServicePathOutputBuilder() + .setResult("deleteServicePath was called"); + return otnServicePathOutputBuilder.build(); + } + + private List createInterface(OtnServicePathInput input) throws OpenRoadmInterfaceException { + List nodeInterfaces = new ArrayList<>(); + if (input.getServiceRate().equals("1G")) { + for (Nodes node: input.getNodes()) { + //check if the node is mounted or not? + List createdEthInterfaces = new ArrayList<>(); + List createdOduInterfaces = new ArrayList<>(); + createdEthInterfaces.add(openRoadmInterfaceFactory.createOpenRoadmEth1GInterface(node.getNodeId(), + node.getClientTp())); + LOG.info("created ethernet interface"); + createdOduInterfaces.add(openRoadmInterfaceFactory.createOpenRoadmOdu0Interface(node.getNodeId(), + node.getClientTp(), input.getServiceName(),"07", false, input.getTribPortNumber(), + input.getTribSlot())); //suppporting interface?, payload ? + LOG.info("Created odu interface client side"); + createdOduInterfaces.add(openRoadmInterfaceFactory.createOpenRoadmOdu0Interface(node.getNodeId(), + node.getNetworkTp(), input.getServiceName(),"07", true, input.getTribPortNumber(), + input.getTribSlot())); + LOG.info("created odu inteface network side"); + + //implement cross connect + Optional connectionNameOpt = postCrossConnect(createdOduInterfaces, node); + List createdConnections = new ArrayList<>(); + createdConnections.add(connectionNameOpt.get()); + LOG.info("Created cross connects"); + NodeInterfaceBuilder nodeInterfaceBuilder = new NodeInterfaceBuilder() + .withKey(new NodeInterfaceKey(node.getNodeId())) + .setNodeId(node.getNodeId()) + .setConnectionId(createdConnections) + .setEthInterfaceId(createdEthInterfaces) + .setOduInterfaceId(createdOduInterfaces); + nodeInterfaces.add(nodeInterfaceBuilder.build()); + } + } + else if (input.getServiceRate().equals("10G")) { + // implementing ODU2e for now + + for (Nodes node: input.getNodes()) { + //check if the node is mounted or not? + List createdEthInterfaces = new ArrayList<>(); + List createdOduInterfaces = new ArrayList<>(); + createdEthInterfaces.add(openRoadmInterfaceFactory.createOpenRoadmEth10GInterface(node.getNodeId(), + node.getClientTp())); + createdOduInterfaces.add(openRoadmInterfaceFactory.createOpenRoadmOdu2eInterface(node.getNodeId(), + node.getClientTp(), input.getServiceName(),"03", false)); //suppporting interface?, payload ? + createdOduInterfaces.add(openRoadmInterfaceFactory.createOpenRoadmOdu2eInterface(node.getNodeId(), + node.getNetworkTp(), input.getServiceName(),"03" , true));// supporting interface? payload ? + + //implement cross connect + Optional connectionNameOpt = postCrossConnect(createdOduInterfaces, node); + List createdConnections = new ArrayList<>(); + createdConnections.add(connectionNameOpt.get()); + LOG.info("Created cross connects"); + NodeInterfaceBuilder nodeInterfaceBuilder = new NodeInterfaceBuilder(); + nodeInterfaceBuilder.withKey(new NodeInterfaceKey(node.getNodeId())) + .setNodeId(node.getNodeId()) + .setConnectionId(createdConnections) + .setEthInterfaceId(createdEthInterfaces) + .setOduInterfaceId(createdOduInterfaces); + nodeInterfaces.add(nodeInterfaceBuilder.build()); + } + } + return nodeInterfaces; + } + + private Optional postCrossConnect(List createdOduInterfaces, Nodes node) + throws OpenRoadmInterfaceException { + return this.crossConnect.postOtnCrossConnect(createdOduInterfaces,node); + } +} diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/otn/OtnDeviceOperations.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/otn/OtnDeviceOperations.java new file mode 100644 index 000000000..1fa0da6dc --- /dev/null +++ b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/otn/OtnDeviceOperations.java @@ -0,0 +1,39 @@ +/* + * Copyright © 2019 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.provisiondevice.otn; + +import java.util.List; +import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.odu.switching.pools.non.blocking.list.PortList; + +public interface OtnDeviceOperations { + + /** + * This method checks if the client port can be used or not. + * + * @param nodeID unique identifier of a device + * @param circuitPackName circuit pack name of the client port + * @param portName port name of the client port + * @param capacity rate of the service needed + * @return String which states whether the client port is valid or not + */ + String validateClientPort(String nodeID, String circuitPackName, String portName, String capacity); + + /** + * This method retrieves the possible network ports. + * + *

+ * checks for the possible network ports in odu-switching-pool + *

+ * @param circuitPackName Circuit pack name of the client port + * @param portName port name of the client port + * @return List of all possible network ports + */ + List getPossibleNetworkPorts(String circuitPackName, String portName); + + +} diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/otn/OtnDeviceOperationsImpl.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/otn/OtnDeviceOperationsImpl.java new file mode 100644 index 000000000..531d81b62 --- /dev/null +++ b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/otn/OtnDeviceOperationsImpl.java @@ -0,0 +1,137 @@ +/* + * Copyright © 2019 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.provisiondevice.otn; + +import java.util.List; +import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.CircuitPacks; +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.org.openroadm.device.container.org.openroadm.device.OduSwitchingPools; +import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.odu.switching.pools.NonBlockingList; +import org.opendaylight.yang.gen.v1.http.org.openroadm.port.capability.rev181019.port.group.restriction.grp.PortGroupRestriction; +import org.opendaylight.yang.gen.v1.http.org.openroadm.port.capability.rev181019.port.group.restriction.grp.port.group.restriction.PortBandwidthSharing; +import org.opendaylight.yang.gen.v1.http.org.openroadm.port.capability.rev181019.port.group.restriction.grp.port.group.restriction.port.bandwidth.sharing.PortList; +import org.opendaylight.yang.gen.v1.http.org.openroadm.port.capability.rev181019.port.group.restriction.grp.port.group.restriction.port.bandwidth.sharing.PossiblePortConfig; +import org.opendaylight.yang.gen.v1.http.org.openroadm.port.capability.rev181019.port.group.restriction.grp.port.group.restriction.port.bandwidth.sharing.possible.port.config.PortIfTypeConfig; + + +public class OtnDeviceOperationsImpl implements OtnDeviceOperations { + + @Override + public String validateClientPort(String nodeID, String circuitPackName, String portName, String capacity) { + + PortGroupRestriction portGroupRestriction = null; //should not be initiated as null + List portBandwidthSharingList = portGroupRestriction.getPortBandwidthSharing(); + for (PortBandwidthSharing portBandwidthSharing: portBandwidthSharingList) { + List portLists = portBandwidthSharing.getPortList(); + for (PortList portList: portLists) { + if (portList.getCircuitPackName().equals(circuitPackName) && portList.getPortName().equals(portName)) { + if (!usageOfOtherPorts(portBandwidthSharing, + getConfigID(portBandwidthSharing, circuitPackName, portName))) { + return "valid port"; + } + else { + return "not a valid port"; + } + } + } + } + return "not valid circuitPackName or portName"; // if the client port is not found at all throw exception + } + + private Integer getConfigID(PortBandwidthSharing portBandwidthSharing, String circuitPackName, String portName) { + List possiblePortConfigList = portBandwidthSharing.getPossiblePortConfig(); + for (PossiblePortConfig possiblePortConfig: possiblePortConfigList + ) { + List portIfTypeConfigList = possiblePortConfig.getPortIfTypeConfig(); + for (PortIfTypeConfig portIfTypeConfig : portIfTypeConfigList) { + if (portIfTypeConfig.getCircuitPackName().equals(circuitPackName) + && portIfTypeConfig.getPortName().equals(portName)) { + return possiblePortConfig.getConfigId(); + } + } + } + return null; // throw exception if not able to get config id + } + + + private boolean usageOfOtherPorts(PortBandwidthSharing portBandwidthSharing, Integer configId) { + return false; + } + + @Override + public List + getPossibleNetworkPorts(String circuitPackName, String portName) { + List networkPortList = null; + + //need a method to get swtiching pool object from device + + OduSwitchingPools oduSwitchingPools = null; // should not be initiated as null + List nonBlockingLists = oduSwitchingPools.getNonBlockingList(); + + + for (NonBlockingList nonBlockingList: nonBlockingLists) { + + for (org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device + .container.org.openroadm.device.odu.switching.pools.non.blocking.list.PortList port: + nonBlockingList.getPortList()) { + + if (port.getCircuitPackName().equals(circuitPackName) && port.getPortName().equals(portName)) { + org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device + .container.org.openroadm.device.odu.switching.pools.non.blocking.list + .PortList networkPort = checkNetworkPorts(nonBlockingList.getPortList()); + if (networkPort != null) { + networkPortList.add(networkPort); + } + } + } + } + return networkPortList; + } + + + private org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device + .container.org.openroadm.device.odu.switching.pools.non.blocking.list.PortList + checkNetworkPorts(List portList) { + CircuitPacks circuitPacks = null; + + List circuitPackList = circuitPacks.getCircuitPacks(); + + for (org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container + .org.openroadm.device.odu.switching.pools.non.blocking.list.PortList port: portList) { + for (org.opendaylight.yang.gen.v1.http.org.openroadm.device + .rev181019.circuit.packs.CircuitPacks circuitPack: circuitPackList) { + return searchNetworkPort(port, circuitPack); + } + } + return null; // throw exception if no available network ports + } + + private org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container + .org.openroadm.device.odu.switching.pools.non.blocking.list.PortList + searchNetworkPort(org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device + .container.org.openroadm.device.odu.switching.pools.non.blocking.list.PortList port, + org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.packs.CircuitPacks circuitPack) { + if (port.getCircuitPackName().equals(circuitPack.getCircuitPackName())) { + for (Ports prt : circuitPack.getPorts()) { + if (port.getPortName().equals(prt.getPortName()) && prt.getPortQual().equals("xpdr-network")) { + return port; + } + } + } + return null; // throw exception + } + + + //check supported interface types + +} \ No newline at end of file diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/DeviceRendererRPCImpl.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/DeviceRendererRPCImpl.java index 8b049f973..6f8df0ddb 100644 --- a/renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/DeviceRendererRPCImpl.java +++ b/renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/DeviceRendererRPCImpl.java @@ -11,6 +11,7 @@ package org.opendaylight.transportpce.renderer.rpcs; import com.google.common.util.concurrent.ListenableFuture; import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException; import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService; +import org.opendaylight.transportpce.renderer.provisiondevice.OtnDeviceRendererService; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.device.rev200128.CreateOtsOmsInput; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.device.rev200128.CreateOtsOmsOutput; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.device.rev200128.OtnServicePathInput; @@ -31,9 +32,12 @@ public class DeviceRendererRPCImpl implements TransportpceDeviceRendererService private static final Logger LOG = LoggerFactory.getLogger(DeviceRendererRPCImpl.class); private DeviceRendererService deviceRenderer; + private OtnDeviceRendererService otnDeviceRendererService; - public DeviceRendererRPCImpl(DeviceRendererService deviceRenderer) { + public DeviceRendererRPCImpl(DeviceRendererService deviceRenderer, + OtnDeviceRendererService otnDeviceRendererService) { this.deviceRenderer = deviceRenderer; + this.otnDeviceRendererService = otnDeviceRendererService; } /** @@ -74,9 +78,14 @@ public class DeviceRendererRPCImpl implements TransportpceDeviceRendererService @Override public ListenableFuture> otnServicePath(OtnServicePathInput input) { - return RpcResultBuilder - .success(new OtnServicePathOutputBuilder().setResult("Unsupported operation")) - .buildFuture(); + if (input.getOperation().getIntValue() == 1) { + LOG.info("Create operation request received"); + return RpcResultBuilder.success(this.otnDeviceRendererService.setupOtnServicePath(input)).buildFuture(); + } else if (input.getOperation().getIntValue() == 2) { + LOG.info("Delete operation request received"); + return RpcResultBuilder.success(this.otnDeviceRendererService.deleteOtnServicePath(input)).buildFuture(); + } + return RpcResultBuilder.success(new OtnServicePathOutputBuilder().setResult("Invalid operation")).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 index 85d389eb6..30584f855 100644 --- a/renderer/src/main/resources/OSGI-INF/blueprint/renderer-blueprint.xml +++ b/renderer/src/main/resources/OSGI-INF/blueprint/renderer-blueprint.xml @@ -40,11 +40,18 @@ and is available at http://www.eclipse.org/legal/epl-v10.html + + + + + + @@ -56,8 +63,14 @@ and is available at http://www.eclipse.org/legal/epl-v10.html + + + + + +