private void resetImagePendingAvailable(final String imageId, final String reason) {
    String taskMessage = "";
    /// tag image and instances with proper message
    try {
      final ImageInfo image = Images.lookupImage(imageId);
      final String taskId = ((MachineImageInfo) image).getImageConversionId();
      if (taskId != null) {
        conversionTaskCache.invalidate(taskId);
        Optional<DiskImageConversionTask> task = conversionTaskCache.get(taskId);
        if (task.isPresent()) taskMessage = task.get().getStatusMessage();
      }
      final String tagMessage = reason != null ? reason : taskMessage;
      this.tagResources(imageId, "failed", tagMessage);
    } catch (final Exception ex) {;
    } finally {
      taggedImages.remove(imageId);
    }

    try (final TransactionResource db = Entities.transactionFor(ImageInfo.class)) {
      try {
        final ImageInfo entity = Entities.uniqueResult(Images.exampleWithImageId(imageId));
        entity.setState(ImageMetadata.State.pending_available);
        entity.setImageFormat(ImageMetadata.ImageFormat.partitioned.name());
        ((MachineImageInfo) entity).setImageConversionId(null);
        Entities.persist(entity);
        db.commit();
      } catch (final Exception ex) {
        LOG.error("Failed to mark the image state available for conversion: " + imageId, ex);
      }
    }
  }
 private void updateTags(final List<String> images) throws Exception {
   for (final String imageId : images) {
     try {
       final ImageInfo image = Images.lookupImage(imageId);
       final ImageMetadata.State imgState = image.getState();
       final String taskId = ((MachineImageInfo) image).getImageConversionId();
       if (ImageMetadata.State.pending_available.equals(
           imgState)) {; // do nothing for images not yet in conversion
       } else if (ImageMetadata.State.pending_conversion.equals(imgState)) {
         String message = "";
         try {
           Optional<DiskImageConversionTask> task = conversionTaskCache.get(taskId);
           if (task.isPresent()) {
             message = task.get().getStatusMessage();
           }
         } catch (final Exception ex) {;
         }
         // if needed, we can add messages as well; not sure yet if the messages are clear
         this.tagResources(imageId, "active", message);
         taggedImages.add(imageId);
       } else if (ImageMetadata.State.available.equals(imgState)
           && taggedImages.contains(imageId)) {
         try {
           this.removeTags(imageId);
         } catch (final Exception ex) {;
         } finally {
           taggedImages.remove(imageId);
         }
       } else if (ImageMetadata.State.failed.equals(imgState) && taggedImages.contains(imageId)) {
         String message = "";
         try {
           conversionTaskCache.invalidate(taskId);
           Optional<DiskImageConversionTask> task = conversionTaskCache.get(taskId);
           if (task.isPresent()) message = task.get().getStatusMessage();
         } catch (final Exception ex) {;
         } finally {
           taggedImages.remove(imageId);
         }
         this.tagResources(imageId, "failed", message);
         try (final TransactionResource db = Entities.transactionFor(ImageInfo.class)) {
           try {
             final ImageInfo entity = Entities.uniqueResult(Images.exampleWithImageId(imageId));
             entity.setState(ImageMetadata.State.pending_available);
             entity.setImageFormat(ImageMetadata.ImageFormat.partitioned.name());
             ((MachineImageInfo) entity).setImageConversionId(null);
             Entities.persist(entity);
             db.commit();
           } catch (final Exception ex) {
             LOG.error("Failed to mark the image state available for conversion", ex);
           }
         }
       }
     } catch (final Exception ex) {
       LOG.error("Failed to update tags for resources in conversion", ex);
     }
   }
 }