@@ -20,82 +20,82 @@ import (
2020func TestProvisioners (t * testing.T ) {
2121t .Parallel ()
2222
23- t .Run ("List" ,func (t * testing.T ) {
24- t .Parallel ()
23+ db ,ps := dbtestutil .NewDB (t ,dbtestutil .WithDumpOnFailure ())
24+ client ,_ ,coderdAPI := coderdtest .NewWithAPI (t ,& coderdtest.Options {
25+ IncludeProvisionerDaemon :true ,
26+ Database :db ,
27+ Pubsub :ps ,
28+ })
29+ owner := coderdtest .CreateFirstUser (t ,client )
30+ member ,memberUser := coderdtest .CreateAnotherUser (t ,client ,owner .OrganizationID )
31+
32+ version := coderdtest .CreateTemplateVersion (t ,client ,owner .OrganizationID ,completeWithAgent ())
33+ coderdtest .AwaitTemplateVersionJobCompleted (t ,client ,version .ID )
34+ template := coderdtest .CreateTemplate (t ,client ,owner .OrganizationID ,version .ID )
35+
36+ workspace := coderdtest .CreateWorkspace (t ,client ,template .ID )
37+ coderdtest .AwaitWorkspaceBuildJobCompleted (t ,client ,workspace .LatestBuild .ID )
38+
39+ // Create a provisioner that's working on a job.
40+ pd1 := dbgen .ProvisionerDaemon (t ,coderdAPI .Database , database.ProvisionerDaemon {
41+ Name :"provisioner-1" ,
42+ CreatedAt :timeParse (t ,"2006-01-02" ,"2024-12-20" ),
43+ KeyID :uuid .MustParse (codersdk .ProvisionerKeyIDBuiltIn ),
44+ })
45+ w1 := dbgen .Workspace (t ,coderdAPI .Database , database.WorkspaceTable {
46+ OwnerID :memberUser .ID ,
47+ TemplateID :template .ID ,
48+ })
49+ wb1ID := uuid .MustParse ("00000000-0000-0000-bbbb-000000000001" )
50+ job1 := dbgen .ProvisionerJob (t ,db ,coderdAPI .Pubsub , database.ProvisionerJob {
51+ ID :uuid .MustParse ("00000000-0000-0000-cccc-000000000001" ),
52+ WorkerID : uuid.NullUUID {UUID :pd1 .ID ,Valid :true },
53+ Input :json .RawMessage (`{"workspace_build_id":"` + wb1ID .String ()+ `"}` ),
54+ StartedAt : sql.NullTime {Time :coderdAPI .Clock .Now (),Valid :true },
55+ })
56+ dbgen .WorkspaceBuild (t ,coderdAPI .Database , database.WorkspaceBuild {
57+ ID :wb1ID ,
58+ JobID :job1 .ID ,
59+ WorkspaceID :w1 .ID ,
60+ TemplateVersionID :version .ID ,
61+ })
62+
63+ // Create another provisioner that completed a job and is offline.
64+ pd2 := dbgen .ProvisionerDaemon (t ,coderdAPI .Database , database.ProvisionerDaemon {
65+ Name :"provisioner-2" ,
66+ CreatedAt :timeParse (t ,"2006-01-02" ,"2024-12-20" ),
67+ LastSeenAt : sql.NullTime {Time :coderdAPI .Clock .Now ().Add (- time .Hour ),Valid :true },
68+ KeyID :uuid .MustParse (codersdk .ProvisionerKeyIDBuiltIn ),
69+ })
70+ w2 := dbgen .Workspace (t ,coderdAPI .Database , database.WorkspaceTable {
71+ OwnerID :memberUser .ID ,
72+ TemplateID :template .ID ,
73+ })
74+ wb2ID := uuid .MustParse ("00000000-0000-0000-bbbb-000000000002" )
75+ job2 := dbgen .ProvisionerJob (t ,db ,coderdAPI .Pubsub , database.ProvisionerJob {
76+ ID :uuid .MustParse ("00000000-0000-0000-cccc-000000000002" ),
77+ WorkerID : uuid.NullUUID {UUID :pd2 .ID ,Valid :true },
78+ Input :json .RawMessage (`{"workspace_build_id":"` + wb2ID .String ()+ `"}` ),
79+ StartedAt : sql.NullTime {Time :coderdAPI .Clock .Now ().Add (- 2 * time .Hour ),Valid :true },
80+ CompletedAt : sql.NullTime {Time :coderdAPI .Clock .Now ().Add (- time .Hour ),Valid :true },
81+ })
82+ dbgen .WorkspaceBuild (t ,coderdAPI .Database , database.WorkspaceBuild {
83+ ID :wb2ID ,
84+ JobID :job2 .ID ,
85+ WorkspaceID :w2 .ID ,
86+ TemplateVersionID :version .ID ,
87+ })
88+
89+ // Create a provisioner that is idle.
90+ pd3 := dbgen .ProvisionerDaemon (t ,coderdAPI .Database , database.ProvisionerDaemon {
91+ Name :"provisioner-3" ,
92+ CreatedAt :timeParse (t ,"2006-01-02" ,"2024-12-20" ),
93+ KeyID :uuid .MustParse (codersdk .ProvisionerKeyIDBuiltIn ),
94+ })
95+ _ = pd3
2596
26- db ,ps := dbtestutil .NewDB (t ,dbtestutil .WithDumpOnFailure ())
27- client ,_ ,coderdAPI := coderdtest .NewWithAPI (t ,& coderdtest.Options {
28- IncludeProvisionerDaemon :true ,
29- Database :db ,
30- Pubsub :ps ,
31- })
32- owner := coderdtest .CreateFirstUser (t ,client )
33- member ,memberUser := coderdtest .CreateAnotherUser (t ,client ,owner .OrganizationID )
34-
35- version := coderdtest .CreateTemplateVersion (t ,client ,owner .OrganizationID ,completeWithAgent ())
36- coderdtest .AwaitTemplateVersionJobCompleted (t ,client ,version .ID )
37- template := coderdtest .CreateTemplate (t ,client ,owner .OrganizationID ,version .ID )
38-
39- workspace := coderdtest .CreateWorkspace (t ,client ,template .ID )
40- coderdtest .AwaitWorkspaceBuildJobCompleted (t ,client ,workspace .LatestBuild .ID )
41-
42- // Create a provisioner that's working on a job.
43- pd1 := dbgen .ProvisionerDaemon (t ,coderdAPI .Database , database.ProvisionerDaemon {
44- Name :"provisioner-1" ,
45- CreatedAt :timeParse (t ,"2006-01-02" ,"2024-12-20" ),
46- KeyID :uuid .MustParse (codersdk .ProvisionerKeyIDBuiltIn ),
47- })
48- w1 := dbgen .Workspace (t ,coderdAPI .Database , database.WorkspaceTable {
49- OwnerID :memberUser .ID ,
50- TemplateID :template .ID ,
51- })
52- wb1ID := uuid .MustParse ("00000000-0000-0000-bbbb-000000000001" )
53- job1 := dbgen .ProvisionerJob (t ,db ,coderdAPI .Pubsub , database.ProvisionerJob {
54- ID :uuid .MustParse ("00000000-0000-0000-cccc-000000000001" ),
55- WorkerID : uuid.NullUUID {UUID :pd1 .ID ,Valid :true },
56- Input :json .RawMessage (`{"workspace_build_id":"` + wb1ID .String ()+ `"}` ),
57- StartedAt : sql.NullTime {Time :coderdAPI .Clock .Now (),Valid :true },
58- })
59- dbgen .WorkspaceBuild (t ,coderdAPI .Database , database.WorkspaceBuild {
60- ID :wb1ID ,
61- JobID :job1 .ID ,
62- WorkspaceID :w1 .ID ,
63- TemplateVersionID :version .ID ,
64- })
65-
66- // Create another provisioner that completed a job and is offline.
67- pd2 := dbgen .ProvisionerDaemon (t ,coderdAPI .Database , database.ProvisionerDaemon {
68- Name :"provisioner-2" ,
69- CreatedAt :timeParse (t ,"2006-01-02" ,"2024-12-20" ),
70- LastSeenAt : sql.NullTime {Time :coderdAPI .Clock .Now ().Add (- time .Hour ),Valid :true },
71- KeyID :uuid .MustParse (codersdk .ProvisionerKeyIDBuiltIn ),
72- })
73- w2 := dbgen .Workspace (t ,coderdAPI .Database , database.WorkspaceTable {
74- OwnerID :memberUser .ID ,
75- TemplateID :template .ID ,
76- })
77- wb2ID := uuid .MustParse ("00000000-0000-0000-bbbb-000000000002" )
78- job2 := dbgen .ProvisionerJob (t ,db ,coderdAPI .Pubsub , database.ProvisionerJob {
79- ID :uuid .MustParse ("00000000-0000-0000-cccc-000000000002" ),
80- WorkerID : uuid.NullUUID {UUID :pd2 .ID ,Valid :true },
81- Input :json .RawMessage (`{"workspace_build_id":"` + wb2ID .String ()+ `"}` ),
82- StartedAt : sql.NullTime {Time :coderdAPI .Clock .Now ().Add (- 2 * time .Hour ),Valid :true },
83- CompletedAt : sql.NullTime {Time :coderdAPI .Clock .Now ().Add (- time .Hour ),Valid :true },
84- })
85- dbgen .WorkspaceBuild (t ,coderdAPI .Database , database.WorkspaceBuild {
86- ID :wb2ID ,
87- JobID :job2 .ID ,
88- WorkspaceID :w2 .ID ,
89- TemplateVersionID :version .ID ,
90- })
91-
92- // Create a provisioner that is idle.
93- pd3 := dbgen .ProvisionerDaemon (t ,coderdAPI .Database , database.ProvisionerDaemon {
94- Name :"provisioner-3" ,
95- CreatedAt :timeParse (t ,"2006-01-02" ,"2024-12-20" ),
96- KeyID :uuid .MustParse (codersdk .ProvisionerKeyIDBuiltIn ),
97- })
98- _ = pd3
97+ t .Run ("list" ,func (t * testing.T ) {
98+ t .Parallel ()
9999
100100inv ,root := clitest .New (t ,
101101"provisioners" ,
@@ -108,6 +108,22 @@ func TestProvisioners(t *testing.T) {
108108
109109// TODO(mafredri): Verify golden output.
110110})
111+
112+ t .Run ("jobs list" ,func (t * testing.T ) {
113+ t .Parallel ()
114+
115+ inv ,root := clitest .New (t ,
116+ "provisioners" ,
117+ "jobs" ,
118+ "list" ,
119+ "--column" ,"id,created at,status,worker id,tags,template version id,workspace build id,type,available workers,organization,queue" ,
120+ )
121+ clitest .SetupConfig (t ,member ,root )
122+ err := inv .Run ()
123+ require .NoError (t ,err )
124+
125+ // TODO(mafredri): Verify golden output.
126+ })
111127}
112128
113129func timeParse (t * testing.T ,layout ,s string ) time.Time {