From a7c9e623fe7b57145498efd512dfdc809c4ef0b6 Mon Sep 17 00:00:00 2001 From: Sas Swart Date: Mon, 6 Oct 2025 13:58:37 +0200 Subject: [PATCH] chore: fix api param name (#20172) In https://github.com/coder/coder/pull/20137, we added a new flag to `coder provisioner jobs list`, namely `--initiator`. To make some follow-up worth it, I need to rename an API param used in the process before it becomes part of our released and tagged API. Instead of only accepting UUIDs, we accept an arbitrary string. We still validate it as a UUID now, but we will expand its validation to allow any string and then resolve that string the same way that we resolve the user parameter elsewhere in the API. --- cli/provisionerjobs.go | 10 ++++------ coderd/provisionerjobs.go | 2 +- coderd/provisionerjobs_test.go | 20 ++++++++++---------- codersdk/organizations.go | 14 +++++++------- site/src/api/typesGenerated.ts | 2 +- 5 files changed, 23 insertions(+), 25 deletions(-) diff --git a/cli/provisionerjobs.go b/cli/provisionerjobs.go index 3f441a1758..ee29476ef0 100644 --- a/cli/provisionerjobs.go +++ b/cli/provisionerjobs.go @@ -66,20 +66,18 @@ func (r *RootCmd) provisionerJobsList() *serpent.Command { return xerrors.Errorf("current organization: %w", err) } - var initiatorID *uuid.UUID - if initiator != "" { user, err := client.User(ctx, initiator) if err != nil { return xerrors.Errorf("initiator not found: %s", initiator) } - initiatorID = &user.ID + initiator = user.ID.String() } jobs, err := client.OrganizationProvisionerJobs(ctx, org.ID, &codersdk.OrganizationProvisionerJobsOptions{ - Status: slice.StringEnums[codersdk.ProvisionerJobStatus](status), - Limit: int(limit), - InitiatorID: initiatorID, + Status: slice.StringEnums[codersdk.ProvisionerJobStatus](status), + Limit: int(limit), + Initiator: initiator, }) if err != nil { return xerrors.Errorf("list provisioner jobs: %w", err) diff --git a/coderd/provisionerjobs.go b/coderd/provisionerjobs.go index 4ba923dae2..68f2207f2f 100644 --- a/coderd/provisionerjobs.go +++ b/coderd/provisionerjobs.go @@ -111,7 +111,7 @@ func (api *API) handleAuthAndFetchProvisionerJobs(rw http.ResponseWriter, r *htt ids = p.UUIDs(qp, nil, "ids") } tags := p.JSONStringMap(qp, database.StringMap{}, "tags") - initiatorID := p.UUID(qp, uuid.Nil, "initiator_id") + initiatorID := p.UUID(qp, uuid.Nil, "initiator") p.ErrorExcessParams(qp) if len(p.Errors) > 0 { httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ diff --git a/coderd/provisionerjobs_test.go b/coderd/provisionerjobs_test.go index 829c72aa4d..91096e3b64 100644 --- a/coderd/provisionerjobs_test.go +++ b/coderd/provisionerjobs_test.go @@ -173,7 +173,7 @@ func TestProvisionerJobs(t *testing.T) { ctx := testutil.Context(t, testutil.WaitMedium) jobs, err := templateAdminClient.OrganizationProvisionerJobs(ctx, owner.OrganizationID, &codersdk.OrganizationProvisionerJobsOptions{ - InitiatorID: &member.ID, + Initiator: member.ID.String(), }) require.NoError(t, err) require.GreaterOrEqual(t, len(jobs), 1) @@ -186,8 +186,8 @@ func TestProvisionerJobs(t *testing.T) { // Test filtering by initiator ID combined with status filter jobs, err := templateAdminClient.OrganizationProvisionerJobs(ctx, owner.OrganizationID, &codersdk.OrganizationProvisionerJobsOptions{ - InitiatorID: &owner.UserID, - Status: []codersdk.ProvisionerJobStatus{codersdk.ProvisionerJobSucceeded}, + Initiator: owner.UserID.String(), + Status: []codersdk.ProvisionerJobStatus{codersdk.ProvisionerJobSucceeded}, }) require.NoError(t, err) @@ -204,8 +204,8 @@ func TestProvisionerJobs(t *testing.T) { // Test filtering by initiator ID with limit jobs, err := templateAdminClient.OrganizationProvisionerJobs(ctx, owner.OrganizationID, &codersdk.OrganizationProvisionerJobsOptions{ - InitiatorID: &owner.UserID, - Limit: 1, + Initiator: owner.UserID.String(), + Limit: 1, }) require.NoError(t, err) require.Len(t, jobs, 1) @@ -220,8 +220,8 @@ func TestProvisionerJobs(t *testing.T) { // Test filtering by initiator ID combined with tags jobs, err := templateAdminClient.OrganizationProvisionerJobs(ctx, owner.OrganizationID, &codersdk.OrganizationProvisionerJobsOptions{ - InitiatorID: &member.ID, - Tags: map[string]string{"initiatorTest": "true"}, + Initiator: member.ID.String(), + Tags: map[string]string{"initiatorTest": "true"}, }) require.NoError(t, err) require.Len(t, jobs, 1) @@ -238,7 +238,7 @@ func TestProvisionerJobs(t *testing.T) { // Test with non-existent initiator ID nonExistentID := uuid.New() jobs, err := templateAdminClient.OrganizationProvisionerJobs(ctx, owner.OrganizationID, &codersdk.OrganizationProvisionerJobsOptions{ - InitiatorID: &nonExistentID, + Initiator: nonExistentID.String(), }) require.NoError(t, err) require.Len(t, jobs, 0) @@ -250,7 +250,7 @@ func TestProvisionerJobs(t *testing.T) { // Test with nil initiator ID (should return all jobs) jobs, err := templateAdminClient.OrganizationProvisionerJobs(ctx, owner.OrganizationID, &codersdk.OrganizationProvisionerJobsOptions{ - InitiatorID: nil, + Initiator: "", }) require.NoError(t, err) require.GreaterOrEqual(t, len(jobs), 50) // Should return all jobs (up to default limit) @@ -282,7 +282,7 @@ func TestProvisionerJobs(t *testing.T) { ctx := testutil.Context(t, testutil.WaitMedium) // Member should not be able to access jobs even with initiator filter jobs, err := memberClient.OrganizationProvisionerJobs(ctx, owner.OrganizationID, &codersdk.OrganizationProvisionerJobsOptions{ - InitiatorID: &member.ID, + Initiator: member.ID.String(), }) require.Error(t, err) require.Len(t, jobs, 0) diff --git a/codersdk/organizations.go b/codersdk/organizations.go index 291bb9ac1b..823169d385 100644 --- a/codersdk/organizations.go +++ b/codersdk/organizations.go @@ -397,11 +397,11 @@ func (c *Client) OrganizationProvisionerDaemons(ctx context.Context, organizatio } type OrganizationProvisionerJobsOptions struct { - Limit int - IDs []uuid.UUID - Status []ProvisionerJobStatus - Tags map[string]string - InitiatorID *uuid.UUID + Limit int + IDs []uuid.UUID + Status []ProvisionerJobStatus + Tags map[string]string + Initiator string } func (c *Client) OrganizationProvisionerJobs(ctx context.Context, organizationID uuid.UUID, opts *OrganizationProvisionerJobsOptions) ([]ProvisionerJob, error) { @@ -423,8 +423,8 @@ func (c *Client) OrganizationProvisionerJobs(ctx context.Context, organizationID } qp.Add("tags", string(tagsRaw)) } - if opts.InitiatorID != nil { - qp.Add("initiator_id", opts.InitiatorID.String()) + if opts.Initiator != "" { + qp.Add("initiator", opts.Initiator) } } diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index 0352ce1c97..1e07cf1aa2 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -2356,7 +2356,7 @@ export interface OrganizationProvisionerJobsOptions { readonly IDs: readonly string[]; readonly Status: readonly ProvisionerJobStatus[]; readonly Tags: Record; - readonly InitiatorID: string | null; + readonly Initiator: string; } // From codersdk/idpsync.go