Skip to content

Commit 2a9a5ba

Browse files
committed
Impl: REST calls to update a workspace to latest template
- also includes a new REST call for retrieving templates
1 parent f66debc commit 2a9a5ba

File tree

4 files changed

+50
-1
lines changed

4 files changed

+50
-1
lines changed

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

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

33
import com.coder.gateway.sdk.convertors.InstantConverter
44
import com.coder.gateway.sdk.ex.AuthenticationResponseException
5+
import com.coder.gateway.sdk.ex.TemplateResponseException
56
import com.coder.gateway.sdk.ex.WorkspaceResourcesResponseException
67
import com.coder.gateway.sdk.ex.WorkspaceResponseException
78
import com.coder.gateway.sdk.v2.CoderV2RestFacade
89
import com.coder.gateway.sdk.v2.models.BuildInfo
910
import com.coder.gateway.sdk.v2.models.CreateWorkspaceBuildRequest
11+
import com.coder.gateway.sdk.v2.models.Template
1012
import com.coder.gateway.sdk.v2.models.User
1113
import com.coder.gateway.sdk.v2.models.Workspace
1214
import com.coder.gateway.sdk.v2.models.WorkspaceAgent
@@ -115,6 +117,14 @@ class CoderRestClientService {
115117
return workspaceResourcesResponse.body()!!.flatMap { it.agents ?: emptyList() }
116118
}
117119

120+
private fun template(templateID: UUID): Template {
121+
val templateResponse = retroRestClient.template(templateID).execute()
122+
if (!templateResponse.isSuccessful) {
123+
throw TemplateResponseException("Failed to retrieve template with id: $templateID, reason: ${templateResponse.message()}")
124+
}
125+
return templateResponse.body()!!
126+
}
127+
118128
fun startWorkspace(workspaceID: UUID, workspaceName: String): WorkspaceBuild {
119129
val buildRequest = CreateWorkspaceBuildRequest(null, "start", null, null, null)
120130
val buildResponse = retroRestClient.createWorkspaceBuild(workspaceID, buildRequest).execute()
@@ -134,4 +144,16 @@ class CoderRestClientService {
134144

135145
return buildResponse.body()!!
136146
}
147+
148+
fun updateWorkspace(workspaceID: UUID, workspaceName: String, lastWorkspaceTransition: String, templateID: UUID): WorkspaceBuild {
149+
val template = template(templateID)
150+
151+
val buildRequest = CreateWorkspaceBuildRequest(template.activeVersionID, lastWorkspaceTransition, null, null, null)
152+
val buildResponse = retroRestClient.createWorkspaceBuild(workspaceID, buildRequest).execute()
153+
if (buildResponse.code() != HTTP_CREATED) {
154+
throw WorkspaceResponseException("Failed to update workspace ${workspaceName}: ${buildResponse.code()}, reason: ${buildResponse.message()}")
155+
}
156+
157+
return buildResponse.body()!!
158+
}
137159
}

src/main/kotlin/com/coder/gateway/sdk/ex/exceptions.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ class AuthenticationResponseException(reason: String) : IOException(reason)
66

77
class WorkspaceResponseException(reason: String) : IOException(reason)
88

9-
class WorkspaceResourcesResponseException(reason: String) : IOException(reason)
9+
class WorkspaceResourcesResponseException(reason: String) : IOException(reason)
10+
11+
class TemplateResponseException(reason: String) : IOException(reason)

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.coder.gateway.sdk.v2
22

33
import com.coder.gateway.sdk.v2.models.BuildInfo
44
import com.coder.gateway.sdk.v2.models.CreateWorkspaceBuildRequest
5+
import com.coder.gateway.sdk.v2.models.Template
56
import com.coder.gateway.sdk.v2.models.User
67
import com.coder.gateway.sdk.v2.models.Workspace
78
import com.coder.gateway.sdk.v2.models.WorkspaceBuild
@@ -39,4 +40,7 @@ interface CoderV2RestFacade {
3940
*/
4041
@POST("api/v2/workspaces/{workspaceID}/builds")
4142
fun createWorkspaceBuild(@Path("workspaceID") workspaceID: UUID, @Body createWorkspaceBuildRequest: CreateWorkspaceBuildRequest): Call<WorkspaceBuild>
43+
44+
@GET("api/v2/templates/{templateID}")
45+
fun template(@Path("templateID") templateID: UUID): Call<Template>
4246
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.coder.gateway.sdk.v2.models
2+
3+
import com.google.gson.annotations.SerializedName
4+
import java.time.Instant
5+
import java.util.UUID
6+
7+
data class Template(
8+
@SerializedName("id") val id: UUID,
9+
@SerializedName("created_at") val createdAt: Instant,
10+
@SerializedName("updated_at") val updatedAt: Instant,
11+
@SerializedName("organization_id") val organizationIterator: UUID,
12+
@SerializedName("name") val name: String,
13+
@SerializedName("provisioner") val provisioner: String,
14+
@SerializedName("active_version_id") val activeVersionID: UUID,
15+
@SerializedName("workspace_owner_count") val workspaceOwnerCount: Int,
16+
@SerializedName("description") val description: String,
17+
@SerializedName("max_ttl_ms") val maxTTLMillis: Long,
18+
@SerializedName("min_autostart_interval_ms") val minAutostartIntervalMillis: Long,
19+
@SerializedName("created_by_id") val createdByID: UUID,
20+
@SerializedName("created_by_name") val createdByName: String,
21+
)

0 commit comments

Comments
 (0)