X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=common%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fcommon%2Fopenroadminterfaces%2FOpenRoadmInterfacesImpl121.java;h=6d103d9013ef2ca61bcf3554fa1a83382da9f9d5;hb=db2f9233fe42a2eb68b69663e5c0d86c9a5f9be4;hp=3eddbcb27403d74cf2b3253a4fce2ec46364bb10;hpb=c8ee06305ef3e445b10ff207a220c7d5b40a8e3c;p=transportpce.git diff --git a/common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfacesImpl121.java b/common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfacesImpl121.java index 3eddbcb27..6d103d901 100755 --- a/common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfacesImpl121.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfacesImpl121.java @@ -8,15 +8,19 @@ package org.opendaylight.transportpce.common.openroadminterfaces; -import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.FluentFuture; import java.util.Optional; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.mdsal.common.api.CommitInfo; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.transportpce.common.StringConstants; import org.opendaylight.transportpce.common.Timeouts; import org.opendaylight.transportpce.common.device.DeviceTransaction; import org.opendaylight.transportpce.common.device.DeviceTransactionManager; +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.CircuitPacksBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.packs.CircuitPacksKey; @@ -24,17 +28,11 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfac import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.InterfaceBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.InterfaceKey; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice; +import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.port.Interfaces; import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev161014.AdminStates; import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev161014.States; -import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev161014.OtnOdu; -import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev161014.OtnOtu; -import org.opendaylight.yang.gen.v1.http.org.openroadm.maintenance.loopback.rev161014.maint.loopback.MaintLoopbackBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.maintenance.testsignal.rev161014.maint.testsignal.MaintTestsignalBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev161014.Interface1; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev161014.Interface1Builder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev161014.odu.container.OduBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev161014.otu.container.OtuBuilder; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -66,12 +64,37 @@ public class OpenRoadmInterfacesImpl121 { InstanceIdentifier interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child( Interface.class, new InterfaceKey(ifBuilder.getName())); - deviceTx.put(LogicalDatastoreType.CONFIGURATION, interfacesIID, ifBuilder.build()); - ListenableFuture txSubmitFuture = deviceTx.submit(Timeouts.DEVICE_WRITE_TIMEOUT, - Timeouts.DEVICE_WRITE_TIMEOUT_UNIT); + deviceTx.merge(LogicalDatastoreType.CONFIGURATION, interfacesIID, ifBuilder.build()); + FluentFuture txSubmitFuture = + deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT); + // TODO: instead of using this infinite loop coupled with this timeout, + // it would be better to use a notification mechanism from the device to be advertised + // that the new created interface is present in the device circuit-pack/port + final Thread current = Thread.currentThread(); + Thread timer = new Thread() { + public void run() { + try { + Thread.sleep(3000); + current.interrupt(); + } catch (InterruptedException e) { + LOG.error("Timeout before the new created interface appears on the deivce circuit-pack port", e); + } + } + }; try { txSubmitFuture.get(); - LOG.info("Successfully posted interface {} on node {}", ifBuilder.getName(), nodeId); + LOG.info("Successfully posted/deleted interface {} on node {}", ifBuilder.getName(), nodeId); + // this check is not needed during the delete operation + // during the delete operation, ifBuilder does not contain supporting-cp and supporting-port + if (ifBuilder.getSupportingCircuitPackName() != null && ifBuilder.getSupportingPort() != null) { + boolean devicePortIsUptodated = false; + while (!devicePortIsUptodated) { + devicePortIsUptodated = checkIfDevicePortIsUpdatedWithInterface(nodeId, ifBuilder); + } + LOG.info("{} - {} - interface {} updated on port {}", nodeId, ifBuilder.getSupportingCircuitPackName(), + ifBuilder.getName(), ifBuilder.getSupportingPort()); + } + timer.interrupt(); } catch (InterruptedException | ExecutionException e) { throw new OpenRoadmInterfaceException(String.format("Failed to post interface %s on node %s!", ifBuilder .getName(), nodeId), e); @@ -87,7 +110,7 @@ public class OpenRoadmInterfacesImpl121 { } - public void deleteInterface(String nodeId, String interfaceName) throws OpenRoadmInterfaceException { + public synchronized void deleteInterface(String nodeId, String interfaceName) throws OpenRoadmInterfaceException { Optional intf2DeleteOpt; try { intf2DeleteOpt = getInterface(nodeId, interfaceName); @@ -98,36 +121,10 @@ public class OpenRoadmInterfacesImpl121 { if (intf2DeleteOpt.isPresent()) { Interface intf2Delete = intf2DeleteOpt.get(); // State admin state to out of service - InterfaceBuilder ifBuilder = new InterfaceBuilder(intf2Delete); - if (ifBuilder.getType() == OtnOdu.class) { - Interface1Builder oduBuilder = new Interface1Builder(intf2Delete.augmentation(Interface1.class)); - OduBuilder odu = new OduBuilder(oduBuilder.getOdu()); - if (odu.getMaintTestsignal() != null) { - MaintTestsignalBuilder maintSignalBuilder = new MaintTestsignalBuilder(); - maintSignalBuilder.setEnabled(false); - odu.setMaintTestsignal(maintSignalBuilder.build()); - } - oduBuilder.setOdu(odu.build()); - ifBuilder.addAugmentation(Interface1.class, oduBuilder.build()); - } else if (ifBuilder.getType() == OtnOtu.class) { - org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev161014.Interface1Builder - otuBuilder = - new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev161014.Interface1Builder( - intf2Delete.augmentation( - org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev161014.Interface1 - .class)); - OtuBuilder otu = new OtuBuilder(otuBuilder.getOtu()); - if (otu.getMaintLoopback() != null) { - MaintLoopbackBuilder maintLoopBackBuilder = new MaintLoopbackBuilder(); - maintLoopBackBuilder.setEnabled(false); - otu.setMaintLoopback(maintLoopBackBuilder.build()); - } - otuBuilder.setOtu(otu.build()); - ifBuilder.addAugmentation( - org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev161014.Interface1.class, - otuBuilder.build()); - } - ifBuilder.setAdministrativeState(AdminStates.OutOfService); + InterfaceBuilder ifBuilder = new InterfaceBuilder() + .setAdministrativeState(AdminStates.OutOfService) + .setName(intf2Delete.getName()) + .setType(intf2Delete.getType()); // post interface with updated admin state try { postInterface(nodeId, ifBuilder); @@ -155,11 +152,11 @@ public class OpenRoadmInterfacesImpl121 { } deviceTx.delete(LogicalDatastoreType.CONFIGURATION, interfacesIID); - ListenableFuture submit = deviceTx.submit(Timeouts.DEVICE_WRITE_TIMEOUT, - Timeouts.DEVICE_WRITE_TIMEOUT_UNIT); + FluentFuture commit = + deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT); try { - submit.get(); + commit.get(); LOG.info("Successfully deleted {} on node {}", interfaceName, nodeId); } catch (InterruptedException | ExecutionException e) { throw new OpenRoadmInterfaceException(String.format("Failed to delete interface %s on " + "node %s", @@ -219,9 +216,9 @@ public class OpenRoadmInterfacesImpl121 { throw new OpenRoadmInterfaceException(String.format("Failed to obtain device transaction for node %s!", nodeId), e); } - deviceTx.put(LogicalDatastoreType.CONFIGURATION, circuitPackIID, cpBldr.build()); - ListenableFuture txSubmitFuture = deviceTx.submit(Timeouts.DEVICE_WRITE_TIMEOUT, - Timeouts.DEVICE_WRITE_TIMEOUT_UNIT); + deviceTx.merge(LogicalDatastoreType.CONFIGURATION, circuitPackIID, cpBldr.build()); + FluentFuture txSubmitFuture = + deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT); try { txSubmitFuture.get(); LOG.info("Successfully posted equipment state change on node {}", nodeId); @@ -232,4 +229,35 @@ public class OpenRoadmInterfacesImpl121 { } } + public String getSupportedInterface(String nodeId, String interf) { + Optional supInterfOpt; + try { + supInterfOpt = getInterface(nodeId, interf); + if (supInterfOpt.isPresent()) { + return supInterfOpt.get().getSupportingInterface(); + } else { + return null; + } + } catch (OpenRoadmInterfaceException e) { + LOG.error("error getting Supported Interface of {} - {}", interf, nodeId, e); + return null; + } + } + + private boolean checkIfDevicePortIsUpdatedWithInterface(String nodeId, InterfaceBuilder ifBuilder) { + KeyedInstanceIdentifier portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) + .child(CircuitPacks.class, new CircuitPacksKey(ifBuilder.getSupportingCircuitPackName())) + .child(Ports.class, new PortsKey(ifBuilder.getSupportingPort())); + Ports port = deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, + portIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).get(); + if (port.getInterfaces() == null) { + return false; + } + for (Interfaces interf : port.getInterfaces()) { + if (interf.getInterfaceName().equals(ifBuilder.getName())) { + return true; + } + } + return false; + } }