package io.fathom.cloud.image.imports;
import io.fathom.cloud.CloudException;
import io.fathom.cloud.blobs.BlobData;
import io.fathom.cloud.blobs.TempFile;
import io.fathom.cloud.image.ImageMetadata;
import io.fathom.cloud.openstack.client.RestClientException;
import io.fathom.cloud.services.ImageImports;
import io.fathom.cloud.services.ImageService;
import io.fathom.cloud.services.ImageService.Image;
import io.fathom.http.HttpClient;
import io.fathom.http.jre.JreHttpClient;
import java.io.IOException;
import java.net.URI;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Singleton
public class ImageImportsImpl implements ImageImports {
private static final Logger log = LoggerFactory.getLogger(ImageImportsImpl.class);
@Inject
ImageService imageService;
@Override
public Metadata getImageMetadata(String imageUrl) throws Exception {
HttpClient httpClient = JreHttpClient.create();
URI imageUri = URI.create(imageUrl);
ImportImageClient imageClient = new ImportImageClient(httpClient, imageUri);
final ImageImportMetadata imageMetadata = imageClient.getMetadata(imageUri);
return new Metadata() {
@Override
public String getChecksum() {
return imageMetadata.checksum;
}
};
}
@Override
public Image importImage(long projectId, String imageUrl) throws IOException, CloudException, RestClientException {
HttpClient httpClient = JreHttpClient.create();
URI imageUri = URI.create(imageUrl);
ImportImageClient imageClient = new ImportImageClient(httpClient, imageUri);
log.info("Downloading metadata {}", imageUri);
ImageImportMetadata imageMetadata = imageClient.getMetadata(imageUri);
Map<String, String> metadata = imageMetadata.metadata;
metadata.put(ImageMetadata.KEY_IMAGE_SOURCE, imageUri.toString());
log.info("Downloading image {}", imageMetadata.image);
// TODO: It would be nice to avoid re-downloading the same image.
// But... the metadata may be different. Punt for now!
// Image found = null;
// for (Image image : imageService.listImages(project))) {
// String checksum = image.getChecksum();
// if (checksum.equalsIgnoreCase(imageMetadata.checksum)) {
// log.warn("Found matching image: {}", found);
//
// // TODO: Compare metadata??
// found = image;
//
// break;
// }
// }
try (TempFile tempImage = imageClient.downloadImage(imageUri, imageMetadata)) {
log.info("Creating image record");
Image image = imageService.createImage(projectId, metadata);
log.info("Uploading image data");
BlobData blobData = BlobData.build(tempImage.getFile());
image = imageService.uploadData(image, blobData);
return image;
}
}
}