@@ -2,6 +2,7 @@ package coderd_test
22
33import (
44 "context"
5+ "errors"
56 "fmt"
67 "net/http"
78 "strconv"
@@ -230,6 +231,95 @@ func TestWorkspaceBuilds(t *testing.T) {
230231 })
231232}
232233
234+ func TestWorkspaceBuildsProvisionerState (t * testing.T ) {
235+ t .Parallel ()
236+
237+ t .Run ("Permissions" , func (t * testing.T ) {
238+ t .Parallel ()
239+ client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
240+ first := coderdtest .CreateFirstUser (t , client )
241+
242+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
243+ defer cancel ()
244+
245+ version := coderdtest .CreateTemplateVersion (t , client , first .OrganizationID , nil )
246+ template := coderdtest .CreateTemplate (t , client , first .OrganizationID , version .ID )
247+ coderdtest .AwaitTemplateVersionJob (t , client , version .ID )
248+
249+ workspace := coderdtest .CreateWorkspace (t , client , first .OrganizationID , template .ID )
250+ coderdtest .AwaitWorkspaceBuildJob (t , client , workspace .LatestBuild .ID )
251+
252+ build , err := client .CreateWorkspaceBuild (ctx , workspace .ID , codersdk.CreateWorkspaceBuildRequest {
253+ TemplateVersionID : workspace .LatestBuild .TemplateVersionID ,
254+ Transition : codersdk .WorkspaceTransitionDelete ,
255+ ProvisionerState : []byte (" " ),
256+ })
257+ require .Nil (t , err )
258+
259+ coderdtest .AwaitWorkspaceBuildJob (t , client , build .ID )
260+
261+ // A regular user on the very same template must not be able to modify the
262+ // state.
263+ regularUser := coderdtest .CreateAnotherUser (t , client , first .OrganizationID )
264+
265+ workspace = coderdtest .CreateWorkspace (t , regularUser , first .OrganizationID , template .ID )
266+ coderdtest .AwaitWorkspaceBuildJob (t , regularUser , workspace .LatestBuild .ID )
267+
268+ _ , err = regularUser .CreateWorkspaceBuild (ctx , workspace .ID , codersdk.CreateWorkspaceBuildRequest {
269+ TemplateVersionID : workspace .LatestBuild .TemplateVersionID ,
270+ Transition : workspace .LatestBuild .Transition ,
271+ ProvisionerState : []byte (" " ),
272+ })
273+ require .Error (t , err )
274+
275+ var cerr * codersdk.Error
276+ require .True (t , errors .As (err , & cerr ))
277+
278+ code := cerr .StatusCode ()
279+ require .Equal (t , http .StatusForbidden , code , "unexpected status %s" , http .StatusText (code ))
280+ })
281+
282+ t .Run ("Orphan" , func (t * testing.T ) {
283+ t .Parallel ()
284+ client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
285+ first := coderdtest .CreateFirstUser (t , client )
286+
287+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
288+ defer cancel ()
289+
290+ version := coderdtest .CreateTemplateVersion (t , client , first .OrganizationID , nil )
291+ template := coderdtest .CreateTemplate (t , client , first .OrganizationID , version .ID )
292+ coderdtest .AwaitTemplateVersionJob (t , client , version .ID )
293+
294+ workspace := coderdtest .CreateWorkspace (t , client , first .OrganizationID , template .ID )
295+ coderdtest .AwaitWorkspaceBuildJob (t , client , workspace .LatestBuild .ID )
296+
297+ // Providing both state and orphan fails.
298+ _ , err := client .CreateWorkspaceBuild (ctx , workspace .ID , codersdk.CreateWorkspaceBuildRequest {
299+ TemplateVersionID : workspace .LatestBuild .TemplateVersionID ,
300+ Transition : codersdk .WorkspaceTransitionDelete ,
301+ ProvisionerState : []byte (" " ),
302+ Orphan : true ,
303+ })
304+ require .Error (t , err )
305+ cerr := coderdtest .SDKError (t , err )
306+ require .Equal (t , http .StatusBadRequest , cerr .StatusCode ())
307+
308+ // Regular orphan operation succeeds.
309+ build , err := client .CreateWorkspaceBuild (ctx , workspace .ID , codersdk.CreateWorkspaceBuildRequest {
310+ TemplateVersionID : workspace .LatestBuild .TemplateVersionID ,
311+ Transition : codersdk .WorkspaceTransitionDelete ,
312+ Orphan : true ,
313+ })
314+ require .NoError (t , err )
315+ coderdtest .AwaitWorkspaceBuildJob (t , client , build .ID )
316+
317+ _ , err = client .Workspace (ctx , workspace .ID )
318+ require .Error (t , err )
319+ require .Equal (t , http .StatusGone , coderdtest .SDKError (t , err ).StatusCode ())
320+ })
321+ }
322+
233323func TestPatchCancelWorkspaceBuild (t * testing.T ) {
234324 t .Parallel ()
235325 client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
0 commit comments