@Override
 public Optional<DiskImageConversionTask> load(String taskId) throws Exception {
   try {
     final DescribeConversionTasks task =
         new DescribeConversionTasks(Lists.newArrayList(taskId));
     final CheckedListenableFuture<Boolean> result = task.dispatch();
     if (result.get()) {
       return Optional.of(task.getTasks().get(0));
     }
   } catch (final Exception ex) {
     LOG.error("Failed to call describe-conversion-task: " + taskId);
   }
   return Optional.absent();
 }
  private void checkConversion(final List<ImageInfo> images) {
    for (final ImageInfo image : images) {
      if (!(image instanceof MachineImageInfo)) continue;
      try {
        final MachineImageInfo machineImage = (MachineImageInfo) image;
        final String taskId = machineImage.getImageConversionId();
        if (taskId == null || taskId.length() <= 0)
          throw new Exception(
              "Image " + machineImage.getDisplayName() + " has no conversion task Id");

        final DescribeConversionTasks task =
            new DescribeConversionTasks(Lists.newArrayList(machineImage.getImageConversionId()));

        final CheckedListenableFuture<Boolean> result = task.dispatch();
        List<DiskImageConversionTask> ctasks = null;
        if (result.get()) {
          ctasks = task.getTasks();
        }
        boolean conversionSuccess = true;
        String errorMessage = null;
        if (ctasks.size() <= 0) {
          /// consider this task as done when describe tasks has no result
          conversionSuccess = true;
        } else {
          DiskImageConversionTask ct = ctasks.get(0);
          if ("completed".equals(ct.getState())) {
            conversionSuccess = true;
          } else if ("active".equals(ct.getState())) {
            continue;
          } else {
            conversionSuccess = false;
            errorMessage = ct.getStatusMessage();
          }
        }
        if (conversionSuccess) {
          /// if user deregistered the image while in conversion
          if (ImageMetadata.State.deregistered_cleanup.equals(image.getState())) {
            try {
              this.cleanupBuckets(Lists.newArrayList(image), true);
            } catch (final Exception ex) {;
            }
          } else {
            Images.setImageFormat(
                machineImage.getDisplayName(), ImageMetadata.ImageFormat.fulldisk);
            /// the service and the backend (NC) rely on virtualizationType=HVM when they prepare
            // full-disk type instances
            Images.setImageState(machineImage.getDisplayName(), ImageMetadata.State.available);
            try {
              generateDownloadManifests(machineImage.getDisplayName());
            } catch (final Exception ex) {;
            }
          }
        } else {
          LOG.warn(
              "Conversion task for image "
                  + image.getDisplayName()
                  + " has failed: "
                  + errorMessage);
          try {
            this.cleanupBuckets(Lists.newArrayList(image), false);
            this.resetImagePendingAvailable(image.getDisplayName(), null);
          } catch (final Exception ex) {
            LOG.error(
                "Failed to cleanup the image's system bucket; setting image state failed: "
                    + image.getDisplayName());
            Images.setImageState(machineImage.getDisplayName(), ImageMetadata.State.failed);
          }
        }
      } catch (final Exception ex) {
        LOG.warn("Conversion task for image " + image.getDisplayName() + " has failed: ", ex);
        try {
          this.cleanupBuckets(Lists.newArrayList(image), false);
          this.resetImagePendingAvailable(
              image.getDisplayName(), "Failed to check conversion status");
        } catch (final Exception ex2) {
          LOG.error(
              "Failed to cleanup the image's system bucket; setting image state failed: "
                  + image.getDisplayName());
          try {
            Images.setImageState(image.getDisplayName(), ImageMetadata.State.failed);
          } catch (final Exception ex3) {;
          }
        }
      }
    }
  }