Search in sources :

Example 61 with VirtualMachineTemplate

use of com.cloud.template.VirtualMachineTemplate in project cloudstack by apache.

the class AccountManagerImpl method checkAccess.

@Override
public void checkAccess(Account caller, AccessType accessType, boolean sameOwner, String apiName, ControlledEntity... entities) {
    // check for the same owner
    Long ownerId = null;
    ControlledEntity prevEntity = null;
    if (sameOwner) {
        for (ControlledEntity entity : entities) {
            if (ownerId == null) {
                ownerId = entity.getAccountId();
            } else if (ownerId.longValue() != entity.getAccountId()) {
                throw new PermissionDeniedException("Entity " + entity + " and entity " + prevEntity + " belong to different accounts");
            }
            prevEntity = entity;
        }
    }
    if (caller.getId() == Account.ACCOUNT_ID_SYSTEM || isRootAdmin(caller.getId())) {
        // no need to make permission checks if the system/root admin makes the call
        if (s_logger.isTraceEnabled()) {
            s_logger.trace("No need to make permission check for System/RootAdmin account, returning true");
        }
        return;
    }
    HashMap<Long, List<ControlledEntity>> domains = new HashMap<Long, List<ControlledEntity>>();
    for (ControlledEntity entity : entities) {
        long domainId = entity.getDomainId();
        if (entity.getAccountId() != -1 && domainId == -1) {
            // If account exists domainId should too so calculate
            // it. This condition might be hit for templates or entities which miss domainId in their tables
            Account account = ApiDBUtils.findAccountById(entity.getAccountId());
            domainId = account != null ? account.getDomainId() : -1;
        }
        if (entity.getAccountId() != -1 && domainId != -1 && !(entity instanceof VirtualMachineTemplate) && !(entity instanceof Network && accessType != null && accessType == AccessType.UseEntry) && !(entity instanceof AffinityGroup)) {
            List<ControlledEntity> toBeChecked = domains.get(entity.getDomainId());
            // for templates, we don't have to do cross domains check
            if (toBeChecked == null) {
                toBeChecked = new ArrayList<ControlledEntity>();
                domains.put(domainId, toBeChecked);
            }
            toBeChecked.add(entity);
        }
        boolean granted = false;
        for (SecurityChecker checker : _securityCheckers) {
            if (checker.checkAccess(caller, entity, accessType, apiName)) {
                if (s_logger.isDebugEnabled()) {
                    s_logger.debug("Access to " + entity + " granted to " + caller + " by " + checker.getName());
                }
                granted = true;
                break;
            }
        }
        if (!granted) {
            assert false : "How can all of the security checkers pass on checking this check: " + entity;
            throw new PermissionDeniedException("There's no way to confirm " + caller + " has access to " + entity);
        }
    }
    for (Map.Entry<Long, List<ControlledEntity>> domain : domains.entrySet()) {
        for (SecurityChecker checker : _securityCheckers) {
            Domain d = _domainMgr.getDomain(domain.getKey());
            if (d == null || d.getRemoved() != null) {
                throw new PermissionDeniedException("Domain is not found.", caller, domain.getValue());
            }
            try {
                checker.checkAccess(caller, d);
            } catch (PermissionDeniedException e) {
                e.addDetails(caller, domain.getValue());
                throw e;
            }
        }
    }
// check that resources belong to the same account
}
Also used : VirtualMachineTemplate(com.cloud.template.VirtualMachineTemplate) HashMap(java.util.HashMap) SecurityChecker(org.apache.cloudstack.acl.SecurityChecker) AffinityGroup(org.apache.cloudstack.affinity.AffinityGroup) ControlledEntity(org.apache.cloudstack.acl.ControlledEntity) Network(com.cloud.network.Network) PermissionDeniedException(com.cloud.exception.PermissionDeniedException) ArrayList(java.util.ArrayList) List(java.util.List) Domain(com.cloud.domain.Domain) Map(java.util.Map) HashMap(java.util.HashMap)

Example 62 with VirtualMachineTemplate

use of com.cloud.template.VirtualMachineTemplate in project cloudstack by apache.

the class DomainChecker method checkAccess.

@Override
public boolean checkAccess(Account caller, ControlledEntity entity, AccessType accessType) throws PermissionDeniedException {
    if (entity instanceof VirtualMachineTemplate) {
        VirtualMachineTemplate template = (VirtualMachineTemplate) entity;
        Account owner = _accountDao.findById(template.getAccountId());
        // validate that the template is usable by the account
        if (!template.isPublicTemplate()) {
            if (_accountService.isRootAdmin(caller.getId()) || (owner.getId() == caller.getId())) {
                return true;
            }
            // special handling for the project case
            if (owner.getType() == Account.ACCOUNT_TYPE_PROJECT && _projectMgr.canAccessProjectAccount(caller, owner.getId())) {
                return true;
            }
            // since the current account is not the owner of the template, check the launch permissions table to see if the
            // account can launch a VM from this template
            LaunchPermissionVO permission = _launchPermissionDao.findByTemplateAndAccount(template.getId(), caller.getId());
            if (permission == null) {
                throw new PermissionDeniedException("Account " + caller.getAccountName() + " does not have permission to launch instances from template " + template.getName());
            }
        } else {
            // Domain admin and regular user can delete/modify only templates created by them
            if (accessType != null && accessType == AccessType.OperateEntry) {
                if (!_accountService.isRootAdmin(caller.getId()) && owner.getId() != caller.getId()) {
                    // For projects check if the caller account can access the project account
                    if (owner.getType() != Account.ACCOUNT_TYPE_PROJECT || !(_projectMgr.canAccessProjectAccount(caller, owner.getId()))) {
                        throw new PermissionDeniedException("Domain Admin and regular users can modify only their own Public templates");
                    }
                }
            }
        }
        return true;
    } else if (entity instanceof Network && accessType != null && accessType == AccessType.UseEntry) {
        _networkMgr.checkNetworkPermissions(caller, (Network) entity);
    } else if (entity instanceof AffinityGroup) {
        return false;
    } else {
        if (_accountService.isNormalUser(caller.getId())) {
            Account account = _accountDao.findById(entity.getAccountId());
            String errorMessage = String.format("%s does not have permission to operate with resource", caller);
            if (account != null && account.getType() == Account.ACCOUNT_TYPE_PROJECT) {
                // only project owner can delete/modify the project
                if (accessType != null && accessType == AccessType.ModifyProject) {
                    if (!_projectMgr.canModifyProjectAccount(caller, account.getId())) {
                        throw new PermissionDeniedException(errorMessage);
                    }
                } else if (!_projectMgr.canAccessProjectAccount(caller, account.getId())) {
                    throw new PermissionDeniedException(errorMessage);
                }
                checkOperationPermitted(caller, entity);
            } else {
                if (caller.getId() != entity.getAccountId()) {
                    throw new PermissionDeniedException(errorMessage);
                }
            }
        }
    }
    return true;
}
Also used : Account(com.cloud.user.Account) ProjectAccount(com.cloud.projects.ProjectAccount) VirtualMachineTemplate(com.cloud.template.VirtualMachineTemplate) Network(com.cloud.network.Network) PermissionDeniedException(com.cloud.exception.PermissionDeniedException) AffinityGroup(org.apache.cloudstack.affinity.AffinityGroup) LaunchPermissionVO(com.cloud.storage.LaunchPermissionVO)

Example 63 with VirtualMachineTemplate

use of com.cloud.template.VirtualMachineTemplate in project cloudstack by apache.

the class KubernetesVersionManagerImpl method addKubernetesSupportedVersion.

@Override
@ActionEvent(eventType = KubernetesVersionEventTypes.EVENT_KUBERNETES_VERSION_ADD, eventDescription = "Adding Kubernetes supported version")
public KubernetesSupportedVersionResponse addKubernetesSupportedVersion(final AddKubernetesSupportedVersionCmd cmd) {
    if (!KubernetesClusterService.KubernetesServiceEnabled.value()) {
        throw new CloudRuntimeException("Kubernetes Service plugin is disabled");
    }
    String name = cmd.getName();
    final String semanticVersion = cmd.getSemanticVersion();
    final Long zoneId = cmd.getZoneId();
    final String isoUrl = cmd.getUrl();
    final String isoChecksum = cmd.getChecksum();
    final Integer minimumCpu = cmd.getMinimumCpu();
    final Integer minimumRamSize = cmd.getMinimumRamSize();
    if (minimumCpu == null || minimumCpu < KubernetesClusterService.MIN_KUBERNETES_CLUSTER_NODE_CPU) {
        throw new InvalidParameterValueException(String.format("Invalid value for %s parameter. Minimum %d vCPUs required.", ApiConstants.MIN_CPU_NUMBER, KubernetesClusterService.MIN_KUBERNETES_CLUSTER_NODE_CPU));
    }
    if (minimumRamSize == null || minimumRamSize < KubernetesClusterService.MIN_KUBERNETES_CLUSTER_NODE_RAM_SIZE) {
        throw new InvalidParameterValueException(String.format("Invalid value for %s parameter. Minimum %dMB memory required", ApiConstants.MIN_MEMORY, KubernetesClusterService.MIN_KUBERNETES_CLUSTER_NODE_RAM_SIZE));
    }
    if (compareSemanticVersions(semanticVersion, MIN_KUBERNETES_VERSION) < 0) {
        throw new InvalidParameterValueException(String.format("New supported Kubernetes version cannot be added as %s is minimum version supported by Kubernetes Service", MIN_KUBERNETES_VERSION));
    }
    if (zoneId != null && dataCenterDao.findById(zoneId) == null) {
        throw new InvalidParameterValueException("Invalid zone specified");
    }
    if (StringUtils.isEmpty(isoUrl)) {
        throw new InvalidParameterValueException(String.format("Invalid URL for ISO specified, %s", isoUrl));
    }
    if (StringUtils.isEmpty(name)) {
        name = String.format("v%s", semanticVersion);
        if (zoneId != null) {
            name = String.format("%s-%s", name, dataCenterDao.findById(zoneId).getName());
        }
    }
    VMTemplateVO template = null;
    try {
        VirtualMachineTemplate vmTemplate = registerKubernetesVersionIso(zoneId, name, isoUrl, isoChecksum);
        template = templateDao.findById(vmTemplate.getId());
    } catch (IllegalAccessException | NoSuchFieldException | IllegalArgumentException | ResourceAllocationException ex) {
        LOGGER.error(String.format("Unable to register binaries ISO for supported kubernetes version, %s, with url: %s", name, isoUrl), ex);
        throw new CloudRuntimeException(String.format("Unable to register binaries ISO for supported kubernetes version, %s, with url: %s", name, isoUrl));
    }
    KubernetesSupportedVersionVO supportedVersionVO = new KubernetesSupportedVersionVO(name, semanticVersion, template.getId(), zoneId, minimumCpu, minimumRamSize);
    supportedVersionVO = kubernetesSupportedVersionDao.persist(supportedVersionVO);
    return createKubernetesSupportedVersionResponse(supportedVersionVO);
}
Also used : VirtualMachineTemplate(com.cloud.template.VirtualMachineTemplate) VMTemplateVO(com.cloud.storage.VMTemplateVO) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) ResourceAllocationException(com.cloud.exception.ResourceAllocationException) ActionEvent(com.cloud.event.ActionEvent)

Example 64 with VirtualMachineTemplate

use of com.cloud.template.VirtualMachineTemplate in project cloudstack by apache.

the class VpcVirtualNetworkApplianceManagerImpl method getVirtualMachineProfile.

private VirtualMachineProfile getVirtualMachineProfile(DomainRouterVO router) {
    final ServiceOfferingVO offering = _serviceOfferingDao.findById(router.getId(), router.getServiceOfferingId());
    final VirtualMachineTemplate template = _entityMgr.findByIdIncludingRemoved(VirtualMachineTemplate.class, router.getTemplateId());
    final Account owner = _entityMgr.findById(Account.class, router.getAccountId());
    final VirtualMachineProfileImpl profile = new VirtualMachineProfileImpl(router, template, offering, owner, null);
    for (final NicProfile nic : _networkMgr.getNicProfiles(router)) {
        profile.addNic(nic);
    }
    return profile;
}
Also used : Account(com.cloud.user.Account) VirtualMachineTemplate(com.cloud.template.VirtualMachineTemplate) VirtualMachineProfileImpl(com.cloud.vm.VirtualMachineProfileImpl) NicProfile(com.cloud.vm.NicProfile) ServiceOfferingVO(com.cloud.service.ServiceOfferingVO)

Example 65 with VirtualMachineTemplate

use of com.cloud.template.VirtualMachineTemplate in project cloudstack by apache.

the class TemplateServiceImpl method handleTemplateSync.

@Override
public void handleTemplateSync(DataStore store) {
    if (store == null) {
        s_logger.warn("Huh? image store is null");
        return;
    }
    long storeId = store.getId();
    // add lock to make template sync for a data store only be done once
    String lockString = "templatesync.storeId:" + storeId;
    GlobalLock syncLock = GlobalLock.getInternLock(lockString);
    try {
        if (syncLock.lock(3)) {
            try {
                Long zoneId = store.getScope().getScopeId();
                Map<String, TemplateProp> templateInfos = listTemplate(store);
                if (templateInfos == null) {
                    return;
                }
                Set<VMTemplateVO> toBeDownloaded = new HashSet<VMTemplateVO>();
                List<VMTemplateVO> allTemplates = null;
                if (zoneId == null) {
                    // region wide store
                    allTemplates = _templateDao.listByState(VirtualMachineTemplate.State.Active, VirtualMachineTemplate.State.NotUploaded, VirtualMachineTemplate.State.UploadInProgress);
                } else {
                    // zone wide store
                    allTemplates = _templateDao.listInZoneByState(zoneId, VirtualMachineTemplate.State.Active, VirtualMachineTemplate.State.NotUploaded, VirtualMachineTemplate.State.UploadInProgress);
                }
                List<VMTemplateVO> rtngTmplts = _templateDao.listAllSystemVMTemplates();
                List<VMTemplateVO> defaultBuiltin = _templateDao.listDefaultBuiltinTemplates();
                if (rtngTmplts != null) {
                    for (VMTemplateVO rtngTmplt : rtngTmplts) {
                        if (!allTemplates.contains(rtngTmplt)) {
                            allTemplates.add(rtngTmplt);
                        }
                    }
                }
                if (defaultBuiltin != null) {
                    for (VMTemplateVO builtinTmplt : defaultBuiltin) {
                        if (!allTemplates.contains(builtinTmplt)) {
                            allTemplates.add(builtinTmplt);
                        }
                    }
                }
                for (Iterator<VMTemplateVO> iter = allTemplates.listIterator(); iter.hasNext(); ) {
                    VMTemplateVO child_template = iter.next();
                    if (child_template.getParentTemplateId() != null) {
                        String uniqueName = child_template.getUniqueName();
                        if (templateInfos.containsKey(uniqueName)) {
                            templateInfos.remove(uniqueName);
                        }
                        iter.remove();
                    }
                }
                toBeDownloaded.addAll(allTemplates);
                final StateMachine2<VirtualMachineTemplate.State, VirtualMachineTemplate.Event, VirtualMachineTemplate> stateMachine = VirtualMachineTemplate.State.getStateMachine();
                for (VMTemplateVO tmplt : allTemplates) {
                    String uniqueName = tmplt.getUniqueName();
                    TemplateDataStoreVO tmpltStore = _vmTemplateStoreDao.findByStoreTemplate(storeId, tmplt.getId());
                    if (templateInfos.containsKey(uniqueName)) {
                        TemplateProp tmpltInfo = templateInfos.remove(uniqueName);
                        toBeDownloaded.remove(tmplt);
                        if (tmpltStore != null) {
                            s_logger.info("Template Sync found " + uniqueName + " already in the image store");
                            if (tmpltStore.getDownloadState() != Status.DOWNLOADED) {
                                tmpltStore.setErrorString("");
                            }
                            if (tmpltInfo.isCorrupted()) {
                                tmpltStore.setDownloadState(Status.DOWNLOAD_ERROR);
                                String msg = "Template " + tmplt.getName() + ":" + tmplt.getId() + " is corrupted on secondary storage " + tmpltStore.getId();
                                tmpltStore.setErrorString(msg);
                                s_logger.info(msg);
                                _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_UPLOAD_FAILED, zoneId, null, msg, msg);
                                if (tmplt.getState() == VirtualMachineTemplate.State.NotUploaded || tmplt.getState() == VirtualMachineTemplate.State.UploadInProgress) {
                                    s_logger.info("Template Sync found " + uniqueName + " on image store " + storeId + " uploaded using SSVM as corrupted, marking it as failed");
                                    tmpltStore.setState(State.Failed);
                                    try {
                                        stateMachine.transitTo(tmplt, VirtualMachineTemplate.Event.OperationFailed, null, _templateDao);
                                    } catch (NoTransitionException e) {
                                        s_logger.error("Unexpected state transition exception for template " + tmplt.getName() + ". Details: " + e.getMessage());
                                    }
                                } else if (tmplt.getUrl() == null) {
                                    msg = "Private template (" + tmplt + ") with install path " + tmpltInfo.getInstallPath() + " is corrupted, please check in image store: " + tmpltStore.getDataStoreId();
                                    s_logger.warn(msg);
                                } else {
                                    s_logger.info("Removing template_store_ref entry for corrupted template " + tmplt.getName());
                                    _vmTemplateStoreDao.remove(tmpltStore.getId());
                                    toBeDownloaded.add(tmplt);
                                }
                            } else {
                                if (tmpltStore.getDownloadState() != Status.DOWNLOADED) {
                                    String etype = EventTypes.EVENT_TEMPLATE_CREATE;
                                    if (tmplt.getFormat() == ImageFormat.ISO) {
                                        etype = EventTypes.EVENT_ISO_CREATE;
                                    }
                                    if (zoneId != null) {
                                        UsageEventUtils.publishUsageEvent(etype, tmplt.getAccountId(), zoneId, tmplt.getId(), tmplt.getName(), null, null, tmpltInfo.getPhysicalSize(), tmpltInfo.getSize(), VirtualMachineTemplate.class.getName(), tmplt.getUuid());
                                    }
                                }
                                tmpltStore.setDownloadPercent(100);
                                tmpltStore.setDownloadState(Status.DOWNLOADED);
                                tmpltStore.setState(ObjectInDataStoreStateMachine.State.Ready);
                                tmpltStore.setInstallPath(tmpltInfo.getInstallPath());
                                tmpltStore.setSize(tmpltInfo.getSize());
                                tmpltStore.setPhysicalSize(tmpltInfo.getPhysicalSize());
                                tmpltStore.setLastUpdated(new Date());
                                // update size in vm_template table
                                VMTemplateVO tmlpt = _templateDao.findById(tmplt.getId());
                                tmlpt.setSize(tmpltInfo.getSize());
                                _templateDao.update(tmplt.getId(), tmlpt);
                                if (tmplt.getState() == VirtualMachineTemplate.State.NotUploaded || tmplt.getState() == VirtualMachineTemplate.State.UploadInProgress) {
                                    VirtualMachineTemplate.Event event = VirtualMachineTemplate.Event.OperationSucceeded;
                                    // For multi-disk OVA, check and create data disk templates
                                    if (tmplt.getFormat().equals(ImageFormat.OVA)) {
                                        if (!createOvaDataDiskTemplates(_templateFactory.getTemplate(tmlpt.getId(), store), tmplt.isDeployAsIs())) {
                                            event = VirtualMachineTemplate.Event.OperationFailed;
                                        }
                                    }
                                    try {
                                        stateMachine.transitTo(tmplt, event, null, _templateDao);
                                    } catch (NoTransitionException e) {
                                        s_logger.error("Unexpected state transition exception for template " + tmplt.getName() + ". Details: " + e.getMessage());
                                    }
                                }
                                // which already got checked and incremented during createTemplate API call.
                                if (tmpltInfo.getSize() > 0 && tmplt.getAccountId() != Account.ACCOUNT_ID_SYSTEM && tmplt.getUrl() != null) {
                                    long accountId = tmplt.getAccountId();
                                    try {
                                        _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(accountId), com.cloud.configuration.Resource.ResourceType.secondary_storage, tmpltInfo.getSize() - UriUtils.getRemoteSize(tmplt.getUrl()));
                                    } catch (ResourceAllocationException e) {
                                        s_logger.warn(e.getMessage());
                                        _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_RESOURCE_LIMIT_EXCEEDED, zoneId, null, e.getMessage(), e.getMessage());
                                    } finally {
                                        _resourceLimitMgr.recalculateResourceCount(accountId, _accountMgr.getAccount(accountId).getDomainId(), com.cloud.configuration.Resource.ResourceType.secondary_storage.getOrdinal());
                                    }
                                }
                            }
                            _vmTemplateStoreDao.update(tmpltStore.getId(), tmpltStore);
                        } else {
                            tmpltStore = new TemplateDataStoreVO(storeId, tmplt.getId(), new Date(), 100, Status.DOWNLOADED, null, null, null, tmpltInfo.getInstallPath(), tmplt.getUrl());
                            tmpltStore.setSize(tmpltInfo.getSize());
                            tmpltStore.setPhysicalSize(tmpltInfo.getPhysicalSize());
                            tmpltStore.setDataStoreRole(store.getRole());
                            _vmTemplateStoreDao.persist(tmpltStore);
                            // update size in vm_template table
                            VMTemplateVO tmlpt = _templateDao.findById(tmplt.getId());
                            tmlpt.setSize(tmpltInfo.getSize());
                            _templateDao.update(tmplt.getId(), tmlpt);
                            associateTemplateToZone(tmplt.getId(), zoneId);
                            String etype = EventTypes.EVENT_TEMPLATE_CREATE;
                            if (tmplt.getFormat() == ImageFormat.ISO) {
                                etype = EventTypes.EVENT_ISO_CREATE;
                            }
                            UsageEventUtils.publishUsageEvent(etype, tmplt.getAccountId(), zoneId, tmplt.getId(), tmplt.getName(), null, null, tmpltInfo.getPhysicalSize(), tmpltInfo.getSize(), VirtualMachineTemplate.class.getName(), tmplt.getUuid());
                        }
                    } else if (tmplt.getState() == VirtualMachineTemplate.State.NotUploaded || tmplt.getState() == VirtualMachineTemplate.State.UploadInProgress) {
                        s_logger.info("Template Sync did not find " + uniqueName + " on image store " + storeId + " uploaded using SSVM, marking it as failed");
                        toBeDownloaded.remove(tmplt);
                        tmpltStore.setDownloadState(Status.DOWNLOAD_ERROR);
                        String msg = "Template " + tmplt.getName() + ":" + tmplt.getId() + " is corrupted on secondary storage " + tmpltStore.getId();
                        tmpltStore.setErrorString(msg);
                        tmpltStore.setState(State.Failed);
                        _vmTemplateStoreDao.update(tmpltStore.getId(), tmpltStore);
                        try {
                            stateMachine.transitTo(tmplt, VirtualMachineTemplate.Event.OperationFailed, null, _templateDao);
                        } catch (NoTransitionException e) {
                            s_logger.error("Unexpected state transition exception for template " + tmplt.getName() + ". Details: " + e.getMessage());
                        }
                    } else if (tmplt.isDirectDownload()) {
                        s_logger.info("Template " + tmplt.getName() + ":" + tmplt.getId() + " is marked for direct download, discarding it for download on image stores");
                        toBeDownloaded.remove(tmplt);
                    } else {
                        s_logger.info("Template Sync did not find " + uniqueName + " on image store " + storeId + ", may request download based on available hypervisor types");
                        if (tmpltStore != null) {
                            if (_storeMgr.isRegionStore(store) && tmpltStore.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED && tmpltStore.getState() == State.Ready && tmpltStore.getInstallPath() == null) {
                                s_logger.info("Keep fake entry in template store table for migration of previous NFS to object store");
                            } else {
                                s_logger.info("Removing leftover template " + uniqueName + " entry from template store table");
                                // remove those leftover entries
                                _vmTemplateStoreDao.remove(tmpltStore.getId());
                            }
                        }
                    }
                }
                if (toBeDownloaded.size() > 0) {
                    /* Only download templates whose hypervirsor type is in the zone */
                    List<HypervisorType> availHypers = _clusterDao.getAvailableHypervisorInZone(zoneId);
                    if (availHypers.isEmpty()) {
                        /*
                             * This is for cloudzone, local secondary storage resource
                             * started before cluster created
                             */
                        availHypers.add(HypervisorType.KVM);
                    }
                    /* Baremetal need not to download any template */
                    availHypers.remove(HypervisorType.BareMetal);
                    // bug 9809: resume ISO
                    availHypers.add(HypervisorType.None);
                    // download.
                    for (VMTemplateVO tmplt : toBeDownloaded) {
                        if (tmplt.getUrl() == null) {
                            // If url is null, skip downloading
                            s_logger.info("Skip downloading template " + tmplt.getUniqueName() + " since no url is specified.");
                            continue;
                        }
                        // if this is private template, skip sync to a new image store
                        if (!tmplt.isPublicTemplate() && !tmplt.isFeatured() && tmplt.getTemplateType() != TemplateType.SYSTEM) {
                            s_logger.info("Skip sync downloading private template " + tmplt.getUniqueName() + " to a new image store");
                            continue;
                        }
                        // means that this is a duplicate entry from migration of previous NFS to staging.
                        if (_storeMgr.isRegionStore(store)) {
                            TemplateDataStoreVO tmpltStore = _vmTemplateStoreDao.findByStoreTemplate(storeId, tmplt.getId());
                            if (tmpltStore != null && tmpltStore.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED && tmpltStore.getState() == State.Ready && tmpltStore.getInstallPath() == null) {
                                s_logger.info("Skip sync template for migration of previous NFS to object store");
                                continue;
                            }
                        }
                        if (availHypers.contains(tmplt.getHypervisorType())) {
                            s_logger.info("Downloading template " + tmplt.getUniqueName() + " to image store " + store.getName());
                            associateTemplateToZone(tmplt.getId(), zoneId);
                            TemplateInfo tmpl = _templateFactory.getTemplate(tmplt.getId(), store);
                            TemplateOpContext<TemplateApiResult> context = new TemplateOpContext<>(null, (TemplateObject) tmpl, null);
                            AsyncCallbackDispatcher<TemplateServiceImpl, TemplateApiResult> caller = AsyncCallbackDispatcher.create(this);
                            caller.setCallback(caller.getTarget().createTemplateAsyncCallBack(null, null));
                            caller.setContext(context);
                            createTemplateAsync(tmpl, store, caller);
                        } else {
                            s_logger.info("Skip downloading template " + tmplt.getUniqueName() + " since current data center does not have hypervisor " + tmplt.getHypervisorType().toString());
                        }
                    }
                }
                for (String uniqueName : templateInfos.keySet()) {
                    TemplateProp tInfo = templateInfos.get(uniqueName);
                    if (_tmpltMgr.templateIsDeleteable(tInfo.getId())) {
                        // we cannot directly call deleteTemplateSync here to reuse delete logic since in this case db does not have this template at all.
                        TemplateObjectTO tmplTO = new TemplateObjectTO();
                        tmplTO.setDataStore(store.getTO());
                        tmplTO.setPath(tInfo.getInstallPath());
                        tmplTO.setId(tInfo.getId());
                        DeleteCommand dtCommand = new DeleteCommand(tmplTO);
                        EndPoint ep = _epSelector.select(store);
                        Answer answer = null;
                        if (ep == null) {
                            String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
                            s_logger.error(errMsg);
                            answer = new Answer(dtCommand, false, errMsg);
                        } else {
                            answer = ep.sendMessage(dtCommand);
                        }
                        if (answer == null || !answer.getResult()) {
                            s_logger.info("Failed to deleted template at store: " + store.getName());
                        } else {
                            String description = "Deleted template " + tInfo.getTemplateName() + " on secondary storage " + storeId;
                            s_logger.info(description);
                        }
                    }
                }
            } finally {
                syncLock.unlock();
            }
        } else {
            s_logger.info("Couldn't get global lock on " + lockString + ", another thread may be doing template sync on data store " + storeId + " now.");
        }
    } finally {
        syncLock.releaseRef();
    }
}
Also used : TemplateProp(com.cloud.storage.template.TemplateProp) VMTemplateVO(com.cloud.storage.VMTemplateVO) EndPoint(org.apache.cloudstack.engine.subsystem.api.storage.EndPoint) GlobalLock(com.cloud.utils.db.GlobalLock) DeleteCommand(org.apache.cloudstack.storage.command.DeleteCommand) ResourceAllocationException(com.cloud.exception.ResourceAllocationException) HashSet(java.util.HashSet) VirtualMachineTemplate(com.cloud.template.VirtualMachineTemplate) TemplateDataStoreVO(org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO) Date(java.util.Date) HypervisorType(com.cloud.hypervisor.Hypervisor.HypervisorType) Answer(com.cloud.agent.api.Answer) ListTemplateAnswer(com.cloud.agent.api.storage.ListTemplateAnswer) TemplateInfo(org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo) State(org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) Event(org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event) TemplateObjectTO(org.apache.cloudstack.storage.to.TemplateObjectTO)

Aggregations

VirtualMachineTemplate (com.cloud.template.VirtualMachineTemplate)65 ServerApiException (com.cloud.api.ServerApiException)22 TemplateResponse (com.cloud.api.response.TemplateResponse)20 Account (com.cloud.user.Account)16 ServerApiException (org.apache.cloudstack.api.ServerApiException)15 TemplateResponse (org.apache.cloudstack.api.response.TemplateResponse)13 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)10 ConcurrentOperationException (com.cloud.exception.ConcurrentOperationException)9 InvalidParameterValueException (com.cloud.exception.InvalidParameterValueException)9 ArrayList (java.util.ArrayList)9 ListResponse (com.cloud.api.response.ListResponse)8 InsufficientCapacityException (com.cloud.exception.InsufficientCapacityException)8 ResourceAllocationException (com.cloud.exception.ResourceAllocationException)8 ResourceUnavailableException (com.cloud.exception.ResourceUnavailableException)8 StorageUnavailableException (com.cloud.exception.StorageUnavailableException)8 DiskOffering (com.cloud.offering.DiskOffering)8 DataCenter (com.cloud.dc.DataCenter)7 Network (com.cloud.network.Network)7 VolumeVO (com.cloud.storage.VolumeVO)7 NoTransitionException (com.cloud.utils.fsm.NoTransitionException)7