From 0536b58b487b633d3078384c4bb26cbc59f6e683 Mon Sep 17 00:00:00 2001 From: Spike Curtis Date: Mon, 4 Dec 2023 09:58:35 +0400 Subject: [PATCH] fix: parse username/workspace correctly on coder state push --build (#10974) Fixes the same issue as #10884 but for state push --- cli/state.go | 6 +++++- cli/state_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/cli/state.go b/cli/state.go index 966ce0a998..62bc745cf4 100644 --- a/cli/state.go +++ b/cli/state.go @@ -103,7 +103,11 @@ func (r *RootCmd) statePush() *clibase.Cmd { if buildNumber == 0 { build = workspace.LatestBuild } else { - build, err = client.WorkspaceBuildByUsernameAndWorkspaceNameAndBuildNumber(inv.Context(), codersdk.Me, inv.Args[0], strconv.FormatInt((buildNumber), 10)) + owner, workspace, err := splitNamedWorkspace(inv.Args[0]) + if err != nil { + return err + } + build, err = client.WorkspaceBuildByUsernameAndWorkspaceNameAndBuildNumber(inv.Context(), owner, workspace, strconv.FormatInt((buildNumber), 10)) if err != nil { return err } diff --git a/cli/state_test.go b/cli/state_test.go index 2c6c95d0ea..1d746e8989 100644 --- a/cli/state_test.go +++ b/cli/state_test.go @@ -134,4 +134,28 @@ func TestStatePush(t *testing.T) { err := inv.Run() require.NoError(t, err) }) + + t.Run("OtherUserBuild", func(t *testing.T) { + t.Parallel() + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + owner := coderdtest.CreateFirstUser(t, client) + templateAdmin, taUser := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin()) + version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, &echo.Responses{ + Parse: echo.ParseComplete, + ProvisionApply: echo.ApplyComplete, + }) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) + workspace := coderdtest.CreateWorkspace(t, templateAdmin, owner.OrganizationID, template.ID) + coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) + inv, root := clitest.New(t, "state", "push", + "--build", strconv.Itoa(int(workspace.LatestBuild.BuildNumber)), + taUser.Username+"/"+workspace.Name, + "-") + //nolint: gocritic // this tests owner pushing another user's state + clitest.SetupConfig(t, client, root) + inv.Stdin = strings.NewReader("some magic state") + err := inv.Run() + require.NoError(t, err) + }) }