Skip to content

Commit 4802e88

Browse files
committed
chore(coderd/audit): remove workspace app and agent from Auditable
1 parent c5131a3 commit 4802e88

File tree

6 files changed

+116
-83
lines changed

6 files changed

+116
-83
lines changed

coderd/audit/diff.go

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

3836
// 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
@@ -129,10 +129,6 @@ func ResourceTarget[T Auditable](tgt T) string {
129129
return "Organization Group Sync"
130130
case idpsync.RoleSyncSettings:
131131
return "Organization Role Sync"
132-
case database.WorkspaceAgent:
133-
return typed.Name
134-
case database.WorkspaceApp:
135-
return typed.Slug
136132
default:
137133
panic(fmt.Sprintf("unknown resource %T for ResourceTarget", tgt))
138134
}
@@ -192,10 +188,6 @@ func ResourceID[T Auditable](tgt T) uuid.UUID {
192188
return noID // Org field on audit log has org id
193189
case idpsync.RoleSyncSettings:
194190
return noID // Org field on audit log has org id
195-
case database.WorkspaceAgent:
196-
return typed.ID
197-
case database.WorkspaceApp:
198-
return typed.ID
199191
default:
200192
panic(fmt.Sprintf("unknown resource %T for ResourceID", tgt))
201193
}
@@ -247,10 +239,6 @@ func ResourceType[T Auditable](tgt T) database.ResourceType {
247239
return database.ResourceTypeIdpSyncSettingsRole
248240
case idpsync.GroupSyncSettings:
249241
return database.ResourceTypeIdpSyncSettingsGroup
250-
case database.WorkspaceAgent:
251-
return database.ResourceTypeWorkspaceAgent
252-
case database.WorkspaceApp:
253-
return database.ResourceTypeWorkspaceApp
254242
default:
255243
panic(fmt.Sprintf("unknown resource %T for ResourceType", typed))
256244
}
@@ -304,10 +292,6 @@ func ResourceRequiresOrgID[T Auditable]() bool {
304292
return true
305293
case idpsync.RoleSyncSettings:
306294
return true
307-
case database.WorkspaceAgent:
308-
return true
309-
case database.WorkspaceApp:
310-
return true
311295
default:
312296
panic(fmt.Sprintf("unknown resource %T for ResourceRequiresOrgID", tgt))
313297
}

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)