fleet/server/datastore/mysql/linux_mdm_test.go
Victor Lyuboslavsky 62b7412243
Disk encryption keys are now archived when created/updated (#25638)
For #25609 

Manual QA in progress. Putting this "In Review" since it is a P1.

Video explaining the PR: https://youtu.be/bUwIdjBLqiM

# Checklist for submitter

- [x] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
- [x] If database migrations are included, checked table schema to
confirm autoupdate
- For database migrations:
- [x] Checked schema for all modified table for columns that will
auto-update timestamps during migration.
- [x] Confirmed that updating the timestamps is acceptable, and will not
cause unwanted side effects.
- [x] Ensured the correct collation is explicitly set for character
columns (`COLLATE utf8mb4_unicode_ci`).
- [x] Added/updated automated tests
- [x] A detailed QA plan exists on the associated ticket (if it isn't
there, work with the product group's QA engineer to add it)
- [x] Manual QA for all new/changed functionality
2025-01-22 14:54:40 -06:00

146 lines
4.4 KiB
Go

package mysql
import (
"context"
"fmt"
"testing"
"time"
"github.com/fleetdm/fleet/v4/server/fleet"
"github.com/fleetdm/fleet/v4/server/test"
"github.com/stretchr/testify/require"
)
func TestLinuxDiskEncryptionSummary(t *testing.T) {
ds := CreateMySQLDS(t)
ctx := context.Background()
// 5 new ubuntu hosts
var ubuntuHosts []*fleet.Host
for i := 0; i < 5; i++ {
h := test.NewHost(t, ds, fmt.Sprintf("foo.local.%d", i), "1.1.1.1",
fmt.Sprintf("%d", i), fmt.Sprintf("%d", i), time.Now(), test.WithPlatform("ubuntu"))
ubuntuHosts = append(ubuntuHosts, h)
}
// 5 new fedora hosts
var fedoraHosts []*fleet.Host
for i := 5; i < 10; i++ {
h := test.NewHost(t, ds, fmt.Sprintf("foo.local.%d", i), "1.1.1.1",
fmt.Sprintf("%d", i), fmt.Sprintf("%d", i), time.Now(),
test.WithOSVersion("Fedora Linux 38.0.0"), test.WithPlatform("rhel"))
fedoraHosts = append(fedoraHosts, h)
}
// 5 macos hosts
var macosHosts []*fleet.Host
for i := 10; i < 15; i++ {
h := test.NewHost(t, ds, fmt.Sprintf("foo.local.%d", i), "1.1.1.1",
fmt.Sprintf("%d", i), fmt.Sprintf("%d", i), time.Now(), test.WithPlatform("darwin"))
macosHosts = append(macosHosts, h)
}
// no teams tests =====
summary, err := ds.GetLinuxDiskEncryptionSummary(ctx, nil)
require.NoError(t, err)
require.Equal(t, uint(0), summary.Verified)
require.Equal(t, uint(10), summary.ActionRequired)
require.Equal(t, uint(0), summary.Failed)
// Add disk encryption keys
// ubuntu
err = ds.SetOrUpdateHostDiskEncryptionKey(ctx, ubuntuHosts[0], "base64_encrypted", "", nil)
require.NoError(t, err)
// fedora
err = ds.SetOrUpdateHostDiskEncryptionKey(ctx, fedoraHosts[0], "base64_encrypted", "", nil)
require.NoError(t, err)
// macos
err = ds.SetOrUpdateHostDiskEncryptionKey(ctx, macosHosts[0], "base64_encrypted", "", nil)
require.NoError(t, err)
summary, err = ds.GetLinuxDiskEncryptionSummary(ctx, nil)
require.NoError(t, err)
require.Equal(t, uint(2), summary.Verified)
require.Equal(t, uint(8), summary.ActionRequired)
require.Equal(t, uint(0), summary.Failed)
// update ubuntu with key and client error
err = ds.SetOrUpdateHostDiskEncryptionKey(ctx, ubuntuHosts[0], "base64_encrypted", "client error", nil)
require.NoError(t, err)
summary, err = ds.GetLinuxDiskEncryptionSummary(ctx, nil)
require.NoError(t, err)
require.Equal(t, uint(1), summary.Verified)
require.Equal(t, uint(8), summary.ActionRequired)
require.Equal(t, uint(1), summary.Failed)
// add ubuntu with no key and client error
err = ds.SetOrUpdateHostDiskEncryptionKey(ctx, ubuntuHosts[1], "", "client error", nil)
require.NoError(t, err)
summary, err = ds.GetLinuxDiskEncryptionSummary(ctx, nil)
require.NoError(t, err)
require.Equal(t, uint(1), summary.Verified)
require.Equal(t, uint(7), summary.ActionRequired)
require.Equal(t, uint(2), summary.Failed)
// move verified fedora host to team will remove existing key
team, err := ds.NewTeam(ctx, &fleet.Team{Name: "team1"})
require.NoError(t, err)
err = ds.AddHostsToTeam(ctx, &team.ID, []uint{fedoraHosts[0].ID})
require.NoError(t, err)
// team summary
summary, err = ds.GetLinuxDiskEncryptionSummary(ctx, &team.ID)
require.NoError(t, err)
require.Equal(t, uint(0), summary.Verified)
require.Equal(t, uint(1), summary.ActionRequired)
require.Equal(t, uint(0), summary.Failed)
// no team summary
summary, err = ds.GetLinuxDiskEncryptionSummary(ctx, nil)
require.NoError(t, err)
require.Equal(t, uint(0), summary.Verified)
require.Equal(t, uint(7), summary.ActionRequired)
require.Equal(t, uint(2), summary.Failed)
// move all hosts to team
for _, h := range ubuntuHosts {
err = ds.AddHostsToTeam(ctx, &team.ID, []uint{h.ID})
require.NoError(t, err)
}
for _, h := range fedoraHosts {
err = ds.AddHostsToTeam(ctx, &team.ID, []uint{h.ID})
require.NoError(t, err)
}
for _, h := range macosHosts {
err = ds.AddHostsToTeam(ctx, &team.ID, []uint{h.ID})
require.NoError(t, err)
}
// team summary
summary, err = ds.GetLinuxDiskEncryptionSummary(ctx, &team.ID)
require.NoError(t, err)
require.Equal(t, uint(0), summary.Verified)
require.Equal(t, uint(10), summary.ActionRequired)
require.Equal(t, uint(0), summary.Failed)
// no team summary
summary, err = ds.GetLinuxDiskEncryptionSummary(ctx, nil)
require.NoError(t, err)
require.Equal(t, uint(0), summary.Verified)
require.Equal(t, uint(0), summary.ActionRequired)
require.Equal(t, uint(0), summary.Failed)
}