@@ -2,13 +2,17 @@ package com.coder.gateway.sdk
22
33import com.coder.gateway.sdk.convertors.InstantConverter
44import com.coder.gateway.sdk.ex.AuthenticationResponseException
5+ import com.coder.gateway.sdk.ex.TemplateResponseException
56import com.coder.gateway.sdk.ex.WorkspaceResourcesResponseException
67import com.coder.gateway.sdk.ex.WorkspaceResponseException
78import com.coder.gateway.sdk.v2.CoderV2RestFacade
89import com.coder.gateway.sdk.v2.models.BuildInfo
10+ import com.coder.gateway.sdk.v2.models.CreateWorkspaceBuildRequest
11+ import com.coder.gateway.sdk.v2.models.Template
912import com.coder.gateway.sdk.v2.models.User
1013import com.coder.gateway.sdk.v2.models.Workspace
1114import com.coder.gateway.sdk.v2.models.WorkspaceAgent
15+ import com.coder.gateway.sdk.v2.models.WorkspaceBuild
1216import com.google.gson.Gson
1317import com.google.gson.GsonBuilder
1418import com.intellij.openapi.components.Service
@@ -20,8 +24,10 @@ import okhttp3.logging.HttpLoggingInterceptor
2024import retrofit2.Retrofit
2125import retrofit2.converter.gson.GsonConverterFactory
2226import java.net.CookieManager
27+ import java.net.HttpURLConnection.HTTP_CREATED
2328import java.net.URL
2429import java.time.Instant
30+ import java.util.UUID
2531
2632@Service(Service .Level .APP )
2733class CoderRestClientService {
@@ -49,7 +55,7 @@ class CoderRestClientService {
4955 .create()
5056
5157 val interceptor = HttpLoggingInterceptor ()
52- interceptor.setLevel(HttpLoggingInterceptor .Level .BODY )
58+ interceptor.setLevel(HttpLoggingInterceptor .Level .BASIC )
5359 retroRestClient = Retrofit .Builder ()
5460 .baseUrl(url.toString())
5561 .client(
@@ -97,17 +103,57 @@ class CoderRestClientService {
97103 }
98104
99105 /* *
100- * Retrieves the workspace agents. A workspace is a collection of objects like, VMs, containers, cloud DBs, etc.. .
101- * Agents run on compute hosts like VMs or containers.
106+ * Retrieves the workspace agents a template declares .
107+ * A workspace is a collection of objects like, VMs, containers, cloud DBs, etc... Agents run on compute hosts like VMs or containers.
102108 *
103109 * @throws WorkspaceResourcesResponseException if workspace resources could not be retrieved.
104110 */
105- fun workspaceAgents (workspace : Workspace ): List <WorkspaceAgent > {
106- val workspaceResourcesResponse = retroRestClient.workspaceResourceByBuild (workspace.latestBuild.id ).execute()
111+ fun workspaceAgentsByTemplate (workspace : Workspace ): List <WorkspaceAgent > {
112+ val workspaceResourcesResponse = retroRestClient.templateVersionResources (workspace.latestBuild.templateVersionID ).execute()
107113 if (! workspaceResourcesResponse.isSuccessful) {
108114 throw WorkspaceResourcesResponseException (" Could not retrieve agents for ${workspace.name} workspace :${workspaceResourcesResponse.code()} , reason: ${workspaceResourcesResponse.message()} " )
109115 }
110116
111117 return workspaceResourcesResponse.body()!! .flatMap { it.agents ? : emptyList() }
112118 }
119+
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+
128+ fun startWorkspace (workspaceID : UUID , workspaceName : String ): WorkspaceBuild {
129+ val buildRequest = CreateWorkspaceBuildRequest (null , " start" , null , null , null )
130+ val buildResponse = retroRestClient.createWorkspaceBuild(workspaceID, buildRequest).execute()
131+ if (buildResponse.code() != HTTP_CREATED ) {
132+ throw WorkspaceResponseException (" Failed to build workspace ${workspaceName} : ${buildResponse.code()} , reason: ${buildResponse.message()} " )
133+ }
134+
135+ return buildResponse.body()!!
136+ }
137+
138+ fun stopWorkspace (workspaceID : UUID , workspaceName : String ): WorkspaceBuild {
139+ val buildRequest = CreateWorkspaceBuildRequest (null , " stop" , null , null , null )
140+ val buildResponse = retroRestClient.createWorkspaceBuild(workspaceID, buildRequest).execute()
141+ if (buildResponse.code() != HTTP_CREATED ) {
142+ throw WorkspaceResponseException (" Failed to stop workspace ${workspaceName} : ${buildResponse.code()} , reason: ${buildResponse.message()} " )
143+ }
144+
145+ return buildResponse.body()!!
146+ }
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+ }
113159}
0 commit comments