Skip to content

Commit db90772

Browse files
committed
fix workspace query
1 parent 6229337 commit db90772

File tree

5 files changed

+59
-3
lines changed

5 files changed

+59
-3
lines changed

coderd/database/modelqueries.go

+1
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ func (q *sqlQuerier) GetAuthorizedWorkspaces(ctx context.Context, arg GetWorkspa
213213
arg.Name,
214214
arg.HasAgent,
215215
arg.AgentInactiveDisconnectTimeoutSeconds,
216+
arg.LockedAt,
216217
arg.Offset,
217218
arg.Limit,
218219
)

coderd/database/queries.sql.go

+11-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/workspaces.sql

+6
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,12 @@ WHERE
241241
) > 0
242242
ELSE true
243243
END
244+
-- Filter by locked workspaces.
245+
AND CASE
246+
WHEN @locked_at :: timestamptz > '0001-01-01 00:00:00+00'::timestamptz THEN
247+
locked_at IS NOT NULL AND locked_at >= @locked_at
248+
ELSE true
249+
END
244250
-- Authorize Filter clause will be injected below in GetAuthorizedWorkspaces
245251
-- @authorize_filter
246252
ORDER BY

coderd/searchquery/search.go

+1
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ func Workspaces(query string, page codersdk.Pagination, agentInactiveDisconnectT
113113
filter.Name = parser.String(values, "", "name")
114114
filter.Status = string(httpapi.ParseCustom(parser, values, "", "status", httpapi.ParseEnum[database.WorkspaceStatus]))
115115
filter.HasAgent = parser.String(values, "", "has-agent")
116+
filter.LockedAt = parser.Time(values, time.Time{}, "locked_at", "2006-01-02")
116117

117118
if _, ok := values["deleting_by"]; ok {
118119
postFilter.DeletingBy = ptr.Ref(parser.Time(values, time.Time{}, "deleting_by", "2006-01-02"))

coderd/workspaces_test.go

+40
Original file line numberDiff line numberDiff line change
@@ -1407,6 +1407,46 @@ func TestWorkspaceFilterManual(t *testing.T) {
14071407
// and template.InactivityTTL should be 0
14081408
assert.Len(t, res.Workspaces, 0)
14091409
})
1410+
1411+
t.Run("LockedAt", func(t *testing.T) {
1412+
// this test has a licensed counterpart in enterprise/coderd/workspaces_test.go: FilterQueryHasDeletingByAndLicensed
1413+
t.Parallel()
1414+
client := coderdtest.New(t, &coderdtest.Options{
1415+
IncludeProvisionerDaemon: true,
1416+
})
1417+
user := coderdtest.CreateFirstUser(t, client)
1418+
authToken := uuid.NewString()
1419+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
1420+
Parse: echo.ParseComplete,
1421+
ProvisionPlan: echo.ProvisionComplete,
1422+
ProvisionApply: echo.ProvisionApplyWithAgent(authToken),
1423+
})
1424+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
1425+
_ = coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
1426+
1427+
// update template with inactivity ttl
1428+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
1429+
defer cancel()
1430+
1431+
lockedWorkspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
1432+
_ = coderdtest.AwaitWorkspaceBuildJob(t, client, lockedWorkspace.LatestBuild.ID)
1433+
1434+
// Create another workspace to validate that we do not return unlocked workspaces.
1435+
_ = coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
1436+
_ = coderdtest.AwaitWorkspaceBuildJob(t, client, lockedWorkspace.LatestBuild.ID)
1437+
1438+
err := client.UpdateWorkspaceLock(ctx, lockedWorkspace.ID, codersdk.UpdateWorkspaceLock{
1439+
Lock: true,
1440+
})
1441+
require.NoError(t, err)
1442+
1443+
res, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{
1444+
FilterQuery: fmt.Sprintf("locked_at:%s", time.Now().Add(-time.Minute).Format("2006-01-02")),
1445+
})
1446+
require.NoError(t, err)
1447+
require.Len(t, res.Workspaces, 1)
1448+
require.NotNil(t, res.Workspaces[0].LockedAt)
1449+
})
14101450
}
14111451

14121452
func TestOffsetLimit(t *testing.T) {

0 commit comments

Comments
 (0)