@@ -15,6 +15,7 @@ import (
15
15
"github.com/coder/coder/v2/coderd/audit"
16
16
"github.com/coder/coder/v2/coderd/coderdtest"
17
17
"github.com/coder/coder/v2/coderd/database"
18
+ "github.com/coder/coder/v2/coderd/database/dbgen"
18
19
"github.com/coder/coder/v2/coderd/rbac"
19
20
"github.com/coder/coder/v2/codersdk"
20
21
"github.com/coder/coder/v2/provisioner/echo"
@@ -531,3 +532,112 @@ func completeWithAgentAndApp() *echo.Responses {
531
532
},
532
533
}
533
534
}
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
+ }
0 commit comments