diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java index 2edbcf5f87f..0ea881e41e9 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java @@ -18,6 +18,7 @@ import com.cloud.utils.db.GlobalLock; import com.cloud.utils.net.NetUtils; import com.vmware.vim25.DynamicProperty; import com.vmware.vim25.HostNetworkTrafficShapingPolicy; +import com.vmware.vim25.HostPortGroupSpec; import com.vmware.vim25.HostVirtualSwitch; import com.vmware.vim25.HttpNfcLeaseDeviceUrl; import com.vmware.vim25.HttpNfcLeaseInfo; @@ -117,13 +118,23 @@ public class HypervisorHostHelper { shapingPolicy.setBurstSize(5*shapingPolicy.getAverageBandwidth()/8); } - if (!hostMo.hasPortGroup(vSwitch, networkName)) { - hostMo.createPortGroup(vSwitch, networkName, vid, shapingPolicy); - } else { - hostMo.updatePortGroup(vSwitch, networkName, vid, shapingPolicy); - } - - ManagedObjectReference morNetwork = waitForNetworkReady(hostMo, networkName, timeOutMs); + boolean bWaitPortGroupReady = false; + if (!hostMo.hasPortGroup(vSwitch, networkName)) { + hostMo.createPortGroup(vSwitch, networkName, vid, shapingPolicy); + bWaitPortGroupReady = true; + } else { + HostPortGroupSpec spec = hostMo.getPortGroupSpec(networkName); + if(!isSpecMatch(spec, vid, shapingPolicy)) { + hostMo.updatePortGroup(vSwitch, networkName, vid, shapingPolicy); + bWaitPortGroupReady = true; + } + } + + ManagedObjectReference morNetwork; + if(bWaitPortGroupReady) + morNetwork = waitForNetworkReady(hostMo, networkName, timeOutMs); + else + morNetwork = hostMo.getNetworkMor(networkName); if (morNetwork == null) { String msg = "Failed to create public network on vSwitch " + vSwitchName; s_logger.error(msg); @@ -261,13 +272,23 @@ public class HypervisorHostHelper { shapingPolicy.setBurstSize(5*shapingPolicy.getAverageBandwidth()/8); } - if (!hostMo.hasPortGroup(vSwitch, networkName)) { - hostMo.createPortGroup(vSwitch, networkName, vid, shapingPolicy); - } else { - hostMo.updatePortGroup(vSwitch, networkName, vid, shapingPolicy); - } - - ManagedObjectReference morNetwork = waitForNetworkReady(hostMo, networkName, timeOutMs); + boolean bWaitPortGroupReady = false; + if (!hostMo.hasPortGroup(vSwitch, networkName)) { + hostMo.createPortGroup(vSwitch, networkName, vid, shapingPolicy); + bWaitPortGroupReady = true; + } else { + HostPortGroupSpec spec = hostMo.getPortGroupSpec(networkName); + if(!isSpecMatch(spec, vid, shapingPolicy)) { + hostMo.updatePortGroup(vSwitch, networkName, vid, shapingPolicy); + bWaitPortGroupReady = true; + } + } + + ManagedObjectReference morNetwork; + if(bWaitPortGroupReady) + morNetwork = waitForNetworkReady(hostMo, networkName, timeOutMs); + else + morNetwork = hostMo.getNetworkMor(networkName); if (morNetwork == null) { String msg = "Failed to create guest network " + networkName; s_logger.error(msg); @@ -316,7 +337,44 @@ public class HypervisorHostHelper { s_logger.info("Network " + networkName + " is ready on vSwitch " + vSwitchName); return new Pair(morNetwork, networkName); - } + } + + private static boolean isSpecMatch(HostPortGroupSpec spec, Integer vlanId, HostNetworkTrafficShapingPolicy shapingPolicy) { + // check VLAN configuration + if(vlanId != null) { + if(vlanId.intValue() != spec.getVlanId()) + return false; + } else { + if(spec.getVlanId() != 0) + return false; + } + + // check traffic shaping configuration + HostNetworkTrafficShapingPolicy policyInSpec = null; + if(spec.getPolicy() != null) + policyInSpec = spec.getPolicy().getShapingPolicy(); + + if(policyInSpec != null && shapingPolicy == null || policyInSpec == null && shapingPolicy != null) + return false; + + if(policyInSpec == null && shapingPolicy == null) + return true; + + // so far policyInSpec and shapingPolicy should both not be null + if(policyInSpec.getEnabled() == null || !policyInSpec.getEnabled().booleanValue()) + return false; + + if(policyInSpec.getAverageBandwidth() == null || policyInSpec.getAverageBandwidth().longValue() != shapingPolicy.getAverageBandwidth().longValue()) + return false; + + if(policyInSpec.getPeakBandwidth() == null || policyInSpec.getPeakBandwidth().longValue() != shapingPolicy.getPeakBandwidth().longValue()) + return false; + + if(policyInSpec.getBurstSize() == null || policyInSpec.getBurstSize().longValue() != shapingPolicy.getBurstSize().longValue()) + return false; + + return true; + } public static ManagedObjectReference waitForNetworkReady(HostMO hostMo, String networkName, long timeOutMs) throws Exception {