예제 #1
0
 @Override
 public void handleSync(Long dcId) {
   if (dcId != null) {
     List<HostVO> ssHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(dcId);
     for (HostVO ssHost : ssHosts) {
       handleTemplateSync(ssHost);
       handleVolumeSync(ssHost);
     }
   }
 }
예제 #2
0
  @Override
  public boolean downloadVolumeToStorage(
      VolumeVO volume, Long zoneId, String url, String checkSum, ImageFormat format) {

    List<HostVO> ssHosts = _ssvmMgr.listAllTypesSecondaryStorageHostsInOneZone(zoneId);
    Collections.shuffle(ssHosts);
    HostVO ssHost = ssHosts.get(0);
    downloadVolumeToStorage(volume, ssHost, url, checkSum, format);
    return true;
  }
  public TemplateProfile prepareDelete(DeleteIsoCmd cmd) {
    TemplateProfile profile = super.prepareDelete(cmd);
    Long zoneId = profile.getZoneId();

    if (zoneId != null && (_ssvmMgr.findSecondaryStorageHost(zoneId) == null)) {
      throw new InvalidParameterValueException(
          "Failed to find a secondary storage host in the specified zone.");
    }

    return profile;
  }
  public TemplateProfile prepareDelete(DeleteTemplateCmd cmd) {
    TemplateProfile profile = super.prepareDelete(cmd);
    VMTemplateVO template = profile.getTemplate();
    Long zoneId = profile.getZoneId();

    if (template.getTemplateType() == TemplateType.SYSTEM) {
      throw new InvalidParameterValueException("The DomR template cannot be deleted.");
    }

    if (zoneId != null && (_ssvmMgr.findSecondaryStorageHost(zoneId) == null)) {
      throw new InvalidParameterValueException(
          "Failed to find a secondary storage host in the specified zone.");
    }

    return profile;
  }
예제 #5
0
 @Override
 public boolean downloadTemplateToStorage(VMTemplateVO template, Long zoneId) {
   List<DataCenterVO> dcs = new ArrayList<DataCenterVO>();
   if (zoneId == null) {
     dcs.addAll(_dcDao.listAll());
   } else {
     dcs.add(_dcDao.findById(zoneId));
   }
   long templateId = template.getId();
   boolean isPublic = template.isFeatured() || template.isPublicTemplate();
   for (DataCenterVO dc : dcs) {
     List<HostVO> ssHosts = _ssvmMgr.listAllTypesSecondaryStorageHostsInOneZone(dc.getId());
     for (HostVO ssHost : ssHosts) {
       if (isTemplateUpdateable(templateId, ssHost.getId())) {
         initiateTemplateDownload(templateId, ssHost);
         if (!isPublic) {
           break;
         }
       }
     }
   }
   return true;
 }
  @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;
  }
예제 #7
0
  private void downloadVolumeToStorage(
      VolumeVO volume, HostVO sserver, String url, String checkSum, ImageFormat format) {
    boolean downloadJobExists = false;
    VolumeHostVO volumeHost = null;

    volumeHost = _volumeHostDao.findByHostVolume(sserver.getId(), volume.getId());
    if (volumeHost == null) {
      volumeHost =
          new VolumeHostVO(
              sserver.getId(),
              volume.getId(),
              sserver.getDataCenterId(),
              new Date(),
              0,
              VMTemplateStorageResourceAssoc.Status.NOT_DOWNLOADED,
              null,
              null,
              "jobid0000",
              null,
              url,
              checkSum,
              format);
      _volumeHostDao.persist(volumeHost);
    } else if ((volumeHost.getJobId() != null) && (volumeHost.getJobId().length() > 2)) {
      downloadJobExists = true;
    }

    Long maxVolumeSizeInBytes = getMaxVolumeSizeInBytes();
    String secUrl = sserver.getStorageUrl();
    if (volumeHost != null) {
      start();
      DownloadCommand dcmd =
          new DownloadCommand(secUrl, volume, maxVolumeSizeInBytes, checkSum, url, format);
      if (downloadJobExists) {
        dcmd = new DownloadProgressCommand(dcmd, volumeHost.getJobId(), RequestType.GET_OR_RESTART);
        dcmd.setResourceType(ResourceType.VOLUME);
      }
      dcmd.setProxy(getHttpProxy());
      HostVO ssvm = _ssvmMgr.pickSsvmHost(sserver);
      if (ssvm == null) {
        s_logger.warn(
            "There is no secondary storage VM for secondary storage host " + sserver.getName());
        return;
      }
      DownloadListener dl =
          new DownloadListener(
              ssvm,
              sserver,
              volume,
              _timer,
              _volumeHostDao,
              volumeHost.getId(),
              this,
              dcmd,
              _volumeDao,
              _storageMgr,
              _resourceLimitMgr,
              _alertMgr,
              _accountMgr);

      if (downloadJobExists) {
        dl.setCurrState(volumeHost.getDownloadState());
      }
      DownloadListener old = null;
      synchronized (_listenerVolumeMap) {
        old = _listenerVolumeMap.put(volumeHost, dl);
      }
      if (old != null) {
        old.abandon();
      }

      try {
        send(ssvm.getId(), dcmd, dl);
      } catch (AgentUnavailableException e) {
        s_logger.warn(
            "Unable to start /resume download of volume "
                + volume.getName()
                + " to "
                + sserver.getName(),
            e);
        dl.setDisconnected();
        dl.scheduleStatusCheck(RequestType.GET_OR_RESTART);
      }
    }
  }
예제 #8
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);
      }
    }
  }
예제 #9
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;
  }