Bug-3425 : VM doesn't get the ip address from DHCP 66/21366/2
authorAnil Vishnoi <vishnoianil@gmail.com>
Thu, 28 May 2015 19:56:35 +0000 (01:26 +0530)
committerFlavio Fernandes <ffernand@redhat.com>
Fri, 29 May 2015 20:27:02 +0000 (20:27 +0000)
server, if network is not attached to the router

This failure happens when net-virt don't find tunnel port in
the Node update from operational data store.
It tries to extract termination point from node update which
doesn't have tunnel port termination point. And because
there are other termination point exist, it doesn't go and
read from data store. ProgrammeTunnelPort() method iterate
through these existing termination points and it doesn't find the
tunnel port and it returns without installing the Local Ingress
Bridge Rules. This patch first try to create a tunnel configuration
on integration bridge of both end node of the tunnel and then
installs the tunnel flows. Also while installing tunnel flows
It specifically look for tunnel port in the nodes update and  if
it doesn't find that it reads it from data store.

Change-Id: I61e70c230051908a12f6ea93b9b2d046b699eccb
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/AbstractServiceInstance.java
openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/OF13Provider.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/MdsalHelper.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/Southbound.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/SouthboundImpl.java

index a07510d9936a5c867202c4e227710f417c966325..8bfa094cad8be69164ddc67222615a5b76fa95e8 100644 (file)
@@ -11,7 +11,6 @@ package org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13;
 
 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.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
@@ -80,7 +79,7 @@ public abstract class AbstractServiceInstance {
         this.southbound =
                 (Southbound) ServiceHelper.getGlobalInstance(Southbound.class, serviceInstance);
     }
-    
+
     public boolean isBridgeInPipeline (Node node){
         String bridgeName = southbound.getBridgeName(node);
         if (bridgeName != null && Constants.INTEGRATION_BRIDGE.equals(bridgeName)) {
@@ -145,7 +144,7 @@ public abstract class AbstractServiceInstance {
     protected void writeFlow(FlowBuilder flowBuilder, NodeBuilder nodeBuilder) {
         logger.debug("writeFlow: flowBuilder: {}, nodeBuilder: {}",
                 flowBuilder.build(), nodeBuilder.build());
-        ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
+        WriteTransaction modification = dataBroker.newWriteOnlyTransaction();
         modification.put(LogicalDatastoreType.CONFIGURATION, createNodePath(nodeBuilder),
                 nodeBuilder.build(), true /*createMissingParents*/);
         modification.put(LogicalDatastoreType.CONFIGURATION, createFlowPath(flowBuilder, nodeBuilder),
@@ -155,7 +154,6 @@ public abstract class AbstractServiceInstance {
         try {
             commitFuture.get();  // TODO: Make it async (See bug 1362)
             logger.debug("Transaction success for write of Flow "+flowBuilder.getFlowName());
-            Thread.sleep(500);
         } catch (Exception e) {
             logger.error(e.getMessage(), e);
             modification.cancel();
index 8b94fa24522a5d9cd673aedd8d4ae6f766e17467..6cc8a34b1eda01df6d4a3c62d98c6e0fd2e57ff4 100644 (file)
@@ -723,7 +723,7 @@ public class OF13Provider implements ConfigInterface, NetworkingProvider {
 
             long localPort = southbound.getOFPort(intf);
             if (localPort == 0) {
-                logger.info("programLocalRules: could not find ofPort");
+                logger.info("programLocalRules: could not find ofPort for Port {} on Node {}",intf.getName(), node.getNodeId());
                 return;
             }
 
@@ -809,7 +809,7 @@ public class OF13Provider implements ConfigInterface, NetworkingProvider {
                                      OvsdbTerminationPointAugmentation intf, boolean local) {
         logger.debug("programTunnelRules: node: {}, intf: {}, local: {}, tunnelType: {}, "
                 + "segmentationId: {}, dstAddr: {}",
-                node.getNodeId(), intf.getName(), local, tunnelType, segmentationId, dst);
+                node.getNodeId(), intf.getName(), local, tunnelType, segmentationId, dst.getHostAddress());
         try {
             Long dpid = getIntegrationBridgeOFDPID(node);
             if (dpid == 0L) {
@@ -819,7 +819,7 @@ public class OF13Provider implements ConfigInterface, NetworkingProvider {
 
             long localPort = southbound.getOFPort(intf);
             if (localPort == 0) {
-                logger.info("programTunnelRules: could not find ofPort");
+                logger.info("programTunnelRules: could not find ofPort for Port {} on Node{}",intf.getName(),node.getNodeId());
                 return;
             }
 
@@ -829,36 +829,34 @@ public class OF13Provider implements ConfigInterface, NetworkingProvider {
                 return;
             }
 
-            List<OvsdbTerminationPointAugmentation> intfs = southbound.getTerminationPointsOfBridge(node);
-            for (OvsdbTerminationPointAugmentation tunIntf : intfs) {
-                if (tunIntf.getName().equals(getTunnelName(tunnelType, dst))) {
-                    long tunnelOFPort = southbound.getOFPort(tunIntf);
-                    if (tunnelOFPort == 0) {
-                        logger.error("programTunnelRules: Could not Identify Tunnel port {} -> OF ({}) on {}",
-                                tunIntf.getName(), tunnelOFPort, node);
-                        return;
-                    }
-                    logger.debug("programTunnelRules: Identified Tunnel port {} -> OF ({}) on {}",
-                            tunIntf.getName(), tunnelOFPort, node);
+            OvsdbTerminationPointAugmentation tunnelPort= southbound.getTerminationPointsOfBridge(node,getTunnelName(tunnelType, dst));
+            if(tunnelPort != null){
+                long tunnelOFPort = southbound.getOFPort(tunnelPort);
+                if (tunnelOFPort == 0) {
+                    logger.error("programTunnelRules: Could not Identify Tunnel port {} -> OF ({}) on {}",
+                            tunnelPort.getName(), tunnelOFPort, node);
+                    return;
+                }
+                logger.debug("programTunnelRules: Identified Tunnel port {} -> OF ({}) on {}",
+                        tunnelPort.getName(), tunnelOFPort, node);
+
+                if (!local) {
+                    logger.trace("programTunnelRules: program remote egress tunnel rules: node {}, intf {}",
+                        node.getNodeId().getValue(), intf.getName());
+                    programRemoteEgressTunnelBridgeRules(node, dpid, segmentationId, attachedMac,
+                            tunnelOFPort, localPort);
+                }
 
-                    if (!local) {
-                        logger.trace("programTunnelRules: program remote egress tunnel rules: node {}, intf {}",
+                if (local) {
+                    logger.trace("programTunnelRules: program local ingress tunnel rules: node {}, intf {}",
                             node.getNodeId().getValue(), intf.getName());
-                        programRemoteEgressTunnelBridgeRules(node, dpid, segmentationId, attachedMac,
-                                tunnelOFPort, localPort);
-                    }
-
-                    if (local) {
-                        logger.trace("programTunnelRules: program local ingress tunnel rules: node {}, intf {}",
-                                node.getNodeId().getValue(), intf.getName());
-                        programLocalIngressTunnelBridgeRules(node, dpid, segmentationId, attachedMac,
-                                tunnelOFPort, localPort);
-                    }
-                    return;
+                    programLocalIngressTunnelBridgeRules(node, dpid, segmentationId, attachedMac,
+                            tunnelOFPort, localPort);
                 }
+                return;
             }
         } catch (Exception e) {
-            logger.error("", e);
+            logger.trace("", e);
         }
     }
 
@@ -1006,24 +1004,27 @@ public class OF13Provider implements ConfigInterface, NetworkingProvider {
             programVlanRules(network, srcNode, intf);
         } else if (networkType.equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_GRE)
                 || networkType.equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VXLAN)){
+
+            boolean sourceTunnelStatus = false;
+            boolean destTunnelStatus = false;
             for (Node dstNode : nodes.values()) {
                 InetAddress src = configurationService.getTunnelEndPoint(srcNode);
                 InetAddress dst = configurationService.getTunnelEndPoint(dstNode);
                 if ((src != null) && (dst != null)) {
-                    if (addTunnelPort(srcBridgeNode, networkType, src, dst)) {
-                        programTunnelRules(networkType, segmentationId, dst, srcBridgeNode, intf, true);
-                    }
+                    sourceTunnelStatus = addTunnelPort(srcBridgeNode, networkType, src, dst);
 
                     Node dstBridgeNode = southbound.getBridgeNode(dstNode,
                             configurationService.getIntegrationBridgeName());
-                    if (dstBridgeNode != null) {
-                        if (addTunnelPort(dstBridgeNode, networkType, dst, src)) {
-                            programTunnelRules(networkType, segmentationId, src, dstBridgeNode, intf, false);
-                        }
-                    } else {
-                        logger.warn("Destination bridge on node {} for tunnel end point not found. ovs node is {}",
-                                dst,
-                                (dstNode == null ? "null" : dstNode.getNodeId().getValue()));
+
+                    if(dstBridgeNode != null){
+                        destTunnelStatus = addTunnelPort(dstBridgeNode, networkType, dst, src);
+                    }
+
+                    if (sourceTunnelStatus) {
+                        programTunnelRules(networkType, segmentationId, dst, srcBridgeNode, intf, true);
+                    }
+                    if (destTunnelStatus) {
+                        programTunnelRules(networkType, segmentationId, src, dstBridgeNode, intf, false);
                     }
                 } else {
                     logger.warn("Tunnel end-point configuration missing. Please configure it in OpenVSwitch Table. "
index cc7aef1251d4158950ffea6e9cf96b5331ee68d3..38b1d5335eaa74ee5be55fd0c8ca326eeac52541 100644 (file)
@@ -9,8 +9,6 @@
 package org.opendaylight.ovsdb.openstack.netvirt;
 
 import com.google.common.base.Preconditions;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
 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.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeBase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeDpdk;
@@ -28,7 +26,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.re
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeSystem;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeTap;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeVxlan;
-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.OvsdbBridgeProtocolOpenflow10;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeProtocolOpenflow11;
@@ -39,7 +36,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.re
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbFailModeBase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbFailModeSecure;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbFailModeStandalone;
-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.NodeId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
index d09f5d6ff337f51dff50db336d8b6831f01ffa17..d1fc11fbd1052c186a511478bdac81ff6105f86c 100644 (file)
@@ -50,6 +50,7 @@ public interface Southbound {
     List<Node> getAllBridgesOnOvsdbNode(Node node);
     OvsdbNodeAugmentation extractNodeAugmentation(Node node);
     List<OvsdbTerminationPointAugmentation> getTerminationPointsOfBridge(Node node);
+    OvsdbTerminationPointAugmentation getTerminationPointsOfBridge(Node node, String terminationPoint);
     OvsdbTerminationPointAugmentation extractTerminationPointAugmentation(Node bridgeNode, String portName);
     List<TerminationPoint> extractTerminationPoints(Node node);
     List<OvsdbTerminationPointAugmentation> extractTerminationPointAugmentations(Node node);
index e1bcf24dcc906068e5c7b6ec5efde72392d25fe8..383e0c55dee7a2c4ae83318e68bd1891e67ece7c 100644 (file)
@@ -383,16 +383,33 @@ public class SouthboundImpl implements Southbound {
         return tpAugmentations;
     }
 
+    public OvsdbTerminationPointAugmentation getTerminationPointsOfBridge(Node node, String portName) {
+        OvsdbTerminationPointAugmentation tpAugmentation = extractTerminationPointAugmentation(node,portName);
+        if(tpAugmentation == null){
+            List<OvsdbTerminationPointAugmentation> tpAugmentations = readTerminationPointAugmentations(node);
+            if(tpAugmentations != null){
+                for(OvsdbTerminationPointAugmentation ovsdbTpAugmentation : tpAugmentations){
+                    if(ovsdbTpAugmentation.getName().equals(portName)){
+                        return ovsdbTpAugmentation;
+                    }
+                }
+            }
+        }
+        return tpAugmentation;
+    }
+
     public OvsdbTerminationPointAugmentation extractTerminationPointAugmentation(Node bridgeNode, String portName) {
         OvsdbBridgeAugmentation ovsdbBridgeAugmentation = bridgeNode.getAugmentation(OvsdbBridgeAugmentation.class);
         if (ovsdbBridgeAugmentation != null) {
             List<TerminationPoint> terminationPoints = bridgeNode.getTerminationPoint();
-            for(TerminationPoint terminationPoint : terminationPoints) {
-                OvsdbTerminationPointAugmentation ovsdbTerminationPointAugmentation =
-                        terminationPoint.getAugmentation( OvsdbTerminationPointAugmentation.class);
-                if (ovsdbTerminationPointAugmentation != null
-                        && ovsdbTerminationPointAugmentation.getName().equals(portName)) {
-                    return ovsdbTerminationPointAugmentation;
+            if(terminationPoints != null){
+                for(TerminationPoint terminationPoint : terminationPoints) {
+                    OvsdbTerminationPointAugmentation ovsdbTerminationPointAugmentation =
+                            terminationPoint.getAugmentation( OvsdbTerminationPointAugmentation.class);
+                    if (ovsdbTerminationPointAugmentation != null
+                            && ovsdbTerminationPointAugmentation.getName().equals(portName)) {
+                        return ovsdbTerminationPointAugmentation;
+                    }
                 }
             }
         }