@Override
 public void addSystemVMTemplatesToHost(HostVO host, Map<String, TemplateInfo> templateInfos) {
   if (templateInfos == null) {
     return;
   }
   Long hostId = host.getId();
   List<VMTemplateVO> rtngTmplts = _templateDao.listAllSystemVMTemplates();
   for (VMTemplateVO tmplt : rtngTmplts) {
     TemplateInfo tmpltInfo = templateInfos.get(tmplt.getUniqueName());
     if (tmpltInfo == null) {
       continue;
     }
     VMTemplateHostVO tmpltHost = _vmTemplateHostDao.findByHostTemplate(hostId, tmplt.getId());
     if (tmpltHost == null) {
       tmpltHost =
           new VMTemplateHostVO(
               hostId,
               tmplt.getId(),
               new Date(),
               100,
               Status.DOWNLOADED,
               null,
               null,
               null,
               tmpltInfo.getInstallPath(),
               tmplt.getUrl());
       tmpltHost.setSize(tmpltInfo.getSize());
       tmpltHost.setPhysicalSize(tmpltInfo.getPhysicalSize());
       _vmTemplateHostDao.persist(tmpltHost);
     }
   }
 }
  public boolean isZoneReady(Map<Long, ZoneHostInfo> zoneHostInfoMap, long dataCenterId) {
    ZoneHostInfo zoneHostInfo = zoneHostInfoMap.get(dataCenterId);
    if (zoneHostInfo != null
        && (zoneHostInfo.getFlags() & RunningHostInfoAgregator.ZoneHostInfo.ROUTING_HOST_MASK)
            != 0) {
      VMTemplateVO template = _templateDao.findSystemVMTemplate(dataCenterId);
      HostVO secHost = _hostDao.findSecondaryStorageHost(dataCenterId);
      if (secHost == null) {
        if (s_logger.isDebugEnabled()) {
          s_logger.debug(
              "No secondary storage available in zone "
                  + dataCenterId
                  + ", wait until it is ready to launch secondary storage vm");
        }
        return false;
      }

      boolean templateReady = false;
      if (template != null) {
        VMTemplateHostVO templateHostRef =
            _vmTemplateHostDao.findByHostTemplate(secHost.getId(), template.getId());
        templateReady =
            (templateHostRef != null) && (templateHostRef.getDownloadState() == Status.DOWNLOADED);
      }

      if (templateReady) {

        List<Pair<Long, Integer>> l =
            _storagePoolHostDao.getDatacenterStoragePoolHostInfo(dataCenterId, !_useLocalStorage);
        if (l != null && l.size() > 0 && l.get(0).second().intValue() > 0) {

          return true;
        } else {
          if (s_logger.isDebugEnabled()) {
            s_logger.debug(
                "Primary storage is not ready, wait until it is ready to launch secondary storage vm");
          }
        }
      } else {
        if (s_logger.isTraceEnabled()) {
          s_logger.trace("Zone host is ready, but secondary storage vm template is not ready");
        }
      }
    }
    return false;
  }
  @DB
  public void handleDownloadEvent(HostVO host, VMTemplateVO template, Status dnldStatus) {
    if ((dnldStatus == VMTemplateStorageResourceAssoc.Status.DOWNLOADED)
        || (dnldStatus == Status.ABANDONED)) {
      VMTemplateHostVO vmTemplateHost = new VMTemplateHostVO(host.getId(), template.getId());
      synchronized (_listenerMap) {
        _listenerMap.remove(vmTemplateHost);
      }
    }

    VMTemplateHostVO vmTemplateHost =
        _vmTemplateHostDao.findByHostTemplate(host.getId(), template.getId());

    Transaction txn = Transaction.currentTxn();
    txn.start();

    if (dnldStatus == Status.DOWNLOADED) {
      long size = -1;
      if (vmTemplateHost != null) {
        size = vmTemplateHost.getPhysicalSize();
        template.setSize(size);
        this._templateDao.update(template.getId(), template);
      } else {
        s_logger.warn("Failed to get size for template" + template.getName());
      }
      String eventType = EventTypes.EVENT_TEMPLATE_CREATE;
      if ((template.getFormat()).equals(ImageFormat.ISO)) {
        eventType = EventTypes.EVENT_ISO_CREATE;
      }
      if (template.getAccountId() != Account.ACCOUNT_ID_SYSTEM) {
        UsageEventUtils.publishUsageEvent(
            eventType,
            template.getAccountId(),
            host.getDataCenterId(),
            template.getId(),
            template.getName(),
            null,
            template.getSourceTemplateId(),
            size,
            template.getClass().getName(),
            template.getUuid());
      }
    }
    txn.commit();
  }
  @Override
  public void handleSysTemplateDownload(HostVO host) {
    List<HypervisorType> hypers =
        _resourceMgr.listAvailHypervisorInZone(host.getId(), host.getDataCenterId());
    HypervisorType hostHyper = host.getHypervisorType();
    if (hypers.contains(hostHyper)) {
      return;
    }

    Set<VMTemplateVO> toBeDownloaded = new HashSet<VMTemplateVO>();
    List<HostVO> ssHosts =
        _resourceMgr.listAllUpAndEnabledHostsInOneZoneByType(
            Host.Type.SecondaryStorage, host.getDataCenterId());
    if (ssHosts == null || ssHosts.isEmpty()) {
      return;
    }
    /*Download all the templates in zone with the same hypervisortype*/
    for (HostVO ssHost : ssHosts) {
      List<VMTemplateVO> rtngTmplts = _templateDao.listAllSystemVMTemplates();
      List<VMTemplateVO> defaultBuiltin = _templateDao.listDefaultBuiltinTemplates();

      for (VMTemplateVO rtngTmplt : rtngTmplts) {
        if (rtngTmplt.getHypervisorType() == hostHyper) {
          toBeDownloaded.add(rtngTmplt);
        }
      }

      for (VMTemplateVO builtinTmplt : defaultBuiltin) {
        if (builtinTmplt.getHypervisorType() == hostHyper) {
          toBeDownloaded.add(builtinTmplt);
        }
      }

      for (VMTemplateVO template : toBeDownloaded) {
        VMTemplateHostVO tmpltHost =
            _vmTemplateHostDao.findByHostTemplate(ssHost.getId(), template.getId());
        if (tmpltHost == null || tmpltHost.getDownloadState() != Status.DOWNLOADED) {
          downloadTemplateToStorage(template, ssHost);
        }
      }
    }
  }
  private void checksumSync(long hostId) {
    SearchCriteria<VMTemplateHostVO> sc = ReadyTemplateStatesSearch.create();
    sc.setParameters(
        "download_state", com.cloud.storage.VMTemplateStorageResourceAssoc.Status.DOWNLOADED);
    sc.setParameters("host_id", hostId);

    List<VMTemplateHostVO> templateHostRefList = _vmTemplateHostDao.search(sc, null);
    s_logger.debug(
        "Found "
            + templateHostRefList.size()
            + " templates with no checksum. Will ask for computation");
    for (VMTemplateHostVO templateHostRef : templateHostRefList) {
      s_logger.debug("Getting checksum for template - " + templateHostRef.getTemplateId());
      String checksum = this.templateMgr.getChecksum(hostId, templateHostRef.getInstallPath());
      VMTemplateVO template = _templateDao.findById(templateHostRef.getTemplateId());
      s_logger.debug("Setting checksum " + checksum + " for template - " + template.getName());
      template.setChecksum(checksum);
      _templateDao.update(template.getId(), template);
    }
  }
  private String generateCopyUrl(HostVO sourceServer, VMTemplateHostVO srcTmpltHost) {
    List<SecondaryStorageVmVO> ssVms =
        _secStorageVmDao.getSecStorageVmListInStates(
            SecondaryStorageVm.Role.templateProcessor,
            sourceServer.getDataCenterId(),
            State.Running);
    if (ssVms.size() > 0) {
      SecondaryStorageVmVO ssVm = ssVms.get(0);
      if (ssVm.getPublicIpAddress() == null) {
        s_logger.warn("A running secondary storage vm has a null public ip?");
        return null;
      }
      return generateCopyUrl(
          ssVm.getPublicIpAddress(), sourceServer.getParent(), srcTmpltHost.getInstallPath());
    }

    VMTemplateVO tmplt = _templateDao.findById(srcTmpltHost.getTemplateId());
    HypervisorType hyperType = tmplt.getHypervisorType();
    /*No secondary storage vm yet*/
    if (hyperType != null && hyperType == HypervisorType.KVM) {
      return "file://" + sourceServer.getParent() + "/" + srcTmpltHost.getInstallPath();
    }
    return null;
  }
 @Override
 public void cancelAllDownloads(Long templateId) {
   List<VMTemplateHostVO> downloadsInProgress =
       _vmTemplateHostDao.listByTemplateStates(
           templateId,
           VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS,
           VMTemplateHostVO.Status.NOT_DOWNLOADED);
   if (downloadsInProgress.size() > 0) {
     for (VMTemplateHostVO vmthvo : downloadsInProgress) {
       DownloadListener dl = null;
       synchronized (_listenerMap) {
         dl = _listenerMap.remove(vmthvo);
       }
       if (dl != null) {
         dl.abandon();
         s_logger.info(
             "Stopping download of template "
                 + templateId
                 + " to storage server "
                 + vmthvo.getHostId());
       }
     }
   }
 }
  @Override
  @DB
  public boolean delete(TemplateProfile profile) {
    boolean success = true;

    VMTemplateVO template = profile.getTemplate();
    Long zoneId = profile.getZoneId();
    Long templateId = template.getId();

    String zoneName;
    List<HostVO> secondaryStorageHosts;
    if (!template.isCrossZones() && zoneId != null) {
      DataCenterVO zone = _dcDao.findById(zoneId);
      zoneName = zone.getName();
      secondaryStorageHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(zoneId);
    } else {
      zoneName = "(all zones)";
      secondaryStorageHosts = _ssvmMgr.listSecondaryStorageHostsInAllZones();
    }

    s_logger.debug(
        "Attempting to mark template host refs for template: "
            + template.getName()
            + " as destroyed in zone: "
            + zoneName);

    // Make sure the template is downloaded to all the necessary secondary storage hosts
    for (HostVO secondaryStorageHost : secondaryStorageHosts) {
      long hostId = secondaryStorageHost.getId();
      List<VMTemplateHostVO> templateHostVOs = _tmpltHostDao.listByHostTemplate(hostId, templateId);
      for (VMTemplateHostVO templateHostVO : templateHostVOs) {
        if (templateHostVO.getDownloadState() == Status.DOWNLOAD_IN_PROGRESS) {
          String errorMsg = "Please specify a template that is not currently being downloaded.";
          s_logger.debug(
              "Template: "
                  + template.getName()
                  + " is currently being downloaded to secondary storage host: "
                  + secondaryStorageHost.getName()
                  + "; cant' delete it.");
          throw new CloudRuntimeException(errorMsg);
        }
      }
    }

    Account account = _accountDao.findByIdIncludingRemoved(template.getAccountId());
    String eventType = "";

    if (template.getFormat().equals(ImageFormat.ISO)) {
      eventType = EventTypes.EVENT_ISO_DELETE;
    } else {
      eventType = EventTypes.EVENT_TEMPLATE_DELETE;
    }

    // Iterate through all necessary secondary storage hosts and mark the template on each host as
    // destroyed
    for (HostVO secondaryStorageHost : secondaryStorageHosts) {
      long hostId = secondaryStorageHost.getId();
      long sZoneId = secondaryStorageHost.getDataCenterId();
      List<VMTemplateHostVO> templateHostVOs = _tmpltHostDao.listByHostTemplate(hostId, templateId);
      for (VMTemplateHostVO templateHostVO : templateHostVOs) {
        VMTemplateHostVO lock = _tmpltHostDao.acquireInLockTable(templateHostVO.getId());
        try {
          if (lock == null) {
            s_logger.debug(
                "Failed to acquire lock when deleting templateHostVO with ID: "
                    + templateHostVO.getId());
            success = false;
            break;
          }
          UsageEventVO usageEvent =
              new UsageEventVO(eventType, account.getId(), sZoneId, templateId, null);
          _usageEventDao.persist(usageEvent);
          templateHostVO.setDestroyed(true);
          _tmpltHostDao.update(templateHostVO.getId(), templateHostVO);
          String installPath = templateHostVO.getInstallPath();
          if (installPath != null) {
            Answer answer =
                _agentMgr.sendToSecStorage(
                    secondaryStorageHost,
                    new DeleteTemplateCommand(secondaryStorageHost.getStorageUrl(), installPath));

            if (answer == null || !answer.getResult()) {
              s_logger.debug(
                  "Failed to delete "
                      + templateHostVO
                      + " due to "
                      + ((answer == null) ? "answer is null" : answer.getDetails()));
            } else {
              _tmpltHostDao.remove(templateHostVO.getId());
              s_logger.debug("Deleted template at: " + installPath);
            }
          } else {
            _tmpltHostDao.remove(templateHostVO.getId());
          }
          VMTemplateZoneVO templateZone = _tmpltZoneDao.findByZoneTemplate(sZoneId, templateId);

          if (templateZone != null) {
            _tmpltZoneDao.remove(templateZone.getId());
          }
        } finally {
          if (lock != null) {
            _tmpltHostDao.releaseFromLockTable(lock.getId());
          }
        }
      }

      if (!success) {
        break;
      }
    }

    s_logger.debug(
        "Successfully marked template host refs for template: "
            + template.getName()
            + " as destroyed in zone: "
            + zoneName);

    // If there are no more non-destroyed template host entries for this template, delete it
    if (success && (_tmpltHostDao.listByTemplateId(templateId).size() == 0)) {
      long accountId = template.getAccountId();

      VMTemplateVO lock = _tmpltDao.acquireInLockTable(templateId);

      try {
        if (lock == null) {
          s_logger.debug("Failed to acquire lock when deleting template with ID: " + templateId);
          success = false;
        } else if (_tmpltDao.remove(templateId)) {
          // Decrement the number of templates
          _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.template);
        }

      } finally {
        if (lock != null) {
          _tmpltDao.releaseFromLockTable(lock.getId());
        }
      }

      s_logger.debug(
          "Removed template: "
              + template.getName()
              + " because all of its template host refs were marked as destroyed.");
    }

    return success;
  }
  @Override
  public void handleTemplateSync(HostVO ssHost) {
    if (ssHost == null) {
      s_logger.warn("Huh? ssHost is null");
      return;
    }
    long sserverId = ssHost.getId();
    long zoneId = ssHost.getDataCenterId();
    if (!(ssHost.getType() == Host.Type.SecondaryStorage
        || ssHost.getType() == Host.Type.LocalSecondaryStorage)) {
      s_logger.warn("Huh? Agent id " + sserverId + " is not secondary storage host");
      return;
    }

    Map<String, TemplateInfo> templateInfos = listTemplate(ssHost);
    if (templateInfos == null) {
      return;
    }

    Set<VMTemplateVO> toBeDownloaded = new HashSet<VMTemplateVO>();
    List<VMTemplateVO> allTemplates = _templateDao.listAllInZone(zoneId);
    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);
        }
      }
    }

    toBeDownloaded.addAll(allTemplates);

    for (VMTemplateVO tmplt : allTemplates) {
      String uniqueName = tmplt.getUniqueName();
      VMTemplateHostVO tmpltHost = _vmTemplateHostDao.findByHostTemplate(sserverId, tmplt.getId());
      if (templateInfos.containsKey(uniqueName)) {
        TemplateInfo tmpltInfo = templateInfos.remove(uniqueName);
        toBeDownloaded.remove(tmplt);
        if (tmpltHost != null) {
          s_logger.info(
              "Template Sync found " + tmplt.getName() + " already in the template host table");
          if (tmpltHost.getDownloadState() != Status.DOWNLOADED) {
            tmpltHost.setErrorString("");
          }
          if (tmpltInfo.isCorrupted()) {
            tmpltHost.setDownloadState(Status.DOWNLOAD_ERROR);
            String msg =
                "Template "
                    + tmplt.getName()
                    + ":"
                    + tmplt.getId()
                    + " is corrupted on secondary storage "
                    + tmpltHost.getId();
            tmpltHost.setErrorString(msg);
            s_logger.info("msg");
            if (tmplt.getUrl() == null) {
              msg =
                  "Private Template ("
                      + tmplt
                      + ") with install path "
                      + tmpltInfo.getInstallPath()
                      + "is corrupted, please check in secondary storage: "
                      + tmpltHost.getHostId();
              s_logger.warn(msg);
            } else {
              toBeDownloaded.add(tmplt);
            }

          } else {
            tmpltHost.setDownloadPercent(100);
            tmpltHost.setDownloadState(Status.DOWNLOADED);
            tmpltHost.setInstallPath(tmpltInfo.getInstallPath());
            tmpltHost.setSize(tmpltInfo.getSize());
            tmpltHost.setPhysicalSize(tmpltInfo.getPhysicalSize());
            tmpltHost.setLastUpdated(new Date());

            // Skipping limit checks for SYSTEM Account and for the templates created from volumes
            // or snapshots
            // 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(
                    _alertMgr.ALERT_TYPE_RESOURCE_LIMIT_EXCEEDED,
                    ssHost.getDataCenterId(),
                    null,
                    e.getMessage(),
                    e.getMessage());
              } finally {
                _resourceLimitMgr.recalculateResourceCount(
                    accountId,
                    _accountMgr.getAccount(accountId).getDomainId(),
                    com.cloud.configuration.Resource.ResourceType.secondary_storage.getOrdinal());
              }
            }
          }
          _vmTemplateHostDao.update(tmpltHost.getId(), tmpltHost);
        } else {
          tmpltHost =
              new VMTemplateHostVO(
                  sserverId,
                  tmplt.getId(),
                  new Date(),
                  100,
                  Status.DOWNLOADED,
                  null,
                  null,
                  null,
                  tmpltInfo.getInstallPath(),
                  tmplt.getUrl());
          tmpltHost.setSize(tmpltInfo.getSize());
          tmpltHost.setPhysicalSize(tmpltInfo.getPhysicalSize());
          _vmTemplateHostDao.persist(tmpltHost);
          VMTemplateZoneVO tmpltZoneVO =
              _vmTemplateZoneDao.findByZoneTemplate(zoneId, tmplt.getId());
          if (tmpltZoneVO == null) {
            tmpltZoneVO = new VMTemplateZoneVO(zoneId, tmplt.getId(), new Date());
            _vmTemplateZoneDao.persist(tmpltZoneVO);
          } else {
            tmpltZoneVO.setLastUpdated(new Date());
            _vmTemplateZoneDao.update(tmpltZoneVO.getId(), tmpltZoneVO);
          }
        }

        continue;
      }
      if (tmpltHost != null && tmpltHost.getDownloadState() != Status.DOWNLOADED) {
        s_logger.info(
            "Template Sync did not find "
                + tmplt.getName()
                + " ready on server "
                + sserverId
                + ", will request download to start/resume shortly");

      } else if (tmpltHost == null) {
        s_logger.info(
            "Template Sync did not find "
                + tmplt.getName()
                + " on the server "
                + sserverId
                + ", will request download shortly");
        VMTemplateHostVO templtHost =
            new VMTemplateHostVO(
                sserverId,
                tmplt.getId(),
                new Date(),
                0,
                Status.NOT_DOWNLOADED,
                null,
                null,
                null,
                null,
                tmplt.getUrl());
        _vmTemplateHostDao.persist(templtHost);
        VMTemplateZoneVO tmpltZoneVO = _vmTemplateZoneDao.findByZoneTemplate(zoneId, tmplt.getId());
        if (tmpltZoneVO == null) {
          tmpltZoneVO = new VMTemplateZoneVO(zoneId, tmplt.getId(), new Date());
          _vmTemplateZoneDao.persist(tmpltZoneVO);
        } else {
          tmpltZoneVO.setLastUpdated(new Date());
          _vmTemplateZoneDao.update(tmpltZoneVO.getId(), tmpltZoneVO);
        }
      }
    }

    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);
      availHypers.add(HypervisorType.None); // bug 9809: resume ISO
      // download.
      for (VMTemplateVO tmplt : toBeDownloaded) {
        if (tmplt.getUrl() == null) { // If url is null we can't
          // initiate the download
          continue;
        }
        // if this is private template, and there is no record for this
        // template in this sHost, skip
        if (!tmplt.isPublicTemplate() && !tmplt.isFeatured()) {
          VMTemplateHostVO tmpltHost =
              _vmTemplateHostDao.findByHostTemplate(sserverId, tmplt.getId());
          if (tmpltHost == null) {
            continue;
          }
        }
        if (availHypers.contains(tmplt.getHypervisorType())) {
          if (_swiftMgr.isSwiftEnabled()) {
            if (_swiftMgr.isTemplateInstalled(tmplt.getId())) {
              continue;
            }
          }
          s_logger.debug(
              "Template " + tmplt.getName() + " needs to be downloaded to " + ssHost.getName());
          downloadTemplateToStorage(tmplt, ssHost);
        } else {
          s_logger.info(
              "Skipping download of template "
                  + tmplt.getName()
                  + " since we don't have any "
                  + tmplt.getHypervisorType()
                  + " hypervisors");
        }
      }
    }

    for (String uniqueName : templateInfos.keySet()) {
      TemplateInfo tInfo = templateInfos.get(uniqueName);
      List<UserVmVO> userVmUsingIso = _userVmDao.listByIsoId(tInfo.getId());
      // check if there is any Vm using this ISO.
      if (userVmUsingIso == null || userVmUsingIso.isEmpty()) {
        DeleteTemplateCommand dtCommand =
            new DeleteTemplateCommand(ssHost.getStorageUrl(), tInfo.getInstallPath());
        try {
          _agentMgr.sendToSecStorage(ssHost, dtCommand, null);
        } catch (AgentUnavailableException e) {
          String err =
              "Failed to delete "
                  + tInfo.getTemplateName()
                  + " on secondary storage "
                  + sserverId
                  + " which isn't in the database";
          s_logger.error(err);
          return;
        }

        String description =
            "Deleted template "
                + tInfo.getTemplateName()
                + " on secondary storage "
                + sserverId
                + " since it isn't in the database";
        s_logger.info(description);
      }
    }
  }
Esempio n. 10
0
  private void downloadTemplateToStorage(VMTemplateVO template, HostVO sserver) {
    boolean downloadJobExists = false;
    VMTemplateHostVO vmTemplateHost = null;

    vmTemplateHost = _vmTemplateHostDao.findByHostTemplate(sserver.getId(), template.getId());
    if (vmTemplateHost == null) {
      vmTemplateHost =
          new VMTemplateHostVO(
              sserver.getId(),
              template.getId(),
              new Date(),
              0,
              VMTemplateStorageResourceAssoc.Status.NOT_DOWNLOADED,
              null,
              null,
              "jobid0000",
              null,
              template.getUrl());
      _vmTemplateHostDao.persist(vmTemplateHost);
    } else if ((vmTemplateHost.getJobId() != null) && (vmTemplateHost.getJobId().length() > 2)) {
      downloadJobExists = true;
    }

    Long maxTemplateSizeInBytes = getMaxTemplateSizeInBytes();
    String secUrl = sserver.getStorageUrl();
    if (vmTemplateHost != null) {
      start();
      DownloadCommand dcmd = new DownloadCommand(secUrl, template, maxTemplateSizeInBytes);
      if (downloadJobExists) {
        dcmd =
            new DownloadProgressCommand(
                dcmd, vmTemplateHost.getJobId(), RequestType.GET_OR_RESTART);
      }
      dcmd.setProxy(getHttpProxy());
      if (vmTemplateHost.isCopy()) {
        dcmd.setCreds(TemplateConstants.DEFAULT_HTTP_AUTH_USER, _copyAuthPasswd);
      }
      HostVO ssAhost = _ssvmMgr.pickSsvmHost(sserver);
      if (ssAhost == null) {
        s_logger.warn(
            "There is no secondary storage VM for secondary storage host " + sserver.getName());
        return;
      }
      DownloadListener dl =
          new DownloadListener(
              ssAhost,
              sserver,
              template,
              _timer,
              _vmTemplateHostDao,
              vmTemplateHost.getId(),
              this,
              dcmd,
              _templateDao,
              _resourceLimitMgr,
              _alertMgr,
              _accountMgr);
      if (downloadJobExists) {
        dl.setCurrState(vmTemplateHost.getDownloadState());
      }
      DownloadListener old = null;
      synchronized (_listenerMap) {
        old = _listenerMap.put(vmTemplateHost, dl);
      }
      if (old != null) {
        old.abandon();
      }

      try {
        send(ssAhost.getId(), dcmd, dl);
      } catch (AgentUnavailableException e) {
        s_logger.warn(
            "Unable to start /resume download of template "
                + template.getUniqueName()
                + " to "
                + sserver.getName(),
            e);
        dl.setDisconnected();
        dl.scheduleStatusCheck(RequestType.GET_OR_RESTART);
      }
    }
  }
Esempio n. 11
0
  @Override
  public boolean copyTemplate(VMTemplateVO template, HostVO sourceServer, HostVO destServer)
      throws StorageUnavailableException {

    boolean downloadJobExists = false;
    VMTemplateHostVO destTmpltHost = null;
    VMTemplateHostVO srcTmpltHost = null;

    srcTmpltHost = _vmTemplateHostDao.findByHostTemplate(sourceServer.getId(), template.getId());
    if (srcTmpltHost == null) {
      throw new InvalidParameterValueException(
          "Template " + template.getName() + " not associated with " + sourceServer.getName());
    }

    String url = generateCopyUrl(sourceServer, srcTmpltHost);
    if (url == null) {
      s_logger.warn(
          "Unable to start/resume copy of template "
              + template.getUniqueName()
              + " to "
              + destServer.getName()
              + ", no secondary storage vm in running state in source zone");
      throw new CloudRuntimeException(
          "No secondary VM in running state in zone " + sourceServer.getDataCenterId());
    }
    destTmpltHost = _vmTemplateHostDao.findByHostTemplate(destServer.getId(), template.getId());
    if (destTmpltHost == null) {
      destTmpltHost =
          new VMTemplateHostVO(
              destServer.getId(),
              template.getId(),
              new Date(),
              0,
              VMTemplateStorageResourceAssoc.Status.NOT_DOWNLOADED,
              null,
              null,
              "jobid0000",
              null,
              url);
      destTmpltHost.setCopy(true);
      destTmpltHost.setPhysicalSize(srcTmpltHost.getPhysicalSize());
      _vmTemplateHostDao.persist(destTmpltHost);
    } else if ((destTmpltHost.getJobId() != null) && (destTmpltHost.getJobId().length() > 2)) {
      downloadJobExists = true;
    }

    Long maxTemplateSizeInBytes = getMaxTemplateSizeInBytes();
    if (srcTmpltHost.getSize() > maxTemplateSizeInBytes) {
      throw new CloudRuntimeException(
          "Cant copy the template as the template's size "
              + srcTmpltHost.getSize()
              + " is greater than max.template.iso.size "
              + maxTemplateSizeInBytes);
    }

    if (destTmpltHost != null) {
      start();
      String sourceChecksum =
          this.templateMgr.getChecksum(srcTmpltHost.getHostId(), srcTmpltHost.getInstallPath());
      DownloadCommand dcmd =
          new DownloadCommand(
              destServer.getStorageUrl(),
              url,
              template,
              TemplateConstants.DEFAULT_HTTP_AUTH_USER,
              _copyAuthPasswd,
              maxTemplateSizeInBytes);
      if (downloadJobExists) {
        dcmd =
            new DownloadProgressCommand(dcmd, destTmpltHost.getJobId(), RequestType.GET_OR_RESTART);
      }
      dcmd.setProxy(getHttpProxy());
      dcmd.setChecksum(
          sourceChecksum); // We need to set the checksum as the source template might be a
                           // compressed url and have cksum for compressed image. Bug #10775
      HostVO ssAhost = _ssvmMgr.pickSsvmHost(destServer);
      if (ssAhost == null) {
        s_logger.warn(
            "There is no secondary storage VM for secondary storage host " + destServer.getName());
        return false;
      }
      DownloadListener dl =
          new DownloadListener(
              ssAhost,
              destServer,
              template,
              _timer,
              _vmTemplateHostDao,
              destTmpltHost.getId(),
              this,
              dcmd,
              _templateDao,
              _resourceLimitMgr,
              _alertMgr,
              _accountMgr);
      if (downloadJobExists) {
        dl.setCurrState(destTmpltHost.getDownloadState());
      }
      DownloadListener old = null;
      synchronized (_listenerMap) {
        old = _listenerMap.put(destTmpltHost, dl);
      }
      if (old != null) {
        old.abandon();
      }

      try {
        send(ssAhost.getId(), dcmd, dl);
        return true;
      } catch (AgentUnavailableException e) {
        s_logger.warn(
            "Unable to start /resume COPY of template "
                + template.getUniqueName()
                + " to "
                + destServer.getName(),
            e);
        dl.setDisconnected();
        dl.scheduleStatusCheck(RequestType.GET_OR_RESTART);
        e.printStackTrace();
      }
    }

    return false;
  }