Skip to content

Commit 4a9bd9c

Browse files
committed
support ownername
1 parent 536f3c8 commit 4a9bd9c

File tree

6 files changed

+98
-15
lines changed

6 files changed

+98
-15
lines changed

coderd/apidoc/docs.go

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/workspaces.go

+26-7
Original file line numberDiff line numberDiff line change
@@ -226,14 +226,19 @@ func (api *API) workspaces(rw http.ResponseWriter, r *http.Request) {
226226
// @Param user path string true "User ID, name, or me"
227227
// @Param workspacename path string true "Workspace name"
228228
// @Param include_deleted query bool false "Return data instead of HTTP 404 if the workspace is deleted"
229+
// @Param resolve_parameters query bool false "Evaluate if there is a parameter mismatch between the workspace and the active template version"
229230
// @Success 200 {object} codersdk.Workspace
230231
// @Router /users/{user}/workspace/{workspacename} [get]
231232
func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request) {
232-
ctx := r.Context()
233-
owner := httpmw.UserParam(r)
234-
workspaceName := chi.URLParam(r, "workspacename")
233+
var (
234+
ctx = r.Context()
235+
owner = httpmw.UserParam(r)
236+
workspaceName = chi.URLParam(r, "workspacename")
237+
resolveStr = r.URL.Query().Get("resolve_parameters")
235238

236-
includeDeleted := false
239+
includeDeleted = false
240+
resolveParameters = false
241+
)
237242
if s := r.URL.Query().Get("include_deleted"); s != "" {
238243
var err error
239244
includeDeleted, err = strconv.ParseBool(s)
@@ -248,6 +253,20 @@ func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request)
248253
}
249254
}
250255

256+
if resolveStr != "" {
257+
var err error
258+
resolveParameters, err = strconv.ParseBool(resolveStr)
259+
if err != nil {
260+
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
261+
Message: fmt.Sprintf("Invalid boolean value %q for \"resolve_parameters\" query param.", resolveStr),
262+
Validations: []codersdk.ValidationError{
263+
{Field: "resolve_parameters", Detail: "Must be a valid boolean"},
264+
},
265+
})
266+
return
267+
}
268+
}
269+
251270
workspace, err := api.Database.GetWorkspaceByOwnerIDAndName(ctx, database.GetWorkspaceByOwnerIDAndNameParams{
252271
OwnerID: owner.ID,
253272
Name: workspaceName,
@@ -271,7 +290,7 @@ func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request)
271290
return
272291
}
273292

274-
data, err := api.workspaceData(ctx, []database.Workspace{workspace}, false)
293+
data, err := api.workspaceData(ctx, []database.Workspace{workspace}, resolveParameters)
275294
if err != nil {
276295
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
277296
Message: "Internal error fetching workspace resources.",
@@ -296,8 +315,8 @@ func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request)
296315
workspace,
297316
data.builds[0],
298317
data.templates[0],
299-
nil,
300-
nil,
318+
data.versionParameters[data.templates[0].ActiveVersionID],
319+
data.buildParameters[data.builds[0].ID],
301320
ownerName,
302321
))
303322
}

coderd/workspaces_test.go

+53
Original file line numberDiff line numberDiff line change
@@ -837,6 +837,59 @@ func TestWorkspaceByOwnerAndName(t *testing.T) {
837837
require.NoError(t, err)
838838
require.Equal(t, workspace.ID, workspaceNew.ID)
839839
})
840+
841+
t.Run("ResolveParameters", func(t *testing.T) {
842+
t.Parallel()
843+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
844+
user := coderdtest.CreateFirstUser(t, client)
845+
version1 := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
846+
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version1.ID)
847+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version1.ID)
848+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
849+
cwr.AutomaticUpdates = codersdk.AutomaticUpdatesAlways
850+
})
851+
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID)
852+
853+
params := &echo.Responses{
854+
Parse: echo.ParseComplete,
855+
ProvisionPlan: []*proto.Response{
856+
{
857+
Type: &proto.Response_Plan{
858+
Plan: &proto.PlanComplete{
859+
Parameters: []*proto.RichParameter{
860+
{
861+
Name: "param",
862+
Description: "param",
863+
Required: true,
864+
Mutable: true,
865+
},
866+
},
867+
},
868+
},
869+
},
870+
},
871+
ProvisionApply: echo.ApplyComplete,
872+
}
873+
874+
version2 := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, params, func(ctvr *codersdk.CreateTemplateVersionRequest) {
875+
ctvr.TemplateID = template.ID
876+
})
877+
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version2.ID)
878+
879+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
880+
defer cancel()
881+
882+
err := client.UpdateActiveTemplateVersion(ctx, template.ID, codersdk.UpdateActiveTemplateVersion{
883+
ID: version2.ID,
884+
})
885+
require.NoError(t, err)
886+
887+
ws, err := client.WorkspaceByOwnerAndName(ctx, workspace.OwnerName, workspace.Name, codersdk.WorkspaceOptions{
888+
ResolveParameters: true,
889+
})
890+
require.NoError(t, err)
891+
require.True(t, ws.ParameterMismatch)
892+
})
840893
}
841894

842895
// TestWorkspaceFilterAllStatus tests workspace status is correctly set given a set of conditions.

codersdk/workspaces.go

+1-3
Original file line numberDiff line numberDiff line change
@@ -422,9 +422,7 @@ func (c *Client) Workspaces(ctx context.Context, filter WorkspaceFilter) (Worksp
422422
// WorkspaceByOwnerAndName returns a workspace by the owner's UUID and the workspace's name.
423423
func (c *Client) WorkspaceByOwnerAndName(ctx context.Context, owner string, name string, params WorkspaceOptions) (Workspace, error) {
424424
res, err := c.Request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/users/%s/workspace/%s", owner, name), nil, func(r *http.Request) {
425-
q := r.URL.Query()
426-
q.Set("include_deleted", fmt.Sprintf("%t", params.IncludeDeleted))
427-
r.URL.RawQuery = q.Encode()
425+
params.AsRequestOption()(r)
428426
})
429427
if err != nil {
430428
return Workspace{}, err

docs/api/workspaces.md

+6-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)