feat: add workspace agent APIVersion (#10419)

Fixes #10339
This commit is contained in:
Spike Curtis 2023-10-31 10:08:43 +04:00 committed by GitHub
parent 90573a6e99
commit a7c671ca07
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 47 additions and 3 deletions

3
coderd/apidoc/docs.go generated
View File

@ -11142,6 +11142,9 @@ const docTemplate = `{
"codersdk.WorkspaceAgent": {
"type": "object",
"properties": {
"api_version": {
"type": "string"
},
"apps": {
"type": "array",
"items": {

View File

@ -10108,6 +10108,9 @@
"codersdk.WorkspaceAgent": {
"type": "object",
"properties": {
"api_version": {
"type": "string"
},
"apps": {
"type": "array",
"items": {

View File

@ -6308,6 +6308,7 @@ func (q *FakeQuerier) UpdateWorkspaceAgentStartupByID(_ context.Context, arg dat
}
agent.Version = arg.Version
agent.APIVersion = arg.APIVersion
agent.ExpandedDirectory = arg.ExpandedDirectory
agent.Subsystems = arg.Subsystems
q.workspaceAgents[index] = agent

View File

@ -8039,7 +8039,8 @@ UPDATE
SET
version = $2,
expanded_directory = $3,
subsystems = $4
subsystems = $4,
api_version = $5
WHERE
id = $1
`
@ -8049,6 +8050,7 @@ type UpdateWorkspaceAgentStartupByIDParams struct {
Version string `db:"version" json:"version"`
ExpandedDirectory string `db:"expanded_directory" json:"expanded_directory"`
Subsystems []WorkspaceAgentSubsystem `db:"subsystems" json:"subsystems"`
APIVersion string `db:"api_version" json:"api_version"`
}
func (q *sqlQuerier) UpdateWorkspaceAgentStartupByID(ctx context.Context, arg UpdateWorkspaceAgentStartupByIDParams) error {
@ -8057,6 +8059,7 @@ func (q *sqlQuerier) UpdateWorkspaceAgentStartupByID(ctx context.Context, arg Up
arg.Version,
arg.ExpandedDirectory,
pq.Array(arg.Subsystems),
arg.APIVersion,
)
return err
}

View File

@ -69,7 +69,8 @@ UPDATE
SET
version = $2,
expanded_directory = $3,
subsystems = $4
subsystems = $4,
api_version = $5
WHERE
id = $1;

View File

@ -250,6 +250,8 @@ func (api *API) workspaceAgentManifest(rw http.ResponseWriter, r *http.Request)
})
}
const AgentAPIVersionREST = "1.0"
// @Summary Submit workspace agent startup
// @ID submit-workspace-agent-startup
// @Security CoderSessionToken
@ -321,6 +323,7 @@ func (api *API) postWorkspaceAgentStartup(rw http.ResponseWriter, r *http.Reques
Version: req.Version,
ExpandedDirectory: req.ExpandedDirectory,
Subsystems: convertWorkspaceAgentSubsystems(req.Subsystems),
APIVersion: AgentAPIVersionREST,
}); err != nil {
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
Message: "Error setting agent version",
@ -1542,6 +1545,7 @@ func convertWorkspaceAgent(derpMap *tailcfg.DERPMap, coordinator tailnet.Coordin
LogsOverflowed: dbAgent.LogsOverflowed,
LogSources: logSources,
Version: dbAgent.Version,
APIVersion: dbAgent.APIVersion,
EnvironmentVariables: envs,
Directory: dbAgent.Directory,
ExpandedDirectory: dbAgent.ExpandedDirectory,

View File

@ -21,6 +21,7 @@ import (
"cdr.dev/slog"
"cdr.dev/slog/sloggers/slogtest"
"github.com/coder/coder/v2/agent/agenttest"
"github.com/coder/coder/v2/coderd"
"github.com/coder/coder/v2/coderd/coderdtest"
"github.com/coder/coder/v2/coderd/database"
"github.com/coder/coder/v2/coderd/database/dbtime"
@ -1367,6 +1368,7 @@ func TestWorkspaceAgent_Startup(t *testing.T) {
require.Equal(t, expectedDir, wsagent.ExpandedDirectory)
// Sorted
require.Equal(t, expectedSubsystems, wsagent.Subsystems)
require.Equal(t, coderd.AgentAPIVersionREST, wsagent.APIVersion)
})
t.Run("InvalidSemver", func(t *testing.T) {

View File

@ -218,7 +218,7 @@ func TestTimezoneOffsets(t *testing.T) {
// Name: "Eastern",
// Loc: must(time.LoadLocation("America/New_York")),
// ExpectedOffset: -4,
//},
// },
//{
// Name: "Central",
// Loc: must(time.LoadLocation("America/Chicago")),

View File

@ -166,6 +166,7 @@ type WorkspaceAgent struct {
Directory string `json:"directory,omitempty"`
ExpandedDirectory string `json:"expanded_directory,omitempty"`
Version string `json:"version"`
APIVersion string `json:"api_version"`
Apps []WorkspaceApp `json:"apps"`
// DERPLatency is mapped by region name (e.g. "New York City", "Seattle").
DERPLatency map[string]DERPRegion `json:"latency,omitempty"`

1
docs/api/agents.md generated
View File

@ -699,6 +699,7 @@ curl -X GET http://coder-server:8080/api/v2/workspaceagents/{workspaceagent} \
```json
{
"api_version": "string",
"apps": [
{
"command": "string",

8
docs/api/builds.md generated
View File

@ -58,6 +58,7 @@ curl -X GET http://coder-server:8080/api/v2/users/{user}/workspace/{workspacenam
{
"agents": [
{
"api_version": "string",
"apps": [
{
"command": "string",
@ -238,6 +239,7 @@ curl -X GET http://coder-server:8080/api/v2/workspacebuilds/{workspacebuild} \
{
"agents": [
{
"api_version": "string",
"apps": [
{
"command": "string",
@ -557,6 +559,7 @@ curl -X GET http://coder-server:8080/api/v2/workspacebuilds/{workspacebuild}/res
{
"agents": [
{
"api_version": "string",
"apps": [
{
"command": "string",
@ -677,6 +680,7 @@ Status Code **200**
| ------------------------------- | ------------------------------------------------------------------------------------------------------ | -------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `[array item]` | array | false | | |
| `» agents` | array | false | | |
| `»» api_version` | string | false | | |
| `»» apps` | array | false | | |
| `»»» command` | string | false | | |
| `»»» display_name` | string | false | | Display name is a friendly name for the app. |
@ -844,6 +848,7 @@ curl -X GET http://coder-server:8080/api/v2/workspacebuilds/{workspacebuild}/sta
{
"agents": [
{
"api_version": "string",
"apps": [
{
"command": "string",
@ -1029,6 +1034,7 @@ curl -X GET http://coder-server:8080/api/v2/workspaces/{workspace}/builds \
{
"agents": [
{
"api_version": "string",
"apps": [
{
"command": "string",
@ -1185,6 +1191,7 @@ Status Code **200**
| `» reason` | [codersdk.BuildReason](schemas.md#codersdkbuildreason) | false | | |
| `» resources` | array | false | | |
| `»» agents` | array | false | | |
| `»»» api_version` | string | false | | |
| `»»» apps` | array | false | | |
| `»»»» command` | string | false | | |
| `»»»» display_name` | string | false | | Display name is a friendly name for the app. |
@ -1405,6 +1412,7 @@ curl -X POST http://coder-server:8080/api/v2/workspaces/{workspace}/builds \
{
"agents": [
{
"api_version": "string",
"apps": [
{
"command": "string",

6
docs/api/schemas.md generated
View File

@ -5642,6 +5642,7 @@ If the schedule is empty, the user will be updated to use the default schedule.|
{
"agents": [
{
"api_version": "string",
"apps": [
{
"command": "string",
@ -5812,6 +5813,7 @@ If the schedule is empty, the user will be updated to use the default schedule.|
```json
{
"api_version": "string",
"apps": [
{
"command": "string",
@ -5903,6 +5905,7 @@ If the schedule is empty, the user will be updated to use the default schedule.|
| Name | Type | Required | Restrictions | Description |
| ---------------------------- | -------------------------------------------------------------------------------------------- | -------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `api_version` | string | false | | |
| `apps` | array of [codersdk.WorkspaceApp](#codersdkworkspaceapp) | false | | |
| `architecture` | string | false | | |
| `connection_timeout_seconds` | integer | false | | |
@ -6331,6 +6334,7 @@ If the schedule is empty, the user will be updated to use the default schedule.|
{
"agents": [
{
"api_version": "string",
"apps": [
{
"command": "string",
@ -6660,6 +6664,7 @@ If the schedule is empty, the user will be updated to use the default schedule.|
{
"agents": [
{
"api_version": "string",
"apps": [
{
"command": "string",
@ -6896,6 +6901,7 @@ If the schedule is empty, the user will be updated to use the default schedule.|
{
"agents": [
{
"api_version": "string",
"apps": [
{
"command": "string",

4
docs/api/templates.md generated
View File

@ -1704,6 +1704,7 @@ curl -X GET http://coder-server:8080/api/v2/templateversions/{templateversion}/d
{
"agents": [
{
"api_version": "string",
"apps": [
{
"command": "string",
@ -1824,6 +1825,7 @@ Status Code **200**
| ------------------------------- | ------------------------------------------------------------------------------------------------------ | -------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `[array item]` | array | false | | |
| `» agents` | array | false | | |
| `»» api_version` | string | false | | |
| `»» apps` | array | false | | |
| `»»» command` | string | false | | |
| `»»» display_name` | string | false | | Display name is a friendly name for the app. |
@ -2120,6 +2122,7 @@ curl -X GET http://coder-server:8080/api/v2/templateversions/{templateversion}/r
{
"agents": [
{
"api_version": "string",
"apps": [
{
"command": "string",
@ -2240,6 +2243,7 @@ Status Code **200**
| ------------------------------- | ------------------------------------------------------------------------------------------------------ | -------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `[array item]` | array | false | | |
| `» agents` | array | false | | |
| `»» api_version` | string | false | | |
| `»» apps` | array | false | | |
| `»»» command` | string | false | | |
| `»»» display_name` | string | false | | Display name is a friendly name for the app. |

View File

@ -90,6 +90,7 @@ curl -X POST http://coder-server:8080/api/v2/organizations/{organization}/member
{
"agents": [
{
"api_version": "string",
"apps": [
{
"command": "string",
@ -299,6 +300,7 @@ curl -X GET http://coder-server:8080/api/v2/users/{user}/workspace/{workspacenam
{
"agents": [
{
"api_version": "string",
"apps": [
{
"command": "string",
@ -511,6 +513,7 @@ curl -X GET http://coder-server:8080/api/v2/workspaces \
{
"agents": [
{
"api_version": "string",
"apps": [
{
"command": "string",
@ -717,6 +720,7 @@ curl -X GET http://coder-server:8080/api/v2/workspaces/{workspace} \
{
"agents": [
{
"api_version": "string",
"apps": [
{
"command": "string",
@ -1042,6 +1046,7 @@ curl -X PUT http://coder-server:8080/api/v2/workspaces/{workspace}/dormant \
{
"agents": [
{
"api_version": "string",
"apps": [
{
"command": "string",

View File

@ -1387,6 +1387,7 @@ export interface WorkspaceAgent {
readonly directory?: string;
readonly expanded_directory?: string;
readonly version: string;
readonly api_version: string;
readonly apps: WorkspaceApp[];
readonly latency?: Record<string, DERPRegion>;
readonly connection_timeout_seconds: number;

View File

@ -585,6 +585,7 @@ export const MockWorkspaceAgent: TypesGen.WorkspaceAgent = {
status: "connected",
updated_at: "",
version: MockBuildInfo.version,
api_version: "1.0",
latency: {
"Coder Embedded DERP": {
latency_ms: 32.55,