@@ -34,49 +34,125 @@ func TestUpdate(t *testing.T) {
3434 t .Run ("OK" , func (t * testing.T ) {
3535 t .Parallel ()
3636
37+ // Given: a workspace exists on the latest template version.
3738 client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
3839 owner := coderdtest .CreateFirstUser (t , client )
39- member , memberUser := coderdtest .CreateAnotherUser (t , client , owner .OrganizationID )
40+ member , _ := coderdtest .CreateAnotherUser (t , client , owner .OrganizationID )
4041 version1 := coderdtest .CreateTemplateVersion (t , client , owner .OrganizationID , nil )
4142
4243 coderdtest .AwaitTemplateVersionJobCompleted (t , client , version1 .ID )
4344 template := coderdtest .CreateTemplate (t , client , owner .OrganizationID , version1 .ID )
4445
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 )
5072 clitest .SetupConfig (t , member , root )
5173
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+ })
5499
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 )
58111
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
59118 version2 := coderdtest .UpdateTemplateVersion (t , client , owner .OrganizationID , & echo.Responses {
60119 Parse : echo .ParseComplete ,
61120 ProvisionApply : echo .ApplyComplete ,
62121 ProvisionPlan : echo .PlanComplete ,
63122 }, template .ID )
64123 _ = coderdtest .AwaitTemplateVersionJobCompleted (t , client , version2 .ID )
65124
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 {
67127 ID : version2 .ID ,
68128 })
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 )
70133
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 )
72141 clitest .SetupConfig (t , member , root )
73142
74143 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" )
80156 })
81157}
82158
0 commit comments