package io.fathom.cloud.compute.scheduler; import io.fathom.cloud.CloudException; import io.fathom.cloud.blobs.BlobData; import io.fathom.cloud.blobs.TempFile; import io.fathom.cloud.compute.networks.IpRange; import io.fathom.cloud.compute.services.DatacenterManager; import io.fathom.cloud.protobuf.CloudModel.HostData; import io.fathom.cloud.protobuf.CloudModel.InstanceData; import io.fathom.cloud.services.ImageKey; import io.fathom.cloud.services.ImageService; import java.io.IOException; import java.net.InetAddress; import java.net.URI; import java.util.List; import java.util.UUID; import com.google.common.base.Strings; public abstract class SchedulerHost { public static final String SECRET_TOKEN = "token"; final long id; final HostData hostData; public SchedulerHost(HostData hostData) { this.id = hostData.getId(); this.hostData = hostData; } public long getId() { return id; } public abstract UUID createContainer(InstanceData instance, ImageService.Image image) throws CloudException; public abstract ConfigurationOperation startConfiguration() throws CloudException; public abstract void startContainer(UUID containerId) throws CloudException; public abstract boolean stopContainer(UUID containerId) throws CloudException; public abstract boolean hasImage(ImageKey imageKey) throws IOException, CloudException; public abstract void uploadImage(ImageKey imageKey, BlobData imageData) throws IOException, CloudException; public HostData getHostData() { return hostData; } public InetAddress getIpAddress() { IpRange range = IpRange.parse(hostData.getCidr()); return range.getAddress(); } public static interface SchedulerHostNetwork { InetAddress getGateway(); IpRange getIpRange(); boolean isPublicNetwork(); String getKey(); SchedulerHost getHost(); } public abstract List<SchedulerHostNetwork> getNetworks(); public String getNetworkDevice() { String networkDevice = hostData.getNetworkDevice(); if (Strings.isNullOrEmpty(networkDevice)) { throw new IllegalArgumentException(); } return networkDevice; } public abstract byte[] getSecret(UUID containerId, String key) throws IOException, CloudException; public abstract void setSecret(UUID containerId, String key, byte[] data) throws IOException, CloudException; public abstract TempFile createImage(UUID containerId) throws IOException, CloudException; public abstract void purgeInstance(UUID containerId) throws IOException, CloudException; public abstract DatacenterManager getDatacenterManager(); public abstract String fetchUrl(URI uri) throws IOException; }