Skip to content

Commit 9b5e512

Browse files
committed
feat: enable setting max port share level during template creation
1 parent 40baa5b commit 9b5e512

File tree

9 files changed

+77
-2
lines changed

9 files changed

+77
-2
lines changed

coderd/apidoc/docs.go

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

coderd/apidoc/swagger.json

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

coderd/templates.go

+11-1
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ func (api *API) notifyTemplateDeleted(ctx context.Context, template database.Tem
163163
func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Request) {
164164
var (
165165
ctx = r.Context()
166+
portSharer = *api.PortSharer.Load()
166167
createTemplate codersdk.CreateTemplateRequest
167168
organization = httpmw.OrganizationParam(r)
168169
apiKey = httpmw.APIKey(r)
@@ -309,6 +310,7 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque
309310
validErrs []codersdk.ValidationError
310311
autostopRequirementDaysOfWeekParsed uint8
311312
autostartRequirementDaysOfWeekParsed uint8
313+
maxPortShareLevel = database.AppSharingLevelOwner // default
312314
)
313315
if defaultTTL < 0 {
314316
validErrs = append(validErrs, codersdk.ValidationError{Field: "default_ttl_ms", Detail: "Must be a positive integer."})
@@ -329,6 +331,14 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque
329331
validErrs = append(validErrs, codersdk.ValidationError{Field: "autostart_requirement.days_of_week", Detail: err.Error()})
330332
}
331333
}
334+
if createTemplate.MaxPortShareLevel != nil {
335+
err = portSharer.ValidateTemplateMaxLevel(*createTemplate.MaxPortShareLevel)
336+
if err != nil {
337+
validErrs = append(validErrs, codersdk.ValidationError{Field: "max_port_share_level", Detail: err.Error()})
338+
} else {
339+
maxPortShareLevel = database.AppSharingLevel(*createTemplate.MaxPortShareLevel)
340+
}
341+
}
332342

333343
if autostopRequirementWeeks < 0 {
334344
validErrs = append(validErrs, codersdk.ValidationError{Field: "autostop_requirement.weeks", Detail: "Must be a positive integer."})
@@ -386,7 +396,7 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque
386396
DisplayName: createTemplate.DisplayName,
387397
Icon: createTemplate.Icon,
388398
AllowUserCancelWorkspaceJobs: allowUserCancelWorkspaceJobs,
389-
MaxPortSharingLevel: database.AppSharingLevelOwner,
399+
MaxPortSharingLevel: maxPortShareLevel,
390400
})
391401
if err != nil {
392402
return xerrors.Errorf("insert template: %s", err)

coderd/templates_test.go

+38
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,44 @@ func TestPostTemplateByOrganization(t *testing.T) {
401401
require.EqualValues(t, 1, got.AutostopRequirement.Weeks)
402402
})
403403
})
404+
405+
t.Run("MaxPortShareLevel", func(t *testing.T) {
406+
t.Parallel()
407+
408+
t.Run("OK", func(t *testing.T) {
409+
client := coderdtest.New(t, nil)
410+
user := coderdtest.CreateFirstUser(t, client)
411+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
412+
413+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
414+
defer cancel()
415+
416+
got, err := client.CreateTemplate(ctx, user.OrganizationID, codersdk.CreateTemplateRequest{
417+
Name: "testing",
418+
VersionID: version.ID,
419+
})
420+
require.NoError(t, err)
421+
require.Equal(t, codersdk.WorkspaceAgentPortShareLevelPublic, got.MaxPortShareLevel)
422+
})
423+
424+
t.Run("EnterpriseLevelError", func(t *testing.T) {
425+
client := coderdtest.New(t, nil)
426+
user := coderdtest.CreateFirstUser(t, client)
427+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
428+
429+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
430+
defer cancel()
431+
432+
_, err := client.CreateTemplate(ctx, user.OrganizationID, codersdk.CreateTemplateRequest{
433+
Name: "testing",
434+
VersionID: version.ID,
435+
MaxPortShareLevel: ptr.Ref(codersdk.WorkspaceAgentPortShareLevelPublic),
436+
})
437+
var apiErr *codersdk.Error
438+
require.ErrorAs(t, err, &apiErr)
439+
require.Equal(t, http.StatusBadRequest, apiErr.StatusCode())
440+
})
441+
})
404442
}
405443

406444
func TestTemplatesByOrganization(t *testing.T) {

codersdk/organizations.go

+4
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,10 @@ type CreateTemplateRequest struct {
184184
// RequireActiveVersion mandates that workspaces are built with the active
185185
// template version.
186186
RequireActiveVersion bool `json:"require_active_version"`
187+
188+
// MaxPortShareLevel allows optionally specifying the maximum port share level
189+
// for workspaces created from the template.
190+
MaxPortShareLevel *WorkspaceAgentPortShareLevel `json:"max_port_share_level"`
187191
}
188192

189193
// CreateWorkspaceRequest provides options for creating a new workspace.

docs/reference/api/schemas.md

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

docs/reference/api/templates.md

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

enterprise/coderd/templates_test.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,10 @@ func TestTemplates(t *testing.T) {
132132
},
133133
}},
134134
})
135-
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
135+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, func(ctr *codersdk.CreateTemplateRequest) {
136+
ctr.MaxPortShareLevel = ptr.Ref(codersdk.WorkspaceAgentPortShareLevelPublic)
137+
})
138+
require.Equal(t, template.MaxPortShareLevel, codersdk.WorkspaceAgentPortShareLevelPublic)
136139
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
137140
ws := coderdtest.CreateWorkspace(t, client, template.ID)
138141
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID)

site/src/api/typesGenerated.ts

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

0 commit comments

Comments
 (0)