Skip to content

Commit 8b7c049

Browse files
committed
Add method to get agents even for off workspaces
1 parent 3719173 commit 8b7c049

File tree

3 files changed

+26
-3
lines changed

3 files changed

+26
-3
lines changed

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

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

3+
import com.coder.gateway.models.WorkspaceAgentModel
34
import com.coder.gateway.sdk.convertors.InstantConverter
45
import com.coder.gateway.sdk.ex.AuthenticationResponseException
56
import com.coder.gateway.sdk.ex.TemplateResponseException
@@ -12,6 +13,7 @@ import com.coder.gateway.sdk.v2.models.User
1213
import com.coder.gateway.sdk.v2.models.Workspace
1314
import com.coder.gateway.sdk.v2.models.WorkspaceBuild
1415
import com.coder.gateway.sdk.v2.models.WorkspaceTransition
16+
import com.coder.gateway.sdk.v2.models.toAgentModels
1517
import com.google.gson.Gson
1618
import com.google.gson.GsonBuilder
1719
import com.intellij.ide.plugins.PluginManagerCore
@@ -105,6 +107,23 @@ class CoderRestClient(var url: URL, var token: String, var headerCommand: String
105107
return workspacesResponse.body()!!.workspaces
106108
}
107109

110+
/**
111+
* Retrieves agents for the specified workspaces. Since the workspaces
112+
* response does not include agents when the workspace is off, this fires
113+
* off separate queries to get the agents for each workspace, just like
114+
* `coder config-ssh` does (otherwise we risk removing hosts from the SSH
115+
* config when they are off).
116+
*/
117+
fun agents(workspaces: List<Workspace>): List<WorkspaceAgentModel> {
118+
return workspaces.flatMap {
119+
val resourcesResponse = retroRestClient.templateVersionResources(it.latestBuild.templateVersionID).execute()
120+
if (!resourcesResponse.isSuccessful) {
121+
throw WorkspaceResponseException("Unable to retrieve template resources for ${it.name} from $url: code ${resourcesResponse.code()}, reason: ${resourcesResponse.message().ifBlank { "no reason provided" }}")
122+
}
123+
it.toAgentModels(resourcesResponse.body()!!)
124+
}
125+
}
126+
108127
fun buildInfo(): BuildInfo {
109128
val buildInfoResponse = retroRestClient.buildInfo().execute()
110129
if (!buildInfoResponse.isSuccessful) {

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.coder.gateway.sdk.v2.models.CreateWorkspaceBuildRequest
55
import com.coder.gateway.sdk.v2.models.Template
66
import com.coder.gateway.sdk.v2.models.User
77
import com.coder.gateway.sdk.v2.models.WorkspaceBuild
8+
import com.coder.gateway.sdk.v2.models.WorkspaceResource
89
import com.coder.gateway.sdk.v2.models.WorkspacesResponse
910
import retrofit2.Call
1011
import retrofit2.http.Body
@@ -39,4 +40,7 @@ interface CoderV2RestFacade {
3940

4041
@GET("api/v2/templates/{templateID}")
4142
fun template(@Path("templateID") templateID: UUID): Call<Template>
42-
}
43+
44+
@GET("api/v2/templateversions/{templateID}/resources")
45+
fun templateVersionResources(@Path("templateID") templateID: UUID): Call<List<WorkspaceResource>>
46+
}

src/main/kotlin/com/coder/gateway/sdk/v2/models/Workspace.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ data class Workspace(
3131
@SerializedName("last_used_at") val lastUsedAt: Instant,
3232
)
3333

34-
fun Workspace.toAgentModels(): Set<WorkspaceAgentModel> {
35-
val wam = this.latestBuild.resources.filter { it.agents != null }.flatMap { it.agents!! }.map { agent ->
34+
fun Workspace.toAgentModels(resources: List<WorkspaceResource> = this.latestBuild.resources): Set<WorkspaceAgentModel> {
35+
val wam = resources.filter { it.agents != null }.flatMap { it.agents!! }.map { agent ->
3636
val workspaceWithAgentName = "${this.name}.${agent.name}"
3737
val wm = WorkspaceAgentModel(
3838
this.id,

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy