Skip to content

Commit 86654c3

Browse files
committedAug 12, 2022
Impl: add REST calls for starting/stopping workspaces
1 parent eb89d2c commit 86654c3

File tree

4 files changed

+90
-0
lines changed

4 files changed

+90
-0
lines changed
 

‎src/main/kotlin/com/coder/gateway/sdk/CoderRestClientService.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ import com.coder.gateway.sdk.ex.WorkspaceResourcesResponseException
66
import com.coder.gateway.sdk.ex.WorkspaceResponseException
77
import com.coder.gateway.sdk.v2.CoderV2RestFacade
88
import com.coder.gateway.sdk.v2.models.BuildInfo
9+
import com.coder.gateway.sdk.v2.models.CreateWorkspaceBuildRequest
910
import com.coder.gateway.sdk.v2.models.User
1011
import com.coder.gateway.sdk.v2.models.Workspace
1112
import com.coder.gateway.sdk.v2.models.WorkspaceAgent
13+
import com.coder.gateway.sdk.v2.models.WorkspaceBuild
1214
import com.google.gson.Gson
1315
import com.google.gson.GsonBuilder
1416
import com.intellij.openapi.components.Service
@@ -20,8 +22,10 @@ import okhttp3.logging.HttpLoggingInterceptor
2022
import retrofit2.Retrofit
2123
import retrofit2.converter.gson.GsonConverterFactory
2224
import java.net.CookieManager
25+
import java.net.HttpURLConnection.HTTP_CREATED
2326
import java.net.URL
2427
import java.time.Instant
28+
import java.util.UUID
2529

2630
@Service(Service.Level.APP)
2731
class CoderRestClientService {
@@ -110,4 +114,24 @@ class CoderRestClientService {
110114

111115
return workspaceResourcesResponse.body()!!.flatMap { it.agents ?: emptyList() }
112116
}
117+
118+
fun startWorkspace(workspaceID: UUID, workspaceName: String): WorkspaceBuild {
119+
val buildRequest = CreateWorkspaceBuildRequest(null, "start", null, null, null)
120+
val buildResponse = retroRestClient.createWorkspaceBuild(workspaceID, buildRequest).execute()
121+
if (buildResponse.code() != HTTP_CREATED) {
122+
throw WorkspaceResponseException("Failed to build workspace ${workspaceName}: ${buildResponse.code()}, reason: ${buildResponse.message()}")
123+
}
124+
125+
return buildResponse.body()!!
126+
}
127+
128+
fun stopWorkspace(workspaceID: UUID, workspaceName: String): WorkspaceBuild {
129+
val buildRequest = CreateWorkspaceBuildRequest(null, "stop", null, null, null)
130+
val buildResponse = retroRestClient.createWorkspaceBuild(workspaceID, buildRequest).execute()
131+
if (buildResponse.code() != HTTP_CREATED) {
132+
throw WorkspaceResponseException("Failed to stop workspace ${workspaceName}: ${buildResponse.code()}, reason: ${buildResponse.message()}")
133+
}
134+
135+
return buildResponse.body()!!
136+
}
113137
}

‎src/main/kotlin/com/coder/gateway/sdk/v2/CoderV2RestFacade.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package com.coder.gateway.sdk.v2
22

33
import com.coder.gateway.sdk.v2.models.BuildInfo
4+
import com.coder.gateway.sdk.v2.models.CreateWorkspaceBuildRequest
45
import com.coder.gateway.sdk.v2.models.User
56
import com.coder.gateway.sdk.v2.models.Workspace
7+
import com.coder.gateway.sdk.v2.models.WorkspaceBuild
68
import com.coder.gateway.sdk.v2.models.WorkspaceResource
79
import retrofit2.Call
10+
import retrofit2.http.Body
811
import retrofit2.http.GET
12+
import retrofit2.http.POST
913
import retrofit2.http.Path
1014
import retrofit2.http.Query
1115
import java.util.UUID
@@ -29,4 +33,10 @@ interface CoderV2RestFacade {
2933

3034
@GET("api/v2/workspacebuilds/{buildID}/resources")
3135
fun workspaceResourceByBuild(@Path("buildID") build: UUID): Call<List<WorkspaceResource>>
36+
37+
/**
38+
* Queues a new build to occur for a workspace.
39+
*/
40+
@POST("api/v2/workspaces/{workspaceID}/builds")
41+
fun createWorkspaceBuild(@Path("workspaceID") workspaceID: UUID, @Body createWorkspaceBuildRequest: CreateWorkspaceBuildRequest): Call<WorkspaceBuild>
3242
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.coder.gateway.sdk.v2.models
2+
3+
import com.google.gson.annotations.SerializedName
4+
import java.util.UUID
5+
6+
data class CreateParameterRequest(
7+
@SerializedName("copy_from_parameter") val cloneID: UUID?,
8+
@SerializedName("name") val name: String,
9+
@SerializedName("source_value") val sourceValue: String,
10+
@SerializedName("source_scheme") val sourceScheme: String,
11+
@SerializedName("destination_scheme") val destinationScheme: String
12+
)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.coder.gateway.sdk.v2.models
2+
3+
import com.google.gson.annotations.SerializedName
4+
import java.util.UUID
5+
6+
data class CreateWorkspaceBuildRequest(
7+
@SerializedName("template_version_id") val templateVersionID: UUID?,
8+
@SerializedName("transition") val transition: String,
9+
@SerializedName("dry_run") val dryRun: Boolean?,
10+
@SerializedName("state") val state: Array<Byte>?,
11+
@SerializedName("parameter_values") val parameterValues: Array<CreateParameterRequest>?
12+
) {
13+
14+
override fun equals(other: Any?): Boolean {
15+
if (this === other) return true
16+
if (javaClass != other?.javaClass) return false
17+
18+
other as CreateWorkspaceBuildRequest
19+
20+
if (templateVersionID != other.templateVersionID) return false
21+
if (transition != other.transition) return false
22+
if (dryRun != other.dryRun) return false
23+
if (state != null) {
24+
if (other.state == null) return false
25+
if (!state.contentEquals(other.state)) return false
26+
} else if (other.state != null) return false
27+
if (parameterValues != null) {
28+
if (other.parameterValues == null) return false
29+
if (!parameterValues.contentEquals(other.parameterValues)) return false
30+
} else if (other.parameterValues != null) return false
31+
32+
return true
33+
}
34+
35+
override fun hashCode(): Int {
36+
var result = templateVersionID?.hashCode() ?: 0
37+
result = 31 * result + transition.hashCode()
38+
result = 31 * result + (dryRun?.hashCode() ?: 0)
39+
result = 31 * result + (state?.contentHashCode() ?: 0)
40+
result = 31 * result + (parameterValues?.contentHashCode() ?: 0)
41+
return result
42+
}
43+
}
44+

0 commit comments

Comments
 (0)