@@ -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
0 commit comments