@@ -34,49 +34,125 @@ func TestUpdate(t *testing.T) {
34
34
t.Run("OK", func(t *testing.T) {
35
35
t.Parallel()
36
36
37
+
// Given: a workspace exists on the latest template version.
37
38
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
38
39
owner := coderdtest.CreateFirstUser(t, client)
39
-
member, memberUser := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
40
+
member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
40
41
version1 := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, nil)
41
42
42
43
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version1.ID)
43
44
template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version1.ID)
44
45
45
-
inv, root := clitest.New(t, "create",
46
-
"my-workspace",
47
-
"--template", template.Name,
48
-
"-y",
49
-
)
46
+
ws := coderdtest.CreateWorkspace(t, member, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
47
+
cwr.Name = "my-workspace"
48
+
})
49
+
require.False(t, ws.Outdated, "newly created workspace with active template version must not be outdated")
50
+
51
+
// Given: the template version is updated
52
+
version2 := coderdtest.UpdateTemplateVersion(t, client, owner.OrganizationID, &echo.Responses{
53
+
Parse: echo.ParseComplete,
54
+
ProvisionApply: echo.ApplyComplete,
55
+
ProvisionPlan: echo.PlanComplete,
56
+
}, template.ID)
57
+
_ = coderdtest.AwaitTemplateVersionJobCompleted(t, client, version2.ID)
58
+
59
+
ctx := testutil.Context(t, testutil.WaitShort)
60
+
err := client.UpdateActiveTemplateVersion(ctx, template.ID, codersdk.UpdateActiveTemplateVersion{
61
+
ID: version2.ID,
62
+
})
63
+
require.NoError(t, err, "failed to update active template version")
64
+
65
+
// Then: the workspace is marked as 'outdated'
66
+
ws, err = member.WorkspaceByOwnerAndName(ctx, codersdk.Me, "my-workspace", codersdk.WorkspaceOptions{})
67
+
require.NoError(t, err, "member failed to get workspace they themselves own")
68
+
require.True(t, ws.Outdated, "workspace must be outdated after template version update")
69
+
70
+
// When: the workspace is updated
71
+
inv, root := clitest.New(t, "update", ws.Name)
50
72
clitest.SetupConfig(t, member, root)
51
73
52
-
err := inv.Run()
53
-
require.NoError(t, err)
74
+
err = inv.Run()
75
+
require.NoError(t, err, "update command failed")
76
+
77
+
// Then: the workspace is no longer 'outdated'
78
+
ws, err = member.WorkspaceByOwnerAndName(ctx, codersdk.Me, "my-workspace", codersdk.WorkspaceOptions{})
79
+
require.NoError(t, err, "member failed to get workspace they themselves own after update")
80
+
require.Equal(t, version2.ID.String(), ws.LatestBuild.TemplateVersionID.String(), "workspace must have latest template version after update")
81
+
require.False(t, ws.Outdated, "workspace must not be outdated after update")
82
+
83
+
// Then: the workspace must have been started with the new template version
84
+
require.Equal(t, int32(3), ws.LatestBuild.BuildNumber, "workspace must have 3 builds after update")
85
+
require.Equal(t, codersdk.WorkspaceTransitionStart, ws.LatestBuild.Transition, "latest build must be a start transition")
86
+
87
+
// Then: the previous workspace build must be a stop transition with the old
88
+
// template version.
89
+
// This is important to ensure that the workspace resources are recreated
90
+
// correctly. Simply running a start transition with the new template
91
+
// version may not recreate resources that were changed in the new
92
+
// template version. This can happen, for example, if a user specifies
93
+
// ignore_changes in the template.
94
+
prevBuild, err := member.WorkspaceBuildByUsernameAndWorkspaceNameAndBuildNumber(ctx, codersdk.Me, ws.Name, "2")
95
+
require.NoError(t, err, "failed to get previous workspace build")
96
+
require.Equal(t, codersdk.WorkspaceTransitionStop, prevBuild.Transition, "previous build must be a stop transition")
97
+
require.Equal(t, version1.ID.String(), prevBuild.TemplateVersionID.String(), "previous build must have the old template version")
98
+
})
54
99
55
-
ws, err := client.WorkspaceByOwnerAndName(context.Background(), memberUser.Username, "my-workspace", codersdk.WorkspaceOptions{})
56
-
require.NoError(t, err)
57
-
require.Equal(t, version1.ID.String(), ws.LatestBuild.TemplateVersionID.String())
100
+
t.Run("Stopped", func(t *testing.T) {
101
+
t.Parallel()
102
+
103
+
// Given: a workspace exists on the latest template version.
104
+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
105
+
owner := coderdtest.CreateFirstUser(t, client)
106
+
member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
107
+
version1 := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, nil)
108
+
109
+
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version1.ID)
110
+
template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version1.ID)
58
111
112
+
ws := coderdtest.CreateWorkspace(t, member, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
113
+
cwr.Name = "my-workspace"
114
+
})
115
+
require.False(t, ws.Outdated, "newly created workspace with active template version must not be outdated")
116
+
117
+
// Given: the template version is updated
59
118
version2 := coderdtest.UpdateTemplateVersion(t, client, owner.OrganizationID, &echo.Responses{
60
119
Parse: echo.ParseComplete,
61
120
ProvisionApply: echo.ApplyComplete,
62
121
ProvisionPlan: echo.PlanComplete,
63
122
}, template.ID)
64
123
_ = coderdtest.AwaitTemplateVersionJobCompleted(t, client, version2.ID)
65
124
66
-
err = client.UpdateActiveTemplateVersion(context.Background(), template.ID, codersdk.UpdateActiveTemplateVersion{
125
+
ctx := testutil.Context(t, testutil.WaitShort)
126
+
err := client.UpdateActiveTemplateVersion(ctx, template.ID, codersdk.UpdateActiveTemplateVersion{
67
127
ID: version2.ID,
68
128
})
69
-
require.NoError(t, err)
129
+
require.NoError(t, err, "failed to update active template version")
130
+
131
+
// Given: the workspace is in a stopped state.
132
+
coderdtest.MustTransitionWorkspace(t, member, ws.ID, codersdk.WorkspaceTransitionStart, codersdk.WorkspaceTransitionStop)
70
133
71
-
inv, root = clitest.New(t, "update", ws.Name)
134
+
// Then: the workspace is marked as 'outdated'
135
+
ws, err = member.WorkspaceByOwnerAndName(ctx, codersdk.Me, "my-workspace", codersdk.WorkspaceOptions{})
136
+
require.NoError(t, err, "member failed to get workspace they themselves own")
137
+
require.True(t, ws.Outdated, "workspace must be outdated after template version update")
138
+
139
+
// When: the workspace is updated
140
+
inv, root := clitest.New(t, "update", ws.Name)
72
141
clitest.SetupConfig(t, member, root)
73
142
74
143
err = inv.Run()
75
-
require.NoError(t, err)
76
-
77
-
ws, err = member.WorkspaceByOwnerAndName(context.Background(), memberUser.Username, "my-workspace", codersdk.WorkspaceOptions{})
78
-
require.NoError(t, err)
79
-
require.Equal(t, version2.ID.String(), ws.LatestBuild.TemplateVersionID.String())
144
+
require.NoError(t, err, "update command failed")
145
+
146
+
// Then: the workspace is no longer 'outdated'
147
+
ws, err = member.WorkspaceByOwnerAndName(ctx, codersdk.Me, "my-workspace", codersdk.WorkspaceOptions{})
148
+
require.NoError(t, err, "member failed to get workspace they themselves own after update")
149
+
require.Equal(t, version2.ID.String(), ws.LatestBuild.TemplateVersionID.String(), "workspace must have latest template version after update")
150
+
require.False(t, ws.Outdated, "workspace must not be outdated after update")
151
+
152
+
// Then: the workspace must have been started with the new template version
153
+
require.Equal(t, codersdk.WorkspaceTransitionStart, ws.LatestBuild.Transition, "latest build must be a start transition")
154
+
// Then: we expect 3 builds, as we manually stopped the workspace.
155
+
require.Equal(t, int32(3), ws.LatestBuild.BuildNumber, "workspace must have 3 builds after update")
80
156
})
81
157
}
82
158
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4