diff --git a/src/main/kotlin/com/coder/gateway/cli/CoderCLIManager.kt b/src/main/kotlin/com/coder/gateway/cli/CoderCLIManager.kt index cc883a3b..197c32d1 100644 --- a/src/main/kotlin/com/coder/gateway/cli/CoderCLIManager.kt +++ b/src/main/kotlin/com/coder/gateway/cli/CoderCLIManager.kt @@ -116,6 +116,7 @@ data class Features( val disableAutostart: Boolean = false, val reportWorkspaceUsage: Boolean = false, val wildcardSSH: Boolean = false, + val buildReason: Boolean = false, ) /** @@ -479,13 +480,21 @@ class CoderCLIManager( * * Throws if the command execution fails. */ - fun startWorkspace(workspaceOwner: String, workspaceName: String): String = exec( - "--global-config", - coderConfigPath.toString(), - "start", - "--yes", - workspaceOwner + "/" + workspaceName, - ) + fun startWorkspace(workspaceOwner: String, workspaceName: String, feats: Features = features): String { + val args = mutableListOf( + "--global-config", + coderConfigPath.toString(), + "start", + "--yes", + workspaceOwner + "/" + workspaceName + ) + + if (feats.buildReason) { + args.addAll(listOf("--reason", "jetbrains_connection")) + } + + return exec(*args.toTypedArray()) + } private fun exec(vararg args: String): String { val stdout = @@ -511,6 +520,7 @@ class CoderCLIManager( disableAutostart = version >= SemVer(2, 5, 0), reportWorkspaceUsage = version >= SemVer(2, 13, 0), wildcardSSH = version >= SemVer(2, 19, 0), + buildReason = version >= SemVer(2, 25, 0), ) } } diff --git a/src/main/kotlin/com/coder/gateway/sdk/CoderRestClient.kt b/src/main/kotlin/com/coder/gateway/sdk/CoderRestClient.kt index 71c6e1ba..3224f517 100644 --- a/src/main/kotlin/com/coder/gateway/sdk/CoderRestClient.kt +++ b/src/main/kotlin/com/coder/gateway/sdk/CoderRestClient.kt @@ -15,6 +15,7 @@ import com.coder.gateway.sdk.v2.models.User import com.coder.gateway.sdk.v2.models.Workspace import com.coder.gateway.sdk.v2.models.WorkspaceAgent import com.coder.gateway.sdk.v2.models.WorkspaceBuild +import com.coder.gateway.sdk.v2.models.WorkspaceBuildReason import com.coder.gateway.sdk.v2.models.WorkspaceResource import com.coder.gateway.sdk.v2.models.WorkspaceStatus import com.coder.gateway.sdk.v2.models.WorkspaceTransition @@ -244,7 +245,7 @@ open class CoderRestClient( * @throws [APIResponseException]. */ fun stopWorkspace(workspace: Workspace): WorkspaceBuild { - val buildRequest = CreateWorkspaceBuildRequest(null, WorkspaceTransition.STOP) + val buildRequest = CreateWorkspaceBuildRequest(null, WorkspaceTransition.STOP, null) val buildResponse = retroRestClient.createWorkspaceBuild(workspace.id, buildRequest).execute() if (buildResponse.code() != HttpURLConnection.HTTP_CREATED) { throw APIResponseException("stop workspace ${workspace.name}", url, buildResponse) @@ -265,7 +266,11 @@ open class CoderRestClient( fun updateWorkspace(workspace: Workspace): WorkspaceBuild { val template = template(workspace.templateID) val buildRequest = - CreateWorkspaceBuildRequest(template.activeVersionID, WorkspaceTransition.START) + CreateWorkspaceBuildRequest( + template.activeVersionID, + WorkspaceTransition.START, + WorkspaceBuildReason.JETBRAINS_CONNECTION + ) val buildResponse = retroRestClient.createWorkspaceBuild(workspace.id, buildRequest).execute() if (buildResponse.code() != HttpURLConnection.HTTP_CREATED) { throw APIResponseException("update workspace ${workspace.name}", url, buildResponse) diff --git a/src/main/kotlin/com/coder/gateway/sdk/v2/models/CreateWorkspaceBuildRequest.kt b/src/main/kotlin/com/coder/gateway/sdk/v2/models/CreateWorkspaceBuildRequest.kt index 5f00ddc4..c00261e2 100644 --- a/src/main/kotlin/com/coder/gateway/sdk/v2/models/CreateWorkspaceBuildRequest.kt +++ b/src/main/kotlin/com/coder/gateway/sdk/v2/models/CreateWorkspaceBuildRequest.kt @@ -10,6 +10,8 @@ data class CreateWorkspaceBuildRequest( @Json(name = "template_version_id") val templateVersionID: UUID?, // Use to start and stop the workspace. @Json(name = "transition") val transition: WorkspaceTransition, + // Use to set build reason for a workspace. + @Json(name = "reason") val reason: WorkspaceBuildReason?, ) { override fun equals(other: Any?): Boolean { if (this === other) return true @@ -19,6 +21,7 @@ data class CreateWorkspaceBuildRequest( if (templateVersionID != other.templateVersionID) return false if (transition != other.transition) return false + if (reason != other.reason) return false return true } @@ -26,6 +29,7 @@ data class CreateWorkspaceBuildRequest( override fun hashCode(): Int { var result = templateVersionID?.hashCode() ?: 0 result = 31 * result + transition.hashCode() + result = 31 * result + (reason?.hashCode() ?: 0) return result } } diff --git a/src/main/kotlin/com/coder/gateway/sdk/v2/models/WorkspaceBuildReason.kt b/src/main/kotlin/com/coder/gateway/sdk/v2/models/WorkspaceBuildReason.kt new file mode 100644 index 00000000..18d50342 --- /dev/null +++ b/src/main/kotlin/com/coder/gateway/sdk/v2/models/WorkspaceBuildReason.kt @@ -0,0 +1,7 @@ +package com.coder.gateway.sdk.v2.models + +import com.squareup.moshi.Json + +enum class WorkspaceBuildReason { + @Json(name = "jetbrains_connection") JETBRAINS_CONNECTION, +} \ No newline at end of file diff --git a/src/test/kotlin/com/coder/gateway/cli/CoderCLIManagerTest.kt b/src/test/kotlin/com/coder/gateway/cli/CoderCLIManagerTest.kt index 5ae754ec..73aae020 100644 --- a/src/test/kotlin/com/coder/gateway/cli/CoderCLIManagerTest.kt +++ b/src/test/kotlin/com/coder/gateway/cli/CoderCLIManagerTest.kt @@ -825,7 +825,7 @@ internal class CoderCLIManagerTest { listOf( Pair("2.5.0", Features(true)), Pair("2.13.0", Features(true, true)), - Pair("4.9.0", Features(true, true, true)), + Pair("4.9.0", Features(true, true, true, true)), Pair("2.4.9", Features(false)), Pair("1.0.1", Features(false)), )