Skip to content

Commit 0d73833

Browse files
committed
chore(coderd/audit): remove workspace app and agent from Auditable
1 parent 6b17aee commit 0d73833

File tree

6 files changed

+116
-85
lines changed

6 files changed

+116
-85
lines changed

coderd/audit/diff.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,7 @@ type Auditable interface {
3131
database.NotificationTemplate |
3232
idpsync.OrganizationSyncSettings |
3333
idpsync.GroupSyncSettings |
34-
idpsync.RoleSyncSettings |
35-
database.WorkspaceAgent |
36-
database.WorkspaceApp
34+
idpsync.RoleSyncSettings
3735
}
3836

3937
// Map is a map of changed fields in an audited resource. It maps field names to

coderd/audit/request.go

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,6 @@ func ResourceTarget[T Auditable](tgt T) string {
131131
return "Organization Group Sync"
132132
case idpsync.RoleSyncSettings:
133133
return "Organization Role Sync"
134-
case database.WorkspaceAgent:
135-
return typed.Name
136-
case database.WorkspaceApp:
137-
return typed.Slug
138134
default:
139135
panic(fmt.Sprintf("unknown resource %T for ResourceTarget", tgt))
140136
}
@@ -197,10 +193,6 @@ func ResourceID[T Auditable](tgt T) uuid.UUID {
197193
return noID // Org field on audit log has org id
198194
case idpsync.RoleSyncSettings:
199195
return noID // Org field on audit log has org id
200-
case database.WorkspaceAgent:
201-
return typed.ID
202-
case database.WorkspaceApp:
203-
return typed.ID
204196
default:
205197
panic(fmt.Sprintf("unknown resource %T for ResourceID", tgt))
206198
}
@@ -254,10 +246,6 @@ func ResourceType[T Auditable](tgt T) database.ResourceType {
254246
return database.ResourceTypeIdpSyncSettingsRole
255247
case idpsync.GroupSyncSettings:
256248
return database.ResourceTypeIdpSyncSettingsGroup
257-
case database.WorkspaceAgent:
258-
return database.ResourceTypeWorkspaceAgent
259-
case database.WorkspaceApp:
260-
return database.ResourceTypeWorkspaceApp
261249
default:
262250
panic(fmt.Sprintf("unknown resource %T for ResourceType", typed))
263251
}
@@ -314,10 +302,6 @@ func ResourceRequiresOrgID[T Auditable]() bool {
314302
return true
315303
case idpsync.RoleSyncSettings:
316304
return true
317-
case database.WorkspaceAgent:
318-
return true
319-
case database.WorkspaceApp:
320-
return true
321305
default:
322306
panic(fmt.Sprintf("unknown resource %T for ResourceRequiresOrgID", tgt))
323307
}

coderd/audit_test.go

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/coder/coder/v2/coderd/audit"
1616
"github.com/coder/coder/v2/coderd/coderdtest"
1717
"github.com/coder/coder/v2/coderd/database"
18+
"github.com/coder/coder/v2/coderd/database/dbgen"
1819
"github.com/coder/coder/v2/coderd/rbac"
1920
"github.com/coder/coder/v2/codersdk"
2021
"github.com/coder/coder/v2/provisioner/echo"
@@ -531,3 +532,112 @@ func completeWithAgentAndApp() *echo.Responses {
531532
},
532533
}
533534
}
535+
536+
// TestDeprecatedConnEvents tests the deprecated connection and disconnection
537+
// events in the audit logs. These events are no longer created, but need to be
538+
// returned by the API.
539+
func TestDeprecatedConnEvents(t *testing.T) {
540+
t.Parallel()
541+
var (
542+
ctx = context.Background()
543+
client, _, api = coderdtest.NewWithAPI(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
544+
user = coderdtest.CreateFirstUser(t, client)
545+
version = coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, completeWithAgentAndApp())
546+
template = coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
547+
)
548+
549+
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
550+
workspace := coderdtest.CreateWorkspace(t, client, template.ID)
551+
workspace.LatestBuild = coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID)
552+
553+
type additionalFields struct {
554+
audit.AdditionalFields
555+
ConnectionType string `json:"connection_type"`
556+
}
557+
558+
sshFields := additionalFields{
559+
AdditionalFields: audit.AdditionalFields{
560+
WorkspaceName: workspace.Name,
561+
BuildNumber: "999",
562+
BuildReason: "initiator",
563+
WorkspaceOwner: workspace.OwnerName,
564+
WorkspaceID: workspace.ID,
565+
},
566+
ConnectionType: "SSH",
567+
}
568+
569+
sshFieldsBytes, err := json.Marshal(sshFields)
570+
require.NoError(t, err)
571+
572+
appFields := audit.AdditionalFields{
573+
WorkspaceName: workspace.Name,
574+
// Deliberately empty
575+
BuildNumber: "",
576+
BuildReason: "",
577+
WorkspaceOwner: workspace.OwnerName,
578+
WorkspaceID: workspace.ID,
579+
}
580+
581+
appFieldsBytes, err := json.Marshal(appFields)
582+
require.NoError(t, err)
583+
584+
dbgen.AuditLog(t, api.Database, database.AuditLog{
585+
OrganizationID: user.OrganizationID,
586+
Action: database.AuditActionConnect,
587+
ResourceType: database.ResourceTypeWorkspaceAgent,
588+
ResourceID: workspace.LatestBuild.Resources[0].Agents[0].ID,
589+
ResourceTarget: workspace.LatestBuild.Resources[0].Agents[0].Name,
590+
Time: time.Date(2022, 8, 15, 14, 30, 45, 100, time.UTC), // 2022-8-15 14:30:45
591+
AdditionalFields: sshFieldsBytes,
592+
})
593+
594+
dbgen.AuditLog(t, api.Database, database.AuditLog{
595+
OrganizationID: user.OrganizationID,
596+
Action: database.AuditActionDisconnect,
597+
ResourceType: database.ResourceTypeWorkspaceAgent,
598+
ResourceID: workspace.LatestBuild.Resources[0].Agents[0].ID,
599+
ResourceTarget: workspace.LatestBuild.Resources[0].Agents[0].Name,
600+
Time: time.Date(2022, 8, 15, 14, 35, 0o0, 100, time.UTC), // 2022-8-15 14:35:00
601+
AdditionalFields: sshFieldsBytes,
602+
})
603+
604+
dbgen.AuditLog(t, api.Database, database.AuditLog{
605+
OrganizationID: user.OrganizationID,
606+
UserID: user.UserID,
607+
Action: database.AuditActionOpen,
608+
ResourceType: database.ResourceTypeWorkspaceApp,
609+
ResourceID: workspace.LatestBuild.Resources[0].Agents[0].Apps[0].ID,
610+
ResourceTarget: workspace.LatestBuild.Resources[0].Agents[0].Apps[0].Slug,
611+
Time: time.Date(2022, 8, 15, 14, 30, 45, 100, time.UTC), // 2022-8-15 14:30:45
612+
AdditionalFields: appFieldsBytes,
613+
})
614+
615+
connLog, err := client.AuditLogs(ctx, codersdk.AuditLogsRequest{
616+
SearchQuery: "action:connect",
617+
})
618+
require.NoError(t, err)
619+
require.Len(t, connLog.AuditLogs, 1)
620+
var sshOutFields additionalFields
621+
err = json.Unmarshal(connLog.AuditLogs[0].AdditionalFields, &sshOutFields)
622+
require.NoError(t, err)
623+
require.Equal(t, sshFields, sshOutFields)
624+
625+
dcLog, err := client.AuditLogs(ctx, codersdk.AuditLogsRequest{
626+
SearchQuery: "action:disconnect",
627+
})
628+
require.NoError(t, err)
629+
require.Len(t, dcLog.AuditLogs, 1)
630+
err = json.Unmarshal(dcLog.AuditLogs[0].AdditionalFields, &sshOutFields)
631+
require.NoError(t, err)
632+
require.Equal(t, sshFields, sshOutFields)
633+
634+
openLog, err := client.AuditLogs(ctx, codersdk.AuditLogsRequest{
635+
SearchQuery: "action:open",
636+
})
637+
require.NoError(t, err)
638+
require.Len(t, openLog.AuditLogs, 1)
639+
var appOutFields audit.AdditionalFields
640+
err = json.Unmarshal(openLog.AuditLogs[0].AdditionalFields, &appOutFields)
641+
require.NoError(t, err)
642+
require.Equal(t, appFields, appOutFields)
643+
}

coderd/database/dbgen/dbgen.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func AuditLog(t testing.TB, db database.Store, seed database.AuditLog) database.
6565
Action: takeFirst(seed.Action, database.AuditActionCreate),
6666
Diff: takeFirstSlice(seed.Diff, []byte("{}")),
6767
StatusCode: takeFirst(seed.StatusCode, 200),
68-
AdditionalFields: takeFirstSlice(seed.Diff, []byte("{}")),
68+
AdditionalFields: takeFirstSlice(seed.AdditionalFields, []byte("{}")),
6969
RequestID: takeFirst(seed.RequestID, uuid.New()),
7070
ResourceIcon: takeFirst(seed.ResourceIcon, ""),
7171
})

0 commit comments

Comments
 (0)