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:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user