From cbd6f838d020901770e982998cefab7afecd3f1e Mon Sep 17 00:00:00 2001 From: Slava Date: Tue, 16 Aug 2016 16:04:12 +0300 Subject: [PATCH] Check network type before adding vtep to TZ Change-Id: Iba7f71812e3ab9eaa69c1a8a38157fb77c1783c2 Signed-off-by: Slava --- .../neutronvpn/InterfaceStateManager.java | 24 +++++++++- .../netvirt/neutronvpn/NeutronvpnUtils.java | 5 ++ .../InterfaceStateToTransportZoneTest.java | 47 ++++++++++++++++++- 3 files changed, 73 insertions(+), 3 deletions(-) diff --git a/vpnservice/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/netvirt/neutronvpn/InterfaceStateManager.java b/vpnservice/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/netvirt/neutronvpn/InterfaceStateManager.java index 758cc34418..372815f10f 100644 --- a/vpnservice/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/netvirt/neutronvpn/InterfaceStateManager.java +++ b/vpnservice/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/netvirt/neutronvpn/InterfaceStateManager.java @@ -38,6 +38,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transp import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.VtepsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.Subnetmap; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVxlan; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.NetworkKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIps; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port; @@ -50,7 +55,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class InterfaceStateManager { - + private static final Logger LOG = LoggerFactory.getLogger(InterfaceStateManager.class); private static final String OF_URI_SEPARATOR = ":"; private static final String TUNNEL_PORT = "tunnel_port"; @@ -81,6 +86,10 @@ public class InterfaceStateManager { for(Port port : ports){ try{ + if(!checkIfVXLANNetwork(port)){ + continue; + } + String subnetIp = getSubnetIPFromPort(port); BigInteger dpnId = getDpnIdFromInterfaceState(inter); @@ -106,6 +115,19 @@ public class InterfaceStateManager { } + private boolean checkIfVXLANNetwork(Port port) { + InstanceIdentifier networkPath = InstanceIdentifier.create(Neutron.class).child(Networks.class).child(Network.class, new NetworkKey(port.getNetworkId())); + Network network = mdsalUtils.read(LogicalDatastoreType.CONFIGURATION, networkPath); + + if(network == null || !NeutronvpnUtils.isNetworkOfType(network, NetworkTypeVxlan.class)){ + LOG.debug("port in non-VXLAN network " + port.getName()); + return false; + } + + return true; + } + + private BigInteger getDpnIdFromInterfaceState(Interface inter) { String lowerLayerIf = inter.getLowerLayerIf().get(0); NodeConnectorId nodeConnectorId = new NodeConnectorId(lowerLayerIf); diff --git a/vpnservice/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnUtils.java b/vpnservice/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnUtils.java index cd7b9cdc5d..a36de76091 100644 --- a/vpnservice/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnUtils.java +++ b/vpnservice/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnUtils.java @@ -866,6 +866,11 @@ public class NeutronvpnUtils { NetworkProviderExtension npe = network.getAugmentation(NetworkProviderExtension.class); return npe != null && supportedNetworkTypes.contains(npe.getNetworkType()); } + + static boolean isNetworkOfType(Network network, Class type) { + NetworkProviderExtension npe = network.getAugmentation(NetworkProviderExtension.class); + return npe != null && type.isAssignableFrom(npe.getNetworkType()); + } /** * Get inter-VPN link state diff --git a/vpnservice/neutronvpn/neutronvpn-impl/src/test/java/org/opendaylight/netvirt/neutronvpn/InterfaceStateToTransportZoneTest.java b/vpnservice/neutronvpn/neutronvpn-impl/src/test/java/org/opendaylight/netvirt/neutronvpn/InterfaceStateToTransportZoneTest.java index 7b67a66428..ec33cd751f 100644 --- a/vpnservice/neutronvpn/neutronvpn-impl/src/test/java/org/opendaylight/netvirt/neutronvpn/InterfaceStateToTransportZoneTest.java +++ b/vpnservice/neutronvpn/neutronvpn-impl/src/test/java/org/opendaylight/netvirt/neutronvpn/InterfaceStateToTransportZoneTest.java @@ -8,6 +8,7 @@ package org.opendaylight.netvirt.neutronvpn; import static org.junit.Assert.*; + import static org.mockito.Matchers.any; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; @@ -17,6 +18,7 @@ import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.List; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -53,10 +55,17 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transp import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.VtepsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.Subnetmap; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.SubnetmapBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVlan; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVxlan; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.NetworkBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIps; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIpsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.PortBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtensionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation; @@ -67,6 +76,7 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology. import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + import com.google.common.base.Optional; import com.google.common.util.concurrent.Futures; @@ -114,6 +124,8 @@ public class InterfaceStateToTransportZoneTest { InterfaceStateToTransportZoneListener interfaceStateToTransportZoneChangeListener; + private Network network; + @Before public void setUp() { when(dataBroker.registerDataChangeListener(any(LogicalDatastoreType.class), // @@ -177,11 +189,13 @@ public class InterfaceStateToTransportZoneTest { .addAugmentation(ParentRefs.class, new ParentRefsBuilder().setParentInterface(PHYS_PORT_NAME).build()).build()); interf = new InterfacesBuilder().setInterface(interfaces).build(); port = buildPort(PORT_IP); + network = buildNetwork(NetworkTypeVxlan.class); TransportZone tz = new TransportZoneBuilder().setZoneName(NETWORK_ID).setTunnelType(TunnelTypeVxlan.class).setSubnets(new ArrayList<>()).build(); buildNode(); when(mockReadTx.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))). thenReturn(Futures.immediateCheckedFuture(Optional.of(interf))). thenReturn(Futures.immediateCheckedFuture(Optional.of(port))). + thenReturn(Futures.immediateCheckedFuture(Optional.of(network))). thenReturn(Futures.immediateCheckedFuture(Optional.of(tz))). thenReturn(Futures.immediateCheckedFuture(Optional.of(getBridgeRefForNode()))). thenReturn(Futures.immediateCheckedFuture(Optional.of(node))). @@ -200,11 +214,13 @@ public class InterfaceStateToTransportZoneTest { .addAugmentation(ParentRefs.class, new ParentRefsBuilder().setParentInterface(PHYS_PORT_NAME).build()).build()); interf = new InterfacesBuilder().setInterface(interfaces).build(); port = buildPort(PORT_IP); - TransportZone tz = new TransportZoneBuilder().setZoneName(NETWORK_ID).setTunnelType(TunnelTypeVxlan.class).setSubnets(buildSubnets()).build(); + network = buildNetwork(NetworkTypeVxlan.class); + TransportZone tz = new TransportZoneBuilder().setZoneName(NETWORK_ID).setTunnelType(TunnelTypeVxlan.class).setSubnets(new ArrayList<>()).build(); buildNode(); when(mockReadTx.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))). thenReturn(Futures.immediateCheckedFuture(Optional.of(interf))). thenReturn(Futures.immediateCheckedFuture(Optional.of(port))). + thenReturn(Futures.immediateCheckedFuture(Optional.of(network))). thenReturn(Futures.immediateCheckedFuture(Optional.of(tz))). thenReturn(Futures.immediateCheckedFuture(Optional.of(getBridgeRefForNode()))). thenReturn(Futures.immediateCheckedFuture(Optional.of(node))). @@ -213,10 +229,37 @@ public class InterfaceStateToTransportZoneTest { intBuilder.setName(PHYS_PORT_NAME); intBuilder.setLowerLayerIf(new ArrayList<>(Arrays.asList(new String[] {"int:"+DPN_ID})));//NetworkId(new Uuid("12345678-1234-1234-1234-123456789012")); expectedVteps.add(buildVtep(BigInteger.valueOf(DPN_ID), new IpAddress(OVS_IP.toCharArray()), VTEP_PORT)); - expectedVteps.add(buildVtep(DPN_ID_2, OVS_IP_2, VTEP_PORT)); interfaceStateToTransportZoneChangeListener.add(InstanceIdentifier.create(Interface.class), intBuilder.build()); } + @Test + public void addInterfaceState_VLAN_Network() throws Exception { + List interfaces = new ArrayList<>(); + interfaces.add(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder().setName(PORT_NAME) + .addAugmentation(ParentRefs.class, new ParentRefsBuilder().setParentInterface(PHYS_PORT_NAME).build()).build()); + interf = new InterfacesBuilder().setInterface(interfaces).build(); + port = buildPort(PORT_IP); + network = buildNetwork(NetworkTypeVlan.class); + TransportZone tz = new TransportZoneBuilder().setZoneName(NETWORK_ID).setTunnelType(TunnelTypeVxlan.class).setSubnets(buildSubnets()).build(); + buildNode(); + when(mockReadTx.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))). + thenReturn(Futures.immediateCheckedFuture(Optional.of(interf))). + thenReturn(Futures.immediateCheckedFuture(Optional.of(port))). + thenReturn(Futures.immediateCheckedFuture(Optional.of(network))); + InterfaceBuilder intBuilder = new InterfaceBuilder(); + intBuilder.setName(PHYS_PORT_NAME); + intBuilder.setLowerLayerIf(new ArrayList<>(Arrays.asList(new String[] {"int:"+DPN_ID})));//NetworkId(new Uuid("12345678-1234-1234-1234-123456789012")); + interfaceStateToTransportZoneChangeListener.add(InstanceIdentifier.create(Interface.class), intBuilder.build()); + } + + private Network buildNetwork(Class networkType) { + NetworkBuilder builder = new NetworkBuilder(); + NetworkProviderExtensionBuilder augBuilder = new NetworkProviderExtensionBuilder(); + augBuilder.setNetworkType(networkType); + builder.addAugmentation(NetworkProviderExtension.class, augBuilder.build()); + return builder.build(); + } + private List buildSubnets() { List subnets = new ArrayList<>(); SubnetsBuilder subnetsBuilder = new SubnetsBuilder(); -- 2.36.6