mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Merge pull request #1827 from sateesh-chodapuneedi/pr-cloudstack-9673
CLOUDSTACK-9673 : Exception occured while creating the CPVM in VMware setup over standard vSwitchesJira === CLOUDSTACK-9673 : Exception occured while creating the CPVM in VMware setup over standard vSwitches Issue ==== Exception occured while creating the CPVM in the VmWare Setup using standard vswitches. ``` StartCommand failed due to Exception: com.vmware.vim25.AlreadyExists message: [] com.vmware.vim25.AlreadyExistsFaultMsg: The specified key, name, or identifier already exists ``` Fix === Ensure synchronization while attempting to create port group such that simultaneous attempts are not made with same port group name on same ESXi host. Testing ====== Successfully ran manual tests (deploy user instance) on top of latest master commit `17653a86fad67447a4f13e455e336694ad5c1735`.This code change is involved in virtual network creation over VMware standard vSwitches. Existing functional tests covers this functionality. * pr/1827: CLOUDSTACK-9673 Exception occured while creating the CPVM in the VmWare Setup over standard vSwitches Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
This commit is contained in:
commit
52f224f61d
@ -1125,11 +1125,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
|||||||
* so we assume that it's VLAN for now
|
* so we assume that it's VLAN for now
|
||||||
*/
|
*/
|
||||||
if (VirtualSwitchType.StandardVirtualSwitch == vSwitchType) {
|
if (VirtualSwitchType.StandardVirtualSwitch == vSwitchType) {
|
||||||
synchronized (vmMo.getRunningHost().getMor().getValue().intern()) {
|
networkInfo = HypervisorHostHelper.prepareNetwork(_publicTrafficInfo.getVirtualSwitchName(),
|
||||||
networkInfo =
|
"cloud.public", vmMo.getRunningHost(), vlanId, null, null,
|
||||||
HypervisorHostHelper.prepareNetwork(_publicTrafficInfo.getVirtualSwitchName(), "cloud.public", vmMo.getRunningHost(), vlanId, null, null,
|
|
||||||
_opsTimeout, true, BroadcastDomainType.Vlan, null);
|
_opsTimeout, true, BroadcastDomainType.Vlan, null);
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
networkInfo =
|
networkInfo =
|
||||||
HypervisorHostHelper.prepareNetwork(_publicTrafficInfo.getVirtualSwitchName(), "cloud.public", vmMo.getRunningHost(), vlanId, null, null, null,
|
HypervisorHostHelper.prepareNetwork(_publicTrafficInfo.getVirtualSwitchName(), "cloud.public", vmMo.getRunningHost(), vlanId, null, null, null,
|
||||||
@ -2852,11 +2850,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
|||||||
s_logger.info("Prepare network on " + switchType + " " + switchName + " with name prefix: " + namePrefix);
|
s_logger.info("Prepare network on " + switchType + " " + switchName + " with name prefix: " + namePrefix);
|
||||||
|
|
||||||
if (VirtualSwitchType.StandardVirtualSwitch == switchType) {
|
if (VirtualSwitchType.StandardVirtualSwitch == switchType) {
|
||||||
synchronized(hostMo.getMor().getValue().intern()) {
|
networkInfo = HypervisorHostHelper.prepareNetwork(switchName, namePrefix, hostMo,
|
||||||
networkInfo = HypervisorHostHelper.prepareNetwork(switchName, namePrefix, hostMo, getVlanInfo(nicTo, vlanToken), nicTo.getNetworkRateMbps(),
|
getVlanInfo(nicTo, vlanToken), nicTo.getNetworkRateMbps(), nicTo.getNetworkRateMulticastMbps(),
|
||||||
nicTo.getNetworkRateMulticastMbps(), _opsTimeout,
|
_opsTimeout, !namePrefix.startsWith("cloud.private"), nicTo.getBroadcastType(), nicTo.getUuid());
|
||||||
!namePrefix.startsWith("cloud.private"), nicTo.getBroadcastType(), nicTo.getUuid());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
String vlanId = getVlanInfo(nicTo, vlanToken);
|
String vlanId = getVlanInfo(nicTo, vlanToken);
|
||||||
|
|||||||
@ -1110,4 +1110,58 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
|
|||||||
}
|
}
|
||||||
return networkName;
|
return networkName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void createPortGroup(HostVirtualSwitch vSwitch, String portGroupName, Integer vlanId,
|
||||||
|
HostNetworkSecurityPolicy secPolicy, HostNetworkTrafficShapingPolicy shapingPolicy, long timeOutMs)
|
||||||
|
throws Exception {
|
||||||
|
assert (portGroupName != null);
|
||||||
|
|
||||||
|
// Prepare lock to avoid simultaneous execution of the synchronized block for
|
||||||
|
// duplicate port groups on the ESXi host it's being created on.
|
||||||
|
String hostPortGroup = _mor.getValue() + "-" + portGroupName;
|
||||||
|
synchronized (hostPortGroup.intern()) {
|
||||||
|
// Check if port group exists already
|
||||||
|
if (hasPortGroup(vSwitch, portGroupName)) {
|
||||||
|
if (s_logger.isDebugEnabled()) {
|
||||||
|
s_logger.debug("Found port group " + portGroupName + " in vSwitch " + vSwitch.getName()
|
||||||
|
+ ". Not attempting to create port group as it already exists.");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if (s_logger.isDebugEnabled()) {
|
||||||
|
s_logger.debug("Port group " + portGroupName + " doesn't exist in vSwitch " + vSwitch.getName()
|
||||||
|
+ ". Attempting to create port group in this vSwitch.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Create port group if not exists already
|
||||||
|
createPortGroup(vSwitch, portGroupName, vlanId, secPolicy, shapingPolicy);
|
||||||
|
|
||||||
|
// Wait for port group to turn up ready on vCenter upto timeout of timeOutMs milli seconds
|
||||||
|
waitForPortGroup(portGroupName, timeOutMs);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s_logger.isDebugEnabled()) {
|
||||||
|
s_logger.debug("Successfully created port group " + portGroupName + " in vSwitch " + vSwitch.getName()
|
||||||
|
+ " on host " + getHostName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ManagedObjectReference waitForPortGroup(String networkName, long timeOutMs) throws Exception {
|
||||||
|
ManagedObjectReference morNetwork = null;
|
||||||
|
// if portGroup is just created, getNetwork may fail to retrieve it, we
|
||||||
|
// need to retry
|
||||||
|
long startTick = System.currentTimeMillis();
|
||||||
|
while (System.currentTimeMillis() - startTick <= timeOutMs) {
|
||||||
|
morNetwork = getNetworkMor(networkName);
|
||||||
|
if (morNetwork != null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s_logger.isInfoEnabled()) {
|
||||||
|
s_logger.info("Waiting for network " + networkName + " to be ready");
|
||||||
|
}
|
||||||
|
Thread.sleep(1000);
|
||||||
|
}
|
||||||
|
return morNetwork;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1082,8 +1082,11 @@ public class HypervisorHostHelper {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!hostMo.hasPortGroup(vSwitch, networkName)) {
|
if (!hostMo.hasPortGroup(vSwitch, networkName)) {
|
||||||
hostMo.createPortGroup(vSwitch, networkName, vid, secPolicy, shapingPolicy);
|
hostMo.createPortGroup(vSwitch, networkName, vid, secPolicy, shapingPolicy, timeOutMs);
|
||||||
bWaitPortGroupReady = true;
|
// Setting flag "bWaitPortGroupReady" to false.
|
||||||
|
// This flag indicates whether we need to wait for portgroup on vCenter.
|
||||||
|
// Above createPortGroup() method itself ensures creation of portgroup as well as wait for portgroup.
|
||||||
|
bWaitPortGroupReady = false;
|
||||||
} else {
|
} else {
|
||||||
HostPortGroupSpec spec = hostMo.getPortGroupSpec(networkName);
|
HostPortGroupSpec spec = hostMo.getPortGroupSpec(networkName);
|
||||||
if (!isSpecMatch(spec, vid, shapingPolicy)) {
|
if (!isSpecMatch(spec, vid, shapingPolicy)) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user