- Notifications
You must be signed in to change notification settings - Fork928
feat: add default autostart and ttl for new workspaces#1632
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Changes fromall commits
5c092be
391f527
98561bf
0169315
dea541f
d621272
2f7b939
813a64f
1fbc0f2
142ad37
0f348cd
32a86f1
File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -10,14 +10,20 @@ import ( | ||
"github.com/coder/coder/cli/cliflag" | ||
"github.com/coder/coder/cli/cliui" | ||
"github.com/coder/coder/coderd/autobuild/schedule" | ||
"github.com/coder/coder/codersdk" | ||
) | ||
funccreate()*cobra.Command { | ||
var ( | ||
autostartMinutestring | ||
autostartHourstring | ||
autostartDowstring | ||
parameterFilestring | ||
templateNamestring | ||
ttl time.Duration | ||
tzNamestring | ||
workspaceNamestring | ||
) | ||
cmd:=&cobra.Command{ | ||
Annotations:workspaceCommand, | ||
@@ -54,6 +60,20 @@ func create() *cobra.Command { | ||
} | ||
} | ||
tz,err:=time.LoadLocation(tzName) | ||
iferr!=nil { | ||
returnxerrors.Errorf("Invalid workspace autostart timezone: %w",err) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. nit: Error strings should not be capitalized:https://github.com/golang/go/wiki/CodeReviewComments#error-strings | ||
} | ||
schedSpec:=fmt.Sprintf("CRON_TZ=%s %s %s * * %s",tz.String(),autostartMinute,autostartHour,autostartDow) | ||
_,err=schedule.Weekly(schedSpec) | ||
iferr!=nil { | ||
returnxerrors.Errorf("invalid workspace autostart schedule: %w",err) | ||
} | ||
ifttl==0 { | ||
returnxerrors.Errorf("TTL must be at least 1 minute") | ||
} | ||
_,err=client.WorkspaceByOwnerAndName(cmd.Context(),organization.ID,codersdk.Me,workspaceName) | ||
iferr==nil { | ||
returnxerrors.Errorf("A workspace already exists named %q!",workspaceName) | ||
@@ -174,9 +194,11 @@ func create() *cobra.Command { | ||
before:=time.Now() | ||
workspace,err:=client.CreateWorkspace(cmd.Context(),organization.ID, codersdk.CreateWorkspaceRequest{ | ||
TemplateID:template.ID, | ||
Name:workspaceName, | ||
AutostartSchedule:&schedSpec, | ||
TTL:&ttl, | ||
ParameterValues:parameters, | ||
}) | ||
iferr!=nil { | ||
returnerr | ||
@@ -207,5 +229,10 @@ func create() *cobra.Command { | ||
cliui.AllowSkipPrompt(cmd) | ||
cliflag.StringVarP(cmd.Flags(),&templateName,"template","t","CODER_TEMPLATE_NAME","","Specify a template name.") | ||
cliflag.StringVarP(cmd.Flags(),¶meterFile,"parameter-file","","CODER_PARAMETER_FILE","","Specify a file path with parameter values.") | ||
cliflag.StringVarP(cmd.Flags(),&autostartMinute,"autostart-minute","","CODER_WORKSPACE_AUTOSTART_MINUTE","0","Specify the minute(s) at which the workspace should autostart (e.g. 0).") | ||
cliflag.StringVarP(cmd.Flags(),&autostartHour,"autostart-hour","","CODER_WORKSPACE_AUTOSTART_HOUR","9","Specify the hour(s) at which the workspace should autostart (e.g. 9).") | ||
cliflag.StringVarP(cmd.Flags(),&autostartDow,"autostart-day-of-week","","CODER_WORKSPACE_AUTOSTART_DOW","MON-FRI","Specify the days(s) on which the workspace should autostart (e.g. MON,TUE,WED,THU,FRI)") | ||
cliflag.StringVarP(cmd.Flags(),&tzName,"tz","","TZ","","Specify your timezone location for workspace autostart (e.g. US/Central).") | ||
cliflag.DurationVarP(cmd.Flags(),&ttl,"ttl","","CODER_WORKSPACE_TTL",8*time.Hour,"Specify a time-to-live (TTL) for the workspace (e.g. 8h).") | ||
returncmd | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -7,6 +7,7 @@ import ( | ||
"testing" | ||
"time" | ||
"github.com/stretchr/testify/assert" | ||
"github.com/stretchr/testify/require" | ||
"github.com/coder/coder/cli/clitest" | ||
@@ -25,7 +26,17 @@ func TestCreate(t *testing.T) { | ||
version:=coderdtest.CreateTemplateVersion(t,client,user.OrganizationID,nil) | ||
coderdtest.AwaitTemplateVersionJob(t,client,version.ID) | ||
template:=coderdtest.CreateTemplate(t,client,user.OrganizationID,version.ID) | ||
args:= []string{ | ||
"create", | ||
"my-workspace", | ||
"--template",template.Name, | ||
"--tz","US/Central", | ||
"--autostart-minute","0", | ||
"--autostart-hour","*/2", | ||
"--autostart-day-of-week","MON-FRI", | ||
"--ttl","8h", | ||
} | ||
cmd,root:=clitest.New(t,args...) | ||
clitest.SetupConfig(t,client,root) | ||
doneChan:=make(chanstruct{}) | ||
pty:=ptytest.New(t) | ||
@@ -48,6 +59,60 @@ func TestCreate(t *testing.T) { | ||
<-doneChan | ||
}) | ||
t.Run("CreateErrInvalidTz",func(t*testing.T) { | ||
t.Parallel() | ||
client:=coderdtest.New(t,&coderdtest.Options{IncludeProvisionerD:true}) | ||
user:=coderdtest.CreateFirstUser(t,client) | ||
version:=coderdtest.CreateTemplateVersion(t,client,user.OrganizationID,nil) | ||
coderdtest.AwaitTemplateVersionJob(t,client,version.ID) | ||
template:=coderdtest.CreateTemplate(t,client,user.OrganizationID,version.ID) | ||
args:= []string{ | ||
"create", | ||
"my-workspace", | ||
"--template",template.Name, | ||
"--tz","invalid", | ||
} | ||
cmd,root:=clitest.New(t,args...) | ||
clitest.SetupConfig(t,client,root) | ||
doneChan:=make(chanstruct{}) | ||
pty:=ptytest.New(t) | ||
cmd.SetIn(pty.Input()) | ||
cmd.SetOut(pty.Output()) | ||
gofunc() { | ||
deferclose(doneChan) | ||
err:=cmd.Execute() | ||
assert.EqualError(t,err,"Invalid workspace autostart timezone: unknown time zone invalid") | ||
}() | ||
<-doneChan | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. As we were hunting this style today, should we eliminate them here as well? 😄 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. For these ones, I'm going to just use | ||
}) | ||
t.Run("CreateErrInvalidTTL",func(t*testing.T) { | ||
t.Parallel() | ||
client:=coderdtest.New(t,&coderdtest.Options{IncludeProvisionerD:true}) | ||
user:=coderdtest.CreateFirstUser(t,client) | ||
version:=coderdtest.CreateTemplateVersion(t,client,user.OrganizationID,nil) | ||
coderdtest.AwaitTemplateVersionJob(t,client,version.ID) | ||
template:=coderdtest.CreateTemplate(t,client,user.OrganizationID,version.ID) | ||
args:= []string{ | ||
"create", | ||
"my-workspace", | ||
"--template",template.Name, | ||
"--ttl","0s", | ||
} | ||
cmd,root:=clitest.New(t,args...) | ||
clitest.SetupConfig(t,client,root) | ||
doneChan:=make(chanstruct{}) | ||
pty:=ptytest.New(t) | ||
cmd.SetIn(pty.Input()) | ||
cmd.SetOut(pty.Output()) | ||
gofunc() { | ||
deferclose(doneChan) | ||
err:=cmd.Execute() | ||
assert.EqualError(t,err,"TTL must be at least 1 minute") | ||
}() | ||
<-doneChan | ||
}) | ||
t.Run("CreateFromListWithSkip",func(t*testing.T) { | ||
t.Parallel() | ||
client:=coderdtest.New(t,&coderdtest.Options{IncludeProvisionerD:true}) | ||
Uh oh!
There was an error while loading.Please reload this page.