Search in sources :

Example 41 with ClusterVO

use of com.cloud.dc.ClusterVO in project cloudstack by apache.

the class DateraPrimaryDataStoreLifeCycle method initialize.

@Override
public DataStore initialize(Map<String, Object> dsInfos) {
    String url = (String) dsInfos.get("url");
    Long zoneId = (Long) dsInfos.get("zoneId");
    Long podId = (Long) dsInfos.get("podId");
    Long clusterId = (Long) dsInfos.get("clusterId");
    String storagePoolName = (String) dsInfos.get("name");
    String providerName = (String) dsInfos.get("providerName");
    Long capacityBytes = (Long) dsInfos.get("capacityBytes");
    Long capacityIops = (Long) dsInfos.get("capacityIops");
    String tags = (String) dsInfos.get("tags");
    @SuppressWarnings("unchecked") Map<String, String> details = (Map<String, String>) dsInfos.get("details");
    String domainName = details.get("domainname");
    String storageVip = DateraUtil.getStorageVip(url);
    int storagePort = DateraUtil.getStoragePort(url);
    int numReplicas = DateraUtil.getNumReplicas(url);
    String volPlacement = DateraUtil.getVolPlacement(url);
    String clusterAdminUsername = DateraUtil.getValue(DateraUtil.CLUSTER_ADMIN_USERNAME, url);
    String clusterAdminPassword = DateraUtil.getValue(DateraUtil.CLUSTER_ADMIN_PASSWORD, url);
    String uuid;
    String randomString;
    PrimaryDataStoreParameters parameters = new PrimaryDataStoreParameters();
    // the uuid and then sets the podId and clusterId parameters
    if (clusterId != null) {
        if (podId == null) {
            throw new CloudRuntimeException("The Pod ID must be specified.");
        }
        if (zoneId == null) {
            throw new CloudRuntimeException("The Zone ID must be specified.");
        }
        ClusterVO cluster = _clusterDao.findById(clusterId);
        String clusterUuid = cluster.getUuid();
        randomString = DateraUtil.generateUUID(clusterUuid);
        // uuid = DateraUtil.PROVIDER_NAME + "_" + cluster.getUuid() + "_" + storageVip
        // + "_" + clusterAdminUsername + "_" + numReplicas + "_" + volPlacement;
        uuid = DateraUtil.PROVIDER_NAME + "_" + clusterUuid + "_" + randomString;
        s_logger.debug("Datera - Setting Datera cluster-wide primary storage uuid to " + uuid);
        parameters.setPodId(podId);
        parameters.setClusterId(clusterId);
        HypervisorType hypervisorType = getHypervisorTypeForCluster(clusterId);
        if (!isSupportedHypervisorType(hypervisorType)) {
            throw new CloudRuntimeException(hypervisorType + " is not a supported hypervisor type.");
        }
    } else // sets the uuid with zoneid in it
    {
        DataCenterVO zone = zoneDao.findById(zoneId);
        String zoneUuid = zone.getUuid();
        randomString = DateraUtil.generateUUID(zoneUuid);
        // uuid = DateraUtil.PROVIDER_NAME + "_" + zone.getUuid() + "_" + storageVip +
        // "_" + clusterAdminUsername + "_" + numReplicas + "_" + volPlacement;
        uuid = DateraUtil.PROVIDER_NAME + "_" + zoneUuid + "_" + randomString;
        s_logger.debug("Datera - Setting Datera zone-wide primary storage uuid to " + uuid);
    }
    if (capacityBytes == null || capacityBytes <= 0) {
        throw new IllegalArgumentException("'capacityBytes' must be present and greater than 0.");
    }
    if (capacityIops == null || capacityIops <= 0) {
        throw new IllegalArgumentException("'capacityIops' must be present and greater than 0.");
    }
    if (domainName == null) {
        domainName = "ROOT";
        s_logger.debug("setting the domain to ROOT");
    }
    s_logger.debug("Datera - domainName: " + domainName);
    parameters.setHost(storageVip);
    parameters.setPort(storagePort);
    parameters.setPath(DateraUtil.getModifiedUrl(url));
    parameters.setType(StoragePoolType.Iscsi);
    parameters.setUuid(uuid);
    parameters.setZoneId(zoneId);
    parameters.setName(storagePoolName);
    parameters.setProviderName(providerName);
    parameters.setManaged(true);
    parameters.setCapacityBytes(capacityBytes);
    parameters.setUsedBytes(0);
    parameters.setCapacityIops(capacityIops);
    parameters.setHypervisorType(HypervisorType.Any);
    parameters.setTags(tags);
    parameters.setDetails(details);
    String managementVip = DateraUtil.getManagementVip(url);
    int managementPort = DateraUtil.getManagementPort(url);
    details.put(DateraUtil.MANAGEMENT_VIP, managementVip);
    details.put(DateraUtil.MANAGEMENT_PORT, String.valueOf(managementPort));
    details.put(DateraUtil.CLUSTER_ADMIN_USERNAME, clusterAdminUsername);
    details.put(DateraUtil.CLUSTER_ADMIN_PASSWORD, clusterAdminPassword);
    long lClusterDefaultMinIops = 100;
    long lClusterDefaultMaxIops = 15000;
    try {
        String clusterDefaultMinIops = DateraUtil.getValue(DateraUtil.CLUSTER_DEFAULT_MIN_IOPS, url);
        if (clusterDefaultMinIops != null && clusterDefaultMinIops.trim().length() > 0) {
            lClusterDefaultMinIops = Long.parseLong(clusterDefaultMinIops);
        }
    } catch (NumberFormatException ex) {
        s_logger.warn("Cannot parse the setting of " + DateraUtil.CLUSTER_DEFAULT_MIN_IOPS + ", using default value: " + lClusterDefaultMinIops + ". Exception: " + ex);
    }
    try {
        String clusterDefaultMaxIops = DateraUtil.getValue(DateraUtil.CLUSTER_DEFAULT_MAX_IOPS, url);
        if (clusterDefaultMaxIops != null && clusterDefaultMaxIops.trim().length() > 0) {
            lClusterDefaultMaxIops = Long.parseLong(clusterDefaultMaxIops);
        }
    } catch (NumberFormatException ex) {
        s_logger.warn("Cannot parse the setting of " + DateraUtil.CLUSTER_DEFAULT_MAX_IOPS + ", using default value: " + lClusterDefaultMaxIops + ". Exception: " + ex);
    }
    if (lClusterDefaultMinIops > lClusterDefaultMaxIops) {
        throw new CloudRuntimeException("The parameter '" + DateraUtil.CLUSTER_DEFAULT_MIN_IOPS + "' must be less than or equal to the parameter '" + DateraUtil.CLUSTER_DEFAULT_MAX_IOPS + "'.");
    }
    if (numReplicas < DateraUtil.MIN_NUM_REPLICAS || numReplicas > DateraUtil.MAX_NUM_REPLICAS) {
        throw new CloudRuntimeException("The parameter '" + DateraUtil.NUM_REPLICAS + "' must be between  " + DateraUtil.CLUSTER_DEFAULT_MAX_IOPS + "' and " + DateraUtil.MAX_NUM_REPLICAS);
    }
    details.put(DateraUtil.CLUSTER_DEFAULT_MIN_IOPS, String.valueOf(lClusterDefaultMinIops));
    details.put(DateraUtil.CLUSTER_DEFAULT_MAX_IOPS, String.valueOf(lClusterDefaultMaxIops));
    details.put(DateraUtil.NUM_REPLICAS, String.valueOf(DateraUtil.getNumReplicas(url)));
    details.put(DateraUtil.VOL_PLACEMENT, String.valueOf(DateraUtil.getVolPlacement(url)));
    details.put(DateraUtil.IP_POOL, String.valueOf(DateraUtil.getIpPool(url)));
    return dataStoreHelper.createPrimaryDataStore(parameters);
}
Also used : DataCenterVO(com.cloud.dc.DataCenterVO) ClusterVO(com.cloud.dc.ClusterVO) HypervisorType(com.cloud.hypervisor.Hypervisor.HypervisorType) PrimaryDataStoreParameters(org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreParameters) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) Map(java.util.Map)

Example 42 with ClusterVO

use of com.cloud.dc.ClusterVO in project cloudstack by apache.

the class ManagementServerImpl method searchForClusters.

@Override
public Pair<List<? extends Cluster>, Integer> searchForClusters(final ListClustersCmd cmd) {
    final Object id = cmd.getId();
    final Object name = cmd.getClusterName();
    final Object podId = cmd.getPodId();
    Long zoneId = cmd.getZoneId();
    final Object hypervisorType = cmd.getHypervisorType();
    final Object clusterType = cmd.getClusterType();
    final Object allocationState = cmd.getAllocationState();
    final String keyword = cmd.getKeyword();
    zoneId = _accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), zoneId);
    final Filter searchFilter = new Filter(ClusterVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal());
    final SearchBuilder<ClusterVO> sb = _clusterDao.createSearchBuilder();
    sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
    sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ);
    sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ);
    sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);
    sb.and("hypervisorType", sb.entity().getHypervisorType(), SearchCriteria.Op.EQ);
    sb.and("clusterType", sb.entity().getClusterType(), SearchCriteria.Op.EQ);
    sb.and("allocationState", sb.entity().getAllocationState(), SearchCriteria.Op.EQ);
    final SearchCriteria<ClusterVO> sc = sb.create();
    if (id != null) {
        sc.setParameters("id", id);
    }
    if (name != null) {
        sc.setParameters("name", name);
    }
    if (podId != null) {
        sc.setParameters("podId", podId);
    }
    if (zoneId != null) {
        sc.setParameters("dataCenterId", zoneId);
    }
    if (hypervisorType != null) {
        sc.setParameters("hypervisorType", hypervisorType);
    }
    if (clusterType != null) {
        sc.setParameters("clusterType", clusterType);
    }
    if (allocationState != null) {
        sc.setParameters("allocationState", allocationState);
    }
    if (keyword != null) {
        final SearchCriteria<ClusterVO> ssc = _clusterDao.createSearchCriteria();
        ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
        ssc.addOr("hypervisorType", SearchCriteria.Op.LIKE, "%" + keyword + "%");
        sc.addAnd("name", SearchCriteria.Op.SC, ssc);
    }
    final Pair<List<ClusterVO>, Integer> result = _clusterDao.searchAndCount(sc, searchFilter);
    return new Pair<List<? extends Cluster>, Integer>(result.first(), result.second());
}
Also used : ClusterVO(com.cloud.dc.ClusterVO) Filter(com.cloud.utils.db.Filter) ArrayList(java.util.ArrayList) ExcludeList(com.cloud.deploy.DeploymentPlanner.ExcludeList) List(java.util.List) Pair(com.cloud.utils.Pair) SSHKeyPair(com.cloud.user.SSHKeyPair)

Example 43 with ClusterVO

use of com.cloud.dc.ClusterVO in project cloudstack by apache.

the class ManagementServerImpl method getHypervisorType.

private HypervisorType getHypervisorType(VMInstanceVO vm, StoragePool srcVolumePool) {
    HypervisorType type = null;
    if (vm == null) {
        StoragePoolVO poolVo = _poolDao.findById(srcVolumePool.getId());
        if (ScopeType.CLUSTER.equals(poolVo.getScope())) {
            Long clusterId = poolVo.getClusterId();
            if (clusterId != null) {
                ClusterVO cluster = _clusterDao.findById(clusterId);
                type = cluster.getHypervisorType();
            }
        }
        if (null == type) {
            type = srcVolumePool.getHypervisor();
        }
    } else {
        type = vm.getHypervisorType();
    }
    return type;
}
Also used : HypervisorType(com.cloud.hypervisor.Hypervisor.HypervisorType) ClusterVO(com.cloud.dc.ClusterVO) StoragePoolVO(org.apache.cloudstack.storage.datastore.db.StoragePoolVO)

Example 44 with ClusterVO

use of com.cloud.dc.ClusterVO in project cloudstack by apache.

the class ResourceManagerImpl method discoverHostsFull.

private List<HostVO> discoverHostsFull(final Long dcId, final Long podId, Long clusterId, final String clusterName, String url, String username, String password, final String hypervisorType, final List<String> hostTags, final Map<String, String> params, final boolean deferAgentCreation) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException {
    URI uri = null;
    // Check if the zone exists in the system
    final DataCenterVO zone = _dcDao.findById(dcId);
    if (zone == null) {
        throw new InvalidParameterValueException("Can't find zone by id " + dcId);
    }
    final Account account = CallContext.current().getCallingAccount();
    if (Grouping.AllocationState.Disabled == zone.getAllocationState() && !_accountMgr.isRootAdmin(account.getId())) {
        final PermissionDeniedException ex = new PermissionDeniedException("Cannot perform this operation, Zone with specified id is currently disabled");
        ex.addProxyObject(zone.getUuid(), "dcId");
        throw ex;
    }
    // Check if the pod exists in the system
    if (podId != null) {
        final HostPodVO pod = _podDao.findById(podId);
        if (pod == null) {
            throw new InvalidParameterValueException("Can't find pod by id " + podId);
        }
        // check if pod belongs to the zone
        if (!Long.valueOf(pod.getDataCenterId()).equals(dcId)) {
            final InvalidParameterValueException ex = new InvalidParameterValueException("Pod with specified podId" + podId + " doesn't belong to the zone with specified zoneId" + dcId);
            ex.addProxyObject(pod.getUuid(), "podId");
            ex.addProxyObject(zone.getUuid(), "dcId");
            throw ex;
        }
    }
    // Verify cluster information and create a new cluster if needed
    if (clusterName != null && clusterId != null) {
        throw new InvalidParameterValueException("Can't specify cluster by both id and name");
    }
    if (hypervisorType == null || hypervisorType.isEmpty()) {
        throw new InvalidParameterValueException("Need to specify Hypervisor Type");
    }
    if ((clusterName != null || clusterId != null) && podId == null) {
        throw new InvalidParameterValueException("Can't specify cluster without specifying the pod");
    }
    List<String> skipList = Arrays.asList(HypervisorType.VMware.name().toLowerCase(Locale.ROOT), Type.SecondaryStorage.name().toLowerCase(Locale.ROOT));
    if (!skipList.contains(hypervisorType.toLowerCase(Locale.ROOT))) {
        if (HypervisorType.KVM.toString().equalsIgnoreCase(hypervisorType)) {
            if (StringUtils.isBlank(username)) {
                throw new InvalidParameterValueException("Username need to be provided.");
            }
        } else {
            if (StringUtils.isBlank(username) || StringUtils.isBlank(password)) {
                throw new InvalidParameterValueException("Username and Password need to be provided.");
            }
        }
    }
    if (clusterId != null) {
        if (_clusterDao.findById(clusterId) == null) {
            throw new InvalidParameterValueException("Can't find cluster by id " + clusterId);
        }
        if (hypervisorType.equalsIgnoreCase(HypervisorType.VMware.toString())) {
            // VMware only allows adding host to an existing cluster, as we
            // already have a lot of information
            // in cluster object, to simplify user input, we will construct
            // neccessary information here
            final Map<String, String> clusterDetails = _clusterDetailsDao.findDetails(clusterId);
            username = clusterDetails.get("username");
            assert username != null;
            password = clusterDetails.get("password");
            assert password != null;
            try {
                uri = new URI(UriUtils.encodeURIComponent(url));
                url = clusterDetails.get("url") + "/" + uri.getHost();
            } catch (final URISyntaxException e) {
                throw new InvalidParameterValueException(url + " is not a valid uri");
            }
        }
    }
    if ((hypervisorType.equalsIgnoreCase(HypervisorType.BareMetal.toString()))) {
        if (hostTags.isEmpty()) {
            throw new InvalidParameterValueException("hosttag is mandatory while adding host of type Baremetal");
        }
    }
    if (clusterName != null) {
        final HostPodVO pod = _podDao.findById(podId);
        if (pod == null) {
            throw new InvalidParameterValueException("Can't find pod by id " + podId);
        }
        ClusterVO cluster = new ClusterVO(dcId, podId, clusterName);
        cluster.setHypervisorType(hypervisorType);
        try {
            cluster = _clusterDao.persist(cluster);
        } catch (final Exception e) {
            cluster = _clusterDao.findBy(clusterName, podId);
            if (cluster == null) {
                final CloudRuntimeException ex = new CloudRuntimeException("Unable to create cluster " + clusterName + " in pod with specified podId and data center with specified dcID", e);
                ex.addProxyObject(pod.getUuid(), "podId");
                ex.addProxyObject(zone.getUuid(), "dcId");
                throw ex;
            }
        }
        clusterId = cluster.getId();
        if (_clusterDetailsDao.findDetail(clusterId, "cpuOvercommitRatio") == null) {
            final ClusterDetailsVO cluster_cpu_detail = new ClusterDetailsVO(clusterId, "cpuOvercommitRatio", "1");
            final ClusterDetailsVO cluster_memory_detail = new ClusterDetailsVO(clusterId, "memoryOvercommitRatio", "1");
            _clusterDetailsDao.persist(cluster_cpu_detail);
            _clusterDetailsDao.persist(cluster_memory_detail);
        }
    }
    try {
        uri = new URI(UriUtils.encodeURIComponent(url));
        if (uri.getScheme() == null) {
            throw new InvalidParameterValueException("uri.scheme is null " + url + ", add nfs:// (or cifs://) as a prefix");
        } else if (uri.getScheme().equalsIgnoreCase("nfs")) {
            if (uri.getHost() == null || uri.getHost().equalsIgnoreCase("") || uri.getPath() == null || uri.getPath().equalsIgnoreCase("")) {
                throw new InvalidParameterValueException("Your host and/or path is wrong.  Make sure it's of the format nfs://hostname/path");
            }
        } else if (uri.getScheme().equalsIgnoreCase("cifs")) {
            // Don't validate against a URI encoded URI.
            final URI cifsUri = new URI(url);
            final String warnMsg = UriUtils.getCifsUriParametersProblems(cifsUri);
            if (warnMsg != null) {
                throw new InvalidParameterValueException(warnMsg);
            }
        }
    } catch (final URISyntaxException e) {
        throw new InvalidParameterValueException(url + " is not a valid uri");
    }
    final List<HostVO> hosts = new ArrayList<HostVO>();
    s_logger.info("Trying to add a new host at " + url + " in data center " + dcId);
    boolean isHypervisorTypeSupported = false;
    for (final Discoverer discoverer : _discoverers) {
        if (params != null) {
            discoverer.putParam(params);
        }
        if (!discoverer.matchHypervisor(hypervisorType)) {
            continue;
        }
        isHypervisorTypeSupported = true;
        Map<? extends ServerResource, Map<String, String>> resources = null;
        processResourceEvent(ResourceListener.EVENT_DISCOVER_BEFORE, dcId, podId, clusterId, uri, username, password, hostTags);
        try {
            resources = discoverer.find(dcId, podId, clusterId, uri, username, password, hostTags);
        } catch (final DiscoveryException e) {
            String errorMsg = String.format("Could not add host at [%s] with zone [%s], pod [%s] and cluster [%s] due to: [%s].", uri, dcId, podId, clusterId, e.getMessage());
            if (s_logger.isDebugEnabled()) {
                s_logger.debug(errorMsg, e);
            }
            throw new DiscoveryException(errorMsg, e);
        } catch (final Exception e) {
            String err = "Exception in host discovery process with discoverer: " + discoverer.getName();
            s_logger.info(err + ", skip to another discoverer if there is any");
            if (s_logger.isDebugEnabled()) {
                s_logger.debug(err + ":" + e.getMessage(), e);
            }
        }
        processResourceEvent(ResourceListener.EVENT_DISCOVER_AFTER, resources);
        if (resources != null) {
            for (final Map.Entry<? extends ServerResource, Map<String, String>> entry : resources.entrySet()) {
                final ServerResource resource = entry.getKey();
                /*
                     * For KVM, if we go to here, that means kvm agent is
                     * already connected to mgt svr.
                     */
                if (resource instanceof KvmDummyResourceBase) {
                    final Map<String, String> details = entry.getValue();
                    final String guid = details.get("guid");
                    final List<HostVO> kvmHosts = listAllUpAndEnabledHosts(Host.Type.Routing, clusterId, podId, dcId);
                    for (final HostVO host : kvmHosts) {
                        if (host.getGuid().equalsIgnoreCase(guid)) {
                            if (hostTags != null) {
                                if (s_logger.isTraceEnabled()) {
                                    s_logger.trace("Adding Host Tags for KVM host, tags:  :" + hostTags);
                                }
                                _hostTagsDao.persist(host.getId(), hostTags);
                            }
                            hosts.add(host);
                            _agentMgr.notifyMonitorsOfNewlyAddedHost(host.getId());
                            return hosts;
                        }
                    }
                    return null;
                }
                HostVO host = null;
                if (deferAgentCreation) {
                    host = (HostVO) createHostAndAgentDeferred(resource, entry.getValue(), true, hostTags, false);
                } else {
                    host = (HostVO) createHostAndAgent(resource, entry.getValue(), true, hostTags, false);
                }
                if (host != null) {
                    hosts.add(host);
                }
                discoverer.postDiscovery(hosts, _nodeId);
            }
            s_logger.info("server resources successfully discovered by " + discoverer.getName());
            return hosts;
        }
    }
    if (!isHypervisorTypeSupported) {
        final String msg = "Do not support HypervisorType " + hypervisorType + " for " + url;
        s_logger.warn(msg);
        throw new DiscoveryException(msg);
    }
    String errorMsg = "Cannot find the server resources at " + url;
    s_logger.warn(errorMsg);
    throw new DiscoveryException("Unable to add the host: " + errorMsg);
}
Also used : Account(com.cloud.user.Account) ArrayList(java.util.ArrayList) URISyntaxException(java.net.URISyntaxException) URI(java.net.URI) HostPodVO(com.cloud.dc.HostPodVO) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) KvmDummyResourceBase(com.cloud.hypervisor.kvm.discoverer.KvmDummyResourceBase) DiscoveryException(com.cloud.exception.DiscoveryException) DataCenterVO(com.cloud.dc.DataCenterVO) ClusterVO(com.cloud.dc.ClusterVO) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) AgentUnavailableException(com.cloud.exception.AgentUnavailableException) InsufficientServerCapacityException(com.cloud.exception.InsufficientServerCapacityException) ResourceUnavailableException(com.cloud.exception.ResourceUnavailableException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) ResourceInUseException(com.cloud.exception.ResourceInUseException) URISyntaxException(java.net.URISyntaxException) DiscoveryException(com.cloud.exception.DiscoveryException) SshException(com.cloud.utils.ssh.SshException) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) ConfigurationException(javax.naming.ConfigurationException) PermissionDeniedException(com.cloud.exception.PermissionDeniedException) StoragePoolHostVO(com.cloud.storage.StoragePoolHostVO) HostVO(com.cloud.host.HostVO) PermissionDeniedException(com.cloud.exception.PermissionDeniedException) ClusterDetailsVO(com.cloud.dc.ClusterDetailsVO) Map(java.util.Map) HashMap(java.util.HashMap)

Example 45 with ClusterVO

use of com.cloud.dc.ClusterVO in project cloudstack by apache.

the class ResourceManagerImpl method updateCluster.

@Override
@DB
public Cluster updateCluster(UpdateClusterCmd cmd) {
    ClusterVO cluster = (ClusterVO) getCluster(cmd.getId());
    String clusterType = cmd.getClusterType();
    String hypervisor = cmd.getHypervisor();
    String allocationState = cmd.getAllocationState();
    String managedstate = cmd.getManagedstate();
    String name = cmd.getClusterName();
    // Verify cluster information and update the cluster if needed
    boolean doUpdate = false;
    if (StringUtils.isNotBlank(name)) {
        if (cluster.getHypervisorType() == HypervisorType.VMware) {
            throw new InvalidParameterValueException("Renaming VMware cluster is not supported as it could cause problems if the updated  cluster name is not mapped on VCenter.");
        }
        s_logger.debug("Updating Cluster name to: " + name);
        cluster.setName(name);
        doUpdate = true;
    }
    if (hypervisor != null && !hypervisor.isEmpty()) {
        final Hypervisor.HypervisorType hypervisorType = Hypervisor.HypervisorType.getType(hypervisor);
        if (hypervisorType == null) {
            s_logger.error("Unable to resolve " + hypervisor + " to a valid supported hypervisor type");
            throw new InvalidParameterValueException("Unable to resolve " + hypervisor + " to a supported type");
        } else {
            cluster.setHypervisorType(hypervisor);
            doUpdate = true;
        }
    }
    Cluster.ClusterType newClusterType = null;
    if (clusterType != null && !clusterType.isEmpty()) {
        try {
            newClusterType = Cluster.ClusterType.valueOf(clusterType);
        } catch (final IllegalArgumentException ex) {
            throw new InvalidParameterValueException("Unable to resolve " + clusterType + " to a supported type");
        }
        if (newClusterType == null) {
            s_logger.error("Unable to resolve " + clusterType + " to a valid supported cluster type");
            throw new InvalidParameterValueException("Unable to resolve " + clusterType + " to a supported type");
        } else {
            cluster.setClusterType(newClusterType);
            doUpdate = true;
        }
    }
    Grouping.AllocationState newAllocationState = null;
    if (allocationState != null && !allocationState.isEmpty()) {
        try {
            newAllocationState = Grouping.AllocationState.valueOf(allocationState);
        } catch (final IllegalArgumentException ex) {
            throw new InvalidParameterValueException("Unable to resolve Allocation State '" + allocationState + "' to a supported state");
        }
        if (newAllocationState == null) {
            s_logger.error("Unable to resolve " + allocationState + " to a valid supported allocation State");
            throw new InvalidParameterValueException("Unable to resolve " + allocationState + " to a supported state");
        } else {
            cluster.setAllocationState(newAllocationState);
            doUpdate = true;
        }
    }
    Managed.ManagedState newManagedState = null;
    final Managed.ManagedState oldManagedState = cluster.getManagedState();
    if (managedstate != null && !managedstate.isEmpty()) {
        try {
            newManagedState = Managed.ManagedState.valueOf(managedstate);
        } catch (final IllegalArgumentException ex) {
            throw new InvalidParameterValueException("Unable to resolve Managed State '" + managedstate + "' to a supported state");
        }
        if (newManagedState == null) {
            s_logger.error("Unable to resolve Managed State '" + managedstate + "' to a supported state");
            throw new InvalidParameterValueException("Unable to resolve Managed State '" + managedstate + "' to a supported state");
        } else {
            doUpdate = true;
        }
    }
    if (doUpdate) {
        _clusterDao.update(cluster.getId(), cluster);
    }
    if (newManagedState != null && !newManagedState.equals(oldManagedState)) {
        if (newManagedState.equals(Managed.ManagedState.Unmanaged)) {
            boolean success = false;
            try {
                cluster.setManagedState(Managed.ManagedState.PrepareUnmanaged);
                _clusterDao.update(cluster.getId(), cluster);
                List<HostVO> hosts = listAllHosts(Host.Type.Routing, cluster.getId(), cluster.getPodId(), cluster.getDataCenterId());
                for (final HostVO host : hosts) {
                    if (host.getType().equals(Host.Type.Routing) && !host.getStatus().equals(Status.Down) && !host.getStatus().equals(Status.Disconnected) && !host.getStatus().equals(Status.Up) && !host.getStatus().equals(Status.Alert)) {
                        final String msg = "host " + host.getPrivateIpAddress() + " should not be in " + host.getStatus().toString() + " status";
                        throw new CloudRuntimeException("PrepareUnmanaged Failed due to " + msg);
                    }
                }
                for (final HostVO host : hosts) {
                    if (host.getStatus().equals(Status.Up)) {
                        umanageHost(host.getId());
                    }
                }
                final int retry = 40;
                boolean lsuccess = true;
                for (int i = 0; i < retry; i++) {
                    lsuccess = true;
                    try {
                        Thread.sleep(5 * 1000);
                    } catch (final Exception e) {
                    }
                    hosts = listAllUpAndEnabledHosts(Host.Type.Routing, cluster.getId(), cluster.getPodId(), cluster.getDataCenterId());
                    for (final HostVO host : hosts) {
                        if (!host.getStatus().equals(Status.Down) && !host.getStatus().equals(Status.Disconnected) && !host.getStatus().equals(Status.Alert)) {
                            lsuccess = false;
                            break;
                        }
                    }
                    if (lsuccess == true) {
                        success = true;
                        break;
                    }
                }
                if (success == false) {
                    throw new CloudRuntimeException("PrepareUnmanaged Failed due to some hosts are still in UP status after 5 Minutes, please try later ");
                }
            } finally {
                cluster.setManagedState(success ? Managed.ManagedState.Unmanaged : Managed.ManagedState.PrepareUnmanagedError);
                _clusterDao.update(cluster.getId(), cluster);
            }
        } else if (newManagedState.equals(Managed.ManagedState.Managed)) {
            cluster.setManagedState(Managed.ManagedState.Managed);
            _clusterDao.update(cluster.getId(), cluster);
        }
    }
    return cluster;
}
Also used : ClusterVO(com.cloud.dc.ClusterVO) Hypervisor(com.cloud.hypervisor.Hypervisor) PodCluster(com.cloud.dc.PodCluster) Cluster(com.cloud.org.Cluster) Grouping(com.cloud.org.Grouping) StoragePoolHostVO(com.cloud.storage.StoragePoolHostVO) HostVO(com.cloud.host.HostVO) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) AgentUnavailableException(com.cloud.exception.AgentUnavailableException) InsufficientServerCapacityException(com.cloud.exception.InsufficientServerCapacityException) ResourceUnavailableException(com.cloud.exception.ResourceUnavailableException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) ResourceInUseException(com.cloud.exception.ResourceInUseException) URISyntaxException(java.net.URISyntaxException) DiscoveryException(com.cloud.exception.DiscoveryException) SshException(com.cloud.utils.ssh.SshException) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) ConfigurationException(javax.naming.ConfigurationException) PermissionDeniedException(com.cloud.exception.PermissionDeniedException) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) HypervisorType(com.cloud.hypervisor.Hypervisor.HypervisorType) Managed(com.cloud.org.Managed) DB(com.cloud.utils.db.DB)

Aggregations

ClusterVO (com.cloud.dc.ClusterVO)151 HostVO (com.cloud.host.HostVO)72 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)66 ArrayList (java.util.ArrayList)55 HostPodVO (com.cloud.dc.HostPodVO)46 DataCenterVO (com.cloud.dc.DataCenterVO)38 ConfigurationException (javax.naming.ConfigurationException)37 HashMap (java.util.HashMap)28 HypervisorType (com.cloud.hypervisor.Hypervisor.HypervisorType)24 Map (java.util.Map)24 DiscoveryException (com.cloud.exception.DiscoveryException)21 DB (com.cloud.utils.db.DB)21 AgentUnavailableException (com.cloud.exception.AgentUnavailableException)20 InvalidParameterValueException (com.cloud.exception.InvalidParameterValueException)20 Account (com.cloud.user.Account)17 List (java.util.List)17 StoragePoolVO (org.apache.cloudstack.storage.datastore.db.StoragePoolVO)17 StoragePoolHostVO (com.cloud.storage.StoragePoolHostVO)16 ClusterDetailsVO (com.cloud.dc.ClusterDetailsVO)15 DedicatedResourceVO (com.cloud.dc.DedicatedResourceVO)14