Skip to content

Commit 92a7d4c

Browse files
ammariokylecarbs
authored andcommitted
Revert "Make coder bump idempotent (#2225)"
This reverts commit 0df75f9. I merged on accident.
1 parent c3cbf1d commit 92a7d4c

File tree

2 files changed

+104
-23
lines changed

2 files changed

+104
-23
lines changed

cli/bump.go

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,55 +12,55 @@ import (
1212
)
1313

1414
const (
15-
bumpDescriptionLong = `To extend the autostop deadline for a workspace.`
15+
bumpDescriptionLong = `To extend the autostop deadline for a workspace.
16+
If no unit is specified in the duration, we assume minutes.`
17+
defaultBumpDuration = 90 * time.Minute
1618
)
1719

1820
func bump() *cobra.Command {
1921
bumpCmd := &cobra.Command{
2022
Args: cobra.RangeArgs(1, 2),
2123
Annotations: workspaceCommand,
22-
Use: "bump <workspace-name> <duration>",
24+
Use: "bump <workspace-name> [duration]",
2325
Short: "Extend the autostop deadline for a workspace.",
2426
Long: bumpDescriptionLong,
2527
Example: "coder bump my-workspace 90m",
2628
RunE: func(cmd *cobra.Command, args []string) error {
27-
bumpDuration, err := tryParseDuration(args[1])
28-
if err != nil {
29-
return err
29+
bumpDuration := defaultBumpDuration
30+
if len(args) > 1 {
31+
d, err := tryParseDuration(args[1])
32+
if err != nil {
33+
return err
34+
}
35+
bumpDuration = d
36+
}
37+
38+
if bumpDuration < time.Minute {
39+
return xerrors.New("minimum bump duration is 1 minute")
3040
}
3141

3242
client, err := createClient(cmd)
3343
if err != nil {
3444
return xerrors.Errorf("create client: %w", err)
3545
}
36-
3746
workspace, err := namedWorkspace(cmd, client, args[0])
3847
if err != nil {
3948
return xerrors.Errorf("get workspace: %w", err)
4049
}
4150

42-
newDeadline := time.Now().Add(bumpDuration)
43-
44-
if newDeadline.Before(workspace.LatestBuild.Deadline) {
45-
_, _ = fmt.Fprintf(
46-
cmd.OutOrStdout(),
47-
"The proposed deadline is %s before the current deadline.\n",
48-
workspace.LatestBuild.Deadline.Sub(newDeadline).Round(time.Minute),
49-
)
51+
if workspace.LatestBuild.Deadline.IsZero() {
52+
_, _ = fmt.Fprintf(cmd.OutOrStdout(), "no deadline set\n")
5053
return nil
5154
}
5255

56+
newDeadline := workspace.LatestBuild.Deadline.Add(bumpDuration)
5357
if err := client.PutExtendWorkspace(cmd.Context(), workspace.ID, codersdk.PutExtendWorkspaceRequest{
5458
Deadline: newDeadline,
5559
}); err != nil {
5660
return err
5761
}
5862

59-
_, _ = fmt.Fprintf(
60-
cmd.OutOrStdout(),
61-
"Workspace %q will now stop at %s\n", workspace.Name,
62-
newDeadline.Format(time.RFC822),
63-
)
63+
_, _ = fmt.Fprintf(cmd.OutOrStdout(), "Workspace %q will now stop at %s\n", workspace.Name, newDeadline.Format(time.RFC3339))
6464

6565
return nil
6666
},

cli/bump_test.go

Lines changed: 85 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,47 @@ import (
1717
func TestBump(t *testing.T) {
1818
t.Parallel()
1919

20+
t.Run("BumpOKDefault", func(t *testing.T) {
21+
t.Parallel()
22+
23+
// Given: we have a workspace
24+
var (
25+
err error
26+
ctx = context.Background()
27+
client = coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
28+
user = coderdtest.CreateFirstUser(t, client)
29+
version = coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
30+
_ = coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
31+
project = coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
32+
workspace = coderdtest.CreateWorkspace(t, client, user.OrganizationID, project.ID)
33+
cmdArgs = []string{"bump", workspace.Name}
34+
stdoutBuf = &bytes.Buffer{}
35+
)
36+
37+
// Given: we wait for the workspace to be built
38+
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
39+
workspace, err = client.Workspace(ctx, workspace.ID)
40+
require.NoError(t, err)
41+
expectedDeadline := workspace.LatestBuild.Deadline.Add(90 * time.Minute)
42+
43+
// Assert test invariant: workspace build has a deadline set equal to now plus ttl
44+
initDeadline := time.Now().Add(time.Duration(*workspace.TTLMillis) * time.Millisecond)
45+
require.WithinDuration(t, initDeadline, workspace.LatestBuild.Deadline, time.Minute)
46+
47+
cmd, root := clitest.New(t, cmdArgs...)
48+
clitest.SetupConfig(t, client, root)
49+
cmd.SetOut(stdoutBuf)
50+
51+
// When: we execute `coder bump <workspace>`
52+
err = cmd.ExecuteContext(ctx)
53+
require.NoError(t, err, "unexpected error")
54+
55+
// Then: the deadline of the latest build is updated
56+
updated, err := client.Workspace(ctx, workspace.ID)
57+
require.NoError(t, err)
58+
require.WithinDuration(t, expectedDeadline, updated.LatestBuild.Deadline, time.Minute)
59+
})
60+
2061
t.Run("BumpSpecificDuration", func(t *testing.T) {
2162
t.Parallel()
2263

@@ -30,15 +71,15 @@ func TestBump(t *testing.T) {
3071
_ = coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
3172
project = coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
3273
workspace = coderdtest.CreateWorkspace(t, client, user.OrganizationID, project.ID)
33-
cmdArgs = []string{"bump", workspace.Name, "10h"}
74+
cmdArgs = []string{"bump", workspace.Name, "30"}
3475
stdoutBuf = &bytes.Buffer{}
3576
)
3677

3778
// Given: we wait for the workspace to be built
3879
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
3980
workspace, err = client.Workspace(ctx, workspace.ID)
4081
require.NoError(t, err)
41-
expectedDeadline := time.Now().Add(10 * time.Hour)
82+
expectedDeadline := workspace.LatestBuild.Deadline.Add(30 * time.Minute)
4283

4384
// Assert test invariant: workspace build has a deadline set equal to now plus ttl
4485
initDeadline := time.Now().Add(time.Duration(*workspace.TTLMillis) * time.Millisecond)
@@ -109,7 +150,7 @@ func TestBump(t *testing.T) {
109150
workspace = coderdtest.CreateWorkspace(t, client, user.OrganizationID, project.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
110151
cwr.TTLMillis = nil
111152
})
112-
cmdArgs = []string{"bump", workspace.Name, "1h"}
153+
cmdArgs = []string{"bump", workspace.Name}
113154
stdoutBuf = &bytes.Buffer{}
114155
)
115156
// Unset the workspace TTL
@@ -139,11 +180,51 @@ func TestBump(t *testing.T) {
139180

140181
// When: we execute `coder bump workspace``
141182
err = cmd.ExecuteContext(ctx)
142-
require.Error(t, err)
183+
require.NoError(t, err)
143184

144185
// Then: nothing happens and the deadline remains unset
145186
updated, err := client.Workspace(ctx, workspace.ID)
146187
require.NoError(t, err)
147188
require.Zero(t, updated.LatestBuild.Deadline)
148189
})
190+
191+
t.Run("BumpMinimumDuration", func(t *testing.T) {
192+
t.Parallel()
193+
194+
// Given: we have a workspace with no deadline set
195+
var (
196+
err error
197+
ctx = context.Background()
198+
client = coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
199+
user = coderdtest.CreateFirstUser(t, client)
200+
version = coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
201+
_ = coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
202+
project = coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
203+
workspace = coderdtest.CreateWorkspace(t, client, user.OrganizationID, project.ID)
204+
cmdArgs = []string{"bump", workspace.Name, "59s"}
205+
stdoutBuf = &bytes.Buffer{}
206+
)
207+
208+
// Given: we wait for the workspace to build
209+
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
210+
workspace, err = client.Workspace(ctx, workspace.ID)
211+
require.NoError(t, err)
212+
213+
// Assert test invariant: workspace build has a deadline set equal to now plus ttl
214+
initDeadline := time.Now().Add(time.Duration(*workspace.TTLMillis) * time.Millisecond)
215+
require.WithinDuration(t, initDeadline, workspace.LatestBuild.Deadline, time.Minute)
216+
217+
cmd, root := clitest.New(t, cmdArgs...)
218+
clitest.SetupConfig(t, client, root)
219+
cmd.SetOut(stdoutBuf)
220+
221+
// When: we execute `coder bump workspace 59s`
222+
err = cmd.ExecuteContext(ctx)
223+
require.ErrorContains(t, err, "minimum bump duration is 1 minute")
224+
225+
// Then: an error is reported and the deadline remains as before
226+
updated, err := client.Workspace(ctx, workspace.ID)
227+
require.NoError(t, err)
228+
require.WithinDuration(t, workspace.LatestBuild.Deadline, updated.LatestBuild.Deadline, time.Minute)
229+
})
149230
}

0 commit comments

Comments
 (0)