From: Gilles Thouenon Date: Tue, 27 Nov 2018 18:09:01 +0000 (+0100) Subject: Clean-up code of portmapping-topology refactoring X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=865aa0d4c5914c6ff748df454ac3b5f5c38f05e6;p=transportpce.git Clean-up code of portmapping-topology refactoring - delete numbers of methods no longer usefull after portmapping and topology consolidation (notably in PortMappingImpl, OpenRoadmTopolgy...) Change-Id: I077cfd5a03e6eac0fda3fd2eaf706e313fce38bd JIRA: TRNSPRTPCE-34 Signed-off-by: Gilles Thouenon --- diff --git a/common/src/main/java/org/opendaylight/transportpce/common/mapping/DeviceConfig.java b/common/src/main/java/org/opendaylight/transportpce/common/mapping/DeviceConfig.java index 5468602e5..e1681647c 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/mapping/DeviceConfig.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/mapping/DeviceConfig.java @@ -87,11 +87,11 @@ public interface DeviceConfig { * This method retrieves the connection-map list from operational datastore of a * given device. * - * @param NodeId + * @param nodeId * node ID * * @return connection-map list or null if container is absent */ - List getConnectionMap(String NodeId); + List getConnectionMap(String nodeId); } diff --git a/common/src/main/java/org/opendaylight/transportpce/common/mapping/DeviceConfigImpl.java b/common/src/main/java/org/opendaylight/transportpce/common/mapping/DeviceConfigImpl.java index 1d06acb88..2baa50578 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/mapping/DeviceConfigImpl.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/mapping/DeviceConfigImpl.java @@ -98,9 +98,9 @@ public class DeviceConfigImpl implements DeviceConfig { } @Override - public List getConnectionMap(String NodeId) { + public List getConnectionMap(String nodeId) { InstanceIdentifier deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class); - Optional deviceObject = this.deviceTransactionManager.getDataFromDevice(NodeId, + Optional deviceObject = this.deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); if (deviceObject.isPresent()) { diff --git a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMapping.java b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMapping.java index 3e85586c8..9d76d1017 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMapping.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMapping.java @@ -18,37 +18,20 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.open public interface PortMapping { /** - * This method creates logical to physical port mapping for a given device. - * Instead of parsing all the circuit packs/ports in the device this methods - * does a selective read operation on degree/srg subtree to get circuit - * packs/ports that map to : + * When OpenRoadmTopology creates the logical to physical port mapping for a + * given device, this methods has just to store the resulting mapping + * operation to datastore. * - *

- * 1. DEGn-TTP-TX, DEGn-TTP-RX, DEGn-TTP-TXRX - * - *

- * 2. SRGn-PPp-TX, SRGn-PPp-RX, SRGn-PPp-TXRX - * - *

- * 3. LINEn - * - *

- * 4. CLNTn. - * - *

- * If the port is Mw it also store the OMS, OTS interface provisioned on the - * port. It skips the logical ports that are internal. If operation is - * successful the mapping gets stored in datastore corresponding to - * portmapping.yang data model. - * - * @param nodeId - * node ID - * - * @return true/false based on status of operation + * @param deviceInfo + * deviceInfo + * @param portMapList + * The list of discovered mapping for the node + * @param degreeCpList + * The list of circuit-packs supporting eth interface with lldp + * protocole + * @return true if success to store mapping in datastore, false otherwise. */ - boolean createMappingData(String nodeId); - - boolean createMappingData2(Info deviceInfo, List portMapList, List degreeCpList); + boolean createMappingData(Info deviceInfo, List portMapList, List degreeCpList); /** * This method removes mapping data from the datastore after disconnecting diff --git a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingImpl.java b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingImpl.java index 008121dfb..21ef7b4f7 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingImpl.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingImpl.java @@ -10,18 +10,11 @@ package org.opendaylight.transportpce.common.mapping; import com.google.common.util.concurrent.CheckedFuture; import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; import java.util.Optional; -import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import java.util.stream.Collectors; - import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; @@ -38,34 +31,21 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmappi import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.NodesBuilder; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.NodesKey; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.nodes.CpToDegree; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.nodes.CpToDegreeBuilder; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.nodes.CpToDegreeKey; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.nodes.Mapping; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.nodes.MappingBuilder; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.nodes.MappingKey; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.NodeTypes; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.CircuitPack; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.Port; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.Ports; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.PortsKey; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.packs.CircuitPacks; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.packs.CircuitPacksKey; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.degree.ConnectionPorts; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.Interface; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.InterfaceKey; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.Degree; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.DegreeKey; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.Info; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.Protocols; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.SharedRiskGroup; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.SharedRiskGroupKey; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.port.Interfaces; import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev161014.InterfaceType; import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev161014.OpenROADMOpticalMultiplex; import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev161014.OpticalTransport; -import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev161014.Protocols1; -import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev161014.lldp.container.lldp.PortConfig; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -85,313 +65,9 @@ public class PortMappingImpl implements PortMapping { this.openRoadmInterfaces = openRoadmInterfaces; } - @Override - public boolean createMappingData(String nodeId) { - - LOG.info("Create Mapping Data for node {}", nodeId); - List portMapList = new ArrayList<>(); - InstanceIdentifier infoIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Info.class); - Optional deviceInfoOptional = this.deviceTransactionManager.getDataFromDevice(nodeId, - LogicalDatastoreType.OPERATIONAL, infoIID, - Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); - - Info deviceInfo; - if (deviceInfoOptional.isPresent()) { - deviceInfo = deviceInfoOptional.get(); - } else { - LOG.warn("Device info subtree is absent for {}", nodeId); - return false; - } - if (deviceInfo.getNodeType() == null) { - LOG.error("Node type field is missing"); // TODO make mandatory in yang - return false; - } - switch (deviceInfo.getNodeType()) { - - case Rdm: - // Get TTP port mapping - if (!createTtpPortMapping(nodeId, deviceInfo, portMapList)) { - // return false if mapping creation for TTP's failed - LOG.warn("Unable to create mapping for TTP's on node {}", nodeId); - return false; - } - - // Get PP port mapping - if (!createPpPortMapping(nodeId, deviceInfo, portMapList)) { - // return false if mapping creation for PP's failed - LOG.warn("Unable to create mapping for PP's on node {}", nodeId); - return false; - } - break; - case Xpdr: - if (!createXpdrPortMapping(nodeId, portMapList)) { - LOG.warn("Unable to create mapping for Xponder on node {}", nodeId); - return false; - } - break; - default: - LOG.error("Unable to create mapping for node {} : unknown nodetype ", nodeId); - break; - - } - return postPortMapping(deviceInfo, portMapList, deviceInfo.getNodeType().getIntValue(), null); - } - - /** - * This private method gets the list of external ports on a degree. For each - * port in the degree, it does a get on port subtree with - * circuit-pack-name/port-name as key in order to get the logical connection - * point name corresponding to it. - * - * @param deviceInfo - * Info subtree read from the device - * @param portMapList - * Reference to the list containing the mapping to be pushed to - * MD-SAL - * - * @return true/false based on status of operation - */ - private boolean createTtpPortMapping(String nodeId, Info deviceInfo, List portMapList) { - // Creating mapping data for degree TTP's - - List degrees = getDegrees(nodeId, deviceInfo); - List degreeConPorts = getDegreePorts(degrees); - Map interfaceList = getEthInterfaceList(nodeId); - List cpToDegreeList = getCpToDegreeList(degrees, nodeId, interfaceList); - LOG.info("Map looks like this {}",interfaceList); - postPortMapping(deviceInfo, null, deviceInfo.getNodeType().getIntValue(), cpToDegreeList); - // Getting circuit-pack-name/port-name corresponding to TTP's - for (ConnectionPorts cp : degreeConPorts) { - String circuitPackName = cp.getCircuitPackName(); - String portName = cp.getPortName().toString(); - InstanceIdentifier portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) - .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName)) - .child(Ports.class, new PortsKey(portName)); - - LOG.info("Fetching logical Connection Point value for port {} at circuit pack {}", portName, - circuitPackName); - Optional portObject = this.deviceTransactionManager.getDataFromDevice(nodeId, - LogicalDatastoreType.OPERATIONAL, portIID, - Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); - if (portObject.isPresent()) { - Ports port = portObject.get(); - if (port.getLogicalConnectionPoint() != null) { - LOG.info("Logical Connection Point for {} {} is {}", circuitPackName, portName, - port.getLogicalConnectionPoint()); - portMapList.add(createMappingObject(nodeId, port, circuitPackName, - port.getLogicalConnectionPoint())); - } else { - LOG.warn("Logical Connection Point value is missing for {} {}", circuitPackName, - port.getPortName()); - } - } else { - LOG.warn("Port {} is not present in node {} in circuit pack {}!", portName, nodeId, circuitPackName); - continue; // TODO continue or return true? - } - } - return true; - } - - private List getDegrees(String deviceId, Info ordmInfo) { - List degrees = new ArrayList<>(); - Integer maxDegree; - - // Get value for max degree from info subtree, required for iteration - // if not present assume to be 20 (temporary) - if (ordmInfo.getMaxDegrees() != null) { - maxDegree = ordmInfo.getMaxDegrees(); - } else { - maxDegree = 20; - } - - for (int degreeCounter = 1; degreeCounter <= maxDegree; degreeCounter++) { - LOG.info("Getting Connection ports for Degree Number {}", degreeCounter); - InstanceIdentifier deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) - .child(Degree.class, new DegreeKey(degreeCounter)); - Optional ordmDegreeObject = this.deviceTransactionManager.getDataFromDevice(deviceId, - LogicalDatastoreType.CONFIGURATION, - deviceIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); - if (ordmDegreeObject.isPresent()) { - degrees.add(ordmDegreeObject.get()); - } else { - LOG.info("Device has {} degree", degreeCounter - 1); - break; - } - } - return degrees; - } - - /** - * This private method gets the list of circuit packs on an Srg. For each - * circuit pack on an Srg, it does a get on circuit-pack subtree with - * circuit-pack-name as key in order to get the list of ports. It then - * iterates over the list of ports to get ports with port-qual as - * roadm-external. It appends a TX,RX,TXRX to the logical connection point - * name based on the direction of the port. - * - * @param nodeId - * Id of device - * @param deviceInfo - * Info subtree read from the device - * @param portMapList - * Reference to the list containing the mapping to be pushed to - * MD-SAL - * - * @return true/false based on status of operation - */ - - private boolean createPpPortMapping(String nodeId, Info deviceInfo, List portMapList) { - // Creating mapping data for SRG's PP - HashMap> srgCps = getSrgCps(nodeId, deviceInfo); - Set>> circuitPacks = srgCps.entrySet(); - for (Entry> entry : circuitPacks) { - Integer srgIndex = entry.getKey(); - for (org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.srg.CircuitPacks cp : entry - .getValue()) { - String circuitPackName = cp.getCircuitPackName(); - InstanceIdentifier cpIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) - .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName)); - Optional circuitPackObject = this.deviceTransactionManager.getDataFromDevice(nodeId, - LogicalDatastoreType.OPERATIONAL, cpIID, - Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); - - if (!circuitPackObject.isPresent() || (circuitPackObject.get().getPorts() == null)) { - LOG.warn("{} : Circuit pack {} not found or without ports.", nodeId, circuitPackName); - continue; // TODO continue or return false? - } - CircuitPacks circuitPack = circuitPackObject.get(); - for (Ports port : circuitPack.getPorts()) { - if (port.getLogicalConnectionPoint() != null) { - String logicalConnectionPoint = getLogicalConnectionPort(port, srgIndex); - LOG.info("{} : Logical Connection Point for {} {} is {}", nodeId, circuitPackName, port - .getPortName(), - logicalConnectionPoint); - portMapList.add(createMappingObject(nodeId, port, circuitPackName, logicalConnectionPoint)); - } else if (Port.PortQual.RoadmInternal.equals(port.getPortQual())) { - LOG.info("Port is internal, skipping Logical Connection Point missing for {} {}", - circuitPackName, - port.getPortName()); - } else if (port.getLogicalConnectionPoint() == null) { - LOG.info("Value missing, Skipping Logical Connection Point missing for {} {}", circuitPackName, - port.getPortName()); - } - } - } - } - return true; - } - - /** - * This method does a get operation on shared risk group subtree of the - * netconf device's config datastore and returns a list of all circuit packs - * objects that are part of srgs. It is required to do a selective get on - * all the circuit packs that contain add/drop ports of interest. - * - * @param deviceId - * Device id - * @param ordmInfo - * Info subtree from the device - * @return List of circuit packs object belonging to- shared risk group - * subtree - */ - private HashMap> getSrgCps(String deviceId, Info ordmInfo) { - HashMap> cpPerSrg = new HashMap<>(); - Integer maxSrg; - // Get value for max Srg from info subtree, required for iteration - // if not present assume to be 20 (temporary) - if (ordmInfo.getMaxSrgs() != null) { - maxSrg = ordmInfo.getMaxSrgs(); - } else { - maxSrg = 20; - } - for (int srgCounter = 1; srgCounter <= maxSrg; srgCounter++) { - List srgCps = - new ArrayList<>(); - LOG.info("Getting Circuitpacks for Srg Number {}", srgCounter); - InstanceIdentifier srgIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) - .child(SharedRiskGroup.class, new SharedRiskGroupKey(srgCounter)); - Optional ordmSrgObject = this.deviceTransactionManager.getDataFromDevice(deviceId, - LogicalDatastoreType.CONFIGURATION, - srgIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); - if (ordmSrgObject.isPresent()) { - srgCps.addAll(ordmSrgObject.get().getCircuitPacks()); - cpPerSrg.put(ordmSrgObject.get().getSrgNumber(), srgCps); - } - } - LOG.info("Device {} has {} Srg", deviceId, cpPerSrg.size()); - return cpPerSrg; - } - - /** - * This private method gets the list of circuit packs on a xponder. For each - * circuit pack on a Xponder, it does a get on circuit-pack subtree with - * circuit-pack-name as key in order to get the list of ports. It then - * iterates over the list of ports to get ports with port-qual as - * xpdr-network/xpdr-client. The line and client ports are saved as: - * - *

- * 1. LINEn - * - *

- * 2. CLNTn - * - * @param nodeId - * Id of device - * @param portMapList - * Reference to the list containing the mapping to be pushed to - * MD-SAL - * - * @return true/false based on status of operation - */ - private boolean createXpdrPortMapping(String nodeId, List portMapList) { - // Creating for Xponder Line and Client Ports - InstanceIdentifier deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class); - Optional deviceObject = this.deviceTransactionManager.getDataFromDevice(nodeId, - LogicalDatastoreType.OPERATIONAL, deviceIID, - Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); - - // Variable to keep track of number of line ports - int line = 1; - // Variable to keep track of number of client ports - int client = 1; - if (!deviceObject.isPresent() || (deviceObject.get().getCircuitPacks() == null)) { - LOG.warn("Circuit Packs are not present for {}", nodeId); - return false; // TODO return false or continue? - } - - List circuitPackList = deviceObject.get().getCircuitPacks(); - circuitPackList.sort(Comparator.comparing(CircuitPack::getCircuitPackName)); - - for (CircuitPacks cp : circuitPackList) { - String circuitPackName = cp.getCircuitPackName(); - if (cp.getPorts() == null) { - LOG.warn("Ports were not found for circuit pack: {}", circuitPackName); - continue; - } - for (Ports port : cp.getPorts()) { - if (Port.PortQual.XpdrNetwork.equals(port.getPortQual())) { - portMapList.add(createMappingObject(nodeId, port, circuitPackName, - "XPDR1-" + OpenRoadmInterfacesImpl.NETWORK_TOKEN + line)); - line++; - } else if (Port.PortQual.XpdrClient.equals(port.getPortQual())) { - portMapList.add(createMappingObject(nodeId, port, circuitPackName, - "XPDR1-" + OpenRoadmInterfacesImpl.CLIENT_TOKEN + client)); - client++; - } else { - LOG.warn("Not supported type of port! Port type: {}", port.getPortQual()); - } - } - } - return true; - } /** * This private method builds the mapping object to be pushed in MD-SAL in @@ -441,36 +117,6 @@ public class PortMappingImpl implements PortMapping { return mpBldr.build(); } - private CpToDegree createCpToDegreeObject(String circuitPackName, String degreeNumber, String nodeId, - Map interfaceList) { - String interfaceName = null; - if (interfaceList.get(circuitPackName) != null) { - interfaceName = interfaceList.get(circuitPackName); - } - return new CpToDegreeBuilder().withKey(new CpToDegreeKey(circuitPackName)).setCircuitPackName(circuitPackName) - .setDegreeNumber(new Long(degreeNumber)).setInterfaceName(interfaceName).build(); - } - - private static List getDegreePorts(List degrees) { - return degrees.stream().filter(degree -> degree.getConnectionPorts() != null) - .flatMap(degree -> degree.getConnectionPorts().stream()).collect(Collectors.toList()); - } - - private List getCpToDegreeList(List degrees, String nodeId, - Map interfaceList) { - List cpToDegreeList = new ArrayList<>(); - for (Degree degree : degrees) { - if (degree.getCircuitPacks() != null) { - LOG.info("Inside CP to degree list"); - cpToDegreeList.addAll(degree.getCircuitPacks().stream() - .filter(cp -> interfaceList.containsKey(cp.getCircuitPackName())) - .map(cp -> createCpToDegreeObject(cp.getCircuitPackName() , - degree.getDegreeNumber().toString(), nodeId ,interfaceList)) - .collect(Collectors.toList())); - } - } - return cpToDegreeList; - } /** * This method for ports the portMapping corresponding to the @@ -548,49 +194,6 @@ public class PortMappingImpl implements PortMapping { return null; } - private static String getLogicalConnectionPort(Ports port, int srgCounter) { - String logicalConnectionPoint = null; - if (port.getLogicalConnectionPoint() != null) { - switch (port.getPortDirection()) { - case Tx: - // Port direction is transmit - if (!port.getLogicalConnectionPoint().contains("SRG")) { - logicalConnectionPoint = "SRG" + srgCounter + "-" + port.getLogicalConnectionPoint() + "-TX"; - } else { - logicalConnectionPoint = port.getLogicalConnectionPoint() + "-TX"; - } - break; - case Rx: - // Port direction is receive - if (!port.getLogicalConnectionPoint().contains("SRG")) { - logicalConnectionPoint = "SRG" + srgCounter + "-" + port.getLogicalConnectionPoint() + "-RX"; - } else { - logicalConnectionPoint = port.getLogicalConnectionPoint() + "-RX"; - } - break; - case Bidirectional: - // port is bidirectional - if (!port.getLogicalConnectionPoint().contains("SRG")) { - logicalConnectionPoint = "SRG" + srgCounter + "-" + port.getLogicalConnectionPoint(); - } else { - logicalConnectionPoint = port.getLogicalConnectionPoint(); - } - if (!port.getLogicalConnectionPoint().endsWith("-TXRX")) { - logicalConnectionPoint = logicalConnectionPoint.concat("-TXRX"); - } - break; - default: - // Unsupported Port direction - LOG.error("Unsupported port direction for port {} {}", port, port.getPortDirection()); - return null; // TODO return false or continue? - } - return logicalConnectionPoint; - } - LOG.warn("Unsupported port direction for port {} - {} - LogicalConnectionPoint is null", - port, port.getPortDirection()); - return null; // TODO return false or continue? - } - @Override public void deleteMappingData(String nodeId) { LOG.info("Deleting Mapping Data corresponding at node '{}'", nodeId); @@ -644,57 +247,9 @@ public class PortMappingImpl implements PortMapping { } } - private Map getEthInterfaceList(String nodeId) { - LOG.info("It is calling get ethernet interface"); - Map cpToInterfaceMap = new HashMap<>(); - InstanceIdentifier protocolsIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) - .child(Protocols.class); - Optional protocolObject = this.deviceTransactionManager.getDataFromDevice(nodeId, - LogicalDatastoreType.OPERATIONAL, protocolsIID, Timeouts.DEVICE_READ_TIMEOUT, - Timeouts.DEVICE_READ_TIMEOUT_UNIT); - if (!protocolObject.isPresent() || (protocolObject.get().augmentation(Protocols1.class) == null)) { - LOG.warn("LLDP subtree is missing : isolated openroadm device"); - return cpToInterfaceMap; - } - List portConfigList = protocolObject.get().augmentation(Protocols1.class).getLldp().getPortConfig(); - if (!portConfigList.isEmpty()) { - for (PortConfig portConfig : portConfigList) { - if (portConfig.getAdminStatus().equals(PortConfig.AdminStatus.Txandrx)) { - InstanceIdentifier interfaceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) - .child(Interface.class, new InterfaceKey(portConfig.getIfName())); - Optional interfaceObject = this.deviceTransactionManager.getDataFromDevice(nodeId, - LogicalDatastoreType.OPERATIONAL, interfaceIID, Timeouts.DEVICE_READ_TIMEOUT, - Timeouts.DEVICE_READ_TIMEOUT_UNIT); - if (interfaceObject.isPresent() - && (interfaceObject.get().getSupportingCircuitPackName() != null)) { - String supportingCircuitPackName = interfaceObject.get().getSupportingCircuitPackName(); - cpToInterfaceMap.put(supportingCircuitPackName, portConfig.getIfName()); - InstanceIdentifier circuitPacksIID = InstanceIdentifier - .create(OrgOpenroadmDevice.class).child(CircuitPacks.class, - new CircuitPacksKey(supportingCircuitPackName)); - Optional circuitPackObject = this.deviceTransactionManager.getDataFromDevice( - nodeId, LogicalDatastoreType.OPERATIONAL, circuitPacksIID, Timeouts - .DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); - if (circuitPackObject.isPresent() - && (circuitPackObject.get().getParentCircuitPack() != null)) { - cpToInterfaceMap.put(circuitPackObject.get().getParentCircuitPack() - .getCircuitPackName(), portConfig.getIfName()); - } - } - } else { - LOG.warn("PortConfig Admi Status is not equal Txandrx"); - } - } - } else { - LOG.warn("Couldnt find port config under LLDP for Node : {}", nodeId); - } - LOG.info("Processiong is done.. now returning.."); - return cpToInterfaceMap; - } - @Override - public boolean createMappingData2(Info deviceInfo, List portMapList, List degreeCpList) { - LOG.info("Create Mapping Data 2 for node {}", deviceInfo.getNodeId()); + public boolean createMappingData(Info deviceInfo, List portMapList, List degreeCpList) { + LOG.info("Create Mapping Data for node {}", deviceInfo.getNodeId()); return postPortMapping(deviceInfo, portMapList, deviceInfo.getNodeType().getIntValue(), degreeCpList); } diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl.java index 81079870e..6c9ed2a59 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl.java @@ -1,5 +1,5 @@ /* - * Copyright © 2016 AT&T and others. All rights reserved. + * Copyright © 2017 Orange, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, @@ -9,17 +9,21 @@ package org.opendaylight.transportpce.networkmodel.service; import java.util.HashMap; import java.util.concurrent.ExecutionException; + import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.transportpce.common.NetworkUtils; import org.opendaylight.transportpce.common.device.DeviceTransactionManager; +import org.opendaylight.transportpce.common.mapping.DeviceConfig; import org.opendaylight.transportpce.common.mapping.PortMapping; import org.opendaylight.transportpce.networkmodel.R2RLinkDiscovery; import org.opendaylight.transportpce.networkmodel.dto.TopologyShard; import org.opendaylight.transportpce.networkmodel.util.ClliNetwork; import org.opendaylight.transportpce.networkmodel.util.OpenRoadmNetwork; import org.opendaylight.transportpce.networkmodel.util.OpenRoadmTopology; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev170929.NodeTypes; +import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.Info; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.Network; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkId; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkKey; @@ -28,7 +32,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.NodeKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Network1; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.Link; -import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,53 +43,63 @@ public class NetworkModelServiceImpl implements NetworkModelService { private static final boolean CREATE_MISSING_PARENTS = true; private final DataBroker dataBroker; + private final DeviceConfig deviceConfig; private final R2RLinkDiscovery linkDiscovery; private final DeviceTransactionManager deviceTransactionManager; private final OpenRoadmTopology openRoadmTopology; private final PortMapping portMapping; - private HashMap topologyShardMountedDevice; + private HashMap topologyShardMountedDevice; - public NetworkModelServiceImpl(final DataBroker dataBroker, final R2RLinkDiscovery linkDiscovery, - DeviceTransactionManager deviceTransactionManager, - OpenRoadmTopology openRoadmTopology, PortMapping portMapping) { + public NetworkModelServiceImpl(final DataBroker dataBroker, final DeviceConfig deviceConfig, + final R2RLinkDiscovery linkDiscovery, + DeviceTransactionManager deviceTransactionManager, + OpenRoadmTopology openRoadmTopology, PortMapping portMapping) { this.dataBroker = dataBroker; + this.deviceConfig = deviceConfig; this.linkDiscovery = linkDiscovery; this.deviceTransactionManager = deviceTransactionManager; this.openRoadmTopology = openRoadmTopology; this.portMapping = portMapping; - this.topologyShardMountedDevice = new HashMap(); - } - - public void init() { - LOG.info("init ..."); - } - - public void close() { + this.topologyShardMountedDevice = new HashMap(); } @Override public void createOpenROADMnode(String nodeId) { try { - LOG.info("createOpenROADMNode: {} ", nodeId); - - this.portMapping.createMappingData(nodeId); - this.linkDiscovery.readLLDP(new NodeId(nodeId)); + LOG.info("creating OpenROADMNode: {} ", nodeId); + LOG.info("Retreiving configuration from node {}.", nodeId); + Info deviceInfo = this.deviceConfig.getDeviceInfo(nodeId); - Node clliNode = ClliNetwork.createNode(this.deviceTransactionManager, nodeId); - if (clliNode == null) { + Node clliNode = null; + if (deviceInfo != null && deviceInfo.getClli() != null) { + clliNode = ClliNetwork.createNode(deviceInfo.getClli(), nodeId); + } else { LOG.error("Unable to create clli node! Node id: {}", nodeId); return; } - Node openRoadmNode = OpenRoadmNetwork.createNode(nodeId, this.deviceTransactionManager); - if (openRoadmNode == null) { + Node openRoadmNode = null; + if (deviceInfo != null) { + openRoadmNode = OpenRoadmNetwork.createNode(nodeId, deviceInfo); + } else { LOG.error("Unable to create OpenRoadm node! Node id: {}", nodeId); return; } - TopologyShard topologyShard = this.openRoadmTopology.createTopologyShard(nodeId); - if (topologyShard == null) { - LOG.error("Unable to create topology shard for node {}!", nodeId); + TopologyShard topologyShard = null; + if (deviceInfo != null) { + topologyShard = this.openRoadmTopology.createTopologyShard(nodeId, deviceInfo); + LOG.debug("mapping = {}", topologyShard.getMappings().toString()); + if (!this.portMapping.createMappingData(deviceInfo, topologyShard.getMappings(), topologyShard + .getCpToDegreeList())) { + LOG.error("Error to create mapping data for {}", nodeId); + } else { + if (NodeTypes.Rdm.getName().equals(deviceInfo.getNodeType().getName())) { + this.linkDiscovery.readLLDP(new NodeId(nodeId)); + } + } + } else { + LOG.error("Unable to create topology shard for node {}.", nodeId); return; } this.topologyShardMountedDevice.put(nodeId, topologyShard); @@ -93,60 +107,47 @@ public class NetworkModelServiceImpl implements NetworkModelService { WriteTransaction writeTransaction = this.dataBroker.newWriteOnlyTransaction(); LOG.info("creating node in {}", NetworkUtils.CLLI_NETWORK_ID); InstanceIdentifier iiClliNode = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))) - .child(Node.class, clliNode.key()) - .build(); + .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))) + .child(Node.class, clliNode.key()) + .build(); writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiClliNode, clliNode, - CREATE_MISSING_PARENTS); + CREATE_MISSING_PARENTS); LOG.info("creating node in {}", NetworkUtils.UNDERLAY_NETWORK_ID); InstanceIdentifier iiOpenRoadmNode = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))) - .child(Node.class, openRoadmNode.key()) - .build(); + .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))) + .child(Node.class, openRoadmNode.key()) + .build(); writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmNode, openRoadmNode, - CREATE_MISSING_PARENTS); - for (Node openRoadmTopologyNode: topologyShard.getNodes()) { + CREATE_MISSING_PARENTS); + for (Node openRoadmTopologyNode : topologyShard.getNodes()) { LOG.info("creating node {} in {}", openRoadmTopologyNode.getNodeId().getValue(), - NetworkUtils.OVERLAY_NETWORK_ID); + NetworkUtils.OVERLAY_NETWORK_ID); InstanceIdentifier iiOpenRoadmTopologyNode = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) - .child(Node.class, openRoadmTopologyNode.key()) - .build(); + .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) + .child(Node.class, openRoadmTopologyNode.key()) + .build(); writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyNode, - openRoadmTopologyNode, CREATE_MISSING_PARENTS); + openRoadmTopologyNode, CREATE_MISSING_PARENTS); } - for (Link openRoadmTopologyLink: topologyShard.getLinks()) { + for (Link openRoadmTopologyLink : topologyShard.getLinks()) { LOG.info("creating link {} in {}", openRoadmTopologyLink.getLinkId().getValue(), - NetworkUtils.OVERLAY_NETWORK_ID); + NetworkUtils.OVERLAY_NETWORK_ID); InstanceIdentifier iiOpenRoadmTopologyLink = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) - .augmentation(Network1.class) - .child(Link.class, openRoadmTopologyLink.key()) - .build(); + .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) + .augmentation(Network1.class) + .child(Link.class, openRoadmTopologyLink.key()) + .build(); writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyLink, - openRoadmTopologyLink, CREATE_MISSING_PARENTS); + openRoadmTopologyLink, CREATE_MISSING_PARENTS); } writeTransaction.submit().get(); LOG.info("all nodes and links created"); } catch (InterruptedException | ExecutionException e) { LOG.error("ERROR: ", e); } - } - @Override - public void setOpenROADMnodeStatus(String nodeId, NetconfNodeConnectionStatus.ConnectionStatus connectionStatus) { - LOG.info("setOpenROADMNodeStatus: {} {}", nodeId, connectionStatus.name()); - /* - TODO: set connection status of the device in model, - TODO: so we don't need to keep it in memory (Set currentMountedDevice) - TODO: unfortunately there is no connection status OpenROADM in network models - TODO: waiting for new model version - */ } - /* (non-Javadoc) - * @see org.opendaylight.transportpce.networkmodel.service.NetworkModelService#deleteOpenROADMnode(java.lang.String) - */ @Override public void deleteOpenROADMnode(String nodeId) { try { @@ -157,38 +158,39 @@ public class NetworkModelServiceImpl implements NetworkModelService { WriteTransaction writeTransaction = this.dataBroker.newWriteOnlyTransaction(); LOG.info("deleting node in {}", NetworkUtils.CLLI_NETWORK_ID); InstanceIdentifier iiClliNode = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))) - .child(Node.class, nodeIdKey) - .build(); + .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))) + .child(Node.class, nodeIdKey) + .build(); writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiClliNode); LOG.info("deleting node in {}", NetworkUtils.UNDERLAY_NETWORK_ID); InstanceIdentifier iiOpenRoadmNode = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))) - .child(Node.class, nodeIdKey) - .build(); + .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))) + .child(Node.class, nodeIdKey) + .build(); writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmNode); TopologyShard topologyShard = this.topologyShardMountedDevice.get(nodeId); if (topologyShard != null) { LOG.info("TopologyShard for node '{}' is present", nodeId); - for (Node openRoadmTopologyNode: topologyShard .getNodes()) { + for (Node openRoadmTopologyNode : topologyShard.getNodes()) { LOG.info("deleting node {} in {}", openRoadmTopologyNode.getNodeId().getValue(), - NetworkUtils.OVERLAY_NETWORK_ID); + NetworkUtils.OVERLAY_NETWORK_ID); InstanceIdentifier iiOpenRoadmTopologyNode = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) - .child(Node.class, openRoadmTopologyNode.key()) - .build(); + .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) + .child(Node.class, openRoadmTopologyNode.key()) + .build(); writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyNode); } - for (Link openRoadmTopologyLink: topologyShard.getLinks()) { + for (Link openRoadmTopologyLink : topologyShard.getLinks()) { LOG.info("deleting link {} in {}", openRoadmTopologyLink.getLinkId().getValue(), - NetworkUtils.OVERLAY_NETWORK_ID); + NetworkUtils.OVERLAY_NETWORK_ID); InstanceIdentifier iiOpenRoadmTopologyLink = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) - .augmentation(Network1.class) - .child(Link.class, openRoadmTopologyLink.key()) - .build(); + .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) + .augmentation(Network1.class) + .child(Link.class, openRoadmTopologyLink.key()) + .build(); writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyLink); } + this.topologyShardMountedDevice.remove(nodeId); } else { LOG.warn("TopologyShard for node '{}' is not present", nodeId); } @@ -198,4 +200,11 @@ public class NetworkModelServiceImpl implements NetworkModelService { LOG.error("Error when trying to delete node : {}", nodeId, e); } } + + @Override + public void setOpenROADMnodeStatus(String nodeId, ConnectionStatus connectionStatus) { + // TODO Auto-generated method stub + + } + } diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl2.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl2.java deleted file mode 100644 index 9e51ce079..000000000 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl2.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright © 2017 Orange, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.transportpce.networkmodel.service; - -import java.util.HashMap; -import java.util.concurrent.ExecutionException; - -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.transportpce.common.NetworkUtils; -import org.opendaylight.transportpce.common.device.DeviceTransactionManager; -import org.opendaylight.transportpce.common.mapping.DeviceConfig; -import org.opendaylight.transportpce.common.mapping.PortMapping; -import org.opendaylight.transportpce.networkmodel.R2RLinkDiscovery; -import org.opendaylight.transportpce.networkmodel.dto.TopologyShard; -import org.opendaylight.transportpce.networkmodel.util.ClliNetwork; -import org.opendaylight.transportpce.networkmodel.util.OpenRoadmNetwork; -import org.opendaylight.transportpce.networkmodel.util.OpenRoadmTopology; -import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev170929.NodeTypes; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.Info; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.Network; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkId; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkKey; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NodeId; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.Node; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.NodeKey; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Network1; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.Link; -import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class NetworkModelServiceImpl2 implements NetworkModelService { - - private static final Logger LOG = LoggerFactory.getLogger(NetworkModelServiceImpl2.class); - private static final boolean CREATE_MISSING_PARENTS = true; - - private final DataBroker dataBroker; - private final DeviceConfig deviceConfig; - private final R2RLinkDiscovery linkDiscovery; - private final DeviceTransactionManager deviceTransactionManager; - private final OpenRoadmTopology openRoadmTopology; - private final PortMapping portMapping; - private HashMap topologyShardMountedDevice; - - public NetworkModelServiceImpl2(final DataBroker dataBroker, final DeviceConfig deviceConfig, - final R2RLinkDiscovery linkDiscovery, - DeviceTransactionManager deviceTransactionManager, - OpenRoadmTopology openRoadmTopology, PortMapping portMapping) { - this.dataBroker = dataBroker; - this.deviceConfig = deviceConfig; - this.linkDiscovery = linkDiscovery; - this.deviceTransactionManager = deviceTransactionManager; - this.openRoadmTopology = openRoadmTopology; - this.portMapping = portMapping; - this.topologyShardMountedDevice = new HashMap(); - } - - @Override - public void createOpenROADMnode(String nodeId) { - try { - LOG.info("creating OpenROADMNode: {} ", nodeId); - LOG.info("Retreiving configuration from node {}.", nodeId); - Info deviceInfo = this.deviceConfig.getDeviceInfo(nodeId); - - Node clliNode = null; - if (deviceInfo != null && deviceInfo.getClli() != null) { - clliNode = ClliNetwork.createNode2(deviceInfo.getClli(), nodeId); - } else { - LOG.error("Unable to create clli node! Node id: {}", nodeId); - return; - } - - Node openRoadmNode = null; - if (deviceInfo != null) { - openRoadmNode = OpenRoadmNetwork.createNode2(nodeId, deviceInfo); - } else { - LOG.error("Unable to create OpenRoadm node! Node id: {}", nodeId); - return; - } - - TopologyShard topologyShard = null; - if (deviceInfo != null) { - topologyShard = this.openRoadmTopology.createTopologyShard2(nodeId, deviceInfo); - LOG.debug("mapping = {}", topologyShard.getMappings().toString()); - if (!this.portMapping.createMappingData2(deviceInfo, topologyShard.getMappings(), - topologyShard.getCpToDegreeList())) { - LOG.error("Error to create mapping data for {}", nodeId); - } else { - if (NodeTypes.Rdm.getName().equals(deviceInfo.getNodeType().getName())) { - this.linkDiscovery.readLLDP(new NodeId(nodeId)); - } - } - } else { - LOG.error("Unable to create topology shard for node {}.", nodeId); - return; - } - this.topologyShardMountedDevice.put(nodeId, topologyShard); - - WriteTransaction writeTransaction = this.dataBroker.newWriteOnlyTransaction(); - LOG.info("creating node in {}", NetworkUtils.CLLI_NETWORK_ID); - InstanceIdentifier iiClliNode = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))) - .child(Node.class, clliNode.key()) - .build(); - writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiClliNode, clliNode, - CREATE_MISSING_PARENTS); - LOG.info("creating node in {}", NetworkUtils.UNDERLAY_NETWORK_ID); - InstanceIdentifier iiOpenRoadmNode = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))) - .child(Node.class, openRoadmNode.key()) - .build(); - writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmNode, openRoadmNode, - CREATE_MISSING_PARENTS); - for (Node openRoadmTopologyNode : topologyShard.getNodes()) { - LOG.info("creating node {} in {}", openRoadmTopologyNode.getNodeId().getValue(), - NetworkUtils.OVERLAY_NETWORK_ID); - InstanceIdentifier iiOpenRoadmTopologyNode = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) - .child(Node.class, openRoadmTopologyNode.key()) - .build(); - writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyNode, - openRoadmTopologyNode, CREATE_MISSING_PARENTS); - } - for (Link openRoadmTopologyLink : topologyShard.getLinks()) { - LOG.info("creating link {} in {}", openRoadmTopologyLink.getLinkId().getValue(), - NetworkUtils.OVERLAY_NETWORK_ID); - InstanceIdentifier iiOpenRoadmTopologyLink = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) - .augmentation(Network1.class) - .child(Link.class, openRoadmTopologyLink.key()) - .build(); - writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyLink, - openRoadmTopologyLink, CREATE_MISSING_PARENTS); - } - writeTransaction.submit().get(); - LOG.info("all nodes and links created"); - } catch (InterruptedException | ExecutionException e) { - LOG.error("ERROR: ", e); - } - - } - - @Override - public void deleteOpenROADMnode(String nodeId) { - try { - LOG.info("deleteOpenROADMnode: {} ", nodeId); - this.portMapping.deleteMappingData(nodeId); - - NodeKey nodeIdKey = new NodeKey(new NodeId(nodeId)); - WriteTransaction writeTransaction = this.dataBroker.newWriteOnlyTransaction(); - LOG.info("deleting node in {}", NetworkUtils.CLLI_NETWORK_ID); - InstanceIdentifier iiClliNode = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))) - .child(Node.class, nodeIdKey) - .build(); - writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiClliNode); - LOG.info("deleting node in {}", NetworkUtils.UNDERLAY_NETWORK_ID); - InstanceIdentifier iiOpenRoadmNode = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))) - .child(Node.class, nodeIdKey) - .build(); - writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmNode); - TopologyShard topologyShard = this.topologyShardMountedDevice.get(nodeId); - if (topologyShard != null) { - LOG.info("TopologyShard for node '{}' is present", nodeId); - for (Node openRoadmTopologyNode: topologyShard .getNodes()) { - LOG.info("deleting node {} in {}", openRoadmTopologyNode.getNodeId().getValue(), - NetworkUtils.OVERLAY_NETWORK_ID); - InstanceIdentifier iiOpenRoadmTopologyNode = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) - .child(Node.class, openRoadmTopologyNode.key()) - .build(); - writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyNode); - } - for (Link openRoadmTopologyLink: topologyShard.getLinks()) { - LOG.info("deleting link {} in {}", openRoadmTopologyLink.getLinkId().getValue(), - NetworkUtils.OVERLAY_NETWORK_ID); - InstanceIdentifier iiOpenRoadmTopologyLink = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) - .augmentation(Network1.class) - .child(Link.class, openRoadmTopologyLink.key()) - .build(); - writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyLink); - } - this.topologyShardMountedDevice.remove(nodeId); - } else { - LOG.warn("TopologyShard for node '{}' is not present", nodeId); - } - writeTransaction.submit().get(); - LOG.info("all nodes and links deleted ! "); - } catch (InterruptedException | ExecutionException e) { - LOG.error("Error when trying to delete node : {}", nodeId, e); - } - } - - @Override - public void setOpenROADMnodeStatus(String nodeId, ConnectionStatus connectionStatus) { - // TODO Auto-generated method stub - - } - -} diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/ClliNetwork.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/ClliNetwork.java index 316cb3245..5de983433 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/ClliNetwork.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/ClliNetwork.java @@ -8,7 +8,6 @@ package org.opendaylight.transportpce.networkmodel.util; -import java.util.Optional; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -16,15 +15,11 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.transportpce.common.NetworkUtils; -import org.opendaylight.transportpce.common.Timeouts; -import org.opendaylight.transportpce.common.device.DeviceTransactionManager; import org.opendaylight.yang.gen.v1.http.org.openroadm.clli.network.rev170626.NetworkTypes1; import org.opendaylight.yang.gen.v1.http.org.openroadm.clli.network.rev170626.NetworkTypes1Builder; import org.opendaylight.yang.gen.v1.http.org.openroadm.clli.network.rev170626.Node1; import org.opendaylight.yang.gen.v1.http.org.openroadm.clli.network.rev170626.Node1Builder; import org.opendaylight.yang.gen.v1.http.org.openroadm.clli.network.rev170626.network.network.types.ClliNetworkBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.Info; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.Network; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkId; @@ -66,48 +61,11 @@ public final class ClliNetwork { } } - /** - * Create single node entry for CLLI topology. - * - * @param deviceTransactionManager device transation manager - * @param deviceId device ID - * - * @return node builder status - */ - public static Node createNode(DeviceTransactionManager deviceTransactionManager, String deviceId) { - // Read clli from the device - InstanceIdentifier infoIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Info.class); - Optional deviceInfo = deviceTransactionManager.getDataFromDevice(deviceId, - LogicalDatastoreType.OPERATIONAL, infoIID, Timeouts.DEVICE_READ_TIMEOUT, - Timeouts.DEVICE_READ_TIMEOUT_UNIT); - String clli; - if (deviceInfo.isPresent()) { - clli = deviceInfo.get().getClli(); - } else { - return null; - } - /* - * Create node in the CLLI layer of the network model with nodeId equal - * to the clli attribute in the device model's info subtree - */ - NodeBuilder nodeBldr = new NodeBuilder(); - NodeId nwNodeId = new NodeId(clli); - nodeBldr.setNodeId(nwNodeId); - nodeBldr.withKey(new NodeKey(nwNodeId)); - /* - * create clli node augmentation defined in openroadm-clli-network.yang - */ - Node1Builder clliAugmentationBldr = new Node1Builder(); - clliAugmentationBldr.setClli(clli); - nodeBldr.addAugmentation(Node1.class, clliAugmentationBldr.build()); - return nodeBldr.build(); - } - /** * Other implementation to create single node entry for CLLI topology. * */ - public static Node createNode2(String clli, String deviceId) { + public static Node createNode(String clli, String deviceId) { NodeBuilder nodeBldr = new NodeBuilder(); NodeId nwNodeId = new NodeId(clli); nodeBldr.setNodeId(nwNodeId); diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmNetwork.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmNetwork.java index 37c48d02d..781e9f38a 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmNetwork.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmNetwork.java @@ -9,7 +9,6 @@ package org.opendaylight.transportpce.networkmodel.util; import com.google.common.collect.ImmutableList; -import java.util.Optional; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -17,10 +16,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.transportpce.common.NetworkUtils; -import org.opendaylight.transportpce.common.Timeouts; -import org.opendaylight.transportpce.common.device.DeviceTransactionManager; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.NodeTypes; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.Info; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.rev170929.NetworkTypes1; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.rev170929.NetworkTypes1Builder; @@ -73,78 +69,11 @@ public final class OpenRoadmNetwork { } } - /** - * Create single node entry for OpenRoadmNetwork. - * - * @param nodeId node ID - * @param deviceTransactionManager device transaction manager - * - * @return node builder status - */ - public static Node createNode(String nodeId, DeviceTransactionManager deviceTransactionManager) { - // Fetches the info from the deviceInfo - InstanceIdentifier infoIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Info.class); - Optional deviceInfoOpt = deviceTransactionManager.getDataFromDevice(nodeId, - LogicalDatastoreType.OPERATIONAL, infoIID, Timeouts.DEVICE_READ_TIMEOUT, - Timeouts.DEVICE_READ_TIMEOUT_UNIT); - Info deviceInfo; - if (deviceInfoOpt.isPresent()) { - deviceInfo = deviceInfoOpt.get(); - } else { - LOG.error("Unable to get device info from device {}!", nodeId); - return null; - } - NodeTypes nodeType = deviceInfo.getNodeType(); - - // Uses the Node Builder to set the nodeId and Key - NodeBuilder nodeBldr = new NodeBuilder(); - NodeId nwNodeId = new NodeId(nodeId); - nodeBldr.setNodeId(nwNodeId); - nodeBldr.withKey(new NodeKey(nwNodeId)); - Node1Builder node1bldr = new Node1Builder(); - - /* - * Recognize the node type: 1:ROADM, 2:XPONDER - */ - switch (nodeType.getIntValue()) { - case 1: - node1bldr.setNodeType(OpenroadmNodeType.ROADM); - break; - case 2: - node1bldr.setNodeType(OpenroadmNodeType.XPONDER); - break; - default: - LOG.error("No correponsding type for the value: {}", nodeType.getIntValue()); - break; - } - - String vendor = deviceInfo.getVendor(); - String model = deviceInfo.getModel(); - IpAddress ipAddress = deviceInfo.getIpAddress(); - // Sets IP, Model and Vendor information fetched from the deviceInfo - node1bldr.setIp(ipAddress); - node1bldr.setModel(model); - node1bldr.setVendor(vendor); - - // Sets the value of Network-ref and Node-ref as a part of the supporting node - // attribute - String clli = deviceInfo.getClli(); - SupportingNodeBuilder supportbldr = new SupportingNodeBuilder(); - supportbldr.withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID), new NodeId(clli))); - supportbldr.setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID)); - supportbldr.setNodeRef(new NodeId(clli)); - nodeBldr.setSupportingNode(ImmutableList.of(supportbldr.build())); - - // Augment to the main node builder - nodeBldr.addAugmentation(Node1.class, node1bldr.build()); - return nodeBldr.build(); - } - /** * Create single node entry for OpenRoadmNetwork. * */ - public static Node createNode2(String nodeId, Info deviceInfo) { + public static Node createNode(String nodeId, Info deviceInfo) { NodeTypes nodeType = deviceInfo.getNodeType(); // Uses the Node Builder to set the nodeId and Key diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java index 9f58ab06d..7caed6fbf 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java @@ -40,7 +40,6 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev170929.degree.n import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.CircuitPack; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.Port; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.Ports; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.PortsKey; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.packs.CircuitPacks; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.packs.CircuitPacksKey; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.degree.ConnectionPorts; @@ -165,114 +164,7 @@ public class OpenRoadmTopology { return nwBuilder.build(); } - public TopologyShard createTopologyShard(String nodeId) { - // int numOfDegrees; - // int numOfSrgs; - // int portDirectionEnum = DEFAULT_PORT_DIRECTION; - // - // InstanceIdentifier infoIID = - // InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Info.class); - // java.util.Optional deviceInfoOpt = - // this.deviceTransactionManager.getDataFromDevice(nodeId, - // LogicalDatastoreType.OPERATIONAL, infoIID, - // Timeouts.DEVICE_READ_TIMEOUT, - // Timeouts.DEVICE_READ_TIMEOUT_UNIT); - // Info deviceInfo; - // if (deviceInfoOpt.isPresent()) { - // deviceInfo = deviceInfoOpt.get(); - // } else { - // LOG.error("Unable to get device info for device {}!", nodeId); - // return null; - // } - // List nodes = new ArrayList<>(); - // List portMapList = new ArrayList<>(); - // - // // Check if node is ROADM - // if (NodeTypes.Rdm.equals(deviceInfo.getNodeType())) { - // - // /* - // * Adding Degree Node Get Degree Number -> x then get connection - // * ports then find the port directions to decide whether TX/RX/TXRX - // * Get value for max degree from info subtree, required for - // * iteration if not present assume to be 20 (temporary) - // */ - // - // Integer maxDegree; - // if (deviceInfo.getMaxDegrees() != null) { - // maxDegree = deviceInfo.getMaxDegrees(); - // } else { - // maxDegree = MAX_DEGREE; - // } - // - // // Starting with degree Number = 1 - // Integer degreeCounter = 1; - // - // while (degreeCounter <= maxDegree) { - // LOG.info("creating degree node {}/{}", degreeCounter, maxDegree); - // NodeData nodeData = createDegreeNode(nodeId, degreeCounter, - // portMapList); - // if (nodeData != null) { - // NodeBuilder tempNode = nodeData.getNodeBuilder(); - // portDirectionEnum = nodeData.getPortDirectionEnum(); - // nodes.add(tempNode.build()); - // degreeCounter++; - // } else { - // // null returned if Degree number= degreeCounter not present - // // in the device - // break; - // } - // } - // numOfDegrees = degreeCounter - 1; - // - // Integer maxSrg; - // if (deviceInfo.getMaxSrgs() != null) { - // maxSrg = deviceInfo.getMaxSrgs(); - // } else { - // maxSrg = MAX_SRG; - // } - // - // // Starting with degree Number = 1 - // Integer srgCounter = 1; - // - // while (srgCounter <= maxSrg) { - // LOG.info("creating SRG node {}/{}", srgCounter, maxSrg); - // NodeBuilder tempNode = createSrgNode(nodeId, srgCounter, - // portDirectionEnum); - // - // if (tempNode != null) { - // nodes.add(tempNode.build()); - // srgCounter++; - // } else { - // // null returned if Degree number= degreeCounter not present - // // in the device - // break; - // } - // } - // numOfSrgs = srgCounter - 1; - // - // LOG.info("adding links numOfDegrees={} numOfSrgs={}", numOfDegrees, - // numOfSrgs); - // List links = new ArrayList<>(); - // links.addAll(createExpressLinks(nodeId, numOfDegrees, - // portDirectionEnum)); - // links.addAll(createAddDropLinks(nodeId, numOfDegrees, numOfSrgs, - // portDirectionEnum)); - // LOG.info("created nodes/links: {}/{}", nodes.size(), links.size()); - // return new TopologyShard(nodes, links); - // } else if (NodeTypes.Xpdr.equals(deviceInfo.getNodeType())) { - // // Check if node is XPONDER - // XponderPortNumber portNums = getNoOfPorts(nodeId); - // List links = new ArrayList<>(); - // NodeBuilder tempNode = createXpdr(portNums.getNumOfClientPorts(), - // portNums.getNumOfLinePorts(), nodeId); - // nodes.add(tempNode.build()); - // return new TopologyShard(nodes, links); - // } - // - return null; - } - - public TopologyShard createTopologyShard2(String nodeId, Info deviceInfo) { + public TopologyShard createTopologyShard(String nodeId, Info deviceInfo) { int numOfDegrees = 0; int numOfSrgs = 0; List nodes = new ArrayList<>(); @@ -295,8 +187,8 @@ public class OpenRoadmTopology { maxDegree = MAX_DEGREE; } Map interfaceList = getEthInterfaceList(nodeId); - interfaceList.forEach((key,val) -> LOG.debug("clé = {}, val = {}", key, val)); - List localcpDegreelist = new ArrayList(); + interfaceList.forEach((key, val) -> LOG.debug("clé = {}, val = {}", key, val)); + List localcpDegreelist = new ArrayList(); // Starting with degree Number = 1 Integer degreeCounter = 1; @@ -341,9 +233,6 @@ public class OpenRoadmTopology { LOG.info("adding links numOfDegrees={} numOfSrgs={}", numOfDegrees, numOfSrgs); List links = new ArrayList<>(); links.addAll(createLinks(nodeId, nodes)); - // links.addAll(createExpressLinks2(nodeId, numOfDegrees)); - // links.addAll(createAddDropLinks2(nodeId, numOfDegrees, - // numOfSrgs)); LOG.info("created nodes/links: {}/{}", nodes.size(), links.size()); return new TopologyShard(nodes, links, localportMapList, localcpDegreelist); @@ -363,101 +252,17 @@ public class OpenRoadmTopology { } /** - * This private method gets the list of circuit packs on a xponder. For each - * circuit pack on a Xponder, it does a get on circuit-pack subtree with - * circuit-pack-name as key in order to get the list of ports. It then - * iterates over the list of ports to get ports with port-qual as - * xpdr-network/xpdr-client. The line and client ports are saved as: + * This method creates on xpdr node inside the openroadm-topology according + * to the device configuration. * - *

- * 1. LINEn + * @param nodeId + * device id + * @param connectionMapList + * list of connection map from device operational datastore in + * order to associate a client port to the network port * - *

- * 2. CLNTn + * @author Gilles Thouenon (gilles.thouenon@orange.com) */ - private XponderPortNumber getNoOfPorts(String deviceId) { - - XponderPortNumber xponderPortNumber = new XponderPortNumber(); - // Creating for Xponder Line and Client Ports - InstanceIdentifier deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class); - Optional deviceObject = this.deviceTransactionManager.getDataFromDevice(deviceId, - LogicalDatastoreType.OPERATIONAL, deviceIID, Timeouts.DEVICE_READ_TIMEOUT, - Timeouts.DEVICE_READ_TIMEOUT_UNIT); - - // Variable to keep track of number of client ports - int client = 0; - int line = 0; - if (deviceObject.isPresent()) { - for (CircuitPacks cp : deviceObject.get().getCircuitPacks()) { - if (cp.getPorts() != null) { - for (Ports port : cp.getPorts()) { - if (port.getPortQual() != null) { - if (port.getPortQual().getIntValue() == 4) { - client++; - } else if (port.getPortQual().getIntValue() == 3) { - line++; - } - } - } - } - } - } else { - return xponderPortNumber; - } - xponderPortNumber.setNumOfClientPorts(client); - xponderPortNumber.setNumOfLinePorts(line); - return xponderPortNumber; - } - - private NodeBuilder createXpdr(Integer clientCounter, Integer lineCounter, String nodeId) { - // Create a generic Topo Layer node - NodeBuilder nodebldr = createTopoLayerNode(nodeId); - // Create augmentation node to inorder to add degree - Node1Builder node1bldr = new Node1Builder(); - TerminationPoint1Builder tp1Bldr = new TerminationPoint1Builder(); - TerminationPointBuilder tempTpBldr; - - // set node type to Xponder - node1bldr.setNodeType(OpenroadmNodeType.XPONDER); - List tpList = new ArrayList<>(); - String nodeIdtopo = new StringBuilder().append(nodeId).append("-XPDR1").toString(); - // Ad degree node specific augmentation - nodebldr.setNodeId(new NodeId(nodeIdtopo)); - nodebldr.withKey(new NodeKey(new NodeId(nodeIdtopo))); - nodebldr.addAugmentation(Node1.class, node1bldr.build()); - while (clientCounter != 0) { - // Create CLNT-TX terminationCannot get available Capabilitiesc - tempTpBldr = createTpBldr("XPDR1-CLIENT" + clientCounter); - tp1Bldr.setTpType(OpenroadmTpType.XPONDERCLIENT); - XpdrClientAttributesBuilder xpdrClntBldr = new XpdrClientAttributesBuilder(); - xpdrClntBldr.setTailEquipmentId("XPDR1-NETWORK" + clientCounter); - tp1Bldr.setXpdrClientAttributes(xpdrClntBldr.build()); - tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build()); - tpList.add(tempTpBldr.build()); - clientCounter--; - } - while (lineCounter != 0) { - // Create LINE-TX termination - tempTpBldr = (createTpBldr("XPDR1-NETWORK" + lineCounter)); - tp1Bldr.setTpType(OpenroadmTpType.XPONDERNETWORK); - XpdrNetworkAttributesBuilder xpdrNwAttrBldr = new XpdrNetworkAttributesBuilder(); - xpdrNwAttrBldr.setTailEquipmentId("XPDR1-CLIENT" + lineCounter); - tp1Bldr.setXpdrNetworkAttributes(xpdrNwAttrBldr.build()); - tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build()); - tpList.add(tempTpBldr.build()); - lineCounter--; - } - LOG.info("printing tpList {}", tpList); - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Node1Builder tpNode1 = - new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Node1Builder(); - tpNode1.setTerminationPoint(tpList); - nodebldr.addAugmentation( - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Node1.class, - tpNode1.build()); - LOG.info("The nodebldr {}", nodebldr); - return nodebldr; - } - private NodeData createXpdrNode(String nodeId, List connectionMapList) { // Create org-openroadm augmentation node Node1Builder node1bldr = new Node1Builder(); @@ -614,7 +419,19 @@ public class OpenRoadmTopology { return new NodeData(nodebldr, mappingList, null); } - + /** + * This method creates a rdm degree node inside the openroadm-topology + * according to the device configuration. + * + * @param nodeId + * device id + * @param degreeCounter + * number of the current degree + * @param interfList + * list of CpToDegree to be updated for portmapping + * + * @author Gilles Thouenon (gilles.thouenon@orange.com) + */ private NodeData createDegreeNode(String nodeId, int degreeCounter, Map interfList) { // Create openroadm-topology-node augmentation in order to add degree Node1Builder node1bldr = new Node1Builder(); @@ -741,8 +558,8 @@ public class OpenRoadmTopology { // complement mapping with cp-to-degree List cpList = new ArrayList<>(); if (degree.getCircuitPacks() != null) { - for (org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.degree.CircuitPacks - cp : degree.getCircuitPacks()) { + for (org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.degree.CircuitPacks cp : degree + .getCircuitPacks()) { if (interfList.containsKey(cp.getCircuitPackName())) { CpToDegree cpToDeg = new CpToDegreeBuilder() .setCircuitPackName(cp.getCircuitPackName()) @@ -756,6 +573,17 @@ public class OpenRoadmTopology { return new NodeData(nodebldr, mappingList, cpList); } + /** + * This method creates a rdm srg node inside the openroadm-topology + * according to the device configuration. + * + * @param nodeId + * device id + * @param srgCounter + * number of the current srg + * + * @author Gilles Thouenon (gilles.thouenon@orange.com) + */ private NodeData createSrgNode(String nodeId, int srgCounter) { // Create augmentation node in order to add SRG Node1Builder node1bldr = new Node1Builder(); @@ -795,7 +623,7 @@ public class OpenRoadmTopology { List srgCpList = srg .getCircuitPacks(); for (org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.srg.CircuitPacks - circuitPacks : srgCpList) { + circuitPacks : srgCpList) { String circuitPackName = circuitPacks.getCircuitPackName(); CircuitPack cp = this.deviceConfig.getDeviceCp(nodeId, circuitPackName); if (cp.getPorts() == null) { @@ -857,70 +685,6 @@ public class OpenRoadmTopology { } } - // for (int i = 1; i <= maxPpPorts; i++) { - // if ((portDirectionEnum == 1) || (portDirectionEnum == 2)) { - // if (i >= (maxPpPorts / 2)) { - // break; - // } - // // ports are uni Directional on a degree, therefore 4 - // // termination points - // // Create PP-TX termination - // tempTpBldr = createTpBldr("SRG" + srgCounter + "-PP" + i + "-TX"); - // tp1Bldr = new TerminationPoint1Builder(); - // tp1Bldr.setTpType(OpenroadmTpType.SRGTXPP); - // tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build()); - // tpList.add(tempTpBldr.build()); - // - // // Create PP-RX termination - // tempTpBldr = createTpBldr("SRG" + srgCounter + "-PP" + i + "-RX"); - // tp1Bldr = new TerminationPoint1Builder(); - // tp1Bldr.setTpType(OpenroadmTpType.SRGRXPP); - // tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build()); - // tpList.add(tempTpBldr.build()); - // - // } else if (portDirectionEnum == 3) { - // // Ports are bi directional therefore 2 termination points - // // Create PP-TXRX termination - // tempTpBldr = createTpBldr("SRG" + srgCounter + "-PP" + i + "-TXRX"); - // tp1Bldr = new TerminationPoint1Builder(); - // tp1Bldr.setTpType(OpenroadmTpType.SRGTXRXPP); - // tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build()); - // tpList.add(tempTpBldr.build()); - // } - // } - - // switch (portDirectionEnum) { - // case 1: // ports are uni Directional on a degree - // // Create CP-TX termination - // tempTpBldr = createTpBldr("SRG" + srgCounter + "-CP" + "-TX"); - // tp1Bldr = new TerminationPoint1Builder(); - // tp1Bldr.setTpType(OpenroadmTpType.SRGTXCP); - // tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build()); - // tpList.add(tempTpBldr.build()); - // break; - // case 2: - // // Create CP-RX termination - // tempTpBldr = createTpBldr("SRG" + srgCounter + "-CP" + "-RX"); - // tp1Bldr = new TerminationPoint1Builder(); - // tp1Bldr.setTpType(OpenroadmTpType.SRGRXCP); - // tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build()); - // tpList.add(tempTpBldr.build()); - // break; - // case 3: - // // Ports are bi directional therefore 2 termination points - // // Create CP-TXRX termination - // tempTpBldr = createTpBldr("SRG" + srgCounter + "-CP" + "-TXRX"); - // tp1Bldr = new TerminationPoint1Builder(); - // tp1Bldr.setTpType(OpenroadmTpType.SRGTXRXCP); - // tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build()); - // tpList.add(tempTpBldr.build()); - // break; - // default: - // LOG.error("No correponsding direction to the value: {}", - // portDirectionEnum); - // break; - // } - // Create CP-TXRX termination tempTpBldr = createTpBldr("SRG" + srgCounter + "-CP" + "-TXRX"); tp1Bldr = new TerminationPoint1Builder(); @@ -977,31 +741,6 @@ public class OpenRoadmTopology { return nodebldr; } - // Return 0 for null/error values - // Return 1 for tx - // Return 2 for rx - // Return 3 for bi-directional - - private int getPortDirection(String deviceId, String circuitPackName, String portName) { - InstanceIdentifier portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) - .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName)) - .child(Ports.class, new PortsKey(portName)); - LOG.info("Fetching Port Direction for port {} at circuit pack {}", portName, circuitPackName); - Optional portObject = this.deviceTransactionManager.getDataFromDevice(deviceId, - LogicalDatastoreType.OPERATIONAL, portIID, Timeouts.DEVICE_READ_TIMEOUT, - Timeouts.DEVICE_READ_TIMEOUT_UNIT); - if (portObject.isPresent()) { - Ports port = portObject.get(); - if (port.getPortDirection() != null) { - return port.getPortDirection().getIntValue(); - } else { - LOG.warn("Port direction value missing for {} {}", circuitPackName, port.getPortName()); - return 0; - } - } - return 0; - } - // This method returns a generic termination point builder for a given tpid private TerminationPointBuilder createTpBldr(String tpId) { TerminationPointBuilder tpBldr = new TerminationPointBuilder(); @@ -1042,6 +781,16 @@ public class OpenRoadmTopology { return lnkBldr; } + /** + * This method creates links between openroadm-topology nodes. + * + * @param nodeId + * device id + * @param nodes + * list of nodes + * + * @author Gilles Thouenon (gilles.thouenon@orange.com) + */ private List createLinks(String nodeId, List nodes) { List links = new ArrayList<>(); List listDegeeNodes = nodes.stream().filter(node -> node.getNodeId().toString().contains("DEG")).collect( @@ -1145,151 +894,6 @@ public class OpenRoadmTopology { return links; } - private List createExpressLinks(String nodeId, int numOfDegrees, int portDirectionEnum) { - LOG.info("creating express links {} {} {}", nodeId, numOfDegrees, portDirectionEnum); - List links = new ArrayList<>(); - - String srcNode; - String destNode; - - String srcTp; - String destTp; - - // ports are uni-directional - if ((portDirectionEnum == 1) || (portDirectionEnum == 2)) { - LOG.info("creating uni-directional express links"); - for (int i = 1; i <= numOfDegrees; i++) { - for (int j = i + 1; j <= numOfDegrees; j++) { - - srcNode = nodeId + "-DEG" + i; - destNode = nodeId + "-DEG" + j; - - // AtoZ direction - srcTp = "DEG" + i + "-CTP-TX"; - destTp = "DEG" + j + "-CTP-RX"; - - LinkBuilder expLinkBldr = createLink(srcNode, destNode, srcTp, destTp, true); - - Link1Builder lnk1Bldr = new Link1Builder(); - lnk1Bldr.setLinkType(OpenroadmLinkType.EXPRESSLINK); - expLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - - links.add(expLinkBldr.build()); - - // ZtoA direction - srcTp = "DEG" + i + "-CTP-RX"; - destTp = "DEG" + j + "-CTP-TX"; - - expLinkBldr = createLink(destNode, srcNode, destTp, srcTp, true); - expLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - - links.add(expLinkBldr.build()); - - } - } - } - - // ports are bi-directional - if (portDirectionEnum == 3) { - LOG.info("creating bi-directional express links"); - for (int i = 1; i <= numOfDegrees; i++) { - for (int j = i + 1; j <= numOfDegrees; j++) { - - srcNode = nodeId + "-DEG" + i; - destNode = nodeId + "-DEG" + j; - - // AtoZ direction - srcTp = "DEG" + i + "-CTP-TXRX"; - destTp = "DEG" + j + "-CTP-TXRX"; - - Link1Builder lnk1Bldr = new Link1Builder(); - lnk1Bldr.setLinkType(OpenroadmLinkType.EXPRESSLINK); - - LinkBuilder expLinkBldr = createLink(srcNode, destNode, srcTp, destTp, true); - expLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - links.add(expLinkBldr.build()); - - // ZtoA direction - expLinkBldr = createLink(destNode, srcNode, destTp, srcTp, true); - expLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - links.add(expLinkBldr.build()); - } - } - } - return links; - } - - private List createAddDropLinks(String nodeId, int numOfDegrees, int numOfSrgs, int portDirectionEnum) { - LOG.info("creating add-drop links {} {} {} {}", nodeId, numOfDegrees, numOfSrgs, portDirectionEnum); - List links = new ArrayList<>(); - - String srcNode; - String destNode; - - String srcTp; - String destTp; - - // ports are uni-directional - if ((portDirectionEnum == 1) || (portDirectionEnum == 2)) { - LOG.info("creating uni-directional add-drop links"); - for (int i = 1; i <= numOfDegrees; i++) { - for (int j = 1; j <= numOfSrgs; j++) { - - srcNode = nodeId + "-DEG" + i; - destNode = nodeId + "-SRG" + j; - - // drop links - srcTp = "DEG" + i + "-CTP-TX"; - destTp = "SRG" + j + "-CP-RX"; - - LinkBuilder addDropLinkBldr = createLink(srcNode, destNode, srcTp, destTp, true); - Link1Builder lnk1Bldr = new Link1Builder(); - lnk1Bldr.setLinkType(OpenroadmLinkType.DROPLINK); - addDropLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - links.add(addDropLinkBldr.build()); - - // add links direction - srcTp = "DEG" + i + "-CTP-RX"; - destTp = "SRG" + j + "-CP-TX"; - - addDropLinkBldr = createLink(destNode, srcNode, destTp, srcTp, true); - lnk1Bldr.setLinkType(OpenroadmLinkType.ADDLINK); - addDropLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - links.add(addDropLinkBldr.build()); - - } - } - } - // ports are bi-directional - if (portDirectionEnum == 3) { - LOG.info("creating bi-directional add-drop links"); - for (int i = 1; i <= numOfDegrees; i++) { - for (int j = 1; j <= numOfSrgs; j++) { - - srcNode = nodeId + "-DEG" + i; - destNode = nodeId + "-SRG" + j; - - // drop links - srcTp = "DEG" + i + "-CTP-TXRX"; - destTp = "SRG" + j + "-CP-TXRX"; - - LinkBuilder addDropLinkBldr = createLink(srcNode, destNode, srcTp, destTp, true); - Link1Builder lnk1Bldr = new Link1Builder(); - lnk1Bldr.setLinkType(OpenroadmLinkType.DROPLINK); - addDropLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - links.add(addDropLinkBldr.build()); - - // add link - addDropLinkBldr = createLink(destNode, srcNode, destTp, srcTp, true); - lnk1Bldr.setLinkType(OpenroadmLinkType.ADDLINK); - addDropLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - links.add(addDropLinkBldr.build()); - } - } - } - return links; - } - // This method returns the linkBuilder object for given source and // destination. public boolean deleteLink(String srcNode, String dstNode, Integer srcDegId, @@ -1335,53 +939,25 @@ public class OpenRoadmTopology { for (int i = 1; i < 97; i++) { org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev170929.srg.node.attributes - .AvailableWavelengthsBuilder avalBldr = - new org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev170929.srg.node.attributes - .AvailableWavelengthsBuilder(); + .AvailableWavelengthsBuilder avalBldr = new org.opendaylight.yang.gen.v1.http.org.openroadm.srg + .rev170929.srg.node.attributes.AvailableWavelengthsBuilder(); avalBldr.setIndex((long) i); - avalBldr.withKey( - new org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev170929.srg.node.attributes - .AvailableWavelengthsKey((long) i)); + avalBldr.withKey(new org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev170929.srg.node.attributes + .AvailableWavelengthsKey((long) i)); waveList.add(avalBldr.build()); } return waveList; } - private class XponderPortNumber { - private int numOfLinePorts; - private int numOfClientPorts; - - XponderPortNumber() { - numOfClientPorts = 0; - numOfLinePorts = 0; - } - - public void setNumOfLinePorts(int numOfLinePorts) { - this.numOfLinePorts = numOfLinePorts; - } - - public void setNumOfClientPorts(int numOfClientPorts) { - this.numOfClientPorts = numOfClientPorts; - } - - public int getNumOfClientPorts() { - return numOfClientPorts; - } - - public int getNumOfLinePorts() { - return numOfLinePorts; - } - } - // method copied/pasted from PortMappingImpl.java private Map getEthInterfaceList(String nodeId) { Map cpToInterfaceMap = new HashMap<>(); InstanceIdentifier protocolsIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) - .child(Protocols.class); + .child(Protocols.class); Optional protocolObject = this.deviceTransactionManager.getDataFromDevice(nodeId, - LogicalDatastoreType.OPERATIONAL, protocolsIID, Timeouts.DEVICE_READ_TIMEOUT, - Timeouts.DEVICE_READ_TIMEOUT_UNIT); + LogicalDatastoreType.OPERATIONAL, protocolsIID, Timeouts.DEVICE_READ_TIMEOUT, + Timeouts.DEVICE_READ_TIMEOUT_UNIT); if (!protocolObject.isPresent() || (protocolObject.get().augmentation(Protocols1.class) == null)) { LOG.warn("LLDP subtree is missing : isolated openroadm device"); return cpToInterfaceMap; @@ -1391,25 +967,26 @@ public class OpenRoadmTopology { for (PortConfig portConfig : portConfigList) { if (portConfig.getAdminStatus().equals(PortConfig.AdminStatus.Txandrx)) { InstanceIdentifier interfaceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) - .child(Interface.class, new InterfaceKey(portConfig.getIfName())); + .child(Interface.class, new InterfaceKey(portConfig.getIfName())); Optional interfaceObject = this.deviceTransactionManager.getDataFromDevice(nodeId, - LogicalDatastoreType.OPERATIONAL, interfaceIID, Timeouts.DEVICE_READ_TIMEOUT, - Timeouts.DEVICE_READ_TIMEOUT_UNIT); + LogicalDatastoreType.OPERATIONAL, interfaceIID, Timeouts.DEVICE_READ_TIMEOUT, + Timeouts.DEVICE_READ_TIMEOUT_UNIT); if (interfaceObject.isPresent() - && (interfaceObject.get().getSupportingCircuitPackName() != null)) { + && (interfaceObject.get().getSupportingCircuitPackName() != null)) { String supportingCircuitPackName = interfaceObject.get().getSupportingCircuitPackName(); cpToInterfaceMap.put(supportingCircuitPackName, portConfig.getIfName()); InstanceIdentifier circuitPacksIID = InstanceIdentifier - .create(OrgOpenroadmDevice.class).child(CircuitPacks.class, - new CircuitPacksKey(supportingCircuitPackName)); + .create(OrgOpenroadmDevice.class).child(CircuitPacks.class, + new CircuitPacksKey(supportingCircuitPackName)); Optional circuitPackObject = this.deviceTransactionManager.getDataFromDevice( - nodeId, LogicalDatastoreType.OPERATIONAL, circuitPacksIID, Timeouts - .DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); -// if (circuitPackObject.isPresent() -// && (circuitPackObject.get().getParentCircuitPack() != null)) { -// cpToInterfaceMap.put(circuitPackObject.get().getParentCircuitPack() -// .getCircuitPackName(), portConfig.getIfName()); -// } + nodeId, LogicalDatastoreType.OPERATIONAL, circuitPacksIID, Timeouts.DEVICE_READ_TIMEOUT, + Timeouts.DEVICE_READ_TIMEOUT_UNIT); + // if (circuitPackObject.isPresent() + // && (circuitPackObject.get().getParentCircuitPack() != + // null)) { + // cpToInterfaceMap.put(circuitPackObject.get().getParentCircuitPack() + // .getCircuitPackName(), portConfig.getIfName()); + // } } } else { LOG.warn("PortConfig Admin Status is not equal Txandrx"); @@ -1421,5 +998,4 @@ public class OpenRoadmTopology { return cpToInterfaceMap; } - } diff --git a/networkmodel/src/main/resources/org/opendaylight/blueprint/networkmodel-blueprint.xml b/networkmodel/src/main/resources/org/opendaylight/blueprint/networkmodel-blueprint.xml index 89482f3e6..39afe028e 100644 --- a/networkmodel/src/main/resources/org/opendaylight/blueprint/networkmodel-blueprint.xml +++ b/networkmodel/src/main/resources/org/opendaylight/blueprint/networkmodel-blueprint.xml @@ -21,7 +21,7 @@ - +