You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ah...@apache.org on 2013/06/27 22:57:38 UTC
[36/50] [abbrv] git commit: updated refs/heads/vmsync to 3c2aa18
CLOUDSTACK-728 For Nicira NVP a specified port-group must be used,
instead of a dynamically configured one.
Refactor bits of the HypervisorHostHelper to better
support multiple BroadcastDomainTypes
Cleanup some parts of the code that was using tab indents and removed some dead code.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/98dc68d8
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/98dc68d8
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/98dc68d8
Branch: refs/heads/vmsync
Commit: 98dc68d8c9f6d4ea788652582cf9df611d18ffa3
Parents: 079f920
Author: Hugo Trippaers <ht...@schubergphilis.com>
Authored: Sat Jun 22 15:06:25 2013 -0700
Committer: Hugo Trippaers <ht...@schubergphilis.com>
Committed: Wed Jun 26 15:41:52 2013 -0700
----------------------------------------------------------------------
.../vmware/manager/VmwareManagerImpl.java | 4 +-
.../vmware/resource/VmwareResource.java | 82 +-
vmware-base/pom.xml | 5 +
.../vmware/mo/HypervisorHostHelper.java | 1088 ++++++++++--------
4 files changed, 599 insertions(+), 580 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/98dc68d8/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
index 06451d8..fd99561 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
@@ -92,6 +92,7 @@ import com.cloud.hypervisor.vmware.util.VmwareContext;
import com.cloud.hypervisor.vmware.util.VmwareHelper;
import com.cloud.network.CiscoNexusVSMDeviceVO;
import com.cloud.network.NetworkModel;
+import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.network.dao.CiscoNexusVSMDeviceDao;
import com.cloud.org.Cluster.ClusterType;
import com.cloud.secstorage.CommandExecLogDao;
@@ -346,7 +347,8 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
}
}
s_logger.info("Preparing network on host " + hostMo.getContext().toString() + " for " + privateTrafficLabel);
- HypervisorHostHelper.prepareNetwork(vSwitchName, "cloud.private", hostMo, vlanId, null, null, 180000, false);
+ //The management network is probably always going to be a physical network with vlans, so assume BroadcastDomainType VLAN
+ HypervisorHostHelper.prepareNetwork(vSwitchName, "cloud.private", hostMo, vlanId, null, null, 180000, false, BroadcastDomainType.Vlan);
}
@Override
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/98dc68d8/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index d860383..80e87e9 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -229,6 +229,7 @@ import com.cloud.network.HAProxyConfigurator;
import com.cloud.network.LoadBalancerConfigurator;
import com.cloud.network.Networks;
import com.cloud.network.Networks.BroadcastDomainType;
+import com.cloud.network.Networks.IsolationType;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.VmwareTrafficLabel;
import com.cloud.network.rules.FirewallRule;
@@ -1787,12 +1788,15 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
if (_publicTrafficInfo != null) {
vSwitchType = _publicTrafficInfo.getVirtualSwitchType();
}
+ /** FIXME We have no clue which network this nic is on and that means that we can't figure out the BroadcastDomainType
+ * so we assume that it's VLAN for now
+ */
if (VirtualSwitchType.StandardVirtualSwitch == vSwitchType) {
networkInfo = HypervisorHostHelper.prepareNetwork(_publicTrafficInfo.getVirtualSwitchName(), "cloud.public",
- vmMo.getRunningHost(), vlanId, null, null, _ops_timeout, true);
+ vmMo.getRunningHost(), vlanId, null, null, _ops_timeout, true, BroadcastDomainType.Vlan);
} else {
- networkInfo = HypervisorHostHelper.prepareNetwork(this._publicTrafficInfo.getVirtualSwitchName(), "cloud.public",
- vmMo.getRunningHost(), vlanId, null, null, null, this._ops_timeout, vSwitchType, _portsPerDvPortGroup, null, false);
+ networkInfo = HypervisorHostHelper.prepareNetwork(_publicTrafficInfo.getVirtualSwitchName(), "cloud.public",
+ vmMo.getRunningHost(), vlanId, null, null, null, _ops_timeout, vSwitchType, _portsPerDvPortGroup, null, false, BroadcastDomainType.Vlan);
}
int nicIndex = allocPublicNicIndex(vmMo);
@@ -2953,7 +2957,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
if (VirtualSwitchType.StandardVirtualSwitch == switchType) {
networkInfo = HypervisorHostHelper.prepareNetwork(switchName.first(), namePrefix,
hostMo, getVlanInfo(nicTo, switchName.second()), nicTo.getNetworkRateMbps(), nicTo.getNetworkRateMulticastMbps(), _ops_timeout,
- !namePrefix.startsWith("cloud.private"));
+ !namePrefix.startsWith("cloud.private"), nicTo.getBroadcastType());
}
else {
String vlanId = getVlanInfo(nicTo, switchName.second());
@@ -2967,7 +2971,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
svlanId = getPvlanInfo(nicTo);
}
networkInfo = HypervisorHostHelper.prepareNetwork(switchName.first(), namePrefix, hostMo, vlanId, svlanId,
- nicTo.getNetworkRateMbps(), nicTo.getNetworkRateMulticastMbps(), _ops_timeout, switchType, _portsPerDvPortGroup, nicTo.getGateway(), configureVServiceInNexus);
+ nicTo.getNetworkRateMbps(), nicTo.getNetworkRateMulticastMbps(), _ops_timeout, switchType,
+ _portsPerDvPortGroup, nicTo.getGateway(), configureVServiceInNexus, nicTo.getBroadcastType());
}
return networkInfo;
@@ -5329,73 +5334,6 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
return VirtualMachineGuestOsIdentifier.OTHER_GUEST;
}
- private void prepareNetworkForVmTargetHost(HostMO hostMo, VirtualMachineMO vmMo) throws Exception {
- assert (vmMo != null);
- assert (hostMo != null);
-
- String[] networks = vmMo.getNetworks();
- for (String networkName : networks) {
- HostPortGroupSpec portGroupSpec = hostMo.getHostPortGroupSpec(networkName);
- HostNetworkTrafficShapingPolicy shapingPolicy = null;
- if (portGroupSpec != null) {
- shapingPolicy = portGroupSpec.getPolicy().getShapingPolicy();
- }
-
- if (networkName.startsWith("cloud.private")) {
- String[] tokens = networkName.split("\\.");
- if (tokens.length == 3) {
- Integer networkRateMbps = null;
- if (shapingPolicy != null && shapingPolicy.isEnabled() != null && shapingPolicy.isEnabled().booleanValue()) {
- networkRateMbps = (int) (shapingPolicy.getPeakBandwidth().longValue() / (1024 * 1024));
- }
- String vlanId = null;
- if(!"untagged".equalsIgnoreCase(tokens[2]))
- vlanId = tokens[2];
-
- HypervisorHostHelper.prepareNetwork(_privateNetworkVSwitchName, "cloud.private",
- hostMo, vlanId, networkRateMbps, null, _ops_timeout, false);
- } else {
- s_logger.info("Skip suspecious cloud network " + networkName);
- }
- } else if (networkName.startsWith("cloud.public")) {
- String[] tokens = networkName.split("\\.");
- if (tokens.length == 3) {
- Integer networkRateMbps = null;
- if (shapingPolicy != null && shapingPolicy.isEnabled() != null && shapingPolicy.isEnabled().booleanValue()) {
- networkRateMbps = (int) (shapingPolicy.getPeakBandwidth().longValue() / (1024 * 1024));
- }
- String vlanId = null;
- if(!"untagged".equalsIgnoreCase(tokens[2]))
- vlanId = tokens[2];
-
- HypervisorHostHelper.prepareNetwork(_publicTrafficInfo.getVirtualSwitchName(), "cloud.public",
- hostMo, vlanId, networkRateMbps, null, _ops_timeout, false);
- } else {
- s_logger.info("Skip suspecious cloud network " + networkName);
- }
- } else if (networkName.startsWith("cloud.guest")) {
- String[] tokens = networkName.split("\\.");
- if (tokens.length >= 3) {
- Integer networkRateMbps = null;
- if (shapingPolicy != null && shapingPolicy.isEnabled() != null && shapingPolicy.isEnabled().booleanValue()) {
- networkRateMbps = (int) (shapingPolicy.getPeakBandwidth().longValue() / (1024 * 1024));
- }
-
- String vlanId = null;
- if(!"untagged".equalsIgnoreCase(tokens[2]))
- vlanId = tokens[2];
-
- HypervisorHostHelper.prepareNetwork(_guestTrafficInfo.getVirtualSwitchName(), "cloud.guest",
- hostMo, vlanId, networkRateMbps, null, _ops_timeout, false);
- } else {
- s_logger.info("Skip suspecious cloud network " + networkName);
- }
- } else {
- s_logger.info("Skip non-cloud network " + networkName + " when preparing target host");
- }
- }
- }
-
private HashMap<String, State> getVmStates() throws Exception {
VmwareHypervisorHost hyperHost = getHyperHost(getServiceContext());
ObjectContent[] ocs = hyperHost.getVmPropertiesOnHyperHost(new String[] { "name", "runtime.powerState", "config.template" });
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/98dc68d8/vmware-base/pom.xml
----------------------------------------------------------------------
diff --git a/vmware-base/pom.xml b/vmware-base/pom.xml
index da4fb21..c5d555e 100644
--- a/vmware-base/pom.xml
+++ b/vmware-base/pom.xml
@@ -33,6 +33,11 @@
<version>${project.version}</version>
</dependency>
<dependency>
+ <groupId>org.apache.cloudstack</groupId>
+ <artifactId>cloud-api</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>${cs.gson.version}</version>
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/98dc68d8/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
----------------------------------------------------------------------
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 994fb30..9df7bc3 100755
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
@@ -19,7 +19,9 @@ package com.cloud.hypervisor.vmware.mo;
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
+import java.security.InvalidParameterException;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -27,6 +29,7 @@ import org.apache.log4j.Logger;
import com.cloud.hypervisor.vmware.util.VmwareContext;
import com.cloud.hypervisor.vmware.util.VmwareHelper;
+import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.utils.ActionDelegate;
import com.cloud.utils.Pair;
import com.cloud.utils.cisco.n1kv.vsm.NetconfHelper;
@@ -60,7 +63,6 @@ import com.vmware.vim25.ObjectContent;
import com.vmware.vim25.OvfCreateImportSpecParams;
import com.vmware.vim25.OvfCreateImportSpecResult;
import com.vmware.vim25.OvfFileItem;
-import com.vmware.vim25.TaskInfo;
import com.vmware.vim25.VMwareDVSConfigSpec;
import com.vmware.vim25.VMwareDVSPortSetting;
import com.vmware.vim25.VMwareDVSPvlanConfigSpec;
@@ -70,7 +72,6 @@ import com.vmware.vim25.VirtualDeviceConfigSpecOperation;
import com.vmware.vim25.VirtualLsiLogicController;
import com.vmware.vim25.VirtualMachineConfigSpec;
import com.vmware.vim25.VirtualMachineFileInfo;
-import com.vmware.vim25.VirtualMachineRelocateSpec;
import com.vmware.vim25.VirtualMachineVideoCard;
import com.vmware.vim25.VirtualSCSISharing;
import com.vmware.vim25.VmwareDistributedVirtualSwitchPvlanSpec;
@@ -85,73 +86,73 @@ public class HypervisorHostHelper {
// make vmware-base loosely coupled with cloud-specific stuff, duplicate VLAN.UNTAGGED constant here
private static final String UNTAGGED_VLAN_NAME = "untagged";
- public static VirtualMachineMO findVmFromObjectContent(VmwareContext context,
- ObjectContent[] ocs, String name) {
-
- if(ocs != null && ocs.length > 0) {
- for(ObjectContent oc : ocs) {
- DynamicProperty prop = oc.getPropSet().get(0);
- assert(prop != null);
- if(prop.getVal().toString().equals(name))
- return new VirtualMachineMO(context, oc.getObj());
- }
- }
- return null;
- }
-
- public static ManagedObjectReference findDatastoreWithBackwardsCompatibility(VmwareHypervisorHost hyperHost, String uuidName) throws Exception {
- ManagedObjectReference morDs = hyperHost.findDatastore(uuidName.replace("-", ""));
- if(morDs == null)
- morDs = hyperHost.findDatastore(uuidName);
-
- return morDs;
- }
-
- public static DatastoreMO getHyperHostDatastoreMO(VmwareHypervisorHost hyperHost, String datastoreName) throws Exception {
- ObjectContent[] ocs = hyperHost.getDatastorePropertiesOnHyperHost(new String[] { "name"} );
- if(ocs != null && ocs.length > 0) {
- for(ObjectContent oc : ocs) {
- List<DynamicProperty> objProps = oc.getPropSet();
- if(objProps != null) {
- for(DynamicProperty objProp : objProps) {
- if(objProp.getVal().toString().equals(datastoreName))
- return new DatastoreMO(hyperHost.getContext(), oc.getObj());
- }
- }
- }
- }
- return null;
- }
-
- public static String getPublicNetworkNamePrefix(String vlanId) {
- if (UNTAGGED_VLAN_NAME.equalsIgnoreCase(vlanId)) {
- return "cloud.public.untagged";
- } else {
- return "cloud.public." + vlanId;
- }
- }
+ public static VirtualMachineMO findVmFromObjectContent(VmwareContext context,
+ ObjectContent[] ocs, String name) {
+
+ if(ocs != null && ocs.length > 0) {
+ for(ObjectContent oc : ocs) {
+ DynamicProperty prop = oc.getPropSet().get(0);
+ assert(prop != null);
+ if(prop.getVal().toString().equals(name))
+ return new VirtualMachineMO(context, oc.getObj());
+ }
+ }
+ return null;
+ }
+
+ public static ManagedObjectReference findDatastoreWithBackwardsCompatibility(VmwareHypervisorHost hyperHost, String uuidName) throws Exception {
+ ManagedObjectReference morDs = hyperHost.findDatastore(uuidName.replace("-", ""));
+ if(morDs == null)
+ morDs = hyperHost.findDatastore(uuidName);
+
+ return morDs;
+ }
+
+ public static DatastoreMO getHyperHostDatastoreMO(VmwareHypervisorHost hyperHost, String datastoreName) throws Exception {
+ ObjectContent[] ocs = hyperHost.getDatastorePropertiesOnHyperHost(new String[] { "name"} );
+ if(ocs != null && ocs.length > 0) {
+ for(ObjectContent oc : ocs) {
+ List<DynamicProperty> objProps = oc.getPropSet();
+ if(objProps != null) {
+ for(DynamicProperty objProp : objProps) {
+ if(objProp.getVal().toString().equals(datastoreName))
+ return new DatastoreMO(hyperHost.getContext(), oc.getObj());
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ public static String getPublicNetworkNamePrefix(String vlanId) {
+ if (UNTAGGED_VLAN_NAME.equalsIgnoreCase(vlanId)) {
+ return "cloud.public.untagged";
+ } else {
+ return "cloud.public." + vlanId;
+ }
+ }
public static String composeCloudNetworkName(String prefix, String vlanId, String svlanId, Integer networkRateMbps, String vSwitchName) {
- StringBuffer sb = new StringBuffer(prefix);
+ StringBuffer sb = new StringBuffer(prefix);
if(vlanId == null || UNTAGGED_VLAN_NAME.equalsIgnoreCase(vlanId)) {
- sb.append(".untagged");
+ sb.append(".untagged");
} else {
- sb.append(".").append(vlanId);
+ sb.append(".").append(vlanId);
if (svlanId != null) {
sb.append(".").append("s" + svlanId);
}
}
- if(networkRateMbps != null && networkRateMbps.intValue() > 0)
- sb.append(".").append(String.valueOf(networkRateMbps));
- else
- sb.append(".0");
- sb.append(".").append(VersioningContants.PORTGROUP_NAMING_VERSION);
- sb.append("-").append(vSwitchName);
+ if(networkRateMbps != null && networkRateMbps.intValue() > 0)
+ sb.append(".").append(String.valueOf(networkRateMbps));
+ else
+ sb.append(".0");
+ sb.append(".").append(VersioningContants.PORTGROUP_NAMING_VERSION);
+ sb.append("-").append(vSwitchName);
- return sb.toString();
- }
+ return sb.toString();
+ }
public static Map<String, String> getValidatedVsmCredentials(VmwareContext context) throws Exception {
Map<String, String> vsmCredentials = context.getStockObject("vsmcredentials");
@@ -234,8 +235,8 @@ public class HypervisorHostHelper {
+ ". Exception: " + e.toString();
s_logger.error(msg);
if(netconfClient != null) {
- netconfClient.disconnect();
- s_logger.debug("Disconnected Nexus 1000v session.");
+ netconfClient.disconnect();
+ s_logger.debug("Disconnected Nexus 1000v session.");
}
throw new CloudRuntimeException(msg);
}
@@ -409,23 +410,23 @@ public class HypervisorHostHelper {
}
}
- /**
- * @param ethPortProfileName
- * @param namePrefix
- * @param hostMo
- * @param vlanId
- * @param networkRateMbps
- * @param networkRateMulticastMbps
- * @param timeOutMs
+ /**
+ * @param ethPortProfileName
+ * @param namePrefix
+ * @param hostMo
+ * @param vlanId
+ * @param networkRateMbps
+ * @param networkRateMulticastMbps
+ * @param timeOutMs
* @param vSwitchType
* @param numPorts
- * @return
- * @throws Exception
- */
+ * @return
+ * @throws Exception
+ */
public static Pair<ManagedObjectReference, String> prepareNetwork(String physicalNetwork, String namePrefix,
HostMO hostMo, String vlanId, String secondaryvlanId, Integer networkRateMbps, Integer networkRateMulticastMbps, long timeOutMs,
- VirtualSwitchType vSwitchType, int numPorts, String gateway, boolean configureVServiceInNexus) throws Exception {
+ VirtualSwitchType vSwitchType, int numPorts, String gateway, boolean configureVServiceInNexus, BroadcastDomainType broadcastDomainType) throws Exception {
ManagedObjectReference morNetwork = null;
VmwareContext context = hostMo.getContext();
ManagedObjectReference dcMor = hostMo.getHyperHostDatacenter();
@@ -434,7 +435,6 @@ public class HypervisorHostHelper {
ManagedObjectReference morEthernetPortProfile = null;
String ethPortProfileName = null;
ManagedObjectReference morDvSwitch = null;
- ManagedObjectReference morDvPortGroup = null;
String dvSwitchName = null;
boolean bWaitPortGroupReady = false;
boolean createGCTag = false;
@@ -445,26 +445,47 @@ public class HypervisorHostHelper {
Integer vid = null;
Integer spvlanid = null; // secondary pvlan id
- if(vlanId != null && !UNTAGGED_VLAN_NAME.equalsIgnoreCase(vlanId)) {
- createGCTag = true;
- vid = Integer.parseInt(vlanId);
+ /** This is the list of BroadcastDomainTypes we can actually
+ * prepare networks for in this function.
+ */
+ BroadcastDomainType[] supportedBroadcastTypes =
+ new BroadcastDomainType[] { BroadcastDomainType.Lswitch,
+ BroadcastDomainType.LinkLocal,
+ BroadcastDomainType.Native,
+ BroadcastDomainType.Pvlan,
+ BroadcastDomainType.Storage,
+ BroadcastDomainType.UnDecided,
+ BroadcastDomainType.Vlan };
+
+ if (!Arrays.asList(supportedBroadcastTypes).contains(broadcastDomainType)) {
+ throw new InvalidParameterException("BroadcastDomainType " + broadcastDomainType +
+ " it not supported on a VMWare hypervisor at this time.");
}
- if (secondaryvlanId != null) {
- spvlanid = Integer.parseInt(secondaryvlanId);
+
+ if (broadcastDomainType == BroadcastDomainType.Lswitch) {
+ if (vSwitchType == VirtualSwitchType.NexusDistributedVirtualSwitch) {
+ throw new InvalidParameterException("Nexus Distributed Virtualswitch is not supported with BroadcastDomainType " +
+ broadcastDomainType);
+ }
+ // Fixed name for the port-group on the vApp vswitch
+ networkName = "br-int";
+ // No doubt about this, depending on vid=null to avoid lots of code below
+ vid = null;
+ } else {
+ networkName = composeCloudNetworkName(namePrefix, vlanId, secondaryvlanId, networkRateMbps, physicalNetwork);
+
+ if(vlanId != null && !UNTAGGED_VLAN_NAME.equalsIgnoreCase(vlanId)) {
+ createGCTag = true;
+ vid = Integer.parseInt(vlanId);
+ }
+ if (secondaryvlanId != null) {
+ spvlanid = Integer.parseInt(secondaryvlanId);
+ }
}
- networkName = composeCloudNetworkName(namePrefix, vlanId, secondaryvlanId, networkRateMbps, physicalNetwork);
if (vSwitchType == VirtualSwitchType.VMwareDistributedVirtualSwitch) {
- VMwareDVSConfigSpec dvsSpec = null;
DVSTrafficShapingPolicy shapingPolicy;
- VmwareDistributedVirtualSwitchVlanSpec vlanSpec = null;
- VmwareDistributedVirtualSwitchPvlanSpec pvlanSpec = null;
- //VMwareDVSPvlanConfigSpec pvlanSpec = null;
DVSSecurityPolicy secPolicy;
- VMwareDVSPortSetting dvsPortSetting = null;
- DVPortgroupConfigSpec dvPortGroupSpec;
- DVPortgroupConfigInfo dvPortgroupInfo;
- //DVSConfigInfo dvsInfo;
vcApiVersion = getVcenterApiVersion(context);
minVcApiVersionSupportingAutoExpand = "5.0";
autoExpandSupported = isFeatureSupportedInVcenterApiVersion(vcApiVersion, minVcApiVersionSupportingAutoExpand);
@@ -485,120 +506,31 @@ public class HypervisorHostHelper {
s_logger.info("Found distributed vSwitch " + morDvSwitch);
}
- dvSwitchMo = new DistributedVirtualSwitchMO(context, morDvSwitch);
-
- shapingPolicy = getDVSShapingPolicy(networkRateMbps);
- secPolicy = createDVSSecurityPolicy();
-
- // First, if both vlan id and pvlan id are provided, we need to
- // reconfigure the DVSwitch to have a tuple <vlan id, pvlan id> of
- // type isolated.
- if (vid != null && spvlanid != null) {
- // First check if the vlan/pvlan pair already exists on this dvswitch.
-
- Map<Integer, HypervisorHostHelper.PvlanType> vlanmap = dvSwitchMo.retrieveVlanPvlan(vid, spvlanid, morDvSwitch);
- if (vlanmap.size() != 0) {
- // Then either vid or pvlanid or both are already being used.
- if (vlanmap.containsKey(vid) && vlanmap.get(vid) != HypervisorHostHelper.PvlanType.promiscuous) {
- // This VLAN ID is already setup as a non-promiscuous vlan id on the DVS. Throw an exception.
- String msg = "VLAN ID " + vid + " is already in use as a " + vlanmap.get(vid).toString() + " VLAN on the DVSwitch";
- s_logger.error(msg);
- throw new Exception(msg);
- }
- if ((vid != spvlanid) && vlanmap.containsKey(spvlanid) && vlanmap.get(spvlanid) != HypervisorHostHelper.PvlanType.isolated) {
- // This PVLAN ID is already setup as a non-isolated vlan id on the DVS. Throw an exception.
- String msg = "PVLAN ID " + spvlanid + " is already in use as a " + vlanmap.get(spvlanid).toString() + " VLAN in the DVSwitch";
- s_logger.error(msg);
- throw new Exception(msg);
- }
- }
-
- // First create a DVSconfig spec.
- dvsSpec = new VMwareDVSConfigSpec();
- // Next, add the required primary and secondary vlan config specs to the dvs config spec.
- if (!vlanmap.containsKey(vid)) {
- VMwareDVSPvlanConfigSpec ppvlanConfigSpec = createDVPortPvlanConfigSpec(vid, vid, PvlanType.promiscuous, PvlanOperation.add);
- dvsSpec.getPvlanConfigSpec().add(ppvlanConfigSpec);
+ if (broadcastDomainType == BroadcastDomainType.Lswitch) {
+ if (!dataCenterMo.hasDvPortGroup(networkName)) {
+ // It'a bad thing if the integration bridge port-group does not exist
+ throw new InvalidParameterException("Unable to find port-group " + networkName + " on dvSwitch " + dvSwitchName);
}
- if ( !vid.equals(spvlanid) && !vlanmap.containsKey(spvlanid)) {
- VMwareDVSPvlanConfigSpec spvlanConfigSpec = createDVPortPvlanConfigSpec(vid, spvlanid, PvlanType.isolated, PvlanOperation.add);
- dvsSpec.getPvlanConfigSpec().add(spvlanConfigSpec);
- }
-
- if (dvsSpec.getPvlanConfigSpec().size() > 0) {
- // We have something to configure on the DVS... so send it the command.
- // When reconfiguring a vmware DVSwitch, we need to send in the configVersion in the spec.
- // Let's retrieve this switch's configVersion first.
- String dvsConfigVersion = dvSwitchMo.getDVSConfigVersion(morDvSwitch);
- dvsSpec.setConfigVersion(dvsConfigVersion);
- // Reconfigure the dvs using this spec.
-
- try {
- TaskInfo reconfigTask = dvSwitchMo.updateVMWareDVSwitchGetTask(morDvSwitch, dvsSpec);
- } catch (Exception e) {
- if(e instanceof AlreadyExistsFaultMsg) {
- s_logger.info("Specified vlan id (" + vid + ") private vlan id (" + spvlanid + ") tuple already configured on VMWare DVSwitch");
- // Do nothing, good if the tuple's already configured on the dvswitch.
+ bWaitPortGroupReady = false;
} else {
- // Rethrow the exception
- s_logger.error("Failed to configure vlan/pvlan tuple on VMware DVSwitch: " + vid + "/" + spvlanid + ", failure message: " + e.getMessage());
- e.printStackTrace();
- throw e;
- }
- }
- }
- // Else the vlan/pvlan pair already exists on the DVSwitch, and we needn't configure it again.
- }
-
- // Next, create the port group. For this, we need to create a VLAN spec.
- // NOTE - VmwareDistributedVirtualSwitchPvlanSpec extends VmwareDistributedVirtualSwitchVlanSpec.
- if (vid == null || spvlanid == null) {
- vlanSpec = createDVPortVlanIdSpec(vid);
- dvsPortSetting = createVmwareDVPortSettingSpec(shapingPolicy, secPolicy, vlanSpec);
- } else if (spvlanid != null) {
- // Create a pvlan spec. The pvlan spec is different from the pvlan config spec
- // that we created earlier. The pvlan config spec is used to configure the switch
- // with a <primary vlanId, secondary vlanId> tuple. The pvlan spec is used
- // to configure a port group (i.e., a network) with a secondary vlan id. We don't
- // need to mention more than the secondary vlan id because one secondary vlan id
- // can be associated with only one primary vlan id. Give vCenter the secondary vlan id,
- // and it will find out the associated primary vlan id and do the rest of the
- // port group configuration.
- pvlanSpec = createDVPortPvlanIdSpec(spvlanid);
- dvsPortSetting = createVmwareDVPortSettingSpec(shapingPolicy, secPolicy, pvlanSpec);
- }
+ dvSwitchMo = new DistributedVirtualSwitchMO(context, morDvSwitch);
- dvPortGroupSpec = createDvPortGroupSpec(networkName, dvsPortSetting, numPorts, autoExpandSupported);
+ shapingPolicy = getDVSShapingPolicy(networkRateMbps);
+ secPolicy = createDVSSecurityPolicy();
- if (!dataCenterMo.hasDvPortGroup(networkName)) {
- s_logger.info("Distributed Virtual Port group " + networkName + " not found.");
- // TODO(sateesh): Handle Exceptions
- try {
- dvSwitchMo.createDVPortGroup(dvPortGroupSpec);
- } catch (Exception e) {
- String msg = "Failed to create distributed virtual port group " + networkName + " on dvSwitch " + physicalNetwork;
- throw new Exception(msg);
+ // First, if both vlan id and pvlan id are provided, we need to
+ // reconfigure the DVSwitch to have a tuple <vlan id, pvlan id> of
+ // type isolated.
+ if (vid != null && spvlanid != null) {
+ setupPVlanPair(dvSwitchMo, morDvSwitch, vid, spvlanid);
}
+
+ // Next, create the port group. For this, we need to create a VLAN spec.
+ createPortGroup(physicalNetwork, networkName, vid, spvlanid, dataCenterMo, shapingPolicy, secPolicy, dvSwitchMo, numPorts, autoExpandSupported);
bWaitPortGroupReady = true;
- } else {
- s_logger.info("Found Distributed Virtual Port group " + networkName);
- // TODO(sateesh): Handle Exceptions
- dvPortgroupInfo = dataCenterMo.getDvPortGroupSpec(networkName);
- if (!isSpecMatch(dvPortgroupInfo, vid, shapingPolicy)) {
- s_logger.info("Updating Distributed Virtual Port group " + networkName);
- dvPortGroupSpec.setDefaultPortConfig(dvsPortSetting);
- dvPortGroupSpec.setConfigVersion(dvPortgroupInfo.getConfigVersion());
- morDvPortGroup = dataCenterMo.getDvPortGroupMor(networkName);
- try {
- dvSwitchMo.updateDvPortGroup(morDvPortGroup, dvPortGroupSpec);
- } catch (Exception e) {
- String msg = "Failed to update distributed virtual port group " + networkName + " on dvSwitch " + physicalNetwork;
- throw new Exception(msg);
- }
- bWaitPortGroupReady = true;
- }
}
} else if (vSwitchType == VirtualSwitchType.NexusDistributedVirtualSwitch) {
+
ethPortProfileName = physicalNetwork;
// TODO(sateesh): Remove this after ensuring proper default value for vSwitchName throughout traffic types
// and switch types.
@@ -665,59 +597,168 @@ public class HypervisorHostHelper {
return vCenterApiVersion.compareTo(minVcenterApiVersionForFeature) >= 0 ? true : false;
}
- public static ManagedObjectReference waitForDvPortGroupReady(
- DatacenterMO dataCenterMo, String dvPortGroupName, long timeOutMs) throws Exception {
- ManagedObjectReference morDvPortGroup = null;
-
- // if DvPortGroup is just created, we may fail to retrieve it, we
- // need to retry
- long startTick = System.currentTimeMillis();
- while (System.currentTimeMillis() - startTick <= timeOutMs) {
- morDvPortGroup = dataCenterMo.getDvPortGroupMor(dvPortGroupName);
- if (morDvPortGroup != null) {
- break;
- }
-
- s_logger.info("Waiting for dvPortGroup " + dvPortGroupName + " to be ready");
- Thread.sleep(1000);
- }
- return morDvPortGroup;
- }
+ private static void setupPVlanPair(DistributedVirtualSwitchMO dvSwitchMo, ManagedObjectReference morDvSwitch,
+ Integer vid, Integer spvlanid) throws Exception {
+ Map<Integer, HypervisorHostHelper.PvlanType> vlanmap = dvSwitchMo.retrieveVlanPvlan(vid, spvlanid, morDvSwitch);
+ if (vlanmap.size() != 0) {
+ // Then either vid or pvlanid or both are already being used.
+ if (vlanmap.containsKey(vid) && vlanmap.get(vid) != HypervisorHostHelper.PvlanType.promiscuous) {
+ // This VLAN ID is already setup as a non-promiscuous vlan id on the DVS. Throw an exception.
+ String msg = "VLAN ID " + vid + " is already in use as a " + vlanmap.get(vid).toString() + " VLAN on the DVSwitch";
+ s_logger.error(msg);
+ throw new Exception(msg);
+ }
+ if ((vid != spvlanid) && vlanmap.containsKey(spvlanid) && vlanmap.get(spvlanid) != HypervisorHostHelper.PvlanType.isolated) {
+ // This PVLAN ID is already setup as a non-isolated vlan id on the DVS. Throw an exception.
+ String msg = "PVLAN ID " + spvlanid + " is already in use as a " + vlanmap.get(spvlanid).toString() + " VLAN in the DVSwitch";
+ s_logger.error(msg);
+ throw new Exception(msg);
+ }
+ }
+
+ // First create a DVSconfig spec.
+ VMwareDVSConfigSpec dvsSpec = new VMwareDVSConfigSpec();
+ // Next, add the required primary and secondary vlan config specs to the dvs config spec.
+ if (!vlanmap.containsKey(vid)) {
+ VMwareDVSPvlanConfigSpec ppvlanConfigSpec = createDVPortPvlanConfigSpec(vid, vid, PvlanType.promiscuous, PvlanOperation.add);
+ dvsSpec.getPvlanConfigSpec().add(ppvlanConfigSpec);
+ }
+ if ( !vid.equals(spvlanid) && !vlanmap.containsKey(spvlanid)) {
+ VMwareDVSPvlanConfigSpec spvlanConfigSpec = createDVPortPvlanConfigSpec(vid, spvlanid, PvlanType.isolated, PvlanOperation.add);
+ dvsSpec.getPvlanConfigSpec().add(spvlanConfigSpec);
+ }
+
+ if (dvsSpec.getPvlanConfigSpec().size() > 0) {
+ // We have something to configure on the DVS... so send it the command.
+ // When reconfiguring a vmware DVSwitch, we need to send in the configVersion in the spec.
+ // Let's retrieve this switch's configVersion first.
+ String dvsConfigVersion = dvSwitchMo.getDVSConfigVersion(morDvSwitch);
+ dvsSpec.setConfigVersion(dvsConfigVersion);
+
+ // Reconfigure the dvs using this spec.
+ try {
+ dvSwitchMo.updateVMWareDVSwitchGetTask(morDvSwitch, dvsSpec);
+ } catch (AlreadyExistsFaultMsg e) {
+ s_logger.info("Specified vlan id (" + vid + ") private vlan id (" + spvlanid + ") tuple already configured on VMWare DVSwitch");
+ // Do nothing, good if the tuple's already configured on the dvswitch.
+ } catch (Exception e) {
+ // Rethrow the exception
+ s_logger.error("Failed to configure vlan/pvlan tuple on VMware DVSwitch: " + vid + "/" + spvlanid + ", failure message: ", e);
+ throw e;
+ }
+ }
+
+ }
+
+ private static void createPortGroup(String physicalNetwork, String networkName, Integer vid, Integer spvlanid, DatacenterMO dataCenterMo,
+ DVSTrafficShapingPolicy shapingPolicy, DVSSecurityPolicy secPolicy, DistributedVirtualSwitchMO dvSwitchMo, int numPorts, boolean autoExpandSupported) throws Exception{
+ VmwareDistributedVirtualSwitchVlanSpec vlanSpec = null;
+ VmwareDistributedVirtualSwitchPvlanSpec pvlanSpec = null;
+ VMwareDVSPortSetting dvsPortSetting = null;
+ DVPortgroupConfigSpec dvPortGroupSpec;
+
+ // Next, create the port group. For this, we need to create a VLAN spec.
+ // NOTE - VmwareDistributedVirtualSwitchPvlanSpec extends VmwareDistributedVirtualSwitchVlanSpec.
+ if (vid == null || spvlanid == null) {
+ vlanSpec = createDVPortVlanIdSpec(vid);
+ dvsPortSetting = createVmwareDVPortSettingSpec(shapingPolicy, secPolicy, vlanSpec);
+ } else if (spvlanid != null) {
+ // Create a pvlan spec. The pvlan spec is different from the pvlan config spec
+ // that we created earlier. The pvlan config spec is used to configure the switch
+ // with a <primary vlanId, secondary vlanId> tuple. The pvlan spec is used
+ // to configure a port group (i.e., a network) with a secondary vlan id. We don't
+ // need to mention more than the secondary vlan id because one secondary vlan id
+ // can be associated with only one primary vlan id. Give vCenter the secondary vlan id,
+ // and it will find out the associated primary vlan id and do the rest of the
+ // port group configuration.
+ pvlanSpec = createDVPortPvlanIdSpec(spvlanid);
+ dvsPortSetting = createVmwareDVPortSettingSpec(shapingPolicy, secPolicy, pvlanSpec);
+ }
+
+ dvPortGroupSpec = createDvPortGroupSpec(networkName, dvsPortSetting, numPorts, autoExpandSupported);
+
+
+ if (!dataCenterMo.hasDvPortGroup(networkName)) {
+ s_logger.info("Distributed Virtual Port group " + networkName + " not found.");
+ // TODO(sateesh): Handle Exceptions
+ try {
+ dvSwitchMo.createDVPortGroup(dvPortGroupSpec);
+ } catch (Exception e) {
+ String msg = "Failed to create distributed virtual port group " + networkName + " on dvSwitch " + physicalNetwork;
+ throw new Exception(msg);
+ }
+ } else {
+ s_logger.info("Found Distributed Virtual Port group " + networkName);
+ // TODO(sateesh): Handle Exceptions
+ DVPortgroupConfigInfo dvPortgroupInfo = dataCenterMo.getDvPortGroupSpec(networkName);
+ if (!isSpecMatch(dvPortgroupInfo, vid, shapingPolicy)) {
+ s_logger.info("Updating Distributed Virtual Port group " + networkName);
+ dvPortGroupSpec.setDefaultPortConfig(dvsPortSetting);
+ dvPortGroupSpec.setConfigVersion(dvPortgroupInfo.getConfigVersion());
+ ManagedObjectReference morDvPortGroup = dataCenterMo.getDvPortGroupMor(networkName);
+ try {
+ dvSwitchMo.updateDvPortGroup(morDvPortGroup, dvPortGroupSpec);
+ } catch (Exception e) {
+ String msg = "Failed to update distributed virtual port group " + networkName + " on dvSwitch " + physicalNetwork;
+ throw new Exception(msg);
+ }
+ }
+ }
+ }
+
+ public static ManagedObjectReference waitForDvPortGroupReady(
+ DatacenterMO dataCenterMo, String dvPortGroupName, long timeOutMs) throws Exception {
+ ManagedObjectReference morDvPortGroup = null;
+
+ // if DvPortGroup is just created, we may fail to retrieve it, we
+ // need to retry
+ long startTick = System.currentTimeMillis();
+ while (System.currentTimeMillis() - startTick <= timeOutMs) {
+ morDvPortGroup = dataCenterMo.getDvPortGroupMor(dvPortGroupName);
+ if (morDvPortGroup != null) {
+ break;
+ }
+
+ s_logger.info("Waiting for dvPortGroup " + dvPortGroupName + " to be ready");
+ Thread.sleep(1000);
+ }
+ return morDvPortGroup;
+ }
public static boolean isSpecMatch(DVPortgroupConfigInfo configInfo, Integer vid, DVSTrafficShapingPolicy shapingPolicy) {
- DVSTrafficShapingPolicy currentTrafficShapingPolicy;
+ DVSTrafficShapingPolicy currentTrafficShapingPolicy;
currentTrafficShapingPolicy = configInfo.getDefaultPortConfig().getInShapingPolicy();
- assert(currentTrafficShapingPolicy != null);
+ assert(currentTrafficShapingPolicy != null);
- LongPolicy averageBandwidth = currentTrafficShapingPolicy.getAverageBandwidth();
- LongPolicy burstSize = currentTrafficShapingPolicy.getBurstSize();
- LongPolicy peakBandwidth = currentTrafficShapingPolicy.getPeakBandwidth();
- BoolPolicy isEnabled = currentTrafficShapingPolicy.getEnabled();
+ LongPolicy averageBandwidth = currentTrafficShapingPolicy.getAverageBandwidth();
+ LongPolicy burstSize = currentTrafficShapingPolicy.getBurstSize();
+ LongPolicy peakBandwidth = currentTrafficShapingPolicy.getPeakBandwidth();
+ BoolPolicy isEnabled = currentTrafficShapingPolicy.getEnabled();
if (!isEnabled.equals(shapingPolicy.getEnabled())) {
- return false;
+ return false;
+ }
+
+ if(averageBandwidth != null && !averageBandwidth.equals(shapingPolicy.getAverageBandwidth())) {
+ if(s_logger.isInfoEnabled()) {
+ s_logger.info("Average bandwidth setting in shaping policy doesn't match with existing setting.");
+ }
+ return false;
+ } else if(burstSize != null && !burstSize.equals(shapingPolicy.getBurstSize())) {
+ if(s_logger.isInfoEnabled()) {
+ s_logger.info("Burst size setting in shaping policy doesn't match with existing setting.");
+ }
+ return false;
+ } else if(peakBandwidth != null && !peakBandwidth.equals(shapingPolicy.getPeakBandwidth())) {
+ if(s_logger.isInfoEnabled()) {
+ s_logger.info("Peak bandwidth setting in shaping policy doesn't match with existing setting.");
+ }
+ return false;
}
- if(averageBandwidth != null && !averageBandwidth.equals(shapingPolicy.getAverageBandwidth())) {
- if(s_logger.isInfoEnabled()) {
- s_logger.info("Average bandwidth setting in shaping policy doesn't match with existing setting.");
- }
- return false;
- } else if(burstSize != null && !burstSize.equals(shapingPolicy.getBurstSize())) {
- if(s_logger.isInfoEnabled()) {
- s_logger.info("Burst size setting in shaping policy doesn't match with existing setting.");
- }
- return false;
- } else if(peakBandwidth != null && !peakBandwidth.equals(shapingPolicy.getPeakBandwidth())) {
- if(s_logger.isInfoEnabled()) {
- s_logger.info("Peak bandwidth setting in shaping policy doesn't match with existing setting.");
- }
- return false;
- }
-
- return true;
- }
+ return true;
+ }
public static DVPortgroupConfigSpec createDvPortGroupSpec(String dvPortGroupName, DVPortSetting portSetting, int numPorts, boolean autoExpandSupported) {
DVPortgroupConfigSpec spec = new DVPortgroupConfigSpec();
@@ -813,9 +854,9 @@ public class HypervisorHostHelper {
return secPolicy;
}
- public static Pair<ManagedObjectReference, String> prepareNetwork(String vSwitchName, String namePrefix,
+ public static Pair<ManagedObjectReference, String> prepareNetwork(String vSwitchName, String namePrefix,
HostMO hostMo, String vlanId, Integer networkRateMbps, Integer networkRateMulticastMbps,
- long timeOutMs, boolean syncPeerHosts) throws Exception {
+ long timeOutMs, boolean syncPeerHosts, BroadcastDomainType broadcastDomainType) throws Exception {
HostVirtualSwitch vSwitch;
if (vSwitchName == null) {
@@ -834,12 +875,37 @@ public class HypervisorHostHelper {
String networkName;
Integer vid = null;
- if(vlanId != null && !UNTAGGED_VLAN_NAME.equalsIgnoreCase(vlanId)) {
- createGCTag = true;
- vid = Integer.parseInt(vlanId);
+ /** This is the list of BroadcastDomainTypes we can actually
+ * prepare networks for in this function.
+ */
+ BroadcastDomainType[] supportedBroadcastTypes =
+ new BroadcastDomainType[] { BroadcastDomainType.Lswitch,
+ BroadcastDomainType.LinkLocal,
+ BroadcastDomainType.Native,
+ BroadcastDomainType.Pvlan,
+ BroadcastDomainType.Storage,
+ BroadcastDomainType.UnDecided,
+ BroadcastDomainType.Vlan };
+
+ if (!Arrays.asList(supportedBroadcastTypes).contains(broadcastDomainType)) {
+ throw new InvalidParameterException("BroadcastDomainType " + broadcastDomainType +
+ " it not supported on a VMWare hypervisor at this time.");
+ }
+
+ if (broadcastDomainType == BroadcastDomainType.Lswitch) {
+ // Fixed name for the port-group on the vApp vswitch
+ networkName = "br-int";
+ // No doubt about this, depending on vid=null to avoid lots of code below
+ vid = null;
+ } else {
+ networkName = composeCloudNetworkName(namePrefix, vlanId, null, networkRateMbps, vSwitchName);
+
+ if(vlanId != null && !UNTAGGED_VLAN_NAME.equalsIgnoreCase(vlanId) ) {
+ createGCTag = true;
+ vid = Integer.parseInt(vlanId);
+ }
}
- networkName = composeCloudNetworkName(namePrefix, vlanId, null, networkRateMbps, vSwitchName);
HostNetworkSecurityPolicy secPolicy = null;
if (namePrefix.equalsIgnoreCase("cloud.private")) {
secPolicy = new HostNetworkSecurityPolicy();
@@ -865,17 +931,25 @@ public class HypervisorHostHelper {
}
boolean bWaitPortGroupReady = false;
- if (!hostMo.hasPortGroup(vSwitch, networkName)) {
- hostMo.createPortGroup(vSwitch, networkName, vid, secPolicy, shapingPolicy);
- bWaitPortGroupReady = true;
+ if (broadcastDomainType == BroadcastDomainType.Lswitch) {
+ if (!hostMo.hasPortGroup(vSwitch, networkName)) {
+ // It'a bad thing if the integration bridge port-group does not exist
+ throw new InvalidParameterException("Unable to find port-group " + networkName + " on dvSwitch " + vSwitchName);
+ }
+ bWaitPortGroupReady = false;
} else {
- HostPortGroupSpec spec = hostMo.getPortGroupSpec(networkName);
- if(!isSpecMatch(spec, vid, shapingPolicy)) {
- hostMo.updatePortGroup(vSwitch, networkName, vid, secPolicy, shapingPolicy);
+ if (!hostMo.hasPortGroup(vSwitch, networkName)) {
+ hostMo.createPortGroup(vSwitch, networkName, vid, secPolicy, shapingPolicy);
bWaitPortGroupReady = true;
+ } else {
+ HostPortGroupSpec spec = hostMo.getPortGroupSpec(networkName);
+ if(!isSpecMatch(spec, vid, shapingPolicy)) {
+ hostMo.updatePortGroup(vSwitch, networkName, vid, secPolicy, shapingPolicy);
+ bWaitPortGroupReady = true;
+ }
}
}
-
+
ManagedObjectReference morNetwork;
if(bWaitPortGroupReady)
morNetwork = waitForNetworkReady(hostMo, networkName, timeOutMs);
@@ -908,7 +982,7 @@ public class HypervisorHostHelper {
try {
if(s_logger.isDebugEnabled())
s_logger.debug("Prepare network on other host, vlan: " + vlanId + ", host: " + otherHostMo.getHostName());
- prepareNetwork(vSwitchName, namePrefix, otherHostMo, vlanId, networkRateMbps, networkRateMulticastMbps, timeOutMs, false);
+ prepareNetwork(vSwitchName, namePrefix, otherHostMo, vlanId, networkRateMbps, networkRateMulticastMbps, timeOutMs, false, broadcastDomainType);
} catch(Exception e) {
s_logger.warn("Unable to prepare network on other host, vlan: " + vlanId + ", host: " + otherHostMo.getHostName());
}
@@ -931,273 +1005,273 @@ public class HypervisorHostHelper {
return new Pair<ManagedObjectReference, String>(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.isEnabled() == null || !policyInSpec.isEnabled().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 {
-
- 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 = hostMo.getNetworkMor(networkName);
- if (morNetwork != null) {
- break;
- }
-
- s_logger.info("Waiting for network " + networkName + " to be ready");
- Thread.sleep(1000);
- }
-
- return morNetwork;
- }
-
- public static boolean createBlankVm(VmwareHypervisorHost host, String vmName,
- int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB, int memoryReserveMB, String guestOsIdentifier,
- ManagedObjectReference morDs, boolean snapshotDirToParent) throws Exception {
-
- if(s_logger.isInfoEnabled())
- s_logger.info("Create blank VM. cpuCount: " + cpuCount + ", cpuSpeed(MHz): " + cpuSpeedMHz + ", mem(Mb): " + memoryMB);
-
- // VM config basics
- VirtualMachineConfigSpec vmConfig = new VirtualMachineConfigSpec();
- vmConfig.setName(vmName);
- VmwareHelper.setBasicVmConfig(vmConfig, cpuCount, cpuSpeedMHz, cpuReservedMHz, memoryMB, memoryReserveMB, guestOsIdentifier, limitCpuUse);
-
- // Scsi controller
- VirtualLsiLogicController scsiController = new VirtualLsiLogicController();
- scsiController.setSharedBus(VirtualSCSISharing.NO_SHARING);
- scsiController.setBusNumber(0);
- scsiController.setKey(1);
- VirtualDeviceConfigSpec scsiControllerSpec = new VirtualDeviceConfigSpec();
- scsiControllerSpec.setDevice(scsiController);
- scsiControllerSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD);
-
- VirtualMachineFileInfo fileInfo = new VirtualMachineFileInfo();
- DatastoreMO dsMo = new DatastoreMO(host.getContext(), morDs);
- fileInfo.setVmPathName(String.format("[%s]", dsMo.getName()));
- vmConfig.setFiles(fileInfo);
-
- VirtualMachineVideoCard videoCard = new VirtualMachineVideoCard();
- videoCard.setControllerKey(100);
- videoCard.setUseAutoDetect(true);
-
- VirtualDeviceConfigSpec videoDeviceSpec = new VirtualDeviceConfigSpec();
- videoDeviceSpec.setDevice(videoCard);
- videoDeviceSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD);
-
- vmConfig.getDeviceChange().add(scsiControllerSpec);
- vmConfig.getDeviceChange().add(videoDeviceSpec);
- if(host.createVm(vmConfig)) {
- VirtualMachineMO vmMo = host.findVmOnHyperHost(vmName);
- assert(vmMo != null);
-
- int ideControllerKey = -1;
- while(ideControllerKey < 0) {
- ideControllerKey = vmMo.tryGetIDEDeviceControllerKey();
- if(ideControllerKey >= 0)
- break;
-
- s_logger.info("Waiting for IDE controller be ready in VM: " + vmName);
- Thread.sleep(1000);
- }
-
- if(snapshotDirToParent) {
- String snapshotDir = String.format("/vmfs/volumes/%s/", dsMo.getName());
-
- s_logger.info("Switch snapshot working directory to " + snapshotDir + " for " + vmName);
- vmMo.setSnapshotDirectory(snapshotDir);
-
- // Don't have a good way to test if the VM is really ready for use through normal API after configuration file manipulation,
- // delay 3 seconds
- Thread.sleep(3000);
- }
-
- s_logger.info("Blank VM: " + vmName + " is ready for use");
- return true;
- }
- return false;
- }
-
- public static String resolveHostNameInUrl(DatacenterMO dcMo, String url) {
-
- s_logger.info("Resolving host name in url through vCenter, url: " + url);
-
- URI uri;
- try {
- uri = new URI(url);
- } catch (URISyntaxException e) {
- s_logger.warn("URISyntaxException on url " + url);
- return url;
- }
-
- String host = uri.getHost();
- if(NetUtils.isValidIp(host)) {
- s_logger.info("host name in url is already in IP address, url: " + url);
- return url;
- }
-
- try {
- ManagedObjectReference morHost = dcMo.findHost(host);
- if(morHost != null) {
- HostMO hostMo = new HostMO(dcMo.getContext(), morHost);
- String managementPortGroupName;
- if(hostMo.getHostType() == VmwareHostType.ESXi)
- managementPortGroupName = (String)dcMo.getContext().getStockObject("manageportgroup");
- else
- managementPortGroupName = (String)dcMo.getContext().getStockObject("serviceconsole");
-
- VmwareHypervisorHostNetworkSummary summary = hostMo.getHyperHostNetworkSummary(managementPortGroupName);
- if(summary == null) {
- s_logger.warn("Unable to resolve host name in url through vSphere, url: " + url);
- return url;
- }
-
- String hostIp = summary.getHostIp();
-
- try {
- URI resolvedUri = new URI(uri.getScheme(), uri.getUserInfo(), hostIp, uri.getPort(), uri.getPath(), uri.getQuery(), uri.getFragment());
-
- s_logger.info("url " + url + " is resolved to " + resolvedUri.toString() + " through vCenter");
- return resolvedUri.toString();
- } catch (URISyntaxException e) {
- assert(false);
- return url;
- }
- }
- } catch(Exception e) {
- s_logger.warn("Unexpected exception ", e);
- }
-
- return url;
- }
-
- public static void importVmFromOVF(VmwareHypervisorHost host, String ovfFilePath, String vmName, DatastoreMO dsMo, String diskOption,
- ManagedObjectReference morRp, ManagedObjectReference morHost) throws Exception {
-
- assert(morRp != null);
-
- OvfCreateImportSpecParams importSpecParams = new OvfCreateImportSpecParams();
- importSpecParams.setHostSystem(morHost);
- importSpecParams.setLocale("US");
- importSpecParams.setEntityName(vmName);
- importSpecParams.setDeploymentOption("");
- importSpecParams.setDiskProvisioning(diskOption); // diskOption: thin, thick, etc
- //importSpecParams.setPropertyMapping(null);
-
- String ovfDescriptor = HttpNfcLeaseMO.readOvfContent(ovfFilePath);
- VmwareContext context = host.getContext();
- OvfCreateImportSpecResult ovfImportResult = context.getService().createImportSpec(
- context.getServiceContent().getOvfManager(), ovfDescriptor, morRp,
- dsMo.getMor(), importSpecParams);
-
- if(ovfImportResult == null) {
- String msg = "createImportSpec() failed. ovfFilePath: " + ovfFilePath + ", vmName: "
- + vmName + ", diskOption: " + diskOption;
- s_logger.error(msg);
- throw new Exception(msg);
- }
-
- DatacenterMO dcMo = new DatacenterMO(context, host.getHyperHostDatacenter());
- ManagedObjectReference morLease = context.getService().importVApp(morRp,
- ovfImportResult.getImportSpec(), dcMo.getVmFolder(), morHost);
- if(morLease == null) {
- String msg = "importVApp() failed. ovfFilePath: " + ovfFilePath + ", vmName: "
- + vmName + ", diskOption: " + diskOption;
- s_logger.error(msg);
- throw new Exception(msg);
- }
+ 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.isEnabled() == null || !policyInSpec.isEnabled().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 {
+
+ 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 = hostMo.getNetworkMor(networkName);
+ if (morNetwork != null) {
+ break;
+ }
+
+ s_logger.info("Waiting for network " + networkName + " to be ready");
+ Thread.sleep(1000);
+ }
+
+ return morNetwork;
+ }
+
+ public static boolean createBlankVm(VmwareHypervisorHost host, String vmName,
+ int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB, int memoryReserveMB, String guestOsIdentifier,
+ ManagedObjectReference morDs, boolean snapshotDirToParent) throws Exception {
+
+ if(s_logger.isInfoEnabled())
+ s_logger.info("Create blank VM. cpuCount: " + cpuCount + ", cpuSpeed(MHz): " + cpuSpeedMHz + ", mem(Mb): " + memoryMB);
+
+ // VM config basics
+ VirtualMachineConfigSpec vmConfig = new VirtualMachineConfigSpec();
+ vmConfig.setName(vmName);
+ VmwareHelper.setBasicVmConfig(vmConfig, cpuCount, cpuSpeedMHz, cpuReservedMHz, memoryMB, memoryReserveMB, guestOsIdentifier, limitCpuUse);
+
+ // Scsi controller
+ VirtualLsiLogicController scsiController = new VirtualLsiLogicController();
+ scsiController.setSharedBus(VirtualSCSISharing.NO_SHARING);
+ scsiController.setBusNumber(0);
+ scsiController.setKey(1);
+ VirtualDeviceConfigSpec scsiControllerSpec = new VirtualDeviceConfigSpec();
+ scsiControllerSpec.setDevice(scsiController);
+ scsiControllerSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD);
+
+ VirtualMachineFileInfo fileInfo = new VirtualMachineFileInfo();
+ DatastoreMO dsMo = new DatastoreMO(host.getContext(), morDs);
+ fileInfo.setVmPathName(String.format("[%s]", dsMo.getName()));
+ vmConfig.setFiles(fileInfo);
+
+ VirtualMachineVideoCard videoCard = new VirtualMachineVideoCard();
+ videoCard.setControllerKey(100);
+ videoCard.setUseAutoDetect(true);
+
+ VirtualDeviceConfigSpec videoDeviceSpec = new VirtualDeviceConfigSpec();
+ videoDeviceSpec.setDevice(videoCard);
+ videoDeviceSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD);
+
+ vmConfig.getDeviceChange().add(scsiControllerSpec);
+ vmConfig.getDeviceChange().add(videoDeviceSpec);
+ if(host.createVm(vmConfig)) {
+ VirtualMachineMO vmMo = host.findVmOnHyperHost(vmName);
+ assert(vmMo != null);
+
+ int ideControllerKey = -1;
+ while(ideControllerKey < 0) {
+ ideControllerKey = vmMo.tryGetIDEDeviceControllerKey();
+ if(ideControllerKey >= 0)
+ break;
+
+ s_logger.info("Waiting for IDE controller be ready in VM: " + vmName);
+ Thread.sleep(1000);
+ }
+
+ if(snapshotDirToParent) {
+ String snapshotDir = String.format("/vmfs/volumes/%s/", dsMo.getName());
+
+ s_logger.info("Switch snapshot working directory to " + snapshotDir + " for " + vmName);
+ vmMo.setSnapshotDirectory(snapshotDir);
+
+ // Don't have a good way to test if the VM is really ready for use through normal API after configuration file manipulation,
+ // delay 3 seconds
+ Thread.sleep(3000);
+ }
+
+ s_logger.info("Blank VM: " + vmName + " is ready for use");
+ return true;
+ }
+ return false;
+ }
+
+ public static String resolveHostNameInUrl(DatacenterMO dcMo, String url) {
+
+ s_logger.info("Resolving host name in url through vCenter, url: " + url);
+
+ URI uri;
+ try {
+ uri = new URI(url);
+ } catch (URISyntaxException e) {
+ s_logger.warn("URISyntaxException on url " + url);
+ return url;
+ }
+
+ String host = uri.getHost();
+ if(NetUtils.isValidIp(host)) {
+ s_logger.info("host name in url is already in IP address, url: " + url);
+ return url;
+ }
+
+ try {
+ ManagedObjectReference morHost = dcMo.findHost(host);
+ if(morHost != null) {
+ HostMO hostMo = new HostMO(dcMo.getContext(), morHost);
+ String managementPortGroupName;
+ if(hostMo.getHostType() == VmwareHostType.ESXi)
+ managementPortGroupName = (String)dcMo.getContext().getStockObject("manageportgroup");
+ else
+ managementPortGroupName = (String)dcMo.getContext().getStockObject("serviceconsole");
+
+ VmwareHypervisorHostNetworkSummary summary = hostMo.getHyperHostNetworkSummary(managementPortGroupName);
+ if(summary == null) {
+ s_logger.warn("Unable to resolve host name in url through vSphere, url: " + url);
+ return url;
+ }
+
+ String hostIp = summary.getHostIp();
+
+ try {
+ URI resolvedUri = new URI(uri.getScheme(), uri.getUserInfo(), hostIp, uri.getPort(), uri.getPath(), uri.getQuery(), uri.getFragment());
+
+ s_logger.info("url " + url + " is resolved to " + resolvedUri.toString() + " through vCenter");
+ return resolvedUri.toString();
+ } catch (URISyntaxException e) {
+ assert(false);
+ return url;
+ }
+ }
+ } catch(Exception e) {
+ s_logger.warn("Unexpected exception ", e);
+ }
+
+ return url;
+ }
+
+ public static void importVmFromOVF(VmwareHypervisorHost host, String ovfFilePath, String vmName, DatastoreMO dsMo, String diskOption,
+ ManagedObjectReference morRp, ManagedObjectReference morHost) throws Exception {
+
+ assert(morRp != null);
+
+ OvfCreateImportSpecParams importSpecParams = new OvfCreateImportSpecParams();
+ importSpecParams.setHostSystem(morHost);
+ importSpecParams.setLocale("US");
+ importSpecParams.setEntityName(vmName);
+ importSpecParams.setDeploymentOption("");
+ importSpecParams.setDiskProvisioning(diskOption); // diskOption: thin, thick, etc
+ //importSpecParams.setPropertyMapping(null);
+
+ String ovfDescriptor = HttpNfcLeaseMO.readOvfContent(ovfFilePath);
+ VmwareContext context = host.getContext();
+ OvfCreateImportSpecResult ovfImportResult = context.getService().createImportSpec(
+ context.getServiceContent().getOvfManager(), ovfDescriptor, morRp,
+ dsMo.getMor(), importSpecParams);
+
+ if(ovfImportResult == null) {
+ String msg = "createImportSpec() failed. ovfFilePath: " + ovfFilePath + ", vmName: "
+ + vmName + ", diskOption: " + diskOption;
+ s_logger.error(msg);
+ throw new Exception(msg);
+ }
+
+ DatacenterMO dcMo = new DatacenterMO(context, host.getHyperHostDatacenter());
+ ManagedObjectReference morLease = context.getService().importVApp(morRp,
+ ovfImportResult.getImportSpec(), dcMo.getVmFolder(), morHost);
+ if(morLease == null) {
+ String msg = "importVApp() failed. ovfFilePath: " + ovfFilePath + ", vmName: "
+ + vmName + ", diskOption: " + diskOption;
+ s_logger.error(msg);
+ throw new Exception(msg);
+ }
boolean importSuccess = true;
- final HttpNfcLeaseMO leaseMo = new HttpNfcLeaseMO(context, morLease);
- HttpNfcLeaseState state = leaseMo.waitState(
- new HttpNfcLeaseState[] { HttpNfcLeaseState.READY, HttpNfcLeaseState.ERROR });
- try {
- if(state == HttpNfcLeaseState.READY) {
- final long totalBytes = HttpNfcLeaseMO.calcTotalBytes(ovfImportResult);
- File ovfFile = new File(ovfFilePath);
-
- HttpNfcLeaseInfo httpNfcLeaseInfo = leaseMo.getLeaseInfo();
- List<HttpNfcLeaseDeviceUrl> deviceUrls = httpNfcLeaseInfo.getDeviceUrl();
- long bytesAlreadyWritten = 0;
-
- final HttpNfcLeaseMO.ProgressReporter progressReporter = leaseMo.createProgressReporter();
- try {
- for (HttpNfcLeaseDeviceUrl deviceUrl : deviceUrls) {
- String deviceKey = deviceUrl.getImportKey();
- for (OvfFileItem ovfFileItem : ovfImportResult.getFileItem()) {
- if (deviceKey.equals(ovfFileItem.getDeviceId())) {
- String absoluteFile = ovfFile.getParent() + File.separator + ovfFileItem.getPath();
- String urlToPost = deviceUrl.getUrl();
- urlToPost = resolveHostNameInUrl(dcMo, urlToPost);
-
- context.uploadVmdkFile(ovfFileItem.isCreate() ? "PUT" : "POST", urlToPost, absoluteFile,
- bytesAlreadyWritten, new ActionDelegate<Long> () {
+ final HttpNfcLeaseMO leaseMo = new HttpNfcLeaseMO(context, morLease);
+ HttpNfcLeaseState state = leaseMo.waitState(
+ new HttpNfcLeaseState[] { HttpNfcLeaseState.READY, HttpNfcLeaseState.ERROR });
+ try {
+ if(state == HttpNfcLeaseState.READY) {
+ final long totalBytes = HttpNfcLeaseMO.calcTotalBytes(ovfImportResult);
+ File ovfFile = new File(ovfFilePath);
+
+ HttpNfcLeaseInfo httpNfcLeaseInfo = leaseMo.getLeaseInfo();
+ List<HttpNfcLeaseDeviceUrl> deviceUrls = httpNfcLeaseInfo.getDeviceUrl();
+ long bytesAlreadyWritten = 0;
+
+ final HttpNfcLeaseMO.ProgressReporter progressReporter = leaseMo.createProgressReporter();
+ try {
+ for (HttpNfcLeaseDeviceUrl deviceUrl : deviceUrls) {
+ String deviceKey = deviceUrl.getImportKey();
+ for (OvfFileItem ovfFileItem : ovfImportResult.getFileItem()) {
+ if (deviceKey.equals(ovfFileItem.getDeviceId())) {
+ String absoluteFile = ovfFile.getParent() + File.separator + ovfFileItem.getPath();
+ String urlToPost = deviceUrl.getUrl();
+ urlToPost = resolveHostNameInUrl(dcMo, urlToPost);
+
+ context.uploadVmdkFile(ovfFileItem.isCreate() ? "PUT" : "POST", urlToPost, absoluteFile,
+ bytesAlreadyWritten, new ActionDelegate<Long> () {
@Override
- public void action(Long param) {
- progressReporter.reportProgress((int)(param * 100 / totalBytes));
- }
- });
-
- bytesAlreadyWritten += ovfFileItem.getSize();
- }
- }
- }
+ public void action(Long param) {
+ progressReporter.reportProgress((int)(param * 100 / totalBytes));
+ }
+ });
+
+ bytesAlreadyWritten += ovfFileItem.getSize();
+ }
+ }
+ }
} catch (Exception e) {
s_logger.error("Failed to complete file upload task. " + e.getMessage());
// Set flag to cleanup the stale template left due to failed import operation, if any
importSuccess = false;
throw e;
- } finally {
- progressReporter.close();
- }
+ } finally {
+ progressReporter.close();
+ }
if (bytesAlreadyWritten == totalBytes) {
- leaseMo.updateLeaseProgress(100);
- }
+ leaseMo.updateLeaseProgress(100);
+ }
}
- } finally {
+ } finally {
if (!importSuccess) {
s_logger.error("Aborting the lease on " + vmName + " after import operation failed.");
leaseMo.abortLease();
} else {
- leaseMo.completeLease();
- }
- }
- }
+ leaseMo.completeLease();
+ }
+ }
+ }
}