Skip to content

Commit 6235708

Browse files
presleypcoadler
andauthored
feat: filter for running workspaces (#4157)
* Refactor workspaces xservice * Remove layout comment * Format * Add comments * Add running workspaces filter to frontend * Start on backend - add status to filter * Update sql and add test - wip * Attempt to unconvert status for easier querying * Fix syntax * Join jobs table, untested * sql * Add Status to GetAuthorizedWorkspaces * Update job tests to have canceled time * fmt * add status filter to database fake Co-authored-by: Colin Adler <colin1adler@gmail.com>
1 parent aefb477 commit 6235708

File tree

15 files changed

+432
-97
lines changed

15 files changed

+432
-97
lines changed

coderd/database/databasefake/databasefake.go

Lines changed: 99 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,8 @@ func (q *fakeQuerier) GetWorkspaces(ctx context.Context, arg database.GetWorkspa
553553
return workspaces, err
554554
}
555555

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) {
557558
q.mutex.RLock()
558559
defer q.mutex.RUnlock()
559560

@@ -562,25 +563,118 @@ func (q *fakeQuerier) GetAuthorizedWorkspaces(_ context.Context, arg database.Ge
562563
if arg.OwnerID != uuid.Nil && workspace.OwnerID != arg.OwnerID {
563564
continue
564565
}
566+
565567
if arg.OwnerUsername != "" {
566-
owner, err := q.GetUserByID(context.Background(), workspace.OwnerID)
568+
owner, err := q.GetUserByID(ctx, workspace.OwnerID)
567569
if err == nil && !strings.EqualFold(arg.OwnerUsername, owner.Username) {
568570
continue
569571
}
570572
}
573+
571574
if arg.TemplateName != "" {
572-
template, err := q.GetTemplateByID(context.Background(), workspace.TemplateID)
575+
template, err := q.GetTemplateByID(ctx, workspace.TemplateID)
573576
if err == nil && !strings.EqualFold(arg.TemplateName, template.Name) {
574577
continue
575578
}
576579
}
580+
577581
if !arg.Deleted && workspace.Deleted {
578582
continue
579583
}
580584

581585
if arg.Name != "" && !strings.Contains(strings.ToLower(workspace.Name), strings.ToLower(arg.Name)) {
582586
continue
583587
}
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+
584678
if len(arg.TemplateIds) > 0 {
585679
match := false
586680
for _, id := range arg.TemplateIds {
@@ -771,7 +865,7 @@ func (q *fakeQuerier) GetLatestWorkspaceBuildByWorkspaceID(_ context.Context, wo
771865
var row database.WorkspaceBuild
772866
var buildNum int32 = -1
773867
for _, workspaceBuild := range q.workspaceBuilds {
774-
if workspaceBuild.WorkspaceID.String() == workspaceID.String() && workspaceBuild.BuildNumber > buildNum {
868+
if workspaceBuild.WorkspaceID == workspaceID && workspaceBuild.BuildNumber > buildNum {
775869
row = workspaceBuild
776870
buildNum = workspaceBuild.BuildNumber
777871
}
@@ -816,7 +910,7 @@ func (q *fakeQuerier) GetLatestWorkspaceBuildsByWorkspaceIDs(_ context.Context,
816910
buildNumbers := make(map[uuid.UUID]int32)
817911
for _, workspaceBuild := range q.workspaceBuilds {
818912
for _, id := range ids {
819-
if id.String() == workspaceBuild.WorkspaceID.String() && workspaceBuild.BuildNumber > buildNumbers[id] {
913+
if id == workspaceBuild.WorkspaceID && workspaceBuild.BuildNumber > buildNumbers[id] {
820914
builds[id] = workspaceBuild
821915
buildNumbers[id] = workspaceBuild.BuildNumber
822916
}

coderd/database/modelqueries.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ func (q *sqlQuerier) GetAuthorizedWorkspaces(ctx context.Context, arg GetWorkspa
168168
query := fmt.Sprintf("-- name: GetAuthorizedWorkspaces :many\n%s AND %s", getWorkspaces, authorizedFilter.SQLString(rbac.NoACLConfig()))
169169
rows, err := q.db.QueryContext(ctx, query,
170170
arg.Deleted,
171+
arg.Status,
171172
arg.OwnerID,
172173
arg.OwnerUsername,
173174
arg.TemplateName,

coderd/database/queries.sql.go

Lines changed: 101 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)