Skip to content

Commit 8bf79c8

Browse files
committed
Add tags param to provisioner daemons endpoint
1 parent 39ab8a0 commit 8bf79c8

File tree

9 files changed

+74
-24
lines changed

9 files changed

+74
-24
lines changed

coderd/apidoc/docs.go

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries.sql.go

Lines changed: 1 addition & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/provisionerdaemons.sql

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,10 @@ FROM
1111
provisioner_daemons
1212
WHERE
1313
-- This is the original search criteria:
14-
(@organization_id :: uuid IS NULL OR organization_id = @organization_id :: uuid)
14+
organization_id = @organization_id :: uuid
1515
AND
1616
-- adding support for searching by tags:
17-
(@tags :: jsonb IS NULL OR tags_compatible(@tags :: jsonb, provisioner_daemons.tags :: jsonb))
18-
AND
19-
-- Because we're adding @tags as a second search parameter, we need to do this check to
20-
-- ensure that the first parameter's behavior remains unchanged when no second parameter is provided:
21-
(@organization_id :: uuid IS NOT NULL OR @tags IS NOT NULL);
17+
(@tags :: jsonb IS NULL OR tags_compatible(@tags :: jsonb, provisioner_daemons.tags :: jsonb));
2218

2319
-- name: DeleteOldProvisionerDaemons :exec
2420
-- Delete provisioner daemons that have been created at least a week ago

codersdk/organizations.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"encoding/json"
66
"fmt"
77
"net/http"
8+
"net/url"
89
"strings"
910
"time"
1011

@@ -314,11 +315,21 @@ func (c *Client) ProvisionerDaemons(ctx context.Context) ([]ProvisionerDaemon, e
314315
return daemons, json.NewDecoder(res.Body).Decode(&daemons)
315316
}
316317

317-
func (c *Client) OrganizationProvisionerDaemons(ctx context.Context, organizationID uuid.UUID) ([]ProvisionerDaemon, error) {
318-
res, err := c.Request(ctx, http.MethodGet,
319-
fmt.Sprintf("/api/v2/organizations/%s/provisionerdaemons", organizationID.String()),
320-
nil,
321-
)
318+
func (c *Client) OrganizationProvisionerDaemons(ctx context.Context, organizationID uuid.UUID, tags []string) ([]ProvisionerDaemon, error) {
319+
baseURL := fmt.Sprintf("/api/v2/organizations/%s/provisionerdaemons", organizationID.String())
320+
321+
queryParams := url.Values{}
322+
if len(tags) > 0 {
323+
for _, tag := range tags {
324+
queryParams.Add("tags", tag)
325+
}
326+
}
327+
328+
if len(queryParams) > 0 {
329+
baseURL = fmt.Sprintf("%s?%s", baseURL, queryParams.Encode())
330+
}
331+
332+
res, err := c.Request(ctx, http.MethodGet, baseURL, nil)
322333
if err != nil {
323334
return nil, xerrors.Errorf("execute request: %w", err)
324335
}

docs/reference/api/enterprise.md

Lines changed: 4 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

enterprise/cli/provisionerdaemonstart_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ func TestProvisionerDaemon_SessionToken(t *testing.T) {
236236
var daemons []codersdk.ProvisionerDaemon
237237
var err error
238238
require.Eventually(t, func() bool {
239-
daemons, err = client.OrganizationProvisionerDaemons(ctx, anotherOrg.ID)
239+
daemons, err = client.OrganizationProvisionerDaemons(ctx, anotherOrg.ID, nil)
240240
if err != nil {
241241
return false
242242
}
@@ -282,7 +282,7 @@ func TestProvisionerDaemon_ProvisionerKey(t *testing.T) {
282282

283283
var daemons []codersdk.ProvisionerDaemon
284284
require.Eventually(t, func() bool {
285-
daemons, err = client.OrganizationProvisionerDaemons(ctx, user.OrganizationID)
285+
daemons, err = client.OrganizationProvisionerDaemons(ctx, user.OrganizationID, nil)
286286
if err != nil {
287287
return false
288288
}
@@ -376,7 +376,7 @@ func TestProvisionerDaemon_ProvisionerKey(t *testing.T) {
376376

377377
var daemons []codersdk.ProvisionerDaemon
378378
require.Eventually(t, func() bool {
379-
daemons, err = client.OrganizationProvisionerDaemons(ctx, anotherOrg.ID)
379+
daemons, err = client.OrganizationProvisionerDaemons(ctx, anotherOrg.ID, nil)
380380
if err != nil {
381381
return false
382382
}

enterprise/coderd/provisionerdaemons.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package coderd
33
import (
44
"context"
55
"database/sql"
6+
"encoding/json"
67
"fmt"
78
"io"
89
"net/http"
@@ -56,13 +57,22 @@ func (api *API) provisionerDaemonsEnabledMW(next http.Handler) http.Handler {
5657
// @Produce json
5758
// @Tags Enterprise
5859
// @Param organization path string true "Organization ID" format(uuid)
60+
// @Param tags query []string false "Provisioner tags to filter by"
5961
// @Success 200 {array} codersdk.ProvisionerDaemon
6062
// @Router /organizations/{organization}/provisionerdaemons [get]
6163
func (api *API) provisionerDaemons(rw http.ResponseWriter, r *http.Request) {
6264
ctx := r.Context()
6365
org := httpmw.OrganizationParam(r)
6466

65-
daemons, err := api.Database.GetProvisionerDaemonsByOrganization(ctx, database.GetProvisionerDaemonsByOrganizationParams{OrganizationID: org.ID})
67+
tags := provisionerTags(r)
68+
69+
daemons, err := api.Database.GetProvisionerDaemonsByOrganization(
70+
ctx,
71+
database.GetProvisionerDaemonsByOrganizationParams{
72+
OrganizationID: org.ID,
73+
Tags: tags,
74+
},
75+
)
6676
if err != nil {
6777
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
6878
Message: "Internal error fetching provisioner daemons.",
@@ -74,6 +84,24 @@ func (api *API) provisionerDaemons(rw http.ResponseWriter, r *http.Request) {
7484
httpapi.Write(ctx, rw, http.StatusOK, db2sdk.List(daemons, db2sdk.ProvisionerDaemon))
7585
}
7686

87+
func provisionerTags(r *http.Request) json.RawMessage {
88+
tags := r.URL.Query()["tags"]
89+
if len(tags) == 0 {
90+
return json.RawMessage("{}")
91+
}
92+
93+
var pairs []string
94+
for _, tag := range tags {
95+
parts := strings.SplitN(tag, "=", 2)
96+
if len(parts) == 2 {
97+
pairs = append(pairs, fmt.Sprintf(`%q:%q`, parts[0], parts[1]))
98+
}
99+
}
100+
101+
jsonString := fmt.Sprintf("{%s}", strings.Join(pairs, ","))
102+
return json.RawMessage(jsonString)
103+
}
104+
77105
type provisiionerDaemonAuthResponse struct {
78106
keyID uuid.UUID
79107
orgID uuid.UUID

enterprise/coderd/provisionerdaemons_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,7 @@ func TestGetProvisionerDaemons(t *testing.T) {
768768
require.NoError(t, err)
769769
srv.DRPCConn().Close()
770770

771-
daemons, err := orgAdmin.OrganizationProvisionerDaemons(ctx, org.ID)
771+
daemons, err := orgAdmin.OrganizationProvisionerDaemons(ctx, org.ID, nil)
772772
require.NoError(t, err)
773773
require.Len(t, daemons, 1)
774774

0 commit comments

Comments
 (0)