From d51c465d6fab5e2980f8fe2ca44795ce1e67ea0d Mon Sep 17 00:00:00 2001 From: Sam Hague Date: Sun, 26 Apr 2015 14:33:48 -0400 Subject: [PATCH] More southbound migration for netvirt Change-Id: Ie972ab5914cc2a209fb73b53936c76269590f75a Signed-off-by: Sam Hague --- .../providers/openflow13/OF13Provider.java | 280 ++++++------------ .../openflow13/OF13ProviderTest.java | 12 +- .../openstack/netvirt/SouthboundEvent.java | 30 +- .../openstack/netvirt/SouthboundHandler.java | 185 +++++++++--- .../netvirt/api/NetworkingProvider.java | 6 +- .../api/OvsdbConfigurationService.java | 128 +------- .../netvirt/api/TenantNetworkManager.java | 18 +- .../impl/BridgeConfigurationManagerImpl.java | 61 ++-- .../openstack/netvirt/impl/MdsalUtils.java | 234 ++++++++++++++- .../netvirt/impl/NeutronL3Adapter.java | 23 +- .../impl/OvsdbConfigurationServiceImpl.java | 87 ++++++ .../netvirt/impl/OvsdbDataChangeListener.java | 38 ++- .../{OvsdbNode.java => OvsdbSouthbound.java} | 9 +- .../impl/TenantNetworkManagerImpl.java | 48 ++- .../impl/TenantNetworkManagerImplTest.java | 5 +- pom.xml | 2 +- 16 files changed, 712 insertions(+), 454 deletions(-) create mode 100644 openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbConfigurationServiceImpl.java rename openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/{OvsdbNode.java => OvsdbSouthbound.java} (68%) diff --git a/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/OF13Provider.java b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/OF13Provider.java index 5534abf1a..a009a3abd 100644 --- a/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/OF13Provider.java +++ b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/OF13Provider.java @@ -27,10 +27,11 @@ import org.opendaylight.ovsdb.lib.notation.Row; import org.opendaylight.ovsdb.lib.notation.UUID; import org.opendaylight.ovsdb.openstack.netvirt.NetworkHandler; import org.opendaylight.ovsdb.openstack.netvirt.api.*; +import org.opendaylight.ovsdb.openstack.netvirt.impl.MdsalUtils; import org.opendaylight.ovsdb.schema.openvswitch.Bridge; import org.opendaylight.ovsdb.schema.openvswitch.Interface; import org.opendaylight.ovsdb.schema.openvswitch.Port; -import org.opendaylight.ovsdb.utils.mdsal.node.StringConvertor; +import org.opendaylight.ovsdb.southbound.SouthboundMapper; import org.opendaylight.ovsdb.utils.mdsal.openflow.InstructionUtils; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCase; @@ -71,6 +72,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation; 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.opendaylight.inventory.rev130819.nodes.NodeBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; @@ -837,7 +839,8 @@ public class OF13Provider implements NetworkingProvider { } } - private void programLocalRules (String networkType, String segmentationId, Node node, Interface intf) { + private void programLocalRules (String networkType, String segmentationId, Node node, + OvsdbTerminationPointAugmentation intf) { try { Long dpid = this.getIntegrationBridgeOFDPID(node); if (dpid == 0L) { @@ -845,22 +848,11 @@ public class OF13Provider implements NetworkingProvider { return; } - Set of_ports = intf.getOpenFlowPortColumn().getData(); - if (of_ports == null || of_ports.size() <= 0) { - logger.debug("Could NOT Identify OF value for port {} on {}", intf.getName(), node); - return; - } - long localPort = (Long)of_ports.toArray()[0]; - - Map externalIds = intf.getExternalIdsColumn().getData(); - if (externalIds == null) { - logger.error("No external_ids seen in {}", intf); - return; - } + long localPort = (Long)intf.getOfport(); - String attachedMac = externalIds.get(Constants.EXTERNAL_ID_VM_MAC); + String attachedMac = MdsalUtils.getInterfaceExternalIdsValue(intf, Constants.EXTERNAL_ID_VM_MAC); if (attachedMac == null) { - logger.error("No AttachedMac seen in {}", intf); + logger.warn("No AttachedMac seen in {}", intf); return; } @@ -870,10 +862,11 @@ public class OF13Provider implements NetworkingProvider { programLocalVlanRules(node, dpid, segmentationId, attachedMac, localPort); } /* If the network type is tunnel based (VXLAN/GRRE/etc) with Neutron Port Security ACLs */ - if ((networkType.equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_GRE) || networkType.equalsIgnoreCase + /* TODO SB_MIGRATION */ + /*if ((networkType.equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_GRE) || networkType.equalsIgnoreCase (NetworkHandler.NETWORK_TYPE_VXLAN)) && securityServicesManager.isPortSecurityReady(intf)) { logger.debug("Neutron port has a Port Security Group"); - /* Retrieve the security group UUID from the Neutron Port */ + // Retrieve the security group UUID from the Neutron Port NeutronSecurityGroup securityGroupInPort = securityServicesManager.getSecurityGroupInPort(intf); logger.debug("Program Local rules for networkType: {} does contain a Port Security Group: {} " + "to be installed on DPID: {}", networkType, securityGroupInPort, dpid); @@ -881,7 +874,7 @@ public class OF13Provider implements NetworkingProvider { securityGroupInPort); egressAclProvider.programPortSecurityACL(dpid, segmentationId, attachedMac, localPort, securityGroupInPort); - } + }*/ if (networkType.equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_GRE) || networkType.equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VXLAN)) { logger.debug("Program local bridge rules for interface {}", intf.getName()); @@ -892,7 +885,8 @@ public class OF13Provider implements NetworkingProvider { } } - private void removeLocalRules (String networkType, String segmentationId, Node node, Interface intf) { + private void removeLocalRules (String networkType, String segmentationId, Node node, + OvsdbTerminationPointAugmentation intf) { try { Long dpid = this.getIntegrationBridgeOFDPID(node); if (dpid == 0L) { @@ -900,22 +894,11 @@ public class OF13Provider implements NetworkingProvider { return; } - Set of_ports = intf.getOpenFlowPortColumn().getData(); - if (of_ports == null || of_ports.size() <= 0) { - logger.debug("Could NOT Identify OF value for port {} on {}", intf.getName(), node); - return; - } - long localPort = (Long)of_ports.toArray()[0]; - - Map externalIds = intf.getExternalIdsColumn().getData(); - if (externalIds == null) { - logger.error("No external_ids seen in {}", intf); - return; - } + long localPort = (Long)intf.getOfport(); - String attachedMac = externalIds.get(Constants.EXTERNAL_ID_VM_MAC); + String attachedMac = MdsalUtils.getInterfaceExternalIdsValue(intf, Constants.EXTERNAL_ID_VM_MAC); if (attachedMac == null) { - logger.error("No AttachedMac seen in {}", intf); + logger.warn("No AttachedMac seen in {}", intf); return; } @@ -934,62 +917,49 @@ public class OF13Provider implements NetworkingProvider { } private void programTunnelRules (String tunnelType, String segmentationId, InetAddress dst, Node node, - Interface intf, boolean local) { + OvsdbTerminationPointAugmentation intf, boolean local) { /* TODO SB_MIGRATION */ Preconditions.checkNotNull(ovsdbConfigurationService); try { - Long dpid = this.getIntegrationBridgeOFDPID(node); if (dpid == 0L) { logger.debug("Openflow Datapath-ID not set for the integration bridge in {}", node); return; } - Set of_ports = intf.getOpenFlowPortColumn().getData(); - if (of_ports == null || of_ports.size() <= 0) { - logger.debug("Could NOT Identify OF value for port {} on {}", intf.getName(), node); - return; - } - long localPort = (Long)of_ports.toArray()[0]; - - Map externalIds = intf.getExternalIdsColumn().getData(); - if (externalIds == null) { - logger.error("No external_ids seen in {}", intf); - return; - } + long localPort = (Long)intf.getOfport(); - String attachedMac = externalIds.get(Constants.EXTERNAL_ID_VM_MAC); + String attachedMac = MdsalUtils.getInterfaceExternalIdsValue(intf, Constants.EXTERNAL_ID_VM_MAC); if (attachedMac == null) { - logger.error("No AttachedMac seen in {}", intf); + logger.warn("No AttachedMac seen in {}", intf); return; } - Map intfs = ovsdbConfigurationService.getRows(node, ovsdbConfigurationService.getTableName(node, Interface.class)); + Map intfs = ovsdbConfigurationService.getInterfaces(node); if (intfs != null) { - for (Row row : intfs.values()) { - Interface tunIntf = ovsdbConfigurationService.getTypedRow(node, Interface.class, row); + for (OvsdbTerminationPointAugmentation tunIntf : intfs.values()) { + Long ofPort = 0L; if (tunIntf.getName().equals(this.getTunnelName(tunnelType, dst))) { - of_ports = tunIntf.getOpenFlowPortColumn().getData(); - if (of_ports == null || of_ports.size() <= 0) { - logger.debug("Could NOT Identify Tunnel port {} on {}", tunIntf.getName(), node); - continue; - } - long tunnelOFPort = (Long)of_ports.toArray()[0]; + long tunnelOFPort = (Long)intf.getOfport(); if (tunnelOFPort == -1) { - logger.error("Could NOT Identify Tunnel port {} -> OF ({}) on {}", tunIntf.getName(), tunnelOFPort, node); + logger.error("Could not Identify Tunnel port {} -> OF ({}) on {}", + tunIntf.getName(), tunnelOFPort, node); return; } - logger.debug("Identified Tunnel port {} -> OF ({}) on {}", tunIntf.getName(), tunnelOFPort, node); + logger.debug("Identified Tunnel port {} -> OF ({}) on {}", + tunIntf.getName(), tunnelOFPort, node); if (!local) { - programRemoteEgressTunnelBridgeRules(node, dpid, segmentationId, attachedMac, tunnelOFPort, localPort); + programRemoteEgressTunnelBridgeRules(node, dpid, segmentationId, attachedMac, + tunnelOFPort, localPort); } - logger.trace("program local ingress tunnel rules: node" - + node.getNodeId().getValue() + " intf " + intf.getName()); + logger.trace("program local ingress tunnel rules: node {}, intf {}", + node.getNodeId().getValue(), intf.getName() ); if (local) { - programLocalIngressTunnelBridgeRules(node, dpid, segmentationId, attachedMac, tunnelOFPort, localPort); + programLocalIngressTunnelBridgeRules(node, dpid, segmentationId, attachedMac, + tunnelOFPort, localPort); } return; } @@ -1001,56 +971,43 @@ public class OF13Provider implements NetworkingProvider { } private void removeTunnelRules (String tunnelType, String segmentationId, InetAddress dst, Node node, - Interface intf, boolean local, boolean isLastInstanceOnNode) { + OvsdbTerminationPointAugmentation intf, + boolean local, boolean isLastInstanceOnNode) { /* TODO SB_MIGRATION */ Preconditions.checkNotNull(ovsdbConfigurationService); try { - Long dpid = this.getIntegrationBridgeOFDPID(node); if (dpid == 0L) { logger.debug("Openflow Datapath-ID not set for the integration bridge in {}", node); return; } - Set of_ports = intf.getOpenFlowPortColumn().getData(); - if (of_ports == null || of_ports.size() <= 0) { - logger.error("Could NOT Identify OF value for port {} on {}", intf.getName(), node); - return; - } - long localPort = (Long)of_ports.toArray()[0]; - - Map externalIds = intf.getExternalIdsColumn().getData(); - if (externalIds == null) { - logger.error("No external_ids seen in {}", intf); - return; - } + long localPort = (Long)intf.getOfport(); - String attachedMac = externalIds.get(Constants.EXTERNAL_ID_VM_MAC); + String attachedMac = MdsalUtils.getInterfaceExternalIdsValue(intf, Constants.EXTERNAL_ID_VM_MAC); if (attachedMac == null) { logger.error("No AttachedMac seen in {}", intf); return; } - Map intfs = ovsdbConfigurationService.getRows(node, ovsdbConfigurationService.getTableName(node, Interface.class)); + Map intfs = ovsdbConfigurationService.getInterfaces(node); if (intfs != null) { - for (Row row : intfs.values()) { - Interface tunIntf = ovsdbConfigurationService.getTypedRow(node, Interface.class, row); + for (OvsdbTerminationPointAugmentation tunIntf : intfs.values()) { + Long ofPort = 0L; if (tunIntf.getName().equals(this.getTunnelName(tunnelType, dst))) { - of_ports = tunIntf.getOpenFlowPortColumn().getData(); - if (of_ports == null || of_ports.size() <= 0) { - logger.error("Could NOT Identify Tunnel port {} on {}", tunIntf.getName(), node); - continue; - } - long tunnelOFPort = (Long)of_ports.toArray()[0]; + long tunnelOFPort = (Long)intf.getOfport(); if (tunnelOFPort == -1) { - logger.error("Could NOT Identify Tunnel port {} -> OF ({}) on {}", tunIntf.getName(), tunnelOFPort, node); + logger.error("Could not Identify Tunnel port {} -> OF ({}) on {}", + tunIntf.getName(), tunnelOFPort, node); return; } - logger.debug("Identified Tunnel port {} -> OF ({}) on {}", tunIntf.getName(), tunnelOFPort, node); + logger.debug("Identified Tunnel port {} -> OF ({}) on {}", + tunIntf.getName(), tunnelOFPort, node); if (!local) { - removeRemoteEgressTunnelBridgeRules(node, dpid, segmentationId, attachedMac, tunnelOFPort, localPort); + removeRemoteEgressTunnelBridgeRules(node, dpid, segmentationId, attachedMac, + tunnelOFPort, localPort); } if (local && isLastInstanceOnNode) { removePerTunnelRules(node, dpid, segmentationId, tunnelOFPort); @@ -1064,76 +1021,44 @@ public class OF13Provider implements NetworkingProvider { } } - private void programVlanRules (NeutronNetwork network, Node node, Interface intf) { + private void programVlanRules (NeutronNetwork network, Node node, OvsdbTerminationPointAugmentation intf) { /* TODO SB_MIGRATION */ Preconditions.checkNotNull(ovsdbConfigurationService); logger.debug("Program vlan rules for interface {}", intf.getName()); try { - Long dpid = this.getIntegrationBridgeOFDPID(node); if (dpid == 0L) { logger.debug("Openflow Datapath-ID not set for the integration bridge in {}", node); return; } - Set of_ports = intf.getOpenFlowPortColumn().getData(); - int timeout = 6; - while ((of_ports == null) && (timeout > 0)) { - of_ports = intf.getOpenFlowPortColumn().getData(); - if (of_ports == null || of_ports.size() <= 0) { - // Wait for the OVSDB update to sync up the Local cache. - Thread.sleep(500); - timeout--; - } - } - if (of_ports == null || of_ports.size() <= 0) { - logger.error("Could NOT Identify OF value for port {} on {}", intf.getName(), node); - return; - } - long localPort = (Long)of_ports.toArray()[0]; - - Map externalIds = intf.getExternalIdsColumn().getData(); - if (externalIds == null) { - logger.error("No external_ids seen in {}", intf); - return; - } + long localPort = (Long)intf.getOfport(); - String attachedMac = externalIds.get(Constants.EXTERNAL_ID_VM_MAC); + String attachedMac = MdsalUtils.getInterfaceExternalIdsValue(intf, Constants.EXTERNAL_ID_VM_MAC); if (attachedMac == null) { logger.error("No AttachedMac seen in {}", intf); return; } - Map intfs = ovsdbConfigurationService.getRows(node, ovsdbConfigurationService.getTableName(node, Interface.class)); + Map intfs = ovsdbConfigurationService.getInterfaces(node); if (intfs != null) { - for (Row row : intfs.values()) { - Interface ethIntf = ovsdbConfigurationService.getTypedRow(node, Interface.class, row); - if (ethIntf.getName().equalsIgnoreCase(bridgeConfigurationManager.getPhysicalInterfaceName(node, network.getProviderPhysicalNetwork()))) { - of_ports = ethIntf.getOpenFlowPortColumn().getData(); - timeout = 6; - while ((of_ports == null) && (timeout > 0)) { - of_ports = ethIntf.getOpenFlowPortColumn().getData(); - if (of_ports == null || of_ports.size() <= 0) { - // Wait for the OVSDB update to sync up the Local cache. - Thread.sleep(500); - timeout--; - } - } - - if (of_ports == null || of_ports.size() <= 0) { - logger.error("Could NOT Identify eth port {} on {}", ethIntf.getName(), node); - continue; - } - long ethOFPort = (Long)of_ports.toArray()[0]; + for (OvsdbTerminationPointAugmentation ethIntf : intfs.values()) { + Long ofPort = 0L; + if (ethIntf.getName().equalsIgnoreCase(bridgeConfigurationManager.getPhysicalInterfaceName( + node, network.getProviderPhysicalNetwork()))) { + long ethOFPort = (Long)ethIntf.getOfport(); if (ethOFPort == -1) { - logger.error("Could NOT Identify eth port {} -> OF ({}) on {}", ethIntf.getName(), ethOFPort, node); + logger.error("Could Not Identify eth port {} -> OF ({}) on {}", + ethIntf.getName(), ethOFPort, node); throw new Exception("port number < 0"); } logger.debug("Identified eth port {} -> OF ({}) on {}", ethIntf.getName(), ethOFPort, node); // TODO: add logic to only add rule on remote nodes - programRemoteEgressVlanRules(node, dpid, network.getProviderSegmentationID(), attachedMac, ethOFPort); - programLocalIngressVlanRules(node, dpid, network.getProviderSegmentationID(), attachedMac, localPort, ethOFPort); + programRemoteEgressVlanRules(node, dpid, network.getProviderSegmentationID(), + attachedMac, ethOFPort); + programLocalIngressVlanRules(node, dpid, network.getProviderSegmentationID(), + attachedMac, localPort, ethOFPort); return; } } @@ -1143,59 +1068,42 @@ public class OF13Provider implements NetworkingProvider { } } - private void removeVlanRules (NeutronNetwork network, Node node, - Interface intf, boolean isLastInstanceOnNode) { + private void removeVlanRules (NeutronNetwork network, Node node, OvsdbTerminationPointAugmentation intf, + boolean isLastInstanceOnNode) { /* TODO SB_MIGRATION */ Preconditions.checkNotNull(ovsdbConfigurationService); logger.debug("Remove vlan rules for interface {}", intf.getName()); - try { - Long dpid = this.getIntegrationBridgeOFDPID(node); if (dpid == 0L) { logger.debug("Openflow Datapath-ID not set for the integration bridge in {}", node); return; } - Set of_ports = intf.getOpenFlowPortColumn().getData(); - if (of_ports == null || of_ports.size() <= 0) { - logger.error("Could NOT Identify OF value for port {} on {}", intf.getName(), node); - return; - } - long localPort = (Long)of_ports.toArray()[0]; - - Map externalIds = intf.getExternalIdsColumn().getData(); - if (externalIds == null) { - logger.error("No external_ids seen in {}", intf); - return; - } + long localPort = (Long)intf.getOfport(); - String attachedMac = externalIds.get(Constants.EXTERNAL_ID_VM_MAC); + String attachedMac = MdsalUtils.getInterfaceExternalIdsValue(intf, Constants.EXTERNAL_ID_VM_MAC); if (attachedMac == null) { logger.error("No AttachedMac seen in {}", intf); return; } - Map intfs = ovsdbConfigurationService.getRows(node, ovsdbConfigurationService.getTableName(node, Interface.class)); + Map intfs = ovsdbConfigurationService.getInterfaces(node); if (intfs != null) { - for (Row row : intfs.values()) { - Interface ethIntf = ovsdbConfigurationService.getTypedRow(node, Interface.class, row); - if (ethIntf.getName().equalsIgnoreCase(bridgeConfigurationManager.getPhysicalInterfaceName(node, - network.getProviderPhysicalNetwork()))) { - of_ports = ethIntf.getOpenFlowPortColumn().getData(); - if (of_ports == null || of_ports.size() <= 0) { - logger.error("Could NOT Identify eth port {} on {}", ethIntf.getName(), node); - continue; - } - long ethOFPort = (Long)of_ports.toArray()[0]; + for (OvsdbTerminationPointAugmentation ethIntf : intfs.values()) { + Long ofPort = 0L; + if (ethIntf.getName().equalsIgnoreCase(bridgeConfigurationManager.getPhysicalInterfaceName( + node, network.getProviderPhysicalNetwork()))) { + long ethOFPort = (Long)ethIntf.getOfport(); if (ethOFPort == -1) { - logger.error("Could NOT Identify eth port {} -> OF ({}) on {}", ethIntf.getName(), ethOFPort, node); + logger.error("Could Not Identify eth port {} -> OF ({}) on {}", + ethIntf.getName(), ethOFPort, node); throw new Exception("port number < 0"); } logger.debug("Identified eth port {} -> OF ({}) on {}", ethIntf.getName(), ethOFPort, node); - - removeRemoteEgressVlanRules(node, dpid, network.getProviderSegmentationID(), attachedMac, localPort, ethOFPort); + removeRemoteEgressVlanRules(node, dpid, network.getProviderSegmentationID(), + attachedMac, localPort, ethOFPort); if (isLastInstanceOnNode) { removePerVlanRules(node, dpid, network.getProviderSegmentationID(), localPort, ethOFPort); } @@ -1209,7 +1117,7 @@ public class OF13Provider implements NetworkingProvider { } @Override - public Status handleInterfaceUpdate(NeutronNetwork network, Node srcNode, Interface intf) { + public Status handleInterfaceUpdate(NeutronNetwork network, Node srcNode, OvsdbTerminationPointAugmentation intf) { /* TODO SB_MIGRATION */ Preconditions.checkNotNull(connectionService); List nodes = connectionService.getNodes(); @@ -1255,7 +1163,8 @@ public class OF13Provider implements NetworkingProvider { NeutronNetwork network = tenantNetworkManager.getTenantNetwork(intf); logger.debug("Trigger Interface update for {}", intf); if (network != null) { - this.handleInterfaceUpdate(network, node, intf); + /* TODO SB_MIGRATION */ + //this.handleInterfaceUpdate(network, node, intf); } } } @@ -1271,9 +1180,17 @@ public class OF13Provider implements NetworkingProvider { return null; } + private boolean isInterfaceOfInterest(OvsdbTerminationPointAugmentation terminationPoint) { + return (SouthboundMapper.createOvsdbInterfaceType( + terminationPoint.getInterfaceType()).equals(NetworkHandler.NETWORK_TYPE_VXLAN) + || + SouthboundMapper.createOvsdbInterfaceType( + terminationPoint.getInterfaceType()).equals(NetworkHandler.NETWORK_TYPE_GRE)); + } + @Override - public Status handleInterfaceDelete(String tunnelType, NeutronNetwork network, Node srcNode, Interface intf, - boolean isLastInstanceOnNode) { + public Status handleInterfaceDelete(String tunnelType, NeutronNetwork network, Node srcNode, + OvsdbTerminationPointAugmentation intf, boolean isLastInstanceOnNode) { /* TODO SB_MIGRATION */ Preconditions.checkNotNull(connectionService); Status status = new Status(StatusCode.SUCCESS); @@ -1282,14 +1199,14 @@ public class OF13Provider implements NetworkingProvider { logger.info("Delete intf " + intf.getName() + " isLastInstanceOnNode " + isLastInstanceOnNode); List phyIfName = bridgeConfigurationManager.getAllPhysicalInterfaceNames(srcNode); - if (intf.getTypeColumn().getData().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VXLAN) - || intf.getTypeColumn().getData().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_GRE)) { + if (isInterfaceOfInterest(intf)) { // Delete tunnel port try { - Map options = intf.getOptionsColumn().getData(); - InetAddress src = InetAddress.getByName(options.get("local_ip")); - InetAddress dst = InetAddress.getByName(options.get("remote_ip")); - status = deleteTunnelPort(srcNode, intf.getTypeColumn().getData(), src, dst); + InetAddress src = InetAddress.getByName(MdsalUtils.getOptionsValue(intf.getOptions(), "local_ip")); + InetAddress dst = InetAddress.getByName(MdsalUtils.getOptionsValue(intf.getOptions(), "remote_ip")); + status = deleteTunnelPort(srcNode, + SouthboundMapper.createOvsdbInterfaceType(intf.getInterfaceType()), + src, dst); } catch (Exception e) { logger.error(e.getMessage(), e); } @@ -1327,8 +1244,7 @@ public class OF13Provider implements NetworkingProvider { } } } - //return status; - return new Status(StatusCode.SUCCESS); + return status; } @Override diff --git a/openstack/net-virt-providers/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/OF13ProviderTest.java b/openstack/net-virt-providers/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/OF13ProviderTest.java index 157f9fa5c..0e06d1fc0 100644 --- a/openstack/net-virt-providers/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/OF13ProviderTest.java +++ b/openstack/net-virt-providers/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/OF13ProviderTest.java @@ -290,7 +290,8 @@ public class OF13ProviderTest { */ when(network.getProviderNetworkType()).thenReturn(NetworkHandler.NETWORK_TYPE_VLAN); - this.of13Provider.handleInterfaceUpdate(network, node, intf); + /* TODO SB_MIGRATION */ + //this.of13Provider.handleInterfaceUpdate(network, node, intf); //verify(ovsdbConfigurationService, times(1)).getRows(node, ovsdbConfigurationService.getTableName(node, Interface.class)); /** @@ -301,12 +302,14 @@ public class OF13ProviderTest { */ when(network.getProviderNetworkType()).thenReturn(NetworkHandler.NETWORK_TYPE_GRE); - this.of13Provider.handleInterfaceUpdate(network, node, intf);this.of13Provider.handleInterfaceUpdate(network, node, intf); + /* TODO SB_MIGRATION */ + //this.of13Provider.handleInterfaceUpdate(network, node, intf);this.of13Provider.handleInterfaceUpdate(network, node, intf); /* TODO SB_MIGRATION */ //verify(configurationService, times(4)).getTunnelEndPoint(node); when(network.getProviderNetworkType()).thenReturn(NetworkHandler.NETWORK_TYPE_VXLAN); - this.of13Provider.handleInterfaceUpdate(network, node, intf);this.of13Provider.handleInterfaceUpdate(network, node, intf); + /* TODO SB_MIGRATION */ + //this.of13Provider.handleInterfaceUpdate(network, node, intf);this.of13Provider.handleInterfaceUpdate(network, node, intf); //verify(configurationService, times(8)).getTunnelEndPoint(node); assertEquals("Error, handleInterfaceUpdate(String, String) - is returning a non NULL value.", null, this.of13Provider.handleInterfaceUpdate("","")); @@ -335,7 +338,8 @@ public class OF13ProviderTest { Column> optionColumns = Mockito.mock(Column.class); when(intf.getOptionsColumn()).thenReturn(optionColumns); - Status status = this.of13Provider.handleInterfaceDelete("tunnel1", network, node, intf, true); + /* TODO SB_MIGRATION */ + Status status = null;//this.of13Provider.handleInterfaceDelete("tunnel1", network, node, intf, true); assertEquals("Error, handleInterfaceDelete(String, NeutronNetwor, Node, Interface, boolean) - returned the wrong status.", new Status(StatusCode.SUCCESS), status); } diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/SouthboundEvent.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/SouthboundEvent.java index de9e85f78..bfdcf21d7 100644 --- a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/SouthboundEvent.java +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/SouthboundEvent.java @@ -12,16 +12,21 @@ package org.opendaylight.ovsdb.openstack.netvirt; import org.opendaylight.ovsdb.lib.notation.Row; import org.opendaylight.ovsdb.openstack.netvirt.api.Action; //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.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; public class SouthboundEvent extends AbstractEvent { - public enum Type { NODE, ROW } + public enum Type { NODE, ROW, OPENVSWITCH, BRIDGE, PORT } private Type type; private Node node; private String tableName; private String uuid; private Row row; private Object context; + private OvsdbBridgeAugmentation bridge; + private OvsdbTerminationPointAugmentation port; + private String portName; public SouthboundEvent(Node node, Action action) { super(HandlerType.SOUTHBOUND, action); this.type = Type.NODE; @@ -44,6 +49,20 @@ public class SouthboundEvent extends AbstractEvent { this.row = row; this.context = context; } + public SouthboundEvent(Node node, OvsdbBridgeAugmentation bridge, Action action) { + super(HandlerType.SOUTHBOUND, action); + this.type = Type.BRIDGE; + this.node = node; + this.bridge = bridge; + } + public SouthboundEvent(Node node, OvsdbTerminationPointAugmentation port, String portName, Action action) { + super(HandlerType.SOUTHBOUND, action); + this.type = Type.PORT; + this.node = node; + this.port = port; + this.portName = portName; + } + public Type getType() { return type; } @@ -62,6 +81,15 @@ public class SouthboundEvent extends AbstractEvent { public Object getContext() { return context; } + public OvsdbBridgeAugmentation getBridge() { + return bridge; + } + public OvsdbTerminationPointAugmentation getPort() { + return port; + } + public String getPortName() { + return portName; + } @Override public String toString() { if (type == Type.NODE) { diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/SouthboundHandler.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/SouthboundHandler.java index 78c237976..5314cea2c 100644 --- a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/SouthboundHandler.java +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/SouthboundHandler.java @@ -16,12 +16,16 @@ import org.opendaylight.neutron.spi.NeutronNetwork; import org.opendaylight.ovsdb.lib.notation.Row; import org.opendaylight.ovsdb.lib.notation.UUID; import org.opendaylight.ovsdb.openstack.netvirt.api.*; +import org.opendaylight.ovsdb.openstack.netvirt.impl.MdsalUtils; import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter; import org.opendaylight.ovsdb.schema.openvswitch.Bridge; import org.opendaylight.ovsdb.schema.openvswitch.Interface; import org.opendaylight.ovsdb.schema.openvswitch.OpenVSwitch; import org.opendaylight.ovsdb.schema.openvswitch.Port; +import org.opendaylight.ovsdb.southbound.SouthboundMapper; import org.opendaylight.ovsdb.utils.mdsal.node.StringConvertor; +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.OvsdbTerminationPointAugmentation; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import org.slf4j.Logger; @@ -54,7 +58,7 @@ public class SouthboundHandler extends AbstractHandler @Override public void ovsdbNodeAdded(Node node) { - logger.info("nodeAdded: {}", node); + logger.info("ovsdbNodeAdded: {}", node); this.enqueueEvent(new SouthboundEvent(node, Action.ADD)); } @@ -115,10 +119,11 @@ public class SouthboundHandler extends AbstractHandler this.enqueueEvent(new SouthboundEvent(node, tableName, uuid, row, context, Action.DELETE)); } - public void processNodeUpdate(Node node, Action action) { - if (action == Action.DELETE) return; - logger.trace("Process Node added {}", node); - bridgeConfigurationManager.prepareNode(node); + public void processOvsdbNodeAdded(Node node, Action action) { + if (action == Action.ADD) { + logger.trace("processOvsdbNodeAdded {}", node); + bridgeConfigurationManager.prepareNode(node); + } } private void processRowUpdate(Node node, String tableName, String uuid, Row row, @@ -141,7 +146,7 @@ public class SouthboundHandler extends AbstractHandler deletedIntf.getTypeColumn().getData().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_GRE) || phyIfName.contains(deletedIntf.getName())) { /* delete tunnel interfaces or physical interfaces */ - this.handleInterfaceDelete(node, uuid, deletedIntf, false, null); + //this.handleInterfaceDelete(node, uuid, deletedIntf, false, null); } else if (network != null && !network.getRouterExternal()) { logger.debug("Processing update of {}:{} node {} intf {} network {}", tableName, action, node, uuid, network.getNetworkUUID()); @@ -156,7 +161,7 @@ public class SouthboundHandler extends AbstractHandler NeutronNetwork neutronNetwork = tenantNetworkManager.getTenantNetwork(intf); if (neutronNetwork != null && neutronNetwork.equals(network)) isLastInstanceOnNode = false; } - this.handleInterfaceDelete(node, uuid, deletedIntf, isLastInstanceOnNode, network); + //this.handleInterfaceDelete(node, uuid, deletedIntf, isLastInstanceOnNode, network); } } catch (Exception e) { logger.error("Error fetching Interface Rows for node " + node, e); @@ -182,7 +187,7 @@ public class SouthboundHandler extends AbstractHandler network.getNetworkUUID(), network.getNetworkName(), vlan); } } - this.handleInterfaceUpdate(node, uuid, intf); + //this.handleInterfaceUpdate(node, uuid, intf); } } else if (tableName.equalsIgnoreCase(ovsdbConfigurationService.getTableName(node, Port.class))) { @@ -201,7 +206,7 @@ public class SouthboundHandler extends AbstractHandler logger.debug("Processing update of {}:{} node {} intf {} network {}", tableName, action, node, intfUUID, network.getNetworkUUID()); tenantNetworkManager.programInternalVlan(node, uuid, network); - this.handleInterfaceUpdate(node, intfUUID.toString(), intf); + //this.handleInterfaceUpdate(node, intfUUID.toString(), intf); } else { logger.trace("Ignoring update because there is not a neutron network {} for port {}, interface {}", network, uuid, intfUUID); @@ -218,7 +223,7 @@ public class SouthboundHandler extends AbstractHandler if (interfaces != null) { for (String intfUUID : interfaces.keySet()) { Interface intf = ovsdbConfigurationService.getTypedRow(node, Interface.class, interfaces.get(intfUUID)); - this.handleInterfaceUpdate(node, intfUUID, intf); + //this.handleInterfaceUpdate(node, intfUUID, intf); } } } catch (Exception e) { @@ -239,30 +244,33 @@ public class SouthboundHandler extends AbstractHandler } } - private void handleInterfaceUpdate (Node node, String uuid, Interface intf) { - logger.trace("Interface update of node: {}, uuid: {}", node, uuid); - NeutronNetwork network = tenantNetworkManager.getTenantNetwork(intf); + private void handleInterfaceUpdate (Node node, String portName) { + OvsdbTerminationPointAugmentation ovsdbTerminationPointAugmentation = + MdsalUtils.getTerminationPointAugmentation(node, portName); + logger.trace("Interface update of node: {}, portName: {}", node, portName); + NeutronNetwork network = tenantNetworkManager.getTenantNetwork(ovsdbTerminationPointAugmentation); if (network != null) { - neutronL3Adapter.handleInterfaceEvent(node, intf, network, Action.UPDATE); + neutronL3Adapter.handleInterfaceEvent(node, ovsdbTerminationPointAugmentation, network, Action.UPDATE); if (bridgeConfigurationManager.createLocalNetwork(node, network)) - networkingProviderManager.getProvider(node).handleInterfaceUpdate(network, node, intf); + networkingProviderManager.getProvider(node).handleInterfaceUpdate(network, node, + ovsdbTerminationPointAugmentation); } else { - logger.debug("No tenant network found on node: {}, uuid: {} for interface: {}", node, uuid, intf); + logger.debug("No tenant network found on node: {}, portName: {} for interface: {}", + node, portName, ovsdbTerminationPointAugmentation); } } - private void handleInterfaceDelete (Node node, String uuid, Interface intf, boolean isLastInstanceOnNode, + private void handleInterfaceDelete (Node node, OvsdbTerminationPointAugmentation intf, boolean isLastInstanceOnNode, NeutronNetwork network) { - logger.debug("handleInterfaceDelete: node: {}, uuid: {}, isLastInstanceOnNode: {}, interface: {}", - node, uuid, isLastInstanceOnNode, intf); + logger.debug("handleInterfaceDelete: node: {}, isLastInstanceOnNode: {}, interface: {}", + node, isLastInstanceOnNode, intf); neutronL3Adapter.handleInterfaceEvent(node, intf, network, Action.DELETE); List phyIfName = bridgeConfigurationManager.getAllPhysicalInterfaceNames(node); - if (intf.getTypeColumn().getData().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VXLAN) || - intf.getTypeColumn().getData().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_GRE) || - phyIfName.contains(intf.getName())) { + if (isInterfaceOfInterest(intf, phyIfName)) { /* delete tunnel or physical interfaces */ - networkingProviderManager.getProvider(node).handleInterfaceDelete(intf.getTypeColumn().getData(), null, node, intf, isLastInstanceOnNode); + //networkingProviderManager.getProvider(node).handleInterfaceDelete(intf.getTypeColumn().getData(), null, + // node, intf, isLastInstanceOnNode); } else if (network != null) { if (!network.getProviderNetworkType().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VLAN)) { /* vlan doesn't need a tunnel endpoint */ if (configurationService.getTunnelEndPoint(node) == null) { @@ -271,7 +279,7 @@ public class SouthboundHandler extends AbstractHandler } } if (isLastInstanceOnNode & networkingProviderManager.getProvider(node).hasPerTenantTunneling()) { - tenantNetworkManager.reclaimInternalVlan(node, uuid, network); + tenantNetworkManager.reclaimInternalVlan(node, network); } networkingProviderManager.getProvider(node).handleInterfaceDelete(network.getProviderNetworkType(), network, node, intf, isLastInstanceOnNode); } @@ -321,6 +329,91 @@ public class SouthboundHandler extends AbstractHandler } } + private void processBridgeUpdate(Node node, OvsdbBridgeAugmentation bridge, Action action) { + logger.debug("processBridgeUpdate {}: {}, {}", action, node, bridge); + final String dpid = bridge.getDatapathId().getValue(); + if (dpid != null + && (bridge.getBridgeName().equals(configurationService.getIntegrationBridgeName()) + || bridge.getBridgeName().equals(configurationService.getExternalBridgeName()))) { + NetworkingProvider networkingProvider = networkingProviderManager.getProvider(node); + networkingProvider.notifyFlowCapableNodeEvent(StringConvertor.dpidStringToLong(dpid), action); + } + } + + private void processInterfaceDelete(Node node, String portName, Object context, Action action) { + OvsdbTerminationPointAugmentation ovsdbTerminationPointAugmentation = + MdsalUtils.getTerminationPointAugmentation(node, portName); + logger.debug("processInterfaceDelete {}: {}", node, portName); + NeutronNetwork network = null; + if (context == null) { + network = tenantNetworkManager.getTenantNetwork(ovsdbTerminationPointAugmentation); + } else { + network = (NeutronNetwork)context; + } + List phyIfName = bridgeConfigurationManager.getAllPhysicalInterfaceNames(node); + if (isInterfaceOfInterest(ovsdbTerminationPointAugmentation, phyIfName)) { + this.handleInterfaceDelete(node, ovsdbTerminationPointAugmentation, false, null); + } else if (network != null && !network.getRouterExternal()) { + /*logger.debug("Processing update of {}:{} node {} intf {} network {}", + tableName, action, node, uuid, network.getNetworkUUID()); + try { + ConcurrentMap interfaces = this.ovsdbConfigurationService + .getRows(node, ovsdbConfigurationService.getTableName(node, Interface.class)); + if (interfaces != null) { + boolean isLastInstanceOnNode = true; + for (String intfUUID : interfaces.keySet()) { + if (intfUUID.equals(uuid)) continue; + Interface intf = this.ovsdbConfigurationService.getTypedRow(node, Interface.class, interfaces.get(intfUUID)); + NeutronNetwork neutronNetwork = tenantNetworkManager.getTenantNetwork(intf); + if (neutronNetwork != null && neutronNetwork.equals(network)) isLastInstanceOnNode = false; + } + this.handleInterfaceDelete(node, uuid, deletedIntf, isLastInstanceOnNode, network); + } + } catch (Exception e) { + logger.error("Error fetching Interface Rows for node " + node, e); + }*/ + } + } + private void processInterfaceUpdate(Node node, OvsdbTerminationPointAugmentation terminationPoint, + String portName, Object context, Action action) { + if (action == Action.DELETE) { + processInterfaceDelete(node, portName, context, action); + } else { + + } + } + + private boolean isInterfaceOfInterest(OvsdbTerminationPointAugmentation terminationPoint, List phyIfName) { + return (SouthboundMapper.createOvsdbInterfaceType( + terminationPoint.getInterfaceType()).equals(NetworkHandler.NETWORK_TYPE_VXLAN) + || + SouthboundMapper.createOvsdbInterfaceType( + terminationPoint.getInterfaceType()).equals(NetworkHandler.NETWORK_TYPE_GRE) + || + phyIfName.contains(terminationPoint.getName())); + } + + /** + * Notification about an OpenFlow Node + * + * @param openFlowNode the {@link Node Node} of interest in the notification + * @param action the {@link Action} + * @see NodeCacheListener#notifyNode + */ + @Override + public void notifyNode (org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node openFlowNode, + Action action) { + logger.info("notifyNode: Node {} update {} from Controller's inventory Service", + openFlowNode, action); + + if (action.equals(Action.ADD)) { + /* TODO SB_MIGRATION + * Need to map from ovsdbNode to openflowNode + */ + //networkingProviderManager.getProvider(ovsdbNode).initializeOFFlowRules(openFlowNode); + } + } + /** * Process the event. * @@ -334,11 +427,11 @@ public class SouthboundHandler extends AbstractHandler return; } SouthboundEvent ev = (SouthboundEvent) abstractEvent; - //logger.info("processEvent: {}", ev); + logger.info("processEvent: {}", ev); switch (ev.getType()) { case NODE: try { - processNodeUpdate(ev.getNode(), ev.getAction()); + processOvsdbNodeAdded(ev.getNode(), ev.getAction()); } catch (Exception e) { logger.error("Exception caught in ProcessNodeUpdate for node " + ev.getNode(), e); } @@ -346,36 +439,30 @@ public class SouthboundHandler extends AbstractHandler case ROW: try { processRowUpdate(ev.getNode(), ev.getTableName(), ev.getUuid(), ev.getRow(), - ev.getContext(),ev.getAction()); + ev.getContext(), ev.getAction()); } catch (Exception e) { logger.error("Exception caught in ProcessRowUpdate for node " + ev.getNode(), e); } break; + case BRIDGE: + try { + processBridgeUpdate(ev.getNode(), ev.getBridge(), ev.getAction()); + } catch (Exception e) { + logger.error("Exception caught in processBridgeUpdate for node {}", ev.getNode(), e); + } + break; + case PORT: + try { + processInterfaceUpdate(ev.getNode(), ev.getPort(), ev.getPortName(), + ev.getContext(), ev.getAction()); + } catch (Exception e) { + logger.error("Exception caught in processInterfaceUpdate for node {}", ev.getNode(), e); + } + break; default: logger.warn("Unable to process type " + ev.getType() + - " action " + ev.getAction() + " for node " + ev.getNode()); + " action " + ev.getAction() + " for node " + ev.getNode()); break; } } - - /** - * Notification about an OpenFlow Node - * - * @param openFlowNode the {@link Node Node} of interest in the notification - * @param action the {@link Action} - * @see NodeCacheListener#notifyNode - */ - @Override - public void notifyNode (org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node openFlowNode, - Action action) { - logger.info("notifyNode: Node {} update {} from Controller's inventory Service", - openFlowNode, action); - - if (action.equals(Action.ADD)) { - /* TODO SB_MIGRATION - * Need to map from ovsdbNode to openflowNode - */ - //networkingProviderManager.getProvider(ovsdbNode).initializeOFFlowRules(openFlowNode); - } - } } diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/NetworkingProvider.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/NetworkingProvider.java index 78311a0e7..a9d491f32 100644 --- a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/NetworkingProvider.java +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/NetworkingProvider.java @@ -12,6 +12,7 @@ package org.opendaylight.ovsdb.openstack.netvirt.api; import org.opendaylight.neutron.spi.NeutronNetwork; import org.opendaylight.ovsdb.schema.openvswitch.Interface; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; /** @@ -42,12 +43,13 @@ public interface NetworkingProvider { /** * Handle Interface Update Callback Method */ - public Status handleInterfaceUpdate(NeutronNetwork network, Node source, Interface intf); + public Status handleInterfaceUpdate(NeutronNetwork network, Node source, OvsdbTerminationPointAugmentation intf); /** * Handle Interface Delete Callback Method */ - public Status handleInterfaceDelete(String tunnelType, NeutronNetwork network, Node source, Interface intf, boolean isLastInstanceOnNode); + public Status handleInterfaceDelete(String tunnelType, NeutronNetwork network, Node source, + OvsdbTerminationPointAugmentation intf, boolean isLastInstanceOnNode); /** * Initialize the Flow rules given the OVSDB node. diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/OvsdbConfigurationService.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/OvsdbConfigurationService.java index adfc8fca7..bbdb9dac7 100644 --- a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/OvsdbConfigurationService.java +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/OvsdbConfigurationService.java @@ -7,6 +7,7 @@ import org.opendaylight.ovsdb.lib.notation.Row; import org.opendaylight.ovsdb.lib.notation.UUID; import org.opendaylight.ovsdb.lib.schema.GenericTableSchema; import org.opendaylight.ovsdb.lib.schema.typed.TypedBaseTable; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; /** @@ -31,78 +32,6 @@ public interface OvsdbConfigurationService { @Deprecated public StatusWithUuid insertRow(Node node, String tableName, String parentUuid, Row row); - /** - * insert a Row in a Table of a specified Database Schema. This is a convenience method on top of - * {@link insertRow(Node, String, String, String, UUID , String, Row) insertRow} - * which assumes that OVSDB schema implementation that corresponds to the databaseName will provide - * the necessary service to populate the Parent Table Name and Parent Column Name. - * - * This method can insert just a single Row specified in the row parameter. - * But {@link #insertTree(Node, String, String, UUID, Row) insertTree} - * can insert a hierarchy of rows with parent-child relationship. - * - * @param node OVSDB Node - * @param databaseName Database Name that represents the Schema supported by the node. - * @param tableName Table on which the row is inserted - * @param parentUuid UUID of the parent table to which this operation will result in attaching/mutating. - * @param row Row of table Content to be inserted - * @throws OvsdbPluginException Any failure during the insert transaction will result in a specific exception. - * @return UUID of the inserted Row - */ - public UUID insertRow(Node node, String databaseName, String tableName, UUID parentRowUuid, - Row row) throws OvsdbPluginException; - - /** - * insert a Row in a Table of a specified Database Schema. - * - * This method can insert just a single Row specified in the row parameter. - * But {@link #insertTree(Node, String, String, UUID, Row) insertTree} - * can insert a hierarchy of rows with parent-child relationship. - * - * @param node OVSDB Node - * @param databaseName Database Name that represents the Schema supported by the node. - * @param tableName Table on which the row is inserted - * @param parentTable Name of the Parent Table to which this operation will result in attaching/mutating. - * @param parentUuid UUID of a Row in parent table to which this operation will result in attaching/mutating. - * @param parentColumn Name of the Column in the Parent Table to be mutated with the UUID that results from the insert operation. - * @param row Row of table Content to be inserted - * @throws OvsdbPluginException Any failure during the insert transaction will result in a specific exception. - * @return UUID of the inserted Row - */ - public UUID insertRow(Node node, String databaseName, String tableName, String parentTable, UUID parentRowUuid, - String parentColumn, Row row) throws OvsdbPluginException; - - /** - * inserts a Tree of Rows in multiple Tables that has parent-child relationships referenced through the OVSDB schema's refTable construct. - * This is a convenience method on top of {@link #insertTree(Node, String, String, String, UUID, String, Row) insertTree} - * - * @param node OVSDB Node - * @param databaseName Database Name that represents the Schema supported by the node. - * @param tableName Table on which the row is inserted - * @param parentUuid UUID of a Row in parent table to which this operation will result in attaching/mutating. - * @param row Row Tree with parent-child relationships via column of type refTable. - * @throws OvsdbPluginException Any failure during the insert transaction will result in a specific exception. - * @return Returns the row tree with the UUID of every inserted Row populated in the _uuid column of every row in the tree - */ - public Row insertTree(Node node, String databaseName, String tableName, UUID parentRowUuid, - Row row) throws OvsdbPluginException; - - /** - * inserts a Tree of Rows in multiple Tables that has parent-child relationships referenced through the OVSDB schema's refTable construct - * - * @param node OVSDB Node - * @param databaseName Database Name that represents the Schema supported by the node. - * @param tableName Table on which the row is inserted - * @param parentTable Name of the Parent Table to which this operation will result in attaching/mutating. - * @param parentUuid UUID of a Row in parent table to which this operation will result in attaching/mutating. - * @param parentColumn Name of the Column in the Parent Table to be mutated with the UUID that results from the insert operation. - * @param row Row Tree with parent-child relationships via column of type refTable. - * @throws OvsdbPluginException Any failure during the insert transaction will result in a specific exception. - * @return Returns the row tree with the UUID of every inserted Row populated in the _uuid column of every row in the tree - */ - public Row insertTree(Node node, String databaseName, String tableName, String parentTable, UUID parentRowUuid, - String parentColumn, Row row) throws OvsdbPluginException; - /** * @deprecated This version of updateRow is a short-term replacement for the older & now deprecated method of the same name. * This API assumes an Open_vSwitch database Schema. @@ -119,22 +48,6 @@ public interface OvsdbConfigurationService { @Deprecated public Status updateRow (Node node, String tableName, String parentUuid, String rowUuid, Row row); - /** - * update or mutate a Row in a Table of a specified Database Schema. - * - * @param node OVSDB Node - * @param databaseName Database Name that represents the Schema supported by the node. - * @param tableName Table on which the row is updated - * @param rowUuid UUID of the row being updated - * @param row Row of table Content to be updated - * @param overwrite true will overwrite/replace the existing row (matching the rowUuid) with the passed row object. - * false will update the existing row (matching the rowUuid) using only the columns in the passed row object. - * @throws OvsdbPluginException Any failure during the update operation will result in a specific exception. - * @return Returns the entire Row after the update operation. - */ - public Row updateRow(Node node, String databaseName, String tableName, UUID rowUuid, - Row row, boolean overwrite) throws OvsdbPluginException; - /** * @deprecated This version of deleteRow is a short-term replacement for the older & now deprecated method of the same name. * This API assumes an Open_vSwitch database Schema. @@ -148,33 +61,6 @@ public interface OvsdbConfigurationService { @Deprecated public Status deleteRow (Node node, String tableName, String rowUuid); - /** - * update or mutate a Row in a Table of a specified Database Schema. - * - * @param node OVSDB Node - * @param databaseName Database Name that represents the Schema supported by the node. - * @param tableName Table on which the row is Updated - * @param rowUuid UUID of the row that is being deleted - * @throws OvsdbPluginException Any failure during the delete operation will result in a specific exception. - */ - - public void deleteRow (Node node, String databaseName, String tableName, UUID rowUuid) throws OvsdbPluginException; - - /** - * update or mutate a Row in a Table of a specified Database Schema. - * - * @param node OVSDB Node - * @param databaseName Database Name that represents the Schema supported by the node. - * @param tableName Table on which the row is Updated - * @param parentTable Name of the Parent Table to which this operation will result in mutating. - * @param parentColumn Name of the Column in the Parent Table to be mutated. - * @param rowUuid UUID of the row that is being deleted - * @throws OvsdbPluginException Any failure during the delete operation will result in a specific exception. - */ - - public void deleteRow (Node node, String databaseName, String tableName, String parentTable, - UUID parentRowUuid, String parentColumn, UUID rowUuid) throws OvsdbPluginException; - /** * @deprecated This version of getRow is a short-term replacement for the older & now deprecated method of the same name. * This API assumes an Open_vSwitch database Schema. @@ -250,16 +136,6 @@ public interface OvsdbConfigurationService { @Deprecated public List getTables(Node node); - /** - * Returns all the Tables in a given Node. - * - * @param node OVSDB node - * @param databaseName Database Name that represents the Schema supported by the node. - * @throws OvsdbPluginException Any failure during the get operation will result in a specific exception. - * @return List of Table Names that make up the schema represented by the databaseName - */ - public List getTables(Node node, String databaseName) throws OvsdbPluginException; - /** * setOFController is a convenience method used by existing applications to setup Openflow Controller on * a Open_vSwitch Bridge. @@ -277,4 +153,6 @@ public interface OvsdbConfigurationService { public > String getTableName(Node node, Class typedClass); public > T getTypedRow(Node node, Class typedClass, Row row); public > T createTypedRow(Node node, Class typedClass); + + public ConcurrentMap getInterfaces(Node node); } diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/TenantNetworkManager.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/TenantNetworkManager.java index d0c1ac7d4..d05c7d338 100644 --- a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/TenantNetworkManager.java +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/TenantNetworkManager.java @@ -10,8 +10,12 @@ package org.opendaylight.ovsdb.openstack.netvirt.api; +import java.util.List; import org.opendaylight.neutron.spi.NeutronNetwork; +import org.opendaylight.neutron.spi.NeutronPort; import org.opendaylight.ovsdb.schema.openvswitch.Interface; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceExternalIds; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; /** @@ -22,7 +26,7 @@ public interface TenantNetworkManager { /** * Get the VLAN assigned to the provided Network - * @param node the {@link org.opendaylight.controller.sal.core.Node} to query + * @param node the {Node} to query * @param networkId the Neutron Network ID * @return the assigned VLAN ID or 0 in case of an error */ @@ -30,15 +34,14 @@ public interface TenantNetworkManager { /** * Reclaim the assigned VLAN for the given Network - * @param node the {@link org.opendaylight.controller.sal.core.Node} to query - * @param portUUID the UUID of the neutron Port + * @param node the {Node} to query * @param network the Neutron Network ID */ - public void reclaimInternalVlan(Node node, String portUUID, NeutronNetwork network); + public void reclaimInternalVlan(Node node, NeutronNetwork network); /** * Configures the VLAN for a Tenant Network - * @param node the {@link org.opendaylight.controller.sal.core.Node} to configure + * @param node the {Node} to configure * @param portUUID the UUID of the port to configure * @param network the Neutron Network ID */ @@ -46,7 +49,7 @@ public interface TenantNetworkManager { /** * Check is the given network is present on a Node - * @param node the {@link org.opendaylight.controller.sal.core.Node} to query + * @param node the {Node} to query * @param segmentationId the Neutron Segementation ID * @return True or False */ @@ -71,4 +74,7 @@ public interface TenantNetworkManager { * Network Deleted Callback */ public void networkDeleted(String id); + + NeutronNetwork getTenantNetwork(OvsdbTerminationPointAugmentation terminationPointAugmentation); + public NeutronPort getTenantPort(OvsdbTerminationPointAugmentation terminationPointAugmentation); } \ No newline at end of file diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/BridgeConfigurationManagerImpl.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/BridgeConfigurationManagerImpl.java index cb3847a73..9229fae4c 100644 --- a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/BridgeConfigurationManagerImpl.java +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/BridgeConfigurationManagerImpl.java @@ -9,30 +9,29 @@ */ package org.opendaylight.ovsdb.openstack.netvirt.impl; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.neutron.spi.NeutronNetwork; import org.opendaylight.ovsdb.lib.error.SchemaVersionMismatchException; import org.opendaylight.ovsdb.lib.notation.Row; import org.opendaylight.ovsdb.lib.notation.UUID; import org.opendaylight.ovsdb.openstack.netvirt.NetworkHandler; -import org.opendaylight.ovsdb.openstack.netvirt.api.BridgeConfigurationManager; -import org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService; -import org.opendaylight.ovsdb.openstack.netvirt.api.Constants; -import org.opendaylight.ovsdb.openstack.netvirt.api.MdsalConsumer; -import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProviderManager; -import org.opendaylight.ovsdb.openstack.netvirt.api.OvsdbConfigurationService; -import org.opendaylight.ovsdb.openstack.netvirt.api.Status; -import org.opendaylight.ovsdb.openstack.netvirt.api.StatusCode; -import org.opendaylight.ovsdb.openstack.netvirt.api.StatusWithUuid; +import org.opendaylight.ovsdb.openstack.netvirt.api.*; import org.opendaylight.ovsdb.schema.openvswitch.Bridge; import org.opendaylight.ovsdb.schema.openvswitch.Interface; import org.opendaylight.ovsdb.schema.openvswitch.OpenVSwitch; import org.opendaylight.ovsdb.schema.openvswitch.Port; +import org.opendaylight.ovsdb.southbound.SouthboundMapper; +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.OvsdbBridgeName; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfo; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,31 +47,13 @@ public class BridgeConfigurationManagerImpl implements BridgeConfigurationManage private volatile ConfigurationService configurationService; private volatile NetworkingProviderManager networkingProviderManager; private volatile OvsdbConfigurationService ovsdbConfigurationService; - //private volatile MdsalConsumer mdsalConsumer; public BridgeConfigurationManagerImpl() { } @Override public String getBridgeUuid(Node node, String bridgeName) { - //Preconditions.checkNotNull(mdsalConsumer); - /* TODO SB_MIGRATION */ - try { - Map bridgeTable = - ovsdbConfigurationService.getRows(node, ovsdbConfigurationService.getTableName(node, Bridge.class)); - if (bridgeTable == null) { - return null; - } - for (String key : bridgeTable.keySet()) { - Bridge bridge = ovsdbConfigurationService.getTypedRow(node, Bridge.class, bridgeTable.get(key)); - if (bridge.getName().equals(bridgeName)) { - return key; - } - } - } catch (Exception e) { - LOGGER.error("Error getting Bridge Identifier for {} / {}", node, bridgeName, e); - } - return null; + return MdsalUtils.getBridgeUuid(node, bridgeName).toString(); } @Override @@ -186,11 +167,7 @@ public class BridgeConfigurationManagerImpl implements BridgeConfigurationManage try { this.createIntegrationBridge(node); } catch (Exception e) { - LOGGER.error("Error creating Integration Bridge on " + node.toString(), e); - return; - } - if (networkingProviderManager == null) { - LOGGER.error("Error creating internal network. Provider Network Manager unavailable"); + LOGGER.error("Error creating Integration Bridge on {}", node, e); return; } networkingProviderManager.getProvider(node).initializeFlowRules(node); @@ -379,9 +356,9 @@ public class BridgeConfigurationManagerImpl implements BridgeConfigurationManage private void createIntegrationBridge (Node node) throws Exception { Preconditions.checkNotNull(configurationService); - String brInt = configurationService.getIntegrationBridgeName(); + String brIntName = configurationService.getIntegrationBridgeName(); - Status status = this.addBridge(node, brInt, null, null); + Status status = addBridge(node, brIntName, null, null); if (!status.isSuccess()) { LOGGER.debug("Integration Bridge Creation Status: {}", status); } @@ -640,7 +617,11 @@ public class BridgeConfigurationManagerImpl implements BridgeConfigurationManage Preconditions.checkNotNull(networkingProviderManager); /* TODO SB_MIGRATION */ - String bridgeUUID = getBridgeUuid(node, bridgeName); + //String bridgeUUID = getBridgeUuid(node, bridgeName); + MdsalUtils.addBridge(node, bridgeName);//sb will also add port and interface if this is a new bridge + + + /*// TODO use the bridge it code to add bridge Bridge bridge = ovsdbConfigurationService.createTypedRow(node, Bridge.class); Set failMode = new HashSet<>(); failMode.add("secure"); @@ -648,9 +629,9 @@ public class BridgeConfigurationManagerImpl implements BridgeConfigurationManage Set protocols = new HashSet<>(); - /* ToDo: Plugin should expose an easy way to get the OVS Version or Schema Version - * or, alternatively it should not attempt to add set unsupported fields - */ + // ToDo: Plugin should expose an easy way to get the OVS Version or Schema Version + // or, alternatively it should not attempt to add set unsupported fields + // try { protocols.add(Constants.OPENFLOW13); @@ -691,7 +672,7 @@ public class BridgeConfigurationManagerImpl implements BridgeConfigurationManage remotePatchName != null && networkingProviderManager.getProvider(node).hasPerTenantTunneling()) { return addPatchPort(node, bridgeUUID, localPatchName, remotePatchName); - } + }*/ return new Status(StatusCode.SUCCESS); } diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/MdsalUtils.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/MdsalUtils.java index 5b8f5f2b8..c08872bbf 100644 --- a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/MdsalUtils.java +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/MdsalUtils.java @@ -8,14 +8,37 @@ package org.opendaylight.ovsdb.openstack.netvirt.impl; import com.google.common.base.Optional; +import com.google.common.collect.ImmutableBiMap; import com.google.common.util.concurrent.CheckedFuture; +import java.security.InvalidParameterException; +import java.util.ArrayList; +import java.util.List; 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; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; +import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; +import org.opendaylight.ovsdb.openstack.netvirt.api.Constants; +import org.opendaylight.ovsdb.southbound.SouthboundConstants; import org.opendaylight.ovsdb.southbound.SouthboundMapper; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid; +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.OvsdbBridgeAugmentationBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeName; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeProtocolBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeRef; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ProtocolEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ProtocolEntryBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfo; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceExternalIds; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.Options; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; 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.NodeBuilder; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,6 +51,7 @@ import org.slf4j.LoggerFactory; public class MdsalUtils { private static final Logger LOG = LoggerFactory.getLogger(MdsalUtils.class); private static DataBroker databroker = null; + private static final int OVSDB_UPDATE_TIMEOUT = 500; /** * Class constructor setting the data broker. @@ -50,23 +74,92 @@ public class MdsalUtils { } */ /** - * Executes read transaction as a test2. + * Executes delete as a blocking transaction. * - * @param logicalDatastoreType {@link org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType} from which read should occur - * @param path {@link org.opendaylight.yangtools.yang.binding.InstanceIdentifier} for path to read + * @param store {@link LogicalDatastoreType} which should be modified + * @param path {@link InstanceIdentifier} to read from * @param the data object type - * @return the data object requested + * @return the result of the request */ - public static D readTransaction( - final LogicalDatastoreType logicalDatastoreType, final InstanceIdentifier path) { - D ret = null; - final ReadOnlyTransaction readTx = databroker.newReadOnlyTransaction(); - Optional optionalDataObject = Optional.absent(); - CheckedFuture, ReadFailedException> submitFuture = readTx.read(logicalDatastoreType, path); + public static boolean delete( + final LogicalDatastoreType store, final InstanceIdentifier path) { + boolean result = false; + final WriteTransaction transaction = databroker.newWriteOnlyTransaction(); + transaction.delete(store, path); + CheckedFuture future = transaction.submit(); try { - optionalDataObject = submitFuture.checkedGet(); + future.checkedGet(); + result = true; + } catch (TransactionCommitFailedException e) { + LOG.warn("Failed to delete {} ", path, e); + } + return result; + } + + /** + * Executes merge as a blocking transaction. + * + * @param logicalDatastoreType {@link LogicalDatastoreType} which should be modified + * @param path {@link InstanceIdentifier} for path to read + * @param the data object type + * @return the result of the request + */ + public static boolean merge( + final LogicalDatastoreType logicalDatastoreType, final InstanceIdentifier path, D data) { + boolean result = false; + final WriteTransaction transaction = databroker.newWriteOnlyTransaction(); + transaction.merge(logicalDatastoreType, path, data, true); + CheckedFuture future = transaction.submit(); + try { + future.checkedGet(); + result = true; + } catch (TransactionCommitFailedException e) { + LOG.warn("Failed to merge {} ", path, e); + } + return result; + } + + /** + * Executes put as a blocking transaction. + * + * @param logicalDatastoreType {@link LogicalDatastoreType} which should be modified + * @param path {@link InstanceIdentifier} for path to read + * @param the data object type + * @return the result of the request + */ + public static boolean put( + final LogicalDatastoreType logicalDatastoreType, final InstanceIdentifier path, D data) { + boolean result = false; + final WriteTransaction transaction = databroker.newWriteOnlyTransaction(); + transaction.put(logicalDatastoreType, path, data, true); + CheckedFuture future = transaction.submit(); + try { + future.checkedGet(); + result = true; + } catch (TransactionCommitFailedException e) { + LOG.warn("Failed to put {} ", path, e); + } + return result; + } + + /** + * Executes read as a blocking transaction. + * + * @param store {@link LogicalDatastoreType} to read + * @param path {@link InstanceIdentifier} for path to read + * @param the data object type + * @return the result as the data object requested + */ + public static D read( + final LogicalDatastoreType store, final InstanceIdentifier path) { + D result = null; + final ReadOnlyTransaction transaction = databroker.newReadOnlyTransaction(); + Optional optionalDataObject; + CheckedFuture, ReadFailedException> future = transaction.read(store, path); + try { + optionalDataObject = future.checkedGet(); if (optionalDataObject.isPresent()) { - ret = optionalDataObject.get(); + result = optionalDataObject.get(); } else { LOG.debug("{}: Failed to read {}", Thread.currentThread().getStackTrace()[1], path); @@ -74,8 +167,121 @@ public class MdsalUtils { } catch (ReadFailedException e) { LOG.warn("Failed to read {} ", path, e); } - readTx.close(); - return ret; + transaction.close(); + return result; + } + + public static String getOptionsValue(List options, String key) { + String value = null; + for (Options option : options) { + if (option.getKey().equals(key)) { + value = option.getValue(); + } + } + return value; } + public static String getInterfaceExternalIdsValue(OvsdbTerminationPointAugmentation terminationPointAugmentation, + String key) { + String value = null; + List pairs = terminationPointAugmentation.getInterfaceExternalIds(); + for (InterfaceExternalIds pair : pairs) { + if (pair.getKey().equals(key)) { + value = pair.getExternalIdValue(); + } + } + return value; + } + + public static ConnectionInfo getConnectionInfo(Node node) { + ConnectionInfo connectionInfo = null; + OvsdbNodeAugmentation ovsdbNodeAugmentation = node.getAugmentation(OvsdbNodeAugmentation.class); + if (ovsdbNodeAugmentation != null) { + connectionInfo = ovsdbNodeAugmentation.getConnectionInfo(); + } + return connectionInfo; + } + + public static OvsdbBridgeAugmentation getBridge(Node node, String name) { + OvsdbBridgeAugmentation ovsdbBridgeAugmentation = null; + ConnectionInfo connectionInfo = MdsalUtils.getConnectionInfo(node); + if (connectionInfo != null) { + InstanceIdentifier bridgeIid = + SouthboundMapper.createInstanceIdentifier(connectionInfo, + new OvsdbBridgeName(name)); + Node bridgeNode = MdsalUtils.read(LogicalDatastoreType.OPERATIONAL, bridgeIid); + if (bridgeNode != null) { + ovsdbBridgeAugmentation = bridgeNode.getAugmentation(OvsdbBridgeAugmentation.class); + } + } + return ovsdbBridgeAugmentation; + } + + public static Uuid getBridgeUuid(Node node, String name) { + Uuid uuid = null; + OvsdbBridgeAugmentation ovsdbBridgeAugmentation = getBridge(node, name); + if (ovsdbBridgeAugmentation != null) { + uuid = ovsdbBridgeAugmentation.getBridgeUuid(); + } + return uuid; + } + + public static boolean addBridge(Node ovsdbNode, String bridgeName) + throws InterruptedException, InvalidParameterException { + boolean result = false; + + ConnectionInfo connectionInfo = getConnectionInfo(ovsdbNode); + if (connectionInfo != null) { + NodeBuilder bridgeNodeBuilder = new NodeBuilder(); + InstanceIdentifier bridgeIid = + SouthboundMapper.createInstanceIdentifier(connectionInfo, new OvsdbBridgeName(bridgeName)); + NodeId bridgeNodeId = SouthboundMapper.createManagedNodeId(bridgeIid); + bridgeNodeBuilder.setNodeId(bridgeNodeId); + OvsdbBridgeAugmentationBuilder ovsdbBridgeAugmentationBuilder = new OvsdbBridgeAugmentationBuilder(); + ovsdbBridgeAugmentationBuilder.setBridgeName(new OvsdbBridgeName(bridgeName)); + ovsdbBridgeAugmentationBuilder.setProtocolEntry(createMdsalProtocols()); + ovsdbBridgeAugmentationBuilder.setFailMode( + SouthboundConstants.OVSDB_FAIL_MODE_MAP.inverse().get("secure")); + //setManagedBy(ovsdbBridgeAugmentationBuilder, connectionInfo); + bridgeNodeBuilder.addAugmentation(OvsdbBridgeAugmentation.class, ovsdbBridgeAugmentationBuilder.build()); + + result = merge(LogicalDatastoreType.CONFIGURATION, bridgeIid, bridgeNodeBuilder.build()); + Thread.sleep(OVSDB_UPDATE_TIMEOUT); + } else { + throw new InvalidParameterException("Could not find ConnectionInfo"); + } + + return result; + } + + private static void setManagedBy(OvsdbBridgeAugmentationBuilder ovsdbBridgeAugmentationBuilder, + ConnectionInfo connectionInfo) { + InstanceIdentifier connectionNodePath = SouthboundMapper.createInstanceIdentifier(connectionInfo); + ovsdbBridgeAugmentationBuilder.setManagedBy(new OvsdbNodeRef(connectionNodePath)); + } + + private static List createMdsalProtocols() { + List protocolList = new ArrayList(); + ImmutableBiMap> mapper = + SouthboundConstants.OVSDB_PROTOCOL_MAP.inverse(); + protocolList.add(new ProtocolEntryBuilder(). + setProtocol((Class) mapper.get("OpenFlow13")).build()); + return protocolList; + } + + public static OvsdbTerminationPointAugmentation getTerminationPointAugmentation(Node bridgeNode, String portName) { + OvsdbBridgeAugmentation ovsdbBridgeAugmentation = bridgeNode.getAugmentation(OvsdbBridgeAugmentation.class); + if (ovsdbBridgeAugmentation != null) { + List terminationPoints = bridgeNode.getTerminationPoint(); + for(TerminationPoint terminationPoint : terminationPoints) { + OvsdbTerminationPointAugmentation ovsdbTerminationPointAugmentation = + terminationPoint.getAugmentation( OvsdbTerminationPointAugmentation.class); + if (ovsdbTerminationPointAugmentation != null + && ovsdbTerminationPointAugmentation.getName().equals(portName)) { + return ovsdbTerminationPointAugmentation; + } + } + } + return null; + } } diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/NeutronL3Adapter.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/NeutronL3Adapter.java index df54c0a41..8eb166715 100644 --- a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/NeutronL3Adapter.java +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/NeutronL3Adapter.java @@ -27,6 +27,7 @@ import org.opendaylight.ovsdb.schema.openvswitch.Bridge; import org.opendaylight.ovsdb.schema.openvswitch.Interface; import org.opendaylight.ovsdb.utils.config.ConfigProperties; import org.opendaylight.ovsdb.utils.mdsal.node.StringConvertor; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import com.google.common.base.Preconditions; @@ -209,29 +210,17 @@ public class NeutronL3Adapter { // // Callbacks from OVSDB's southbound handler // - public void handleInterfaceEvent(final Node node, final Interface intf, final NeutronNetwork neutronNetwork, - Action action) { + public void handleInterfaceEvent(final Node node, final OvsdbTerminationPointAugmentation intf, + final NeutronNetwork neutronNetwork, Action action) { logger.debug("southbound interface {} node:{} interface:{}, neutronNetwork:{}", action, node, intf.getName(), neutronNetwork); if (!this.enabled) return; - // See if there is an external uuid, so we can find the respective neutronPort - Map externalIds = intf.getExternalIdsColumn().getData(); - if (externalIds == null) { - return; - } - String neutronPortId = externalIds.get(Constants.EXTERNAL_ID_INTERFACE_ID); - if (neutronPortId == null) { - return; - } - final NeutronPort neutronPort = neutronPortCache.getPort(neutronPortId); - if (neutronPort == null) { - logger.warn("southbound interface {} node:{} interface:{}, neutronNetwork:{} did not find port:{}", - action, node, intf.getName(), neutronNetwork, neutronPortId); - return; + NeutronPort neutronPort = tenantNetworkManager.getTenantPort(intf); + if (neutronPort != null) { + this.handleNeutronPortEvent(neutronPort, action); } - this.handleNeutronPortEvent(neutronPort, action); } // diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbConfigurationServiceImpl.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbConfigurationServiceImpl.java new file mode 100644 index 000000000..dbfa90138 --- /dev/null +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbConfigurationServiceImpl.java @@ -0,0 +1,87 @@ +package org.opendaylight.ovsdb.openstack.netvirt.impl; + +import java.util.List; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ExecutionException; +import org.opendaylight.ovsdb.lib.notation.Row; +import org.opendaylight.ovsdb.lib.notation.UUID; +import org.opendaylight.ovsdb.lib.schema.GenericTableSchema; +import org.opendaylight.ovsdb.lib.schema.typed.TypedBaseTable; +import org.opendaylight.ovsdb.openstack.netvirt.api.OvsdbConfigurationService; +import org.opendaylight.ovsdb.openstack.netvirt.api.OvsdbPluginException; +import org.opendaylight.ovsdb.openstack.netvirt.api.Status; +import org.opendaylight.ovsdb.openstack.netvirt.api.StatusWithUuid; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; + +public class OvsdbConfigurationServiceImpl implements OvsdbConfigurationService { + @Override + public StatusWithUuid insertRow(Node node, String tableName, String parentUuid, Row row) { + return null; + } + + @Override + public Status updateRow(Node node, String tableName, String parentUuid, String rowUuid, Row row) { + return null; + } + + @Override + public Status deleteRow(Node node, String tableName, String rowUuid) { + return null; + } + + @Override + public Row getRow(Node node, String tableName, String uuid) { + return null; + } + + @Override + public Row getRow(Node node, String databaseName, String tableName, UUID uuid) throws OvsdbPluginException { + return null; + } + + @Override + public ConcurrentMap getRows(Node node, String tableName) { + return null; + } + + @Override + public ConcurrentMap> getRows(Node node, String databaseName, String tableName) throws OvsdbPluginException { + return null; + } + + @Override + public ConcurrentMap> getRows(Node node, String databaseName, String tableName, String fiqlQuery) throws OvsdbPluginException { + return null; + } + + @Override + public List getTables(Node node) { + return null; + } + + @Override + public Boolean setOFController(Node node, String bridgeUUID) throws InterruptedException, ExecutionException { + return null; + } + + @Override + public > String getTableName(Node node, Class typedClass) { + return null; + } + + @Override + public > T getTypedRow(Node node, Class typedClass, Row row) { + return null; + } + + @Override + public > T createTypedRow(Node node, Class typedClass) { + return null; + } + + @Override + public ConcurrentMap getInterfaces(Node node) { + return null; + } +} diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbDataChangeListener.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbDataChangeListener.java index ff71536da..9ba81ff48 100644 --- a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbDataChangeListener.java +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbDataChangeListener.java @@ -1,19 +1,25 @@ package org.opendaylight.ovsdb.openstack.netvirt.impl; +import java.net.UnknownHostException; import java.util.Map; import java.util.Set; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; -import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.ovsdb.lib.OvsdbClient; import org.opendaylight.ovsdb.openstack.netvirt.api.OvsdbInventoryListener; import org.opendaylight.ovsdb.southbound.SouthboundConstants; +import org.opendaylight.ovsdb.southbound.SouthboundMapper; +import org.opendaylight.ovsdb.southbound.ovsdb.transact.TransactUtils; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; +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.OvsdbNodeAugmentation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfo; 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.TopologyId; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology; @@ -26,14 +32,13 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * Integration tests for southbound-impl + * MDSAL dataChangeListener for the OVSDB Southbound * * @author Sam Hague (shague@redhat.com) */ public class OvsdbDataChangeListener implements DataChangeListener, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(OvsdbDataChangeListener.class); private DataBroker dataBroker = null; - private static final TopologyId OVSDB_TOPOLOGY_ID = new TopologyId(new Uri("ovsdb:1")); private ListenerRegistration registration; public OvsdbDataChangeListener (DataBroker dataBroker) { @@ -45,7 +50,7 @@ public class OvsdbDataChangeListener implements DataChangeListener, AutoCloseabl .child(Node.class); registration = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, path, this, - AsyncDataBroker.DataChangeScope.SUBTREE); + DataChangeScope.SUBTREE); } @Override @@ -55,9 +60,30 @@ public class OvsdbDataChangeListener implements DataChangeListener, AutoCloseabl @Override public void onDataChanged(AsyncDataChangeEvent, DataObject> changes) { - for (Map.Entry, DataObject> created : changes.getCreatedData().entrySet()) { - if (created.getValue() instanceof Node) { + LOG.trace("onDataChanged: {}", changes); + + updateConnections(changes); + } + + private Node getOvsdbNode(ConnectionInfo connectionInfo) { + Node node = MdsalUtils.read(LogicalDatastoreType.OPERATIONAL, + SouthboundMapper.createInstanceIdentifier(connectionInfo)); + return node; + } + + public static Map,T> extractCreated( + AsyncDataChangeEvent, DataObject> changes,Class klazz) { + return TransactUtils.extractCreated(changes, klazz); + } + private void updateConnections(AsyncDataChangeEvent, DataObject> changes) { + for (Map.Entry, DataObject> created : changes.getCreatedData().entrySet()) { + // TODO validate we have the correct kind of InstanceIdentifier + if (created.getValue() instanceof OvsdbNodeAugmentation) { + Map,Node> nodeMap = TransactUtils.extractCreated(changes, Node.class); + for (Map.Entry, Node> ovsdbNode: nodeMap.entrySet()) { + notifyNodeAdded(ovsdbNode.getValue()); + } } } } diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbNode.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbSouthbound.java similarity index 68% rename from openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbNode.java rename to openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbSouthbound.java index f4e920347..edd300876 100644 --- a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbNode.java +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbSouthbound.java @@ -2,10 +2,15 @@ package org.opendaylight.ovsdb.openstack.netvirt.impl; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; -public class OvsdbNode { +public class OvsdbSouthbound { private Node node; + private Node bridge; - OvsdbNode(Node node) { + public Node getNode() { + return node; + } + + public void setNode(Node node) { this.node = node; } diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/TenantNetworkManagerImpl.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/TenantNetworkManagerImpl.java index bc5cfd8c0..133e46ca0 100644 --- a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/TenantNetworkManagerImpl.java +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/TenantNetworkManagerImpl.java @@ -17,13 +17,14 @@ import org.opendaylight.ovsdb.lib.notation.OvsdbSet; import org.opendaylight.ovsdb.lib.notation.Row; import org.opendaylight.ovsdb.openstack.netvirt.api.Constants; import org.opendaylight.ovsdb.openstack.netvirt.api.MdsalConsumer; -import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProviderManager; import org.opendaylight.ovsdb.openstack.netvirt.api.OvsdbConfigurationService; import org.opendaylight.ovsdb.openstack.netvirt.api.OvsdbConnectionService; import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager; import org.opendaylight.ovsdb.openstack.netvirt.api.VlanConfigurationCache; import org.opendaylight.ovsdb.schema.openvswitch.Interface; import org.opendaylight.ovsdb.schema.openvswitch.Port; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceExternalIds; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import com.google.common.base.Preconditions; @@ -55,13 +56,13 @@ public class TenantNetworkManagerImpl implements TenantNetworkManager { } @Override - public void reclaimInternalVlan(Node node, String portUUID, NeutronNetwork network) { + public void reclaimInternalVlan(Node node, NeutronNetwork network) { int vlan = vlanConfigurationCache.reclaimInternalVlan(node, network.getID()); if (vlan <= 0) { logger.debug("Unable to get an internalVlan for Network {}", network); return; } - logger.debug("Removed Vlan {} on {}", vlan, portUUID); + logger.debug("Removed Vlan {} on {}", vlan); } @Override @@ -169,6 +170,47 @@ public class TenantNetworkManagerImpl implements TenantNetworkManager { return neutronNetwork; } + @Override + public NeutronNetwork getTenantNetwork(OvsdbTerminationPointAugmentation terminationPointAugmentation) { + NeutronNetwork neutronNetwork = null; + logger.trace("getTenantNetwork for {}", terminationPointAugmentation.getName()); + String neutronPortId = MdsalUtils.getInterfaceExternalIdsValue(terminationPointAugmentation, + Constants.EXTERNAL_ID_INTERFACE_ID); + if (neutronPortId != null) { + NeutronPort neutronPort = neutronPortCache.getPort(neutronPortId); + if (neutronPort != null) { + neutronNetwork = neutronNetworkCache.getNetwork(neutronPort.getNetworkUUID()); + if (neutronNetwork != null) { + logger.debug("mapped to {}", neutronNetwork); + } + } + } + if (neutronNetwork != null) { + logger.debug("mapped to {}", neutronNetwork); + } else { + logger.warn("getTenantPort did not find network for {}", terminationPointAugmentation.getName()); + } + return neutronNetwork; + } + + @Override + public NeutronPort getTenantPort(OvsdbTerminationPointAugmentation terminationPointAugmentation) { + NeutronPort neutronPort = null; + logger.trace("getTenantPort for {}", terminationPointAugmentation.getName()); + String neutronPortId = MdsalUtils.getInterfaceExternalIdsValue(terminationPointAugmentation, + Constants.EXTERNAL_ID_INTERFACE_ID); + if (neutronPortId != null) { + neutronPort = neutronPortCache.getPort(neutronPortId); + } + if (neutronPort != null) { + logger.debug("mapped to {}", neutronPort); + } else { + logger.warn("getTenantPort did not find port for {}", terminationPointAugmentation.getName()); + } + + return neutronPort; + } + @Override public int networkCreated (Node node, String networkId) { return vlanConfigurationCache.assignInternalVlan(node, networkId); diff --git a/openstack/net-virt/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/impl/TenantNetworkManagerImplTest.java b/openstack/net-virt/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/impl/TenantNetworkManagerImplTest.java index 0646027ed..29cf58433 100644 --- a/openstack/net-virt/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/impl/TenantNetworkManagerImplTest.java +++ b/openstack/net-virt/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/impl/TenantNetworkManagerImplTest.java @@ -86,8 +86,9 @@ public class TenantNetworkManagerImplTest { public void testReclaimInternalVlan() { when(vlanConfigurationCache.reclaimInternalVlan(any(Node.class), eq(NETWORK_ID))).thenReturn(10); - tenantNetworkManagerImpl.reclaimInternalVlan(mock(Node.class), NETWORK_ID, mock(NeutronNetwork.class)); - tenantNetworkManagerImpl.reclaimInternalVlan(mock(Node.class), "unexistingNetwork", mock(NeutronNetwork.class)); + /* TODO SB_MIGRATION */ + //tenantNetworkManagerImpl.reclaimInternalVlan(mock(Node.class), NETWORK_ID, mock(NeutronNetwork.class)); + //tenantNetworkManagerImpl.reclaimInternalVlan(mock(Node.class), "unexistingNetwork", mock(NeutronNetwork.class)); verify(vlanConfigurationCache, times(2)).reclaimInternalVlan(any(Node.class), anyString()); } diff --git a/pom.xml b/pom.xml index 2bee7e7d2..d19d845ef 100644 --- a/pom.xml +++ b/pom.xml @@ -65,7 +65,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html southbound utils - integrationtest + -- 2.36.6