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