diff --git a/coderd/audit.go b/coderd/audit.go index 185776c2ba1f3..79aade193ec66 100644 --- a/coderd/audit.go +++ b/coderd/audit.go @@ -478,6 +478,10 @@ func actionFromString(actionString string) string { return actionString case codersdk.AuditActionDelete: return actionString + case codersdk.AuditActionStart: + return actionString + case codersdk.AuditActionStop: + return actionString default: } return "" diff --git a/coderd/audit_test.go b/coderd/audit_test.go index 5495235d954e5..8fcc479c23de0 100644 --- a/coderd/audit_test.go +++ b/coderd/audit_test.go @@ -46,12 +46,15 @@ func TestAuditLogsFilter(t *testing.T) { var ( ctx = context.Background() - client = coderdtest.New(t, nil) + client = coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) user = coderdtest.CreateFirstUser(t, client) version = coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template = coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) ) + coderdtest.AwaitTemplateVersionJob(t, client, version.ID) + workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) + // Create two logs with "Create" err := client.CreateTestAuditLog(ctx, codersdk.CreateTestAuditLogRequest{ Action: codersdk.AuditActionCreate, @@ -77,6 +80,24 @@ func TestAuditLogsFilter(t *testing.T) { }) require.NoError(t, err) + // Create one log with "Start" + err = client.CreateTestAuditLog(ctx, codersdk.CreateTestAuditLogRequest{ + Action: codersdk.AuditActionStart, + ResourceType: codersdk.ResourceTypeWorkspaceBuild, + ResourceID: workspace.LatestBuild.ID, + Time: time.Date(2022, 8, 15, 14, 30, 45, 100, time.UTC), // 2022-8-15 14:30:45 + }) + require.NoError(t, err) + + // Create one log with "Stop" + err = client.CreateTestAuditLog(ctx, codersdk.CreateTestAuditLogRequest{ + Action: codersdk.AuditActionStop, + ResourceType: codersdk.ResourceTypeWorkspaceBuild, + ResourceID: workspace.LatestBuild.ID, + Time: time.Date(2022, 8, 15, 14, 30, 45, 100, time.UTC), // 2022-8-15 14:30:45 + }) + require.NoError(t, err) + // Test cases testCases := []struct { Name string @@ -106,12 +127,12 @@ func TestAuditLogsFilter(t *testing.T) { { Name: "FilterByEmail", SearchQuery: "email:" + coderdtest.FirstUserParams.Email, - ExpectedResult: 3, + ExpectedResult: 5, }, { Name: "FilterByUsername", SearchQuery: "username:" + coderdtest.FirstUserParams.Username, - ExpectedResult: 3, + ExpectedResult: 5, }, { Name: "FilterByResourceID", @@ -121,17 +142,17 @@ func TestAuditLogsFilter(t *testing.T) { { Name: "FilterInvalidSingleValue", SearchQuery: "invalid", - ExpectedResult: 3, + ExpectedResult: 5, }, { Name: "FilterWithInvalidResourceType", SearchQuery: "resource_type:invalid", - ExpectedResult: 3, + ExpectedResult: 5, }, { Name: "FilterWithInvalidAction", SearchQuery: "action:invalid", - ExpectedResult: 3, + ExpectedResult: 5, }, { Name: "FilterOnCreateSingleDay", @@ -148,6 +169,16 @@ func TestAuditLogsFilter(t *testing.T) { SearchQuery: "action:create date_to:2022-08-15", ExpectedResult: 1, }, + { + Name: "FilterOnWorkspaceBuildStart", + SearchQuery: "resource_type:workspace_build action:start", + ExpectedResult: 1, + }, + { + Name: "FilterOnWorkspaceBuildStop", + SearchQuery: "resource_type:workspace_build action:stop", + ExpectedResult: 1, + }, } for _, testCase := range testCases { diff --git a/site/src/pages/AuditPage/AuditPageView.tsx b/site/src/pages/AuditPage/AuditPageView.tsx index 71dc45af77516..dd057985a7f2b 100644 --- a/site/src/pages/AuditPage/AuditPageView.tsx +++ b/site/src/pages/AuditPage/AuditPageView.tsx @@ -35,9 +35,11 @@ const presetFilters = [ name: "Created workspaces", }, { query: "resource_type:template action:create", name: "Added templates" }, - { query: "resource_type:user action:create", name: "Added users" }, - { query: "resource_type:template action:delete", name: "Deleted templates" }, { query: "resource_type:user action:delete", name: "Deleted users" }, + { + query: "resource_type:workspace_build action:start", + name: "Started builds", + }, ] export interface AuditPageViewProps {