fix: properly convert max port share level for oss (#13261)

This commit is contained in:
Garrett Delfosse
2024-05-13 14:37:51 -04:00
committed by GitHub
parent a5a64948cd
commit ebee9288ae
5 changed files with 25 additions and 13 deletions

View File

@ -8,18 +8,23 @@ import (
) )
type PortSharer interface { type PortSharer interface {
AuthorizedPortSharingLevel(template database.Template, level codersdk.WorkspaceAgentPortShareLevel) error AuthorizedLevel(template database.Template, level codersdk.WorkspaceAgentPortShareLevel) error
ValidateTemplateMaxPortSharingLevel(level codersdk.WorkspaceAgentPortShareLevel) error ValidateTemplateMaxLevel(level codersdk.WorkspaceAgentPortShareLevel) error
ConvertMaxLevel(level database.AppSharingLevel) codersdk.WorkspaceAgentPortShareLevel
} }
type AGPLPortSharer struct{} type AGPLPortSharer struct{}
func (AGPLPortSharer) AuthorizedPortSharingLevel(_ database.Template, _ codersdk.WorkspaceAgentPortShareLevel) error { func (AGPLPortSharer) AuthorizedLevel(_ database.Template, _ codersdk.WorkspaceAgentPortShareLevel) error {
return nil return nil
} }
func (AGPLPortSharer) ValidateTemplateMaxPortSharingLevel(_ codersdk.WorkspaceAgentPortShareLevel) error { func (AGPLPortSharer) ValidateTemplateMaxLevel(_ codersdk.WorkspaceAgentPortShareLevel) error {
return xerrors.New("Restricting port sharing level is an enterprise feature that is not enabled.") return xerrors.New("Restricting port sharing level is an enterprise feature that is not enabled.")
} }
func (AGPLPortSharer) ConvertMaxLevel(_ database.AppSharingLevel) codersdk.WorkspaceAgentPortShareLevel {
return codersdk.WorkspaceAgentPortShareLevelPublic
}
var DefaultPortSharer PortSharer = AGPLPortSharer{} var DefaultPortSharer PortSharer = AGPLPortSharer{}

View File

@ -623,8 +623,8 @@ func (api *API) patchTemplateMeta(rw http.ResponseWriter, r *http.Request) {
validErrs = append(validErrs, codersdk.ValidationError{Field: "time_til_dormant_autodelete_ms", Detail: "Value must be at least one minute."}) validErrs = append(validErrs, codersdk.ValidationError{Field: "time_til_dormant_autodelete_ms", Detail: "Value must be at least one minute."})
} }
maxPortShareLevel := template.MaxPortSharingLevel maxPortShareLevel := template.MaxPortSharingLevel
if req.MaxPortShareLevel != nil && *req.MaxPortShareLevel != codersdk.WorkspaceAgentPortShareLevel(maxPortShareLevel) { if req.MaxPortShareLevel != nil && *req.MaxPortShareLevel != portSharer.ConvertMaxLevel(template.MaxPortSharingLevel) {
err := portSharer.ValidateTemplateMaxPortSharingLevel(*req.MaxPortShareLevel) err := portSharer.ValidateTemplateMaxLevel(*req.MaxPortShareLevel)
if err != nil { if err != nil {
validErrs = append(validErrs, codersdk.ValidationError{Field: "max_port_sharing_level", Detail: err.Error()}) validErrs = append(validErrs, codersdk.ValidationError{Field: "max_port_sharing_level", Detail: err.Error()})
} else { } else {
@ -857,6 +857,9 @@ func (api *API) convertTemplate(
autostopRequirementWeeks = 1 autostopRequirementWeeks = 1
} }
portSharer := *(api.PortSharer.Load())
maxPortShareLevel := portSharer.ConvertMaxLevel(template.MaxPortSharingLevel)
return codersdk.Template{ return codersdk.Template{
ID: template.ID, ID: template.ID,
CreatedAt: template.CreatedAt, CreatedAt: template.CreatedAt,
@ -891,6 +894,6 @@ func (api *API) convertTemplate(
RequireActiveVersion: templateAccessControl.RequireActiveVersion, RequireActiveVersion: templateAccessControl.RequireActiveVersion,
Deprecated: templateAccessControl.IsDeprecated(), Deprecated: templateAccessControl.IsDeprecated(),
DeprecationMessage: templateAccessControl.Deprecated, DeprecationMessage: templateAccessControl.Deprecated,
MaxPortShareLevel: codersdk.WorkspaceAgentPortShareLevel(template.MaxPortSharingLevel), MaxPortShareLevel: maxPortShareLevel,
} }
} }

View File

@ -600,9 +600,9 @@ func TestPatchTemplateMeta(t *testing.T) {
user := coderdtest.CreateFirstUser(t, client) user := coderdtest.CreateFirstUser(t, client)
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
require.Equal(t, codersdk.WorkspaceAgentPortShareLevelOwner, template.MaxPortShareLevel) require.Equal(t, codersdk.WorkspaceAgentPortShareLevelPublic, template.MaxPortShareLevel)
var level codersdk.WorkspaceAgentPortShareLevel = codersdk.WorkspaceAgentPortShareLevelPublic var level codersdk.WorkspaceAgentPortShareLevel = codersdk.WorkspaceAgentPortShareLevelAuthenticated
req := codersdk.UpdateTemplateMeta{ req := codersdk.UpdateTemplateMeta{
MaxPortShareLevel: &level, MaxPortShareLevel: &level,
} }
@ -615,7 +615,7 @@ func TestPatchTemplateMeta(t *testing.T) {
require.ErrorContains(t, err, "port sharing level is an enterprise feature") require.ErrorContains(t, err, "port sharing level is an enterprise feature")
// Ensure the same value port share level is a no-op // Ensure the same value port share level is a no-op
level = codersdk.WorkspaceAgentPortShareLevelOwner level = codersdk.WorkspaceAgentPortShareLevelPublic
_, err = client.UpdateTemplateMeta(ctx, template.ID, codersdk.UpdateTemplateMeta{ _, err = client.UpdateTemplateMeta(ctx, template.ID, codersdk.UpdateTemplateMeta{
Name: coderdtest.RandomUsername(t), Name: coderdtest.RandomUsername(t),
MaxPortShareLevel: &level, MaxPortShareLevel: &level,

View File

@ -69,7 +69,7 @@ func (api *API) postWorkspaceAgentPortShare(rw http.ResponseWriter, r *http.Requ
return return
} }
err = portSharer.AuthorizedPortSharingLevel(template, req.ShareLevel) err = portSharer.AuthorizedLevel(template, req.ShareLevel)
if err != nil { if err != nil {
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
Message: err.Error(), Message: err.Error(),

View File

@ -13,7 +13,7 @@ func NewEnterprisePortSharer() *EnterprisePortSharer {
return &EnterprisePortSharer{} return &EnterprisePortSharer{}
} }
func (EnterprisePortSharer) AuthorizedPortSharingLevel(template database.Template, level codersdk.WorkspaceAgentPortShareLevel) error { func (EnterprisePortSharer) AuthorizedLevel(template database.Template, level codersdk.WorkspaceAgentPortShareLevel) error {
max := codersdk.WorkspaceAgentPortShareLevel(template.MaxPortSharingLevel) max := codersdk.WorkspaceAgentPortShareLevel(template.MaxPortSharingLevel)
switch level { switch level {
case codersdk.WorkspaceAgentPortShareLevelPublic: case codersdk.WorkspaceAgentPortShareLevelPublic:
@ -31,10 +31,14 @@ func (EnterprisePortSharer) AuthorizedPortSharingLevel(template database.Templat
return nil return nil
} }
func (EnterprisePortSharer) ValidateTemplateMaxPortSharingLevel(level codersdk.WorkspaceAgentPortShareLevel) error { func (EnterprisePortSharer) ValidateTemplateMaxLevel(level codersdk.WorkspaceAgentPortShareLevel) error {
if !level.ValidMaxLevel() { if !level.ValidMaxLevel() {
return xerrors.New("invalid max port sharing level, value must be 'authenticated' or 'public'.") return xerrors.New("invalid max port sharing level, value must be 'authenticated' or 'public'.")
} }
return nil return nil
} }
func (EnterprisePortSharer) ConvertMaxLevel(level database.AppSharingLevel) codersdk.WorkspaceAgentPortShareLevel {
return codersdk.WorkspaceAgentPortShareLevel(level)
}