From d1e8024f091a1cc59f2a64c3a44f5cba21179ee7 Mon Sep 17 00:00:00 2001 From: Jozef Gloncak Date: Tue, 9 Feb 2016 13:01:29 +0100 Subject: Code refactor - more code in Vpp manipulation. Change-Id: I2b39df0e78a6947989b745cf7c93bbb501807738 Signed-off-by: Jozef Gloncak --- .../io/fd/honeycomb/vbd/impl/BridgeDomain.java | 125 ++++----------------- 1 file changed, 22 insertions(+), 103 deletions(-) (limited to 'vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/BridgeDomain.java') diff --git a/vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/BridgeDomain.java b/vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/BridgeDomain.java index 0ecd14c1e..114e67c90 100644 --- a/vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/BridgeDomain.java +++ b/vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/BridgeDomain.java @@ -16,7 +16,6 @@ import com.google.common.util.concurrent.CheckedFuture; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; -import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; @@ -29,24 +28,12 @@ import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.Mod import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener; import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; -import org.opendaylight.controller.md.sal.binding.api.MountPoint; import org.opendaylight.controller.md.sal.binding.api.MountPointService; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.external.reference.rev160129.ExternalReference; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.Vpp; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceAugmentation; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.L2; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.L2Builder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.l2.interconnection.BridgeBasedBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.BridgeDomains; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomainBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomainKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.LinkVbridgeAugment; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.LinkVbridgeAugmentBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.NodeVbridgeAugment; @@ -55,9 +42,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge. import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.TopologyVbridgeAugment; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.network.topology.topology.node.BridgeMember; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.network.topology.topology.node.BridgeMemberBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.network.topology.topology.node.termination.point.InterfaceType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.network.topology.topology.node.termination.point._interface.type.TunnelInterfaceBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.network.topology.topology.node.termination.point._interface.type.UserInterface; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.LinkId; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; @@ -102,10 +87,8 @@ final class BridgeDomain implements DataTreeChangeListener { private final VppModifier vppModifier; private TopologyVbridgeAugment config; private final String bridgeDomainName; - private final InstanceIdentifier iiBridgeDomainOnVPP; private final String iiBridgeDomainOnVPPRest; private Multimap> nodesToVpps = ArrayListMultimap.create(); - private final List tunnelIds; private BridgeDomain(final DataBroker dataBroker, final MountPointService mountService, final KeyedInstanceIdentifier topology, final BindingTransactionChain chain) { @@ -115,14 +98,10 @@ final class BridgeDomain implements DataTreeChangeListener { this.bridgeDomainName = topology.getKey().getTopologyId().getValue(); this.iiBridgeDomainOnVPPRest = provideIIBrdigeDomainOnVPPRest(); - this.iiBridgeDomainOnVPP = InstanceIdentifier.create(Vpp.class) - .child(BridgeDomains.class) - .child(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomain.class, new BridgeDomainKey(bridgeDomainName)); reg = dataBroker.registerDataTreeChangeListener( new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, topology), this); - this.tunnelIds = new ArrayList<>(); - this.vppModifier = new VppModifier(mountService); + this.vppModifier = new VppModifier(mountService, bridgeDomainName); } private String provideIIBrdigeDomainOnVPPRest() { @@ -244,6 +223,19 @@ final class BridgeDomain implements DataTreeChangeListener { } } + private void modifyTerminationPoint(final DataObjectModification nodeChild, final NodeId nodeId) { + final TerminationPoint terminationPoint = nodeChild.getDataAfter(); + final TerminationPointVbridgeAugment termPointVbridgeAug = terminationPoint.getAugmentation(TerminationPointVbridgeAugment.class); + if (termPointVbridgeAug != null) { + final Collection> instanceIdentifiersVPP = nodesToVpps.get(nodeId); + //TODO: probably iterate via all instance identifiers. + if (!instanceIdentifiersVPP.isEmpty()) { + final DataBroker dataBroker = VbdUtil.resolveDataBrokerForMountPoint(instanceIdentifiersVPP.iterator().next(), mountService); + vppModifier.addInterfaceToBridgeDomainOnVpp(dataBroker, termPointVbridgeAug); + } + } + } + private void addTunnel(final NodeId sourceNode) { final KeyedInstanceIdentifier iiToSrcVpp = nodesToVpps.get(sourceNode).iterator().next(); for (Map.Entry> nodeToVpp : nodesToVpps.entries()) { @@ -252,7 +244,7 @@ final class BridgeDomain implements DataTreeChangeListener { final KeyedInstanceIdentifier iiToDstVpp = nodeToVpp.getValue(); final NodeId dstNode = nodeToVpp.getKey(); - final ListenableFuture>> ipAddressesFuture = vppModifier.readIpAddressesFromVpps(iiToDstVpp, iiToSrcVpp); + final ListenableFuture>> ipAddressesFuture = vppModifier.readIpAddressesFromVpps(iiToSrcVpp, iiToDstVpp); Futures.addCallback(ipAddressesFuture, new FutureCallback>>() { @Override public void onSuccess(List> ipAddresses) { @@ -280,7 +272,7 @@ final class BridgeDomain implements DataTreeChangeListener { @Override public void onFailure(Throwable t) { - + LOG.debug("Reading of IP addresses has failed {}.", t); } }); } @@ -293,11 +285,11 @@ final class BridgeDomain implements DataTreeChangeListener { final LinkId linkId = new LinkId(linkIdStr); final KeyedInstanceIdentifier iiToLink = topology.child(Link.class, new LinkKey(linkId)); final WriteTransaction wTx = chain.newWriteOnlyTransaction(); - wTx.put(LogicalDatastoreType.OPERATIONAL, iiToLink, prepareData(newVpp, odlVpp, linkId),true); + wTx.put(LogicalDatastoreType.OPERATIONAL, iiToLink, prepareLinkData(newVpp, odlVpp, linkId), true); wTx.submit(); } - private Link prepareData(final NodeId newVpp, final NodeId oldVpp, final LinkId linkId) { + private Link prepareLinkData(final NodeId newVpp, final NodeId oldVpp, final LinkId linkId) { final LinkBuilder linkBuilder = new LinkBuilder(); linkBuilder.setLinkId(linkId); @@ -317,86 +309,22 @@ final class BridgeDomain implements DataTreeChangeListener { return linkBuilder.build(); } - - - private void modifyTerminationPoint(final DataObjectModification nodeChild, final NodeId nodeId) { - final TerminationPoint terminationPoint = nodeChild.getDataAfter(); - final TerminationPointVbridgeAugment termPointVbridgeAug = terminationPoint.getAugmentation(TerminationPointVbridgeAugment.class); - if (termPointVbridgeAug != null) { - final Collection> instanceIdentifiersVPP = nodesToVpps.get(nodeId); - //TODO: probably iterate via all instance identifiers. - if (!instanceIdentifiersVPP.isEmpty()) { - final DataBroker dataBroker = resolveDataBrokerForMountPoint(instanceIdentifiersVPP.iterator().next()); - addInterfaceToBridgeDomainOnVpp(dataBroker, termPointVbridgeAug); - } - } - } - - private void addInterfaceToBridgeDomainOnVpp(final DataBroker vppDataBroker, final TerminationPointVbridgeAugment termPointVbridgeAug) { - final InterfaceType interfaceType = termPointVbridgeAug.getInterfaceType(); - if (interfaceType instanceof UserInterface) { - //REMARK: according contract in YANG model this should be URI to data on mount point (accroding to RESTCONF) - //It was much more easier to just await concrete interface name, thus isn't necessary parse it (splitting on '/') - final ExternalReference userInterface = ((UserInterface) interfaceType).getUserInterface(); - final KeyedInstanceIdentifier iiToVpp = - InstanceIdentifier.create(Interfaces.class) - .child(Interface.class, new InterfaceKey(userInterface.getValue())); - InstanceIdentifier iiToV3poL2 = iiToVpp.augmentation(VppInterfaceAugmentation.class).child(L2.class); - LOG.debug("Writing L2 data to configuration DS to concrete interface."); - final WriteTransaction wTx = vppDataBroker.newWriteOnlyTransaction(); - wTx.put(LogicalDatastoreType.CONFIGURATION, iiToV3poL2, prepareL2Data()); - wTx.submit(); - } - } - - private L2 prepareL2Data() { - final L2Builder l2Builder = new L2Builder(); - final BridgeBasedBuilder bridgeBasedBuilder = new BridgeBasedBuilder(); - bridgeBasedBuilder.setSplitHorizonGroup((short) 0); - bridgeBasedBuilder.setBridgedVirtualInterface(false); - bridgeBasedBuilder.setBridgeDomain(bridgeDomainName); - l2Builder.setInterconnection(bridgeBasedBuilder.build()); - return l2Builder.build(); - } - - - private DataBroker resolveDataBrokerForMountPoint(final InstanceIdentifier iiToMountPoint) { - final Optional vppMountPointOpt = mountService.getMountPoint(iiToMountPoint); - if (vppMountPointOpt.isPresent()) { - final MountPoint vppMountPoint = vppMountPointOpt.get(); - final Optional dataBrokerOpt = vppMountPoint.getService(DataBroker.class); - if (dataBrokerOpt.isPresent()) { - return dataBrokerOpt.get(); - } - } - return null; - } - private void createNode(final Node node) { for (SupportingNode supportingNode : node.getSupportingNode()) { final NodeId nodeMount = supportingNode.getNodeRef(); final TopologyId topologyMount = supportingNode.getTopologyRef(); - final KeyedInstanceIdentifier iiToMount = InstanceIdentifier + final KeyedInstanceIdentifier iiToVpp = InstanceIdentifier .create(NetworkTopology.class) .child(Topology.class, new TopologyKey(topologyMount)) .child(Node.class, new NodeKey(nodeMount)); - nodesToVpps.put(node.getNodeId(), iiToMount); - final DataBroker dataBrokerOfMount = resolveDataBrokerForMountPoint(iiToMount); - addVppToBridgeDomain(dataBrokerOfMount, node); - } - } - - private void addVppToBridgeDomain(final DataBroker vppDataBroker, final Node node) { - if (vppDataBroker != null) { - final WriteTransaction wTx = vppDataBroker.newWriteOnlyTransaction(); - wTx.put(LogicalDatastoreType.CONFIGURATION, iiBridgeDomainOnVPP, prepareNewBridgeDomainData()); - final CheckedFuture addVppToBridgeDomainFuture = wTx.submit(); + nodesToVpps.put(node.getNodeId(), iiToVpp); + ListenableFuture addVppToBridgeDomainFuture = vppModifier.addVppToBridgeDomain(iiToVpp, node); addSupportingBridgeDomain(addVppToBridgeDomainFuture, node); } } - private void addSupportingBridgeDomain(final CheckedFuture addVppToBridgeDomainFuture, final Node node) { + private void addSupportingBridgeDomain(final ListenableFuture addVppToBridgeDomainFuture, final Node node) { Futures.addCallback(addVppToBridgeDomainFuture, new FutureCallback() { @Override public void onSuccess(Object result) { @@ -407,8 +335,6 @@ final class BridgeDomain implements DataTreeChangeListener { final WriteTransaction wTx = chain.newWriteOnlyTransaction(); wTx.put(LogicalDatastoreType.OPERATIONAL, iiToBridgeMember, bridgeMemberBuilder.build(), true); wTx.submit(); - - } @Override @@ -450,13 +376,6 @@ final class BridgeDomain implements DataTreeChangeListener { }); } - private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomain - prepareNewBridgeDomainData() { - final BridgeDomainBuilder bridgeDomainBuilder = new BridgeDomainBuilder(config); - bridgeDomainBuilder.setName(topology.getKey().getTopologyId().getValue()); - return bridgeDomainBuilder.build(); - } - private void setConfiguration(final TopologyVbridgeAugment config) { LOG.debug("Topology {} configuration set to {}", topology, config); -- cgit 1.2.3-korg