package io.fathom.cloud.image.api.os.resources;
import io.fathom.cloud.Clock;
import io.fathom.cloud.CloudException;
import io.fathom.cloud.image.ImageServiceImpl.ImageImpl;
import io.fathom.cloud.image.api.os.model.Image;
import io.fathom.cloud.protobuf.ImageModel.ImageData;
import io.fathom.cloud.server.auth.Auth;
import io.fathom.cloud.server.model.Project;
import io.fathom.cloud.server.resources.OpenstackResourceBase;
import io.fathom.cloud.services.ImageService;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response.Status;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fathomdb.utils.Hex;
import com.google.common.collect.Maps;
public class ImageResourceBase extends OpenstackResourceBase {
private static final Logger log = LoggerFactory.getLogger(ImageResourceBase.class);
private Project project;
protected Project getProject() throws CloudException {
Auth auth = null;
if (project == null) {
auth = findAuth();
if (auth != null) {
project = auth.getProject();
}
}
if (project == null) {
log.debug("No project found for auth: {}", auth);
log.debug("X-Auth-Token: {}", httpRequest.getHeader("X-Auth-Token"));
throw new WebApplicationException(Status.UNAUTHORIZED);
}
return project;
}
protected Image toModel(ImageService.Image image) {
return toModel(((ImageImpl) image).getData());
}
protected Image toModel(ImageData data) {
Image image = new Image();
image.isPublic = data.getIsPublic();
if (data.getIsPublic()) {
image.visibility = "public";
} else {
image.visibility = "private";
}
image.name = data.getName();
image.id = "" + data.getId();
// These are sort of deprecated in V2...
image.diskFormat = data.getDiskFormat();
image.containerFormat = data.getContainerFormat();
image.properties = Maps.newHashMap();
image.owner = "" + data.getOwnerProject();
image.isProtected = false;
String baseUrl = getBaseUrl();
image.self = baseUrl + "/v1/images/" + data.getId();
image.file = image.self + "/file";
image.schema = "/v2/schemas/image";
if (data.hasImageSize()) {
image.size = data.getImageSize();
}
if (data.hasImageChecksum()) {
image.checksum = Hex.toHex(data.getImageChecksum().toByteArray());
}
switch (data.getImageState()) {
case ACTIVE:
image.status = "active";
break;
case DELETED:
image.status = "deleted";
break;
case KILLED:
image.status = "killed";
break;
case QUEUED:
image.status = "queued";
break;
case PENDING_DELETE:
image.status = "pending_delete";
break;
case SAVING:
image.status = "saving";
break;
default:
log.warn("Unknown image state: " + data);
break;
}
if (data.hasCreatedAt()) {
image.createdAt = Clock.toDate(data.getCreatedAt());
}
if (data.hasUpdatedAt()) {
image.updatedAt = Clock.toDate(data.getUpdatedAt());
}
return image;
}
}