Search in sources :

Example 1 with KvmDummyResourceBase

use of com.cloud.hypervisor.kvm.discoverer.KvmDummyResourceBase 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 2 with KvmDummyResourceBase

use of com.cloud.hypervisor.kvm.discoverer.KvmDummyResourceBase in project cosmic by MissionCriticalCloud.

the class ResourceManagerImpl method discoverHostsFull.

private List<HostVO> discoverHostsFull(final Long dcId, final Long podId, Long clusterId, final String clusterName, final String url, final String username, final String password, final String hypervisorType, final List<String> hostTags, final Map<String, String> params, final boolean deferAgentCreation) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException {
    final ResourceChecker resourceChecker = ResourceChecker.builder().dataCenterDao(_dcDao).accountManager(_accountMgr).hostPodDao(_podDao).build();
    s_logger.info("Trying to discover host for " + hypervisorType);
    final DataCenterVO zone = resourceChecker.checkIfDataCenterExists(dcId);
    final Account account = CallContext.current().getCallingAccount();
    resourceChecker.checkIfDataCenterIsUsable(zone, account);
    final HostPodVO pod = resourceChecker.checkIfPodExists(podId);
    resourceChecker.checkIfPodIsUsable(zone, pod);
    verifyClusterInfo(podId, clusterId, clusterName, hypervisorType);
    clusterId = getOrCreateCluster(zone, pod, clusterId, clusterName, hypervisorType);
    final URI uri = generateUri(url);
    final List<HostVO> hosts = new ArrayList<>();
    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)) {
            s_logger.debug("Discoverer " + discoverer.getName() + " for " + discoverer.getHypervisorType() + " is not a match for " + hypervisorType);
            continue;
        }
        s_logger.debug("Discoverer " + discoverer.getName() + " for " + discoverer.getHypervisorType() + " is a match for " + hypervisorType);
        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) {
            throw e;
        } catch (final Exception e) {
            s_logger.info("Exception in host discovery process with discoverer: " + discoverer.getName() + ", skip to another discoverer if there is any");
        }
        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);
                            return hosts;
                        }
                    }
                    return null;
                }
                final HostVO host;
                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);
    }
    s_logger.warn("Unable to find the server resources at " + url);
    throw new DiscoveryException("Unable to add the host");
}
Also used : DataCenterVO(com.cloud.dc.DataCenterVO) Account(com.cloud.user.Account) ArrayList(java.util.ArrayList) HostPodVO(com.cloud.dc.HostPodVO) URI(java.net.URI) StoragePoolHostVO(com.cloud.storage.StoragePoolHostVO) HostVO(com.cloud.host.HostVO) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) AgentUnavailableException(com.cloud.exception.AgentUnavailableException) 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.utils.exception.InvalidParameterValueException) ConfigurationException(javax.naming.ConfigurationException) KvmDummyResourceBase(com.cloud.hypervisor.kvm.discoverer.KvmDummyResourceBase) Map(java.util.Map) HashMap(java.util.HashMap) DiscoveryException(com.cloud.exception.DiscoveryException)

Aggregations

DataCenterVO (com.cloud.dc.DataCenterVO)2 HostPodVO (com.cloud.dc.HostPodVO)2 AgentUnavailableException (com.cloud.exception.AgentUnavailableException)2 DiscoveryException (com.cloud.exception.DiscoveryException)2 ResourceInUseException (com.cloud.exception.ResourceInUseException)2 HostVO (com.cloud.host.HostVO)2 KvmDummyResourceBase (com.cloud.hypervisor.kvm.discoverer.KvmDummyResourceBase)2 StoragePoolHostVO (com.cloud.storage.StoragePoolHostVO)2 Account (com.cloud.user.Account)2 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)2 NoTransitionException (com.cloud.utils.fsm.NoTransitionException)2 SshException (com.cloud.utils.ssh.SshException)2 URI (java.net.URI)2 URISyntaxException (java.net.URISyntaxException)2 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 Map (java.util.Map)2 ConfigurationException (javax.naming.ConfigurationException)2 ClusterDetailsVO (com.cloud.dc.ClusterDetailsVO)1 ClusterVO (com.cloud.dc.ClusterVO)1