I ran the master branch with my NetworkElement integrated which provides DHCP 
service. In my use case I was able to create a VM but when I deleted it there 
was an exception in the NetworkManager when it called:

isDhcpAccrossMultipleSubnetsSupported() >> getDhcpServiceProvider()


My DHCP Provider is a NetworkElement but does not implement the 
DhcpServiceProvider interface.


   public DhcpServiceProvider getDhcpServiceProvider(Network network) {

        String DhcpProvider = 
_ntwkSrvcDao.getProviderForServiceInNetwork(network.getId(), Service.Dhcp);


        if (DhcpProvider == null) {

            s_logger.debug("Network " + network + " doesn't support service " + 
Service.Dhcp.getName());

            return null;

        }


        return 
(DhcpServiceProvider)_networkModel.getElementImplementingProvider(DhcpProvider);


    }


There is a check in the NetworkManager in the Prepare stage but a similar check 
is missing in Release stage. Below is a patch to the problem for you to review. 
I tested it in my environment:


diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java 
b/server/src/com/cloud/network/NetworkManagerImpl.java

index ae27554..073cb95 100755

--- a/server/src/com/cloud/network/NetworkManagerImpl.java

+++ b/server/src/com/cloud/network/NetworkManagerImpl.java

@@ -1568,7 +1568,9 @@ public class NetworkManagerImpl extends ManagerBase 
implements NetworkManager, L

         }


         // remove the dhcpservice ip if this is the last nic in subnet.

-        if (vm.getType() == Type.User && 
isDhcpAccrossMultipleSubnetsSupported(network) && isLastNicInSubnet(nic) &&

+        DhcpServiceProvider dhcpServiceProvider = 
getDhcpServiceProvider(network);

+        if (dhcpServiceProvider != null &&

+                       vm.getType() == Type.User && 
isDhcpAccrossMultipleSubnetsSupported(dhcpServiceProvider) && 
isLastNicInSubnet(nic) &&

                    network.getTrafficType() == TrafficType.Guest && 
network.getGuestType() == GuestType.Shared) {

             removeDhcpServiceInSubnet(nic);

         }

@@ -1582,8 +1584,7 @@ public class NetworkManagerImpl extends ManagerBase 
implements NetworkManager, L

         }

     }


-    public boolean isDhcpAccrossMultipleSubnetsSupported(Network network) {

-        DhcpServiceProvider dhcpServiceProvider = 
getDhcpServiceProvider(network);

+    public boolean isDhcpAccrossMultipleSubnetsSupported(DhcpServiceProvider 
dhcpServiceProvider) {

         Map <Network.Capability, String> capabilities = 
dhcpServiceProvider.getCapabilities().get(Network.Service.Dhcp);

         String supportsMultipleSubnets = 
capabilities.get(Network.Capability.DhcpAccrossMultipleSubnets);

         if (supportsMultipleSubnets != null && 
Boolean.valueOf(supportsMultipleSubnets)) {

@@ -2448,7 +2449,12 @@ public class NetworkManagerImpl extends ManagerBase 
implements NetworkManager, L

             return null;

         }


-        return 
(DhcpServiceProvider)_networkModel.getElementImplementingProvider(DhcpProvider);

+        NetworkElement element = 
_networkModel.getElementImplementingProvider(DhcpProvider);

+        if ( element instanceof DhcpServiceProvider ) {

+               return 
(DhcpServiceProvider)_networkModel.getElementImplementingProvider(DhcpProvider);

+        } else {

+               return null;

+        }


     }



-Soheil


Reply via email to