@@ -553,7 +553,8 @@ func (q *fakeQuerier) GetWorkspaces(ctx context.Context, arg database.GetWorkspa
553
553
return workspaces , err
554
554
}
555
555
556
- func (q * fakeQuerier ) GetAuthorizedWorkspaces (_ context.Context , arg database.GetWorkspacesParams , authorizedFilter rbac.AuthorizeFilter ) ([]database.Workspace , error ) {
556
+ //nolint:gocyclo
557
+ func (q * fakeQuerier ) GetAuthorizedWorkspaces (ctx context.Context , arg database.GetWorkspacesParams , authorizedFilter rbac.AuthorizeFilter ) ([]database.Workspace , error ) {
557
558
q .mutex .RLock ()
558
559
defer q .mutex .RUnlock ()
559
560
@@ -562,25 +563,118 @@ func (q *fakeQuerier) GetAuthorizedWorkspaces(_ context.Context, arg database.Ge
562
563
if arg .OwnerID != uuid .Nil && workspace .OwnerID != arg .OwnerID {
563
564
continue
564
565
}
566
+
565
567
if arg .OwnerUsername != "" {
566
- owner , err := q .GetUserByID (context . Background () , workspace .OwnerID )
568
+ owner , err := q .GetUserByID (ctx , workspace .OwnerID )
567
569
if err == nil && ! strings .EqualFold (arg .OwnerUsername , owner .Username ) {
568
570
continue
569
571
}
570
572
}
573
+
571
574
if arg .TemplateName != "" {
572
- template , err := q .GetTemplateByID (context . Background () , workspace .TemplateID )
575
+ template , err := q .GetTemplateByID (ctx , workspace .TemplateID )
573
576
if err == nil && ! strings .EqualFold (arg .TemplateName , template .Name ) {
574
577
continue
575
578
}
576
579
}
580
+
577
581
if ! arg .Deleted && workspace .Deleted {
578
582
continue
579
583
}
580
584
581
585
if arg .Name != "" && ! strings .Contains (strings .ToLower (workspace .Name ), strings .ToLower (arg .Name )) {
582
586
continue
583
587
}
588
+
589
+ if arg .Status != "" {
590
+ build , err := q .GetLatestWorkspaceBuildByWorkspaceID (ctx , workspace .ID )
591
+ if err != nil {
592
+ return nil , xerrors .Errorf ("get latest build: %w" , err )
593
+ }
594
+
595
+ job , err := q .GetProvisionerJobByID (ctx , build .JobID )
596
+ if err != nil {
597
+ return nil , xerrors .Errorf ("get provisioner job: %w" , err )
598
+ }
599
+
600
+ switch arg .Status {
601
+ case "pending" :
602
+ if ! job .StartedAt .Valid {
603
+ continue
604
+ }
605
+
606
+ case "starting" :
607
+ if ! job .StartedAt .Valid &&
608
+ ! job .CanceledAt .Valid &&
609
+ job .CompletedAt .Valid &&
610
+ time .Since (job .UpdatedAt ) > 30 * time .Second ||
611
+ build .Transition != database .WorkspaceTransitionStart {
612
+ continue
613
+ }
614
+
615
+ case "running" :
616
+ if ! job .CompletedAt .Valid &&
617
+ job .CanceledAt .Valid &&
618
+ job .Error .Valid ||
619
+ build .Transition != database .WorkspaceTransitionStart {
620
+ continue
621
+ }
622
+
623
+ case "stopping" :
624
+ if ! job .StartedAt .Valid &&
625
+ ! job .CanceledAt .Valid &&
626
+ job .CompletedAt .Valid &&
627
+ time .Since (job .UpdatedAt ) > 30 * time .Second ||
628
+ build .Transition != database .WorkspaceTransitionStop {
629
+ continue
630
+ }
631
+
632
+ case "stopped" :
633
+ if ! job .CompletedAt .Valid &&
634
+ job .CanceledAt .Valid &&
635
+ job .Error .Valid ||
636
+ build .Transition != database .WorkspaceTransitionStop {
637
+ continue
638
+ }
639
+
640
+ case "failed" :
641
+ if (! job .CanceledAt .Valid && ! job .Error .Valid ) ||
642
+ (! job .CompletedAt .Valid && ! job .Error .Valid ) {
643
+ continue
644
+ }
645
+
646
+ case "canceling" :
647
+ if ! job .CanceledAt .Valid && job .CompletedAt .Valid {
648
+ continue
649
+ }
650
+
651
+ case "canceled" :
652
+ if ! job .CanceledAt .Valid && ! job .CompletedAt .Valid {
653
+ continue
654
+ }
655
+
656
+ case "deleted" :
657
+ if ! job .StartedAt .Valid &&
658
+ job .CanceledAt .Valid &&
659
+ ! job .CompletedAt .Valid &&
660
+ time .Since (job .UpdatedAt ) > 30 * time .Second ||
661
+ build .Transition != database .WorkspaceTransitionDelete {
662
+ continue
663
+ }
664
+
665
+ case "deleting" :
666
+ if ! job .CompletedAt .Valid &&
667
+ job .CanceledAt .Valid &&
668
+ job .Error .Valid &&
669
+ build .Transition != database .WorkspaceTransitionDelete {
670
+ continue
671
+ }
672
+
673
+ default :
674
+ return nil , xerrors .Errorf ("unknown workspace status in filter: %q" , arg .Status )
675
+ }
676
+ }
677
+
584
678
if len (arg .TemplateIds ) > 0 {
585
679
match := false
586
680
for _ , id := range arg .TemplateIds {
@@ -771,7 +865,7 @@ func (q *fakeQuerier) GetLatestWorkspaceBuildByWorkspaceID(_ context.Context, wo
771
865
var row database.WorkspaceBuild
772
866
var buildNum int32 = - 1
773
867
for _ , workspaceBuild := range q .workspaceBuilds {
774
- if workspaceBuild .WorkspaceID . String () == workspaceID . String () && workspaceBuild .BuildNumber > buildNum {
868
+ if workspaceBuild .WorkspaceID == workspaceID && workspaceBuild .BuildNumber > buildNum {
775
869
row = workspaceBuild
776
870
buildNum = workspaceBuild .BuildNumber
777
871
}
@@ -816,7 +910,7 @@ func (q *fakeQuerier) GetLatestWorkspaceBuildsByWorkspaceIDs(_ context.Context,
816
910
buildNumbers := make (map [uuid.UUID ]int32 )
817
911
for _ , workspaceBuild := range q .workspaceBuilds {
818
912
for _ , id := range ids {
819
- if id . String () == workspaceBuild .WorkspaceID . String () && workspaceBuild .BuildNumber > buildNumbers [id ] {
913
+ if id == workspaceBuild .WorkspaceID && workspaceBuild .BuildNumber > buildNumbers [id ] {
820
914
builds [id ] = workspaceBuild
821
915
buildNumbers [id ] = workspaceBuild .BuildNumber
822
916
}
0 commit comments