@@ -2,13 +2,17 @@ package com.coder.gateway.sdk
2
2
3
3
import com.coder.gateway.sdk.convertors.InstantConverter
4
4
import com.coder.gateway.sdk.ex.AuthenticationResponseException
5
+ import com.coder.gateway.sdk.ex.TemplateResponseException
5
6
import com.coder.gateway.sdk.ex.WorkspaceResourcesResponseException
6
7
import com.coder.gateway.sdk.ex.WorkspaceResponseException
7
8
import com.coder.gateway.sdk.v2.CoderV2RestFacade
8
9
import 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
9
12
import com.coder.gateway.sdk.v2.models.User
10
13
import com.coder.gateway.sdk.v2.models.Workspace
11
14
import com.coder.gateway.sdk.v2.models.WorkspaceAgent
15
+ import com.coder.gateway.sdk.v2.models.WorkspaceBuild
12
16
import com.google.gson.Gson
13
17
import com.google.gson.GsonBuilder
14
18
import com.intellij.openapi.components.Service
@@ -20,8 +24,10 @@ import okhttp3.logging.HttpLoggingInterceptor
20
24
import retrofit2.Retrofit
21
25
import retrofit2.converter.gson.GsonConverterFactory
22
26
import java.net.CookieManager
27
+ import java.net.HttpURLConnection.HTTP_CREATED
23
28
import java.net.URL
24
29
import java.time.Instant
30
+ import java.util.UUID
25
31
26
32
@Service(Service .Level .APP )
27
33
class CoderRestClientService {
@@ -49,7 +55,7 @@ class CoderRestClientService {
49
55
.create()
50
56
51
57
val interceptor = HttpLoggingInterceptor ()
52
- interceptor.setLevel(HttpLoggingInterceptor .Level .BODY )
58
+ interceptor.setLevel(HttpLoggingInterceptor .Level .BASIC )
53
59
retroRestClient = Retrofit .Builder ()
54
60
.baseUrl(url.toString())
55
61
.client(
@@ -97,17 +103,57 @@ class CoderRestClientService {
97
103
}
98
104
99
105
/* *
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.
102
108
*
103
109
* @throws WorkspaceResourcesResponseException if workspace resources could not be retrieved.
104
110
*/
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()
107
113
if (! workspaceResourcesResponse.isSuccessful) {
108
114
throw WorkspaceResourcesResponseException (" Could not retrieve agents for ${workspace.name} workspace :${workspaceResourcesResponse.code()} , reason: ${workspaceResourcesResponse.message()} " )
109
115
}
110
116
111
117
return workspaceResourcesResponse.body()!! .flatMap { it.agents ? : emptyList() }
112
118
}
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
+ }
113
159
}
0 commit comments