Cherrypick of bugfix for 4.76.0: make software title status counts consistent (#34944)

Cherry-pick PR into `main` from
https://github.com/fleetdm/fleet/pull/34932 that targeted 4.76.0
This commit is contained in:
Martin Angers
2025-10-29 14:56:56 -04:00
committed by GitHub
parent 04675fe725
commit b776398e67
3 changed files with 34 additions and 4 deletions
+8 -1
View File
@@ -178,14 +178,19 @@ upcoming AS (
),
-- select most recent past activities for each host
-- NOTE if you change this logic make sure to change vppAppHostStatusNamedQuery accordingly
past AS (
SELECT
hvsi.host_id,
CASE
WHEN ncr.status = :mdm_status_acknowledged THEN
WHEN hvsi.verification_at IS NOT NULL THEN
:software_status_installed
WHEN hvsi.verification_failed_at IS NOT NULL THEN
:software_status_failed
WHEN ncr.status = :mdm_status_error OR ncr.status = :mdm_status_format_error THEN
:software_status_failed
WHEN ncr.status = :mdm_status_acknowledged THEN
:software_status_pending
ELSE
NULL -- either pending or not installed via VPP App
END AS status
@@ -273,6 +278,8 @@ func vppAppHostStatusNamedQuery(hvsiAlias, ncrAlias, colAlias string) string {
colAlias = " AS " + colAlias
}
// NOTE: if you change this logic, make sure to also change
// GetSummaryHostVPPAppInstalls accordingly.
return fmt.Sprintf(`
CASE
WHEN %sverification_at IS NOT NULL THEN
+25 -3
View File
@@ -392,12 +392,24 @@ func testVPPAppStatus(t *testing.T, ds *Datastore) {
require.Equal(t, cmd3, act.CommandUUID)
require.False(t, act.SelfService)
// both are pending because h2 is not verified yet
summary, err = ds.GetSummaryHostVPPAppInstalls(ctx, nil, vpp1)
require.NoError(t, err)
require.Equal(t, &fleet.VPPAppStatusSummary{Pending: 2, Failed: 0, Installed: 0}, summary)
// mark it as verified
err = ds.SetVPPInstallAsVerified(ctx, h2.ID, cmd3, uuid.NewString())
require.NoError(t, err)
// h2 is now installed
summary, err = ds.GetSummaryHostVPPAppInstalls(ctx, nil, vpp1)
require.NoError(t, err)
require.Equal(t, &fleet.VPPAppStatusSummary{Pending: 1, Failed: 0, Installed: 1}, summary)
// mark the pending request as successful too
// mark the pending request as successful and verified too
createVPPAppInstallResult(t, ds, h1, cmd2, fleet.MDMAppleStatusAcknowledged)
err = ds.SetVPPInstallAsVerified(ctx, h1.ID, cmd2, uuid.NewString())
require.NoError(t, err)
summary, err = ds.GetSummaryHostVPPAppInstalls(ctx, nil, vpp1)
require.NoError(t, err)
@@ -408,18 +420,28 @@ func testVPPAppStatus(t *testing.T, ds *Datastore) {
require.NoError(t, err)
require.Equal(t, &fleet.VPPAppStatusSummary{Pending: 0, Failed: 0, Installed: 0}, summary)
// simulate a successful request for team app vpp2 on h3
// simulate a successful but unverified request for team app vpp2 on h3
cmd4 := createVPPAppInstallRequest(t, ds, h3, vpp2.AdamID, user)
createVPPAppInstallResult(t, ds, h3, cmd4, fleet.MDMAppleStatusAcknowledged)
summary, err = ds.GetSummaryHostVPPAppInstalls(ctx, &team1.ID, vpp2)
require.NoError(t, err)
require.Equal(t, &fleet.VPPAppStatusSummary{Pending: 0, Failed: 0, Installed: 1}, summary)
require.Equal(t, &fleet.VPPAppStatusSummary{Pending: 1, Failed: 0, Installed: 0}, summary)
// verify it as failed
err = ds.SetVPPInstallAsFailed(ctx, h3.ID, cmd4, uuid.NewString())
require.NoError(t, err)
summary, err = ds.GetSummaryHostVPPAppInstalls(ctx, &team1.ID, vpp2)
require.NoError(t, err)
require.Equal(t, &fleet.VPPAppStatusSummary{Pending: 0, Failed: 1, Installed: 0}, summary)
// simulate a successful, failed and pending request for app vpp3 on team
// (h3) and no team (h1, h2)
cmd5 := createVPPAppInstallRequest(t, ds, h3, vpp3.AdamID, user)
createVPPAppInstallResult(t, ds, h3, cmd5, fleet.MDMAppleStatusAcknowledged)
err = ds.SetVPPInstallAsVerified(ctx, h3.ID, cmd5, uuid.NewString())
require.NoError(t, err)
cmd6 := createVPPAppInstallRequest(t, ds, h1, vpp3.AdamID, user)
createVPPAppInstallResult(t, ds, h1, cmd6, fleet.MDMAppleStatusCommandFormatError)
createVPPAppInstallRequest(t, ds, h2, vpp3.AdamID, user)