Files
fleet/server/service/handler_deprecated_paths.go
T
Jordan Montgomery 356caea6fd 42508 Rename abm to ab in API (#46657)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** Resolves #42508 

Renames abm/apple_business_manager to ab/apple_business in API and
fleetctl. Uses existing renameto logic with a slight twist: added
"inline" option to handle cases particularly where a single object tree
has renames in multiple versions so that we don't break backwards
compatibiility since the default behavior when you have multi-level
renames is a new/old split at the top level

# Checklist for submitter

If some of the following don't apply, delete the relevant line.

- [x] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
See [Changes
files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/guides/committing-changes.md#changes-files)
for more information.

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [x] Timeouts are implemented and retries are limited to avoid infinite
loops
- [x] If paths of existing endpoints are modified without backwards
compatibility, checked the frontend/CLI for any necessary changes

## Testing

- [x] Added/updated automated tests
- [x] Where appropriate, [automated tests simulate multiple hosts and
test for host
isolation](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/reference/patterns-backend.md#unit-testing)
(updates to one hosts's records do not affect another)

- [x] QA'd all new/changed functionality manually

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Canonical Apple Business (AB) API endpoints and CLI:
/api/v1/fleet/ab_tokens, /api/v1/fleet/mdm/apple/ab_public_key, plus new
fleetctl get mdm-ab and fleetctl generate mdm-ab
  * New GitOps/config key: mdm.apple_business
* Admin UI updated to show Apple Business tokens with fleet-based
associations and updated labels

* **Deprecations**
* Legacy ABM endpoints, CLI aliases, and config keys remain supported
but emit deprecation warnings pointing to the new AB equivalents
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-06-03 14:58:17 -04:00

254 lines
9.1 KiB
Go

package service
import (
eu "github.com/fleetdm/fleet/v4/server/platform/endpointer"
)
// deprecatedPathAliases defines deprecated URL path aliases that map old
// (deprecated) paths to their canonical (primary) paths. Each entry causes
// the deprecated path(s) to serve the same handler as the primary path.
//
// These are organized by category:
// - teams → fleets: team CRUD, secrets, agent_options, users, spec
// - team/teams → fleets: policies, schedule (both singular and plural deprecated)
// - queries → reports: query CRUD, spec, report data
// - host queries → reports
// - live queries → reports: run, run_by_identifiers, run_by_names
// - ABM/VPP token teams → fleets
var deprecatedPathAliases = []eu.DeprecatedPathAlias{
// ---- teams → fleets ----
{
Method: "POST", PrimaryPath: "/api/_version_/fleet/spec/fleets",
DeprecatedPaths: []string{"/api/_version_/fleet/spec/teams"},
},
{
Method: "PATCH", PrimaryPath: "/api/_version_/fleet/fleets/{fleet_id:[0-9]+}/secrets",
DeprecatedPaths: []string{"/api/_version_/fleet/teams/{fleet_id:[0-9]+}/secrets"},
},
{
Method: "POST", PrimaryPath: "/api/_version_/fleet/fleets",
DeprecatedPaths: []string{"/api/_version_/fleet/teams"},
},
{
Method: "GET", PrimaryPath: "/api/_version_/fleet/fleets",
DeprecatedPaths: []string{"/api/_version_/fleet/teams"},
},
{
Method: "GET", PrimaryPath: "/api/_version_/fleet/fleets/{id:[0-9]+}",
DeprecatedPaths: []string{"/api/_version_/fleet/teams/{id:[0-9]+}"},
},
{
Method: "PATCH", PrimaryPath: "/api/_version_/fleet/fleets/{id:[0-9]+}",
DeprecatedPaths: []string{"/api/_version_/fleet/teams/{id:[0-9]+}"},
},
{
Method: "DELETE", PrimaryPath: "/api/_version_/fleet/fleets/{id:[0-9]+}",
DeprecatedPaths: []string{"/api/_version_/fleet/teams/{id:[0-9]+}"},
},
{
Method: "POST", PrimaryPath: "/api/_version_/fleet/fleets/{id:[0-9]+}/agent_options",
DeprecatedPaths: []string{"/api/_version_/fleet/teams/{id:[0-9]+}/agent_options"},
},
{
Method: "GET", PrimaryPath: "/api/_version_/fleet/fleets/{id:[0-9]+}/users",
DeprecatedPaths: []string{"/api/_version_/fleet/teams/{id:[0-9]+}/users"},
},
{
Method: "PATCH", PrimaryPath: "/api/_version_/fleet/fleets/{id:[0-9]+}/users",
DeprecatedPaths: []string{"/api/_version_/fleet/teams/{id:[0-9]+}/users"},
},
{
Method: "DELETE", PrimaryPath: "/api/_version_/fleet/fleets/{id:[0-9]+}/users",
DeprecatedPaths: []string{"/api/_version_/fleet/teams/{id:[0-9]+}/users"},
},
{
Method: "GET", PrimaryPath: "/api/_version_/fleet/fleets/{id:[0-9]+}/secrets",
DeprecatedPaths: []string{"/api/_version_/fleet/teams/{id:[0-9]+}/secrets"},
},
// ---- team/teams → fleets (policies) ----
{
Method: "POST", PrimaryPath: "/api/_version_/fleet/fleets/{fleet_id}/policies",
DeprecatedPaths: []string{
"/api/_version_/fleet/team/{fleet_id}/policies",
"/api/_version_/fleet/teams/{fleet_id}/policies",
},
},
{
Method: "GET", PrimaryPath: "/api/_version_/fleet/fleets/{fleet_id}/policies",
DeprecatedPaths: []string{
"/api/_version_/fleet/team/{fleet_id}/policies",
"/api/_version_/fleet/teams/{fleet_id}/policies",
},
},
{
Method: "GET", PrimaryPath: "/api/_version_/fleet/fleets/{fleet_id}/policies/count",
DeprecatedPaths: []string{
"/api/_version_/fleet/team/{fleet_id}/policies/count",
"/api/_version_/fleet/teams/{fleet_id}/policies/count",
},
},
{
Method: "GET", PrimaryPath: "/api/_version_/fleet/fleets/{fleet_id}/policies/{policy_id}",
DeprecatedPaths: []string{
"/api/_version_/fleet/team/{fleet_id}/policies/{policy_id}",
"/api/_version_/fleet/teams/{fleet_id}/policies/{policy_id}",
},
},
{
Method: "POST", PrimaryPath: "/api/_version_/fleet/fleets/{fleet_id}/policies/delete",
DeprecatedPaths: []string{
"/api/_version_/fleet/team/{fleet_id}/policies/delete",
"/api/_version_/fleet/teams/{fleet_id}/policies/delete",
},
},
{
Method: "PATCH", PrimaryPath: "/api/_version_/fleet/fleets/{fleet_id}/policies/{policy_id}",
DeprecatedPaths: []string{"/api/_version_/fleet/teams/{fleet_id}/policies/{policy_id}"},
},
// ---- queries → reports ----
{
Method: "GET", PrimaryPath: "/api/_version_/fleet/reports/{id:[0-9]+}",
DeprecatedPaths: []string{"/api/_version_/fleet/queries/{id:[0-9]+}"},
},
{
Method: "GET", PrimaryPath: "/api/_version_/fleet/reports",
DeprecatedPaths: []string{"/api/_version_/fleet/queries"},
},
{
Method: "GET", PrimaryPath: "/api/_version_/fleet/reports/{id:[0-9]+}/report",
DeprecatedPaths: []string{"/api/_version_/fleet/queries/{id:[0-9]+}/report"},
},
{
Method: "POST", PrimaryPath: "/api/_version_/fleet/reports",
DeprecatedPaths: []string{"/api/_version_/fleet/queries"},
},
{
Method: "PATCH", PrimaryPath: "/api/_version_/fleet/reports/{id:[0-9]+}",
DeprecatedPaths: []string{"/api/_version_/fleet/queries/{id:[0-9]+}"},
},
{
Method: "DELETE", PrimaryPath: "/api/_version_/fleet/reports/{name}",
DeprecatedPaths: []string{"/api/_version_/fleet/queries/{name}"},
},
{
Method: "DELETE", PrimaryPath: "/api/_version_/fleet/reports/id/{id:[0-9]+}",
DeprecatedPaths: []string{"/api/_version_/fleet/queries/id/{id:[0-9]+}"},
},
{
Method: "POST", PrimaryPath: "/api/_version_/fleet/reports/delete",
DeprecatedPaths: []string{"/api/_version_/fleet/queries/delete"},
},
{
Method: "POST", PrimaryPath: "/api/_version_/fleet/spec/reports",
DeprecatedPaths: []string{"/api/_version_/fleet/spec/queries"},
},
{
Method: "GET", PrimaryPath: "/api/_version_/fleet/spec/reports",
DeprecatedPaths: []string{"/api/_version_/fleet/spec/queries"},
},
{
Method: "GET", PrimaryPath: "/api/_version_/fleet/spec/reports/{name}",
DeprecatedPaths: []string{"/api/_version_/fleet/spec/queries/{name}"},
},
// ---- host queries → reports ----
{
Method: "GET", PrimaryPath: "/api/_version_/fleet/hosts/{id:[0-9]+}/reports/{report_id:[0-9]+}",
DeprecatedPaths: []string{"/api/_version_/fleet/hosts/{id:[0-9]+}/queries/{report_id:[0-9]+}"},
},
// ---- live queries → reports ----
{
Method: "POST", PrimaryPath: "/api/_version_/fleet/reports/{id:[0-9]+}/run",
DeprecatedPaths: []string{"/api/_version_/fleet/queries/{id:[0-9]+}/run"},
},
{
Method: "GET", PrimaryPath: "/api/_version_/fleet/reports/run",
DeprecatedPaths: []string{"/api/_version_/fleet/queries/run"},
},
{
Method: "POST", PrimaryPath: "/api/_version_/fleet/reports/run",
DeprecatedPaths: []string{"/api/_version_/fleet/queries/run"},
},
{
Method: "POST", PrimaryPath: "/api/_version_/fleet/reports/run_by_identifiers",
DeprecatedPaths: []string{"/api/_version_/fleet/queries/run_by_identifiers"},
},
{
Method: "POST", PrimaryPath: "/api/_version_/fleet/reports/run_by_names",
DeprecatedPaths: []string{"/api/_version_/fleet/queries/run_by_names"},
},
// ---- team/teams → fleets (schedule) ----
{
Method: "GET", PrimaryPath: "/api/_version_/fleet/fleets/{fleet_id}/schedule",
DeprecatedPaths: []string{
"/api/_version_/fleet/team/{fleet_id}/schedule",
"/api/_version_/fleet/teams/{fleet_id}/schedule",
},
},
{
Method: "POST", PrimaryPath: "/api/_version_/fleet/fleets/{fleet_id}/schedule",
DeprecatedPaths: []string{
"/api/_version_/fleet/team/{fleet_id}/schedule",
"/api/_version_/fleet/teams/{fleet_id}/schedule",
},
},
{
Method: "PATCH", PrimaryPath: "/api/_version_/fleet/fleets/{fleet_id}/schedule/{report_id}",
DeprecatedPaths: []string{
"/api/_version_/fleet/team/{fleet_id}/schedule/{report_id}",
"/api/_version_/fleet/teams/{fleet_id}/schedule/{report_id}",
},
},
{
Method: "DELETE", PrimaryPath: "/api/_version_/fleet/fleets/{fleet_id}/schedule/{report_id}",
DeprecatedPaths: []string{
"/api/_version_/fleet/team/{fleet_id}/schedule/{report_id}",
"/api/_version_/fleet/teams/{fleet_id}/schedule/{report_id}",
},
},
// ---- ABM/VPP token teams → fleets ----
{
Method: "PATCH", PrimaryPath: "/api/_version_/fleet/ab_tokens/{id:[0-9]+}/fleets",
DeprecatedPaths: []string{
"/api/_version_/fleet/ab_tokens/{id:[0-9]+}/teams",
"/api/_version_/fleet/abm_tokens/{id:[0-9]+}/fleets",
"/api/_version_/fleet/abm_tokens/{id:[0-9]+}/teams",
},
},
{
Method: "PATCH", PrimaryPath: "/api/_version_/fleet/vpp_tokens/{id}/fleets",
DeprecatedPaths: []string{"/api/_version_/fleet/vpp_tokens/{id}/teams"},
},
// ---- abm_tokens → ab_tokens ----
{
Method: "POST", PrimaryPath: "/api/_version_/fleet/ab_tokens",
DeprecatedPaths: []string{"/api/_version_/fleet/abm_tokens"},
},
{
Method: "DELETE", PrimaryPath: "/api/_version_/fleet/ab_tokens/{id:[0-9]+}",
DeprecatedPaths: []string{"/api/_version_/fleet/abm_tokens/{id:[0-9]+}"},
},
{
Method: "GET", PrimaryPath: "/api/_version_/fleet/ab_tokens",
DeprecatedPaths: []string{"/api/_version_/fleet/abm_tokens"},
},
{
Method: "GET", PrimaryPath: "/api/_version_/fleet/ab_tokens/count",
DeprecatedPaths: []string{"/api/_version_/fleet/abm_tokens/count"},
},
{
Method: "PATCH", PrimaryPath: "/api/_version_/fleet/ab_tokens/{id:[0-9]+}/renew",
DeprecatedPaths: []string{"/api/_version_/fleet/abm_tokens/{id:[0-9]+}/renew"},
},
{
Method: "GET", PrimaryPath: "/api/_version_/fleet/mdm/apple/ab_public_key",
DeprecatedPaths: []string{"/api/_version_/fleet/mdm/apple/abm_public_key"},
},
}