Skip to content

Commit debcf9c

Browse files
committed
add disconnect/close and support resource_id filter
1 parent c364a34 commit debcf9c

File tree

13 files changed

+106
-22
lines changed

13 files changed

+106
-22
lines changed

coderd/apidoc/docs.go

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

coderd/apidoc/swagger.json

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

coderd/audit.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ func (api *API) generateFakeAuditLog(rw http.ResponseWriter, r *http.Request) {
159159
Diff: diff,
160160
StatusCode: http.StatusOK,
161161
AdditionalFields: params.AdditionalFields,
162-
RequestID: uuid.Nil, // no request ID to attach this to
162+
RequestID: params.RequestID,
163163
ResourceIcon: "",
164164
OrganizationID: params.OrganizationID,
165165
})

coderd/audit_test.go

+45-4
Original file line numberDiff line numberDiff line change
@@ -286,23 +286,44 @@ func TestAuditLogsFilter(t *testing.T) {
286286
t.Logf("Resource: %#v", resource)
287287
}
288288

289-
// Create one log with "Connect"
289+
// Create one log with "Connect" and "Disconect".
290+
connectRequestID := uuid.New()
290291
err = client.CreateTestAuditLog(ctx, codersdk.CreateTestAuditLogRequest{
291292
Action: codersdk.AuditActionConnect,
293+
RequestID: connectRequestID,
292294
ResourceType: codersdk.ResourceTypeWorkspaceAgent,
293295
ResourceID: workspace.LatestBuild.Resources[0].Agents[0].ID,
294296
Time: time.Date(2022, 8, 15, 14, 30, 45, 100, time.UTC), // 2022-8-15 14:30:45
295297
})
296298
require.NoError(t, err)
297299

298-
// Create one log with "Open"
300+
err = client.CreateTestAuditLog(ctx, codersdk.CreateTestAuditLogRequest{
301+
Action: codersdk.AuditActionDisconnect,
302+
RequestID: connectRequestID,
303+
ResourceType: codersdk.ResourceTypeWorkspaceAgent,
304+
ResourceID: workspace.LatestBuild.Resources[0].Agents[0].ID,
305+
Time: time.Date(2022, 8, 15, 14, 35, 0o0, 100, time.UTC), // 2022-8-15 14:35:00
306+
})
307+
require.NoError(t, err)
308+
309+
// Create one log with "Open" and "Close".
310+
openRequestID := uuid.New()
299311
err = client.CreateTestAuditLog(ctx, codersdk.CreateTestAuditLogRequest{
300312
Action: codersdk.AuditActionOpen,
313+
RequestID: openRequestID,
301314
ResourceType: codersdk.ResourceTypeWorkspaceApp,
302315
ResourceID: workspace.LatestBuild.Resources[0].Agents[0].Apps[0].ID,
303316
Time: time.Date(2022, 8, 15, 14, 30, 45, 100, time.UTC), // 2022-8-15 14:30:45
304317
})
305318
require.NoError(t, err)
319+
err = client.CreateTestAuditLog(ctx, codersdk.CreateTestAuditLogRequest{
320+
Action: codersdk.AuditActionClose,
321+
RequestID: openRequestID,
322+
ResourceType: codersdk.ResourceTypeWorkspaceApp,
323+
ResourceID: workspace.LatestBuild.Resources[0].Agents[0].Apps[0].ID,
324+
Time: time.Date(2022, 8, 15, 14, 35, 0o0, 100, time.UTC), // 2022-8-15 14:35:00
325+
})
326+
require.NoError(t, err)
306327

307328
// Test cases
308329
testCases := []struct {
@@ -334,12 +355,12 @@ func TestAuditLogsFilter(t *testing.T) {
334355
{
335356
Name: "FilterByEmail",
336357
SearchQuery: "email:" + coderdtest.FirstUserParams.Email,
337-
ExpectedResult: 7,
358+
ExpectedResult: 9,
338359
},
339360
{
340361
Name: "FilterByUsername",
341362
SearchQuery: "username:" + coderdtest.FirstUserParams.Username,
342-
ExpectedResult: 7,
363+
ExpectedResult: 9,
343364
},
344365
{
345366
Name: "FilterByResourceID",
@@ -396,11 +417,31 @@ func TestAuditLogsFilter(t *testing.T) {
396417
SearchQuery: "resource_type:workspace_agent action:connect",
397418
ExpectedResult: 1,
398419
},
420+
{
421+
Name: "FilterOnWorkspaceAgentDisconnect",
422+
SearchQuery: "resource_type:workspace_agent action:disconnect",
423+
ExpectedResult: 1,
424+
},
425+
{
426+
Name: "FilterOnWorkspaceAgentConnectionRequestID",
427+
SearchQuery: "resource_type:workspace_agent request_id:" + connectRequestID.String(),
428+
ExpectedResult: 2,
429+
},
399430
{
400431
Name: "FilterOnWorkspaceAppOpen",
401432
SearchQuery: "resource_type:workspace_app action:open",
402433
ExpectedResult: 1,
403434
},
435+
{
436+
Name: "FilterOnWorkspaceAppClose",
437+
SearchQuery: "resource_type:workspace_app action:close",
438+
ExpectedResult: 1,
439+
},
440+
{
441+
Name: "FilterOnWorkspaceAppOpenRequestID",
442+
SearchQuery: "resource_type:workspace_app request_id:" + openRequestID.String(),
443+
ExpectedResult: 2,
444+
},
404445
}
405446

406447
for _, testCase := range testCases {

coderd/database/dbmem/dbmem.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -12369,10 +12369,13 @@ func (q *FakeQuerier) GetAuthorizedAuditLogsOffset(ctx context.Context, arg data
1236912369
arg.OffsetOpt--
1237012370
continue
1237112371
}
12372+
if arg.RequestID != uuid.Nil && arg.RequestID != alog.RequestID {
12373+
continue
12374+
}
1237212375
if arg.OrganizationID != uuid.Nil && arg.OrganizationID != alog.OrganizationID {
1237312376
continue
1237412377
}
12375-
if arg.Action != "" && !strings.Contains(string(alog.Action), arg.Action) {
12378+
if arg.Action != "" && string(alog.Action) != arg.Action {
1237612379
continue
1237712380
}
1237812381
if arg.ResourceType != "" && !strings.Contains(string(alog.ResourceType), arg.ResourceType) {

coderd/database/dump.sql

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

coderd/database/models.go

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

coderd/database/queries.sql.go

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

coderd/database/queries/auditlogs.sql

+6
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,12 @@ WHERE
117117
workspace_builds.reason::text = @build_reason
118118
ELSE true
119119
END
120+
-- Filter request_id
121+
AND CASE
122+
WHEN @request_id :: uuid != '00000000-0000-0000-0000-000000000000'::uuid THEN
123+
audit_logs.request_id = @request_id
124+
ELSE true
125+
END
120126

121127
-- Authorize Filter clause will be injected below in GetAuthorizedAuditLogsOffset
122128
-- @authorize_filter

coderd/searchquery/search.go

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ func AuditLogs(ctx context.Context, db database.Store, query string) (database.G
3333
const dateLayout = "2006-01-02"
3434
parser := httpapi.NewQueryParamParser()
3535
filter := database.GetAuditLogsOffsetParams{
36+
RequestID: parser.UUID(values, uuid.Nil, "request_id"),
3637
ResourceID: parser.UUID(values, uuid.Nil, "resource_id"),
3738
ResourceTarget: parser.String(values, "", "resource_target"),
3839
Username: parser.String(values, "", "username"),

codersdk/audit.go

+7
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,9 @@ const (
111111
AuditActionRegister AuditAction = "register"
112112
AuditActionRequestPasswordReset AuditAction = "request_password_reset"
113113
AuditActionConnect AuditAction = "connect"
114+
AuditActionDisconnect AuditAction = "disconnect"
114115
AuditActionOpen AuditAction = "open"
116+
AuditActionClose AuditAction = "close"
115117
)
116118

117119
func (a AuditAction) Friendly() string {
@@ -136,8 +138,12 @@ func (a AuditAction) Friendly() string {
136138
return "password reset requested"
137139
case AuditActionConnect:
138140
return "connected"
141+
case AuditActionDisconnect:
142+
return "disconnected"
139143
case AuditActionOpen:
140144
return "opened"
145+
case AuditActionClose:
146+
return "closed"
141147
default:
142148
return "unknown"
143149
}
@@ -196,6 +202,7 @@ type CreateTestAuditLogRequest struct {
196202
Time time.Time `json:"time,omitempty" format:"date-time"`
197203
BuildReason BuildReason `json:"build_reason,omitempty" enums:"autostart,autostop,initiator"`
198204
OrganizationID uuid.UUID `json:"organization_id,omitempty" format:"uuid"`
205+
RequestID uuid.UUID `json:"request_id,omitempty" format:"uuid"`
199206
}
200207

201208
// AuditLogs retrieves audit logs from the given page.

docs/reference/api/schemas.md

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

enterprise/audit/table.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ var AuditActionMap = map[string][]codersdk.AuditAction{
2727
"Group": {codersdk.AuditActionCreate, codersdk.AuditActionWrite, codersdk.AuditActionDelete},
2828
"APIKey": {codersdk.AuditActionLogin, codersdk.AuditActionLogout, codersdk.AuditActionRegister, codersdk.AuditActionCreate, codersdk.AuditActionDelete},
2929
"License": {codersdk.AuditActionCreate, codersdk.AuditActionDelete},
30-
"WorkspaceAgent": {codersdk.AuditActionConnect},
31-
"WorkspaceApp": {codersdk.AuditActionOpen},
30+
"WorkspaceAgent": {codersdk.AuditActionConnect, codersdk.AuditActionDisconnect},
31+
"WorkspaceApp": {codersdk.AuditActionOpen, codersdk.AuditActionClose},
3232
}
3333

3434
type Action string
@@ -310,14 +310,14 @@ var auditableResourcesTypes = map[any]map[string]Action{
310310
"mapping": ActionTrack,
311311
},
312312
&database.WorkspaceAgent{}: {
313-
"id": ActionTrack,
313+
"id": ActionIgnore,
314314
"created_at": ActionIgnore,
315315
"updated_at": ActionIgnore,
316-
"name": ActionTrack,
316+
"name": ActionIgnore,
317317
"first_connected_at": ActionIgnore,
318318
"last_connected_at": ActionIgnore,
319319
"disconnected_at": ActionIgnore,
320-
"resource_id": ActionTrack,
320+
"resource_id": ActionIgnore,
321321
"auth_token": ActionIgnore,
322322
"auth_instance_id": ActionIgnore,
323323
"architecture": ActionIgnore,
@@ -345,8 +345,8 @@ var auditableResourcesTypes = map[any]map[string]Action{
345345
&database.WorkspaceApp{}: {
346346
"id": ActionIgnore,
347347
"created_at": ActionIgnore,
348-
"agent_id": ActionTrack,
349-
"display_name": ActionTrack,
348+
"agent_id": ActionIgnore,
349+
"display_name": ActionIgnore,
350350
"icon": ActionIgnore,
351351
"command": ActionIgnore,
352352
"url": ActionIgnore,
@@ -356,7 +356,7 @@ var auditableResourcesTypes = map[any]map[string]Action{
356356
"health": ActionIgnore,
357357
"subdomain": ActionIgnore,
358358
"sharing_level": ActionIgnore,
359-
"slug": ActionTrack,
359+
"slug": ActionIgnore,
360360
"external": ActionIgnore,
361361
"display_order": ActionIgnore,
362362
"hidden": ActionIgnore,

0 commit comments

Comments
 (0)