Merge "Fix bug 1028: Don't ignore exception in prepareInternalNetwork"
[ovsdb.git] / neutron / src / main / java / org / opendaylight / ovsdb / neutron / InternalNetworkManager.java
index b7148ecb399a5a22ff8223822608ee78e725e7c5..5ff7c18f5e3e52e2bbbdf5341c53e4c011c8f042 100644 (file)
@@ -23,7 +23,7 @@ import org.opendaylight.ovsdb.lib.table.Bridge;
 import org.opendaylight.ovsdb.lib.table.Interface;
 import org.opendaylight.ovsdb.lib.table.Port;
 import org.opendaylight.ovsdb.lib.table.internal.Table;
-import org.opendaylight.ovsdb.neutron.provider.ProviderNetworkManager;
+import org.opendaylight.ovsdb.neutron.provider.IProviderNetworkManager;
 import org.opendaylight.ovsdb.plugin.IConnectionServiceInternal;
 import org.opendaylight.ovsdb.plugin.OVSDBConfigService;
 import org.opendaylight.ovsdb.plugin.StatusWithUuid;
@@ -38,17 +38,16 @@ import org.slf4j.LoggerFactory;
  * Hence this class attempts to bring all the nodes to be eligible for OpenStack operations.
  *
  */
-public class InternalNetworkManager {
+public class InternalNetworkManager implements IInternalNetworkManager {
     static final Logger logger = LoggerFactory.getLogger(InternalNetworkManager.class);
     private static final int LLDP_PRIORITY = 1000;
     private static final int NORMAL_PRIORITY = 0;
 
-    private static InternalNetworkManager internalNetwork = new InternalNetworkManager();
-    private InternalNetworkManager() {
-    }
+    // The implementation for each of these services is resolved by the OSGi Service Manager
+    private volatile IAdminConfigManager adminConfigManager;
+    private volatile IProviderNetworkManager providerNetworkManager;
 
-    public static InternalNetworkManager getManager() {
-        return internalNetwork;
+    public InternalNetworkManager() {
     }
 
     public String getInternalBridgeUUID (Node node, String bridgeName) {
@@ -85,7 +84,7 @@ public class InternalNetworkManager {
     }
 
     public boolean isInternalNetworkNeutronReady(Node node) {
-        if (this.getInternalBridgeUUID(node, AdminConfigManager.getManager().getIntegrationBridgeName()) != null) {
+        if (this.getInternalBridgeUUID(node, adminConfigManager.getIntegrationBridgeName()) != null) {
             return true;
         } else {
             return false;
@@ -96,7 +95,7 @@ public class InternalNetworkManager {
         if (!this.isInternalNetworkNeutronReady(node)) {
             return false;
         }
-        if (this.getInternalBridgeUUID(node, AdminConfigManager.getManager().getNetworkBridgeName()) != null) {
+        if (this.getInternalBridgeUUID(node, adminConfigManager.getNetworkBridgeName()) != null) {
             return true;
         } else {
             return false;
@@ -123,9 +122,9 @@ public class InternalNetworkManager {
     public boolean isNetworkPatchCreated (Node node, Bridge intBridge, Bridge netBridge) {
         boolean isPatchCreated = false;
 
-        String portName = AdminConfigManager.getManager().getPatchToNetwork();
+        String portName = adminConfigManager.getPatchToNetwork();
         if (isPortOnBridge(node, intBridge, portName)) {
-            portName = AdminConfigManager.getManager().getPatchToIntegration();
+            portName = adminConfigManager.getPatchToIntegration();
             if (isPortOnBridge(node, netBridge, portName)) {
                 isPatchCreated = true;
             }
@@ -140,14 +139,18 @@ public class InternalNetworkManager {
      */
     public boolean isInternalNetworkTunnelReady (Node node) {
         /* Is br-int created? */
-        Bridge intBridge = this.getInternalBridge(node, AdminConfigManager.getManager().getIntegrationBridgeName());
+        Bridge intBridge = this.getInternalBridge(node, adminConfigManager.getIntegrationBridgeName());
         if (intBridge == null) {
             return false;
         }
 
-        if (ProviderNetworkManager.getManager().hasPerTenantTunneling()) {
+        if (providerNetworkManager == null) {
+            logger.error("Provider Network Manager is not available");
+            return false;
+        }
+        if (providerNetworkManager.getProvider().hasPerTenantTunneling()) {
             /* Is br-net created? */
-            Bridge netBridge = this.getInternalBridge(node, AdminConfigManager.getManager().getNetworkBridgeName());
+            Bridge netBridge = this.getInternalBridge(node, adminConfigManager.getNetworkBridgeName());
             if (netBridge == null) {
                 return false;
             }
@@ -166,15 +169,19 @@ public class InternalNetworkManager {
      */
     public boolean isInternalNetworkVlanReady (Node node, NeutronNetwork network) {
         /* is br-int created */
-        Bridge intBridge = this.getInternalBridge(node, AdminConfigManager.getManager().getIntegrationBridgeName());
+        Bridge intBridge = this.getInternalBridge(node, adminConfigManager.getIntegrationBridgeName());
         if (intBridge == null) {
             logger.trace("shague isInternalNetworkVlanReady: node: {}, br-int missing", node);
             return false;
         }
 
-        if (ProviderNetworkManager.getManager().hasPerTenantTunneling()) {
+        if (providerNetworkManager == null) {
+            logger.error("Provider Network Manager is not available");
+            return false;
+        }
+        if (providerNetworkManager.getProvider().hasPerTenantTunneling()) {
             /* is br-net created? */
-            Bridge netBridge = this.getInternalBridge(node, AdminConfigManager.getManager().getNetworkBridgeName());
+            Bridge netBridge = this.getInternalBridge(node, adminConfigManager.getNetworkBridgeName());
 
             if (netBridge == null) {
                 logger.trace("shague isInternalNetworkVlanReady: node: {}, br-net missing", node);
@@ -187,13 +194,13 @@ public class InternalNetworkManager {
             }
 
             /* Check if physical device is added to br-net. */
-            String phyNetName = AdminConfigManager.getManager().getPhysicalInterfaceName(node, network.getProviderPhysicalNetwork());
+            String phyNetName = adminConfigManager.getPhysicalInterfaceName(node, network.getProviderPhysicalNetwork());
             if (isPortOnBridge(node, netBridge, phyNetName)) {
                 return true;
             }
         } else {
             /* Check if physical device is added to br-int. */
-            String phyNetName = AdminConfigManager.getManager().getPhysicalInterfaceName(node, network.getProviderPhysicalNetwork());
+            String phyNetName = adminConfigManager.getPhysicalInterfaceName(node, network.getProviderPhysicalNetwork());
             if (isPortOnBridge(node, intBridge, phyNetName)) {
                 return true;
             }
@@ -212,7 +219,7 @@ public class InternalNetworkManager {
                     type: internal
      */
     public void createIntegrationBridge (Node node) throws Exception {
-        String brInt = AdminConfigManager.getManager().getIntegrationBridgeName();
+        String brInt = adminConfigManager.getIntegrationBridgeName();
 
         Status status = this.addInternalBridge(node, brInt, null, null);
         if (!status.isSuccess()) {
@@ -280,11 +287,15 @@ public class InternalNetworkManager {
 
         logger.debug("createNetNetwork: node: {}, network type: {}", node, network.getProviderNetworkType());
 
-        if (ProviderNetworkManager.getManager().hasPerTenantTunneling()) { /* indicates OF 1.0 */
-            String brInt = AdminConfigManager.getManager().getIntegrationBridgeName();
-            String brNet = AdminConfigManager.getManager().getNetworkBridgeName();
-            String patchNet = AdminConfigManager.getManager().getPatchToNetwork();
-            String patchInt = AdminConfigManager.getManager().getPatchToIntegration();
+        if (providerNetworkManager == null) {
+            logger.error("Provider Network Manager is not available");
+            return false;
+        }
+        if (providerNetworkManager.getProvider().hasPerTenantTunneling()) { /* indicates OF 1.0 */
+            String brInt = adminConfigManager.getIntegrationBridgeName();
+            String brNet = adminConfigManager.getNetworkBridgeName();
+            String patchNet = adminConfigManager.getPatchToNetwork();
+            String patchInt = adminConfigManager.getPatchToIntegration();
 
             status = this.addInternalBridge(node, brInt, patchNet, patchInt);
             if (!status.isSuccess()) {
@@ -299,7 +310,7 @@ public class InternalNetworkManager {
 
             /* For vlan network types add physical port to br-net. */
             if (network.getProviderNetworkType().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VLAN)) {
-                String phyNetName = AdminConfigManager.getManager().getPhysicalInterfaceName(node, network.getProviderPhysicalNetwork());
+                String phyNetName = adminConfigManager.getPhysicalInterfaceName(node, network.getProviderPhysicalNetwork());
                 status = addPortToBridge(node, brNet, phyNetName);
                 if (!status.isSuccess()) {
                     logger.debug("Add Port {} to Bridge {} Status: {}", phyNetName, brNet, status);
@@ -307,7 +318,7 @@ public class InternalNetworkManager {
                 }
             }
         } else {
-            String brInt = AdminConfigManager.getManager().getIntegrationBridgeName();
+            String brInt = adminConfigManager.getIntegrationBridgeName();
             status = this.addInternalBridge(node, brInt, null, null);
             if (!status.isSuccess()) {
                 logger.debug("{} Bridge Creation Status: {}", brInt, status);
@@ -316,7 +327,7 @@ public class InternalNetworkManager {
 
             /* For vlan network types add physical port to br-int. */
             if (network.getProviderNetworkType().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VLAN)) {
-                String phyNetName = AdminConfigManager.getManager().getPhysicalInterfaceName(node, network.getProviderPhysicalNetwork());
+                String phyNetName = adminConfigManager.getPhysicalInterfaceName(node, network.getProviderPhysicalNetwork());
                 status = addPortToBridge(node, brInt, phyNetName);
                 if (!status.isSuccess()) {
                     logger.debug("Add Port {} to Bridge {} Status: {}", phyNetName, brInt, status);
@@ -448,7 +459,11 @@ public class InternalNetworkManager {
         bridge.setFail_mode(failMode);
 
         OvsDBSet<String> protocols = new OvsDBSet<String>();
-        if (!ProviderNetworkManager.getManager().hasPerTenantTunneling()) {
+        if (providerNetworkManager == null) {
+            logger.error("Provider Network Manager is not available");
+            return new Status(StatusCode.INTERNALERROR);
+        }
+        if (!providerNetworkManager.getProvider().hasPerTenantTunneling()) {
             protocols.add("OpenFlow13");
         } else {
             protocols.add("OpenFlow10");
@@ -475,7 +490,7 @@ public class InternalNetworkManager {
         IConnectionServiceInternal connectionService = (IConnectionServiceInternal)ServiceHelper.getGlobalInstance(IConnectionServiceInternal.class, this);
         connectionService.setOFController(node, bridgeUUID);
 
-        if (localPatchName != null && remotePatchName != null && ProviderNetworkManager.getManager().hasPerTenantTunneling()) {
+        if (localPatchName != null && remotePatchName != null && providerNetworkManager.getProvider().hasPerTenantTunneling()) {
             return addPatchPort(node, bridgeUUID, localPatchName, remotePatchName);
         }
         return new Status(StatusCode.SUCCESS);
@@ -488,7 +503,11 @@ public class InternalNetworkManager {
             logger.error("Error creating internal network "+node.toString(), e);
             return;
         }
-        ProviderNetworkManager.getManager().initializeFlowRules(node);
+        if (providerNetworkManager == null) {
+            logger.error("Error creating internal network. Provider Network Manager unavailable");
+            return;
+        }
+        providerNetworkManager.getProvider().initializeFlowRules(node);
     }
 
     /*
@@ -497,9 +516,9 @@ public class InternalNetworkManager {
     public boolean checkAndCreateNetwork (Node node, NeutronNetwork network) {
         boolean isCreated = false;
         if (network.getProviderNetworkType().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VLAN)) {
-            if (!InternalNetworkManager.getManager().isInternalNetworkVlanReady(node, network)) {
+            if (!this.isInternalNetworkVlanReady(node, network)) {
                 try {
-                    isCreated = InternalNetworkManager.getManager().createNetNetwork(node, network);
+                    isCreated = this.createNetNetwork(node, network);
                 } catch (Exception e) {
                     logger.error("Error creating internal net network ", node, e);
                 }
@@ -508,9 +527,9 @@ public class InternalNetworkManager {
             }
         } else if (network.getProviderNetworkType().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VXLAN) ||
                 network.getProviderNetworkType().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_GRE)) {
-            if (!InternalNetworkManager.getManager().isInternalNetworkTunnelReady(node)) {
+            if (!this.isInternalNetworkTunnelReady(node)) {
                 try {
-                    isCreated = InternalNetworkManager.getManager().createNetNetwork(node, network);
+                    isCreated = this.createNetNetwork(node, network);
                 } catch (Exception e) {
                     logger.error("Error creating internal net network ", node, e);
                 }
@@ -518,7 +537,6 @@ public class InternalNetworkManager {
                 isCreated = true;
             }
         }
-
         return isCreated;
     }
-}
\ No newline at end of file
+}