Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions changes/34288-setup-experience-cancel-activity
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
- Added activity when setup experience is canceled due to software install failure
- Added cancel activities for each VPP app install skipped due to setup experience cancellation, and switched "failed" activity to "canceled" for package-based software installs in the same situation
- Added install failure activity when VPP installs fail due to licensing issues during setup experience
2 changes: 2 additions & 0 deletions cmd/fleet/cron.go
Original file line number Diff line number Diff line change
Expand Up @@ -1070,6 +1070,7 @@ func newAppleMDMWorkerSchedule(
commander *apple_mdm.MDMAppleCommander,
bootstrapPackageStore fleet.MDMBootstrapPackageStore,
vppInstaller fleet.AppleMDMVPPInstaller,
newActivityFn fleet.NewActivityFunc,
) (*schedule.Schedule, error) {
const (
name = string(fleet.CronAppleMDMWorker)
Expand All @@ -1087,6 +1088,7 @@ func newAppleMDMWorkerSchedule(
Commander: commander,
BootstrapPackageStore: bootstrapPackageStore,
VPPInstaller: vppInstaller,
NewActivityFn: newActivityFn,
}

w.Register(appleMDM)
Expand Down
2 changes: 1 addition & 1 deletion cmd/fleet/serve.go
Original file line number Diff line number Diff line change
Expand Up @@ -1248,7 +1248,7 @@ func runServeCmd(cmd *cobra.Command, configManager configpkg.Manager, debug, dev
if err := cronSchedules.StartCronSchedule(func() (fleet.CronSchedule, error) {
commander := apple_mdm.NewMDMAppleCommander(mdmStorage, mdmPushService)
vppInstaller := svc.(fleet.AppleMDMVPPInstaller)
return newAppleMDMWorkerSchedule(ctx, instanceID, ds, logger, commander, bootstrapPackageStore, vppInstaller)
return newAppleMDMWorkerSchedule(ctx, instanceID, ds, logger, commander, bootstrapPackageStore, vppInstaller, svc.NewActivity)
}); err != nil {
initFatal(err, "failed to register apple_mdm_worker schedule")
}
Expand Down
6 changes: 3 additions & 3 deletions ee/server/service/devices.go
Original file line number Diff line number Diff line change
Expand Up @@ -319,10 +319,10 @@ func (svc *Service) getHostSetupExperienceStatus(ctx context.Context, host *flee
return nil, ctxerr.Wrap(ctx, err, "listing setup experience results")
}

// Mark canceled items as failed.
err = svc.failCancelledSetupExperienceInstalls(ctx, host.ID, hostUUID, host.DisplayName(), results)
// Add activities for canceled installs + setup experience run
err = svc.recordCanceledSetupExperienceSoftwareActivities(ctx, host.ID, hostUUID, host.DisplayName(), results)
if err != nil {
return nil, ctxerr.Wrap(ctx, err, "failing cancelled setup experience installs")
return nil, ctxerr.Wrap(ctx, err, "recording cancelled setup experience installs")
}

var software []*fleet.SetupExperienceStatusResult
Expand Down
56 changes: 19 additions & 37 deletions ee/server/service/orbit.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,9 +169,8 @@ func (svc *Service) GetOrbitSetupExperienceStatus(ctx context.Context, orbitNode
}
}

err = svc.failCancelledSetupExperienceInstalls(ctx, host.ID, host.UUID, host.DisplayName(), res)
if err != nil {
return nil, ctxerr.Wrap(ctx, err, "failing cancelled setup experience installs")
if err = svc.recordCanceledSetupExperienceSoftwareActivities(ctx, host.ID, host.UUID, host.DisplayName(), res); err != nil {
return nil, ctxerr.Wrap(ctx, err, "recording cancelled setup experience installs")
}

payload := &fleet.SetupExperienceStatusPayload{
Expand Down Expand Up @@ -229,7 +228,7 @@ func (svc *Service) GetOrbitSetupExperienceStatus(ctx context.Context, orbitNode
return payload, nil
}

func (svc *Service) failCancelledSetupExperienceInstalls(
func (svc *Service) recordCanceledSetupExperienceSoftwareActivities(
ctx context.Context,
hostID uint,
hostUUID string,
Expand All @@ -241,51 +240,34 @@ func (svc *Service) failCancelledSetupExperienceInstalls(
continue
}
r.Status = fleet.SetupExperienceStatusFailure
svc.logger.InfoContext(ctx, "marking setup experience software as failed due to cancellation", "host_uuid", hostUUID, "software_name", r.Name)
svc.logger.InfoContext(ctx, "emitting activity for canceled setup experience software", "host_uuid", hostUUID, "software_name", r.Name)
err := svc.ds.UpdateSetupExperienceStatusResult(ctx, r)
if err != nil {
return ctxerr.Wrap(ctx, err, "failing cancelled setup experience software install")
return ctxerr.Wrap(ctx, err, "marking canceled setup experience software install as failed")
}
// TODO -- support recording activity for failed VPP apps as well.
// https://github.com/fleetdm/fleet/issues/34288
if r.IsForSoftwarePackage() {
softwarePackage := ""
var source *string
installerMeta, err := svc.ds.GetSoftwareInstallerMetadataByID(ctx, *r.SoftwareInstallerID)
if err != nil && !fleet.IsNotFound(err) {
return ctxerr.Wrap(ctx, err, "getting software installer metadata for cancelled setup experience software install")
}
if installerMeta != nil {
softwarePackage = installerMeta.Name
// Get the software title to retrieve the source
if installerMeta.TitleID != nil {
title, err := svc.ds.SoftwareTitleByID(ctx, *installerMeta.TitleID, nil, fleet.TeamFilter{})
if err != nil && !fleet.IsNotFound(err) {
return ctxerr.Wrap(ctx, err, "getting software title for cancelled setup experience software install")
}
if title != nil {
source = &title.Source
}
}
}
activity := fleet.ActivityTypeInstalledSoftware{
if err := svc.NewActivity(ctx, nil, fleet.ActivityTypeCanceledInstallSoftware{
HostID: hostID,
HostDisplayName: hostDisplayName,
SoftwareTitle: r.Name,
SoftwarePackage: softwarePackage,
InstallUUID: ptr.ValOrZero(r.HostSoftwareInstallsExecutionID),
Status: "failed",
SelfService: false,
Source: source,
SoftwareTitleID: ptr.ValOrZero(r.SoftwareTitleID),
FromSetupExperience: true,
}); err != nil {
return ctxerr.Wrap(ctx, err, "creating activity for canceled setup experience software install")
}
err = svc.NewActivity(ctx, nil, activity)
if err != nil {
return ctxerr.Wrap(ctx, err, "creating activity for cancelled setup experience software install")
} else if r.IsForVPPApp() {
if err := svc.NewActivity(ctx, nil, fleet.ActivityTypeCanceledInstallAppStoreApp{
HostID: hostID,
HostDisplayName: hostDisplayName,
SoftwareTitle: r.Name,
SoftwareTitleID: ptr.ValOrZero(r.SoftwareTitleID),
FromSetupExperience: true,
}); err != nil {
return ctxerr.Wrap(ctx, err, "creating activity for canceled setup experience VPP app install")
}
}
continue
}

return nil
}

Expand Down
Loading
Loading