Skip to main content
Use this page when generating scoped OpenStack application credentials for Fleet Manager automation. The access rules below come directly from the repo runbook and are intended to be copied into Horizon or supplied to the OpenStack CLI.

General Rules

  • Create the credential inside the project that owns the resources
  • Keep a record of the application credential ID and secret when they are generated
  • Apply the path and method rules exactly as written

UNI Attribution Credentials

The OpenStack agent uses three UNI APIs to materialise resource attribution. It authenticates with the UNI mTLS client certificate issued by the UNI deployment. The certificate Secret is delivered to Fleet Manager through Vault and mounted at /etc/uni-certs; private key material must not be stored in Helm values, a ConfigMap, or a checked-in file. The UNI API owners must approve the service account and final read-only role before the certificate is issued. The account should be restricted to the deployment’s region or organisation wherever the UNI API supports that boundary: The deployment configuration supplies the three UNI base URLs and the name of the Kubernetes Secret containing these keys: The UNI deployment owns certificate creation, Vault publication, and rotation. Fleet Manager owns consumption and must not copy the values into repository configuration or expose them in logs. Before production rollout, the API owner and Fleet Manager operator must sign off the access review and perform one non-production certificate rotation exercise:
  1. Issue a replacement certificate with the same approved read-only role.
  2. Publish it to the environment-scoped Vault path and verify the ExternalSecret updates the mounted Secret.
  3. Verify the three read paths and attribution lookups in non-production.
  4. Revoke the previous certificate and record the result in the deployment notes.
The OpenStack agent detects the mounted certificate change and reloads the UNI credentials without requiring a pod restart. The same owner-approved procedure is used for routine rotation and emergency revocation. This contract uses one shared read-only certificate identity for all three APIs; separate Region, Kubernetes, and Identity credentials are not configurable by this ticket.

Ironic Instance Overview

Fleet Manager routes Ironic API calls to two separate Ironic instances:
  • Overcloud — manages GPU_COMPUTE and CPU_BAREMETAL nodes. Always required.
  • Undercloud — manages CPU_HYPERVISOR nodes. Only add if the deployment has FM-managed hypervisor hardware; the OpenStack agent skips the undercloud automatically when no devices at that site map to it.

Create the Credentials

Fleet Manager consumes credentials by reading a clouds.yaml file from 1Password as a document. Each credential uses this shape:

Endpoints behind a private CA

Add cacert_pem — the CA certificate inline — to any cloud whose endpoints present a certificate signed by a private CA. Omit it otherwise; a cloud that names no CA verifies against the public roots. The inline form exists because a clouds.yaml delivered as a 1Password document has no file on disk for the standard cacert path to point at. Introduced for sys2-lon14, the first dual-stack deployment, whose OpenStack endpoints are served by a one-off self-signed CA.

Overcloud credentials (always required)

Source the overcloud OpenStack admin credentials:
Create the application credential (access rules are in the section below):
Create a clouds.yaml with overcloud as the cloud name and upload to 1Password:

Undercloud credentials (only for deployments with CPU_HYPERVISOR nodes)

Source the undercloud OpenStack admin credentials:
Create the application credential (use the same access rules as the overcloud):
Create a clouds.yaml with undercloud as the cloud name and upload to 1Password:

SLURM credentials

Upload the SLURM credential:
Fleet Manager resolves all documents by title; storing the raw credential fields under any other item name is not read by the runtime.

Sentinel Operator Credentials

Sentinel OpenStack access is operator/debug access. Store these read-only credentials in the operators vault, not the runtime service-credential vault:
Sentinel targets the public overcloud Keystone. The internal-only undercloud and SLURM Keystones (10.x) are not reachable from an operator laptop, so Sentinel does not carry credentials for them. Keep runtime service credentials separate:
Preferred creation path:
The command generates the overcloud clouds.yaml and stores it as the [DEPLOYMENT_NAME]-sentinel-openstack-overcloud document. It does not print the one-time Keystone secret unless --print is explicitly passed.

Sentinel overcloud read-only profile

Use this profile for the overcloud Sentinel credential.
Every rule is method: GET — that is the read-only safety boundary, and it holds even though the credential carries the admin role. Admin is required because the overcloud baremetal and placement APIs are admin-scoped: a project reader/member cannot see nodes or resource providers. /** matches every path in the service, which covers ironicclient’s trailing-slash collection requests (GET /v1/nodes/, which a single-segment /v1/* rule misses — Keystone would reject openstack baremetal node list with a 401) and avoids surprise 401s on unlisted read sub-resources during an investigation.
Because the admin role is cross-project, this credential can read the listed services across every tenant — all of Nova and Neutron metadata, not just one project’s. Grant it deliberately, treat the materialized clouds.yaml as sensitive, and where the APIs support it prefer trialling a lower-privilege system-scoped reader credential via --role.
Future Sentinel write access should be added by changing the Keystone access rules for the Sentinel application credential. Do not add partial fleetctl openstack wrappers for OpenStack mutations; use the real OpenStack CLI so Keystone remains the enforcement point.

Project-Prep Admin Credential

The deployment-standup openstack application-credential-create command creates this credential programmatically from the Fleet Manager code. Use this section only when creating the same credential manually in Horizon or with the OpenStack CLI. This credential lets deployment standup create the Fleet Manager project, grant the configured member role, and prepare Nova, Cinder, and Neutron quotas.
Save the YAML above to project_prep_access_rules.yaml and apply it when creating the project-prep admin credential:

Admin Project: Bare Metal and Placement

These permissions are required for Fleet Manager workflows that manage bare-metal inventory through Ironic. Custom traits (e.g. CUSTOM_CUSTOMER_READY) are written via the Ironic node-traits API and also written directly to Placement in time-sensitive flows (quarantine, release, enrolment) where waiting for Nova’s resource sync interval is not acceptable.
The baremetal GET /v1/nodes/*/history rule is newer than most existing site credentials. /v1/nodes/* is a single path segment and does not match /v1/nodes/<uuid>/history, so a credential issued before this rule refuses the call. Node Diagnostics degrades rather than failing — the run still classifies the failure and records history: unsupported in its evidence — but it emits no clean_failed.recurring finding, so a node that has failed the same way before looks like a first occurrence. Add the rule when you next reissue the site’s credential.The endpoint also requires Ironic API microversion 1.78 or newer; older deployments degrade the same way.
The baremetal PATCH /v1/ports/* rule is newer than existing site credentials. Enrolment uses it only to repair an Ironic port that has no local_link_connection, which occurs on hosts with ironic_settings.skip_cable_verification enrolled before cabled links were kept. Recreate each site’s overcloud credential from the YAML above before relying on that repair; until then it fails with an authorisation error and the node stays at inspection.
The network GET /v2.0/ports rule is newer than most existing site credentials, and the Neutron port check that uses it is off by default for exactly that reason. Turn it on in the same change that reissues a site’s credential — set openstack.neutronPortCheckEnabled: true in that site’s satellite values — otherwise the check stays dormant and orphaned ports go on being invisible.The credential must also be admin-scoped (as the overcloud one already is — see the note above). binding:host_id is an admin-only Neutron attribute: a project-scoped token gets no 403, it gets every port in the project with the binding fields stripped. Fleet Manager refuses such a response rather than reporting the whole site as orphaned, so the symptom is a “could not check Neutron” warning, not bad advice.Standalone-Ironic sites run no Neutron at all. Leave the rule out and the flag off there; there is nothing to read.
Save the YAML above to admin_access_rules.yaml and apply it when creating each Ironic credential. For the overcloud (and undercloud if applicable):

Slurm Project: Nova

These permissions are required for the SLURM-side compute integration and Image Node workflows.
Create the SLURM-project credential by saving the YAML above to slurm_access_rules.yaml and then running:

Where These Credentials Are Used

These credentials feed the wider deployment flow:
  • site rollout and secret bootstrap
  • Ironic enrolment and node maintenance operations
  • Ironic node trait updates (CUSTOM_CUSTOMER_READY etc.)
  • Placement inventory and trait reads
  • Node unenrolment (Ironic teardown, Placement RP deletion, Nova deployed-instance check)
  • SLURM-side compute lifecycle actions
Continue with Deploy Fleet Manager at a New Site once the credentials and vault storage are in place.