diff options
Diffstat (limited to 'vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/VppModifier.java')
-rw-r--r-- | vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/VppModifier.java | 83 |
1 files changed, 65 insertions, 18 deletions
diff --git a/vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/VppModifier.java b/vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/VppModifier.java index 142272b82..489f6c796 100644 --- a/vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/VppModifier.java +++ b/vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/VppModifier.java @@ -17,7 +17,6 @@ import java.util.ArrayList; import java.util.List; import javax.annotation.Nullable; import org.opendaylight.controller.md.sal.binding.api.DataBroker; -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.ReadOnlyTransaction; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; @@ -32,13 +31,24 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces. import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.Interface1; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.Ipv4; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.Address; +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.VppInterfaceAugmentationBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VxlanTunnel; +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.Vxlan; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.VxlanBuilder; +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.TerminationPointVbridgeAugment; 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.TunnelParameters; +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.UserInterface; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -54,11 +64,17 @@ public class VppModifier { private static final Logger LOG = LoggerFactory.getLogger(BridgeDomain.class); private final MountPointService mountService; + private final String bridgeDomainName; private TopologyVbridgeAugment config; + private final InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomain> iiBridgeDomainOnVPP; - public VppModifier(final MountPointService mountService) { + public VppModifier(final MountPointService mountService, final String bridgeDomainName) { this.mountService = mountService; + this.bridgeDomainName = bridgeDomainName; + 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)); } /** * Tryies to read ipv4 addresses from all specified {@code iiToVpps } vpps. @@ -86,7 +102,7 @@ public class VppModifier { private ListenableFuture<Optional<Ipv4AddressNoZone>> readIpAddressFromVpp(final KeyedInstanceIdentifier<Node, NodeKey> iiToVpp) { final SettableFuture<Optional<Ipv4AddressNoZone>> resultFuture = SettableFuture.create(); - final DataBroker vppDataBroker = resolveDataBrokerForMountPoint(iiToVpp); + final DataBroker vppDataBroker = VbdUtil.resolveDataBrokerForMountPoint(iiToVpp, mountService); if (vppDataBroker != null) { final ReadOnlyTransaction rTx = vppDataBroker.newReadOnlyTransaction(); final CheckedFuture<Optional<Interfaces>, ReadFailedException> interfaceStateFuture @@ -134,7 +150,7 @@ public class VppModifier { final Vxlan vxlanData = prepareVxlan(ipSrc, ipDst); final Interface intfData = prepareVirtualInterfaceData(vxlanData); - final DataBroker vppDataBroker = resolveDataBrokerForMountPoint(iiToVpp); + final DataBroker vppDataBroker = VbdUtil.resolveDataBrokerForMountPoint(iiToVpp, mountService); if (vppDataBroker != null) { final WriteTransaction wTx = vppDataBroker.newWriteOnlyTransaction(); final KeyedInstanceIdentifier<Interface, InterfaceKey> iiToInterface @@ -157,20 +173,6 @@ public class VppModifier { } } - - private DataBroker resolveDataBrokerForMountPoint(final InstanceIdentifier<Node> iiToMountPoint) { - final Optional<MountPoint> vppMountPointOpt = mountService.getMountPoint(iiToMountPoint); - if (vppMountPointOpt.isPresent()) { - final MountPoint vppMountPoint = vppMountPointOpt.get(); - final Optional<DataBroker> dataBrokerOpt = vppMountPoint.getService(DataBroker.class); - if (dataBrokerOpt.isPresent()) { - return dataBrokerOpt.get(); - } - } - return null; - } - - private Interface prepareVirtualInterfaceData(final Vxlan vxlan) { final InterfaceBuilder interfaceBuilder = new InterfaceBuilder(); //TODO implement tunnel counter @@ -197,6 +199,51 @@ public class VppModifier { return vxlanBuilder.build(); } + 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<Interface, InterfaceKey> iiToVpp = + InstanceIdentifier.create(Interfaces.class) + .child(Interface.class, new InterfaceKey(userInterface.getValue())); + InstanceIdentifier<L2> 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(); + } + } + + ListenableFuture<Void> addVppToBridgeDomain(final KeyedInstanceIdentifier<Node, NodeKey> iiToVpp, final Node node) { + final DataBroker vppDataBroker = VbdUtil.resolveDataBrokerForMountPoint(iiToVpp, mountService); + if (vppDataBroker != null) { + final WriteTransaction wTx = vppDataBroker.newWriteOnlyTransaction(); + wTx.put(LogicalDatastoreType.CONFIGURATION, iiBridgeDomainOnVPP, prepareNewBridgeDomainData()); + return wTx.submit(); + } + return Futures.immediateFailedFuture(new IllegalStateException("Data broker for vpp is missing")); + } + + 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(bridgeDomainName); + return bridgeDomainBuilder.build(); + } + + + + 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(); + } public void setConfig(final TopologyVbridgeAugment config) { this.config = config; |