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); } } }