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