Skip to content

OS updates: update to latest after deadline (relative to OS release) #39085

Description

@noahtalerman

Goal

User story
As an IT admin managing Apple (macOS, iOS, iPadOS) OS updates,
I want to set a deadline and have Fleet automatically update host's version to match the latest version
so that I can keep my hosts at the latest OS w/o having to bump the version myself.

Changes

Product

Engineering

  • Test plan is finalized
  • Contributor API changes: No changes
  • Feature guide changes: See above
  • Database schema migrations: See subtasks
  • This is a premium only feature: Yes

ℹ️  Please read this issue carefully and understand it. Pay special attention to UI wireframes, especially "dev notes".

QA

Risk assessment

  • Risk level: Low

Test plan

Make sure to go through the list and consider all events that might be related to this story, so we catch edge cases earlier.

Core flow

Platforms to test across: macOS, iOS, iPadOS

MDM

  • Add enforcement OS updates:
    • Custom version (existing behavior)
    • Latest version with deadline_days
  • Remove minimum version OS updates (clear enforcement)
  • Switch between enforcement modes (e.g., Custom → Latest version (based on host hardware)->Off)
  • Verify DDM declaration is resent when a new OS version is detected by GDMF cron
  • Turn Apple MDM on/off while automatic enforcement is configured
  • DEP enrollment with automatic enforcement active (verify update_new_hosts implicit behavior)
  • For mac: Test on Apple Silicon mac, T2 intel mac and pre-t2 Intel mac if possible(This may not be possible and is OK). Validate that the backfill table sets the proper software update device identifier for the type of mac
  • Ensure Update New Hosts to Latest still works as expected with or without the setting enabled

Fleet (Teams)

  • Set automatic enforcement at team level
  • Set different enforcement modes across teams
  • Transfer host between teams with different enforcement policies. Verify correct target version applies
  • Verify behavior works as expected on a team and on no-team/unassigned

Host

  • Host already at or above target version: no enforcement prompt
  • Offline host: enforcement applies when back online
  • DEP-enrolled host with automatic enforcement.
    • What happens? Is the host forced to update during enrollment even with update new hosts to latest disabled? Doc below in Edge Cases

Config

  • GDMF cron polling interval: verify new versions are detected within 24 hours.
  • Activity feed shows entry when Fleet auto-updates the target version Note: confirmed with product no longer a requirement

Retries

  • GDMF endpoint unavailable. Cron retries, doesn't clear existing enforcement
  • Define max retry attempts / backoff for GDMF polling failures

Integrations

  • Webhook fires when automatic enforcement updates the target version (if configured) Note: confirmed with product no longer a requirement

UI

  • Verify that all UI changes specified in the Figma wireframes are correctly implemented
  • Verify expected UI states (loading, empty, error states if applicable)
  • Dropdown with long option names renders correctly at narrow widths
  • Gap between elements (target options and "user experience" should be 24px/1.5rem)
  • "Days after release" input + tooltip renders cleanly
  • Forms:
    • Error states: submit with invalid combos (latest + deadline, semver + deadline_days, deadline_days = (0, negative))
    • Disabled states: fields that should hide/disable based on dropdown selection (e.g., version input hidden in Latest mode)
    • Dynamic views: dropdown selection shows/hides correct fields (date vs. days input)

API

  • Test all API endpoints added or modified in the API changes section of this issue
  • Verify any new API endpoints appear in the list when adding an API-only user. The API endpoints display name, method, and path is the same as listed in the API reference docs
  • Verify error handling for invalid inputs where applicable

GitOps (generate + run)

  • Configure the feature through the UI and run fleetctl generate-gitops
  • Confirm the generated .yml includes the expected fields (compare with YAML changes in the Product section)
  • Modify the generated .yml and run fleetctl gitops
  • Confirm the configuration updates correctly in Fleet
  • Enable GitOps mode and verify the feature behaves correctly
  • Apply YAML with minimum_version: "latest" + deadline_days: 14. This succeeds.
  • Apply YAML with minimum_version: "latest" + deadline: "2025-07-01". This fails with clear error.
  • Apply YAML with no minimum_version. This clears enforcement
  • Backward compat: existing YAML with semver + deadline still works unchanged

Permissions

  • Verify role restrictions are applied correctly for global roles
  • Verify role restrictions are applied correctly for fleet-level roles
  • Premium vs. Free: automatic enforcement options return clear error on Fleet Free
  • Global Admin can set all enforcement modes
  • Team Admin can set enforcement modes for their team
  • Observer/Observer+ cannot modify OS update settings
  • API-only user can set enforcement via API

Edge cases

Supplemental testing

Testing notes

Confirmation

  1. Engineer: Added comment to user story confirming successful completion of test plan (include any special setup, test data, or configuration used during development/testing if applicable).
  2. QA: Added comment to user story confirming successful completion of test plan.
  3. QA: Determined whether this story needs Playwright automation.
    • Needs automation: No -> full OS upgrade (major/minor) would be expensive at the moment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

Status
No status
Status
✅ Ready for release

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions