summaryrefslogtreecommitdiff
path: root/simulator/opendc-compute/opendc-compute-api
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2021-03-09 20:47:06 +0100
committerGitHub <noreply@github.com>2021-03-09 20:47:06 +0100
commit3b6fbe0b535bf3398f120373f59f87adbba34005 (patch)
treebc880252a935cc0b1558c50fe83f71d21b735d29 /simulator/opendc-compute/opendc-compute-api
parent66c2501d95b167f9e7474a45e542f82d2d8e83ff (diff)
parent40e5871e01858a55372bfcb51cf90069c080e751 (diff)
compute: Improvements to cloud compute model (v2)
This is the second in the series of pull requests to improve the existing cloud compute model (see #86). This pull request removes the dependency on the bare-metal provisioning code which simplifies experiment setup tremendously: - Remove bare-metal provisioning code (opendc-metal) - Remove opendc-core which was a relic of the previous codebase and was only used sparingly. - Move ownership of Server, Image and Flavor to the compute service. Users are expected to create instances via the compute service.
Diffstat (limited to 'simulator/opendc-compute/opendc-compute-api')
-rw-r--r--simulator/opendc-compute/opendc-compute-api/build.gradle.kts1
-rw-r--r--simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/ComputeClient.kt76
-rw-r--r--simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/Flavor.kt11
-rw-r--r--simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/Image.kt25
-rw-r--r--simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/InsufficientServerCapacityException.kt29
-rw-r--r--simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/Resource.kt (renamed from simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/ComputeWorkload.kt)41
-rw-r--r--simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/Server.kt39
-rw-r--r--simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/ServerState.kt18
8 files changed, 174 insertions, 66 deletions
diff --git a/simulator/opendc-compute/opendc-compute-api/build.gradle.kts b/simulator/opendc-compute/opendc-compute-api/build.gradle.kts
index 10046322..835dbbb8 100644
--- a/simulator/opendc-compute/opendc-compute-api/build.gradle.kts
+++ b/simulator/opendc-compute/opendc-compute-api/build.gradle.kts
@@ -29,5 +29,4 @@ plugins {
dependencies {
api(platform(project(":opendc-platform")))
- api(project(":opendc-core"))
}
diff --git a/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/ComputeClient.kt b/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/ComputeClient.kt
index 025513e6..baa1ba2f 100644
--- a/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/ComputeClient.kt
+++ b/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/ComputeClient.kt
@@ -22,21 +22,95 @@
package org.opendc.compute.api
+import java.util.UUID
+
/**
* A client interface for the OpenDC Compute service.
*/
public interface ComputeClient : AutoCloseable {
/**
+ * Obtain the list of [Flavor]s accessible by the requesting user.
+ */
+ public suspend fun queryFlavors(): List<Flavor>
+
+ /**
+ * Obtain a [Flavor] by its unique identifier.
+ *
+ * @param id The identifier of the flavor.
+ */
+ public suspend fun findFlavor(id: UUID): Flavor?
+
+ /**
+ * Create a new [Flavor] instance at this compute service.
+ *
+ * @param name The name of the flavor.
+ * @param cpuCount The amount of CPU cores for this flavor.
+ * @param memorySize The size of the memory.
+ * @param labels The identifying labels of the image.
+ * @param meta The non-identifying meta-data of the image.
+ */
+ public suspend fun newFlavor(
+ name: String,
+ cpuCount: Int,
+ memorySize: Long,
+ labels: Map<String, String> = emptyMap(),
+ meta: Map<String, Any> = emptyMap()
+ ): Flavor
+
+ /**
+ * Obtain the list of [Image]s accessible by the requesting user.
+ */
+ public suspend fun queryImages(): List<Image>
+
+ /**
+ * Obtain a [Image] by its unique identifier.
+ *
+ * @param id The identifier of the image.
+ */
+ public suspend fun findImage(id: UUID): Image?
+
+ /**
+ * Create a new [Image] instance at this compute service.
+ *
+ * @param name The name of the image.
+ * @param labels The identifying labels of the image.
+ * @param meta The non-identifying meta-data of the image.
+ */
+ public suspend fun newImage(
+ name: String,
+ labels: Map<String, String> = emptyMap(),
+ meta: Map<String, Any> = emptyMap()
+ ): Image
+
+ /**
+ * Obtain the list of [Server]s accessible by the requesting user.
+ */
+ public suspend fun queryServers(): List<Server>
+
+ /**
+ * Obtain a [Server] by its unique identifier.
+ *
+ * @param id The identifier of the server.
+ */
+ public suspend fun findServer(id: UUID): Server?
+
+ /**
* Create a new [Server] instance at this compute service.
*
* @param name The name of the server to deploy.
* @param image The image to be deployed.
* @param flavor The flavor of the machine instance to run this [image] on.
+ * @param labels The identifying labels of the server.
+ * @param meta The non-identifying meta-data of the server.
+ * @param start A flag to indicate that the server should be started immediately.
*/
public suspend fun newServer(
name: String,
image: Image,
- flavor: Flavor
+ flavor: Flavor,
+ labels: Map<String, String> = emptyMap(),
+ meta: Map<String, Any> = emptyMap(),
+ start: Boolean = true
): Server
/**
diff --git a/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/Flavor.kt b/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/Flavor.kt
index bf5f0ce4..5f511f91 100644
--- a/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/Flavor.kt
+++ b/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/Flavor.kt
@@ -26,14 +26,19 @@ package org.opendc.compute.api
* Flavors define the compute and memory capacity of [Server] instance. To put it simply, a flavor is an available
* hardware configuration for a server. It defines the size of a virtual server that can be launched.
*/
-public data class Flavor(
+public interface Flavor : Resource {
/**
* The number of (virtual) processing cores to use.
*/
- public val cpuCount: Int,
+ public val cpuCount: Int
/**
* The amount of RAM available to the server (in MB).
*/
public val memorySize: Long
-)
+
+ /**
+ * Delete the flavor instance.
+ */
+ public suspend fun delete()
+}
diff --git a/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/Image.kt b/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/Image.kt
index 280c4d89..83e63b81 100644
--- a/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/Image.kt
+++ b/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/Image.kt
@@ -22,27 +22,12 @@
package org.opendc.compute.api
-import org.opendc.core.resource.Resource
-import org.opendc.core.resource.TagContainer
-import java.util.*
-
/**
* An image containing a bootable operating system that can directly be executed by physical or virtual server.
- *
- * OpenStack: A collection of files used to create or rebuild a server. Operators provide a number of pre-built OS
- * images by default. You may also create custom images from cloud servers you have launched. These custom images are
- * useful for backup purposes or for producing “gold” server images if you plan to deploy a particular server
- * configuration frequently.
*/
-public data class Image(
- public override val uid: UUID,
- public override val name: String,
- public override val tags: TagContainer
-) : Resource {
- public companion object {
- /**
- * An empty boot disk [Image] that exits immediately on start.
- */
- public val EMPTY: Image = Image(UUID.randomUUID(), "empty", emptyMap())
- }
+public interface Image : Resource {
+ /**
+ * Delete the image instance.
+ */
+ public suspend fun delete()
}
diff --git a/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/InsufficientServerCapacityException.kt b/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/InsufficientServerCapacityException.kt
new file mode 100644
index 00000000..8fbb7308
--- /dev/null
+++ b/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/InsufficientServerCapacityException.kt
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2021 AtLarge Research
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package org.opendc.compute.api
+
+/**
+ * This exception is thrown to indicate that the compute service does not have enough capacity at the moment to
+ * fulfill a launch request.
+ */
+public class InsufficientServerCapacityException(override val cause: Throwable? = null) : Exception("There was insufficient capacity available to satisfy the launch request")
diff --git a/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/ComputeWorkload.kt b/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/Resource.kt
index 64a47277..08120848 100644
--- a/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/ComputeWorkload.kt
+++ b/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/Resource.kt
@@ -22,25 +22,34 @@
package org.opendc.compute.api
-import org.opendc.core.User
-import org.opendc.core.workload.Workload
import java.util.UUID
/**
- * A workload that represents a VM.
- *
- * @property uid A unique identified of this VM.
- * @property name The name of this VM.
- * @property owner The owner of the VM.
- * @property image The image of the VM.
+ * A generic resource provided by the OpenDC Compute service.
*/
-public data class ComputeWorkload(
- override val uid: UUID,
- override val name: String,
- override val owner: User,
- val image: Image
-) : Workload {
- override fun equals(other: Any?): Boolean = other is ComputeWorkload && uid == other.uid
+public interface Resource {
+ /**
+ * The unique identifier of the resource.
+ */
+ public val uid: UUID
+
+ /**
+ * The name of the resource.
+ */
+ public val name: String
+
+ /**
+ * The identifying labels attached to the resource.
+ */
+ public val labels: Map<String, String>
+
+ /**
+ * The non-identifying metadata attached to the resource.
+ */
+ public val meta: Map<String, Any>
- override fun hashCode(): Int = uid.hashCode()
+ /**
+ * Refresh the local state of the resource.
+ */
+ public suspend fun refresh()
}
diff --git a/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/Server.kt b/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/Server.kt
index ab1eb860..b508a9f8 100644
--- a/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/Server.kt
+++ b/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/Server.kt
@@ -22,18 +22,11 @@
package org.opendc.compute.api
-import org.opendc.core.resource.Resource
-
/**
* A stateful object representing a server instance that is running on some physical or virtual machine.
*/
public interface Server : Resource {
/**
- * The name of the server.
- */
- public override val name: String
-
- /**
* The flavor of the server.
*/
public val flavor: Flavor
@@ -44,14 +37,33 @@ public interface Server : Resource {
public val image: Image
/**
- * The tags assigned to the server.
+ * The last known state of the server.
*/
- public override val tags: Map<String, String>
+ public val state: ServerState
/**
- * The last known state of the server.
+ * Request the server to be started.
+ *
+ * This method is guaranteed to return after the request was acknowledged, but might return before the server was
+ * started.
*/
- public val state: ServerState
+ public suspend fun start()
+
+ /**
+ * Request the server to be stopped.
+ *
+ * This method is guaranteed to return after the request was acknowledged, but might return before the server was
+ * stopped.
+ */
+ public suspend fun stop()
+
+ /**
+ * Request the server to be deleted.
+ *
+ * This method is guaranteed to return after the request was acknowledged, but might return before the server was
+ * deleted.
+ */
+ public suspend fun delete()
/**
* Register the specified [ServerWatcher] to watch the state of the server.
@@ -66,9 +78,4 @@ public interface Server : Resource {
* @param watcher The watcher to de-register from the server.
*/
public fun unwatch(watcher: ServerWatcher)
-
- /**
- * Refresh the local state of the resource.
- */
- public suspend fun refresh()
}
diff --git a/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/ServerState.kt b/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/ServerState.kt
index 25d2e519..a4d7d7d7 100644
--- a/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/ServerState.kt
+++ b/simulator/opendc-compute/opendc-compute-api/src/main/kotlin/org/opendc/compute/api/ServerState.kt
@@ -27,27 +27,27 @@ package org.opendc.compute.api
*/
public enum class ServerState {
/**
- * The server has not yet finished the original build process.
+ * Resources are being allocated for the instance. The instance is not running yet.
*/
- BUILD,
+ PROVISIONING,
/**
- * The server was powered down by the user.
+ * A user shut down the instance.
*/
- SHUTOFF,
+ TERMINATED,
/**
- * The server is active and running.
+ * The server instance is booting up or running.
*/
- ACTIVE,
+ RUNNING,
/**
- * The server is in error.
+ * The server is in an error state.
*/
ERROR,
/**
- * The state of the server is unknown.
+ * The server has been deleted and cannot be started later on.
*/
- UNKNOWN,
+ DELETED,
}