Search in sources :

Example 36 with ClusterComputeResource

use of com.vmware.vim25.mo.ClusterComputeResource in project cloudstack by apache.

the class VmwareServerDiscoverer method find.

@Override
public Map<? extends ServerResource, Map<String, String>> find(long dcId, Long podId, Long clusterId, URI url, String username, String password, List<String> hostTags) throws DiscoveryException {
    if (s_logger.isInfoEnabled())
        s_logger.info("Discover host. dc: " + dcId + ", pod: " + podId + ", cluster: " + clusterId + ", uri host: " + url.getHost());
    if (podId == null) {
        if (s_logger.isInfoEnabled())
            s_logger.info("No pod is assigned, assuming that it is not for vmware and skip it to next discoverer");
        return null;
    }
    boolean failureInClusterDiscovery = true;
    String vsmIp = "";
    ClusterVO cluster = _clusterDao.findById(clusterId);
    if (cluster == null || cluster.getHypervisorType() != HypervisorType.VMware) {
        if (s_logger.isInfoEnabled())
            s_logger.info("invalid cluster id or cluster is not for VMware hypervisors");
        return null;
    }
    Map<String, String> clusterDetails = _clusterDetailsDao.findDetails(clusterId);
    boolean legacyZone = _vmwareMgr.isLegacyZone(dcId);
    boolean usernameNotProvided = (username == null || username.isEmpty());
    boolean passwordNotProvided = (password == null || password.isEmpty());
    // Check if NOT a legacy zone.
    if (!legacyZone) {
        // Retrieve VMware DC associated with specified zone
        VmwareDatacenterVO vmwareDc = fetchVmwareDatacenterByZone(dcId);
        // If either or both not provided, try to retrieve & use the credentials from database, which are provided earlier while adding VMware DC to zone.
        if (usernameNotProvided || passwordNotProvided) {
            // Retrieve credentials associated with VMware DC
            s_logger.info("Username and/or Password not provided while adding cluster to cloudstack zone. " + "Hence using both username & password provided while adding VMware DC to CloudStack zone.");
            username = vmwareDc.getUser();
            password = vmwareDc.getPassword();
            clusterDetails.put("username", username);
            clusterDetails.put("password", password);
            _clusterDetailsDao.persist(clusterId, clusterDetails);
        }
        String updatedInventoryPath = validateCluster(url, vmwareDc);
        try {
            if (!URLDecoder.decode(url.getPath(), "UTF-8").equals(updatedInventoryPath)) {
                // If url from API doesn't specify DC then update url in database with DC associated with this zone.
                clusterDetails.put("url", url.getScheme() + "://" + url.getHost() + updatedInventoryPath);
                _clusterDetailsDao.persist(clusterId, clusterDetails);
            }
        } catch (UnsupportedEncodingException e) {
            throw new DiscoveredWithErrorException("Unable to decode URL path, URL path : " + url.getPath(), e);
        }
    } else {
        // For legacy zones insist on the old model of asking for credentials for each cluster being added.
        if (usernameNotProvided) {
            if (passwordNotProvided) {
                throw new InvalidParameterValueException("Please provide username & password to add this cluster to zone");
            } else {
                throw new InvalidParameterValueException("Please provide username to add this cluster to zone");
            }
        } else if (passwordNotProvided) {
            throw new InvalidParameterValueException("Please provide password to add this cluster to zone");
        }
    }
    List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(clusterId);
    if (hosts != null && hosts.size() > 0) {
        int maxHostsPerCluster = _hvCapabilitiesDao.getMaxHostsPerCluster(hosts.get(0).getHypervisorType(), hosts.get(0).getHypervisorVersion());
        if (hosts.size() >= maxHostsPerCluster) {
            String msg = "VMware cluster " + cluster.getName() + " is too big to add new host, current size: " + hosts.size() + ", max. size: " + maxHostsPerCluster;
            s_logger.error(msg);
            throw new DiscoveredWithErrorException(msg);
        }
    }
    String privateTrafficLabel = null;
    String publicTrafficLabel = null;
    String guestTrafficLabel = null;
    Map<String, String> vsmCredentials = null;
    VirtualSwitchType defaultVirtualSwitchType = VirtualSwitchType.StandardVirtualSwitch;
    String paramGuestVswitchType = null;
    String paramGuestVswitchName = null;
    String paramPublicVswitchType = null;
    String paramPublicVswitchName = null;
    VmwareTrafficLabel guestTrafficLabelObj = new VmwareTrafficLabel(TrafficType.Guest);
    VmwareTrafficLabel publicTrafficLabelObj = new VmwareTrafficLabel(TrafficType.Public);
    DataCenterVO zone = _dcDao.findById(dcId);
    NetworkType zoneType = zone.getNetworkType();
    _readGlobalConfigParameters();
    // Private traffic will be only on standard vSwitch for now.
    if (useDVS) {
        // Parse url parameters for type of vswitch and name of vswitch specified at cluster level
        paramGuestVswitchType = _urlParams.get(ApiConstants.VSWITCH_TYPE_GUEST_TRAFFIC);
        paramGuestVswitchName = _urlParams.get(ApiConstants.VSWITCH_NAME_GUEST_TRAFFIC);
        paramPublicVswitchType = _urlParams.get(ApiConstants.VSWITCH_TYPE_PUBLIC_TRAFFIC);
        paramPublicVswitchName = _urlParams.get(ApiConstants.VSWITCH_NAME_PUBLIC_TRAFFIC);
        defaultVirtualSwitchType = getDefaultVirtualSwitchType();
    }
    // Zone level vSwitch Type depends on zone level traffic labels
    // 
    // User can override Zone wide vswitch type (for public and guest) by providing following optional parameters in addClusterCmd
    // param "guestvswitchtype" with valid values vmwaredvs, vmwaresvs, nexusdvs
    // param "publicvswitchtype" with valid values vmwaredvs, vmwaresvs, nexusdvs
    // 
    // Format of label is <VSWITCH>,<VLANID>,<VSWITCHTYPE>
    // If a field <VLANID> OR <VSWITCHTYPE> is not present leave it empty.
    // Ex: 1) vswitch0
    // 2) dvswitch0,200,vmwaredvs
    // 3) nexusepp0,300,nexusdvs
    // 4) vswitch1,400,vmwaresvs
    // 5) vswitch0
    // default vswitchtype is 'vmwaresvs'.
    // <VSWITCHTYPE> 'vmwaresvs' is for vmware standard vswitch
    // <VSWITCHTYPE> 'vmwaredvs' is for vmware distributed virtual switch
    // <VSWITCHTYPE> 'nexusdvs' is for cisco nexus distributed virtual switch
    // Get zone wide traffic labels for Guest traffic and Public traffic
    guestTrafficLabel = _netmgr.getDefaultGuestTrafficLabel(dcId, HypervisorType.VMware);
    // Process traffic label information provided at zone level and cluster level
    guestTrafficLabelObj = getTrafficInfo(TrafficType.Guest, guestTrafficLabel, defaultVirtualSwitchType, paramGuestVswitchType, paramGuestVswitchName, clusterId);
    if (zoneType == NetworkType.Advanced) {
        // Get zone wide traffic label for Public traffic
        publicTrafficLabel = _netmgr.getDefaultPublicTrafficLabel(dcId, HypervisorType.VMware);
        // Process traffic label information provided at zone level and cluster level
        publicTrafficLabelObj = getTrafficInfo(TrafficType.Public, publicTrafficLabel, defaultVirtualSwitchType, paramPublicVswitchType, paramPublicVswitchName, clusterId);
        // Configuration Check: A physical network cannot be shared by different types of virtual switches.
        // 
        // Check if different vswitch types are chosen for same physical network
        // 1. Get physical network for guest traffic - multiple networks
        // 2. Get physical network for public traffic - single network
        // See if 2 is in 1
        // if no - pass
        // if yes - compare publicTrafficLabelObj.getVirtualSwitchType() == guestTrafficLabelObj.getVirtualSwitchType()
        // true  - pass
        // false - throw exception - fail cluster add operation
        List<? extends PhysicalNetwork> pNetworkListGuestTraffic = _netmgr.getPhysicalNtwksSupportingTrafficType(dcId, TrafficType.Guest);
        List<? extends PhysicalNetwork> pNetworkListPublicTraffic = _netmgr.getPhysicalNtwksSupportingTrafficType(dcId, TrafficType.Public);
        // Public network would be on single physical network hence getting first object of the list would suffice.
        PhysicalNetwork pNetworkPublic = pNetworkListPublicTraffic.get(0);
        if (pNetworkListGuestTraffic.contains(pNetworkPublic)) {
            if (publicTrafficLabelObj.getVirtualSwitchType() != guestTrafficLabelObj.getVirtualSwitchType()) {
                String msg = "Both public traffic and guest traffic is over same physical network " + pNetworkPublic + ". And virtual switch type chosen for each traffic is different" + ". A physical network cannot be shared by different types of virtual switches.";
                s_logger.error(msg);
                throw new InvalidParameterValueException(msg);
            }
        }
    }
    privateTrafficLabel = _netmgr.getDefaultManagementTrafficLabel(dcId, HypervisorType.VMware);
    if (privateTrafficLabel != null) {
        s_logger.info("Detected private network label : " + privateTrafficLabel);
    }
    Pair<Boolean, Long> vsmInfo = new Pair<Boolean, Long>(false, 0L);
    if (nexusDVS && (guestTrafficLabelObj.getVirtualSwitchType() == VirtualSwitchType.NexusDistributedVirtualSwitch) || ((zoneType == NetworkType.Advanced) && (publicTrafficLabelObj.getVirtualSwitchType() == VirtualSwitchType.NexusDistributedVirtualSwitch))) {
        // 2) Atleast 1 traffic type uses Nexus distributed virtual switch as backend.
        if (zoneType != NetworkType.Basic) {
            publicTrafficLabel = _netmgr.getDefaultPublicTrafficLabel(dcId, HypervisorType.VMware);
            if (publicTrafficLabel != null) {
                s_logger.info("Detected public network label : " + publicTrafficLabel);
            }
        }
        // Get physical network label
        guestTrafficLabel = _netmgr.getDefaultGuestTrafficLabel(dcId, HypervisorType.VMware);
        if (guestTrafficLabel != null) {
            s_logger.info("Detected guest network label : " + guestTrafficLabel);
        }
        // Before proceeding with validation of Nexus 1000v VSM check if an instance of Nexus 1000v VSM is already associated with this cluster.
        boolean clusterHasVsm = _vmwareMgr.hasNexusVSM(clusterId);
        if (!clusterHasVsm) {
            vsmIp = _urlParams.get("vsmipaddress");
            String vsmUser = _urlParams.get("vsmusername");
            String vsmPassword = _urlParams.get("vsmpassword");
            String clusterName = cluster.getName();
            try {
                vsmInfo = _nexusElement.validateAndAddVsm(vsmIp, vsmUser, vsmPassword, clusterId, clusterName);
            } catch (ResourceInUseException ex) {
                DiscoveryException discEx = new DiscoveryException(ex.getLocalizedMessage() + ". The resource is " + ex.getResourceName());
                throw discEx;
            }
        }
        vsmCredentials = _vmwareMgr.getNexusVSMCredentialsByClusterId(clusterId);
    }
    VmwareContext context = null;
    try {
        context = VmwareContextFactory.create(url.getHost(), username, password);
        if (privateTrafficLabel != null)
            context.registerStockObject("privateTrafficLabel", privateTrafficLabel);
        if (nexusDVS) {
            if (vsmCredentials != null) {
                s_logger.info("Stocking credentials of Nexus VSM");
                context.registerStockObject("vsmcredentials", vsmCredentials);
            }
        }
        List<ManagedObjectReference> morHosts = _vmwareMgr.addHostToPodCluster(context, dcId, podId, clusterId, URLDecoder.decode(url.getPath(), "UTF-8"));
        if (morHosts == null)
            s_logger.info("Found 0 hosts.");
        if (privateTrafficLabel != null)
            context.uregisterStockObject("privateTrafficLabel");
        if (morHosts == null) {
            s_logger.error("Unable to find host or cluster based on url: " + URLDecoder.decode(url.getPath(), "UTF-8"));
            return null;
        }
        ManagedObjectReference morCluster = null;
        clusterDetails = _clusterDetailsDao.findDetails(clusterId);
        if (clusterDetails.get("url") != null) {
            URI uriFromCluster = new URI(UriUtils.encodeURIComponent(clusterDetails.get("url")));
            morCluster = context.getHostMorByPath(URLDecoder.decode(uriFromCluster.getPath(), "UTF-8"));
            if (morCluster == null || !morCluster.getType().equalsIgnoreCase("ClusterComputeResource")) {
                s_logger.warn("Cluster url does not point to a valid vSphere cluster, url: " + clusterDetails.get("url"));
                return null;
            } else {
                ClusterMO clusterMo = new ClusterMO(context, morCluster);
                if (clusterMo.isHAEnabled()) {
                    clusterDetails.put("NativeHA", "true");
                    _clusterDetailsDao.persist(clusterId, clusterDetails);
                }
            }
        }
        if (!validateDiscoveredHosts(context, morCluster, morHosts)) {
            if (morCluster == null)
                s_logger.warn("The discovered host is not standalone host, can not be added to a standalone cluster");
            else
                s_logger.warn("The discovered host does not belong to the cluster");
            return null;
        }
        Map<VmwareResource, Map<String, String>> resources = new HashMap<VmwareResource, Map<String, String>>();
        for (ManagedObjectReference morHost : morHosts) {
            Map<String, String> details = new HashMap<String, String>();
            Map<String, Object> params = new HashMap<String, Object>();
            HostMO hostMo = new HostMO(context, morHost);
            details.put("url", hostMo.getHostName());
            details.put("username", username);
            details.put("password", password);
            boolean uefiLegacySupported = hostMo.isUefiLegacySupported();
            if (uefiLegacySupported) {
                details.put(Host.HOST_UEFI_ENABLE, "true");
            }
            String guid = morHost.getType() + ":" + morHost.getValue() + "@" + url.getHost();
            details.put("guid", guid);
            params.put("url", hostMo.getHostName());
            params.put("username", username);
            params.put("password", password);
            params.put("zone", Long.toString(dcId));
            params.put("pod", Long.toString(podId));
            params.put("cluster", Long.toString(clusterId));
            params.put("guid", guid);
            if (privateTrafficLabel != null) {
                params.put("private.network.vswitch.name", privateTrafficLabel);
            }
            params.put("guestTrafficInfo", guestTrafficLabelObj);
            params.put("publicTrafficInfo", publicTrafficLabelObj);
            params.put("router.aggregation.command.each.timeout", _configDao.getValue(Config.RouterAggregationCommandEachTimeout.toString()));
            VmwareResource resource = new VmwareResource();
            try {
                resource.configure("VMware", params);
            } catch (ConfigurationException e) {
                _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, dcId, podId, "Unable to add " + url.getHost(), "Error is " + e.getMessage());
                s_logger.warn("Unable to instantiate " + url.getHost(), e);
            }
            resource.start();
            resources.put(resource, details);
        }
        // place a place holder guid derived from cluster ID
        try {
            cluster.setGuid(UUID.nameUUIDFromBytes(String.valueOf(clusterId).getBytes("UTF-8")).toString());
        } catch (UnsupportedEncodingException e) {
            throw new DiscoveredWithErrorException("Unable to create UUID based on string " + String.valueOf(clusterId) + ". Bad clusterId or UTF-8 encoding error.");
        }
        _clusterDao.update(clusterId, cluster);
        // Flag cluster discovery success
        failureInClusterDiscovery = false;
        return resources;
    } catch (DiscoveredWithErrorException e) {
        throw e;
    } catch (Exception e) {
        s_logger.warn("Unable to connect to Vmware vSphere server. service address: " + url.getHost() + ". " + e);
        return null;
    } finally {
        if (context != null)
            context.close();
        if (failureInClusterDiscovery && vsmInfo.first()) {
            try {
                s_logger.debug("Deleting Nexus 1000v VSM " + vsmIp + " because cluster discovery and addition to zone has failed.");
                _nexusElement.deleteCiscoNexusVSM(vsmInfo.second().longValue());
            } catch (Exception e) {
                s_logger.warn("Deleting Nexus 1000v VSM " + vsmIp + " failed.");
            }
        }
    }
}
Also used : VmwareTrafficLabel(com.cloud.network.VmwareTrafficLabel) VmwareResource(com.cloud.hypervisor.vmware.resource.VmwareResource) HashMap(java.util.HashMap) HostMO(com.cloud.hypervisor.vmware.mo.HostMO) ClusterMO(com.cloud.hypervisor.vmware.mo.ClusterMO) URI(java.net.URI) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) ConfigurationException(javax.naming.ConfigurationException) NetworkType(com.cloud.dc.DataCenter.NetworkType) PhysicalNetwork(com.cloud.network.PhysicalNetwork) ResourceInUseException(com.cloud.exception.ResourceInUseException) DiscoveryException(com.cloud.exception.DiscoveryException) Pair(com.cloud.utils.Pair) DataCenterVO(com.cloud.dc.DataCenterVO) ClusterVO(com.cloud.dc.ClusterVO) UnsupportedEncodingException(java.io.UnsupportedEncodingException) DiscoveredWithErrorException(com.cloud.exception.DiscoveredWithErrorException) HostVO(com.cloud.host.HostVO) DiscoveredWithErrorException(com.cloud.exception.DiscoveredWithErrorException) DiscoveryException(com.cloud.exception.DiscoveryException) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) ConfigurationException(javax.naming.ConfigurationException) UnableDeleteHostException(com.cloud.resource.UnableDeleteHostException) ResourceInUseException(com.cloud.exception.ResourceInUseException) VmwareContext(com.cloud.hypervisor.vmware.util.VmwareContext) VirtualSwitchType(com.cloud.hypervisor.vmware.mo.VirtualSwitchType) Map(java.util.Map) HashMap(java.util.HashMap) ManagedObjectReference(com.vmware.vim25.ManagedObjectReference)

Example 37 with ClusterComputeResource

use of com.vmware.vim25.mo.ClusterComputeResource in project cloudstack by apache.

the class HypervisorHostHelper method prepareNetwork.

public static Pair<ManagedObjectReference, String> prepareNetwork(String vSwitchName, String namePrefix, HostMO hostMo, String vlanId, Integer networkRateMbps, Integer networkRateMulticastMbps, long timeOutMs, boolean syncPeerHosts, BroadcastDomainType broadcastDomainType, String nicUuid, Map<NetworkOffering.Detail, String> nicDetails) throws Exception {
    HostVirtualSwitch vSwitch;
    if (vSwitchName == null) {
        s_logger.info("Detected vswitch name as undefined. Defaulting to vSwitch0");
        vSwitchName = "vSwitch0";
    }
    vSwitch = hostMo.getHostVirtualSwitchByName(vSwitchName);
    if (vSwitch == null) {
        String msg = "Unable to find vSwitch" + vSwitchName;
        s_logger.error(msg);
        throw new Exception(msg);
    }
    boolean createGCTag = false;
    String networkName;
    Integer vid = null;
    /**
     * 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) {
        /**
         * Nicira NVP requires each vm to have its own port-group with a dedicated
         * vlan. We'll set the name of the pg to the uuid of the nic.
         */
        networkName = nicUuid;
        // 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);
        }
    }
    HostNetworkSecurityPolicy secPolicy = createVSSecurityPolicy(nicDetails);
    HostNetworkTrafficShapingPolicy shapingPolicy = null;
    if (networkRateMbps != null && networkRateMbps.intValue() > 0) {
        shapingPolicy = new HostNetworkTrafficShapingPolicy();
        shapingPolicy.setEnabled(true);
        shapingPolicy.setAverageBandwidth(networkRateMbps.intValue() * 1024L * 1024L);
        // 
        // TODO : people may have different opinion on how to set the following
        // 
        // give 50% premium to peek
        shapingPolicy.setPeakBandwidth((long) (shapingPolicy.getAverageBandwidth() * 1.5));
        // allow 5 seconds of burst transfer
        shapingPolicy.setBurstSize(5 * shapingPolicy.getAverageBandwidth() / 8);
    }
    boolean bWaitPortGroupReady = false;
    if (broadcastDomainType == BroadcastDomainType.Lswitch) {
        // if NSX API VERSION >= 4.2, connect to br-int (nsx.network), do not create portgroup else previous behaviour
        if (NiciraNvpApiVersion.isApiVersionLowerThan("4.2")) {
            // Previous behaviour
            if (!hostMo.hasPortGroup(vSwitch, networkName)) {
                createNvpPortGroup(hostMo, vSwitch, networkName, shapingPolicy);
                bWaitPortGroupReady = true;
            } else {
                bWaitPortGroupReady = false;
            }
        }
    } else {
        if (!hostMo.hasPortGroup(vSwitch, networkName)) {
            hostMo.createPortGroup(vSwitch, networkName, vid, secPolicy, shapingPolicy, timeOutMs);
            // 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 {
            HostPortGroupSpec spec = hostMo.getPortGroupSpec(networkName);
            if (!isSpecMatch(spec, vid, secPolicy, shapingPolicy)) {
                hostMo.updatePortGroup(vSwitch, networkName, vid, secPolicy, shapingPolicy);
                bWaitPortGroupReady = true;
            }
        }
    }
    ManagedObjectReference morNetwork = null;
    if (broadcastDomainType != BroadcastDomainType.Lswitch || (broadcastDomainType == BroadcastDomainType.Lswitch && NiciraNvpApiVersion.isApiVersionLowerThan("4.2"))) {
        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);
            throw new Exception(msg);
        }
        if (createGCTag) {
            NetworkMO networkMo = new NetworkMO(hostMo.getContext(), morNetwork);
            networkMo.setCustomFieldValue(CustomFieldConstants.CLOUD_GC, "true");
        }
    }
    if (syncPeerHosts) {
        ManagedObjectReference morParent = hostMo.getParentMor();
        if (morParent != null && morParent.getType().equals("ClusterComputeResource")) {
            // to be conservative, lock cluster
            GlobalLock lock = GlobalLock.getInternLock("ClusterLock." + morParent.getValue());
            try {
                if (lock.lock(DEFAULT_LOCK_TIMEOUT_SECONDS)) {
                    try {
                        List<ManagedObjectReference> hosts = hostMo.getContext().getVimClient().getDynamicProperty(morParent, "host");
                        if (hosts != null) {
                            for (ManagedObjectReference otherHost : hosts) {
                                if (!otherHost.getValue().equals(hostMo.getMor().getValue())) {
                                    HostMO otherHostMo = new HostMO(hostMo.getContext(), otherHost);
                                    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, broadcastDomainType, nicUuid, nicDetails);
                                    } catch (Exception e) {
                                        s_logger.warn("Unable to prepare network on other host, vlan: " + vlanId + ", host: " + otherHostMo.getHostName());
                                    }
                                }
                            }
                        }
                    } finally {
                        lock.unlock();
                    }
                } else {
                    s_logger.warn("Unable to lock cluster to prepare guest network, vlan: " + vlanId);
                }
            } finally {
                lock.releaseRef();
            }
        }
    }
    s_logger.info("Network " + networkName + " is ready on vSwitch " + vSwitchName);
    return new Pair<ManagedObjectReference, String>(morNetwork, networkName);
}
Also used : HostNetworkSecurityPolicy(com.vmware.vim25.HostNetworkSecurityPolicy) HostPortGroupSpec(com.vmware.vim25.HostPortGroupSpec) InvalidParameterException(java.security.InvalidParameterException) CloudException(com.cloud.exception.CloudException) TransformerException(javax.xml.transform.TransformerException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) IOException(java.io.IOException) URISyntaxException(java.net.URISyntaxException) SAXException(org.xml.sax.SAXException) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) GlobalLock(com.cloud.utils.db.GlobalLock) InvalidParameterException(java.security.InvalidParameterException) BroadcastDomainType(com.cloud.network.Networks.BroadcastDomainType) HostVirtualSwitch(com.vmware.vim25.HostVirtualSwitch) HostNetworkTrafficShapingPolicy(com.vmware.vim25.HostNetworkTrafficShapingPolicy) ManagedObjectReference(com.vmware.vim25.ManagedObjectReference) Pair(com.cloud.utils.Pair)

Example 38 with ClusterComputeResource

use of com.vmware.vim25.mo.ClusterComputeResource in project cloudstack by apache.

the class VmwareManagerImpl method addHostToPodCluster.

@Override
public List<ManagedObjectReference> addHostToPodCluster(VmwareContext serviceContext, long dcId, Long podId, Long clusterId, String hostInventoryPath) throws Exception {
    if (serviceContext == null) {
        throw new CloudRuntimeException("Invalid serviceContext");
    }
    ManagedObjectReference mor = serviceContext.getHostMorByPath(hostInventoryPath);
    String privateTrafficLabel = null;
    privateTrafficLabel = serviceContext.getStockObject("privateTrafficLabel");
    if (privateTrafficLabel == null) {
        privateTrafficLabel = _privateNetworkVSwitchName;
    }
    if (mor != null) {
        List<ManagedObjectReference> returnedHostList = new ArrayList<ManagedObjectReference>();
        if (mor.getType().equals("ComputeResource")) {
            List<ManagedObjectReference> hosts = serviceContext.getVimClient().getDynamicProperty(mor, "host");
            assert (hosts != null && hosts.size() > 0);
            // For ESX host, we need to enable host firewall to allow VNC access
            HostMO hostMo = new HostMO(serviceContext, hosts.get(0));
            prepareHost(hostMo, privateTrafficLabel);
            returnedHostList.add(hosts.get(0));
            return returnedHostList;
        } else if (mor.getType().equals("ClusterComputeResource")) {
            List<ManagedObjectReference> hosts = serviceContext.getVimClient().getDynamicProperty(mor, "host");
            assert (hosts != null);
            if (hosts.size() > 0) {
                AboutInfo about = (AboutInfo) (serviceContext.getVimClient().getDynamicProperty(hosts.get(0), "config.product"));
                String version = about.getApiVersion();
                int maxHostsPerCluster = _hvCapabilitiesDao.getMaxHostsPerCluster(HypervisorType.VMware, version);
                if (hosts.size() > maxHostsPerCluster) {
                    String msg = "Failed to add VMware cluster as size is too big, current size: " + hosts.size() + ", max. size: " + maxHostsPerCluster;
                    s_logger.error(msg);
                    throw new DiscoveredWithErrorException(msg);
                }
            }
            for (ManagedObjectReference morHost : hosts) {
                // For ESX host, we need to enable host firewall to allow VNC access
                HostMO hostMo = new HostMO(serviceContext, morHost);
                prepareHost(hostMo, privateTrafficLabel);
                returnedHostList.add(morHost);
            }
            return returnedHostList;
        } else if (mor.getType().equals("HostSystem")) {
            // For ESX host, we need to enable host firewall to allow VNC access
            HostMO hostMo = new HostMO(serviceContext, mor);
            prepareHost(hostMo, privateTrafficLabel);
            HostMO olderHostMo = getOldestExistentHostInCluster(clusterId, serviceContext);
            if (olderHostMo != null) {
                hostMo.copyPortGroupsFromHost(olderHostMo);
            }
            returnedHostList.add(mor);
            return returnedHostList;
        } else {
            s_logger.error("Unsupport host type " + mor.getType() + ":" + mor.getValue() + " from inventory path: " + hostInventoryPath);
            return null;
        }
    }
    s_logger.error("Unable to find host from inventory path: " + hostInventoryPath);
    return null;
}
Also used : HostMO(com.cloud.hypervisor.vmware.mo.HostMO) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) ArrayList(java.util.ArrayList) AboutInfo(com.vmware.vim25.AboutInfo) DiscoveredWithErrorException(com.cloud.exception.DiscoveredWithErrorException) ArrayList(java.util.ArrayList) List(java.util.List) ManagedObjectReference(com.vmware.vim25.ManagedObjectReference)

Example 39 with ClusterComputeResource

use of com.vmware.vim25.mo.ClusterComputeResource in project cloudstack by apache.

the class ClusterMO method getVmPropertiesOnHyperHost.

@Override
public ObjectContent[] getVmPropertiesOnHyperHost(String[] propertyPaths) throws Exception {
    if (s_logger.isTraceEnabled())
        s_logger.trace("vCenter API trace - retrieveProperties() for VM properties. target MOR: " + _mor.getValue() + ", properties: " + new Gson().toJson(propertyPaths));
    PropertySpec pSpec = new PropertySpec();
    pSpec.setType("VirtualMachine");
    pSpec.getPathSet().addAll(Arrays.asList(propertyPaths));
    TraversalSpec host2VmFolderTraversal = new TraversalSpec();
    host2VmFolderTraversal.setType("HostSystem");
    host2VmFolderTraversal.setPath("vm");
    host2VmFolderTraversal.setName("host2VmFolderTraversal");
    TraversalSpec cluster2HostFolderTraversal = new TraversalSpec();
    cluster2HostFolderTraversal.setType("ClusterComputeResource");
    cluster2HostFolderTraversal.setPath("host");
    cluster2HostFolderTraversal.setName("cluster2HostFolderTraversal");
    cluster2HostFolderTraversal.getSelectSet().add(host2VmFolderTraversal);
    ObjectSpec oSpec = new ObjectSpec();
    oSpec.setObj(getMor());
    oSpec.setSkip(Boolean.TRUE);
    oSpec.getSelectSet().add(cluster2HostFolderTraversal);
    PropertyFilterSpec pfSpec = new PropertyFilterSpec();
    pfSpec.getPropSet().add(pSpec);
    pfSpec.getObjectSet().add(oSpec);
    List<PropertyFilterSpec> pfSpecArr = new ArrayList<PropertyFilterSpec>();
    pfSpecArr.add(pfSpec);
    List<ObjectContent> properties = _context.getService().retrieveProperties(_context.getPropertyCollector(), pfSpecArr);
    if (s_logger.isTraceEnabled())
        s_logger.trace("vCenter API trace - retrieveProperties() done");
    return properties.toArray(new ObjectContent[properties.size()]);
}
Also used : PropertyFilterSpec(com.vmware.vim25.PropertyFilterSpec) ObjectContent(com.vmware.vim25.ObjectContent) ObjectSpec(com.vmware.vim25.ObjectSpec) PropertySpec(com.vmware.vim25.PropertySpec) TraversalSpec(com.vmware.vim25.TraversalSpec) ArrayList(java.util.ArrayList) Gson(com.google.gson.Gson)

Example 40 with ClusterComputeResource

use of com.vmware.vim25.mo.ClusterComputeResource in project cloudstack by apache.

the class VmwareResource method configureVnc.

protected OptionValue[] configureVnc(OptionValue[] optionsToMerge, VmwareHypervisorHost hyperHost, String vmName, String vncPassword, String keyboardLayout) throws Exception {
    VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(vmName);
    VmwareManager mgr = hyperHost.getContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
    if (!mgr.beginExclusiveOperation(600))
        throw new Exception("Unable to begin exclusive operation, lock time out");
    try {
        int maxVncPorts = 64;
        int vncPort = 0;
        Random random = new Random();
        HostMO vmOwnerHost = vmMo.getRunningHost();
        ManagedObjectReference morParent = vmOwnerHost.getParentMor();
        HashMap<String, Integer> portInfo;
        if (morParent.getType().equalsIgnoreCase("ClusterComputeResource")) {
            ClusterMO clusterMo = new ClusterMO(vmOwnerHost.getContext(), morParent);
            portInfo = clusterMo.getVmVncPortsOnCluster();
        } else {
            portInfo = vmOwnerHost.getVmVncPortsOnHost();
        }
        // allocate first at 5900 - 5964 range
        Collection<Integer> existingPorts = portInfo.values();
        int val = random.nextInt(maxVncPorts);
        int startVal = val;
        do {
            if (!existingPorts.contains(5900 + val)) {
                vncPort = 5900 + val;
                break;
            }
            val = (++val) % maxVncPorts;
        } while (val != startVal);
        if (vncPort == 0) {
            s_logger.info("we've run out of range for ports between 5900-5964 for the cluster, we will try port range at 59000-60000");
            Pair<Integer, Integer> additionalRange = mgr.getAddiionalVncPortRange();
            maxVncPorts = additionalRange.second();
            val = random.nextInt(maxVncPorts);
            startVal = val;
            do {
                if (!existingPorts.contains(additionalRange.first() + val)) {
                    vncPort = additionalRange.first() + val;
                    break;
                }
                val = (++val) % maxVncPorts;
            } while (val != startVal);
        }
        if (vncPort == 0) {
            throw new Exception("Unable to find an available VNC port on host");
        }
        if (s_logger.isInfoEnabled()) {
            s_logger.info("Configure VNC port for VM " + vmName + ", port: " + vncPort + ", host: " + vmOwnerHost.getHyperHostName());
        }
        return VmwareHelper.composeVncOptions(optionsToMerge, true, vncPassword, vncPort, keyboardLayout);
    } finally {
        try {
            mgr.endExclusiveOperation();
        } catch (Throwable e) {
            assert (false);
            s_logger.error("Unexpected exception ", e);
        }
    }
}
Also used : VmwareManager(com.cloud.hypervisor.vmware.manager.VmwareManager) HostMO(com.cloud.hypervisor.vmware.mo.HostMO) VirtualMachineMO(com.cloud.hypervisor.vmware.mo.VirtualMachineMO) ClusterMO(com.cloud.hypervisor.vmware.mo.ClusterMO) ConnectException(java.net.ConnectException) IOException(java.io.IOException) RemoteException(java.rmi.RemoteException) InternalErrorException(com.cloud.exception.InternalErrorException) CloudException(com.cloud.exception.CloudException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) ConfigurationException(javax.naming.ConfigurationException) Random(java.util.Random) ManagedObjectReference(com.vmware.vim25.ManagedObjectReference)

Aggregations

ClusterComputeResource (com.vmware.vim25.mo.ClusterComputeResource)14 HostSystem (com.vmware.vim25.mo.HostSystem)13 ManagedObjectReference (com.vmware.vim25.ManagedObjectReference)10 VcenterObjectConnectionException (com.emc.storageos.vcentercontroller.exceptions.VcenterObjectConnectionException)9 VcenterObjectNotFoundException (com.emc.storageos.vcentercontroller.exceptions.VcenterObjectNotFoundException)9 ObjectSpec (com.vmware.vim25.ObjectSpec)9 PropertyFilterSpec (com.vmware.vim25.PropertyFilterSpec)9 PropertySpec (com.vmware.vim25.PropertySpec)9 TraversalSpec (com.vmware.vim25.TraversalSpec)9 ObjectContent (com.vmware.vim25.ObjectContent)8 VcenterServerConnectionException (com.emc.storageos.vcentercontroller.exceptions.VcenterServerConnectionException)7 VcenterSystemException (com.emc.storageos.vcentercontroller.exceptions.VcenterSystemException)7 ArrayList (java.util.ArrayList)7 HostScsiDisk (com.vmware.vim25.HostScsiDisk)6 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)5 Datastore (com.vmware.vim25.mo.Datastore)5 Pair (com.cloud.utils.Pair)4 ExpandVmfsDatastore (com.emc.sa.service.vmware.block.tasks.ExpandVmfsDatastore)4 ExtendVmfsDatastore (com.emc.sa.service.vmware.block.tasks.ExtendVmfsDatastore)4 VcenterDataCenter (com.emc.storageos.db.client.model.VcenterDataCenter)4