# index.html.md
# Canonical OpenStack documentation
[Canonical OpenStack](https://canonical.com/openstack) is an enterprise-grade cloud platform that delivers
distilled upstream OpenStack excellence in the form of a human-friendly
product.
Canonical OpenStack provides elastic and on-demand compute, network and storage
resources to serve IT and business computing needs through a self-service
portal or pure upstream OpenStack APIs. It allows for the simplicity and the
power of public cloud workflows in cost-effective and sovereign, on-premise
environments.
Backed by [Sunbeam](https://governance.openstack.org/tc/reference/projects/sunbeam.html), Canonical OpenStack uses fully cloud-native architecture
underneath to isolate individual components from each other and fully decouple
the software from the underlying OS. In the background the product uses
various technologies, open-source projects and other Canonical products that
are required to form an end-to-end cloud solution.
Sunbeam is an upstream OpenStack project hosted under the governance of the
OpenInfra Foundation which aims to lower the barrier to entry for people with
no previous OpenStack background and fully revolutionize the operational
experience.
---
## In this documentation
A hands-on introduction to Canonical OpenStack for new users.
**Step-by-step guides** - learn key operations and customization.
**Technical information** - review the specifications, architecture and more.
**Concepts** - understand the key topics and design of Canonical OpenStack.
---
## Community and commercial usage
Canonical OpenStack is based on Sunbeam - an open source project that warmly
welcomes a free-of-charge usage, constructive feedback, community discussions
and especially contributions.
Click on the following links to engage with the OpenStack engineering team at
Canonical:
* [Report a bug](https://bugs.launchpad.net/snap-openstack/+filebug)
* [Join the community chat](https://matrix.to/#/#openstack-sunbeam:ubuntu.com)
* [Contribute to the project](https://github.com/canonical/snap-openstack)
For a commercial usage, consider visiting the following links instead:
* [Explore Canonical OpenStack](https://canonical.com/openstack)
* [Get Ubuntu Pro subscription for your deployment](https://ubuntu.com/pro/subscribe)
* [Get in touch with Canonical cloud experts for help on your on-going cloud project](https://canonical.com/openstack#get-in-touch)
# index.html.md
# How-to Guides
## Installation
* [Installation](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/install/index.md)
* [Install Canonical OpenStack using the manual bare metal provider](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/install/install-canonical-openstack-using-the-manual-bare-metal-provider.md)
* [Install Canonical OpenStack using Canonical MAAS](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/install/install-canonical-openstack-using-canonical-maas.md)
## Operations
* [Operations](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/index.md)
* [Cluster upgrades](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/cluster-upgrades.md)
* [Deploy a Pure Storage backend](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/deploy-pure-storage-backend.md)
* [Enable and deploy a gated storage backend](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/enable-a-gated-storage-backend.md)
* [Live Migration](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/live-migration.md)
* [Maintenance mode](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/maintenance-mode.md)
* [Manage experimental features](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/manage-experimental-features.md)
* [Removing the primary node](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/removing-the-primary-node.md)
* [Scaling the cluster in](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/scaling-the-cluster-in.md)
* [Scaling the cluster out](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/scaling-the-cluster-out.md)
* [Backup and Restore](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/backup-and-restore.md)
## Optional Features
* [Optional Features](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/index.md)
* [Baremetal as a Service](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/baremetal.md)
* [Containers as a Service](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/caas.md)
* [DNS as a Service](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/dns.md)
* [Images Sync](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/images-sync.md)
* [Instance Recovery](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/instance-recovery.md)
* [LDAP Integration](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/ldap.md)
* [Load Balancer as a Service](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/load-balancer.md)
* [Managing TLS](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/index.md)
* [Object Storage](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/object-storage.md)
* [Observability](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/observability.md)
* [Orchestration](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/orchestration.md)
* [Resource Optimization](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/resource-optimization.md)
* [Secrets as a Service](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/secrets.md)
* [Shared Filesystems as a Service](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/shared-filesystem.md)
* [Telemetry](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/telemetry.md)
* [Ubuntu Pro](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/ubuntu-pro.md)
* [Validation](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/validation.md)
* [Vault](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/vault.md)
## Miscellaneous
* [Miscellaneous](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/index.md)
* [Adding AMD SEV enabled Compute Node](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/adding-amd-sev-enabled-compute-node.md)
* [Configuring SR-IOV](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-sriov.md)
* [Configuring DPDK](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-dpdk.md)
* [Configuring GPU Passthrough](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-gpu-passthrough.md)
* [Configuring vTPM](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-vtpm.md)
* [Configuring The Openstack Dashboard Theme](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-the-openstack-dashboard-theme.md)
* [Backup and restore access to a MAAS deployment](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/backup-and-restore-maas-deployment.md)
* [Bootstrap highly available Juju controller on top of a LXD cluster](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/bootstrap-highly-available-juju-controller-on-top-of-a-lxd-cluster.md)
* [Managing OpenStack Identity Providers](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/identity-provider-enablement.md)
* [Manage workloads with Juju](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-workloads-with-juju.md)
* [Managing deployment manifests](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/managing-deployment-manifests.md)
* [Register the Juju controller](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-external-juju-controllers.md)
* [Unregister the Juju controller](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-external-juju-controllers.md#unregister-the-juju-controller)
* [Manage a proxied environment](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-a-proxied-environment.md)
* [Multi-region deployments](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/multiregion-deployments.md)
* [Reconfigure the Kubernetes API endpoint in Juju](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/reconfigure-k8s-api-endpoint-juju.md)
* [Using an existing Juju controller](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-an-existing-juju-controller.md)
* [Use the EPA orchestrator](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-the-epa-orchestrator.md)
* [Using the OpenStack CLI](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-the-openstack-cli.md)
* [Accessing the OpenStack Dashboard](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-the-openstack-dashboard.md)
## Troubleshooting
* [Troubleshooting](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/troubleshooting/index.md)
* [Inspecting the cluster](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/troubleshooting/inspecting-the-cluster.md)
# index.html.md
# Accessing the OpenStack Dashboard
Once OpenStack has been deployed you can use the OpenStack dashboard
(Horizon) to manage it by using a web UI. To get the URL of the
dashboard use the `dashboard url` command:
```default
sunbeam dashboard url
```
Sample output:
```default
http://10.20.20.2:80/openstack-horizon
```
This URL points to Horizon login page. The credentials to use are stored
in a previously generated credentials file (e.g. `demo-openrc`).
The login page asks for three pieces of information. For example:
**User Name:** `demo` **Password:** \*\*\*\*\*\*\*\* **Domain:** `users`
The password is the value of variable `OS_PASSWORD` in the credentials
file.
The login page looks like this:

After a successful login, you should see the landing page:

You can now start managing your OpenStack cloud (e.g. create additional
users, launch server instances, etc.).
#### IMPORTANT
Uploading images via the dashboard requires the browser to have direct
access to the Glance public endpoint. Ensure this endpoint is reachable
from any machine used to access the dashboard.
# index.html.md
# Miscellaneous
* [Adding AMD SEV enabled Compute Node](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/adding-amd-sev-enabled-compute-node.md)
* [Operations](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/adding-amd-sev-enabled-compute-node.md#operations)
* [Limitations](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/adding-amd-sev-enabled-compute-node.md#limitations)
* [Configuring SR-IOV](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-sriov.md)
* [Overview](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-sriov.md#overview)
* [Prerequisites](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-sriov.md#prerequisites)
* [Manual mode](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-sriov.md#manual-mode)
* [MAAS mode](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-sriov.md#maas-mode)
* [Manifest configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-sriov.md#manifest-configuration)
* [Attaching SR-IOV VFs to Openstack instances](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-sriov.md#attaching-sr-iov-vfs-to-openstack-instances)
* [Disabling SR-IOV](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-sriov.md#disabling-sr-iov)
* [Configuring DPDK](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-dpdk.md)
* [Overview](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-dpdk.md#overview)
* [Prerequisites](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-dpdk.md#prerequisites)
* [Manual mode](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-dpdk.md#manual-mode)
* [MAAS mode](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-dpdk.md#maas-mode)
* [Manifest configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-dpdk.md#manifest-configuration)
* [Openstack instances using DPDK](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-dpdk.md#openstack-instances-using-dpdk)
* [Disabling DPDK](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-dpdk.md#disabling-dpdk)
* [Configuring GPU Passthrough](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-gpu-passthrough.md)
* [Overview](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-gpu-passthrough.md#overview)
* [Prerequisites](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-gpu-passthrough.md#prerequisites)
* [Manual mode](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-gpu-passthrough.md#manual-mode)
* [MAAS mode](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-gpu-passthrough.md#maas-mode)
* [Manifest configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-gpu-passthrough.md#manifest-configuration)
* [Attaching GPUs to Openstack instances](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-gpu-passthrough.md#attaching-gpus-to-openstack-instances)
* [Configuring vTPM](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-vtpm.md)
* [Overview](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-vtpm.md#overview)
* [Prerequisites](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-vtpm.md#prerequisites)
* [Operations](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-vtpm.md#operations)
* [Limitations](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-vtpm.md#limitations)
* [References](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-vtpm.md#references)
* [Configuring The Openstack Dashboard Theme](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-the-openstack-dashboard-theme.md)
* [Overview](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-the-openstack-dashboard-theme.md#overview)
* [Configuring via Manifest](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-the-openstack-dashboard-theme.md#configuring-via-manifest)
* [Post-Deployment Management](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/configuring-the-openstack-dashboard-theme.md#post-deployment-management)
* [Backup and restore access to a MAAS deployment](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/backup-and-restore-maas-deployment.md)
* [Overview](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/backup-and-restore-maas-deployment.md#overview)
* [Backup](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/backup-and-restore-maas-deployment.md#backup)
* [Restore](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/backup-and-restore-maas-deployment.md#restore)
* [Bootstrap highly available Juju controller on top of a LXD cluster](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/bootstrap-highly-available-juju-controller-on-top-of-a-lxd-cluster.md)
* [Requirements](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/bootstrap-highly-available-juju-controller-on-top-of-a-lxd-cluster.md#requirements)
* [Prepare machines](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/bootstrap-highly-available-juju-controller-on-top-of-a-lxd-cluster.md#prepare-machines)
* [Set up a LXD cluster](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/bootstrap-highly-available-juju-controller-on-top-of-a-lxd-cluster.md#set-up-a-lxd-cluster)
* [Bootstrap Juju controllers](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/bootstrap-highly-available-juju-controller-on-top-of-a-lxd-cluster.md#bootstrap-juju-controllers)
* [Register Juju controller in the Sunbeam client](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/bootstrap-highly-available-juju-controller-on-top-of-a-lxd-cluster.md#register-juju-controller-in-the-sunbeam-client)
* [Managing OpenStack Identity Providers](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/identity-provider-enablement.md)
* [Overview](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/identity-provider-enablement.md#overview)
* [Implementation](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/identity-provider-enablement.md#implementation)
* [Requirements](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/identity-provider-enablement.md#requirements)
* [Adding an Identity provider](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/identity-provider-enablement.md#adding-an-identity-provider)
* [Manage workloads with Juju](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-workloads-with-juju.md)
* [Set up the bastion](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-workloads-with-juju.md#set-up-the-bastion)
* [Install and configure the Juju client](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-workloads-with-juju.md#install-and-configure-the-juju-client)
* [Create a Juju controller](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-workloads-with-juju.md#create-a-juju-controller)
* [Deploy an application](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-workloads-with-juju.md#deploy-an-application)
* [Verify the OpenStack server instances](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-workloads-with-juju.md#verify-the-openstack-server-instances)
* [Managing deployment manifests](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/managing-deployment-manifests.md)
* [List manifests](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/managing-deployment-manifests.md#list-manifests)
* [Show a manifest](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/managing-deployment-manifests.md#show-a-manifest)
* [Generate a manifest](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/managing-deployment-manifests.md#generate-a-manifest)
* [Manifest for non-stable deployments](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/managing-deployment-manifests.md#manifest-for-non-stable-deployments)
* [Specify a manifest](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/managing-deployment-manifests.md#specify-a-manifest)
* [Register the Juju controller](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-external-juju-controllers.md)
* [Unregister the Juju controller](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-external-juju-controllers.md#unregister-the-juju-controller)
* [Manage a proxied environment](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-a-proxied-environment.md)
* [Configure for the proxy at the OS level](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-a-proxied-environment.md#configure-for-the-proxy-at-the-os-level)
* [Show proxy settings](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-a-proxied-environment.md#show-proxy-settings)
* [Update proxy settings](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-a-proxied-environment.md#update-proxy-settings)
* [Clear proxy settings](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-a-proxied-environment.md#clear-proxy-settings)
* [Multi-region deployments](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/multiregion-deployments.md)
* [Manual bare metal provider](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/multiregion-deployments.md#manual-bare-metal-provider)
* [Canonical MAAS provider mode](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/multiregion-deployments.md#canonical-maas-provider-mode)
* [Juju cross-controller relations](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/multiregion-deployments.md#juju-cross-controller-relations)
* [Reconfigure the Kubernetes API endpoint in Juju](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/reconfigure-k8s-api-endpoint-juju.md)
* [Overview](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/reconfigure-k8s-api-endpoint-juju.md#overview)
* [Pre-requisites](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/reconfigure-k8s-api-endpoint-juju.md#pre-requisites)
* [Create a new cloud configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/reconfigure-k8s-api-endpoint-juju.md#create-a-new-cloud-configuration)
* [Update the controller cloud configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/reconfigure-k8s-api-endpoint-juju.md#update-the-controller-cloud-configuration)
* [Using an existing Juju controller](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-an-existing-juju-controller.md)
* [Register the Juju controller](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-an-existing-juju-controller.md#register-the-juju-controller)
* [Bootstrap with registered Juju controller](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-an-existing-juju-controller.md#bootstrap-with-registered-juju-controller)
* [Example external Juju configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-an-existing-juju-controller.md#example-external-juju-configuration)
* [Use the EPA orchestrator](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-the-epa-orchestrator.md)
* [System configuration requirements](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-the-epa-orchestrator.md#system-configuration-requirements)
* [Using the OpenStack CLI](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-the-openstack-cli.md)
* [Unprivileged vs admin user credentials](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-the-openstack-cli.md#unprivileged-vs-admin-user-credentials)
* [Accessing the OpenStack Dashboard](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-the-openstack-dashboard.md)
# index.html.md
# Manage workloads with Juju
Once Canonical OpenStack has been deployed, you have the option of managing
workloads manually (i.e. via the `openstack` CLI) or with Juju. This
document shows how to set up the latter: How to manage OpenStack
workloads with Juju.
There is more than one way to proceed depending on your local networking
but in this document a bastion (jump host) will first be created. Juju
workloads will then be managed from that system.
#### TIP
The [Images Sync](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/images-sync.md) feature is a dependency of the Juju
workload feature. Make sure to enable it.
## Set up the bastion
The steps in this section are performed on any host that has already
installed the **openstack** snap. Generally, it would be the host that
you are using as a management client.
Create the bastion:
```default
sunbeam launch --name bastion
Access instance with `ssh -i /home/ubuntu/snap/openstack/477/sunbeam ubuntu@10.20.30.188
```
Send the cloud init file that was generated during cloud deployment to
the bastion. This file provides normal user access to the cloud:
```default
scp -i /home/ubuntu/snap/openstack/current/sunbeam demo-openrc ubuntu@10.20.30.188:/home/ubuntu
```
Finally, log in to the bastion:
```default
ssh -i /home/ubuntu/snap/openstack/current/sunbeam ubuntu@10.20.30.188
```
## Install and configure the Juju client
The steps in this section are performed on the bastion.
Install Juju:
```default
sudo snap install juju
```
Source the cloud init file that was recently transferred:
```default
source demo-openrc
```
Create the file `clouds.yaml` to define the existing cloud:
```yaml
clouds:
sunbeam:
type: openstack
auth-types: [userpass]
regions:
RegionOne:
endpoint: $OS_AUTH_URL
```
Replace `$OS_AUTH_URL` with the value for your environment. It can be
queried in this way:
```default
echo $OS_AUTH_URL
```
Inform Juju about the cloud:
```default
juju add-cloud --client sunbeam ./clouds.yaml
```
Example output:
```default
Cloud "sunbeam" successfully added to your local client.
You will need to add a credential for this cloud (`juju add-credential sunbeam`)
before you can use it to bootstrap a controller (`juju bootstrap sunbeam`) or
to create a model (`juju add-model sunbeam`).
```
Create the file `credentials.yaml` to define your cloud credentials:
```yaml
credentials:
sunbeam:
sunbeam-creds:
auth-type: userpass
username: $OS_USERNAME
password: $OS_PASSWORD
tenant-name: $OS_PROJECT_NAME
project-domain-name: $OS_USER_DOMAIN_NAME
user-domain-name: $OS_USER_DOMAIN_NAME
version: "$OS_AUTH_VERSION"
```
Like before, you can query for the value of each variable. Note that the
value for `version` is in double quotes.
Add your credentials to Juju:
```default
juju add-credential sunbeam --client -f credentials.yaml
```
Example output:
```default
Credential "sunbeam-creds" added locally for cloud "sunbeam".
```
## Create a Juju controller
The steps in this section are also performed on the bastion.
Create a Juju controller, here named `my-controller`:
```default
juju bootstrap sunbeam my-controller
```
End of example output:
```default
Running machine configuration script...
Bootstrap agent now started
Contacting Juju controller at 192.168.122.220 to verify accessibility...
Bootstrap complete, controller "my-controller" is now available
Controller machines are in the "controller" model
Now you can run
juju add-model
to create a new model to deploy workloads.
```
## Deploy an application
You can now use standard Juju practices to manage applications. See the
[Juju documentation](https://juju.is/docs/juju) for help with Juju.
Below, we’ll create a model and add the `ubuntu` application to it.
```default
juju add-model my-model
juju deploy ubuntu --base ubuntu@22.04
```
To inspect the model:
```default
juju status
```
Example output:
```default
Model Controller Cloud/Region Version SLA Timestamp
my-model my-controller sunbeam/RegionOne 3.4.2 unsupported 15:07:44Z
App Version Status Scale Charm Channel Rev Exposed Message
ubuntu 22.04 active 1 ubuntu latest/stable 24 no
Unit Workload Agent Machine Public address Ports Message
ubuntu/0* active idle 0 192.168.122.52
Machine State Address Inst id Base AZ Message
0 started 192.168.122.52 4c147f10-9f9e-449b-b58a-6b9534553e4a ubuntu@22.04 nova ACTIVE
```
Log out of the bastion in preparation for the next section:
```default
exit
```
## Verify the OpenStack server instances
On the client host, via the `openstack` CLI, you can see the OpenStack
server instances that correspond to the workload machine, the Juju controller,
and the bastion (respectively, from top to bottom, in the output below):
```default
openstack server list
+--------------------------------------+--------------------------+--------+-------------------------------------------+--------------------------------------------------------------+-----------+
| ID | Name | Status | Networks | Image | Flavor |
+--------------------------------------+--------------------------+--------+-------------------------------------------+--------------------------------------------------------------+-----------+
| 4c147f10-9f9e-449b-b58a-6b9534553e4a | juju-08056b-my-model-0 | ACTIVE | demo-network=192.168.122.52 | auto-sync/ubuntu-jammy-22.04-amd64-server-20240319-disk1.img | m1.small |
| e0b7858f-4529-442e-8440-b8fde6819347 | juju-8cf50d-controller-0 | ACTIVE | demo-network=192.168.122.220 | auto-sync/ubuntu-jammy-22.04-amd64-server-20240319-disk1.img | m1.medium |
| ba8c4cfe-0e27-4471-9923-a7fbedf774c5 | bastion | ACTIVE | demo-network=10.20.30.188, 192.168.122.32 | ubuntu | m1.tiny |
+--------------------------------------+--------------------------+--------+-------------------------------------------+--------------------------------------------------------------+-----------+
```
# index.html.md
# Configuring DPDK
## Overview
Open vSwitch (OVS) can be configured to use the [DPDK](https://www.dpdk.org) (Data Plane Development
Kit) userspace datapath, achieving increased performance compared to the
standard OVS kernel datapath.
## Prerequisites
### Compatible network adapters and CPU architecture
Please consult the [DPDK supported hardware page](https://core.dpdk.org/supported/) to ensure that your CPU
architecture and network adapters are compatible with DPDK.
### Isolated CPU cores
Canonical Openstack users can specify the desired number of CPU cores that will
be allocated to DPDK. The cores will be distributed based on the NUMA location
of the network interfaces used with DPDK.
Use kernel command line parameters to preconfigure the necessary number of
isolated CPU cores and pay attention to the NUMA nodes:
```default
isolcpus=0-3,16-19
```
If hyperthreading is enabled, make sure to include the CPU siblings as well.
### VT-d / IO-MMU
IO virtualization (for example Intel VT-d or AMD-V) must be enabled in
the system BIOS and then through kernel arguments, using the following:
```default
intel_iommu=on iommu=pt
```
### Huge pages
This feature requires 1GB huge pages to be preconfigured. For example, the
following kernel arguments may be used:
```default
default_hugepagesz=1G hugepagesz=1G hugepages=64
```
Openstack instances that leverage DPDK must request huge pages through
flavor extra specs:
```default
openstack flavor set m1.large --property hw:mem_page_size=large
```
Make sure that the flavor ram size is a multiple of the huge page size (1GB).
Instances configured to use huge pages will be connected to the DPDK datapath
through `vhost-user` interfaces, as opposed to the standard tap devices.
See the [Openstack DPDK documentation](https://docs.openstack.org/neutron/latest/admin/config-ovs-dpdk.html) for more details.
### Network configuration
Physical network interfaces that leverage DPDK are expected to be connected to
OVS bridges, either directly or through bonds.
Make sure to configure the bridges using Netplan or MAAS before enabling DPDK.
Canonical Openstack will pivot the configuration from the system OVS
installation to the snap based OVS service. This requires a currently
[unreleased Netplan change](https://github.com/canonical/netplan/pull/549).
At the same time, the DPDK devices will be persistently bound to the
configured DPDK-compatible driver (vfio-pci by default), at which point
the interfaces will no longer be visible to the host.
As such, the charm will remove the DPDK interfaces from the Netplan
configuration and move bond definitions to OVS.
```default
$ sudo /snap/bin/ovs-vsctl show
53cdbac9-b6e4-40c5-8c12-71a874f3a606
Bridge br0
fail_mode: standalone
datapath_type: netdev
Port br0
Interface br0
type: internal
Port bond0
Interface dpdk-eth1
type: dpdk
options: {dpdk-devargs="0000:06:00.0"}
Interface dpdk-eth2
type: dpdk
options: {dpdk-devargs="0000:07:00.0"}
```
### Snapd
`snapd` 2.72 is required, providing the necessary snap permissions.
## Manual mode
As mentioned in the previous section, network interfaces used with DPDK must
be connected to OVS bridges using Netplan:
```default
bridges:
br0:
macaddress: "00:16:3e:c0:43:a8"
mtu: 1500
interfaces:
- bond0
parameters:
forward-delay: "15"
stp: false
openvswitch: {}
bonds:
bond0:
macaddress: "00:16:3e:c0:43:a8"
mtu: 1500
interfaces:
- eth1
- eth2
```
DPDK can be configured using the following command:
```default
sunbeam configure dpdk
```
The user will need to specify which network interfaces are going to connected
to the DPDK datapath and the amount of system resources to allocate.
Example:
```default
$ sunbeam configure dpdk
Enable OVS DPDK data path, handling packets in userspace. It provides improved performance compared to
the standard OVS kernel data path. DPDK capable network interfaces are required.
Enable and configure DPDK [y/n] (n): y
Configuring DPDK physical interfaces.
WARNING: the specified interfaces will be reconfigured to use a DPDK-compatible driver (vfio-pci by
default) and will no longer be visible to the host.
Any bonds and bridges defined in MAAS/Netplan will be updated to use the new DPDK OVS port.
DPDK candidate interfaces:
* Intel Corporation Ethernet Controller X550 (eno2)
* Mellanox Technologies MT27520 Family [ConnectX-3 Pro] (enp94s0)
* Mellanox Technologies MT27520 Family [ConnectX-3 Pro] (enp94s0d1)
Enable interface DPDK mode? Intel Corporation Ethernet Controller X550 (eno2) [y/n] (n): y
Enable interface DPDK mode? Mellanox Technologies MT27520 Family [ConnectX-3 Pro] (enp94s0) [y/n] (n): y
Enable interface DPDK mode? Mellanox Technologies MT27520 Family [ConnectX-3 Pro] (enp94s0d1) [y/n]
(n): y
The specified number of cores will be allocated to OVS datapath processing, taking into account the
NUMA location of physical DPDK ports. Isolated cpu cores must be preconfigured using kernel parameters.
The number of cores allocated to OVS datapath processing (2):
The specified number of cores will be allocated to OVS control plane processing, taking into account
the NUMA location of physical DPDK ports. Isolated cpu cores must be preconfigured using kernel
parameters.
The number of cores allocated to OVS control plane processing (2):
The total amount of memory in MB to allocate from huge pages for OVS DPDK. The memory will be
distributed across NUMA nodes based on the location of the physical DPDK ports. Currently uses 1GB
pages, make sure to specify a multiple of 1024 and preallocate enough 1GB pages.
The amount of memory in MB allocated to OVS from huge pages (2048): 2048
The DPDK-compatible driver used for DPDK physical ports (vfio-pci):
```
## MAAS mode
Each MAAS network interface connected to the DPDK datapath must contain the
neutron:dpdk tag. Also, it should be connected to an OVS bridge defined in
MAAS, either directly or through a bond.
Apart from that, DPDK can be enabled and configured similarly to the
manual (local) mode.
## Manifest configuration
The DPDK settings can be provided through the Canonical Openstack manifest,
for example:
```default
core:
config:
dpdk:
enabled: true
control_plane_cores: 2
dataplane_cores: 2
memory: 2048
driver: vfio-pci
ports:
my-node.maas:
- eno3
- eno4
```
## Openstack instances using DPDK
Openstack instances must be configured to use huge pages in order to leverage
DPDK.
```default
openstack flavor set m1.large --property hw:mem_page_size=large
```
The instances will then be connected to the DPDK datapath using `vhost-user`
ports:
```default
$ sudo openstack-hypervisor.virsh dumpxml instance-0000000d | grep -i vhost -A 7
$ sudo openstack-hypervisor.ovs-vsctl show
Bridge br-int
fail_mode: secure
datapath_type: netdev
Port vhu90ab19fb-57
Interface vhu90ab19fb-57
type: dpdkvhostuserclient
options: {vhost-server-path="/var/snap/openstack-hypervisor/common/run/libvirt/vhu90ab19fb-57"}
```
## Disabling DPDK
The DPDK feature may be disabled using the following command. Simply specify
“n” when prompted in order to disable DPDK.
```default
sunbeam configure dpdk
Enable OVS DPDK data path, handling packets in userspace. It provides improved performance compared to
the standard OVS kernel data path. DPDK capable network interfaces are required.
Enable and configure DPDK [y/n] (y): n
```
By doing so, the OVS bridges will be set to use the standard system datapath
instead of `netdev` (DPDK).
Note that as part of the DPDK enablement, physical port configuration is moved
from Netplan to OVS and the interfaces are persistently bound to the DPDK
compatible driver (`vfio-pci` by default) using `driverctl`. Those steps
are not reverted automatically, the user may have to manually redefine
bonds and remove the driver overrides. Unbinding the `vfio-pci` driver may
require a host reboot.
At the same time, existing instances will continue to use `vhost-user`
interfaces. Either rebuild or migrate those instances to reconfigure the
port attachments.
# index.html.md
# Using an existing Juju controller
Canonical OpenStack can use an existing Juju controller during bootstrap
instead of deploying a Juju controller within the Canonical OpenStack
deployment.
This allows operators to make use of an existing Juju controller that
could be used to control many Juju deployments of different types of
services - including multiple Canonical OpenStack deployments!
## Register the Juju controller
[Register an existing Juju controller](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-external-juju-controllers.md)
in Sunbeam.
#### NOTE
Ensure a dedicated user is created in the external Juju controller and has
`superuser` permissions granted on this controller.
## Bootstrap with registered Juju controller
Use the option `--controller` with the bootstrap command to make use
of the previously registered Juju controller.
In local mode the roles for the machine still need to be provided during
bootstrap:
```default
sunbeam cluster bootstrap --role compute,storage,control \
--accept-defaults --controller prod-controller-01
```
In MAAS mode the roles are determined by tags on the machines being
deployed, so the roles option is not used:
```default
sunbeam cluster bootstrap --controller prod-controller-01
```
## Example external Juju configuration
An external Juju controller can be bootstrapped on top of a LXD cluster, for example, running
across the same machines that are used in the Canonical OpenStack deployment.
Please refer to the [Bootstrap highly available Juju controller on top of a LXD cluster](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/bootstrap-highly-available-juju-controller-on-top-of-a-lxd-cluster.md) section of this documentation for a detailed procedure on how to accomplish this goal.
# index.html.md
# Managing deployment manifests
This page shows how to manage deployment manifests. For an overview of
manifests, see the [Deployment manifest](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/deployment-manifest.md) page.
#### NOTE
Looking to use a manifest from an edge deployment? Take a look at
[Manifest for non-stable deployments](#manifest-for-non-stable-deployments-4).
## List manifests
To list all manifests, run the following command:
```default
sunbeam manifest list
```
Sample output:
| ID | Applied Date |
|----------------------------------|---------------------|
| c6a6d2ab47ac4c21308483e567d64b04 | 2024-02-05 12:17:59 |
| e446b42859f461e690d66b4d233c1ear | 2024-02-06 07:39:38 |
## Show a manifest
To view the content of a manifest, run the following command:
```default
sunbeam manifest show
```
Sample output:
```text
software:
charms:
keystone-k8s:
channel: 2024.1/candidate
glance-k8s:
channel: 2024.1/candidate
```
To get the latest manifest, use the keyword `latest` instead of the
manifest ID:
```default
sunbeam manifest show latest
```
## Generate a manifest
A manifest file can be generated using the below command:
```default
sunbeam manifest generate --manifest-file
```
The generated manifest will be written to ``.
## Manifest for non-stable deployments
Manifest files for the `candidate` and `edge` risks can be found in:
```default
/snap/openstack/current/etc/manifests/candidate|edge.yml
```
A manifest with complete channel information is needed to deploy on
candidate or edge channels.
## Specify a manifest
A manifest is specified by means of the `--manifest` option. There are
three supported use cases.
### Cluster bootstrap
To specify a manifest during the cluster bootstrap process:
```default
sunbeam cluster bootstrap [--role ] [--manifest ] [--accept-defaults]
```
### Cluster refresh
To specify a manifest during a cluster refresh (update) process:
```default
sunbeam cluster refresh [--manifest ] [--clear-manifest] [--upgrade-release]
```
Only components managed via Terraform can be changed (bootstrap options
will be immutable at this point).
#### NOTE
A manifest update must be accompanied by a complete manifest file
(i.e. not a delta).
### Feature enablement
To specify a manifest during the enablement (or post-enablement) of a
feature:
```default
sunbeam enable [--manifest ] []
```
A post-enablement invocation implies a manifest update.
#### NOTE
A manifest update must be accompanied by a complete manifest file
(i.e. not a delta).
# index.html.md
# Register the Juju controller
As a prerequisite, perform the following steps in existing Juju
controller
- [Add a Juju
user](https://juju.is/docs/juju/manage-users).
- [Grant necessary
permissions](https://juju.is/docs/juju/juju-grant) to the Juju
user.
For example:
```text
juju add-user sunbeam
juju grant -c CONTROLLER sunbeam superuser
```
`CONTROLLER` is a name of the Juju controller.
Adding the Juju user will generate a registration token which is
required to register the Juju controller in the Sunbeam deployment.
To register the controller in Sunbeam use the `register-controller`
command:
```default
sunbeam juju register-controller NAME TOKEN
```
`NAME` is an arbitrary name to refer the Juju controller in
Sunbeam.
`TOKEN` is the registration token generated during Juju user creation.
For example, to register an existing controller with the name
`prod-controller-01` using a token generated as detailed above:
```default
sunbeam juju register-controller prod-controller-01 \
Tm90IGEgcGFzc3dkIGlmIHlvdSBjYXJlIHRvIGRlY29kZSB0aGlzCg==
```
# Unregister the Juju controller
To unregister the controller in Sunbeam use the
`unregister-controller` command:
```default
sunbeam juju unregister-controller NAME
```
For example, to unregister an existing controller with the name
`prod-controller-01`:
```default
sunbeam juju unregister-controller prod-controller-01
```
# index.html.md
# Configuring GPU Passthrough
## Overview
The GPU passthrough allows full access and direct control of physical GPU
device in guests. The guests should have the corresponding drivers to use
the devices.
## Prerequisites
1. Enable the VT-d settings in BIOS.
2. Add the following kernel parameters.
```default
intel_iommu=on amd_iommu=on
```
## Manual mode
Canonical Openstack will determine if there are any GPU devices. [PCI device
classes](https://admin.pci-ids.ucw.cz/read/PD/) of type Display Controller (0x03) and Processing Accelerators (0x1200)
are filtered as GPU devices. The devices are automatically added to
[Nova PCI passthrough list](https://docs.openstack.org/nova/latest/admin/pci-passthrough.html) and no user intervention is required.
## MAAS mode
MAAS mode works similar to Manual mode and the detected GPU devices are added
to [Nova PCI passthrough list](https://docs.openstack.org/nova/latest/admin/pci-passthrough.html) with no user intervention.
Ensure that MAAS is configured to apply the necessary kernel parameters.
## Manifest configuration
Arbitrary PCI devices may be allowed through the Canonical Openstack manifest.
Example:
```default
pci:
device_specs:
- address: "0000:4b:00.0"
vendor_id: "10de"
product_id: "1db4"
excluded_devices:
r740-dc1-ceph.maas:
- "0000:19:00.0"
- "0000:19:00.1"
- "0000:1b:00.1"
- "0000:5e:00.0"
aliases:
- vendor_id: "10de"
product_id: "1db4"
device_type: type-PCI
name: "nvidia-gpu"
```
The device spec filters are highly flexible and can contain PCI address wildcards
or PCI vendor/product IDs. See the [Nova device spec reference](https://docs.openstack.org/nova/latest/configuration/config.html#pci.device_spec) for more details.
The device list will be applied to all the compute nodes. If needed, use
the exclusion list to define per-node lists of devices that should not be
exposed to Openstack instances.
Configured [PCI device aliases](https://docs.openstack.org/nova/latest/configuration/config.html#pci.alias) may be requested through Nova flavor extra specs.
## Attaching GPUs to Openstack instances
Create a flavor with pci_passthrough:alias property.
In the below example, the property is set on an existing flavor.
```default
openstack flavor set m1.tiny --property "pci_passthrough:alias"="nvidia-gpu:1"
```
Launch a demo instance:
```default
sunbeam launch --name test
```
Verify the Libvirt domain:
```default
$ sudo openstack-hypervisor.virsh dumpxml instance-00000001 | grep "hostdev mode='subsystem' type='pci'" -A 7
```
Verify the PCI device in the guest:
```default
$ ssh -i /home/ubuntu/snap/openstack/x1/sunbeam ubuntu@172.16.2.115 sudo lspci -nn
...
...
04:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)
...
...
```
Above example shows the passthrough device Nvidia 3D controller in the guest.
# index.html.md
# Bootstrap highly available Juju controller on top of a LXD cluster
Canonical Juju does not yet support controller HA modeling capabilities when deployed on top
Kubernetes. This means that Canonical OpenStack clouds deployed using the
[manual bare metal provider](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/install/install-canonical-openstack-using-the-manual-bare-metal-provider.md)
do not provide HA for all types of governance functions by default. To bypass this
limitation Canonical recommends using an external highly available Juju controller. Such a
controller can be bootstrapped on top of a LXD cluster, for example, running across the same
machines that are used in the Canonical OpenStack deployment.
This how-to guide provides all necessary information on how to perform aforementioned actions.
## Requirements
You will need:
* at least three dedicated physical machines with:
* hardware specifications matching minimum hardware specifications for the *Cloud* node as documented under the [Enterprise requirements](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/enterprise-requirements.md) section
* fresh Ubuntu Server 24.04 LTS installed
## Prepare machines
All machines have to be configured first to use [bridges](https://ubuntu.com/server/docs/configuring-networks#bridging-multiple-interfaces) instead of physical network interfaces on the Generic network.
For example, to prepare the *cloud-1* machine from the example configuration section, execute the following commands:
```text
sudo bash -c 'cat < /etc/netplan/config.yaml
network:
bridges:
br0:
addresses:
- 172.16.1.101/24
interfaces:
- eno1
routes:
- to: default
via: 172.16.1.1
nameservers:
addresses:
- 8.8.8.8
search:
- example.com
ethernets:
eno1:
set-name: eno1
eno2:
set-name: eno2
version: 2
EOF'
sudo netplan apply
```
## Set up a LXD cluster
In the first step, set up a [LXD cluster](https://canonical.com/lxd) across at least three machines.
### Bootstrap the cluster
To bootstrap the cluster, execute the `lxd init` command on the first machine in the cluster (aka primary node):
```text
lxd init
```
When prompted, answer some interactive questions. Below is a sample output from the *cloud-1* machine from the [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md):
```text
Would you like to use LXD clustering? (yes/no) [default=no]: yes
What IP address or DNS name should be used to reach this server? [default=172.16.1.101]: 172.16.1.101
Are you joining an existing cluster? (yes/no) [default=no]: no
What member name should be used to identify this server in the cluster? [default=cloud-1]: cloud-1
Do you want to configure a new local storage pool? (yes/no) [default=yes]: yes
Name of the storage backend to use (btrfs, dir, lvm, zfs) [default=zfs]: zfs
Create a new ZFS pool? (yes/no) [default=yes]: yes
Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]: no
Size in GiB of the new loop device (1GiB minimum) [default=30GiB]: 30GiB
Do you want to configure a new remote storage pool? (yes/no) [default=no]: no
Would you like to connect to a MAAS server? (yes/no) [default=no]: no
Would you like to configure LXD to use an existing bridge or host interface? (yes/no) [default=no]: yes
Name of the existing bridge or host interface: br0
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]: yes
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: no
```
Refer to the [LXD documentation](https://documentation.ubuntu.com/lxd/en/latest/) for detailed description of each of those questions and some examples.
### Create registration tokens
Registration tokens have to be created first for the other machine to be able to join the newly bootstrapped cluster.
In order to create a registration token for the new machine, execute the `lxc cluster add` command on the primary node:
```text
lxc cluster add NAME
```
`NAME` is the name of the machine being added.
For example, to create a registration token for the *cloud-2* machine from the [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md) section, execute the following command on the *cloud-1* machine:
```text
lxc cluster add cloud-2
```
Sample output (token):
```text
Member cloud-2 join token:
eyJzZXJ2ZXJfbmFtZSI6ImNsb3VkLTIuZXhhbXBsZS5jb20iLCJmaW5nZXJwcmludCI6IjFhZmYyZGQ3ZDhmZmUwZWE1MzliODA2ZWExNmE4NTRlYTBmYmNjZDU1MTJjYjlmMTk1YmU4YTY4ZTZkYzRkNzYiLCJhZGRyZXNzZXMiOlsiY2xvdWQtMS5leGFtcGxlLmNvbTo4NDQzIl0sInNlY3JldCI6ImYxZmIzMzcxOTlmZmRlNmIzMjYwYjQ1NGY5MTBmNTJhMzE3NGE2OTQ2MTAwMzU1OGU2ZmM3YjEyNDA2NmU2ZWIiLCJleHBpcmVzX2F0IjoiMjAyNC0xMS0wNFQxNToxNDoxOC4zMDE4NTEwNThaIn0=
```
Remember the value of the token. It will be needed in the next step of this how-to guide.
### Add machines to the cluster
Now that the cluster has been bootstrapped and registration tokens have been created, other machines should be able to join the cluster.
To join the cluster, execute the `sudo lxd init` command on all remaining machines:
```text
sudo lxd init
```
When prompted, answer some interactive questions. Below is a sample output from the *cloud-2* machine from the [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md):
```text
Installing LXD snap, please be patient.
Would you like to use LXD clustering? (yes/no) [default=no]: yes
What IP address or DNS name should be used to reach this server? [default=172.16.1.102]: 172.16.1.102
Are you joining an existing cluster? (yes/no) [default=no]: yes
Do you have a join token? (yes/no/[token]) [default=no]: yes
Please provide join token: eyJzZXJ2ZXJfbmFtZSI6ImNsb3VkLTIiLCJmaW5nZXJwcmludCI6IjI5Y2UzNzJmYzVkZDg4ODE3NmMxNTNmYTc2OGJlOGJhMjIyNWQ1MGY5NWY2NmUwZTdlNDc4YzM3ODA1Y2U5MmIiLCJhZGRyZXNzZXMiOlsiMTcyLjE2LjEuMTAxOjg0NDMiXSwic2VjcmV0IjoiNjAxNjZmMDY0ODg4Y2ZkY2U1NzZiODgzMmYwYjRlNmVhYzZiOWY1MTU4Nzk3ZDE4MWM3YWFmMTAwZTVjY2ZjYSIsImV4cGlyZXNfYXQiOiIyMDI0LTExLTA0VDE1OjQ4OjU1LjQxMjg1NTg4OFoifQ==
All existing data is lost when joining a cluster, continue? (yes/no) [default=no] yes
Choose "size" property for storage pool "local":
Choose "source" property for storage pool "local":
Choose "zfs.pool_name" property for storage pool "local":
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: no
```
Refer to the [LXD documentation](https://documentation.ubuntu.com/lxd/en/latest/) for detailed description of each of those questions and some examples.
### Verify cluster setup
To verify cluster setup, execute the `lxc cluster list` command on any machine in the cluster:
```text
lxc cluster list
```
You should be able to see all machines being used.
Sample output (based on the [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md) section):
```text
+---------+---------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+
| NAME | URL | ROLES | ARCHITECTURE | FAILURE DOMAIN | DESCRIPTION | STATE | MESSAGE |
+---------+---------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+
| cloud-1 | https://172.16.1.101:8443 | database-leader | x86_64 | default | | ONLINE | Fully operational |
| | | database | | | | | |
+---------+---------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+
| cloud-2 | https://172.16.1.102:8443 | database | x86_64 | default | | ONLINE | Fully operational |
+---------+---------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+
| cloud-3 | https://172.16.1.103:8443 | database | x86_64 | default | | ONLINE | Fully operational |
+---------+---------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+
```
### Set trust password
Finally, set a trust password so that the cluster can later be registered as a Juju cloud by executing the following command on the primary node:
```text
lxc config set core.trust_password PASSWORD
```
`PASSWORD` is the trust password.
For example:
```text
lxc config set core.trust_password mytrustpassword
```
## Bootstrap Juju controllers
In the next step, bootstrap highly available [Juju controllers](https://juju.is/) across all machines in the cluster.
### Create system account
#### NOTE
Canonical OpenStack cannot be installed under the same system account that is used to perform the initial bootstrap of the external Juju controller. As a result, dedicated system account has to be created first.
To create a dedicated system account and to switch into it, execute the following commands on the primary node:
```text
sudo groupadd bootstrap
sudo useradd -m -g bootstrap -s /bin/bash bootstrap
sudo usermod -a -G lxd,sudo bootstrap
sudo passwd bootstrap
sudo -i
su bootstrap
cd
```
### Install the snap
Then, install the `juju` snap:
```text
sudo snap install juju
```
### Register the LXD cluster as a Juju cloud
Later, register the newly bootstrapped LXD cluster as a Juju cloud by performing the following actions.
Add the LXD cluster to the local LXC config:
```text
lxc remote add NAME IP --password PASSWORD
```
`NAME` is the name of the LXD cluster.
`IP` is the IP address of the primary node in the cluster.
`PASSWORD` is the trust password that was set in one of the previous steps.
When prompted, type `y`.
For example, to register the LXD cluster from the [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md) section as `mylxdcluster` cloud, execute the following commands:
```text
$ lxc remote add mylxdcluster 172.16.1.101 --password mytrustpassword
Certificate fingerprint: 29ce372fc5dd888176c153fa768be8ba2225d50f95f66e0e7e478c37805ce92b
ok (y/n/[fingerprint])? y
```
You should now be able to see `mylxdcluster` on the list of available Juju clouds:
```text
$ juju clouds
Only clouds with registered credentials are shown.
There are more clouds, use --all to see them.
You can bootstrap a new controller using one of these clouds...
Clouds available on the client:
Cloud Regions Default Type Credentials Source Description
localhost 1 localhost lxd 0 built-in LXD Container Hypervisor
mylxdcluster 1 default lxd 0 built-in LXD Cluster
```
### Bootstrap a Juju controller
To bootstrap a Juju controller on the `mylxdclluster` cloud, execute the following command on the primary node:
```text
juju bootstrap mylxdcluster
```
One finished, you should be able to see the following message on the screen:
```text
Bootstrap complete, controller "mylxdcluster-default" is now available
Controller machines are in the "controller" model
Now you can run
juju add-model
to create a new model to deploy workloads.
```
### Make the controller highly available
To make the controller highly available, execute the following command on the primary node:
```text
juju enable-ha
```
Sample output:
```text
maintaining machines: 0
adding machines: 1, 2
```
The rest now happens in the background. Once finished, you should be able to see your Juju controller being highly available (indicated by `3` under the `HA` column):
```text
$ juju controllers --refresh
Controller Model User Access Cloud/Region Models Nodes HA Version
mylxdcluster-default* - admin superuser mylxdcluster/default 1 3 3 3.5.4
```
#### WARNING
**Bug 1969667**
At the moment, due to [lp1969667](https://bugs.launchpad.net/juju/+bug/1969667), LXC containers hosting Juju controller units do not get distributed equally across all nodes in the LXD cluster by default.
To workaround the aforementioned issue, run the `lxc list` command first:
```text
lxc list
```
Sample output:
```text
+---------------+---------+---------------------+------+-----------+-----------+----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | LOCATION |
+---------------+---------+---------------------+------+-----------+-----------+----------+
| juju-e4ce90-0 | RUNNING | 172.16.1.248 (eth0) | | CONTAINER | 0 | cloud-1 |
+---------------+---------+---------------------+------+-----------+-----------+----------+
| juju-e4ce90-1 | RUNNING | 172.16.1.249 (eth0) | | CONTAINER | 0 | cloud-2 |
+---------------+---------+---------------------+------+-----------+-----------+----------+
| juju-e4ce90-2 | RUNNING | 172.16.1.250 (eth0) | | CONTAINER | 0 | cloud-2 |
+---------------+---------+---------------------+------+-----------+-----------+----------+
```
As you can see the `juju-e4ce90-2` container runs on the `cloud-2` node, while it should run on the `cloud-3` node instead.
To move the `juju-e4ce90-2` container from `cloud-2` to `cloud-3`, execute the following commands:
```text
lxc stop juju-e4ce90-2
lxc move juju-e4ce90-2 --target cloud-3
lxc start juju-e4ce90-2
```
At this point you should be able to see all three containers being equally distributed across all the nodes forming the LXD cluster:
```text
$ lxc list
+---------------+---------+---------------------+------+-----------+-----------+----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | LOCATION |
+---------------+---------+---------------------+------+-----------+-----------+----------+
| juju-e4ce90-0 | RUNNING | 172.16.1.248 (eth0) | | CONTAINER | 0 | cloud-1 |
+---------------+---------+---------------------+------+-----------+-----------+----------+
| juju-e4ce90-1 | RUNNING | 172.16.1.249 (eth0) | | CONTAINER | 0 | cloud-2 |
+---------------+---------+---------------------+------+-----------+-----------+----------+
| juju-e4ce90-2 | RUNNING | 172.16.1.250 (eth0) | | CONTAINER | 0 | cloud-3 |
+---------------+---------+---------------------+------+-----------+-----------+----------+
```
### Create necessary credentials for the Sunbeam client
To be able to use the newly bootstrapped, highly available Juju controller in the Sunbeam client, [add a new user](https://juju.is/docs/juju/manage-users#add-a-user) to the controller and [grant necessary permissions](https://juju.is/docs/juju/juju-grant) (`superuser`) to this user on the controller.
To add a new user, run:
```text
juju add-user sunbeam
```
Sample output:
```text
User "sunbeam" added
Please send this command to sunbeam:
juju register MHwTB3N1bmJlYW0wPBMSMTcyLjE2LjEuMTIxOjE3MDcwExIxNzIuMTYuMS4xMjI6MTcwNzATEjE3Mi4xNi4xLjEyMzoxNzA3MAQgJIknLboGwWOWObzGW1NFQ45z_TnBIEKt5kwfDL7ZSLsTD215Y2xvdWQtZGVmYXVsdBMA
"sunbeam" has not been granted access to any models. You can use "juju grant" to grant access.
```
Remember the value of the token from the output as it will be needed in next steps.
To grant the user necessary permissions, run:
```text
juju grant -c mylxdcluster-default sunbeam superuser
```
## Register Juju controller in the Sunbeam client
First, log out from the `bootstrap` account:
```text
exit
```
To register `mylxdcluster-default` controller in the Sunbeam client, execute the following command:
```text
sunbeam juju register-controller mylxdcluster-default TOKEN
```
Replace `TOKEN` with the token obtained when creating the `sunbeam` user.
For example:
```text
sunbeam juju register-controller mylxdcluster-default MHwTB3N1bmJlYW0wPBMSMTcyLjE2LjEuMTIxOjE3MDcwExIxNzIuMTYuMS4xMjI6MTcwNzATEjE3Mi4xNi4xLjEyMzoxNzA3MAQgJIknLboGwWOWObzGW1NFQ45z_TnBIEKt5kwfDL7ZSLsTD215Y2xvdWQtZGVmYXVsdBMA
```
At this point, you can bootstrap Canonical OpenStack cluster with Sunbeam while using the
`mylxdcluster-default` controller.
For example:
```text
sunbeam cluster bootstrap --role control,compute,storage --controller mylxdcluster-default
```
# index.html.md
# Configuring vTPM
## Overview
Virtual Trusted Platform Module (vTPM) support allows OpenStack instances to
use an emulated TPM device.
## Prerequisites
* Enable the [Vault](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/vault.md) feature.
* Enable the [Secrets as a Service](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/secrets.md) feature.
* Use an image that supports UEFI firmware.
## Operations
Configure a flavor and an image for vTPM usage.
### Validate compute host support
List the TPM traits advertised by a compute host:
```default
COMPUTE_UUID=$(openstack resource provider list --name -f value -c uuid)
openstack resource provider trait list $COMPUTE_UUID | grep SECURITY_TPM
```
The command should return the supported TPM versions:
```default
| COMPUTE_SECURITY_TPM_1_2 |
| COMPUTE_SECURITY_TPM_2_0 |
```
### Flavor properties
Configure a flavor with the TPM version and model to expose to the instance:
To set the properties on an existing flavor, run:
```default
openstack flavor set FLAVORNAME \
--property hw:tpm_version=2.0 \
--property hw:tpm_model=tpm-crb
```
To create a new flavor with the same properties, run:
```default
openstack flavor create FLAVORNAME \
--ram RAM \
--disk DISK \
--vcpus VCPUS \
--property hw:tpm_version=2.0 \
--property hw:tpm_model=tpm-crb
```
#### NOTE
The `tpm-crb` model is only compatible with TPM version `2.0`.
### Image properties
Configure the image to use UEFI firmware:
```default
openstack image set --property hw_firmware_type=uefi IMAGENAME
```
### Launch an instance
Launch an instance using the flavor and image configured above:
```default
openstack server create \
--flavor FLAVORNAME \
--image IMAGENAME \
--network NETWORK \
SERVERNAME
```
### Verify vTPM in the guest
After the instance boots, log in to the guest and check for TPM devices:
```default
ls -l /dev/tpm*
```
The guest should show devices such as `/dev/tpm0` and `/dev/tpmrm0`.
## Limitations
* The image must use UEFI firmware.
* The `tpm-crb` model requires TPM version `2.0`.
## References
For more information about vTPM in OpenStack, see the upstream Nova
documentation:
* [Emulated Trusted Platform Module](https://docs.openstack.org/nova/latest/admin/emulated-tpm.html)
* [Extra Specs](https://docs.openstack.org/nova/latest/configuration/extra-specs.html)
* [Useful image properties](https://docs.openstack.org/glance/latest/admin/useful-image-properties.html)
# index.html.md
# Configuring SR-IOV
## Overview
The Single Root I/O Virtualization (SR-IOV) specification allows splitting
a single physical port (called physical function or PF) into multiple virtual
ports known as virtual functions or VFs.
VFs as well as PFs can be assigned to Openstack instances, bypassing the
host network stack and significantly improving performance while reducing
host resource usage.
Hardware offloading, also known as switchdev mode, is a mechanism that
enables Open vSwitch (OVS) flows to be offloaded directly to the Virtual
Function (VF). This approach combines the performance advantages of SR-IOV
with the flexibility of OVS, allowing VFs to be added to the OVS bridge. As
a result, it supports the full OVN stack and facilitates overlay tenant
networks that rely on tunneling protocols such as VXLAN or Geneve.
## Prerequisites
1. Make sure that the network adapters support SR-IOV and optionally the
hardware offloading feature.
1. Enable the SR-IOV and VT-d settings in BIOS.
3. Add the following kernel parameters, allowing VFs to be exposed to virtual
machines.
```default
intel_iommu=on iommu=pt pci=realloc pci=assign-busses
```
1. Optional: enable switchdev mode.
In this example, we are configuring a Mellanox ConnectX-6 device. Please
check your vendor documentation for other network adapter models.
```default
ifname=enp3s0f0np0
pciaddr=0000:02:00.0
sudo devlink dev eswitch set pci/${pciaddr} mode switchdev
sudo ethtool -K $ifname hw-tc-offload on
```
Verify that hardware offloading is enabled:
```default
sudo devlink dev eswitch show pci/${pciaddr}
# output #
pci/0000:03:00.0: mode switchdev inline-mode none encap-mode basic
```
```default
sudo ethtool -k $ifname | grep hw-tc-offload
# output #
hw-tc-offload: on
```
1. Initialize the desired number of VFs
```default
echo '4' | sudo tee /sys/class/net/${ifname}/device/sriov_numvfs
```
This setting can be added to the Netplan configuration in order to survive reboots:
```default
enp3s0f0np0:
virtual-function-count: 4
embedded-switch-mode: "switchdev"
```
Verify that the VFs were created successfully:
```default
$ sudo lshw -class net -businfo
# output #
Bus info Device Class Description
============================================================
pci@0000:04:00.0 enp3s0f0np0 network MT2892 Family [ConnectX-6 Dx]
pci@0000:04:00.1 enp3s0f1np1 network MT2892 Family [ConnectX-6 Dx]
pci@0000:04:00.2 enp4s0f0v0 network ConnectX Family mlx5Gen Virtual Function
pci@0000:04:00.3 enp4s0f0v1 network ConnectX Family mlx5Gen Virtual Function
pci@0000:04:00.4 enp4s0f0v2 network ConnectX Family mlx5Gen Virtual Function
pci@0000:04:00.5 enp4s0f0v3 network ConnectX Family mlx5Gen Virtual Function
pci@0000:01:00.0 eno1 network 82599ES 10-Gigabit SFI/SFP+ Network Connection
pci@0000:01:00.1 eno2 network 82599ES 10-Gigabit SFI/SFP+ Network Connection
pci@0000:08:00.0 eno3 network I350 Gigabit Network Connection
pci@0000:08:00.1 eno4 network I350 Gigabit Network Connection
pci@0000:82:00.0 enp130s0f0 network Ethernet 10G 2P X520 Adapter
pci@0000:82:00.1 enp130s0f1 network Ethernet 10G 2P X520 Adapter
pci@0000:04:00.0 enp4s0f0r0 network Ethernet interface
pci@0000:04:00.0 enp4s0f0r1 network Ethernet interface
pci@0000:04:00.0 enp4s0f0r2 network Ethernet interface
pci@0000:04:00.0 enp4s0f0r3 network Ethernet interface
```
If hardware offloading is enabled, additional [representor functions](https://docs.kernel.org/networking/representors.html) may be
automatically created for each VF.
1. Ensure that you’re using `snapd` 2.71 or later.
## Manual mode
Canonical Openstack will determine if there are any SR-IOV capable
network devices.
If so, the user will be asked to specify which SR-IOV devices should be
exposed to Openstack tenants and the name of the corresponding Neutron
physical network, also known as physnet.
No physnet should be specified when using hardware offloading and overlay
networks such as VXLAN or Geneve.
Example:
```default
sunbeam cluster bootstrap --role control,compute
# output #
# ...
Configure SR-IOV? [y/n] (n): y
Found the following SR-IOV capable devices:
[ ] Mellanox Technologies MT2892 Family [ConnectX-6 Dx] (enp3s0f0np0) [physnet: None]
[ ] Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (eno1) [physnet: None]
[ ] Mellanox Technologies MT2892 Family [ConnectX-6 Dx] (enp3s0f1np1) [physnet: None]
[ ] Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (eno2) [physnet: None]
[ ] Intel Corporation Ethernet 10G 2P X520 Adapter (enp130s0f0) [physnet: None]
[ ] Intel Corporation Ethernet 10G 2P X520 Adapter (enp130s0f1) [physnet: None]
Add network adapter to PCI whitelist? Mellanox Technologies MT2892 Family [ConnectX-6 Dx] (enp3s0f0np0) [y/n] (n): y
Specify the physical network for Mellanox Technologies MT2892 Family [ConnectX-6 Dx] (enp3s0f0np0) or pass 'no-physnet' if using hardware offloading with overlay networks: no-physnet
Add network adapter to PCI whitelist? Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (eno1) [y/n] (n):
Add network adapter to PCI whitelist? Mellanox Technologies MT2892 Family [ConnectX-6 Dx] (enp3s0f1np1) [y/n] (n):
Add network adapter to PCI whitelist? Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (eno2) [y/n] (n):
Add network adapter to PCI whitelist? Intel Corporation Ethernet 10G 2P X520 Adapter (enp130s0f0) [y/n] (n):
Add network adapter to PCI whitelist? Intel Corporation Ethernet 10G 2P X520 Adapter (enp130s0f1) [y/n] (n):
```
All the VFs that belong to the specified SR-IOV PFs will be added to the
[Nova PCI device list](https://docs.openstack.org/nova/latest/admin/pci-passthrough.html), in addition to the devices that may have been specified
in the [manifest file](#sriov-manifest).
The `openstack-hypervisor` snap determines if the specified adapters support
hardware offloading. If not, it will configure the [Neutron SR-IOV agent](https://docs.openstack.org/neutron/latest/admin/config-sriov.html#enable-neutron-sriov-nic-agent-compute) to
handle these ports.
The SR-IOV configuration may be subsequently modified using the following command:
```default
sunbeam configure sriov
```
## MAAS mode
When deploying Canonical Openstack in MAAS mode, set one of the following network
interface tags to expose SR-IOV adapters:
```default
sriov:
sriov:no-physnet
```
Use Curtin scripts to prepare the prerequisite SR-IOV configuration as described
in the [previous section](#sriov-prerequisites). Also ensure that MAAS is configured
to apply the necessary kernel parameters.
Similarly to manual mode, the SR-IOV configuration can be modified using the
following command:
```default
sunbeam configure sriov
```
## Manifest configuration
Arbitrary PCI devices may be specified through the Canonical Openstack manifest.
Apart from SR-IOV network adapters, this can also include vGPUs or FPGAs.
Example:
```default
pci:
device_specs:
- address: "0000:1b:00.0"
vendor_id: "8086"
product_id: "1563"
physical_network: "physnet1"
excluded_devices:
r740-dc1-ceph.maas:
- "0000:19:00.0"
- "0000:19:00.1"
- "0000:1b:00.1"
- "0000:5e:00.0"
aliases:
- vendor_id: "8086"
product_id: "1563"
device_type: type-PF
name: "intel-pf"
```
The device spec filters are highly flexible and can contain PCI address wildcards
or PCI vendor/product IDs. See the [Nova device spec reference](https://docs.openstack.org/nova/latest/configuration/config.html#pci.device_spec) for more details.
The PCI device specs will be applied to all the compute nodes. If needed, use
the exclusion list to define per-node lists of devices that should not be
exposed to Openstack instances.
Configured [PCI device aliases](https://docs.openstack.org/nova/latest/configuration/config.html#pci.alias) may be requested through Nova flavor extra specs.
## Attaching SR-IOV VFs to Openstack instances
Launch a demo instance:
```default
sunbeam launch --name test
```
Create a port with `--vnic-type=direct`:
```default
openstack port create --network demo-network --vnic-type=direct direct-port
```
Attach the port:
```default
openstack server add port test direct-port
```
Check the port status:
```default
openstack port show direct-port
# output #
+-------------------------+----------------------------------------------------------------------------------+
| Field | Value |
+-------------------------+----------------------------------------------------------------------------------+
| admin_state_up | UP |
| allowed_address_pairs | |
| binding_host_id | None |
| binding_profile | None |
| binding_vif_details | None |
| binding_vif_type | None |
| binding_vnic_type | direct |
| created_at | 2025-07-29T09:37:26Z |
| data_plane_status | None |
| description | |
| device_id | 1dd2e5a2-011c-4ab2-abb0-b21ee6b355a8 |
| device_owner | compute:nova |
| device_profile | None |
| dns_assignment | fqdn='test.cloud.sunbeam.internal.', hostname='test', ip_address='192.168.0.227' |
| dns_domain | |
| dns_name | test |
| extra_dhcp_opts | |
| fixed_ips | ip_address='192.168.0.227', subnet_id='782b4f8b-0f05-4725-98e6-1519d44f3458' |
| hardware_offload_type | None |
| hints | |
| id | c240b03c-014d-4901-89a0-876f72c94aaf |
| ip_allocation | immediate |
| mac_address | fa:16:3e:66:b9:b2 |
| name | direct-port |
| network_id | 578cb555-0972-4177-9739-85d29bd67ff1 |
| numa_affinity_policy | None |
| port_security_enabled | True |
| project_id | d081abb7eebc4279a8e8ca7ddcf7ecae |
| propagate_uplink_status | True |
| resource_request | None |
| revision_number | 41 |
| qos_network_policy_id | None |
| qos_policy_id | None |
| security_group_ids | 5362283f-56e2-443a-a952-bfbdf18cfb06 |
| status | ACTIVE |
| tags | |
| trunk_details | None |
| updated_at | 2025-07-29T10:12:33Z |
+-------------------------+----------------------------------------------------------------------------------+
```
Verify the Libvirt domain:
```default
$ sudo openstack-hypervisor.virsh dumpxml instance-00000001 | grep "type='hostdev" -A 8
```
If hardware offloading is available, the device will be added to the `br-int`
bridge:
```default
sudo openstack-hypervisor.ovs-vsctl show
# output #
f9b527db-207c-453d-bcda-482610541462
Bridge br-ex
datapath_type: system
Port br-ex
Interface br-ex
type: internal
Port patch-provnet-4cb61b1f-86a8-4c50-956a-04d8358ce055-to-br-int
Interface patch-provnet-4cb61b1f-86a8-4c50-956a-04d8358ce055-to-br-int
type: patch
options: {peer=patch-br-int-to-provnet-4cb61b1f-86a8-4c50-956a-04d8358ce055}
Bridge br-int
fail_mode: secure
datapath_type: system
Port enp2s0f0r3
Interface enp2s0f0r3
Port tap578cb555-00
Interface tap578cb555-00
Port br-int
Interface br-int
type: internal
Port patch-br-int-to-provnet-4cb61b1f-86a8-4c50-956a-04d8358ce055
Interface patch-br-int-to-provnet-4cb61b1f-86a8-4c50-956a-04d8358ce055
type: patch
options: {peer=patch-provnet-4cb61b1f-86a8-4c50-956a-04d8358ce055-to-br-int}
Port tapdcf0ee2d-f8
Interface tapdcf0ee2d-f8
ovs_version: "3.5.0"
```
## Disabling SR-IOV
The same command may also be used to disable the SR-IOV functionality.
Specify “n” for each interface that should no longer be used with SR-IOV.
```default
sunbeam configure sriov
Found the following SR-IOV capable devices:
[ ] Intel Corporation Ethernet Controller X550 (eno1) [physnet: None]
[X] Intel Corporation Ethernet Controller X550 (eno2) [physnet: physnet1]
[ ] Mellanox Technologies MT27520 Family [ConnectX-3 Pro] (enp94s0) [physnet: None]
Add network adapter to PCI whitelist? Intel Corporation Ethernet Controller X550 (eno1) [y/n] (n): n
Add network adapter to PCI whitelist? Intel Corporation Ethernet Controller X550 (eno2) [y/n] (y): n
Add network adapter to PCI whitelist? Mellanox Technologies MT27520 Family [ConnectX-3 Pro] (enp94s0) [y/n] (n): n
```
Existing instances will not be modified, consider removing VF attachments
manually to avoid subsequent port binding failures.
# index.html.md
# Managing OpenStack Identity Providers
## Overview
Perhaps one of the most important user facing features of any cloud is the authentication, authorization
and service discovery workflows that allow users to log into their account and create resources.
OpenStack, through the use of Keystone provides a plugable architecture for authentication while still
retaining the responsibility for authorization and service discovery.
In this document we’ll walk through enabling additional authentication back-ends for keystone by integrating
with OpenID Connect providers such as Google, Okta, Entra ID or [Canonical Identity Platform](https://charmhub.io/topics/canonical-identity-platform).
## Implementation
Keystone does not directly support the needed authentication workflows needed for OpenID or SAML2. Rather,
it delegates that responsibility to Apache2, which then passes onto keystone the result of the authentication
via a set of variables which hold details about the user (full name, email, remote user ID, etc).
Keystone then uses this information to match the authenticated user to a project, based on a set of
rules configured by the cloud operator (detailed later).
Configuring federation has two major components:
* Making an IdP available to Keystone via Apache2 configurations.
* Enabling the IdP in OpenStack by creating the required keystone resources using the openstack command
Canonical OpenStack is responsible for the first part of that configuration process, which involves adding the needed URLs
in Apache2 and secrets to enable the authentication workflows. Making use of the newly enabled
capabilities falls on the cloud administrator, by leveraging standard openstack commands.
## Requirements
Before we begin, make sure that you have enabled TLS through the use of Vault. Virtually all providers require that
the redirect URL is TLS enabled. Moreover, some providers require that the redirect URL uses a fully qualified domain
name and not an IP address. This means that for the external host name you must also set a valid hostname. Both of
these operations can be done by enabling Vault.
## Adding an Identity provider
There are two types of relations supported by Canonical OpenStack:
* External providers (Google, Okta, Entra ID) for both OpenID connect and SAML2
* [Canonical Identity Platform](https://charmhub.io/topics/canonical-identity-platform) which is expected to be deployed in a different juju model.
### Enabling Canonical Identity Platform as an IdP
For the purpose of this document we will assume you have a model called iam which contains a deployment of Canonical Identity Platform.
Integration is done by consuming an offer for the oauth endpoint of the [Hydra](https://charmhub.io/hydra) charm. If your
identity platform uses a custom CA, you also need to consume the send-ca-cert endpoint deployed in your iam model.
Create the offers:
```default
juju offer iam.hydra:oauth
juju offer iam.self-signed-certificates:send-ca-cert
```
Get the offer URLs. We’ll need them when creating the config file:
```default
HYDRA_OFFER=$(juju list-offers --format=json -m iam hydra | jq -r '.hydra.["offer-url"]')
SEND_CA_CERT_OFFER=$(
juju list-offers \
--format=json \
-m iam \
self-signed-certificates | jq -r '.["self-signed-certificates"].["offer-url"]')
```
Create the config file:
```default
cat << EOF > canonical-iam.yaml
oauth_offer: $HYDRA_OFFER
cert_offer: $SEND_CA_CERT_OFFER
EOF
```
And finally add the provider:
```default
sunbeam identity provider add \
canonical openid canonical-identity-platform \
--config canonical-iam.yaml
```
In the above example we added a new identity provider of type canonical with the openid protocol and the name canonical-identity-platform.
the name is important in the case of providers of type canonical as the name is also used as a label in Horizon when selecting the IdP. So make
sure to use a descriptive name.
Now we can list the providers:
```default
sunbeam identity provider list
+-----------------------------+------------+----------+------------+
| Name | Provider | Protocol | Remote ID |
+-----------------------------+------------+----------+------------+
| Keystone Credentials | Built-in | keystone | N/A |
| canonical-identity-platform | canonical | openid | N/A |
+-----------------------------+------------+----------+------------+
```
At this point the configurations exist in apache, keystone and horizon that enable a cloud administrator to configure it as an authentication backend. We will
cover that part later.
### External IdPs
Canonical OpenStack currently supports the following IdP types:
* [Google (OIDC)](https://developers.google.com/identity/openid-connect/openid-connect)
* [Google (SAML2)](https://cloud.google.com/chronicle/docs/soar/admin-tasks/saml-soar-only/saml-configuration-for-g-suite)
* [Okta (OIDC)](https://help.okta.com/en-us/content/topics/apps/apps_app_integration_wizard_oidc.htm)
* [Okta (SAML2)](https://developer.okta.com/docs/guides/add-an-external-idp/saml2/main/)
* [Entra ID (OIDC)](https://learn.microsoft.com/en-us/entra/identity-platform/v2-protocols-oidc#enable-id-tokens)
* [Entra ID (SAML2)](https://learn.microsoft.com/en-us/entra/architecture/auth-saml)
* Generic (SAML2 and OIDC)
Each of these provider types require specific configurations in order to enable them and each have their own procedure for creating the client credentials needed to initiate the authentication workflow.
You will have to consult the official documentation for each, in order to generate the required client credentials. The configuration formats that Canonical OpenStack requires are detailed below. The configuration
files are in yaml format.
When creating an OpenID Connect integration meant to be used with Canonical OpenStack, you will need the redirect URL that the IdP needs to call back into when a user authenticates. To display the redirect URL, you can run
the following command:
```default
sunbeam identity provider get-oidc-redirect-url
https://sunbeam.example.com/openstack-keystone/v3/OS-FEDERATION/protocols/openid/redirect_uri
```
For SAML2 you will need to know the metadata URL of the Service Provider (Keystone in our case). The metadata URL will return the SP XML for keystone, where you can find
the signing certificate that keystone will use, the single sign out URL and the Assertion Consumer Service URL. You will need this information to set up the SAML2 application
in your provider of choice.
The metadata URL for a particular provider can be inferred from the FQDN of keystone, the provider name and the provider protocol.
If we have a provider named entra that uses saml2 and our FQDN is sunbeam.example.com then the metadata URL will be:
```default
https://sunbeam.example.com/openstack-keystone/v3/OS-FEDERATION/identity_providers/entra/protocols/saml2/auth/mellon/metadata
```
Note, the schema **must** be **https** and you **should** have a fully qualified domain name configured instead of an IP address. Depending on IdP, this might be a requirement (Google for example). If that is not the case,
you should enable TLS in sunbeam, using Vault.
#### SAML2 special consideration
When creating a SAML2 entry in Canonical OpenStack, there is a bit of a chicken and egg situation. The application needs to exist in the provider of choice before you
can add it to Canonical OpenStack, but you also need the information in the metadata XML we offer to configure the application in the IDP of choice. Luckily, the information
you use when creating the application does not need to be accurate. You will be able to create the application even with placeholder values. Once you create the application, you
can add it to Canonical OpenStack. Once added, you will be able to get the values from the metadata URL mentioned above and edit the application in the IDP of choice.
Another important consideration is that for SAML2 you will need to make sure you’ve added an x509 signing certificate and the corresponding key:
```default
sunbeam identity set-saml-x509 /path/to/cert.pem /path/to/key.pem
```
#### Google config format (OIDC)
There are two mandatory configuration parameters and one optional parameter:
* client-id - mandatory
* client-secret - mandatory
* label - optional
Example config:
```default
client-id: client_id_obtained_from_your_console
client-secret: client_secret_associated_with_the_id
label: "Log in with Google (OIDC)"
```
#### Google config format (SAML2)
There is one mandatory configuration parameter and one optional parameter:
* app-id - mandatory
* label - optional
Example config:
```default
app-id: saml2_app_id
label: "Log in with Google (SAML2)"
```
#### Okta config format (OIDC)
There are three mandatory configuration parameters and one optional parameter:
* client-id - mandatory
* client-secret - mandatory
* okta-org - mandatory
* label - optional
Example config:
```default
client-id: client_id_obtained_from_your_console
client-secret: client_secret_associated_with_the_id
okta-org: dev-123456
label: "Log in with Okta"
```
#### Okta config format (SAML2)
There are two mandatory configuration parameters and one optional parameter:
* app-id - mandatory
* okta-org - mandatory
* label - optional
Example config:
```default
app-id: app_id_goes_here
okta-org: dev-123456
label: "Log in with Okta (SAML2)"
```
#### Entra ID config format (OIDC)
There are three mandatory configuration parameters and one optional parameter:
* client-id - mandatory
* client-secret - mandatory
* microsoft-tenant - mandatory
* label - optional
Example config:
```default
client-id: client_id_obtained_from_your_console
client-secret: client_secret_associated_with_the_id
microsoft-tenant: tenant-uuid-goes-here
label: "Log in with Entra ID (OIDC)"
```
#### Entra ID config format (SAML2)
There are two mandatory configuration parameters and one optional parameter:
* app-id - mandatory
* microsoft-tenant - mandatory
* label - optional
Example config:
```default
app-id: app_id_goes_here
microsoft-tenant: tenant-uuid-goes-here
label: "Log in with Entra ID (SAML2)"
```
#### Generic (OIDC)
The generic provider allows you to configure any OIDC compatible provider.
There are three mandatory parameters and one optional parameter:
* client-id - mandatory
* client-secret - mandatory
* issuer-url - mandatory
* label - optional
Example config:
```default
client-id: client_id_obtained_from_your_console
client-secret: client_secret_associated_with_the_id
issuer-url: https://oidc.example.com
label: "Log in with My OpenID connect provider"
```
A note about the issuer-url. This URL identifies the provider. It is also the URL from which we get the OpenID connect configuration.
The issuer URL, must have the well-known openid configuration URL available. This URL can be constructed by appending
/.well-known/openid-configuration to the issuer URL.
Example:
```default
https://accounts.google.com/.well-known/openid-configuration
```
In the above example, https://accounts.google.com is the issuer-url.
For the generic OpenID connect there is no option to specify a custom CA certificate chain to validate the issuer-url. You will need to use
a certificate issued by a CA that your deployment already trusts.
#### Generic (SAML2)
Similar to the OIDC generic provider, the generic SAML2 provider allow you to configure any SAML2 compliant IDP, as long as you know the metadata URL.
There is only one mandatory configuration parameter for the SAML2 provider and two optional parameters.
* metadata-url - mandatory
* ca-chain - optional
* label - optional
Example config:
```default
metadata-url: https://saml2.example.com/metadata
ca-chain: base64-encoded-ca-chain-goes-here
label: "Log in with My Custom SAML2 IDP"
```
The metadata URL must contain a XML response that identifies the IDP. The XML must contain the remote entityID, as well as the signing x509 keys of the remote IDP.
The value of the entityID property must be used when defining the IDP in Canonical OpenStack as the remote ID.
### Adding an external IdP
Adding an external IdP is similar to adding a Canonical Identity Platform provider:
```default
sunbeam identity provider add \
google openid my-google-idp \
--config google.yaml
```
Now we can list the providers:
```default
sunbeam identity provider list
+-----------------------------+------------+----------+------------------------------+
| Name | Provider | Protocol | Remote ID |
+-----------------------------+------------+----------+------------------------------|
│ Keystone Credentials │ Built-in │ keystone │ N/A │
| canonical-identity-platform | canonical | openid | N/A |
│ my-google-idp │ google │ openid │ https://accounts.google.com │
+-----------------------------+------------+----------+------------------------------|
```
Adding a SAML2 or OIDC provider has a similar procedure for all above mentioned options.
Make a note of the name of the provider and of the protocol. We will use them in the next steps to enable these providers in keystone.
Note, you should already see them in Horizon, but you will only be able to use them after we’ve mapped them to domains and projects. Examples below.
### Removing a provider
Removing a provider is a matter of running:
```default
sunbeam identity provider remove my-google-idp --yes-i-mean-it
```
Note, this will not remove any resources created by the cloud administrator using the openstack command.
### Making use of the new providers
Now that we’ve made the providers available to the cloud, we can enable them in keystone, map them to a domain and create rules on how users should
be mapped to projects.
You can create a new domain or you can use an existing domain to map it to the IdP. For the purposes of this guide, we’ll create a new one:
```default
openstack domain create \
--description="Federated Google domain" \
google
```
Get the issuer URL for the desired IdP. In this case we’ll go with my-google-idp from the output above:
```default
REMOTE_ID=$(sunbeam identity provider list \
--format=yaml | yq -r '.openid."my-google-idp".remote_id')
```
Note, if you’re configuring a saml2 IDP, you will need to adapt the yq arguments in the above command.
Create the identity provider in Keystone:
```default
openstack identity provider create \
--remote-id $REMOTE_ID \
--domain google \
my-google-idp
```
Note, the name of the identity provider must match the name in the table outputted by sunbeam.
Create a group which we will assign to federated users:
```default
openstack group create federated_users \
--domain google
```
Create a project. The following example creates a project named `federated_project`:
```default
openstack project create \
--domain google \
federated_project
```
Add a role for the group on the project we want to use:
```default
openstack role add \
--group federated_users \
--project federated_project \
--group-domain google \
--project-domain google \
member
```
Next, we need to create some mapping rules between the remote users that come in from the IdP and local openstack users. The rules instruct Keystone how
to automatically create local users and to assign them to groups, projects, domains, etc. You may consult [the official documentation](https://docs.openstack.org/keystone/latest/admin/federation/mapping_combinations.html)
on how to write the rules. In this guide we’ll create a simple rule set which will be used for the openid protocol of the my-google-idp provider to map
users to the group we created above. That will automatically grant them **member** access in the **federated_project** of the **google** domain.
This file can be as complex as you need it to be, based on your needs.
Create a file with the rules:
```default
cat > rules.json <
```
## Post-Deployment Management
### Setting a Theme
To set the theme after bootstrap is complete use the `dashboard theme set` command:
```default
sunbeam dashboard theme set
```
### Clearing a Theme
To clear an existing custom theme and return to the default use the `dashboard theme clear` command:
```default
sunbeam dashboard theme clear
```
### Limitations When Used With a Manifest
When setting/clearing a theme using these imperative commands it will always override you manifest values. However, when a cluster operation is performed that re-evaluates the state of the control plane (f.e. `sunbeam cluster refresh`) the manifest will always take priority over values provided after the fact. As such, when utilizing the manifest to declare your theme these commands should only be used as a “quick test” to ensure that your theme applies correctly before updating the manifest and supplying it on the next cluster operation to ensure that the changes are persistent.
# index.html.md
# Adding AMD SEV enabled Compute Node
Secure Encrypted Virtualization is a technology from AMD enabling encryption of guest memory.
OpenStack provides support to make use of this technology and deploy trusted guests.
Refer [Admin guide](https://docs.openstack.org/nova/latest/admin/sev.html) for more information.
In Canonical OpenStack, AMD SEV enabled compute nodes can be added using the [cluster scale out procedure](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/scaling-the-cluster-out.md) by adding compute role to the node.
Canonical OpenStack auto detects the compute node if the node is AMD SEV enabled or not.
For AMD SEV enabled compute nodes, sufficient memory need to be reserved for the host since SEV enabled guests memory pages are pinned in RAM.
To set the reserved memory for the host, update manifest with the following configuration for openstack-hypervisor charm.
```default
core:
config:
software:
charms:
openstack-hypervisor:
config:
reserved-host-memory-mb-for-sev: 8192
```
For manual bare metal provider, pass the updated manifest in join command
```default
cat TOKEN_FILE | sunbeam cluster join --manifest MANIFEST_FILE --role ROLES -
```
For MAAS provider, pass the updated manifest in deploy command
```default
sunbeam cluster deploy --manifest MANIFEST_FILE
```
The configuration will be applied only on AMD SEV enabled compute nodes.
## Operations
Once the cloud is deployed, Operator need to do the following operations
### Flavor properties
Create or set flavors with the property hw:mem_encryption=true.
To create new flavor with the above property, run the command
```default
openstack flavor create FLAVORNAME --ram RAM --disk DISK --vcpus VCPUS --property hw:mem_encryption=true
```
To set property on existing flavor, run the command
```default
openstack flavor set --property hw:mem_encryption=true FLAVORNAME
```
Flavors created by sunbeam configure ending with -sev have already the property added.
### Image properties
Create or set images with the property hw_firmware_type=uefi
To create new image with the above property, run the command
```default
openstack image create --disk-format FORMAT --container-format CFORMAT --file IMAGEFILE --property hw_firmware_type=uefi IMAGENAME
```
To set property on existing image, run the command
```default
openstack image set --property hw_firmware_type=uefi IMAGENAME
```
The [Images Sync Feature](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/images-sync.md) will add the property hw_firmware_type=uefi by default when importing images.
### Launch instance
To launch an SEV encrypted instance, use the flavor and images set with the above properties.
## Limitations
* Live migration is not supported for AMD SEV enabled guests.
# index.html.md
# Manage a proxied environment
This page shows how to configure proxy settings for Canonical OpenStack. This
is required for an environment that has network egress traffic restrictions
placed upon it. These restrictions are typically implemented via a
corporate proxy server that is separate from the Canonical OpenStack
deployment.
The proxy server itself must permit access to certain external
(internet) resources in order for Sunbeam to deploy (and operate) Canonical
OpenStack correctly. These resources are listed on the [Proxy ACL
access](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/proxy-acl-access.md) reference page.
## Configure for the proxy at the OS level
The steps given in the following two sub-sections will allow a network
host to “talk” to your local proxy server.
#### TIP
These instructions need to be run on all of the nodes prior to the
deploying the nodes in the cluster.
### Provide the initial settings
Set proxy values in the `/etc/environment` file via well-known
environment variables. Ensure to set the management CIDR and
MetalLB/load-balancer CIDR in the NO_PROXY variable.
Below are example commands for providing these initial proxy settings:
```default
echo "HTTP_PROXY=http://squid.proxy:3128" | sudo tee -a /etc/environment
echo "HTTPS_PROXY=http://squid.proxy:3128" | sudo tee -a /etc/environment
echo "NO_PROXY=localhost,127.0.0.1,10.121.193.0/24,10.20.21.0/27" | sudo tee -a /etc/environment
```
### Restart snapd
Restart `snapd` so that it becomes aware of the new settings in
`/etc/environment`:
```default
sudo snap restart snapd
```
This will allow snaps to be installed on the configured nodes.
## Show proxy settings
Run the following command to view the proxy settings:
```default
sunbeam proxy show
```
Here is sample output from the above command:
| Proxy variable | Value |
|----------------------|----------------------------------------------------------|
| HTTP_PROXY | [http://10.121.193.112:3128](http://10.121.193.112:3128) |
| HTTPS_PROXY | [http://10.121.193.112:3128](http://10.121.193.112:3128) |
| NO_PROXY | localhost,127.0.0.1,10.121.193.0/24,10.20.21.0/27 |
## Update proxy settings
User can update the proxy settings at later point of time after
bootstrap is completed. To update the proxy settings, run the command
```default
sunbeam proxy set --http-proxy <> --https-proxy <> --no-proxy <>
```
## Clear proxy settings
To clear the proxy settings, run the following command
```default
sunbeam proxy clear
```
The above command will clear the proxy settings in /etc/environment and
model-configs for sunbeam created Juju models.
# index.html.md
# Using the OpenStack CLI
Once OpenStack has been deployed you can interact with your cloud via
the CLI by using the standard `openstack` client commands. The CLI
client is provided as part of the `openstack` snap.
The client recognizes the environment variables stored in generated
credential files. Source a cloud credentials file to set these environment
variables in the current shell before using the client:
```default
source
```
For help with command syntax see the documentation for the
[python-openstackclient](https://docs.openstack.org/python-openstackclient/latest/cli/command-list.html)
package.
## Unprivileged vs admin user credentials
Unprivileged user credentials are generated at cloud-configuration time
with the `sunbeam configure` command.
Admin user credentials are generated with the `sunbeam openrc`
command. Here, the file `admin-openrc` is chosen as init file:
```default
sunbeam openrc > admin-openrc
```
# index.html.md
# Multi-region deployments
OpenStack deployments can span across multiple regions while sharing only the
identity (Keystone) and dashboard (Horizon) services.
Commonly used with large deployments, the OpenStack region concept is
quite flexible. These may be geographically distinct locations, providing
regional level fault tolerance.
Alternatively, regions can exist within the same physical site, used to
partition a large cluster and distribute load among critical components like
databases or message brokers.
## Manual bare metal provider
### Region controllers
To accommodate multi-region environments, Canonical OpenStack defines the
region controller role, which is mutually exclusive with all other roles.
Region controllers will only run the shared services, such as Keystone and
Horizon.
When using the manual bare metal provider, a region controller may be
bootstrapped like so:
```default
sunbeam cluster bootstrap --role region_controller
```
For high availability, additional region controllers can be added using
the standard procedure. First, obtain a cluster join token:
```default
sunbeam cluster add $fqdn
```
Then use the token to join the new region controller node:
```default
sunbeam cluster join --role region_controller $token
```
Note that standard Sunbeam deployments can also act as primary regions.
### Secondary regions
The secondary regions are distinct Canonical Openstack deployments, using
separate Kubernetes clusters and Juju controllers.
Shared services such as Keystone and Horizon will be omitted from secondary
regions. These services will be provided by the region controllers and
consumed through cross-controller Juju relations.
In order to access the region controller, each secondary region node will
need a token obtained from the region controllers:
```default
sunbeam cluster add-secondary-region-node $fqdn
```
The token must then be passed to the bootstrap command:
```default
sunbeam cluster bootstrap \
--role control,compute,storage --region-controller-token=$token
```
During bootstrap, make sure to specify a region name other than the one of the
region controller.
A region controller token is also required when joining secondary region nodes.
This means that the join operation requires two tokens: one from the region
controller and one from an existing member of the secondary region.
```default
sunbeam --verbose cluster join --role control,compute,storage \
--region-controller-token $region_ctrl_token $same_region_token
```
## Canonical MAAS provider mode
To deploy region controller nodes, use the `region_controller` machine tag.
Note that a deployment containing region controllers is not allowed
to have other control, compute or storage nodes.
```default
$ sunbeam cluster bootstrap
$ sunbeam cluster deploy
Deployment complete with 0 control, 0 compute and 0 storage nodes.
Region controllers: 1. Total nodes in cluster: 1
```
Secondary regions will reside in separate Sunbeam deployments, using a
region controller token to connect to the primary region.
```default
$ sunbeam cluster bootstrap --region-controller-token=$token
$ sunbeam cluster deploy
```
## Juju cross-controller relations
For the time being, the Juju Terraform provider does not support
[cross-controller relations](https://github.com/juju/terraform-provider-juju/issues/805). As such, these relations must be manually
defined.
```default
controller="sunbeam-controller-region-controller"
# Usually the region controller fqdn
owner="$ownerFqdn"
# Run the following when Sunbeam reaches the following phase:
# ⠼ Deploying OpenStack Control Plane to Kubernetes (this may take a while) ... waiting for services to come online (14/18)
juju switch openstack
juju consume $controller:$owner/openstack.keystone-credentials
juju consume $controller:$owner/openstack.keystone-endpoints
juju consume $controller:$owner/openstack.keystone-ops
juju consume $controller:$owner/openstack.cert-distributor
juju consume $controller:$owner/openstack.horizon-cors-origin
juju integrate keystone-endpoints cinder:identity-service
juju integrate keystone-endpoints glance:identity-service
juju integrate keystone-endpoints neutron:identity-service
juju integrate keystone-endpoints nova:identity-service
juju integrate keystone-endpoints placement:identity-service
juju integrate cert-distributor cinder:receive-ca-cert
juju integrate cert-distributor glance:receive-ca-cert
juju integrate cert-distributor neutron:receive-ca-cert
juju integrate cert-distributor nova:receive-ca-cert
juju integrate cert-distributor placement:receive-ca-cert
juju integrate horizon-cors-origin glance:cors-origin
# Run the following once Sunbeam reaches the following phase:
# ⠸ Deploying OpenStack Hypervisor ...
juju switch admin/openstack-machines
juju consume $controller:$owner/openstack.keystone-credentials
juju consume $controller:$owner/openstack.cert-distributor
juju integrate keystone-credentials openstack-hypervisor:identity-credentials
juju integrate keystone-credentials cinder-volume:identity-credentials
juju integrate cert-distributor openstack-hypervisor:receive-ca-cert
```
# index.html.md
# Operations
* [Cluster upgrades](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/cluster-upgrades.md)
* [Overview](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/cluster-upgrades.md#overview)
* [Prerequisites](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/cluster-upgrades.md#prerequisites)
* [Step 1 - Refresh Kubernetes](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/cluster-upgrades.md#step-1-refresh-kubernetes)
* [Step 2 - Refresh Vault](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/cluster-upgrades.md#step-2-refresh-vault)
* [Step 3 - Refresh MySQL](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/cluster-upgrades.md#step-3-refresh-mysql)
* [Step 4 - Refresh the cluster](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/cluster-upgrades.md#step-4-refresh-the-cluster)
* [Multi-region deployments](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/cluster-upgrades.md#multi-region-deployments)
* [Deploy a Pure Storage backend](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/deploy-pure-storage-backend.md)
* [Overview](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/deploy-pure-storage-backend.md#overview)
* [Requirements](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/deploy-pure-storage-backend.md#requirements)
* [Inspect the available options](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/deploy-pure-storage-backend.md#inspect-the-available-options)
* [Create the backend configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/deploy-pure-storage-backend.md#create-the-backend-configuration)
* [Deploy the backend](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/deploy-pure-storage-backend.md#deploy-the-backend)
* [Verify the backend](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/deploy-pure-storage-backend.md#verify-the-backend)
* [Enable and deploy a gated storage backend](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/enable-a-gated-storage-backend.md)
* [List the available feature gates](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/enable-a-gated-storage-backend.md#list-the-available-feature-gates)
* [Enable the storage backend gate](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/enable-a-gated-storage-backend.md#enable-the-storage-backend-gate)
* [Verify that the backend is unlocked](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/enable-a-gated-storage-backend.md#verify-that-the-backend-is-unlocked)
* [Review the backend options in the CLI](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/enable-a-gated-storage-backend.md#review-the-backend-options-in-the-cli)
* [Deploy the backend](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/enable-a-gated-storage-backend.md#deploy-the-backend)
* [Verify the deployment](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/enable-a-gated-storage-backend.md#verify-the-deployment)
* [Live Migration](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/live-migration.md)
* [Overview](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/live-migration.md#overview)
* [Ensure adequate capacity on the destination host](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/live-migration.md#ensure-adequate-capacity-on-the-destination-host)
* [Live migrate an instance](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/live-migration.md#live-migrate-an-instance)
* [Maintenance mode](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/maintenance-mode.md)
* [Overview](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/maintenance-mode.md#overview)
* [Enabling Maintenance feature](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/maintenance-mode.md#enabling-maintenance-feature)
* [Usage](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/maintenance-mode.md#usage)
* [Manage experimental features](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/manage-experimental-features.md)
* [Overview](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/manage-experimental-features.md#overview)
* [List feature gates](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/manage-experimental-features.md#list-feature-gates)
* [Enable an experimental feature](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/manage-experimental-features.md#enable-an-experimental-feature)
* [Disable an experimental feature](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/manage-experimental-features.md#disable-an-experimental-feature)
* [Removing the primary node](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/removing-the-primary-node.md)
* [Remove components from the machine](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/removing-the-primary-node.md#remove-components-from-the-machine)
* [Scaling the cluster in](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/scaling-the-cluster-in.md)
* [Scaling the cluster in using the manual bare metal provider](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/scaling-the-cluster-in.md#scaling-the-cluster-in-using-the-manual-bare-metal-provider)
* [Scaling the cluster in using Canonical MAAS](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/scaling-the-cluster-in.md#scaling-the-cluster-in-using-canonical-maas)
* [Scaling the cluster out](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/scaling-the-cluster-out.md)
* [Scaling the cluster out using the manual bare metal provider](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/scaling-the-cluster-out.md#scaling-the-cluster-out-using-the-manual-bare-metal-provider)
* [Scaling the cluster out using Canonical MAAS](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/scaling-the-cluster-out.md#scaling-the-cluster-out-using-canonical-maas)
* [Backup and Restore](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/backup-and-restore.md)
* [Overview](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/backup-and-restore.md#overview)
* [s3-integrator](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/backup-and-restore.md#s3-integrator)
* [MySQL](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/backup-and-restore.md#mysql)
* [Vault](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/backup-and-restore.md#vault)
* [K8s control plane backup](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/backup-and-restore.md#k8s-control-plane-backup)
* [Juju](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/backup-and-restore.md#juju)
* [MAAS deployment access](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/backup-and-restore.md#maas-deployment-access)
* [Sunbeam-clusterd](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/backup-and-restore.md#sunbeam-clusterd)
# index.html.md
# Backup and Restore
## Overview
Regular backups of the Sunbeam cluster are a critical component of any robust disaster recovery plan,
ensuring the resilience and continuity of the Canonical OpenStack Cluster deployment. Given that
the procedures described below primarily focus on backing up essential control-plane elements
including application data (MySQL, Vault), the Kubernetes control plane, Juju controller state,
and sunbeam-clusterd.
Unexpected hardware failures, human error, or data corruption can severely compromise the
control plane, leading to extended outages and potential data loss. By maintaining up-to-date
backups, administrators can significantly minimize recovery time objectives (RTO) and restore the
core management services necessary for operating the cloud infrastructure.
## s3-integrator
The Sunbeam cluster, by default, utilizes ceph-rgw within MicroCeph, which provides S3-compatible
object storage capabilities. This built-in functionality can be used to create the S3 buckets
necessary for the backup procedures described here. While this is convenient for initial setup
and testing, it is recommended that for production environments, all critical backups be
stored in an S3-compatible service located outside of the Canonical OpenStack Cluster deployment
itself. Storing backups externally ensures resilience against catastrophic failures that could
affect the entire cloud environment, including the internal Ceph cluster.
For demonstration purposes, the backup procedures outlined in this document will utilize the internal
Ceph Rados Gateway (RGW) provided by the ceph-rgw charm.
```text
juju switch openstack-machines
juju exec -u microceph/leader -- microceph.radosgw-admin user create --uid my-user --display-name my-user
{
"user_id": "my-user",
"display_name": "my-user",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"subusers": [],
"keys": [
{
"user": "my-user",
"access_key": "", # save this access key
"secret_key": "", # save this secret key
"active": true,
"create_date": "2026-02-26T20:40:18.959341Z"
}
],
}
# get the endpoint of the ceph-rgw service on openstack model
juju switch openstack
juju run traefik-rgw/leader show-external-endpoints
Running operation 316 with 1 task
- task 317 on unit-traefik-rgw-1
Waiting for task 317...
external-endpoints: '{"traefik-rgw": {"url": "http://"}}'
```
Install a tool like aws-cli\` or s3cmd and configure it with the access key and secret key
obtained from the previous command to interact with the S3 storage provided by ceph-rgw.
```text
sudo snap install aws-cli --classic
aws configure --profile ceph # fill the asked information
aws --profile ceph --endpoint-url http:// s3api create-bucket --bucket mysql
...
# repeat the previous command to create a bucket for each application you want to backup
```
Deploy one s3-integrator application for each application that needs s3-integration. E.g:
```text
juju switch openstack
juju deploy s3-integrator --model openstack mysql-s3-integrator
juju integrate mysql-s3-integrator mysql
...
# deploy and integrate for all necessary apps
```
Run the sync-s3-credentials action to configure the charm
```text
juju run mysql-s3-integrator/leader sync-s3-credentials access-key= secret-key=
...
# do the same for all necessary apps
```
Configure the s3-integrator charm to use the correct bucket for each application
```text
juju config mysql-s3-integrator bucket=mysql s3-uri-style=path endpoint=http:// path=mysql
...
# do the same for all necessary apps
```
## MySQL
### Requirements
* A deployed MySQL K8s cluster
* Access to S3 storage
* Configured settings for S3 storage
* Units in active/idle
* Control-plane units paused to avoid usage of the cluster during **restore** procedure
### Backup
The backup procedure should be executed on secondary MySQL units to avoid impacting the performance
of the primary unit. To get a secondary unit, run the following command:
```text
juju run mysql/leader get-cluster-status
Running operation 196 with 1 task
- task 197 on unit-mysql-2
Waiting for task 197...
status:
clustername: cluster-1e57de179fb5edd8c4e6392a25473b96
clusterrole: primary
defaultreplicaset:
name: default
primary: mysql-2.mysql-endpoints.openstack.svc.cluster.local.:3306
ssl: required
status: ok
statustext: cluster is online and can tolerate up to one failure.
topology:
mysql-0:
address: mysql-0.mysql-endpoints.openstack.svc.cluster.local.:3306
memberrole: secondary
mode: r/o
replicationlagfromimmediatesource: ""
replicationlagfromoriginalsource: ""
role: ha
status: online
version: 8.0.41
mysql-1:
address: mysql-1.mysql-endpoints.openstack.svc.cluster.local.:3306
memberrole: secondary
mode: r/o
replicationlagfromimmediatesource: ""
replicationlagfromoriginalsource: ""
role: ha
status: online
version: 8.0.41
mysql-2:
address: mysql-2.mysql-endpoints.openstack.svc.cluster.local.:3306
memberrole: primary
mode: r/w
role: ha
status: online
version: 8.0.41
topologymode: single-primary
domainname: cluster-set-1e57de179fb5edd8c4e6392a25473b96
groupinformationsourcemember: mysql-2.mysql-endpoints.openstack.svc.cluster.local.:3306
success: "True"
```
It’s possible to see in this case that mysql/0 and mysql/1 are secondary and mysql/2 is primary.
So backups should be run on unit 0 or 1.
```text
juju run mysql/0 create-backup --wait 1m
```
### Restore
To restore it is recommended to stop all control-plane services that might be using the database
before running the restore-backup action. This is to avoid any issues related to data corruption
or inconsistencies during the restore process.
At the moment, there isn’t a charm action to stop all control-plane services at once, so it needs
to be done manually by running on all OpenStack API services:
```bash
# get the container names of all OpenStack API services
kubectl get pods -n openstack -o json | jq -r '
.items[]
| select(
(.metadata.name | test("traefik|rabbitmq|mysql|modeloperator|ovn") | not)
)
| .metadata.name as $pod
| .spec.containers[]
| select(.name != "charm")
| "\($pod) => \(.name)"
'
...
# get the pebble service names for all OpenStack API services
for i in {0..2}; do kubectl -n openstack exec keystone-$i -c keystone -- pebble services; done
# do the same for all necessary apps
# stop the containers of all OpenStack API services
for i in {0..2}; do kubectl -n openstack exec keystone-$i -c keystone -- pebble stop wsgi-keystone; done
# do the same for all necessary apps
```
With all API services stopped, it’s possible to run the restore-backup action on a MySQL unit.
Before that is necessary to scale down the MySQL cluster to 1 replica to ensure data consistency
during the restore process. See the [charmed MySQL documentation](https://canonical-charmed-mysql.readthedocs-hosted.com/8.0/how-to/back-up-and-restore/restore-a-backup/) for more details
```text
juju scale-application mysql 1
```
Then, run the restore-backup action on the unit where you want to restore the backup. E.g:
.. code-block :: text
> juju run mysql/leader restore-backup backup-id=
After restoring all databases, it’s necessary to resume the OpenStack services and scale again
the mysql units.
```text
# start the containers of all OpenStack API services
for i in {0..2}; do kubectl -n openstack exec keystone-$i -c keystone -- pebble start wsgi-keystone; done
# do the same for all necessary apps
juju scale-application mysql 3
```
In case you find mysql-routers on blocked state, it’s necessary to re-launch them by running the following command:
.. code-block :: text
> juju scale-application keystone-mysql-router 0
> juju scale-application keystone-mysql-router 3
After the restoration, MySQL application will be in blocked state with the message:
“Move restored cluster to another S3 repository”. To unblock it, it’s necessary to create a new S3
bucket and configure the mysql-s3-integrator\` charm to use it by running the following command:
.. code-block :: text
> juju config mysql-s3-integrator bucket=
## Vault
### Requirements
* Have a Vault cluster enabled in Sunbeam.
* Units are in active idle state
* Configured settings for S3 storage
* Have saved your unseal keys and root-token in a secure location of your choice
### Backup / Restore
```text
juju run vault/leader create-backup
juju run vault/leader list-backups
juju run vault/leader restore-backup backup-id=
```
## K8s control plane backup
### Requirements
* Have a [velero-operator](https://charmhub.io/velero-operator) deployed
* Have the [infra-backup-operator](https://charmhub.io/infra-backup-operator/docs/tutorial) deployed
* Have access to S3 storage
* Configure s3-integrator
### Backup
```text
juju run velero-operator/0 create-backup \
target=infra-backup-operator:cluster-infra-backup
juju run velero-operator/0 create-backup \
target=infra-backup-operator:namespaced-infra-backup
```
### Restore
```text
# list the backups
juju run velero-operator/0 list-backups
backups:
83503892-a24a-409b-b0df-553dcc2465ec:
app: infra-backup-operator
completion-timestamp: "2025-08-08T20:00:28Z"
endpoint: cluster-infra-backup
model: test-charm-9f0e8dda
name: infra-backup-operator-cluster-infra-backup-pblz2
phase: Completed
start-timestamp: "2025-08-08T20:00:26Z"
85662948-8e5e-4922-8e1c-c5568eafa6e7:
app: infra-backup-operator
completion-timestamp: "2025-08-07T18:42:13Z"
endpoint: cluster-infra-backup
model: test-charm-9f0e8dda
name: infra-backup-operator-cluster-infra-backup-4bm7p
phase: Completed
start-timestamp: "2025-08-07T18:42:10Z"
# restore the backups
juju run velero-operator/0 restore backup-uid=85662948-8e5e-4922-8e1c-c5568eafa6e7
juju run velero-operator/0 restore backup-uid=83503892-a24a-409b-b0df-553dcc2465ec
```
## Juju
### Backup
```text
# export all models
juju export-bundle --model=cos --filename=cos-bundle.yaml
juju export-bundle --model=openstack --filename=openstack-bundle.yaml
...
# backup of controller
juju create-backup --model=${CONTROLLERS_MODEL} --filename=juju-ctrl-backup.tar.gz
# local client configuration
tar -czf juju-credentials.tar.gz ~/.local/share/juju/*
```
### Restore
For restoring there is the [juju-restore](https://github.com/juju/juju-restore/) tool to help.
## MAAS deployment access
See the [Backup and Restore MAAS Deployment](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/backup-and-restore-maas-deployment.md) for details.
## Sunbeam-clusterd
### Backup
It’s recommended to create a backup of sunbeam-clusterd data by running the following command:
```text
juju exec -a sunbeam-clusterd -- tar -cvf /home/ubuntu/backup.tar /var/snap/openstack/common/state/database
```
Note that the backup file is created in the home directory of the ubuntu user, so it needs to be
moved to a safe location after the backup is created.
### Restore
If a unit has a corrupted database, it’s possible to restore the backup by running the following command:
```text
# stop the clusterd service before restoring the backup
juju exec -a sunbeam-clusterd -- sudo systemctl stop snap.openstack.clusterd.service
# remove snapshots and segments database files from the corrupted unit
juju exec -u sunbeam-clusterd/{unit} -- rm /var/snap/openstack/common/state/database/snapshot*
juju exec -u sunbeam-clusterd/{unit} -- rm /var/snap/openstack/common/state/database/000000*
# restore the backup on the corrupted unit
juju exec -u sunbeam-clusterd/{unit} -- tar -xvf /home/ubuntu/backup.tar -C /
# start the clusterd service after restoring the backup
juju exec -a sunbeam-clusterd -- sudo systemctl start snap.openstack.clusterd.service
```
# index.html.md
# Live Migration
## Overview
An instance migration is the relocation of an instance from one
hypervisor to another.
When an instance has a live migration performed it is not shut down
during the process. This is useful when there is an imperative to not
interrupt the applications that are running on the instance.
Points to consider:
- network usage may be significantly impacted if block migration mode
is used
- instances with intensive memory workloads may require pausing for
live migration to succeed
## Ensure adequate capacity on the destination host
Oversubscribing the destination host (hypervisor) can lead to service
outages. This is only an issue when a destination host is explicitly
selected by the operator.
The following commands are useful for discovering a instance’s flavor,
listing flavor parameters, and viewing the available capacity of a
destination host:
```text
openstack server show -c flavor
openstack flavor show -c vcpus -c ram -c disk
openstack hypervisor list
openstack host show
```
## Live migrate an instance
Live migration commands require the user to have the admin role.
To live migrate to any hypervisor with sufficient capacity:
```default
openstack server migrate --live-migration
```
To live migrate to a specific hypervisor:
```default
openstack server migrate --live-migration --os-compute-api-version 2.30 --host
```
If the instance has local storage, you must also specify the
`--block-migration` option:
```default
openstack server migrate --block-migration --live-migration
```
# index.html.md
# Scaling the cluster out
Canonical OpenStack scales out, meaning that you can add more machines to the cluster if you need more resources or if you’re designing the cloud for high availability.
Make sure you get familiar with the following sections before proceeding with any instructions listed below:
* [Architecture](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/architecture.md)
* [Design considerations](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/design-considerations.md)
* [Enterprise requirements](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/enterprise-requirements.md)
* [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md)
## Scaling the cluster out using the manual bare metal provider
The following section provides instructions on scaling the cluster out with the manual bare metal provider.
### Requirements
You will need:
* Canonical OpenStack already installed using the [manual bare metal provider](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/install/install-canonical-openstack-using-the-manual-bare-metal-provider.md)
* one dedicated physical machine with:
* hardware specifications matching minimum hardware specifications as documented under the [Enterprise requirements](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/enterprise-requirements.md) section
* fresh Ubuntu Server 24.04 LTS installed
If you can’t provide an unlimited access to the Internet, see the [Manage a proxied environment](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-a-proxied-environment.md) section.
### Create a registration token
#### WARNING
Clustering does not support base hostnames. Nodes are only recognized by their **FQDNs**.
A registration token has to be created first for the other machine to be able to join the existing Canonical OpenStack cluster.
In order to create a registration token for the new machine, execute the `sunbeam cluster add` command on the first machine in the cluster (aka primary node):
```text
sunbeam cluster add FQDN --output FILE
```
`FQDN` is a fully qualified domain name (FQDN) of the machine being added.
`FILE` is a name of the file where to save the registration token.
For example, to create a registration token for the *cloud-2* machine from the [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md) section, execute the following command on the *cloud-1* machine:
```text
sunbeam cluster add cloud-2.example.com --output cloud-2.asc
```
Sample output:
```text
Token written to file: /home/ubuntu/cloud-2.asc
```
Copy the file with the token (here `cloud-2.asc`) to the machine that you want to add to the cluster.
### Provision the new machine
Switch to the machine that you want to add and proceed with the provisioning procedure described below.
#### Install the snap
First, install the `openstack` snap:
```text
sudo snap install openstack
```
This will install the latest stable version by default. You can use the `--channel` switch to install a different version of OpenStack instead. All machines in the cluster must have the same version of OpenStack installed.
#### Prepare the machine
To prepare the machine for Canonical OpenStack usage, execute the following command:
```text
sunbeam prepare-node-script | bash -x && newgrp snap_daemon
```
This command will:
* ensure all required software dependencies are installed, including the `openssh-server`,
* configure passwordless access to the `sudo` command for all terminal commands for the currently logged in user (i.e. `NOPASSWD:ALL`).
#### Add the machine to the cluster
In order to add the machine to the cluster, execute the `sunbeam cluster join` command on that machine
```text
cat FILE | sunbeam cluster join --role ROLES -
```
`FILE` is a name of the file with the registration token.
`ROLES` is a comma-separated list of roles (`control`, `compute`, `network`, `storage`) to assign to the machine being added.
For example, to add the *cloud-2* machine from the [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md) section, execute the following command:
```text
cat cloud-2.asc | sunbeam cluster join --role control,compute,storage -
```
One finished, you should be able to see the following message on your screen:
```text
Node joined cluster with roles: storage, control, compute
```
### Resize the cluster
When provisioning new machines with the `control` role assigned, the cluster needs to be resized to make use of those machines for the purpose of hosting control functions.
To resize the cluster, execute the following command on any of the machines:
```text
sunbeam cluster resize
```
## Scaling the cluster out using Canonical MAAS
The following section provides instructions on scaling the cluster out with Canonical MAAS.
### Requirements
You will need:
* Canonical OpenStack already installed using [Canonical MAAS](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/install/install-canonical-openstack-using-canonical-maas.md)
* one dedicated physical machine:
* with hardware specifications matching minimum hardware specifications as documented under the [Enterprise requirements](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/enterprise-requirements.md) section
* ready to be used by MAAS (enlisted, commissioned, configured and tagged)
If you can’t provide an unlimited access to the Internet, see the [Manage a proxied environment](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-a-proxied-environment.md) section.
### Provision the new machine
To provision the machine, execute the following command on the first *Sunbeam Client* machine (aka primary node):
```text
sunbeam cluster deploy
```
# index.html.md
# Cluster upgrades
## Overview
A full cluster refresh is a multi-step process. Some components require
dedicated refresh commands and must be refreshed in a specific order before
running the general `sunbeam cluster refresh` command.
#### NOTE
Refreshing across release tracks is not supported. For example, you cannot
use the refresh command to upgrade from `2024.1/stable` to `2025.1/stable`.
## Prerequisites
To ensure the latest updates are available to the cluster charms, refresh the
`openstack` snap before running any cluster refresh commands.
* **Manual provider:** Run `sudo snap refresh openstack` on all nodes.
* **MAAS provider:** Run it on the sunbeam client node only.
#### IMPORTANT
Refreshing the `openstack` snap does not automatically refresh the
cluster. You must explicitly run the dedicated cluster refresh commands
described below to apply updates to the running services.
## Step 1 - Refresh Kubernetes
The Canonical Kubernetes (k8s) charm requires a dedicated refresh command and
must be refreshed before the other components. Run:
```text
sunbeam cluster refresh k8s
```
This command supports **patch-level upgrades only**:
- Refreshing to the latest revision within the currently deployed channel/risk.
- Changing the risk level within the same track
(for example, from `1.32/stable` to `1.32/edge`).
- Refreshing to a specific revision pinned in a manifest file.
#### IMPORTANT
Track upgrades (minor or major Kubernetes version changes, for example
from `1.32` to `1.35`) are **not supported** by this command. Attempting
a track upgrade will return an error.
## Step 2 - Refresh Vault
Vault requires a dedicated refresh command. Run:
```text
sunbeam cluster refresh vault
```
Following a refresh, the Vault charm is left in a sealed state.
Unless Vault was enabled in dev mode, you must manually unseal it.
For detailed instructions on unsealing and authorizing Vault, see
[Vault feature](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/vault.md).
## Step 3 - Refresh MySQL
The MySQL database must be refreshed before the application charms that depend
on it. Run the following command to refresh the charm to the latest revision
in its channel:
```text
sunbeam cluster refresh mysql
```
During this process, the MySQL cluster is temporarily scaled up to the
nearest odd number of units to maintain quorum while units are upgraded
on a rolling basis. To ensure the upgrade proceeds as intended, it should
be triggered from a healthy MySQL cluster state. If the cluster state is manually
manipulated during the upgrade, the process may not proceed as expected.
If the upgrade is interrupted, it can usually be re-run and will resume from
where it left off.
If the upgrade has been interrupted and is in an inconsistent state, use the
`--reset-mysql-upgrade-state` flag to restart it from the beginning:
```text
sunbeam cluster refresh mysql --reset-mysql-upgrade-state
```
You will be prompted to confirm before resetting the state. This action
resets the internal upgrade tracking and starts a new refresh process. It does
not revert any changes already applied to the cluster.
## Step 4 - Refresh the cluster
Once Kubernetes, Vault and MySQL have been refreshed, refresh all remaining OpenStack
charms:
```text
sunbeam cluster refresh
```
If the snap has been refreshed to a different risk level in its channel
(for example, from `stable` to `beta`) since the last update, the command
will prompt you to confirm before proceeding. In this case, it is recommended
to supply a manifest file:
```text
sunbeam cluster refresh --manifest
```
Use `--force` to skip the confirmation prompt:
```text
sunbeam cluster refresh --force
```
Use the `--clear-manifest` flag to remove a previously
stored manifest:
```text
sunbeam cluster refresh --clear-manifest
```
## Multi-region deployments
In a multi-region deployment, run the following for each secondary region
after completing the cluster refresh. This adds the `cors-origin` relation
between Horizon on the region controller and Glance in the secondary region,
which is required for image uploads from the dashboard.
```default
controller="sunbeam-controller-region-controller"
# Usually the region controller fqdn
owner="$ownerFqdn"
juju switch openstack
juju consume $controller:$owner/openstack.horizon-cors-origin
juju integrate horizon-cors-origin glance:cors-origin
```
# index.html.md
# Manage experimental features
## Overview
Canonical OpenStack supports experimental features that are not enabled
by default. These features are controlled through feature gates, which
allow operators to opt in to functionality that is still under active
development or not yet considered production-ready.
Use the commands documented here to discover available feature gates and
to enable or disable them.
## List feature gates
Feature gates group one or more related features under a common flag.
To list all available feature gates:
```text
sunbeam list-feature-gates
```
Example output:
```default
Feature Gates
+---------------------------+-----------------+-------------------+----------+
| Gate Key | Type | Name | Unlocked |
+===========================+=================+===================+==========+
| feature.baremetal | feature | baremetal | |
+---------------------------+-----------------+-------------------+----------+
| feature.microovn-sdn | feature-gate | microovn-sdn | |
+---------------------------+-----------------+-------------------+----------+
| feature.multi-region | feature-gate | multi-region | |
+---------------------------+-----------------+-------------------+----------+
| feature.shared-filesystem | feature | shared-filesystem | |
+---------------------------+-----------------+-------------------+----------+
| feature.storage.dellsc | storage-backend | dellsc | |
+---------------------------+-----------------+-------------------+----------+
| feature.storage.hitachi | storage-backend | hitachi | |
+---------------------------+-----------------+-------------------+----------+
```
The output lists each gate’s key (used with `snap set`), its type, and name.
The **Unlocked** column is set when the feature gate has been enabled by setting
its key to `true` via `sudo snap set openstack`.
## Enable an experimental feature
To enable an experimental feature, set its corresponding snap
configuration option to `true`:
```text
sudo snap set openstack feature.=true
```
Replace `` with the gate key of the feature you want to
enable. For example, to enable the `multi-region` feature gate:
```text
sudo snap set openstack feature.multi-region=true
```
#### NOTE
Experimental features may change or be removed in future releases.
Enable them only in environments where instability is acceptable.
## Disable an experimental feature
To disable a previously enabled experimental feature:
```text
sudo snap set openstack feature.=false
```
# index.html.md
# Enable and deploy a gated storage backend
Use this procedure to unlock a gated in-tree storage backend in the CLI and
then deploy it. For general information about feature gates, see
[Manage experimental features](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/manage-experimental-features.md).
#### NOTE
Pure Storage is generally available and does not require a feature gate.
Add it directly with `sunbeam storage add purestorage ...`.
## List the available feature gates
List the gates that are available in your deployment:
```text
sunbeam list-feature-gates
```
Identify the gate key for the storage backend that you want to deploy. Current
gated in-tree storage backends use keys such as
`feature.storage.dellsc` and `feature.storage.hitachi`.
## Enable the storage backend gate
Unlock the backend by setting its feature gate to `true`:
```text
sudo snap set openstack feature.storage.=true
```
Replace `` with the storage backend name, for example
`dellsc` or `hitachi`.
#### NOTE
Unlocking the gate makes the backend visible in the CLI. It does not deploy
the backend.
## Verify that the backend is unlocked
Run the feature gate command again and confirm that the **Unlocked** column is
set for your storage backend:
```text
sunbeam list-feature-gates
```
If the backend does not appear immediately in the CLI, start a new command
invocation and check again.
In local multi-node deployments, gate changes propagate automatically across
nodes in roughly 5 to 10 seconds. In MAAS deployments, you may need to run the
same `snap set` command on each node even though the gate state is still
stored in the cluster database.
## Review the backend options in the CLI
After the gate is unlocked, confirm that the backend is now exposed by
the storage commands:
```text
sunbeam storage add --help
```
or:
```text
sunbeam storage options
```
Use `sunbeam storage options ` to review the configuration fields
required by the backend before you create its YAML configuration file.
## Deploy the backend
Add the backend by using the backend type, an instance name, and a backend
configuration file:
```text
sunbeam storage add --config-file .yaml
```
For example, to deploy a Hitachi backend:
```text
sunbeam storage add hitachi hitachi-prod --config-file hitachi.yaml
```
## Verify the deployment
List deployed storage backends and confirm that the new backend is present:
```text
sunbeam storage list
```
Once deployed, the backend remains managed separately from the feature gate
state.
# index.html.md
# Deploy a Pure Storage backend
## Overview
Use this procedure to deploy a Pure Storage backend for Cinder. The backend is
deployed as the `cinder-volume-purestorage` charm.
## Requirements
You will need:
* a bootstrapped Canonical OpenStack deployment with storage capability already
in place
* network connectivity from the storage nodes to the Pure Storage array
* a valid Pure Storage API token
* a backend instance name that satisfies Juju application naming rules,
for example `pure-prod`
## Inspect the available options
If you want to review the supported configuration keys before deploying the
backend, run:
```text
sunbeam storage options purestorage
```
## Create the backend configuration
You can provide the backend settings in a YAML file or pass the equivalent CLI
options directly to the deployment command. The required keys are `san-ip`
and `pure-api-token`.
For example, create a file named `purestorage.yaml` with the following
content:
```yaml
san-ip: 192.0.2.10
pure-api-token: 01234567-89ab-cdef-0123-456789abcdef
protocol: iscsi
volume-backend-name: pure-iscsi
backend-availability-zone: az1
pure-iscsi-cidr: 192.0.2.0/24
```
Set `protocol` to `iscsi`, `fc`, or `nvme` to match your deployment.
For NVMe/TCP deployments, you can also set `pure-nvme-cidr` and
`pure-nvme-transport`. Set `pure-nvme-transport` to `tcp`.
## Deploy the backend
Deploy the backend with the backend type (`purestorage`), a
Juju-compatible backend instance name, and the configuration file:
```text
sunbeam storage add purestorage pure-prod --config-file purestorage.yaml
```
If you prefer not to use a file, pass the equivalent options directly on the
command line.
## Verify the backend
Check that the backend has been added:
```text
sunbeam storage list
```
To inspect the deployed backend in more detail, run:
```text
sunbeam storage show pure-prod
```
# index.html.md
# Maintenance mode
## Overview
Maintenance mode helps by protecting the cluster from potentially disruptive maintenance operations. It is useful for performing maintenance tasks on a node that may result in a loss of data or disrupt running services such as firmware upgrades.
Before proceeding, refer to the [Maintenance Mode](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/maintenance-mode.md) to understand its functionality and impact.
## Enabling Maintenance feature
```text
sunbeam enable maintenance
```
Maintenance mode relies on [OpenStack Watcher](https://wiki.openstack.org/wiki/Watcher) to manage hypervisor services and virtual machine instances. Enabling Maintenance mode feature will also enable resource optimization feature to deploy required applications like watcher.
## Usage
### Enabling Maintenance Mode
Before enabling maintenance mode, perform a dry run to check for potential issues:
```text
sunbeam cluster maintenance enable [--disable-migration[=live|cold|both]] --dry-run
Continue to run operations to enable maintenance mode for :
0: change_nova_service_state state=disabled resource=
1: Migrate instance type=live resource=test-vm1
2: Migrate instance type=live resource=test-vm2
3: set-noout-ops
4: assert-noout-flag-set-ops
```
If no issues are reported, enable maintenance mode:
```text
sunbeam cluster maintenance enable [--disable-migration[=live|cold|both]]
Continue to run operations to enable maintenance mode for :
0: change_nova_service_state state=disabled resource=
1: Migrate instance type=live resource=test-vm1
2: Migrate instance type=live resource=test-vm2
3: set-noout-ops
4: assert-noout-flag-set-ops
[y/n]: y
Operation result:
0: change_nova_service_state state=disabled resource= SUCCEEDED
1: Migrate instance type=live resource=test-vm1 SUCCEEDED
2: Migrate instance type=live resource=test-vm2 SUCCEEDED
3: set-noout-ops SUCCEEDED
4: assert-noout-flag-set-ops SUCCEEDED
Enable maintenance for node:
```
#### Controlling migration behavior
By default, enabling maintenance mode will live migrate active instances and cold
migrate inactive instances. The `--disable-migration` flag allows operators to
control this behavior during maintenance.
#### NOTE
If `--disable-migration` is not specified, the default behavior is unchanged.
To disable live migration (cold migrate both active and inactive instances):
```text
sunbeam cluster maintenance enable --disable-migration=live
```
To disable cold migration (live migrate active instances, ignore inactive instances):
```text
sunbeam cluster maintenance enable --disable-migration=cold
```
To disable all migration (only stop active instances, ignore inactive instances):
```text
sunbeam cluster maintenance enable --disable-migration=both
```
Or equivalently, without specifying a value:
```text
sunbeam cluster maintenance enable --disable-migration
```
The `--disable-migration` flag can be combined with `--dry-run` to preview the
effect before applying:
```text
sunbeam cluster maintenance enable --disable-migration=live --dry-run
```
### Disabling Maintenance Mode
To disable maintenance mode, first run a dry run to validate the operation:
```text
sunbeam cluster maintenance disable --dry-run
required operations to disable maintenance mode for :
0: EnableHypervisorStep
1: unset-noout-ops
2: assert-noout-flag-unset-ops
3: start-osd-ops
Disable maintenance for node:
```
If the output confirms a safe transition, disable maintenance mode:
```text
sunbeam cluster maintenance disable
Continue to run operations to disable maintenance mode for :
0: EnableHypervisorStep
1: unset-noout-ops
2: assert-noout-flag-unset-ops
3: start-osd-ops
[y/n]: y
Operation result:
0: EnableHypervisorStep SUCCEEDED
1: unset-noout-ops SUCCEEDED
2: assert-noout-flag-unset-ops SUCCEEDED
3: start-osd-ops SUCCEEDED
Disable maintenance for node:
```
# index.html.md
# Scaling the cluster in
Canonical OpenStack scales in, meaning that you can remove machines from the cluster if you no longer need them.
## Scaling the cluster in using the manual bare metal provider
The following section provides instructions on scaling the cluster in with the manual bare metal provider.
These instructions apply to all node types but the primary node. For instruction on the latter, refer to [Removing the primary node](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/removing-the-primary-node.md) section of this documentation.
### Remove the machine from the cluster
To remove the machine from the cluster, execute the `sunbeam cluster remove` command on the primary node:
```text
sunbeam cluster remove FQDN
```
`FQDN` is a fully qualified domain name (FQDN) of the machine being removed.
For example, to remove the *cloud-2* machine from the [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md) section, execute the following command:
```text
sunbeam cluster remove cloud-2.example.com
```
### Remove components from the machine
Software components now need to be removed from the target node. Perform all the below steps on the target node.
Remove the Juju agent:
```text
sudo /sbin/remove-juju-services
```
Remove the `juju` snap:
```text
sudo snap remove --purge juju
```
Remove Juju configuration:
```text
rm -rf ~/.local/share/juju
```
Remove the `openstack-hypervisor` and `openstack` snaps:
```text
sudo snap remove --purge openstack-hypervisor
sudo snap remove --purge openstack
```
Remove `openstack` snap configuration:
```text
rm -rf ~/.local/share/openstack
```
Remove the `k8s` snap:
```text
sudo k8s remove-node
sudo snap remove --purge k8s
```
#### NOTE
The above steps can take a few minutes to complete.
Remove the disk(s) used by MicroCeph on this node:
```text
sudo microceph disk list
sudo microceph disk remove
```
Remove the `microceph` snap:
```text
sudo microceph disk list
sudo snap remove --purge microceph
```
If required clean the disk(s) identified in the earlier command:
#### WARNING
The `dd` command will result in the permanent erasure of data. It is vital that you have specified the correct disk path to avoid unintended data loss.
```text
sudo dd if=/dev/zero of=PATH bs=4M count=10
```
`PATH` is a path to the disk being cleaned.
Clear the remaining network configuration with a reboot:
```text
sudo reboot
```
## Scaling the cluster in using Canonical MAAS
The following section provides instructions on scaling the cluster out with Canonical MAAS.
Coming soon.
# index.html.md
# Removing the primary node
Removing the primary node refers to the removal of the first (bootstrap) node in the cluster and is only applicable when using the manual bare metal provider.
If the deployment consists of multiple nodes then remove all non-primary nodes before removing the primary node. Refer to the [Scaling the cluster in](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/scaling-the-cluster-in.md) section of this documentation for exact instructions on how to do that.
## Remove components from the machine
#### WARNING
Removing the primary node will destroy the entire Canonical OpenStack deployment.
Software components now need to be removed from the primary node. Perform all the below steps on the primary node.
Remove the Juju models:
```text
juju destroy-model --destroy-storage --no-prompt --force --no-wait openstack
juju destroy-model --destroy-storage --no-prompt --force --no-wait admin/openstack-machines
```
Remove the Juju controller:
```text
juju destroy-controller --no-prompt --destroy-storage --force --no-wait localhost-localhost
```
Remove the Juju agent:
```text
sudo /sbin/remove-juju-services
```
Remove the `juju` snap:
```text
sudo snap remove --purge juju
```
Remove Juju configuration:
```text
rm -rf ~/.local/share/juju
sudo rm -rf /var/lib/juju/dqlite
sudo rm -rf /var/lib/juju/system-identity
sudo rm -rf /var/lib/juju/bootstrap-params
```
Remove the `openstack-hypervisor` and `openstack` snaps:
```text
sudo snap remove --purge openstack-hypervisor
sudo snap remove --purge openstack
```
Remove `openstack` snap configuration:
```text
rm -rf ~/.local/share/openstack
```
Remove the `k8s` snap:
```text
sudo snap remove --purge k8s
```
Remove the `microovn` snap:
```text
sudo snap remove --purge microovn
```
#### NOTE
The above steps can take a few minutes to complete.
Remove the disk(s) used by MicroCeph on this node:
```text
sudo microceph disk list
sudo microceph disk remove --bypass-safety-checks
```
#### NOTE
`sudo microceph disk list` may list the un-partitioned disks on the system. These can be ignored.
Remove the `microceph` snap:
```text
sudo snap remove --purge microceph
```
If required clean the disk(s) identified in the earlier command:
#### WARNING
The `dd` command will result in the permanent erasure of data. It is vital that you have specified the correct disk path to avoid unintended data loss.
```text
sudo dd if=/dev/zero of=PATH bs=4M count=10
```
`PATH` is a path to the disk being cleaned.
Clear the remaining network configuration with a reboot:
```text
sudo reboot
```
# index.html.md
# Troubleshooting
* [Inspecting the cluster](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/troubleshooting/inspecting-the-cluster.md)
* [Overview](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/troubleshooting/inspecting-the-cluster.md#overview)
* [Juju](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/troubleshooting/inspecting-the-cluster.md#juju)
* [OpenStack Hypervisor](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/troubleshooting/inspecting-the-cluster.md#openstack-hypervisor)
* [Canonical Kubernetes](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/troubleshooting/inspecting-the-cluster.md#canonical-kubernetes)
* [Services hosted on Canonical Kubernetes](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/troubleshooting/inspecting-the-cluster.md#services-hosted-on-canonical-kubernetes)
* [MicroCeph](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/troubleshooting/inspecting-the-cluster.md#microceph)
* [Sunbeam MicroCluster](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/troubleshooting/inspecting-the-cluster.md#sunbeam-microcluster)
* [Terraform plans](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/troubleshooting/inspecting-the-cluster.md#terraform-plans)
# index.html.md
# Inspecting the cluster
## Overview
Sunbeam aims to remove the need for an operator to know all of the
technical detail about how to deploy an OpenStack cloud; however when
something does go wrong it’s important to be able to inspect the various
components in order to discover the nature of the problem.
## Juju
Sunbeam makes extensive use of Juju to manage the components of the
OpenStack cloud across both the underlying nodes and on Kubernetes (see
Canonical Kubernetes).
Sunbeam uses two Juju models for managing the various components
deployed to create the OpenStack cloud.
### Juju controller authentication
Sunbeam uses a set of credentials for each node in the cluster for
access to the Juju controller. The authenticated session for each node
expires after 24 hours so to use the `juju` command directly it may be
necessary to re-authenticate.
Juju commands will prompt for a password once the session has expired -
the password for the node’s user can be found in
`${HOME}/snap/openstack/current/account.yaml`.
Alternatively the `juju-login` helper can be used to re-authenticate
with the Juju controller:
```default
sunbeam utils juju-login
```
### Controller model
The `controller` model contains the Canonical OpenStack components that are
placed directly on the nodes that make up the deployment. The status of
this model can be queried using the following command:
```default
juju status -m admin/controller
```
This should work from any node in the deployment
This model contains the application deployments for the Canonical K8s
(control role), MicroOVN (network role), MicroCeph (storage role) and OpenStack Hypervisor
(compute role) components of Canonical OpenStack.
Depending on the roles assigned to individual machines, a unit of each
of the applications should be present in the model.
The controller application is a special application that represents the
Juju controller.
### OpenStack model
The `openstack` model contains all of the components of the OpenStack
Cloud that are deployed on top of Kubernetes (provided by Canonical K8s
from the `controller` model).
The status of this model can be queried using the following command:
```default
juju status -m openstack
```
This should work from any node in the deployment.
#### CAUTION
If the storage role is not specified for any nodes in the deployment the
`cinder-ceph` application will remain in a blocked state. This is expected
and means that the deployed OpenStack cloud does not support the block storage
service.
## OpenStack Hypervisor
The OpenStack Hypervisor is a snap based component that provides all of
the core functionality needed to operate a hypervisor as part of an
OpenStack Cloud. This include Nova Compute, Libvirt+QEMU for hardware
based virtualization, OVN and OVS for software defined networking and
supporting services to provide metadata to instances.
The status of the snap’s services can be checked using:
```default
sudo systemctl status snap.openstack-hypervisor.*
```
All log output for the services can be captured by consulting the
journal:
```default
sudo journalctl -xe -u snap.openstack-hypervisor.*
```
This component is deployed and integrated into the cloud using the
`openstack-hypervisor` charm that is deployed in the `controller`
model.
## Canonical Kubernetes
Canonical Kubernetes (K8s) provides Kubernetes as part of Canonical OpenStack.
The current status of the K8s cluster can be checked by running:
```default
sudo k8s status
```
A more in-depth inspection and generation of a archive suitable for use
as part of a bug submission can also be completed by running:
```default
sudo k8s inspect
```
## Services hosted on Canonical Kubernetes
Components of OpenStack Control Plane are hosted on K8S.
You can get the different units by running:
```default
sudo k8s kubectl get pods --namespace openstack
```
If a pod is in an error state, or is stuck in a `Pending` state, you
can retrieve more information on it and events related to it by running:
```default
sudo k8s kubectl describe --namespace openstack pod
```
To fetch the logs of a specific unit on K8S, it is necessary to
know the name of the containers running inside a given pod. To get the
names of the containers:
```default
sudo k8s kubectl get pod --namespace openstack -o jsonpath="{.spec.containers[*].name}"
```
A Juju unit will always have a `charm` container running the Juju
agent responsible for running the charm. To fetch logs associated with
the charm of a particular unit:
```default
sudo k8s kubectl logs --namespace openstack --container charm
```
#### NOTE
The charm container logs are also available through `juju debug-log -m openstack`,
and will be present in the sunbeam inspection report.
To fetch the payload logs, use:
```default
sudo k8s kubectl logs --namespace openstack --container
```
## MicroCeph
If nodes are deployed with the storage role enabled, MicroCeph will be
deployed as part of the cluster.
The status of MicroCeph can be checked using:
```default
sudo microceph status
```
and the status of the Ceph cluster can be displayed using:
```default
sudo ceph -s
```
## Sunbeam MicroCluster
Sunbeam MicroCluster provides some basic cluster coordination and state
sharing services as part of Canonical OpenStack. The status of the nodes
participating in the Sunbeam MicroCluster can be queried using the
following command:
```default
sunbeam cluster list
```
The state of the local daemon managing the nodes participation in the
cluster can also be checked and the log output captured if need be:
```text
sudo systemctl status snap.openstack.clusterd.service
sudo journalctl -xe -u snap.openstack.clusterd.service
```
## Terraform plans
Sunbeam makes extensive use of Terraform to deploy OpenStack. In some
rare cases a Terraform plan can stay locked making it impossible to
re-run commands on the bootstrap node or add new nodes to the
deployment.
To list the current lock state of all Terraform plans:
```default
sunbeam plans list
```
To unlock a specific Terraform plan:
```default
sunbeam plans unlock
```
This command may prompt you to confirm unlocking depending on how recent
the lock timestamp is.
#### CAUTION
Ensure that there are no administrative operations underway in the
deployment when unlocking a Terraform plan. Otherwise, the deployment’s
integrity can be compromised.
Logs from running Terraform can be found in:
```default
$HOME/snap/openstack/common/etc//*/terraform-*.log
```
#### NOTE
cloud_name is the name of the juju cloud created when bootstrapping sunbeam.
It is usually the only directory in $HOME/snap/openstack/common/etc/.
# index.html.md
# Telemetry
This feature deploys the OpenStack Telemetry services Ceilometer, Aodh,
Gnocchi, and OpenStack Exporter.
## Enabling Telemetry
To enable Telemetry, run the following command:
```bash
sunbeam enable telemetry
```
Use the OpenStack CLI to create and manage alarms. See the upstream
[Aodh
documentation](https://docs.openstack.org/aodh/latest/admin/telemetry-alarms.html#using-alarms)
for details.
## Disabling Telemetry
To disable Telemetry, run the following command:
```bash
sunbeam disable telemetry
```
This will terminate the application but not remove it from the model. To
do that, run the following:
```default
juju remove-application --force --no-wait --no-prompt -m openstack \
ceilometer gnocchi gnocchi-mysql-router aodh aodh-mysql-router
```
## Usage
### Alarms
Users need the role `admin` to be able to manage alarms.
Create alarm `memory_high` with metric `metric.usage` and alarm
action `log` using the following command:
```default
openstack alarm create \
--name memory_high \
--type gnocchi_resources_threshold \
--description 'instance consuming memory' \
--metric memory.usage \
--threshold 2000 \
--comparison-operator gt \
--aggregation-method mean \
--granularity 300 \
--evaluation-periods 3 \
--alarm-action 'log://' \
--resource-id \
--resource-type instance
```
Sample output:
```default
+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| aggregation_method | mean |
| alarm_actions | ['log:'] |
| alarm_id | d365506b-fc14-479d-b34d-0f3ae267a858 |
| comparison_operator | gt |
| description | instance consuming memory |
| enabled | True |
| evaluate_timestamp | 2023-10-13T04:07:14.849164 |
| evaluation_periods | 3 |
| granularity | 300 |
| insufficient_data_actions | [] |
| metric | memory.usage |
| name | memory_high |
| ok_actions | [] |
| project_id | 815325ab42e443fbb6fc6eb8905c5aa8 |
| repeat_actions | False |
| resource_id | 1f12876c-b320-436a-9ae9-5fd8e065e69f |
| resource_type | instance |
| severity | low |
| state | insufficient data |
| state_reason | Not evaluated yet |
| state_timestamp | 2023-10-13T04:07:14.792561 |
| threshold | 2000.0 |
| time_constraints | [] |
| timestamp | 2023-10-13T04:07:14.792561 |
| type | gnocchi_resources_threshold |
| user_id | d9730bd835bc4620ab3e6b06c5b17477 |
+---------------------------+--------------------------------------+
```
Check the metrics for `memory.usage` using the following command:
```default
openstack metric measures show -r memory.usage --granularity 300
```
Sample output:
```default
+---------------------------+-------------+---------------+
| timestamp | granularity | value |
+---------------------------+-------------+---------------+
| 2023-10-13T03:45:00+00:00 | 300.0 | 2138.51171875 |
| 2023-10-13T03:50:00+00:00 | 300.0 | 2138.46875 |
| 2023-10-13T03:55:00+00:00 | 300.0 | 2138.4609375 |
| 2023-10-13T04:00:00+00:00 | 300.0 | 2138.4609375 |
| 2023-10-13T04:05:00+00:00 | 300.0 | 2138.4609375 |
+---------------------------+-------------+---------------+
```
Check alarm history for any alarm events triggered using the following
command:
```default
openstack alarm-history show --fit-width
```
Sample output:
```default
+----------------------------+------------------+-------------------------------------------------------------------------------------------------------------------+--------------------------------------+
| timestamp | type | detail | event_id |
+----------------------------+------------------+-------------------------------------------------------------------------------------------------------------------+--------------------------------------+
| 2023-10-13T04:08:45.607387 | state transition | {"state": "alarm", "transition_reason": "Transition to alarm due to 3 samples outside threshold, most recent: | 1ae90db8-124a-4e9a-9e76-5a81216ac54c |
| | | 2138.4609375"} | |
| 2023-10-13T04:07:14.792561 | creation | {"alarm_id": "d365506b-fc14-479d-b34d-0f3ae267a858", "type": "gnocchi_resources_threshold", "enabled": true, | b991407b-511e-40ba-a353-f63e8e60782c |
| | | "name": "memory_high", "description": "instance consuming memory", "timestamp": "2023-10-13T04:07:14.792561", | |
| | | "user_id": "d9730bd835bc4620ab3e6b06c5b17477", "project_id": "815325ab42e443fbb6fc6eb8905c5aa8", "state": | |
| | | "insufficient data", "state_timestamp": "2023-10-13T04:07:14.792561", "state_reason": "Not evaluated yet", | |
| | | "ok_actions": [], "alarm_actions": ["log://"], "insufficient_data_actions": [], "repeat_actions": false, | |
| | | "time_constraints": [], "severity": "low", "rule": {"granularity": 300, "comparison_operator": "gt", "threshold": | |
| | | 2000.0, "aggregation_method": "mean", "evaluation_periods": 3, "metric": "memory.usage", "resource_id": | |
| | | "1f12876c-b320-436a-9ae9-5fd8e065e69f", "resource_type": "instance"}} | |
+----------------------------+------------------+-------------------------------------------------------------------------------------------------------------------+--------------------------------------+
```
Alarm `memory_high` is created with alarm action `log`, so check for
log events on `aodh-evaluator`:
```default
sudo k8s kubectl -n openstack logs aodh-0 -c aodh-notifier | grep memory_high
2023-10-13T04:08:45.650Z [aodh-notifier] 2023-10-13 04:08:45.648 17 INFO aodh.notifier.log [-]
Notifying alarm memory_high d365506b-fc14-479d-b34d-0f3ae267a858 of low priority from insufficient data to alarm with action log: because Transition to alarm due to 3 samples outside threshold, most recent: 2138.4609375.
```
### OpenStack Exporter
When the [Observability](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/observability.md) feature is enabled, you’ll have
access to the Grafana OpenStack dashboards, providing insights about the
cloud usage.
- OpenStack Dashboard: an overview of the various OpenStack components
- OpenStack Overview: higher level overview of the OpenStack deployment
- OpenStack Hypervisor Overview: detailed information of the
hypervisors
# index.html.md
# Optional Features
* [Baremetal as a Service](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/baremetal.md)
* [Enabling Baremetal](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/baremetal.md#enabling-baremetal)
* [Managing nova-ironic shards](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/baremetal.md#managing-nova-ironic-shards)
* [Managing Ironic Conductor groups](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/baremetal.md#managing-ironic-conductor-groups)
* [Managing Neutron Switch Configurations](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/baremetal.md#managing-neutron-switch-configurations)
* [Disabling Baremetal](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/baremetal.md#disabling-baremetal)
* [Containers as a Service](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/caas.md)
* [Enabling CaaS](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/caas.md#enabling-caas)
* [Disabling CaaS](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/caas.md#disabling-caas)
* [Usage](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/caas.md#usage)
* [Limitations:](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/caas.md#limitations)
* [DNS as a Service](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/dns.md)
* [Enabling DNS](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/dns.md#enabling-dns)
* [Disabling DNS](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/dns.md#disabling-dns)
* [Fetching DNS service address](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/dns.md#fetching-dns-service-address)
* [Usage](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/dns.md#usage)
* [Images Sync](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/images-sync.md)
* [Enable Images Sync](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/images-sync.md#enable-images-sync)
* [Disable Images Sync](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/images-sync.md#disable-images-sync)
* [Usage](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/images-sync.md#usage)
* [Instance Recovery](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/instance-recovery.md)
* [Enabling Instance Recovery](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/instance-recovery.md#enabling-instance-recovery)
* [Disabling Instance Recovery](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/instance-recovery.md#disabling-instance-recovery)
* [Encrypted disk recovery](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/instance-recovery.md#encrypted-disk-recovery)
* [Instance Evacuation Recovery methods](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/instance-recovery.md#instance-evacuation-recovery-methods)
* [Create a failover segment](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/instance-recovery.md#create-a-failover-segment)
* [Supplementary information](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/instance-recovery.md#supplementary-information)
* [Limitations](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/instance-recovery.md#limitations)
* [LDAP Integration](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/ldap.md)
* [Enabling LDAP](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/ldap.md#enabling-ldap)
* [Disabling LDAP](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/ldap.md#disabling-ldap)
* [Usage](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/ldap.md#usage)
* [Load Balancer as a Service](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/load-balancer.md)
* [Enabling Load Balancer](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/load-balancer.md#enabling-load-balancer)
* [Enabling the Amphora provider](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/load-balancer.md#enabling-the-amphora-provider)
* [Disabling Load Balancer](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/load-balancer.md#disabling-load-balancer)
* [Usage](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/load-balancer.md#usage)
# Managing TLS
* [Managing TLS](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/index.md)
* [Implementing TLS using a third-party CA](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/implement-tls-using-a-third-party-ca.md)
* [Managing CA](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/tls-ca.md)
* [Managing Vault](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/tls-vault.md)
* [Object Storage](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/object-storage.md)
* [Usage](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/object-storage.md#usage)
* [Observability](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/observability.md)
* [Connect to an existing COS](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/observability.md#connect-to-an-existing-cos)
* [Deploy COS in Canonical OpenStack](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/observability.md#deploy-cos-in-canonical-openstack)
* [Login Grafana dashboard](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/observability.md#login-grafana-dashboard)
* [Dashboard](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/observability.md#dashboard)
* [Orchestration](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/orchestration.md)
* [Enabling Orchestration](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/orchestration.md#enabling-orchestration)
* [Disabling Orchestration](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/orchestration.md#disabling-orchestration)
* [Usage](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/orchestration.md#usage)
* [Resource Optimization](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/resource-optimization.md)
* [Enabling Resource Optimization](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/resource-optimization.md#enabling-resource-optimization)
* [Disabling Resource Optimization](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/resource-optimization.md#disabling-resource-optimization)
* [Usage](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/resource-optimization.md#usage)
* [Limitations](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/resource-optimization.md#limitations)
* [Secrets as a Service](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/secrets.md)
* [Enabling Secrets](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/secrets.md#enabling-secrets)
* [Disabling Secrets](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/secrets.md#disabling-secrets)
* [Usage](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/secrets.md#usage)
* [Audit secret decrypt access](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/secrets.md#audit-secret-decrypt-access)
* [Remove secret decrypt access](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/secrets.md#remove-secret-decrypt-access)
* [Shared Filesystems as a Service](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/shared-filesystem.md)
* [Enabling Shared Filesystems](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/shared-filesystem.md#enabling-shared-filesystems)
* [Disabling Shared Filesystems](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/shared-filesystem.md#disabling-shared-filesystems)
* [Usage](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/shared-filesystem.md#usage)
* [Telemetry](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/telemetry.md)
* [Enabling Telemetry](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/telemetry.md#enabling-telemetry)
* [Disabling Telemetry](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/telemetry.md#disabling-telemetry)
* [Usage](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/telemetry.md#usage)
* [Ubuntu Pro](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/ubuntu-pro.md)
* [Overview](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/ubuntu-pro.md#overview)
* [Enabling Ubuntu Pro](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/ubuntu-pro.md#enabling-ubuntu-pro)
* [Disabling Ubuntu Pro](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/ubuntu-pro.md#disabling-ubuntu-pro)
* [Usage](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/ubuntu-pro.md#usage)
* [Validation](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/validation.md)
* [Overview](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/validation.md#overview)
* [Enable Validation](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/validation.md#enable-validation)
* [Disable Validation](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/validation.md#disable-validation)
* [Usage](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/validation.md#usage)
* [Vault](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/vault.md)
* [Enabling Vault](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/vault.md#enabling-vault)
* [Initializing Vault](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/vault.md#initializing-vault)
* [Unsealing Vault](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/vault.md#unsealing-vault)
* [Authorizing Vault charm](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/vault.md#authorizing-vault-charm)
* [Vault status](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/vault.md#vault-status)
* [Disabling Vault](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/vault.md#disabling-vault)
# index.html.md
# Instance Recovery
This feature deploys [Masakari](https://docs.openstack.org/masakari/latest/index.html), the OpenStack Instance High Availability service. This feature
requires at least two compute nodes in the deployment.
## Enabling Instance Recovery
To enable Instance Recovery, run the following command:
```bash
sunbeam enable instance-recovery
```
#### NOTE
For MAAS provider, ensure to reserve an IP on storage subnet with label -storage-ippool,
see [reference](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/install/install-canonical-openstack-using-canonical-maas.md#reserved-ipranges).
This will be used to perform health checks over the storage network.
When [Secrets](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/secrets.md) is enabled, Masakari is granted
permission to decrypt Barbican secrets by default. This allows Masakari to
rebuild VMs with encrypted disks during instance recovery.
## Disabling Instance Recovery
To disable Instance Recovery, run the following command:
```bash
sunbeam disable instance-recovery
```
## Encrypted disk recovery
Masakari needs access to Barbican secret payloads to recover VMs that use
encrypted disks. Canonical OpenStack enables this access by default with the
`enable-secret-access` option on the `masakari-k8s` charm.
To opt out durably, set the option in the deployment manifest:
```yaml
software:
charms:
masakari-k8s:
config:
enable-secret-access: false
```
Apply the updated manifest when enabling, or re-enabling, Instance Recovery:
```default
sunbeam enable --manifest instance-recovery
```
Disabling this option stops Masakari from requesting the `secret-decrypter`
role. It does not remove existing Keystone role assignments. To audit or remove
existing assignments, follow [the Secrets role audit guidance](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/secrets.md#audit-secret-decrypt-access).
## Instance Evacuation Recovery methods
With Masakari, compute nodes are grouped into failover segments. In the event of a compute node
failure, that node’s instances are moved onto another compute node within the same segment.
The destination node is determined by the recovery method configured for the affected segment.
There are four methods:
* reserved_host
: The `reserved_host` recovery method relocates instances to a subset of non-active nodes.
Because these nodes are not active and are typically resourced adequately for failover duty,
there is a guarantee that sufficient resources will exist on a reserved node to accommodate
migrated instances.
* auto
: The `auto` recovery method relocates instances to any available node in the same segment.
Because all the nodes are active, contrarily to the `reserved_host` method, there is no
guarantee that sufficient resources will exist on the destination node to accommodate migrated
instances.
* rh_priority
: Attempts to evacuate instances using the `reserved_host` method. If the latter is unsuccessful
the auto method will be used.
* auto_priority
: Attempts to evacuate instances using the `auto` method. If the latter is unsuccessful the
`reserved_host` method will be used.
## Create a failover segment
Run the following command to create a failover segment
```default
openstack segment create NAME RECOVERY_METHOD SERVICE_TYPE
```
For example, to create a service S1 with `reserved_host` for service type COMPUTE
```default
openstack segment create S1 reserved_host COMPUTE
```
Sample output for the above command:
```default
+-----------------+--------------------------------------+
| Field | Value |
+-----------------+--------------------------------------+
| created_at | 2024-10-18T04:32:21.000000 |
| updated_at | None |
| uuid | 7980f98d-8458-467b-a5cd-ceb5e6b94cdb |
| name | S1 |
| description | None |
| id | 1 |
| service_type | COMPUTE |
| recovery_method | reserved_host |
| is_enabled | True |
+-----------------+--------------------------------------+
```
Add hosts to failover segment
Run the following command to add host to a failover segment
```default
openstack segment host create NAME TYPE CONTROL_ATTRIBUTE SEGMENT [--reserved] [--on-maintenance]
```
For example, to add host sunbeam1.maas to segment S1, run the following command:
```default
openstack segment host create sunbeam1.maas COMPUTE SSH S1
```
Sample output of the above command:
```default
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| created_at | 2024-10-18T04:32:56.000000 |
| updated_at | None |
| uuid | 7cd21df7-ab9e-4bc3-a69b-13df4f53b125 |
| name | sunbeam1.maas |
| type | COMPUTE |
| control_attributes | SSH |
| reserved | False |
| on_maintenance | False |
| failover_segment_id | 7980f98d-8458-467b-a5cd-ceb5e6b94cdb |
+---------------------+--------------------------------------+
```
Hosts can be reserved when adding to failover segment. These hosts will be used in
`reserved_host` recovery method. For example, to add host `sunbeam3.maas` as reserved,
run the following command:
```default
openstack segment host create --reserved True sunbeam3.maas COMPUTE SSH S1
```
Sample output of the above command:
```default
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| created_at | 2024-10-18T04:33:44.000000 |
| updated_at | None |
| uuid | a641ce79-3610-4753-b59f-9902ee8da4c3 |
| name | sunbeam3.maas |
| type | COMPUTE |
| control_attributes | SSH |
| reserved | True |
| on_maintenance | False |
| failover_segment_id | 7980f98d-8458-467b-a5cd-ceb5e6b94cdb |
+---------------------+--------------------------------------+
```
### List hosts in failover segment
Run below command to list hosts in a failover segment:
```default
openstack segment host list S1 -c name -c reserved -c on_maintenance
```
Sample output of the above command:
```default
+---------------+----------+----------------+
| name | reserved | on_maintenance |
+---------------+----------+----------------+
| sunbeam3.maas | True | False |
| sunbeam2.maas | False | False |
| sunbeam1.maas | False | False |
+---------------+----------+----------------+
```
### Verify reserved_host recovery method
Create failover segment and add hosts to the failover segment. Ensure add few hosts with
`--reserved` flag. Once this is done, disable the reserved host using the following command:
```default
openstack compute service set --disable HOSTNAME nova-compute
```
Run the following command to check status of nova-compute services:
```default
openstack compute service list -c Host -c Status -c State --service nova-compute
```
Sample output of the above command:
```default
+---------------+----------+-------+
| Host | Status | State |
+---------------+----------+-------+
| sunbeam1.maas | enabled | up |
| sunbeam2.maas | enabled | up |
| sunbeam3.maas | disabled | up |
+---------------+----------+-------+
```
In the above output, observe the state of reserved node `sunbeam3.maas` is disabled.
Check the instances running in the cloud using command
```default
openstack server list --long --all-projects -c Name -c Host
```
Sample output:
```default
+----------+---------------+
| Name | Host |
+----------+---------------+
| testvm-2 | sunbeam1.maas |
| testvm-1 | sunbeam1.maas |
+----------+---------------+
```
Simulate a compute node failure by shutting down the interface or bringing down the interface. If
the interface is one of the management or data or storage networks, masakari service will trigger
actions based on recovery strategy. The actions that will be taken for each network failure are
as follows:
#### Recovery actions based on network status
| Management Network | Tenant Network | Storage Network | Action |
|----------------------|------------------|-------------------|----------|
| up | up | up | – |
| up | up | down | recovery |
| up | down | up | – |
| up | down | down | recovery |
| down | up | up | – |
| down | up | down | recovery |
| down | down | up | – |
| down | down | down | recovery |
Verify Hosts in Failover segment once the failure is simulated:
```default
openstack segment host list S1 -c name -c reserved -c on_maintenance
```
Sample output after shutting down node ‘sunbeam1.maas’
```default
+---------------+----------+----------------+
| name | reserved | on_maintenance |
+---------------+----------+----------------+
| sunbeam3.maas | False | False |
| sunbeam2.maas | False | False |
| sunbeam1.maas | False | True |
+---------------+----------+----------------+
```
In the above output, observe the failure node `sunbeam1.maas` is changed to maintenance mode and
reserved node `sunbeam3.maas` is no longer reserved.
Verify the compute service status
```default
openstack compute service list -c Host -c Status -c State --service nova-compute
```
Sample output:
```default
+---------------+----------+-------+
| Host | Status | State |
+---------------+----------+-------+
| sunbeam1.maas | disabled | down |
| sunbeam3.maas | enabled | up |
| sunbeam2.maas | enabled | up |
+---------------+----------+-------+
```
In the above output, observe status of failed node is changed to disabled and reserved node is
changed to `enabled`.
Verify if the instances are evacuated using the below command:
```default
openstack server list --long --all-projects -c Name -c Host
```
Sample output showing instances on failed node are now moved to reserved node.
```default
+----------+---------------+
| Name | Host |
+----------+---------------+
| testvm-2 | sunbeam3.maas |
| testvm-1 | sunbeam3.maas |
+----------+---------------+
```
### Verify auto recovery method
Create failover segment and add hosts to the failover segment without any –reserved flag.
Run below command to list hosts in a failover segment:
```default
openstack segment host list S1 -c name -c reserved -c on_maintenance
```
Sample output of the above command:
```default
+---------------+----------+----------------+
| name | reserved | on_maintenance |
+---------------+----------+----------------+
| sunbeam3.maas | False | False |
| sunbeam2.maas | False | False |
| sunbeam1.maas | False | False |
+---------------+----------+----------------+
```
The reserved flag in all nodes is False.
Simulate the compute node failure and observe Verify Hosts in Failover segment :
```default
openstack segment host list S1 -c name -c reserved -c on_maintenance
```
Sample output after shutting down node `sunbeam1.maas`
```default
+---------------+----------+----------------+
| name | reserved | on_maintenance |
+---------------+----------+----------------+
| sunbeam3.maas | False | False |
| sunbeam2.maas | False | False |
| sunbeam1.maas | False | True |
+---------------+----------+----------------+
```
Observe in the above output node `sunbeam1.maas` is in Maintenance mode.
Verify if the instances are evacuated using the below command:
```default
openstack server list --long --all-projects -c Name -c Host
```
Sample output showing instances on failed node are now moved to different compute hosts.
```default
+----------+---------------+
| Name | Host |
+----------+---------------+
| testvm-2 | sunbeam2.maas |
| testvm-1 | sunbeam3.maas |
+----------+---------------+
```
Observe in the above output the instances are scheduled to any available compute nodes.
## Instance Restart
The enabling of the instance restart feature is done on a per-instance basis.
For example, tag instance `testvm-1` as HA-enabled in order to have it restarted automatically on
its hypervisor:
```default
openstack server set --property HA_Enabled=True testvm-1
```
An instance failure can be simulated by killing its process. First determine its hypervisor and
`qemu` guest name:
```default
openstack server show testvm-1 -c OS-EXT-SRV-ATTR:host -c OS-EXT-SRV-ATTR:instance_name
```
Sample output:
```default
+-------------------------------+-------------------+
| Field | Value |
+-------------------------------+-------------------+
| OS-EXT-SRV-ATTR:host | sunbeam3.maas |
| OS-EXT-SRV-ATTR:instance_name | instance-00000001 |
+-------------------------------+-------------------+
```
Check the current PID, kill the process, wait a minute, and verify that a new process gets started:
```default
juju exec --unit openstack-hypervisor/2 'pgrep -f guest=instance-00000001'
juju exec --unit openstack-hypervisor/2 'sudo pkill -f -9 guest=instance-00000001'
juju exec --unit openstack-hyperivsor/2 'pgrep -f guest=instance-00000001'
```
## Supplementary information
This section contains information that can be useful when working with Masakari.
* Once a failed node has been re-inserted into the cloud it will show, in Nova, as `disabled` but
`up` and, in Masakari, as `on_maintenance`. It can become an active hypervisor with:
```default
openstack compute service set --enable HOSTNAME nova-compute
openstack segment host update --on_maintenance=False SEGMENT HOSTNAME
```
* A segment’s recovery method can be updated with:
```default
openstack segment update --recovery_method RECOVERY_METHOD --service_type COMPUTE SEGMENT
```
* A node cannot be assigned to a segment while it’s assigned to another segment. It must first be
removed from the current segment with:
```default
openstack segment host delete SEGMENT HOSTNAME
```
* A node’s reserved status can be updated with:
```default
openstack segment host update --reserved= SEGMENT HOSTNAME
```
* VMs booting from a Cinder volume with `multiattach=False` might not be evacuated within the
Masakari evacuation window. Nova can trigger evacuation while waiting for Cinder to detach the
volume from the source host. In this case, the evacuation remains pending until the original
attachment is released or the source host becomes available again.
As a workaround, fence the failed source host or otherwise confirm that it is powered off and
that the original attachment is no longer active before resetting the Cinder volume state:
```bash
openstack volume set --state available
```
Resetting the volume state earlier can allow the same boot volume to be attached on another host
while it is still in use on the source host, which can corrupt the guest filesystem.
## Limitations
* Recovery actions for Instance recovery methods can detect only Management network failure. For
failure in tenant or storage network, recovery action is triggered by updating the compute
node to maintenance but evacuation of instances does not happen.
# index.html.md
# Vault
This feature deploys Vault, a tool for securely managing secrets used in
modern computing (e.g. passwords, certificates, API keys).
## Enabling Vault
To enable Vault, run the following command:
```default
sunbeam enable vault
```
Vault units will be in blocked state after this step.
## Initializing Vault
To initialize Vault, run the following command:
```default
sunbeam vault init KEY_SHARES KEY_THRESHOLD
```
KEY_SHARES - Number of key shares to be generated by vault
KEY_THRESHOLD - Minimal number of key shares to be used to unseal vault
Output of the above command with 5 key shares and 3 key threshold looks like:
```default
Unseal keys:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccccc
dddddddddddddddddddddddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
Root token: fff.ffffffffffffffffffffffff
```
It is recommended to store each of the unseal keys and root token into different files
and keep them secure.
## Unsealing Vault
To unseal Vault, run the following command:
```default
cat | sunbeam vault unseal -
```
Unsealing the Vault requires minimum KEY_THRESHOLD keys to be provided to vault.
So the unseal command should be executed KEY_THRESHOLD times. This will unseal
the vault leader unit.
To unseal the non-leader units, repeat the unseal commands again.
For example, the process to unseal the Vault with 3 units, initialized with
5 key shares and 3 key threshold looks like:
Unseal with the first key:
```default
$ cat | sunbeam vault unseal -
Vault unseal operation status: 2 key shares required to unseal
```
Unseal with the second key:
```default
$ cat | sunbeam vault unseal -
Vault unseal operation status: 1 key shares required to unseal
```
Unseal with the third key:
```default
$ cat | sunbeam vault unseal -
Vault unseal operation status: completed for leader unit.
Rerun `sunbeam vault unseal` command to unseal non-leader units.
```
The leader unit gets unsealed and non-leader units are in sealed state.
Now repeat the process to unseal non-leader units.
Unseal with the first key:
```default
$ cat | sunbeam vault unseal -
Vault unseal operation status:
vault/1 : 2 key shares required to unseal
vault/2 : 2 key shares required to unseal
```
Unseal with the second key:
```default
$ cat | sunbeam vault unseal -
Vault unseal operation status:
vault/1 : 1 key shares required to unseal
vault/2 : 1 key shares required to unseal
```
Unseal with the third key:
```default
$ cat | sunbeam vault unseal -
Vault unseal operation status: completed
```
Unsealing vault process completed.
## Authorizing Vault charm
To authorize vault charm, run the following command:
```default
$ cat | sunbeam vault authorize-charm -
Vault charm is authorized.
```
After 5 minutes (update-status-interval time), Juju status should show all units as active.
```default
$ juju status -m openstack vault
Model Controller Cloud/Region Version SLA Timestamp
openstack sunbeam-controller immune-drum-k8s/localhost 3.5.4 unsupported 07:12:02Z
SAAS Status Store URL
microceph active local admin/controller.microceph
App Version Status Scale Charm Channel Rev Address Exposed Message
vault active 3 vault-k8s 1.16/stable 280 10.152.183.222 no
Unit Workload Agent Address Ports Message
vault/0* active idle 10.1.183.201
vault/1 active idle 10.1.183.234
vault/2 active idle 10.1.183.235
Offer Application Charm Rev Connected Endpoint Interface Role
cert-distributor keystone keystone-k8s 211 2/2 send-ca-cert certificate_transfer provider
certificate-authority certificate-authority self-signed-certificates 155 1/1 certificates tls-certificates provider
cinder-ceph cinder-ceph cinder-ceph-k8s 94 1/1 ceph-access cinder-ceph-key provider
keystone-credentials keystone keystone-k8s 211 1/1 identity-credentials keystone-credentials provider
keystone-endpoints keystone keystone-k8s 211 1/1 identity-service keystone provider
nova nova nova-k8s 106 1/1 nova-service nova provider
ovn-relay ovn-relay ovn-relay-k8s 95 1/1 ovsdb-cms-relay ovsdb-cms provider
rabbitmq rabbitmq rabbitmq-k8s 34 1/1 amqp rabbitmq provider
traefik-rgw traefik-rgw traefik-k8s 218 1/1 traefik-route traefik_route provider
```
## Vault status
To see status of Vault, run the following command:
```default
sunbeam vault status
```
Sample output of the above command looks like:
```default
Vault Status
+---------+-------------+-----------+
| Unit | Initialized | Sealed |
+=========+=============+===========+
| vault/0 | True | False |
| vault/1 | True | False |
| vault/2 | True | False |
+---------+-------------+-----------+
```
## Disabling Vault
To disable Vault, run the following command:
```default
sunbeam disable vault
```
#### CAUTION
Disabling Vault will completely remove it from the infrastructure,
all secrets will be lost.
# index.html.md
# LDAP Integration
This feature integrates the OpenStack
[Keystone](https://docs.openstack.org/keystone) service with an
external LDAP service. Effectively, the feature maps LDAP-based users to
cloud users via an OpenStack domain.
## Enabling LDAP
To enable the LDAP feature, run the following command:
```bash
sunbeam enable ldap
```
## Disabling LDAP
To disable the LDAP feature, run the following command:
```bash
sunbeam disable ldap
```
## Usage
### Adding a domain
Adding a domain refers to integrating Keystone with one or more existing
LDAP servers.
1. Create a YAML file with details of how Keystone should integrate with
the LDAP server. At a minimum, this should include a URL, user,
password, and suffix. See the [Keystone LDAP integration
guide](https://docs.openstack.org/keystone/2023.2/admin/configuration.html#integrate-identity-with-ldap)
for configuration guidance.
For example:
**dom1.yaml**:
```text
url: ldaps://ldap.example.com:636
user: cn=admin,dc=example,dc=com
password: mypassword
suffix: dc=example,dc=com
```
1. If the connection requires TLS, place the CA certificate in a file:
**dom1.cert**:
```text
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
```
1. Use the `sunbeam ldap add-domain` command to set up the domain,
adding the `--ca-cert-file` option if TLS is in use:
```bash
sunbeam ldap add-domain \
--domain-config-file ./dom1.yaml \
--ca-cert-file ./dom1.cert dom1
```
1. A new LDAP-backed domain will be created in Keystone. Verify this
with the native `openstack` CLI:
openstack user list –domain dom1
```text
+-------------------------------------------+---------------+
| | Name |
+-------------------------------------------+---------------+
| 941b5daa177ea518b5fc3b85fe9269729eb6abbb1 | John Hethel |
| d3b9d2bea306a049d4f56d30d6bba97b24c6db882 | Ryan Trunch |
| 7b699dc9a8037d6968c42c5b7b5d5a020d0f58e40 | Michael Diss |
+-------------------------------------------+---------------+
```
### Updating a domain
To update an LDAP domain the process is similar to adding one:
```bash
sunbeam ldap update-domain --domain-config-file ./dom1.yaml --ca-cert-file ./dom1.cert dom1
```
### Listing domains
To list LDAP domains:
```bash
sunbeam ldap list-domains
```
### Removing a domain
To remove an LDAP domain:
```bash
sunbeam ldap remove-domain ''
```
#### IMPORTANT
Since configuration (e.g. OpenStack projects) could have been made to the
domain after it was added, the `remove-domain` command only removes the
LDAP connection. To completely remove the domain, the `openstack` CLI
should be used (i.e. `openstack domain delete`).
# index.html.md
# Observability
This feature integrates Canonical OpenStack with (and optionally deploys) the
[Canonical Observability Stack
(COS)](https://charmhub.io/topics/canonical-observability-stack).
Sunbeam will automatically propagate default metrics and dashboards,
enabling you to effortlessly monitor the status of your single-node or
multi-node deployment of Sunbeam without the need for any additional
setup.
This feature provides ability to connect to an existing external COS or
deploy COS within the cloud.
## Connect to an existing COS
### Enabling Observability
[Register the external controller](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-external-juju-controllers.md)
hosting COS in Canonical OpenStack.
Ensure the Juju user has consume permissions granted on the
observability related offers.
To enable Sunbeam observability integration, run the following
command:
```bash
sunbeam enable observability external CONTROLLER GRAFANA_DASHBOARD_OFFER_URL PROMETHEUS_RECEIVE_REMOTE_WRITE_OFFER_URL LOKI_LOGGING_OFFER_URL
```
`CONTROLLER` is the name of external Juju controller that hosts COS.
`GRAFANA_DASHBOARD_OFFER_URL` is the remote Offer URL for Grafana
Dashboard.
`PROMETHEUS_RECEIVE_REMOTE_WRITE_OFFER_URL` is the remote Offer URL
for Prometheus.
`LOKI_LOGGING_OFFER_URL` is the remote Offer URL for Loki.
### Disabling Observability
To disable Observability, run the following command:
```bash
sunbeam disable observability external
```
## Deploy COS in Canonical OpenStack
### Enabling Observability
To enable Observability, run the following command:
```bash
sunbeam enable observability embedded
```
#### NOTE
Storage size for the embedded observability stack can be configured using
the [manifest file](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/manifest-file-reference.md), which is
consumed during the cluster bootstrap or refresh.
Changing the storage size after deployment is not currently supported.
### Disabling Observability
To disable Observability, run the following command:
```bash
sunbeam disable observability embedded
```
### Retrieve Grafana dashboard URL
To get the URL of the dashboard use the `dashboard url` command:
```bash
sunbeam observability dashboard-url
```
Sample output:
```default
http://10.20.21.13/observability-grafana
```
This URL points to the Grafana login page. The credentials to use can be
retrieved using this command:
```default
juju run --model observability grafana/leader get-admin-password
```
Sample output:
```text
Running operation 1 with 1 task
- task 2 on unit-grafana-0
Waiting for task 2...
admin-password: ******
url: http://10.20.21.13/observability-grafana
```
#### NOTE
Only the initial admin password is displayed in the above action. If the
admin password is changed using the Grafana UI, a message
`Admin password has been changed by an administrator` will be displayed.
## Login Grafana dashboard
Once the COS model is deployed, you can use the Grafana dashboard to
view the metrics and alerts configured. The login page asks for the
following information:
**Email or username:** admin **Password:** \*\*\*\*\*\*
The login page looks like this:

After a successful login, you should see the landing page:

You can now look at the different dashboards configured.

## Dashboard
### OpenStack Service Overview dashboard
This is a dashboard providing an overview of the OpenStack services and
stats.

### OpenStack Cloud Usage dashboard
This is a dashboard providing information on the usage of the OpenStack
cloud (for example, projects and virtual machines), using metrics mostly from
[openstack-exporter](https://github.com/openstack-exporter/openstack-exporter).

### OpenStack Compute Overview dashboard
This is a dashboard more detailed information on the compute nodes,
using metrics mostly from the Libvirt exporter.

### Capacity Dashboard
**Capacity Dashboard** displays the overall capacity (storage, memory,
and CPU) of the Canonical OpenStack cluster, as well as the capacity of
individual nodes.

#### Days until storage / memory / CPU reaches threshold
“Days until storage / memory / CPU reaches 90%” shows the estimated days
until these resources reach 90% of their total capacity. This is a
linear projection based on the average usage over the past 360 days. If
the average usage is zero or negative, the panel will show “Stable”
because it’s not possible to estimate when they will be depleted. For
the overall capacity, this estimation is chosen to be the minimum value
across all nodes. For example, if the projected days it will
take for storage consumption to reach 90% is about 80 days for node 1,
90 for node 2,, and “Stable” (i.e. not expected to run out given the
current trend) for node 3, then the panel will show “80” since node 1
will be the first one to exhaust its storage.
The node-specific panels estimate resource consumption only within the
given node.

#### NOTE
You can filter the nodes using the multi-select dropdown menu: **Hostname**.
#### NOTE
The 90% threshold and the 360 days of estimation can also be changed using
the dropdown menu: **Resource Usage Threshold** and **Days of Estimation**.
#### Disk usage
“Disk usage (total size: …GB)” shows the usage of filesystems mounted on
the nodes. For the overall capacity, “Disk usage” shows the total usage
of all mounted filesystems for each node. The individual disk usage
capacity panel shows disk usage of each mounted filesystem on a
particular node.
#### Memory usage
“Memory usage (total memory: …GB)” shows the total memory usage, memory
assigned to huge pages, and used huge pages memory. For the overall
capacity, “Memory usage” is summed over all nodes. The
individual memory capacity panel shows the memory usage of a particular
node.
#### CPU usage
“CPU usage (total number of cores: …)” shows the CPU usage on the nodes.
For overall capacity, “CPU usage” shows the CPU usage of each node as
separate series. The individual CPU capacity panel shows the CPU usage
of a particular node.
### OpenStack Project Overview dashboard
This is a dashboard that provides detailed information about a single
project, including limits and a table of virtual machines. It uses
metrics from openstack-exporter.

### OpenStack Logging dashboard
This is a dashboard providing a consolidated view of logs
from various OpenStack services,
and also the HTTP status codes from different OpenStack APIs.

# index.html.md
# Load Balancer as a Service
This feature deploys
[Octavia](https://docs.openstack.org/octavia/latest/index.html), the
OpenStack load balancing service. Two provider backends are supported:
- **OVN provider** (default) – a lightweight, kernel-based provider
implemented through Open Virtual Network. See the upstream [OVN
Octavia provider documentation](https://docs.openstack.org/ovn-octavia-provider/latest/admin/driver.html)
for supported features and limitations.
- **Amphora provider** (optional) – a VM-based provider that runs a
dedicated HAProxy instance per load balancer, offering a broader
feature set. Requires MicroOVN as the SDN. See the upstream [Amphora
provider documentation](https://docs.openstack.org/octavia/latest/admin/providers/index.html#amphora)
for details.
## Enabling Load Balancer
To enable Load Balancer, run the following command:
```bash
sunbeam enable load-balancer
```
This enables Octavia with the OVN provider. Use the OpenStack CLI to
manage load balancers. See the upstream [Octavia documentation](https://docs.openstack.org/octavia/latest/user/guides/basic-cookbook.html)
for details.
## Enabling the Amphora provider
The Amphora provider is an optional add-on to the load balancer feature,
controlled through feature gates. It is not yet considered
production-ready. For general information about feature gates, see
[Manage experimental features](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/manage-experimental-features.md).
It requires the `microovn-sdn` and `loadbalancer-amphora` feature
gates to be active.
#### NOTE
The default load balancer provider is OVN. However, once the
Amphora provider is configured with `sunbeam loadbalancer
configure`, the default provider changes to Amphora.
#### NOTE
The Amphora provider requires MicroOVN as the SDN. MicroOVN SDN must be enabled
before running `sunbeam cluster bootstrap` with:
```default
sudo snap set openstack feature.microovn-sdn=true
sudo snap set openstack ovn.provider=microovn
```
### Step 1 – Enable the feature gate
Enable the Amphora feature gate:
```default
sudo snap set openstack feature.loadbalancer-amphora=true
```
### Step 2 – Configure the Amphora provider
Run the interactive configuration command:
```default
sunbeam loadbalancer configure
```
The command presents a series of prompts. The table below describes each
option:
| Prompt | Default | Description |
|-----------------------------------------|-------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Enable Octavia Amphora provider? | `y` | Activates the Amphora VM-based load-balancer backend. |
| Amphora image tag | `octavia-amphora` | Glance tag Octavia uses to locate the Amphora VM image. An image with this tag must exist in Glance before Octavia can create load-balancer instances. |
| Auto-create Amphora image? | `n` | If enabled, Sunbeam downloads the upstream Octavia Amphora image from `tarballs.opendev.org` (`test-only-amphora-x64-haproxy-ubuntu-noble.qcow2`) and uploads it to Glance with the tag specified above. Skip this if you already have a suitable image in Glance. |
| Auto-create Amphora Nova flavor? | `y` | If enabled, Sunbeam creates a dedicated Nova flavor for Amphora VM instances automatically. Disable this if you already have a suitable flavor and want to provide its ID. |
| Auto-create lb-mgmt network and subnet? | `y` | If enabled, Sunbeam creates the Octavia `lb-mgmt` network and subnet automatically using an IPv6 ULA subnet (`fd00:a9fe:a9fe::/64`). Disable this if you already have a suitable network and want to provide its IDs. |
| Auto-create Amphora security groups? | `y` | If enabled, Sunbeam creates the Neutron security groups for Amphora VM ports automatically. Disable this if you already have suitable security groups and want to provide their IDs. |
### Step 3 – Provide TLS certificates
Octavia Amphora requires TLS certificates to secure communication
between the controller and the Amphora VM instances. You must obtain
two signed certificates from your Certificate Authority (CA):
- **Amphora controller certificate** – a leaf (non-CA) certificate used
to authenticate the controller side of the Amphora TLS connection.
- **Amphora issuing CA certificate** – a CA certificate
(`basicConstraints: CA:TRUE`) used by Octavia to sign certificates
for individual Amphora instances.
#### Retrieve the Certificate Signing Requests (CSRs)
List the outstanding CSRs:
```default
sunbeam loadbalancer list_outstanding_csrs --format yaml
```
Sample output:
```default
- app_name: octavia
csr: |-
-----BEGIN CERTIFICATE REQUEST-----
-----END CERTIFICATE REQUEST-----
endpoint: amphora-controller-cert
relation_id: '215'
unit_name: null
- app_name: octavia
csr: |-
-----BEGIN CERTIFICATE REQUEST-----
-----END CERTIFICATE REQUEST-----
endpoint: amphora-issuing-ca
relation_id: '216'
unit_name: null
```
Extract each CSR and submit it to your CA to obtain the signed
certificates. The `endpoint` field identifies the purpose of each CSR:
| Endpoint | Certificate requirement |
|---------------------------|------------------------------------------------------|
| `amphora-controller-cert` | Leaf certificate (must **not** be a CA certificate). |
| `amphora-issuing-ca` | CA certificate (`basicConstraints: CA:TRUE`). |
#### Provide the signed certificates
Once your CA has returned the signed certificates, provide them to
Octavia:
```default
sunbeam loadbalancer provide_certificates
```
The command prompts for each certificate in turn. For both the
controller certificate and the issuing CA certificate, you will be asked
to supply:
- The signed certificate, base64-encoded (PEM).
- The CA certificate that signed it, base64-encoded (PEM).
- The full CA chain (intermediate + root CAs), base64-encoded (PEM) –
leave empty if the CA certificate is self-signed or no chain is
needed.
When all certificates have been accepted, the command confirms:
```default
TLS certificates provided to Octavia.
```
#### NOTE
If the Amphora feature is re-configured or certificates expire,
re-run `sunbeam loadbalancer list_outstanding_csrs` and
`sunbeam loadbalancer provide_certificates` to renew them.
## Disabling Load Balancer
To disable Load Balancer, run the following command:
```bash
sunbeam disable load-balancer
```
## Usage
Users should have roles `member` and `load-balancer_member` to
create and manage load balancers within their project.
Go through all the following sub-sections.
### Create a load balancer
Create a load balancer using the following command:
```default
openstack loadbalancer create --name --vip-network-id
```
Once the Amphora provider is enabled and configured (see
[Enabling the Amphora provider]()), it becomes the default provider.
To use the OVN provider instead, add `--provider ovn` to the
command.
For example, create the load balancer ‘test’:
```default
openstack loadbalancer create --name test --vip-network-id demo-network --wait
```
Sample output:
```default
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| admin_state_up | True |
| availability_zone | None |
| created_at | 2023-10-11T09:20:17 |
| description | |
| flavor_id | None |
| id | 8bb11dba-113e-46df-b7bd-3e099669dcf4 |
| listeners | |
| name | test |
| operating_status | ONLINE |
| pools | |
| project_id | cee090abc4d14819b9508e763e564984 |
| provider | ovn |
| provisioning_status | ACTIVE |
| updated_at | 2023-10-11T09:20:20 |
| vip_address | 192.168.122.218 |
| vip_network_id | 9cbb0646-9936-4ceb-9324-8f87ef118491 |
| vip_port_id | 749a598e-807c-475d-ab8d-26747bac2296 |
| vip_qos_policy_id | None |
| vip_subnet_id | 642d7a6d-625e-455a-a171-31082cd39c31 |
| tags | |
| additional_vips | [] |
+---------------------+--------------------------------------+
```
### Create a load balancer listener
Create a load balancer listener using the following command:
```default
openstack loadbalancer listener create --name --protocol --protocol-port
```
For example, add a listener on port 5555 for the ‘test’ load balancer:
```default
openstack loadbalancer listener create --name test-listener --protocol TCP --protocol-port 5555 test --wait
```
Sample output:
```default
+-----------------------------+--------------------------------------+
| Field | Value |
+-----------------------------+--------------------------------------+
| admin_state_up | True |
| connection_limit | -1 |
| created_at | 2023-10-11T09:21:11 |
| default_pool_id | None |
| default_tls_container_ref | None |
| description | |
| id | 2412a8fa-ce0a-430b-80bb-5f8c8ec6168f |
| insert_headers | None |
| l7policies | |
| loadbalancers | 8bb11dba-113e-46df-b7bd-3e099669dcf4 |
| name | test-listener |
| operating_status | ONLINE |
| project_id | cee090abc4d14819b9508e763e564984 |
| protocol | TCP |
| protocol_port | 5555 |
| provisioning_status | ACTIVE |
| sni_container_refs | [] |
| timeout_client_data | 50000 |
| timeout_member_connect | 5000 |
| timeout_member_data | 50000 |
| timeout_tcp_inspect | 0 |
| updated_at | 2023-10-11T09:21:12 |
| client_ca_tls_container_ref | None |
| client_authentication | NONE |
| client_crl_container_ref | None |
| allowed_cidrs | None |
| tls_ciphers | None |
| tls_versions | None |
| alpn_protocols | None |
| tags | |
+-----------------------------+--------------------------------------+
```
### Create a load balancer pool
Create a load balancer pool using the following command:
```default
openstack loadbalancer pool create --name --protocol --lb-algorithm --listener
```
For example, create the load balancer pool ‘test-pool’ for the
‘test-listener’ listener:
```default
openstack loadbalancer pool create --name test-pool --protocol TCP --lb-algorithm SOURCE_IP_PORT --listener test-listener --wait
```
Sample output:
```default
+----------------------+--------------------------------------+
| Field | Value |
+----------------------+--------------------------------------+
| admin_state_up | True |
| created_at | 2023-10-11T09:21:48 |
| description | |
| healthmonitor_id | |
| id | b7d9ac9f-5bfe-4786-a805-1a59fba98ee4 |
| lb_algorithm | SOURCE_IP_PORT |
| listeners | 2412a8fa-ce0a-430b-80bb-5f8c8ec6168f |
| loadbalancers | 8bb11dba-113e-46df-b7bd-3e099669dcf4 |
| members | |
| name | test-pool |
| operating_status | ONLINE |
| project_id | cee090abc4d14819b9508e763e564984 |
| protocol | TCP |
| provisioning_status | ACTIVE |
| session_persistence | None |
| updated_at | 2023-10-11T09:21:48 |
| tls_container_ref | None |
| ca_tls_container_ref | None |
| crl_container_ref | None |
| tls_enabled | False |
| tls_ciphers | None |
| tls_versions | None |
| tags | |
| alpn_protocols | None |
+----------------------+--------------------------------------+
```
### Add members to the load balancer pool
Add members to the load balancer pool using the following command:
```default
openstack loadbalancer member create --name --address --protocol-port
```
Run the above command multiple times to add new members to the load
balancer pool.
For example, to add member ‘test-pool-member1’ to the ‘test-pool’
pool, whose service is running on IP 192.168.122.183 and port 80:
```default
openstack loadbalancer member create --name test-pool-member1 --address 192.168.122.183 --protocol-port 80 test-pool --wait
```
Sample output:
```default
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| address | 192.168.122.183 |
| admin_state_up | True |
| created_at | 2023-10-11T09:23:23 |
| id | e386e580-8278-4253-8bbb-91f412d935e1 |
| name | test-pool-member1 |
| operating_status | NO_MONITOR |
| project_id | cee090abc4d14819b9508e763e564984 |
| protocol_port | 80 |
| provisioning_status | ACTIVE |
| subnet_id | None |
| updated_at | 2023-10-11T09:23:24 |
| weight | 1 |
| monitor_port | None |
| monitor_address | None |
| backup | False |
| tags | |
+---------------------+--------------------------------------+
```
### Add a health monitor to the load balancer pool
Add a health monitor to the load balancer pool using the following
command:
```default
openstack loadbalancer healthmonitor create --name --delay --timeout --max-retries --type
```
For example, to add health monitor ‘test-monitor’ to the ‘test-pool’
pool:
```default
openstack loadbalancer healthmonitor create --name test-monitor --delay 7 --timeout 5 --max-retries 3 --type TCP test-pool --wait
```
Sample output:
```default
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| project_id | cee090abc4d14819b9508e763e564984 |
| name | test-monitor |
| admin_state_up | True |
| pools | b7d9ac9f-5bfe-4786-a805-1a59fba98ee4 |
| created_at | 2023-10-11T09:33:33 |
| provisioning_status | ACTIVE |
| updated_at | 2023-10-11T09:33:34 |
| delay | 7 |
| expected_codes | None |
| max_retries | 3 |
| http_method | None |
| timeout | 5 |
| max_retries_down | 3 |
| url_path | None |
| type | TCP |
| id | 7f2cbe52-b024-4ede-a24b-7fa3cc6aa606 |
| operating_status | ONLINE |
| http_version | None |
| domain_name | None |
| tags | |
+---------------------+--------------------------------------+
```
Verify load balancer pool member operating status using the following
command:
```default
openstack loadbalancer member list
```
For example:
```default
openstack loadbalancer member list test-pool
```
Sample output:
```default
+--------------------------------------+-------------------+----------------------------------+---------------------+-----------------+---------------+------------------+--------+
| id | name | project_id | provisioning_status | address | protocol_port | operating_status | weight |
+--------------------------------------+-------------------+----------------------------------+---------------------+-----------------+---------------+------------------+--------+
| e386e580-8278-4253-8bbb-91f412d935e1 | test-pool-member1 | cee090abc4d14819b9508e763e564984 | ACTIVE | 192.168.122.183 | 80 | ONLINE | 1 |
+--------------------------------------+-------------------+----------------------------------+---------------------+-----------------+---------------+------------------+--------+
```
### Verify the load balancer details
Verify the details of the load balancer using the following command:
```default
openstack loadbalancer status show
```
For example:
```default
openstack loadbalancer status show test
```
Sample output:
```default
{
"loadbalancer": {
"id": "8bb11dba-113e-46df-b7bd-3e099669dcf4",
"name": "test",
"operating_status": "ONLINE",
"provisioning_status": "ACTIVE",
"listeners": [
{
"id": "2412a8fa-ce0a-430b-80bb-5f8c8ec6168f",
"name": "test-listener",
"operating_status": "ONLINE",
"provisioning_status": "ACTIVE",
"pools": [
{
"id": "b7d9ac9f-5bfe-4786-a805-1a59fba98ee4",
"name": "test-pool",
"provisioning_status": "ACTIVE",
"operating_status": "ONLINE",
"health_monitor": {
"id": "7f2cbe52-b024-4ede-a24b-7fa3cc6aa606",
"name": "test-monitor",
"type": "TCP",
"provisioning_status": "ACTIVE",
"operating_status": "ONLINE"
},
"members": [
{
"id": "e386e580-8278-4253-8bbb-91f412d935e1",
"name": "test-pool-member1",
"operating_status": "ONLINE",
"provisioning_status": "ACTIVE",
"address": "192.168.122.183",
"protocol_port": 80
},
{
"id": "856fb894-714a-4d1d-beda-8cd2bc77485a",
"name": "test-pool-member2",
"operating_status": "ONLINE",
"provisioning_status": "ACTIVE",
"address": "192.168.122.248",
"protocol_port": 80
}
]
}
]
}
]
}
}
```
### Attach a floating IP address to the load balancer VIP port
To create a floating IP address and attach it to the load balancer VIP
port, use the below snippet:
```default
vip_port=$(openstack loadbalancer show test -c vip_port_id -f value)
fip_id=$(openstack floating ip create external-network -c ID -f value)
openstack floating ip set --port $vip_port $fip_id
lb_fip=$(openstack floating ip list --port $vip_port -c 'Floating IP Address' -f value)
echo $lb_fip
```
The above snippet outputs the load balancer VIP address:
```default
10.20.20.68
```
### Verify load balancer functionality
To verify load balancer functionality, apply the `nc` utility to the
load balancer VIP and listener port:
```default
nc -vz 10.20.20.68 5555
```
The output will report success if the load balancer connection to the
backend service is made:
```default
Connection to 10.20.20.68 5555 port [tcp/*] succeeded!
```
# index.html.md
# Resource Optimization
This feature deploys [Watcher](https://docs.openstack.org/watcher/latest/index.html), the
OpenStack Resource Optimization service.
## Enabling Resource Optimization
To enable Resource Optimization, run the following command:
```bash
sunbeam enable resource-optimization
```
## Disabling Resource Optimization
To disable Resource Optimization, run the following command:
```bash
sunbeam disable resource-optimization
```
## Usage
### List Goals
List goals using the following command:
```default
openstack optimize goal list
```
Sample output:
```default
+--------------------------------------+----------------------+----------------------+
| UUID | Name | Display name |
+--------------------------------------+----------------------+----------------------+
| 11ee813f-2ac3-4975-9529-706ba7025057 | airflow_optimization | Airflow Optimization |
| 38817441-5df3-4f9d-8fd7-58a966f2e921 | cluster_maintaining | Cluster Maintaining |
| 98504695-4052-43ec-a0a2-8cc945278fae | dummy | Dummy goal |
| 2413258c-bfba-4adb-aeda-b2ef611084a7 | hardware_maintenance | Hardware Maintenance |
| b92f38e9-7df7-4787-a7fd-29e5783e56f3 | noisy_neighbor | Noisy Neighbor |
| 48348b46-cca2-4669-be0c-336cea0e9396 | saving_energy | Saving Energy |
| f20ce098-df72-43ec-941e-ae72ad2ee0c6 | server_consolidation | Server Consolidation |
| 4c7b7c77-acc9-44f5-a082-dd728bdb9f0d | thermal_optimization | Thermal Optimization |
| 3c85d238-541d-479e-96e9-4038787c2fcf | unclassified | Unclassified |
| 7c1f150e-39b4-44e4-a352-ed947b71a9ae | workload_balancing | Workload Balancing |
+--------------------------------------+----------------------+----------------------+
```
### List Strategies in a goal
List the strategies for a goal using the following command:
```default
openstack optimize strategy list --goal GOAL
```
For example, list the strategies for goal ‘cluster_maintaining’:
```default
openstack optimize strategy list --goal cluster_maintaining
```
Sample output:
```default
+--------------------------------------+------------------+---------------------------+---------------------+
| UUID | Name | Display name | Goal |
+--------------------------------------+------------------+---------------------------+---------------------+
| 48351169-670f-4354-bac8-8d18061d1291 | host_maintenance | Host Maintenance Strategy | cluster_maintaining |
+--------------------------------------+------------------+---------------------------+---------------------+
```
### Create an Audit template
Create an Audit template using the following command:
```default
openstack optimize audittemplate create NAME GOAL --strategy STRATEGY
```
For example, create an audit template ‘host-maintenance-template’ for goal ‘cluster_maintaining’ and strategy ‘host_maintenance’:
```default
openstack optimize audittemplate create host-maintenance-template cluster_maintaining --strategy host_maintenance
```
Sample output:
```default
+-------------+--------------------------------------+
| Field | Value |
+-------------+--------------------------------------+
| UUID | bb7caee4-f555-4d4f-89f4-7db627ce44cc |
| Created At | 2024-09-13T03:38:52.858848+00:00 |
| Updated At | None |
| Deleted At | None |
| Description | None |
| Name | host-maintenance-template |
| Goal | cluster_maintaining |
| Strategy | host_maintenance |
| Audit Scope | [] |
+-------------+--------------------------------------+
```
### Create an Audit
Create an Audit using the following command:
```default
openstack optimize audit create -a AUDIT_TEMPLATE_NAME -p key=value
```
For example, create an audit with template ‘host-maintenance-template’ and passing strategy parameters maintenance_node
```default
openstack optimize audit create -a host-maintenance-template -p maintenance_node=solqa-lab1-server-45.nosilo.lab1.solutionsqa
```
Sample output:
```default
+---------------+-------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------+
| UUID | 2a4355b2-3e03-4a0f-80bf-92476e17b7da |
| Name | host_maintenance-2024-09-13T03:40:53.948011 |
| Created At | 2024-09-13T03:40:53.992685+00:00 |
| Updated At | None |
| Deleted At | None |
| State | PENDING |
| Audit Type | ONESHOT |
| Parameters | {'maintenance_node': 'solqa-lab1-server-45.nosilo.lab1.solutionsqa'} |
| Interval | None |
| Goal | cluster_maintaining |
| Strategy | host_maintenance |
| Audit Scope | [] |
| Auto Trigger | False |
| Next Run Time | None |
| Hostname | None |
| Start Time | None |
| End Time | None |
| Force | False |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------+
```
### Show the Audit details
Show the Audit details using the following command:
```default
openstack optimize audit show AUDIT_ID
```
Sample output:
```default
+---------------+-------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------+
| UUID | 2a4355b2-3e03-4a0f-80bf-92476e17b7da |
| Name | host_maintenance-2024-09-13T03:40:53.948011 |
| Created At | 2024-09-13T03:40:54+00:00 |
| Updated At | 2024-09-13T03:41:07+00:00 |
| Deleted At | None |
| State | SUCCEEDED |
| Audit Type | ONESHOT |
| Parameters | {'maintenance_node': 'solqa-lab1-server-45.nosilo.lab1.solutionsqa'} |
| Interval | None |
| Goal | cluster_maintaining |
| Strategy | host_maintenance |
| Audit Scope | [] |
| Auto Trigger | False |
| Next Run Time | None |
| Hostname | watcher-0 |
| Start Time | None |
| End Time | None |
| Force | False |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------+
```
### List Action plan for an Audit
To list the Action plan for an Audit, run the following command:
```default
openstack optimize actionplan list --audit AUDIT_ID
```
Sample output:
```default
+--------------------------------------+--------------------------------------+-------------+------------+-----------------+
| UUID | Audit | State | Updated At | Global efficacy |
+--------------------------------------+--------------------------------------+-------------+------------+-----------------+
| 16e76af5-edbd-48b0-a443-946d921ca514 | 2a4355b2-3e03-4a0f-80bf-92476e17b7da | RECOMMENDED | None | |
+--------------------------------------+--------------------------------------+-------------+------------+-----------------+
```
### List actions
To list the actions in Action plan, run the following command:
```default
openstack optimize action list --action-plan ACTION_PLAN_ID
```
Sample output:
```default
+--------------------------------------+----------------------------------------------------------------------------------+---------+--------------------------------------+---------------------------+
| UUID | Parents | State | Action Plan | Action |
+--------------------------------------+----------------------------------------------------------------------------------+---------+--------------------------------------+---------------------------+
| d7f52ae0-37b5-456e-a9ac-a465bcce8aed | [] | PENDING | 16e76af5-edbd-48b0-a443-946d921ca514 | change_nova_service_state |
| 3f40421c-3f8d-4048-8b29-2c39bce9c16a | ['d7f52ae0-37b5-456e-a9ac-a465bcce8aed'] | PENDING | 16e76af5-edbd-48b0-a443-946d921ca514 | migrate |
| 617bcd97-e90b-4ba7-868c-548a96cd8408 | ['d7f52ae0-37b5-456e-a9ac-a465bcce8aed'] | PENDING | 16e76af5-edbd-48b0-a443-946d921ca514 | migrate |
| a5093f31-a9fd-41ef-a715-23761d282410 | ['3f40421c-3f8d-4048-8b29-2c39bce9c16a', '617bcd97-e90b-4ba7-868c-548a96cd8408'] | PENDING | 16e76af5-edbd-48b0-a443-946d921ca514 | migrate |
+--------------------------------------+----------------------------------------------------------------------------------+---------+--------------------------------------+---------------------------+
```
To list the detailed actions, run the following command:
```default
openstack optimize action list --action-plan ACTION_PLAN_ID --detail
```
### Start the Action plan
To start the action, run the following command:
```default
openstack optimize actionplan start ACTION_PLAN_ID
```
Sample output:
```default
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| UUID | 16e76af5-edbd-48b0-a443-946d921ca514 |
| Created At | 2024-09-13T03:41:06+00:00 |
| Updated At | 2024-09-13T03:45:32+00:00 |
| Deleted At | None |
| Audit | 2a4355b2-3e03-4a0f-80bf-92476e17b7da |
| Strategy | host_maintenance |
| State | PENDING |
| Efficacy indicators | [] |
| Global efficacy | [] |
| Hostname | None |
+---------------------+--------------------------------------+
```
### Show status of Action plan
To show the status of Action plan, run the following command:
```default
openstack optimize actionplan show ACTION_PLAN_ID
```
The state will be changed to SUCCEEDED once the actions complete.
Sample output:
```default
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| UUID | 16e76af5-edbd-48b0-a443-946d921ca514 |
| Created At | 2024-09-13T03:41:06+00:00 |
| Updated At | 2024-09-13T03:45:44+00:00 |
| Deleted At | None |
| Audit | 2a4355b2-3e03-4a0f-80bf-92476e17b7da |
| Strategy | host_maintenance |
| State | SUCCEEDED |
| Efficacy indicators | [] |
| | |
| Global efficacy | |
| Hostname | watcher-0 |
+---------------------+--------------------------------------+
```
## Limitations
1. Following goals are not supported:
> * airflow_optimization
> * thermal_optimization
> * noisy_neighbor
2. Strategies vm_workload_consolidation and workload_stabilization do not consider host memory usage in decision making as the metric hardware.memory.used is not currently collected.
# index.html.md
# Containers as a Service
This feature deploys [Magnum](https://docs.openstack.org/magnum/latest/index.html), the OpenStack CaaS service. Only
[Magnum CAPI Helm driver](https://docs.openstack.org/magnum-capi-helm/latest/) is supported.
This feature enables user to deploy [Canonical Kubernetes](https://ubuntu.com/kubernetes) on OpenStack infrastructure.
## Enabling CaaS
To enable CaaS, run the following command:
```bash
sunbeam enable caas
```
Use the OpenStack CLI to manage container infrastructures. See the
upstream [Magnum](https://docs.openstack.org/magnum/latest/index.html) documentation for details.
#### NOTE
The [Secrets as a Service](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/secrets.md) and [Load Balancer as a Service](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/load-balancer.md) features are dependencies of the CaaS
feature. Make sure to enable them.
When using the CaaS feature in conjunction with the [Load Balancer as a Service](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/load-balancer.md) feature, you
are subject to the same limitations as the latter feature. In particular, the OVN provider
only supports the `SOURCE_IP_PORT` load balancing algorithm.
## Disabling CaaS
To disable CaaS, run the following command:
```bash
sunbeam disable caas
```
## Usage
### Pre-requisites
1. Set the following properties on the image that will be used to deploy instances
* os-distro to ubuntu
* kube-version to workload cluster kubernetes version
```default
openstack image set IMAGE --os-distro ubuntu --property kube_version=v1.32.8
```
1. Ensure to add role member and load-balancer_member to the user as specified in
[Load Balancer as a Service](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/load-balancer.md)
### Create a kubernetes cluster
Create a cluster template using the following command:
```default
openstack coe cluster template \
create ck8s-cluster-template-ovn \
--image ubuntu \
--external-network external-network \
--flavor m1.medium \
--master-flavor m1.medium \
--master-lb-enabled \
--labels octavia_provider=ovn \
--labels octavia_lb_algorithm=SOURCE_IP_PORT \
--network-driver cilium \
--coe kubernetes
```
Sample output:
`ubuntu@sunbeam01:~$ ``openstack coe cluster template
> create ck8s-cluster-template-ovn \
> --image ubuntu \
> --external-network external-network \
> --flavor m1.medium \
> --master-flavor m1.medium \
> --master-lb-enabled \
> --labels octavia_provider=ovn \
> --labels octavia_lb_algorithm=SOURCE_IP_PORT \
> --network-driver cilium \
> --coe kubernetes`
```text
Request to create cluster template ck8s-cluster-template-ovn accepted
+-----------------------+-----------------------------------------------------------------------+
| Field | Value |
+-----------------------+-----------------------------------------------------------------------+
| insecure_registry | - |
| labels | {'octavia_provider': 'ovn', 'octavia_lb_algorithm': 'SOURCE_IP_PORT'} |
| updated_at | - |
| floating_ip_enabled | True |
| fixed_subnet | - |
| master_flavor_id | m1.medium |
| uuid | 1a3550d1-f493-449e-804f-7e1010cb1cf1 |
| no_proxy | - |
| https_proxy | - |
| tls_disabled | False |
| keypair_id | - |
| public | False |
| http_proxy | - |
| docker_volume_size | - |
| server_type | vm |
| external_network_id | external-network |
| cluster_distro | ubuntu |
| image_id | ubuntu |
| volume_driver | - |
| registry_enabled | False |
| docker_storage_driver | overlay2 |
| apiserver_port | - |
| name | ck8s-cluster-template-ovn |
| created_at | 2025-09-25T05:04:00.227248+00:00 |
| network_driver | cilium |
| fixed_network | - |
| coe | kubernetes |
| flavor_id | m1.medium |
| master_lb_enabled | True |
| dns_nameserver | 8.8.8.8 |
| project_id | 82c3eedc4a3646ef8777cf0d17a3ab32 |
| hidden | False |
| tags | - |
+-----------------------+-----------------------------------------------------------------------+
```
Create a Kubernetes cluster using the following command:
```text
openstack coe cluster create --cluster-template CLUSTER_TEMPLATE_UUID --master-count 3 --node-count 3 --timeout 900 sunbeam-ck8s-ovn
```
Sample output:
```text
Request to create cluster fc5724ae-aef8-4c89-aef8-78bc41f54325 accepted
```
Check cluster list status using the following command:
```text
openstack coe cluster list
+--------------------------------------+------------------+---------+------------+--------------+-----------------+---------------+
| uuid | name | keypair | node_count | master_count | status | health_status |
+--------------------------------------+------------------+---------+------------+--------------+-----------------+---------------+
| fc5724ae-aef8-4c89-aef8-78bc41f54325 | sunbeam-ck8s-ovn | None | 3 | 3 | CREATE_COMPLETE | HEALTHY |
+--------------------------------------+------------------+---------+------------+--------------+-----------------+---------------+
```
#### NOTE
You may need to wait a few minutes before the cluster is ready.
Check cluster status using the following command:
```text
openstack coe cluster show CLUSTER_UUID
+----------------------+------------------------------------------------------------------------------------------------+
| Field | Value |
+----------------------+------------------------------------------------------------------------------------------------+
| status | CREATE_COMPLETE |
| health_status | HEALTHY |
| cluster_template_id | 1a3550d1-f493-449e-804f-7e1010cb1cf1 |
| node_addresses | [] |
| uuid | fc5724ae-aef8-4c89-aef8-78bc41f54325 |
| stack_id | sunbeam-ck8s-ovn-sei7c6sxbikj |
| status_reason | None |
| created_at | 2025-09-25T05:18:52+00:00 |
| updated_at | 2025-09-25T05:28:52+00:00 |
| coe_version | v1.32.8 |
| labels | {'octavia_provider': 'ovn', 'octavia_lb_algorithm': 'SOURCE_IP_PORT'} |
| labels_overridden | {} |
| labels_skipped | {} |
| labels_added | {} |
| fixed_network | None |
| fixed_subnet | None |
| floating_ip_enabled | True |
| faults | |
| keypair | None |
| api_address | https://172.16.2.247:6443 |
| master_addresses | [] |
| master_lb_enabled | True |
| create_timeout | 900 |
| node_count | 3 |
| discovery_url | None |
| docker_volume_size | None |
| master_count | 3 |
| container_version | None |
| name | sunbeam-ck8s-ovn |
| master_flavor_id | m1.medium |
| flavor_id | m1.medium |
| health_status_reason | {'cluster': 'Ready', 'infrastructure': 'Ready', 'controlplane': 'Ready', 'nodegroup': 'Ready'} |
| project_id | 82c3eedc4a3646ef8777cf0d17a3ab32 |
+----------------------+------------------------------------------------------------------------------------------------+
```
Access your Kubernetes cluster using the following commands:
```text
mkdir config-dir
openstack coe cluster config sunbeam-k8s-ovn --dir config-dir/
export KUBECONFIG=/home/ubuntu/config-dir/config
sudo -E k8s kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system cilium-7c98r 1/1 Running 0 21m
kube-system cilium-lk2w9 1/1 Running 0 21m
kube-system cilium-operator-6fb79c547b-h8ds7 1/1 Running 0 24m
kube-system cilium-p5wz7 1/1 Running 0 24m
kube-system cilium-pmcj8 1/1 Running 0 19m
kube-system cilium-tz5sj 1/1 Running 0 21m
kube-system cilium-vs6m5 1/1 Running 0 21m
kube-system ck-storage-rawfile-csi-controller-0 2/2 Running 0 25m
kube-system ck-storage-rawfile-csi-node-6bn6l 4/4 Running 0 21m
kube-system ck-storage-rawfile-csi-node-7gndg 4/4 Running 0 21m
kube-system ck-storage-rawfile-csi-node-cjgtk 4/4 Running 0 21m
kube-system ck-storage-rawfile-csi-node-fl8fs 4/4 Running 0 25m
kube-system ck-storage-rawfile-csi-node-hc4pj 4/4 Running 0 19m
kube-system ck-storage-rawfile-csi-node-zrn5z 4/4 Running 0 21m
kube-system coredns-fc9c778db-fzrdf 1/1 Running 0 25m
kube-system k8sd-proxy-g7xvc 1/1 Running 0 20m
kube-system k8sd-proxy-jqxp5 1/1 Running 0 20m
kube-system k8sd-proxy-k7bv2 1/1 Running 0 18m
kube-system k8sd-proxy-qwzr2 1/1 Running 0 20m
kube-system k8sd-proxy-v2jqt 1/1 Running 0 23m
kube-system k8sd-proxy-vv6t2 1/1 Running 0 21m
kube-system metrics-server-8694c96fb7-hkfk6 1/1 Running 0 25m
kubernetes-dashboard kubernetes-dashboard-1758777722-api-574545d7f4-69bcx 1/1 Running 0 24m
kubernetes-dashboard kubernetes-dashboard-1758777722-auth-7b949ccdd9-d54tv 1/1 Running 0 24m
kubernetes-dashboard kubernetes-dashboard-1758777722-kong-58bc8dc74b-gl5n2 1/1 Running 0 24m
kubernetes-dashboard kubernetes-dashboard-1758777722-metrics-scraper-75cd94bbc-2tnq6 1/1 Running 0 24m
kubernetes-dashboard kubernetes-dashboard-1758777722-web-5866567c7d-cp6dg 1/1 Running 0 24m
metallb-system metallb-controller-7f647445fc-5ztvp 1/1 Running 0 25m
metallb-system metallb-speaker-8jdfv 1/1 Running 0 20m
metallb-system metallb-speaker-bqwv2 1/1 Running 0 18m
metallb-system metallb-speaker-gx5j6 1/1 Running 0 21m
metallb-system metallb-speaker-s2gg9 1/1 Running 0 20m
metallb-system metallb-speaker-vjfrf 1/1 Running 0 20m
metallb-system metallb-speaker-zfv27 1/1 Running 0 23m
openstack-system openstack-cinder-csi-controllerplugin-5944b6858f-6wx82 6/6 Running 0 24m
openstack-system openstack-cinder-csi-nodeplugin-2gsb5 3/3 Running 0 21m
openstack-system openstack-cinder-csi-nodeplugin-2m4gb 3/3 Running 0 19m
openstack-system openstack-cinder-csi-nodeplugin-bzvcv 3/3 Running 0 21m
openstack-system openstack-cinder-csi-nodeplugin-cbl9r 3/3 Running 0 24m
openstack-system openstack-cinder-csi-nodeplugin-jnx2z 3/3 Running 0 21m
openstack-system openstack-cinder-csi-nodeplugin-wwhx6 3/3 Running 0 21m
openstack-system openstack-cloud-controller-manager-6w8v2 1/1 Running 0 20m
openstack-system openstack-cloud-controller-manager-sh2zr 1/1 Running 0 24m
openstack-system openstack-cloud-controller-manager-vbnlt 1/1 Running 0 18m
```
Currently the command openstack coe cluster config is not returning proper kubeconfig.
As a workaround, get the kubeconfig using clusterctl
```text
curl -L https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.12.4/clusterctl-linux-amd64 -o clusterctl
sudo install -o root -g root -m 0755 clusterctl /usr/local/bin/clusterctl
sudo k8s config > kubeconfig
KUBECONFIG=kubeconfig clusterctl get kubeconfig --namespace magnum- > config-dir/config
```
Replace PROJECT_ID and CLUSTER_STACK_ID from the output values in openstack coe cluster show.
### Enable Autoscaling
To enable Autoscaling feature, the cluster template should have the following labels
```text
--labels auto_scaling_enabled=True
--labels min_node_count=3
--labels max_node_count=5
```
#### NOTE
The value for –node-count in openstack coe cluster create command should be in the range [min_node_count … max_node_count]
### Enable Keystone authentication and authorization webhook for Workload Kubernetes Cluster
To enable [Keystone authentication and authorization feature](https://github.com/kubernetes/cloud-provider-openstack/blob/master/docs/keystone-auth/using-keystone-webhook-authenticator-and-authorizer.md), the cluster template should have the following label
```text
--labels keystone_auth_enabled=True
```
Existing cluster can be upgraded to enable keystone auth by running the following command
`ubuntu@sunbeam01:~$ ``openstack coe cluster upgrade CLUSTER_UUID NEW_CLUSTER_TEMPLATE_UUID`
```text
Request to upgrade cluster fc5724ae-aef8-4c89-aef8-78bc41f54325 has been accepted.
```
#### NOTE
You may need to wait a few minutes before the cluster is ready.
To verify if keystone-auth is enabled or not, run the following command
```text
sudo -E k8s kubectl -n kube-system get po -l app.kubernetes.io/name=k8s-keystone-auth
NAME READY STATUS RESTARTS AGE
k8s-keystone-auth-1758780472-7qkbc 1/1 Running 0 7m56s
k8s-keystone-auth-1758780472-kwlzj 1/1 Running 0 2m46s
k8s-keystone-auth-1758780472-wprwk 1/1 Running 0 6m21s
```
The default keystone-k8s auth policy is specified [here](https://github.com/catalyst-cloud/capi-plugin-helm-charts/blob/main/charts/k8s-keystone-auth/values.yaml#L80).
For custom policies, User need to manually update the config map k8s-keystone-auth-policy
in kube-system namespace and recycle the k8s-keystone-auth pods.
### Setup a Kubernetes cluster in a proxy environment
To setup a kubernetes cluster in a proxy environment, set the following parameters
in openstack coe cluster template create command
```text
--http-proxy <>
--https-proxy <>
--no-proxy <>
```
### Delete a Cluster
Delete the kubernetes cluster using the following command:
```text
openstack coe cluster delete CLUSTER_UUID
```
#### NOTE
Cluster deletion fails as ingress is enabled in Canonical Kubernetes CAPI
deployment but ingress is not supported in Magnum CAPI Helm driver.
As a workaround, delete the loadbalancer using the following command:
openstack loadbalancer delete kube_service__kube-system_cilium-ingress –cascade
## Limitations:
* Only Cilium network driver is supported.
* Enabling monitoring feature via label monitoring_enabled is not supported.
* Enabling Registry mirrors is not supported in Magnum CAPI Helm driver.
# index.html.md
# DNS as a Service
This feature deploys [Designate](https://docs.openstack.org/designate/latest/index.html), the OpenStack DNS service.
## Enabling DNS
To enable DNS, run the following command:
```default
sunbeam enable dns ""
```
The openstack CLI can now be used to manage DNS. See the upstream
[Designate command-line interface documentation](https://docs.openstack.org/python-designateclient/latest/user/shell-v2.html) for details.
Nameservers are specified with FQDNs separated by a space, each ending
with a dot, whose records point to the DNS instance managed by the
Designate service. It is assumed that your infrastructure DNS is
configured to redirect your nameserver records to the DNS service
address.
## Disabling DNS
To disable DNS, run the following command:
```default
sunbeam disable dns
```
## Fetching DNS service address
To fetch the DNS service address, run the following command:
```default
sunbeam dns address
```
## Usage
Users need the role `member` to be able to manage DNS zones and
records. A user has this role by default so all users have the ability
to manage DNS in their own project.
For example, create zone `sunbeam.tld` with:
```default
openstack zone create --email dnsmaster@sunbeam.tld sunbeam.tld.
+----------------+--------------------------------------+
| Field | Value |
+----------------+--------------------------------------+
| action | CREATE |
| attributes | |
| created_at | 2023-10-11T20:25:52.000000 |
| description | None |
| email | dnsmaster@sunbeam.tld |
| id | f27cd25d-43ff-4205-84a4-79c524bd9652 |
| masters | |
| name | sunbeam.tld. |
| pool_id | 794ccc2c-d751-44fe-b57f-8894c9f5c842 |
| project_id | b6cc0f4bf25c432785b4f7c91858304b |
| serial | 1697055952 |
| shared | False |
| status | PENDING |
| transferred_at | None |
| ttl | 3600 |
| type | PRIMARY |
| updated_at | None |
| version | 1 |
+----------------+--------------------------------------+
```
Retrieve the list of DNS zones - wait for the new zone to become
`ACTIVE`:
```default
openstack zone list
+--------------------------------------+--------------+---------+------------+--------+--------+
| id | name | type | serial | status | action |
+--------------------------------------+--------------+---------+------------+--------+--------+
| f27cd25d-43ff-4205-84a4-79c524bd9652 | sunbeam.tld. | PRIMARY | 1697055952 | ACTIVE | NONE |
+--------------------------------------+--------------+---------+------------+--------+--------+
```
Create the `TXT` record `note.sunbeam.tld`:
```default
openstack recordset create --type TXT --record '"This is a record created in Sunbeam!"' sunbeam.tld. note
+-------------+----------------------------------------+
| Field | Value |
+-------------+----------------------------------------+
| action | CREATE |
| created_at | 2023-10-11T20:30:33.000000 |
| description | None |
| id | 40222abd-1624-42af-90ff-7fc212e99885 |
| name | note.sunbeam.tld. |
| project_id | b6cc0f4bf25c432785b4f7c91858304b |
| records | "This is a record created in Sunbeam!" |
| status | PENDING |
| ttl | None |
| type | TXT |
| updated_at | None |
| version | 1 |
| zone_id | f27cd25d-43ff-4205-84a4-79c524bd9652 |
| zone_name | sunbeam.tld. |
+-------------+----------------------------------------+
```
Obtain the address of the DNS service with the `sunbeam` command:
```default
sunbeam dns address
10.206.54.244
```
With the `dig` command, query the DNS service and verify that it
returns the newly-created `TXT` record:
```default
dig @10.206.54.244 +short TXT note.sunbeam.tld
"This is a record created in Sunbeam!"
```
# index.html.md
# Validation
## Overview
This feature deploys [Tempest](https://charmhub.io/tempest-k8s), a
tool for running integration tests, which includes tests for OpenStack
API validation, scenarios, and other specific tests useful in validating
an OpenStack deployment.
## Enable Validation
To enable Validation, run the following command:
```bash
sunbeam enable validation
```
#### NOTE
During the initialization of Tempest, multiple network resources—including routers, networks, subnets, and ports—will be created on OpenStack.
Currently, Tempest requires 40 external IP addresses for router gateways.
Please ensure that at least 40 external IP addresses are available before enabling validation.
## Disable Validation
To disable Validation, run the following command:
```bash
sunbeam disable validation
```
## Usage
Validation tests can be run on-demand and they can be scheduled to run
in the background.
### On-demand validation
To run a one-time validation test against the deployment, run the
following command:
```default
sunbeam validation run [profile]
```
If no profile is specified, the validation test defaults to running the
appropriate RefStack profile for the OpenStack version deployed. You can
check the list of available profiles provided by running:
```default
sunbeam validation profiles
```
Sample output:
```default
Available profiles
Name Description
────────────────────────────────────────────────────────────────────────────────────────
refstack Tests that are part of the RefStack project https://refstack.openstack.org/
quick A short list of tests for quick validation
smoke Tests tagged as "smoke"
all All tests (very large number, not usually recommended)
```
A summary of the validation result will be printed out to the screen
upon completion of the command:
```default
Totals
======
Ran: 115 tests in 1036.6368 sec.
- Passed: 70
- Skipped: 19
- Expected Fail: 0
- Unexpected Success: 0
- Failed: 26
Sum of execute time for each test: 718.3638 sec.
```
In order to obtain detailed test results, use the `--output` option
and specify a local path to save the result file to:
```default
sunbeam validation run --output ./validation.log
```
The result of the most recent run can be retrieved with:
```default
sunbeam validation get-last-result --output ./validation.log
```
### Periodic validation
If the [Observability](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/observability.md) feature is also enabled,
periodic validation tests will be performed using the `quick` profile.
By default, periodic checks are scheduled to execute on an hourly basis.
You can configure this frequency to a 5-field
[cron](https://en.wikipedia.org/wiki/Cron) schedule, which specifies
the interval between checks. For example, if you would like periodic
checks to be run every 6 hours on the first minute, run the following
command:
```default
sunbeam configure validation schedule="1 */6 * * *"
```
Periodic checks can also be disabled by setting the schedule parameter
to an empty string:
```default
sunbeam configure validation schedule=""
```
#### NOTE
Due to performance considerations, intervals under 15 minutes are not supported.
Results will be displayed in a validation-specific Grafana dashboard and
alerts will be fired when periodic checks fail. For more information on
how to access Grafana dashboards and receive alerts, please refer to the
[Observability](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/observability.md) feature documentation.

# index.html.md
# Orchestration
This feature deploys [Heat](https://docs.openstack.org/heat), the
OpenStack Orchestration service.
## Enabling Orchestration
To enable Orchestration, run the following command:
```bash
sunbeam enable orchestration
```
Use OpenStack CLI to manage orchestration stacks. See the upstream [Heat
documentation](https://docs.openstack.org/heat/latest/getting_started/create_a_stack.html)
for details.
## Disabling Orchestration
To disable Orchestration, run the following command:
```default
sunbeam disable orchestration
```
This will terminate the application but not remove it from the model. To
do that, run the following:
```default
juju remove-application --force --no-wait --no-prompt -m openstack \
heat heat-cfn heat-mysql-router heat-cfn-mysql-router
```
## Usage
Create a Heat stack using the following command:
```default
openstack stack create \
-t https://opendev.org/openstack/heat-templates/raw/branch/master/hot/servers_in_existing_neutron_net.yaml \
--parameter key_name=sunbeam \
--parameter image=ubuntu \
--parameter flavor=m1.tiny \
--parameter public_net_id=external-network \
--parameter private_net_id=demo-network \
--parameter private_subnet_id=demo-subnet \
teststack
```
The Heat template referred to in the above command creates two servers
in network `demo-subnet` and assigns them floating IP addresses.
Sample output:
```default
+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | 952770ed-f40e-4547-8f22-4dba8b1c714b |
| stack_name | teststack |
| description | HOT template to deploy two servers into an existing neutron tenant network and assign floating IP addresses to each server so they are routable from the public network. |
| | |
| creation_time | 2023-10-13T06:47:35Z |
| updated_time | None |
| stack_status | CREATE_IN_PROGRESS |
| stack_status_reason | Stack CREATE started |
+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
```
Verify stack status and wait for completion:
```default
openstack stack list
```
Sample output:
```default
+--------------------------------------+------------+-----------------+----------------------+--------------+
| ID | Stack Name | Stack Status | Creation Time | Updated Time |
+--------------------------------------+------------+-----------------+----------------------+--------------+
| 952770ed-f40e-4547-8f22-4dba8b1c714b | teststack | CREATE_COMPLETE | 2023-10-13T06:47:35Z | None |
+--------------------------------------+------------+-----------------+----------------------+--------------+
```
Get stack details using the below command:
```default
openstack stack show teststack
```
Sample output:
```default
+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | 952770ed-f40e-4547-8f22-4dba8b1c714b |
| stack_name | teststack |
| description | HOT template to deploy two servers into an existing neutron tenant network and assign floating IP addresses to each server so they are routable from the public network. |
| | |
| creation_time | 2023-10-13T06:47:35Z |
| updated_time | None |
| stack_status | CREATE_COMPLETE |
| stack_status_reason | Stack CREATE completed successfully |
| parameters | OS::project_id: 098db89856cb4306828b0be678667294 |
| | OS::stack_id: 952770ed-f40e-4547-8f22-4dba8b1c714b |
| | OS::stack_name: teststack |
| | flavor: m1.tiny |
| | image: ubuntu |
| | key_name: sunbeam |
| | private_net_id: demo-network |
| | private_subnet_id: demo-subnet |
| | public_net_id: external-network |
| | |
| outputs | - description: IP address of server1 in private network |
| | output_key: server1_private_ip |
| | output_value: 192.168.122.154 |
| | - description: Floating IP address of server2 in public network |
| | output_key: server2_public_ip |
| | output_value: 10.20.20.157 |
| | - description: Floating IP address of server1 in public network |
| | output_key: server1_public_ip |
| | output_value: 10.20.20.73 |
| | - description: IP address of server2 in private network |
| | output_key: server2_private_ip |
| | output_value: 192.168.122.157 |
| | |
| links | - href: http://10.20.21.13/openstack-heat/v1/098db89856cb4306828b0be678667294/stacks/teststack/952770ed-f40e-4547-8f22-4dba8b1c714b |
| | rel: self |
| | |
| deletion_time | None |
| notification_topics | [] |
| capabilities | [] |
| disable_rollback | True |
| timeout_mins | None |
| stack_owner | demo |
| parent | None |
| stack_user_project_id | 0dfde376b8544b0499e74c4d7a82cc27 |
| tags | [] |
| | |
+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
```
Verify if stack resources are created (i.e. if new servers are launched
or not):
```default
openstack server list
+--------------------------------------+----------+--------+--------------------------------------------+--------+---------+
| ID | Name | Status | Networks | Image | Flavor |
+--------------------------------------+----------+--------+--------------------------------------------+--------+---------+
| 0ad5e745-8d5b-4cc3-8ccf-f460733a3af4 | Server2 | ACTIVE | demo-network=10.20.20.157, 192.168.122.157 | ubuntu | m1.tiny |
| 07261def-a40b-4976-9399-0398319b4067 | Server1 | ACTIVE | demo-network=10.20.20.73, 192.168.122.154 | ubuntu | m1.tiny |
+--------------------------------------+----------+--------+--------------------------------------------+--------+---------+
```
# index.html.md
# Images Sync
This feature deploys OpenStack Images Sync, a tool for importing
images from a SimpleStreams source to the OpenStack Glance image service.
## Enable Images Sync
To enable Images Sync, run the following command:
```bash
sunbeam enable images-sync
```
## Disable Images Sync
To disable Images Sync, run the following command:
```bash
sunbeam disable images-sync
```
#### CAUTION
**Caution**: Disabling Images Sync will **not** remove images that have been
previously imported from the Glance image service.
## Usage
Users need the role `reader` to list images.
To list images added by the Images Sync feature, run the following
command:
```default
openstack image list | grep auto-sync/
```
Sample output:
```default
| 200df230-0983-4cd8-9d14-97327664f77b | auto-sync/ubuntu-focal-20.04-amd64-server-20240513-disk1.img | active |
| 1935961b-e646-4f0d-a796-8c653308f790 | auto-sync/ubuntu-jammy-22.04-amd64-server-20240514-disk1.img | active |
| 62be8807-f068-4317-9552-c1357fa8d962 | auto-sync/ubuntu-noble-24.04-amd64-server-20240523.1-disk1.img | active |
```
The feature downloads images for the three most recent LTS releases.
# index.html.md
# Shared Filesystems as a Service
This feature deploys [Manila](https://docs.openstack.org/manila/latest/index.html), the OpenStack Shared Filesystems service.
It enables the user to create NFS Shared Filesystems on the Ceph storage
backend.
## Enabling Shared Filesystems
This feature requires the storage role. To enable this feature, run the
following command:
```default
sunbeam enable shared-filesystem
```
The openstack CLI can now be used to create and manage CephFS NFS Shared
Filesystems. See the upstream [Manila CLI](https://docs.openstack.org/python-manilaclient/latest/cli/osc_plugin_cli.html) documentation for details.
## Disabling Shared Filesystems
To disable this feature, run the following command:
```default
sunbeam disable shared-filesystem
```
## Usage
Administrators need to create a share type suitable for CephFS NFS share:
```default
openstack share type create cephfsnfstype false
+----------------------+--------------------------------------+
| Field | Value |
+----------------------+--------------------------------------+
| id | 8fa7d7ff-16de-44c4-97c2-627b608970bd |
| name | cephfsnfstype |
| visibility | public |
| is_default | False |
| required_extra_specs | driver_handles_share_servers : False |
| optional_extra_specs | |
| description | None |
+----------------------+--------------------------------------+
openstack share type set cephfsnfstype --extra-specs vendor_name=Ceph storage_protocol=NFS
```
Shares can then be created with the following command:
```default
openstack share create --share-type cephfsnfstype --name cephnfsshare1 nfs 1
+---------------------------------------+--------------------------------------+
| Field | Value |
+---------------------------------------+--------------------------------------+
| access_rules_status | active |
| availability_zone | None |
| create_share_from_snapshot_support | False |
| created_at | 2025-08-18T07:19:04.825882 |
| description | None |
| has_replicas | False |
| host | |
| id | 9ad6e4f1-26c2-47b0-944a-957c973e8260 |
| is_public | False |
| is_soft_deleted | False |
| metadata | {} |
| mount_snapshot_support | False |
| name | cephnfsshare2 |
| progress | None |
| project_id | 59e4d08bafeb42a2987d0dd7ef477764 |
| replication_type | None |
| revert_to_snapshot_support | False |
| scheduled_to_be_deleted_at | None |
| share_group_id | None |
| share_network_id | None |
| share_proto | NFS |
| share_server_id | None |
| share_type | 89a7c4c9-9f01-4051-a1f2-407c63387e68 |
| share_type_name | cephfsnfstype |
| size | 1 |
| snapshot_id | None |
| snapshot_support | False |
| source_backup_id | None |
| source_share_group_snapshot_member_id | None |
| status | creating |
| task_state | None |
| user_id | 03ed09d378be484cade24f5731bb820d |
| volume_type | cephfsnfstype |
+---------------------------------------+--------------------------------------+
```
The created share should be available:
```default
openstack share list
+--------------------------------------+---------------+------+-------------+-----------+-----------+-----------------+--------------------------------+-------------------+
| ID | Name | Size | Share Proto | Status | Is Public | Share Type Name | Host | Availability Zone |
+--------------------------------------+---------------+------+-------------+-----------+-----------+-----------------+--------------------------------+-------------------+
| 5c156c74-43bf-432b-af2e-bddc82f5c6f9 | cephnfsshare1 | 1 | NFS | available | False | cephfsnfstype | manila-cephfs-0@cephnfs#cephfs | nova |
+--------------------------------------+---------------+------+-------------+-----------+-----------+-----------------+--------------------------------+-------------------+
```
Note the export location of the share:
```default
openstack share export location list cephnfsshare1
+--------------------------------------+------------------------------------------------------------------------------------------------------------+-----------+
| ID | Path | Preferred |
+--------------------------------------+------------------------------------------------------------------------------------------------------------+-----------+
| 96f2ae5a-7fdf-4457-a65d-6b8579635dd0 | 192.168.137.10:/volumes/_nogroup/5692f246-d3d0-4567-81a6-3f590d1957a4/aa0c7383-b5e1-48ab-984c-15b6219c48e7 | True |
+--------------------------------------+------------------------------------------------------------------------------------------------------------+-----------+
```
The export location of the share contains the bind IP address of the NFS
Ganesha server and the path to be mounted.
# index.html.md
# Secrets as a Service
This feature deploys [Barbican](https://docs.openstack.org/barbican/latest/index.html), the OpenStack Key Manager service.
## Enabling Secrets
To enable Secrets, run the following command:
```bash
sunbeam enable secrets
```
The openstack CLI can now be used to manage Secrets. See the upstream
[Barbican CLI](https://docs.openstack.org/python-barbicanclient/latest/cli/) documentation for details.
#### NOTE
The [Vault](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/vault.md) feature is a dependency of the
Secrets feature and should be enabled prior to enabling Barbican.
## Disabling Secrets
To disable Secrets, run the following command:
```bash
sunbeam disable secrets
```
## Usage
Users need the role `creator` to be able to create / read / destroy
secrets.
Verify if a user belongs to this role with (admin rights needed):
```default
openstack role assignment list --user --role creator
+----------------------------------+----------------------------------+-------+----------------------------------+--------+--------+-----------+
| Role | User | Group | Project | Domain | System | Inherited |
+----------------------------------+----------------------------------+-------+----------------------------------+--------+--------+-----------+
| 3ef18094c76a403291ccf727851616ae | 4f2e8ef6b897403fb9865123b7b57a34 | | 3e5bb39a247b471494e051ae8d0530fb | | | False |
+----------------------------------+----------------------------------+-------+----------------------------------+--------+--------+-----------+
```
Create a secret consisting of the string `my_payload`, and request
just the `Secret href` field as output:
```default
openstack secret store --name my_secret --payload my_payload -c "Secret href"
+-------------+-----------------------------------------------------------------------------------------+
| Field | Value |
+-------------+-----------------------------------------------------------------------------------------+
| Secret href | http://10.206.54.241/openstack-barbican/v1/secrets/65ad38a3-811e-4445-8472-13aa2fa5042d |
+-------------+-----------------------------------------------------------------------------------------+
```
Retrieve the original secret (`my_payload`) via the secret href value:
```default
openstack secret get --payload http://10.206.54.241/openstack-barbican/v1/secrets/65ad38a3-811e-4445-8472-13aa2fa5042d
+---------+-------------+
| Field | Value |
+---------+-------------+
| Payload | my_payload |
+---------+-------------+
```
## Audit secret decrypt access
The `secret-decrypter` role allows a service user in the `services` project
to decrypt Barbican secret payloads. Audit users with this role regularly:
```default
openstack role assignment list \
--names \
--role secret-decrypter \
--project services \
--project-domain service_domain
```
Canonical OpenStack grants this role to the Masakari service user by default so
that instance recovery can rebuild servers with encrypted disks.
## Remove secret decrypt access
Before removing this role, verify that the service user no longer needs to
decrypt Barbican secrets. For Masakari, disable the role request first with the
Instance Recovery configuration described in
[Instance Recovery](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/instance-recovery.md).
For each service user that should no longer have this role, run:
```default
openstack role remove \
--user \
--user-domain service_domain \
--project services \
--project-domain service_domain \
secret-decrypter
```
# index.html.md
# Object Storage
The object storage service providing Swift and S3 endpoints is enabled
automatically as soon as there are storage nodes in a cluster.
The object storage endpoints can be retrieved using `openstack`
client. See [Using OpenStack CLI](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-the-openstack-cli.md) on how to use OpenStack
CLI.
Run the below command to get s3 endpoint:
```default
openstack endpoint list --service s3 --interface public
```
Sample output of the above command:
```default
+----------------------------------+-----------+--------------+--------------+---------+-----------+--------------------+
| ID | Region | Service Name | Service Type | Enabled | Interface | URL |
+----------------------------------+-----------+--------------+--------------+---------+-----------+--------------------+
| 74c9adaa7041422692a1f55adf0a65eb | RegionOne | s3 | s3 | True | public | http://10.20.21.10 |
+----------------------------------+-----------+--------------+--------------+---------+-----------+--------------------+
```
Run the below command to get swift endpoint:
```default
openstack endpoint list --service swift --interface public
```
Sample output of the above command:
```default
+----------------------------------+-----------+--------------+--------------+---------+-----------+-------------------------------------------------+
| ID | Region | Service Name | Service Type | Enabled | Interface | URL |
+----------------------------------+-----------+--------------+--------------+---------+-----------+-------------------------------------------------+
| d30b885de04b4b1090d2c7d05d4c6562 | RegionOne | swift | object-store | True | public | http://10.20.21.10/swift/v1/AUTH_$(project_id)s |
+----------------------------------+-----------+--------------+--------------+---------+-----------+-------------------------------------------------+
```
## Usage
To access using the swift protocol, users can use the `openstack`
client.
Create a Swift container using command:
```default
openstack container create foo
```
Sample output:
```default
+---------------------------------------+-----------+--------------------------------------------------+
| account | container | x-trans-id |
+---------------------------------------+-----------+--------------------------------------------------+
| AUTH_75a27eb3202d4fcda251647d1d78af2c | foo | tx0000045042a8694f86bc4-0066877b39-121b1-default |
+---------------------------------------+-----------+--------------------------------------------------+
```
List containers using command:
```default
openstack container list
```
Sample output:
```default
+------+
| Name |
+------+
| foo |
+------+
```
Upload an object in the container using command:
```default
openstack object create foo test.txt --name test
```
Sample output:
```default
+--------+-----------+----------------------------------+
| object | container | etag |
+--------+-----------+----------------------------------+
| test | foo | d8e8fca2dc0f896fd7cb4cb0031ba249 |
+--------+-----------+----------------------------------+
```
List the objects in the container using command:
```default
openstack object list foo
```
Sample output:
```default
+------+
| Name |
+------+
| test |
+------+
```
Delete an object from container using command:
```default
openstack object delete foo test
```
Delete a container using command:
```default
openstack container delete foo
```
# index.html.md
# Ubuntu Pro
## Overview
This feature enables [Ubuntu Pro](https://ubuntu.com/pro) support for
Canonical OpenStack. Ubuntu Pro provides additional benefits such as Livepatch
and extended security support periods for Ubuntu LTS.
Ubuntu Pro is free for [limited personal
usage](https://ubuntu.com/pro/dashboard) or subscriptions can be
[purchased for commercial support](https://ubuntu.com/pro/subscribe).
## Enabling Ubuntu Pro
To enable Ubuntu Pro support, run the following command with an
attachment token associated with your subscription:
```default
sunbeam enable pro
```
## Disabling Ubuntu Pro
To disable Ubuntu Pro support, run the following command:
```default
sunbeam disable pro
```
## Usage
To check the Ubuntu Pro status on any node in the Canonical OpenStack
deployment login to the node and use the `pro` command to validate the
subscription attachment and enabled services:
```default
pro status
```
Example output is:
```default
SERVICE ENTITLED STATUS DESCRIPTION
esm-apps yes enabled Expanded Security Maintenance for Applications
esm-infra yes enabled Expanded Security Maintenance for Infrastructure
livepatch yes disabled Canonical Livepatch service
realtime-kernel* yes disabled Ubuntu kernel with PREEMPT_RT patches integrated
usg yes disabled Security compliance and audit tools
* Service has variants
For a list of all Ubuntu Pro services and variants, run 'pro status --all'
Enable services with: pro enable
Account: microstack@ubuntu.com
Subscription: Ubuntu Pro - free personal subscription
```
# index.html.md
# Baremetal as a Service
This feature deploys [Ironic](https://docs.openstack.org/ironic/latest/index.html), the bare metal provisioning service for
OpenStack. It allows OpenStack users to provision bare metal machines,
as opposed to virtual machines.
## Enabling Baremetal
This feature requires the storage role. To enable this feature, run the
following command:
```default
sunbeam enable baremetal
```
The openstack CLI can now be used to manage bare metal machines. See the
upstream [Ironic CLI](https://docs.openstack.org/python-ironicclient/latest/index.html) documentation for details.
The feature will be configured based on the cluster’s manifest file.
Alternatively, a different manifest file can be specified during the feature
enablement:
```default
sunbeam enable --manifest baremetal-manifest.yaml baremetal
```
Sample baremetal-manifest.yaml file:
```yaml
features:
baremetal:
software:
charms:
ironic-conductor-k8s:
channel: 2025.1/edge
ironic-k8s:
channel: 2025.1/edge
nova-ironic-k8s:
channel: 2025.1/edge
neutron-baremetal-switch-config-k8s:
channel: 2025.1/edge
neutron-generic-switch-config-k8s:
channel: 2025.1/edge
config:
shards: ["shard0", "shard1"]
conductor-groups: ["shard0", "shard1"]
switchconfigs:
netconf:
nexus:
configfile: |
[nexus.example.net]
driver = netconf-openconfig
device_params = name:nexus
switch_info = nexus
switch_id = 00:53:00:0a:0a:0a
host = nexus.example.net
username = user
key_filename = /etc/neutron/sshkeys/nexus-sshkey
additional-files:
nexus-sshkey: |
some key here.
generic:
arista:
configfile: |
[genericswitch:arista-hostname]
device_type = netmiko_arista_eos
ngs_mac_address = 00:53:00:0a:0a:0a
ip = 10.20.30.40
username = admin
key_file = /etc/neutron/sshkeys/arista-key
additional-files:
arista-key: |
some key here.
```
#### NOTE
Rerunning the sunbeam enable baremetal command with a different manifest
file will replace the previously deployed feature configuration (e.g.:
deployed nova-ironic shards, Ironic Conductor groups, Neutron switch
configurations).
For the switch configurations, the following restrictions apply:
- The key_filename and key_file config options base file paths must be
/etc/neutron/sshkeys.
- The files referenced in key_filename or key_file as seen above will
require those files to be defined as additional files as well.
- Unknown fields in the switch configurations are not allowed. See
[netconf configuration options](https://docs.openstack.org/networking-baremetal/2025.1/configuration/ml2/device_drivers/netconf-openconfig.html) and [generic switch configuration](https://docs.openstack.org/networking-generic-switch/2025.1/configuration.html).
- For generic switch configurations, the device_type field is mandatory.
After the feature is enabled, you can use the sunbeam baremetal sub-command
to manage the deployed nova-ironic shards, Ironic Conductor groups, and
Neutron switch configurations.
## Managing nova-ironic shards
nova-ironic shards will be deployed while enabling the baremetal feature,
as mentioned above. Additional shards can be added through the following
command:
```default
sunbeam baremetal shard add SHARD
```
nova-ironic shards can be removed by running the following command:
```default
sunbeam baremetal shard delete SHARD
```
The following command can be used to list the currently deployed shards:
```default
sunbeam baremetal shard list
```
## Managing Ironic Conductor groups
By default, sunbeam deploys an ironic-conductor-k8s charm with an empty
conductor-group configuration option. Additional Ironic Conductor groups
will be deployed while enabling the baremetal feature, based on the
conductor-groups configuration mentioned above.
Additional Ironic Conductor groups can be added through the following command:
```default
sunbeam baremetal conductor-groups add GROUP-NAME
```
Ironic Conductor Groups can be removed by running the following command:
```default
sunbeam baremetal conductor-groups delete GROUP-NAME
```
The following command can be used to list the currently Ironic Conductor
Groups:
```default
sunbeam baremetal conductor-groups list
```
## Managing Neutron Switch Configurations
netconf and generic Neutron switch configurations will be added while
enabling the baremetal feature, as mentioned above. Additional configurations
can be added through the following command:
```default
sunbeam baremetal switch-config add netconf|generic NAME --config CONFIGFILE [--additional-file ]
```
An existing switch configuration can be updated with the command:
```default
sunbeam baremetal switch-config update netconf|generic NAME --config CONFIGFILE [--additional-file ]
```
#### NOTE
For the add / update sub-commands, multiple additional files can be
specified.
Note that the same restrictions for the switch configurations mentioned above
still apply when adding new ones or updating existing ones.
A switch configuration can be deleted with the following command:
```default
sunbeam baremetal switch-config delete NAME
```
The following command can be used to list the current Neutron switch
configurations and their protocol:
```default
sunbeam baremetal switch-config list
```
## Disabling Baremetal
To disable this feature, run the following command:
```default
sunbeam disable baremetal
```
For information on how to access and use Ironic, check the
[Baremetal feature nodes](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/baremetal-nodes.md) page.
# index.html.md
# Managing TLS
* [Implementing TLS using a third-party CA](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/implement-tls-using-a-third-party-ca.md)
* [Enable the TLS feature](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/implement-tls-using-a-third-party-ca.md#enable-the-tls-feature)
* [Gather the certificate signing requests](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/implement-tls-using-a-third-party-ca.md#gather-the-certificate-signing-requests)
* [Request TLS certificates](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/implement-tls-using-a-third-party-ca.md#request-tls-certificates)
* [Input TLS certificates](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/implement-tls-using-a-third-party-ca.md#input-tls-certificates)
* [Verify that TLS is active](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/implement-tls-using-a-third-party-ca.md#verify-that-tls-is-active)
* [Managing CA](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/tls-ca.md)
* [Enable TLS CA](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/tls-ca.md#enable-tls-ca)
* [Use TLS CA](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/tls-ca.md#use-tls-ca)
* [Disable TLS CA](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/tls-ca.md#disable-tls-ca)
* [Managing Vault](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/tls-vault.md)
* [Prerequisites](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/tls-vault.md#prerequisites)
* [Enable TLS Vault](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/tls-vault.md#enable-tls-vault)
* [Use TLS Vault](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/tls-vault.md#use-tls-vault)
* [Disable TLS Vault](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/tls-vault.md#disable-tls-vault)
# index.html.md
# Managing CA
This feature is used to encrypt all cloud service endpoints (both public
and private) using TLS certificates obtained from an external provider.
It does this by interfacing with the existing Traefik instances in the
cloud. A Traefik instance is associated with either public or private
cloud traffic.
## Enable TLS CA
To enable TLS, you’ll need to provide information that identifies your
chosen Certificate Authority. Do this by specifying a CA certificate and
its CA certificate chain.
Run the following command to enable TLS for public endpoints:
```default
sunbeam enable tls ca --ca --ca-chain
```
#### NOTE
Omit the `--ca-chain` option when using self-signed certificates.
To enable TLS for public, internal and rgw endpoints, be explicit by
using the `--endpoint` option:
```default
sunbeam enable tls ca --ca --ca-chain --endpoint public --endpoint internal --endpoint rgw
```
## Use TLS CA
TLS certificates must now be provided to the Traefik units. This is
covered on the [Implement TLS using a third-party CA](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/implement-tls-using-a-third-party-ca.md) page.
## Disable TLS CA
To disable TLS in the cloud, run the following command:
```default
sunbeam disable tls ca
```
This command removes the manual-tls-certificates charm from being the certificate Authority and all services will work as if TLS was never enabled.
# index.html.md
# Implementing TLS using a third-party CA
This page shows how to implement TLS when using an external Certificate
Authority for your certificates.
#### TIP
For conceptual background on TLS in Canonical OpenStack see the
[Service endpoint encryption](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/service-endpoint-encryption.md) page.
## Enable the TLS feature
### CA
This method relies on the TLS CA feature. See the [TLS CA](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/tls-ca.md)
feature page for how to enable it.
If the feature is ever disabled (see the feature page), to re-enable,
the entire procedure given below must be repeated.
### Vault
This method relies on the TLS Vault feature. See the [TLS Vault](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/tls-vault.md)
feature page for how to enable it.
If the feature is ever disabled (see the feature page), to re-enable,
the entire procedure given below must be repeated.
## Gather the certificate signing requests
You’ll need the certificate signing requests (CSRs) for each available
Traefik unit.
### CA
To retrieve CSRs for which certificates are not yet provided, run:
```console
sunbeam tls ca list_outstanding_csrs
```
Sample output:
```default
+------------------+------------------------------------------------------------------+
| Unit name | CSR |
+------------------+------------------------------------------------------------------+
| traefik/0 | -----BEGIN CERTIFICATE REQUEST----- |
| | MIICrDCCAZQCAQAwRTEUMBIGA1UEAwwLMTAuMjAuMjEuMTMxLTArBgNVBC0MJDk3 |
| | MmI3YTU3LTM0OTktNDVhNS04OWJkLTM3NjliYzk1MjY1ZTCCASIwDQYJKoZIhvcN |
| | AQEBBQADggEPADCCAQoCggEBAIxYmLNAIxhbIjqQtVNg6faO4rnl1vHrXp9MdmpP |
| | aED4lqq6/Zn+maeVv3Yh6de+GvyZIxXUBRpyZF5Z6qQSIJ4V63ZpCsSPDNUnjEmA |
| | pHnNrAFI87JHvXEBMl+6nhnMJP4b2DsWF0orP8G/zvaMxABzMKlQ4GoKUkz24UJZ |
| | wCrRnsiPiMgKGTW/zNSFgN0wigyFf0gxJTofKWOHv0KRK1H6zBojwZCBwi1x1A6d |
| | 0PhwSz0GxMcrPOkc/Z1cNDg4dySJvm6rn0DLSHE77ZaCgdurS2rrE8WtpPp95E78 |
| | wYRhbcTdLFQTdVkDPClSfYNZK4FjiybgkXq5WTojELt4pscCAwEAAaAiMCAGCSqG |
| | SIb3DQEJDjETMBEwDwYDVR0RBAgwBocEChQVDTANBgkqhkiG9w0BAQsFAAOCAQEA |
| | ZqR2aVYzFD1KvEEFajxJAz8agcpPJougSr9iKEK101/7pQVLDqeCvusJHfv5clYO |
| | RCMxNoAuPFFt83j9V0Sg7FnVLc6ftT9f0C3jWWVbCxZbVMTJ4RcIiYKsjhC8PgpU |
| | J94cQgo4xkcqWc2bpOsEIOyvXgK+AWe9TXhg3EihecDS4Sho7wtDRayR3BL/bOiF |
| | rZGFgnkAgHCNoqHN9IhOqmKm0XWn0XNlP1t6IWih5dGGoYeka135+REKYo4G3kYe |
| | EKqgE3AGkPtjp4nuD33oWa+XK30XPFCRHqdcvenjMfdAPRw+MwAsPWXmihnnSGFh |
| | pVEcQwo0HC3L5LHCVZBdNA== |
| | -----END CERTIFICATE REQUEST----- |
| traefik-public/0 | -----BEGIN CERTIFICATE REQUEST----- |
| | MIICrDCCAZQCAQAwRTEUMBIGA1UEAwwLMTAuMjAuMjEuMTIxLTArBgNVBC0MJDI4 |
| | NzllYjlmLTZhOWUtNGNjMC1hZGIyLWZmOWQ5YzU3ZThiMDCCASIwDQYJKoZIhvcN |
| | AQEBBQADggEPADCCAQoCggEBANAr4HyhL70XlRAeEhc3Xia3dJ8hLtD4hDAzMRc3 |
| | Cd0zdYoKhniZw9Crhp+zdzBwyiVaACj8XiHdl70u7aCts4IJ40GDw4CnWnM5/SHP |
| | I5LYFi6PT4cHQL0SUlIhgaCVMpZQoFJT4TqcS/Wowyh5sl2ZlNDr0OMArHbtUeuG |
| | FQ69cjvMyOxXhMcxPFr21jrXsVLenqJRfTieA7Qev05C9bxJpDcl2CPmTY3ehu0g |
| | evqCkCD3/Kq8H12SFidwQSjip1C//z2Jlg7ndhapf1YXfP6BwrDzF6xxDqExb2Ie |
| | RghC9m3zkNKvIuH4c3MKE6DQsFqf8/LpUMcW7IFyE7R0WgECAwEAAaAiMCAGCSqG |
| | SIb3DQEJDjETMBEwDwYDVR0RBAgwBocEChQVDDANBgkqhkiG9w0BAQsFAAOCAQEA |
| | ixa/O4qFUA69EJRgpTV/Wq/aojIJhBvKZcVt+wbniYo+XUsTbJJCH0v1Ja6p2CYX |
| | uLkRN/NlxetQouAb7Iw8tNXgfxHbje6t+63+f8mmK1eVrJ1euDSdOi/cyyVLz/3H |
| | MWU82Kzdk44EDi+NyQLDQttVJLdGMvME7/W8MNEEj4qYUoMDcbq4CnxS6P37TDO9 |
| | sUwn5Q4Ygju4QH+wWasN0hhln0lc55azYXc7y3KAOee0NZQTAM/QjJkBQ4KoA2Bk |
| | HN0GczVe9vj+8NYMgbdQ5u7b2ZxU1E1hFM/MhQUHP1vJlGVP6znmvojLo2FO07DH |
| | qW/PnbNh7gQuYZOh+zW8+A== |
| | -----END CERTIFICATE REQUEST----- |
+------------------+------------------------------------------------------------------+
```
To get the output in YAML format, use option `--format yaml`.
In this example there are two CSRs - one for unit `traefik/0` (internal traffic)
and one for unit `traefik-public/0` (public traffic).
### Vault
To retrieve CSRs for which certificates are not yet provided, run:
```console
sunbeam tls vault list_outstanding_csrs
```
Sample output:
```default
+------------------+------------------------------------------------------------------+
| Unit name | CSR |
+------------------+------------------------------------------------------------------+
| vault/0 | -----BEGIN CERTIFICATE REQUEST----- |
| | MIIClTCCAX0CAQAwUDEfMB0GA1UEAwwWZGV2b3BzLXNvbHV0aW9ucy5jbG91ZDEt |
| | MCsGA1UELQwkZDhlMzA2OGItOTgzYy00ODU4LWFiYTEtNjhkZGYyMGExNmE2MIIB |
| | IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo4vSTZ/vg3CbFzb1rwbnLZ0O |
| | 6pMu0kcarXwsqfu+nB2Teqv613Zs7+1vGaA9ZyNbo/OquyDsXmBNPeBXAXpXYMmI |
| | RVv6dMDaSOhTbKUYbqSblKhAV+bonHceP9NjFUlFzfcpJSXWFlJeYyQKNGzpgQBf |
| | zyG/oiL0xJjsaM1Ezg5EA3dMnl5ssz3PH/SGHyhuoWytbqEDC5DUcnUEo1tZxEx8 |
| | U4NdQKSFLZVA/pYonR9JeEzdaaqlXSFEOCJe+ktzHGGwXMMhfy4MITVwqr+ILDXD |
| | dEtpDYLuF+GHXyBn2Q7EinuTliPQkt1toNs/1ZDKdiZRHlKg9B0nDO93UorIgQID |
| | AQABoAAwDQYJKoZIhvcNAQELBQADggEBAAOiCoOKiFfGAH4xa9MBvptS53SGg/SH |
| | uqXlN3LyBY2H0Rf9iQp/wZXsKoc/ngEvwQWWx/+isD8mmVo/0v5ar7LIGZScHL7g |
| | n4mG9wlnpf4zYp1KmvP4+RWqmSHsLjicstUlAvcZQaJusZc/reorlGZWp6pXbL/G |
| | 00BFThDc8MCR834Q3mEqJkpQ52gkUL4DxekW0+d56uwvEXaP3++/wZQ8GEdFTnYT |
| | wfS3/inadYtpj5t5vQPJBeMqie47/TVRXUDqkCsZeQiX/VYHxpAlfqpHBrQZklap |
| | 9KdhcRFpBmGy2LlrJYSJcZ7SGNGzHkpsgyAuR3XPV1N5ok9EAmftWMc= |
| | -----END CERTIFICATE REQUEST----- |
+------------------+------------------------------------------------------------------+
```
## Request TLS certificates
Request one TLS certificate for each generated CSR.
### CA
You’ll need to supply the Certificate Authority (identified in the
`enable` command) with the CSRs. Do this via the certificate authority’s web site.
#### NOTE
Ensure the TLS certificate from CA has Subject Alternative Name with IP
Address of the service if DNS names are not used.
### Vault
You’ll need to supply the Certificate Authority (identified in the
`enable` command) with the CSRs. Do this via the certificate authority’s web site.
#### NOTE
The CA certificate needs to be generated as a CA certificate, not as a
regular TLS certificate. Vault will set its `common_name`
configuration option from the hostnames configured for the internal,
RGW, and public ingress endpoints. The CA certificate must have the
same domain defined in the `alt_names` section of the CA
configuration file used to sign the CSR.
## Input TLS certificates
Run the command below to inject the newly acquired TLS certificates into the cloud:
### CA
```console
sunbeam tls ca unit_certs
```
You will be prompted for a TLS certificate for each Traefik unit.
This example’s final total output is:
```default
Base64 encoded Certificate for traefik/0 CSR Unique ID: 9c90972f-ec72-41b9-b6e4-2793ee052531: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1J...
Base64 encoded Certificate for traefik-public/0 CSR Unique ID: be71a3bd-8d3a-411b-b258-2413d36100ce: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1J...
CA certs configured
```
Alternatively, to avoid prompts, update TLS certificates in the manifest file
(see the certificates block in [manifest reference](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/manifest-file-reference.md)):
```console
sunbeam tls ca unit_certs --manifest
```
### Vault
```console
sunbeam tls vault unit_certs
```
You will be prompted for a TLS certificate for the Vault unit.
This example’s final total output is:
```default
Base64 encoded Certificate for vault/0 CSR Unique ID: d8e3068b-983c-4858-aba1-68ddf20a16a6: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1J...
CA certs configured
```
Alternatively, to avoid prompts, update TLS certificates in the manifest file
(see the certificates block in [manifest reference](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/manifest-file-reference.md)):
```console
sunbeam tls vault unit_certs --manifest
```
Once the signed certificate is deployed, Vault will automatically issue TLS certificates for the endpoints specified during the TLS Vault enablement process. These certificates will be used by the Traefik instances to secure the cloud service endpoints.
## Verify that TLS is active
Generate an openrc file:
```console
sunbeam openrc
```
This file should use an HTTPS link for `OS_AUTH_URL` (Keystone) and a value for `OS_CACERT`,
which is the file path to the CA certificate.
### CA
```default
# openrc for access to OpenStack
export OS_USERNAME=admin
export OS_PASSWORD=*******
export OS_AUTH_URL=https://10.20.21.12/openstack-keystone/v3
export OS_USER_DOMAIN_NAME=admin_domain
export OS_PROJECT_DOMAIN_NAME=admin_domain
export OS_PROJECT_NAME=admin
export OS_AUTH_VERSION=3
export OS_IDENTITY_API_VERSION=3
export OS_CACERT=/home/ubuntu/.config/openstack/ca_bundle.pem
```
### Vault
```default
# openrc for access to OpenStack
export OS_USERNAME=admin
export OS_PASSWORD=*******
export OS_AUTH_URL=https://public.mydomain.com/openstack-keystone/v3
export OS_USER_DOMAIN_NAME=admin_domain
export OS_PROJECT_DOMAIN_NAME=admin_domain
export OS_PROJECT_NAME=admin
export OS_AUTH_VERSION=3
export OS_IDENTITY_API_VERSION=3
export OS_CACERT=/home/ubuntu/.config/openstack/ca_bundle.pem
```
Generate a cloud-config file:
```console
sunbeam cloud-config --admin --update
```
Similarly, this file should use HTTPS for `auth_url` and have a file for `cacert`:
### CA
```default
clouds:
sunbeam-admin:
auth:
auth_url: https://10.20.21.12/openstack-keystone/v3
password: pS6glK5TQRNf
project_domain_name: admin_domain
project_name: admin
user_domain_name: admin_domain
username: admin
cacert: /home/ubuntu/.config/openstack/ca_bundle.pem
```
### Vault
```default
clouds:
sunbeam-admin:
auth:
auth_url: https://public.mydomain.com/openstack-keystone/v3
password: pS6glK5TQRNf
project_domain_name: admin_domain
project_name: admin
user_domain_name: admin_domain
username: admin
cacert: /home/ubuntu/.config/openstack/ca_bundle.pem
```
Set `OS_CLOUD` to use the credentials generated by `cloud-config`:
```bash
export OS_CLOUD=sunbeam-admin
```
To verify **public** endpoints, run:
```console
openstack endpoint list --interface public
```
The output should use HTTPS for all URLs:
### CA
```default
+----------------------------------+-----------+--------------+--------------+---------+-----------+-----------------------------------------------------------+
| ID | Region | Service Name | Service Type | Enabled | Interface | URL |
+----------------------------------+-----------+--------------+--------------+---------+-----------+-----------------------------------------------------------+
| 05dd03b906af463cbbf85164bb4c208a | RegionOne | nova | compute | True | public | https://10.20.21.12:443/openstack-nova/v2.1 |
| 4880f1558ed94739ae9729d638cea95f | RegionOne | cinderv2 | volumev2 | True | public | https://10.20.21.12:443/openstack-cinder/v2/$(tenant_id)s |
| 809d07f8b2e84f49afa2b3ebcabbad03 | RegionOne | cinderv3 | volumev3 | True | public | https://10.20.21.12:443/openstack-cinder/v3/$(tenant_id)s |
| 9c10da39bb2e46588c05018a3098f1aa | RegionOne | neutron | network | True | public | https://10.20.21.12:443/openstack-neutron |
| bfdfca65a8a24e4ebe8340dd169b8012 | RegionOne | glance | image | True | public | https://10.20.21.12:443/openstack-glance |
| cd7490239e6845ffa8c6651300264e5a | RegionOne | keystone | identity | True | public | https://10.20.21.12/openstack-keystone/v3 |
| f7552dc54b4e4d11a1ffa1289957088c | RegionOne | placement | placement | True | public | https://10.20.21.12:443/openstack-placement |
+----------------------------------+-----------+--------------+--------------+---------+-----------+-----------------------------------------------------------+
```
### Vault
```default
+----------------------------------+-----------+--------------+--------------+---------+-----------+-----------------------------------------------------------+
| ID | Region | Service Name | Service Type | Enabled | Interface | URL |
+----------------------------------+-----------+--------------+--------------+---------+-----------+-----------------------------------------------------------+
| 05dd03b906af463cbbf85164bb4c208a | RegionOne | nova | compute | True | public | https://public.mydomain.com:443/openstack-nova/v2.1 |
| 4880f1558ed94739ae9729d638cea95f | RegionOne | cinderv2 | volumev2 | True | public | https://public.mydomain.com:443/openstack-cinder/v2/$(tenant_id)s |
| 809d07f8b2e84f49afa2b3ebcabbad03 | RegionOne | cinderv3 | volumev3 | True | public | https://public.mydomain.com:443/openstack-cinder/v3/$(tenant_id)s |
| 9c10da39bb2e46588c05018a3098f1aa | RegionOne | neutron | network | True | public | https://public.mydomain.com:443/openstack-neutron |
| bfdfca65a8a24e4ebe8340dd169b8012 | RegionOne | glance | image | True | public | https://public.mydomain.com:443/openstack-glance |
| cd7490239e6845ffa8c6651300264e5a | RegionOne | keystone | identity | True | public | https://public.mydomain.com/openstack-keystone/v3 |
| f7552dc54b4e4d11a1ffa1289957088c | RegionOne | placement | placement | True | public | https://public.mydomain.com:443/openstack-placement |
+----------------------------------+-----------+--------------+--------------+---------+-----------+-----------------------------------------------------------+
```
To verify **internal** endpoints, run:
```console
openstack endpoint list --interface internal
```
The output should use HTTPS for all URLs:
### CA
```default
+----------------------------------+-----------+--------------+--------------+---------+-----------+-----------------------------------------------------------+
| ID | Region | Service Name | Service Type | Enabled | Interface | URL |
+----------------------------------+-----------+--------------+--------------+---------+-----------+-----------------------------------------------------------+
| 04f9fb67ac6d4295a15d19ac829845b1 | RegionOne | neutron | network | True | internal | https://10.20.21.13:443/openstack-neutron |
| 05dda52ae04b424fa7f6083d4a888be2 | RegionOne | glance | image | True | internal | https://10.20.21.13:443/openstack-glance |
| 3fa47154d2c3425d987081600ab6b284 | RegionOne | keystone | identity | True | internal | https://10.20.21.13/openstack-keystone/v3 |
| 6240b34b08cc462a98ab4d37e1ea2770 | RegionOne | placement | placement | True | internal | https://10.20.21.13:443/openstack-placement |
| 6f7ef31c3f994d8a8f66fb749871ff26 | RegionOne | nova | compute | True | internal | https://10.20.21.13:443/openstack-nova/v2.1 |
| a9b1ad2b2e524db5b6147abfcca20eea | RegionOne | cinderv2 | volumev2 | True | internal | https://10.20.21.13:443/openstack-cinder/v2/$(tenant_id)s |
| ef9b8eeb54df468ebfd65adc851092b1 | RegionOne | cinderv3 | volumev3 | True | internal | https://10.20.21.13:443/openstack-cinder/v3/$(tenant_id)s |
+----------------------------------+-----------+--------------+--------------+---------+-----------+-----------------------------------------------------------+
```
### Vault
```default
+----------------------------------+-----------+--------------+--------------+---------+-----------+-----------------------------------------------------------+
| ID | Region | Service Name | Service Type | Enabled | Interface | URL |
+----------------------------------+-----------+--------------+--------------+---------+-----------+-----------------------------------------------------------+
| 04f9fb67ac6d4295a15d19ac829845b1 | RegionOne | neutron | network | True | internal | https://internal.mydomain.com:443/openstack-neutron |
| 05dda52ae04b424fa7f6083d4a888be2 | RegionOne | glance | image | True | internal | https://internal.mydomain.com:443/openstack-glance |
| 3fa47154d2c3425d987081600ab6b284 | RegionOne | keystone | identity | True | internal | https://internal.mydomain.com/openstack-keystone/v3 |
| 6240b34b08cc462a98ab4d37e1ea2770 | RegionOne | placement | placement | True | internal | https://internal.mydomain.com:443/openstack-placement |
| 6f7ef31c3f994d8a8f66fb749871ff26 | RegionOne | nova | compute | True | internal | https://internal.mydomain.com:443/openstack-nova/v2.1 |
| a9b1ad2b2e524db5b6147abfcca20eea | RegionOne | cinderv2 | volumev2 | True | internal | https://internal.mydomain.com:443/openstack-cinder/v2/$(tenant_id)s |
| ef9b8eeb54df468ebfd65adc851092b1 | RegionOne | cinderv3 | volumev3 | True | internal | https://internal.mydomain.com:443/openstack-cinder/v3/$(tenant_id)s |
+----------------------------------+-----------+--------------+--------------+---------+-----------+-----------------------------------------------------------+
```
To query for available cloud images, run:
```console
openstack image list
```
This should not result in any errors; the images should be displayed:
```default
+--------------------------------------+--------+--------+
| ID | Name | Status |
+--------------------------------------+--------+--------+
| 01a247e1-74cb-477d-80ca-5d834be8639b | ubuntu | active |
+--------------------------------------+--------+--------+
```
# index.html.md
# Managing Vault
This feature is used to encrypt all cloud service endpoints (both public
and private) using TLS certificates generated by Vault, which acts as an intermediary CA.
It does this by interfacing with the existing Traefik instances in the
cloud. A Traefik instance is associated with either public or private
cloud traffic.
## Prerequisites
To use TLS Vault, you must configure the hostname for Traefik, enable the Vault feature in your cloud and unseal and authorize the Vault charm.
Follow this guide [Enable Vault](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/vault.md).
## Enable TLS Vault
To enable TLS Vault, you’ll need to provide information that identifies your
chosen Certificate Authority. Do this by specifying a CA certificate and
its CA certificate chain.
Run the following command to enable TLS Vault for public endpoints:
```default
sunbeam enable tls vault --ca --ca-chain
```
#### NOTE
Omit the `--ca-chain` option when using self-signed certificates.
To enable TLS Vault for public, internal and rgw endpoints, be explicit by
using the `--endpoint` option:
```default
sunbeam enable tls vault --ca --ca-chain --endpoint public --endpoint internal --endpoint rgw
```
## Use TLS Vault
TLS certificates must now be provided to the Vault unit. This is
covered on the [Implement TLS using a third-party CA](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/managing-tls/implement-tls-using-a-third-party-ca.md) page.
## Disable TLS Vault
To disable TLS Vault in the cloud, run the following command:
```default
sunbeam disable tls vault
```
This command removes the manual-tls-certificates charm and removes Vault from being the intermediary certificate authority, as well as, clear the external hostnames on the corresponding Traefik endpoints. All services will work as if TLS was never enabled.
# index.html.md
# Installation
* [Install Canonical OpenStack using the manual bare metal provider](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/install/install-canonical-openstack-using-the-manual-bare-metal-provider.md)
* [Install Canonical OpenStack using Canonical MAAS](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/install/install-canonical-openstack-using-canonical-maas.md)
# index.html.md
# Install Canonical OpenStack using the manual bare metal provider
This how-to guide provides all necessary information to install [Canonical OpenStack](https://canonical.com/openstack) with
Sunbeam using the manual bare metal provider.
Make sure you get familiar with the following sections before proceeding with any instructions
listed below:
* [Architecture](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/architecture.md)
* [Design considerations](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/design-considerations.md)
* [Enterprise requirements](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/enterprise-requirements.md)
* [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md)
#### NOTE
This how-to guide is intended to serve operators willing to deploy a production-grade cloud.
If you’re looking for some simple learning materials instead, please refer to the
[Tutorials](https://canonical-openstack.readthedocs-hosted.com/2024.1//tutorial/index.md) section of this documentation.
## Requirements
You will need:
* two dedicated physical networks with an unlimited access to the Internet
* one dedicated physical machine with:
* hardware specifications matching minimum hardware specifications for the *Cloud* node as
documented under the [Enterprise requirements](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/enterprise-requirements.md) section
* fresh Ubuntu Server 24.04 LTS installed
If you can’t provide an unlimited access to the Internet, see the
[Manage a proxied environment](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-a-proxied-environment.md) section.
Additional machines can be added later. See the [Scaling the cluster out](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/scaling-the-cluster-out.md) how-to guide.
## Install Canonical OpenStack
When using the manual bare metal provider, Canonical OpenStack installation process is
relatively simple and takes around 30 minutes to complete, depending on your Internet connection
speed.
#### WARNING
Canonical Juju does not yet support controller HA modeling capabilities when deployed on top
Kubernetes. This means that Canonical OpenStack clouds deployed using the manual bare metal
provider do not provide HA for all types of governance functions by default. To bypass this
limitation Canonical recommends [using an external highly available Juju controller](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-an-existing-juju-controller.md). External
controller has to be registered before running the `sunbeam cluster bootstrap` command.
### Install the snap
First, install the `openstack` snap:
```text
sudo snap install openstack
```
This will install the latest stable version by default. You can use the `--channel` switch to
install a different version of OpenStack instead.
To list all available versions, execute the following command:
```text
snap info openstack
```
### Prepare the machine
To prepare the machine for Canonical OpenStack usage, execute the following command:
```text
sunbeam prepare-node-script --bootstrap | bash -x && newgrp snap_daemon
```
This command will:
* ensure all required software dependencies are installed, including the `openssh-server`,
* configure passwordless access to the `sudo` command for all terminal commands for the
currently logged in user (i.e. `NOPASSWD:ALL`).
Alternatively, you can let Sunbeam generate a script that you can further review and execute
step by step:
```text
sunbeam prepare-node-script --bootstrap
```
### Bootstrap the cloud
To bootstrap the cloud, execute the following command:
```text
sunbeam cluster bootstrap --role control,compute,storage
```
This will assign all roles (`control`, `compute`, `storage`) to the machine by default.
You can use the `--role` switch to narrow them down. See the [Architecture](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/architecture.md) section for more
details.
#### NOTE
A node can also be bootstrapped with the `network` role assigned.
When prompted, answer some interactive questions. Below is a sample output from the *cloud-1*
machine from the [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md) section:
```text
Management network (172.16.1.0/24): 172.16.1.0/24
Use proxy to access external network resources? [y/n] (n): n
Enter database toplogy: single/multi (cannot be changed later) (single): single
Enter a region name (cannot be changed later) (RegionOne): RegionOne
OpenStack APIs IP ranges (172.16.1.201-172.16.1.240): 172.16.1.201-172.16.1.240
Ceph devices (/dev/disk/by-id/wwn-0x500a0751e86b8eee): /dev/sdb
```
You can also refer to the [Interactive configuration prompts](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/interactive-configuration-prompts.md) section for detailed description of
each of those questions and some examples.
#### NOTE
The `network` role is mutually exclusive with the `compute` role and cannot be assigned
to the same machine. See the [Architecture](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/architecture.md) section for more
details.
Also note that answers to all those questions can be automated with the use of a
[Deployment manifest](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/deployment-manifest.md).
One finished, you should be able to see the following message on your screen:
```text
Node has been bootstrapped with roles: storage, compute, control
```
### Configure the cloud
Finally, configure the cloud for sample usage:
```text
sunbeam configure
```
Unless directed otherwise, this command will create sample project and user account. You can use
the `--openrc` switch to automatically generate an OpenStack RC file for this user (e.g.
`--openrc my-openrc`).
When prompted, answer some interactive questions. Below is a sample output from the *cloud-1*
machine from the [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md) section:
```text
Local or remote access to VMs [local/remote] (local): remote
External network (172.16.2.0/24): 172.16.2.0/24
External network's gateway (172.16.2.1): 172.16.2.1
External network's allocation range (172.16.2.2-172.16.2.254): 172.16.2.2-172.16.2.254
External network's type [flat/vlan] (flat): flat
Populate OpenStack cloud with demo user, default images, flavors etc [y/n] (y): y
Username to use for access to OpenStack (demo): demo
Password to use for access to OpenStack (IY********):
Project network (192.168.0.0/24): 192.168.0.0/24
Project network's nameservers (172.16.1.11 8.8.8.8 172.16.1.1 192.168.2.22 172.16.1.14): 8.8.8.8
Enable ping and SSH access to instances? [y/n] (y): y
External network's interface [eno2] (eno2): eno2
```
You can also refer to the [Interactive configuration prompts](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/interactive-configuration-prompts.md) section for detailed description of
each of those questions and some examples.
Also note that answers to all those questions can be automated with the use of a
[Deployment manifest](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/deployment-manifest.md).
One finished, you should be able to see the following message on your screen:
```text
The cloud has been configured for sample usage.
You can start using the OpenStack client or access the OpenStack dashboard at http://172.16.1.203:80/openstack-horizon
```
Note that the IP address of the OpenStack dashboard (here `172.16.1.203`) might be different
in your environment.
## Related how-to guides
Now that Canonical OpenStack is installed, you might want to check out the following how-to guides:
* [Using the OpenStack dashboard](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-the-openstack-dashboard.md)
* [Using the OpenStack client](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-the-openstack-cli.md)
* [Scaling the cluster out](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/scaling-the-cluster-out.md)
# index.html.md
# Install Canonical OpenStack using Canonical MAAS
This how-to guide provides all necessary information to install [Canonical OpenStack](https://canonical.com/openstack) with
Sunbeam using [Canonical MAAS](https://maas.io/).
Make sure you get familiar with the following sections before proceeding with any instructions
listed below:
* [Architecture](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/architecture.md)
* [Design considerations](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/design-considerations.md)
* [Network traffic isolation with MAAS](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/network-traffic-isolation-with-maas.md)
* [Enterprise requirements](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/enterprise-requirements.md)
* [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md)
#### NOTE
This how-to guide is intended to serve operators willing to deploy a production-grade cloud.
If you’re looking for some simple learning materials instead, please refer to the
[Tutorials](https://canonical-openstack.readthedocs-hosted.com/2024.1//tutorial/index.md) section of this documentation.
## Requirements
You will need:
* at least two dedicated physical networks with an unlimited access to the Internet
* one (or at least three for full HA) dedicated physical machine(s) with:
* hardware specifications matching minimum hardware specifications for the *Cloud* node as
documented under the [Enterprise requirements](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/enterprise-requirements.md) section
* one (or at least three for full HA) dedicated physical machine(s) with:
* hardware specifications matching minimum hardware specifications for the *Governor* node as
documented under the [Enterprise requirements](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/enterprise-requirements.md) section
* fresh Ubuntu Server 24.04 LTS installed
* one (or at least three for full HA) dedicated virtual machine(s), running on the *Governor*
node(s), with:
* hardware specifications matching minimum hardware specifications for the *MAAS* node as
documented in the [Canonical MAAS installation requirements](https://maas.io/docs/installation-requirements).
* fresh Ubuntu Server 24.04 LTS installed
* one dedicated virtual machine(s), running on a *Governor* node, with:
* hardware specifications matching minimum hardware specifications for the *Sunbeam Client* node
as documented under the [Enterprise requirements](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/enterprise-requirements.md) section
* fresh Ubuntu Server 24.04 LTS installed
* one (or at least three for full HA) dedicated virtual machine(s), running on the *Governor*
node(s), with:
* hardware specifications matching minimum hardware specifications for the *Sunbeam Controller*
node as documented under the [Enterprise requirements](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/enterprise-requirements.md) section
* one (or at least three for full HA) dedicated virtual machine(s), running on the *Governor*
node(s), with:
* hardware specifications matching minimum hardware specifications for the *Juju Controller*
node as documented under the [Enterprise requirements](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/enterprise-requirements.md) section
If you can’t provide unlimited access to the Internet, see the [Manage a proxied
environment](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-a-proxied-environment.md) page.
Additional machines can always be added later. See the [Scaling the cluster out](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/scaling-the-cluster-out.md) how-to guide.
## Install Canonical OpenStack
The following section assumes a generic knowledge of OpenStack and Canonical MAAS. Please refer to
the upstream [OpenStack documentation](https://docs.openstack.org/) and [MAAS documentation](https://maas.io/docs)
for more information.
### Pick a deployment name
Before you get started you have to pick a name for your Canonical OpenStack deployment. This
name will be used in various parts of this how-to guide. We’ll refer to it as a *deployment name*.
### Prepare the environment
When using Canonical MAAS as a bare metal provider, all machines in the OpenStack cluster get
deployed at once. This means the whole environment has to be prepared first before proceeding
with Canonical OpenStack installation. Please refer to the following checklist to make sure that
your environment is set up correctly.
#### Install and configure MAAS
Sunbeam expects a working MAAS environment to be able to install Canonical OpenStack using
Canonical MAAS.
In the [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md) section Canonical MAAS gets installed on maas-1, maas-2 and maas-3
machines in the HA mode. All of them are VMs running on Governor nodes.
##### Create reserved IP ranges for OpenStack API endpoints
In addition to some generic settings operators must create reserved IP ranges for OpenStack API
endpoints.
Those ranges have to be created under subnets that [will be further mapped](#mapping) to
`internal` and `public` cloud networks, and labeled with `-internal-api`, and
`-public-api` accordingly where the `` prefix matches the deployment name.
Depending on the number of optional features being used, you have to account for around 10-20
IP addresses per each range.
If the cloud is intended to use feature [Instance recovery](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/features/instance-recovery.md),
new range have to be created under `storage` cloud networks with label `-storage-ippool`.
Single IP address is sufficient for this range.
Reserved IP ranges from the [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md) section would look like as follows:

Refer to [MAAS documentation](https://maas.io/docs) for more information on creating reserved IP ranges.
#### Enlist, commission and configure machines
All machines but the Governor and Sunbeam Client nodes must be enlisted, commissioned and
configured in MAAS.
In the [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md) section sunbeam-controller-1, sunbeam-controller-2, sunbeam-controller-3,
juju-controller-1, juju-controller-2 and juju-controller-3 machines are VMs running on
Governor nodes.
##### Assign machine tags
In addition to some generic settings operators must assign machine tags to all nodes that they
intend to use in their deployment.
Please refer to the following table for information on which machine tags to assign to which nodes
in the cluster:
#### Tab. 1. Machine tags assignment.
| Machine tag | Purpose | Nodes to assign the tag to | Required cloud networks |
|-------------------|-------------------------------------------------------------|-----------------------------------------------------------------------|------------------------------------------------|
| openstack- | Defines which machines to use in this particular deployment | Cloud, Control, Compute, Storage, Sunbeam Controller, Juju Controller | None |
| control | Defines where to host cloud control functions | Cloud, Control | data, internal, management, public, storage |
| region-controller | Defines where to host cloud region controller functions | Region Controller | internal, management, public |
| compute | Defines where to host cloud compute functions | Cloud, Compute | data, internal, management, storage |
| storage | Defines where to host cloud storage functions | Cloud, Storage | internal, management, storage, storage-cluster |
| network | Defines where to host cloud network functions | Cloud, Network | internal, management, data |
| sunbeam | Defines where to host the Sunbeam controller | Sunbeam Controller | management |
| juju-controller | Defines where to host the Juju controller | Juju Controller | management |
Note that the `` suffix must match the deployment name.
Machines from the [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md) section would look like as follows:

Refer to [MAAS documentation](https://maas.io/docs) for more information on assigning machine tags.
##### Configure network
In addition to configuring network interfaces attached to the Generic physical network (or any
other physical networks if using more than one for traffic segmentation purposes), operators must
also configure the network interface attached to the External physical network. This is done by
leaving the *Subnet* field of this interface as *Unconfigured* and assigning the
`neutron:physnet1` network tag.
For example, network configuration of the *cloud-1* machine from the [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md)
section would look like as follows:

Refer to [MAAS documentation](https://maas.io/docs) for more information on assigning network tags.
##### Configure storage
All storage devices that are expected to serve as Ceph OSDs must have the `ceph` storage tag
assigned.
In the example configuration those would be `/dev/sdb` devices on *cloud-1*, *cloud-2* and
*cloud-3* machines.
Refer to [MAAS documentation](https://maas.io/docs) for more information on assigning storage tags.
### Install the snap
#### NOTE
All terminal commands used in this how-to guide are run from the first *Sunbeam Client* machine
(aka primary node).
First, install the `openstack` snap:
```text
sudo snap install openstack
```
This will install the latest stable version by default. You can use the `--channel` switch to
install a different version of OpenStack instead.
To list all available versions, execute the following command:
```text
snap info openstack
```
### Prepare the machine
To prepare the machine for Canonical OpenStack usage, execute the following command:
```text
sunbeam prepare-node-script --client | bash -x
```
This command will:
* install the Juju client,
* create any necessary data directories.
Alternatively, you can let Sunbeam generate a script that you can further review and execute step
by step:
```text
sunbeam prepare-node-script --client
```
### Add the Canonical MAAS provider
By default Sunbeam doesn’t know how to talk to Canonical MAAS. Therefore, information about the
Canonical MAAS provider have to be provided by the operator first.
In order to add the Canonical MAAS provider, execute the `sunbeam deployment add` command:
```text
sunbeam deployment add maas NAME TOKEN URL
```
`NAME` is the deployment name.
`TOKEN` is the MAAS API key.
`URL` is the MAAS URL.
For example, to add the Canonical MAAS provider from the [Example configuration section](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md), execute
the following command:
```text
sunbeam deployment add maas mycloud Nehk886eajph68tGEK:HcaG27ACee2X2LuPA2:2GtynUxLHXWmQsRYznKahfy3F6D8e4ex http://172.16.1.14:5240/MAAS
```
### Map network spaces to cloud networks
Certain machines need access to certain cloud networks. This is managed through the concept of
[MAAS network spaces to cloud networks mapping](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/network-traffic-isolation-with-maas.md).
To map network space to cloud network, execute the `sunbeam deployment space map` command:
```text
sunbeam deployment space map SPACE:NETWORK
```
`SPACE` is the MAAS space.
`NETWORK` is the cloud network (a traffic group).
If a space is given alone, it will be considered as the default space.
For example, to map network spaces to cloud networks from the example configuration section,
execute the following commands:
```text
sunbeam deployment space map myspace
```
This will map all cloud networks to one network space (`myspace`) at once, meaning that all
types of network traffic, but the North-South traffic which is configured through the network
tags assignment, will use physical networks under the `myspace` network space.
### Validate the provider
Sunbeam expects a [correctly configured MAAS provider](#prerequisites) to be able to install
Canonical OpenStack.
To check whether your environment is ready, execute the following command:
```text
sunbeam deployment validate
```
Sample output:
```text
Checking machines, roles, networks and storage... WARN
Checking zone distribution... WARN
Checking networking... OK
Report saved to '/home/guardian/snap/openstack/common/reports/validate-deployment-mycloud-20241107-111400.097496.yaml'
```
A report will be generated under `$HOME/snap/openstack/common/reports` if a failure is detected.
A sample failure might look like this:
```text
- diagnostics: A machine root disk needs to be at least 500GB to be a part of an openstack
deployment.
machine: cloud-1
message: root disk is too small
name: Root disk check
passed: warning
```
#### NOTE
A validation error will lessen the chances of a successful deployment but it will not block an
attempted deployment.
### Bootstrap the orchestration layer
To bootstrap the orchestration layer, execute the following command:
```text
sunbeam cluster bootstrap
```
When prompted, answer some interactive questions. Below is a sample output from the *client-1*
machine from the [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md) section:
```text
Use proxy to access external network resources? [y/n] (n): n
```
You can also refer to the [Interactive configuration prompts](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/interactive-configuration-prompts.md) section for detailed description of
each of those questions and some examples.
Also note that answers to all those questions can be automated with the use of a
[Deployment manifest](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/deployment-manifest.md).
One finished, you should be able to see the following message on your screen:
```text
Bootstrap controller components complete.
```
### Bootstrap the cloud
To bootstrap the cloud, execute the following command:
```text
sunbeam cluster deploy
```
When prompted, answer some interactive questions. Below is a sample output from the *client-1*
machine from the [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md) section:
```text
Enter database toplogy: single/multi (cannot be changed later) (single): single
Enter a region name (cannot be changed later) (RegionOne): RegionOne
```
You can also refer to the [Interactive configuration prompts](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/interactive-configuration-prompts.md) section for detailed description of
each of those questions and some examples.
Also note that answers to all those questions can be automated with the use of a
[Deployment manifest](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/deployment-manifest.md).
One finished, you should be able to see the following message on your screen:
```text
Deployment complete with 3 control, 3 compute and 3 storage nodes. Total nodes in cluster: 3
```
### Configure the cloud
Finally, configure the cloud for sample usage:
```text
sunbeam configure
```
Unless directed otherwise, this command will create sample project and user account. You can use
the `--openrc` switch to automatically generate an OpenStack RC file for this user
(e.g. `--openrc my-openrc`).
When prompted, answer some interactive questions. Below is a sample output from the *client-1*
machine from the [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md) section:
```text
External network (172.16.2.0/24): 172.16.2.0/24
External network's gateway (172.16.2.1): 172.16.2.1
External network's allocation range (172.16.2.2-172.16.2.254): 172.16.2.2-172.16.2.254
External network's type [flat/vlan] (flat): flat
Populate OpenStack cloud with demo user, default images, flavors etc [y/n] (y): y
Username to use for access to OpenStack (demo): demo
Password to use for access to OpenStack (dH********):
Project network (192.168.0.0/24): 192.168.0.0/24
Project network's nameservers (8.8.8.8): 8.8.8.8
Enable ping and SSH access to instances? [y/n] (y): y
```
You can also refer to the [Interactive configuration prompts](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/interactive-configuration-prompts.md) section for detailed description of
each of those questions and some examples.
Also note that answers to all those questions can be automated with the use of a
[Deployment manifest](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/deployment-manifest.md).
One finished, you should be able to see the following message on your screen:
```text
The cloud has been configured for sample usage.
You can start using the OpenStack client or access the OpenStack dashboard at
http://172.16.1.223:80/openstack-horizon
```
Note that the IP address of the OpenStack dashboard (here `172.16.1.223`) might be different
in your environment.
## Related Guides
Now that Canonical OpenStack is installed, you might want to check out the following how-to guides:
* [Using the OpenStack dashboard](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-the-openstack-dashboard.md)
* [Using the OpenStack client](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/using-the-openstack-cli.md)
* [Scaling the cluster out](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/operations/scaling-the-cluster-out.md)
# index.html.md
# Contribute
## Reference
* [Reference](https://canonical-openstack.readthedocs-hosted.com/2024.1//contributor/reference/index.md)
* [Stable release process](https://canonical-openstack.readthedocs-hosted.com/2024.1//contributor/reference/stable-release.md)
# index.html.md
# Reference
* [Stable release process](https://canonical-openstack.readthedocs-hosted.com/2024.1//contributor/reference/stable-release.md)
* [Quick reference](https://canonical-openstack.readthedocs-hosted.com/2024.1//contributor/reference/stable-release.md#quick-reference)
* [Release channels](https://canonical-openstack.readthedocs-hosted.com/2024.1//contributor/reference/stable-release.md#release-channels)
* [Component specifications](https://canonical-openstack.readthedocs-hosted.com/2024.1//contributor/reference/stable-release.md#component-specifications)
# index.html.md
# Stable release process
This reference describes the stable release workflow for Canonical OpenStack components.
Each component (Rocks, Snaps, Charms, and the OpenStack snap) follows a structured release process with automated builds and manual promotion through release channels.
## Quick reference
| Component | Build system | Build trigger | Build frequency | Promotion method |
|--------------------------------------------------|----------------|-------------------------|----------------------------|-----------------------|
| Rocks | GitHub Actions | Commit to stable branch | On commit | Automatic on commit |
| Snaps | Launchpad | Commit to stable branch | Every 5 hours (if changes) | Manual via Snap Store |
| Charms | OpenDev CI | Commit to stable branch | On commit | Manual via Charmhub |
| [OpenStack snap](https://snapcraft.io/openstack) | Launchpad | Commit to stable branch | Every 5 hours (if changes) | Manual via Snap Store |
## Release channels
Components follow the Snap Store and Charmhub channel model with progressive promotion through risk levels:
edge
: Automated builds from stable branches. For development and early testing.
beta
: Builds promoted from edge after initial validation. For broader testing.
candidate
: Builds promoted from beta after extended testing. Release candidates for production.
stable
: Production-ready builds promoted from candidate after full validation.
## Component specifications
### Rocks
#### Overview
Rocks are OCI images that provide the runtime environment for OpenStack services.
The rocks mono-repository maintains a stable branch from which new rocks are built and published to the registry.
#### Repository and registry
* **Repository:**
[https://github.com/canonical/ubuntu-openstack-rocks](https://github.com/canonical/ubuntu-openstack-rocks)
* **Registry:**
GitHub Container Registry (ghcr.io)
* **Stable branch naming:**
`stable/YYYY.N` (e.g., `stable/2024.1`)
#### Build automation
* **Build system:**
GitHub Actions
* **Trigger:**
Commit to stable branch
* **Frequency:**
On each commit
* **Artifacts:**
OCI images published to ghcr.io
#### Release workflow
| Stage | Description |
|----------|----------------------------------------------------------------------------|
| Backport | Changes are proposed to the stable branch via pull request |
| Approval | Changes are reviewed and approved by maintainers |
| Build | GitHub Actions automatically builds and publishes the rock to the registry |
#### NOTE
Rocks are not automatically re-assigned to charm versions. After a rock is published, the associated charms must be rebuilt and published to Charmhub to consume the new rock version.
### Snaps
#### Overview
Infrastructure snaps (OpenStack Hypervisor, MicroCeph, MicroOVN) provide the runtime components for Canonical OpenStack deployments.
Snaps are built automatically and published to the edge channel, then manually promoted through higher risk levels.
#### Repository and registry
* **Build system:**
Launchpad
* **Registry:**
Snap Store
* **Stable branch naming:**
`stable/YYYY.N` (e.g., `stable/2024.1`)
Component snaps:
- [OpenStack Hypervisor snap](https://snapcraft.io/openstack-hypervisor)
- [MicroCeph snap](https://snapcraft.io/microceph)
- [MicroOVN snap](https://snapcraft.io/microovn)
#### Build automation
* **Build system:**
Launchpad
* **Trigger:**
Commit to stable branch
* **Frequency:**
Every 5 hours (if changes detected)
* **Artifacts:**
Snap packages published to edge channel
* **Build delay:**
Up to 5 hours
#### Release workflow
| Stage | Description |
|----------------------|------------------------------------------------------------------------------|
| Backport | Changes are proposed to the stable branch |
| Approval | Changes are reviewed and approved by maintainers |
| Build | Launchpad builds the snap and publishes to edge channel (up to 5 hour delay) |
| Testing (edge) | Snap is validated in the edge channel |
| Promote to beta | Snap is manually promoted to beta channel after edge validation |
| Testing (beta) | Snap is validated in the beta channel |
| Promote to candidate | Snap is manually promoted to candidate channel after beta validation |
| Testing (candidate) | Snap is validated in the candidate channel |
| Promote to stable | Snap is manually promoted to stable channel after candidate validation |
### Charms
#### Overview
Canonical OpenStack deploy and manage OpenStack services on Kubernetes and Machine.
Charms are built automatically on each commit and published to the edge channel, then manually promoted.
#### Repository and registry
* **Repository:**
[https://opendev.org/openstack/sunbeam-charms](https://opendev.org/openstack/sunbeam-charms)
* **Registry:**
Charmhub ([https://charmhub.io](https://charmhub.io))
* **Build system:**
OpenDev CI
* **Stable branch naming:**
`stable/YYYY.N` (e.g., `stable/2024.1`)
#### Build automation
* **Build system:**
OpenDev CI
* **Trigger:**
Commit to stable branch
* **Frequency:**
On each commit
* **Artifacts:**
Charms published to edge channel
#### Release workflow
| Stage | Description |
|----------------------|-------------------------------------------------------------------------|
| Backport | Changes are proposed to the stable branch |
| Approval | Changes are reviewed and approved by maintainers |
| Build | OpenDev CI builds the charm and publishes to edge channel |
| Testing (edge) | Charm is validated in the edge channel |
| Promote to beta | Charm is manually promoted to beta channel after edge validation |
| Testing (beta) | Charm is validated in the beta channel |
| Promote to candidate | Charm is manually promoted to candidate channel after beta validation |
| Testing (candidate) | Charm is validated in the candidate channel |
| Promote to stable | Charm is manually promoted to stable channel after candidate validation |
#### Release tools
For mass charm releases, use the [sunbeam-release tool](https://github.com/openstack-charmers/sunbeam-release).
### OpenStack snap
#### Overview
The [OpenStack snap](https://snapcraft.io/openstack) is the primary entry point for deploying and managing Canonical OpenStack.
It integrates charms, rocks, and infrastructure snaps into a cohesive deployment tool.
This component drives most integration testing across the Canonical OpenStack ecosystem.
#### Repository and registry
* **Repository:**
[https://github.com/canonical/snap-openstack](https://github.com/canonical/snap-openstack)
* **Registry:**
Snap Store
* **Snap Store listing:**
[https://snapcraft.io/openstack](https://snapcraft.io/openstack)
* **Build system:**
Launchpad
* **Stable branch naming:**
`stable/YYYY.N` (e.g., `stable/2024.1`)
#### Build automation
* **Build system:**
Launchpad
* **Trigger:**
Commit to stable branch
* **Frequency:**
Every 5 hours (if changes detected)
* **Artifacts:**
Snap package published to edge channel
* **Build delay:**
Up to 5 hours
#### Release workflow
| Stage | Description |
|----------------------|-------------------------------------------------------------------------------|
| Backport | Changes are proposed to the stable branch |
| Approval | Changes are reviewed and approved by maintainers |
| Build | Launchpad builds the snap and publishes to edge channel (up to 5 hour delay) |
| Testing (edge) | Changes are validated in the edge channel |
| Promote to beta | Snap is manually promoted to beta channel after edge validation |
| Testing (beta) | Automated internal tests run at Canonical: smoke, regression, and scale tests |
| Promote to candidate | Snap is manually promoted to candidate channel after beta validation |
| Testing (candidate) | Final validation in candidate channel |
| Promote to stable | Snap is manually promoted to stable channel after all tests pass |
#### Testing specifications
The OpenStack snap undergoes comprehensive automated testing:
Smoke tests
: Basic functionality validation of core OpenStack services
Regression tests
: Verification that existing functionality remains intact
Scale tests
: Performance and scalability validation under load
These automated tests run internally at Canonical before promotion to stable.
# index.html.md
# Reference
## Index
* [Enterprise Requirements](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/enterprise-requirements.md)
* [Example physical configuration](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/example-physical-configuration.md)
* [Interactive configuration prompts](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/interactive-configuration-prompts.md)
* [Known limitations](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/known-limitations.md)
* [Manifest file reference](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/manifest-file-reference.md)
* [Network debugging](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/network-debugging.md)
* [Proxy ACL access](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/proxy-acl-access.md)
* [Release cycle and supported versions](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/release-cycle-and-supported-versions.md)
* [Projects and charms](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/underlying-projects-and-charms.md)
* [API auditing](https://canonical-openstack.readthedocs-hosted.com/2024.1//reference/api-auditing.md)
# index.html.md
# Release cycle and supported versions
The release cycle of Canonical OpenStack is tightly synchronized with the release cycle of upstream OpenStack. At the same time the release cycle of upstream OpenStack roughly follows the release cycle of Ubuntu. This means that new versions of Canonical OpenStack are released twice a year: usually in April and October.
## Canonical OpenStack (based on Sunbeam)
OpenStack clouds deployed with Sunbeam benefit from security maintenance and full support under [Ubuntu Pro + Support](https://ubuntu.com/pro), [Ubuntu Pro (Infra-only) + Support](https://ubuntu.com/pro) and [Legacy Support](https://ubuntu.com/support).
The first long term support (LTS) version of Canonical OpenStack (based on Sunbeam) is 2024.1. Every LTS version will benefit from up to 12 years of full support moving forward.
Full support will also be available on every second interim version. Users will be able to securely upgrade between supported versions using the [Skip Level Upgrade Release Process (SLURP) mechanism](https://docs.openstack.org/project-team-guide/release-cadence-adjustment.html) for 2 years after the next LTS version release.
### OpenStack
Canonical OpenStack (based on Sunbeam) release cycle can be represented this way:

Also refer to the table below:
#### Tab. 1. Supported versions of Canonical OpenStack (based on Sunbeam).
| OpenStack version | Released | EOL (standard) | EOL (under Ubuntu Pro) | EOL (under Legacy Support) |
|---------------------|---------------------|------------------|--------------------------|------------------------------|
| 2026.1 LTS | Apr 2026 (expected) | Apr 2031 | Apr 2036 | Apr 2038 |
| 2025.2 | Oct 2025 (expected) | Jul 2026 | Jul 2026 | Jul 2026 |
| 2025.1 | Apr 2025 (expected) | Jan 2026 | Apr 2028 | Apr 2028 |
| 2024.2 | Jan 2025 | Jul 2025 | Jul 2025 | Jul 2025 |
| 2024.1 LTS | Jan 2025 | Apr 2029 | Apr 2034 | Apr 2036 |
### Ubuntu
Canonical recommends using the latest LTS version of Ubuntu Server for the purpose of running Canonical OpenStack. However, customers can also use an older (n – 1) LTS version of Ubuntu, while running a newer version of OpenStack. The list of supported and some future versions of Canonical OpenStack with their corresponding supported Ubuntu versions is shown in Tab. 2:
#### Tab. 2. Canonical OpenStack support matrix.
| | OpenStack 2024.1 LTS | OpenStack 2025.1 | OpenStack 2026.1 LTS | OpenStack 2027.1 | OpenStack 2028.1 LTS |
|----------------------|------------------------|--------------------|------------------------|--------------------|------------------------|
| **Ubuntu 24.04 LTS** | ✓ | ✓ | ✓ | X | X |
| **Ubuntu 26.04 LTS** | X | X | ✓ | ✓ | ✓ |
| **Ubuntu 28.04 LTS** | X | X | X | X | ✓ |
## Canonical OpenStack (based on OpenStack Charms), aka Charmed OpenStack
OpenStack clouds deployed with OpenStack Charms under the Private Cloud Build (PCB) engagement or validated by Canonical under the Cloud Validation (CV) engagement (aka Charmed OpenStack clouds) also benefit from security maintenance and full support under [Ubuntu Pro + Support](https://ubuntu.com/pro) and [Ubuntu Pro (Infra-only) + Support](https://ubuntu.com/pro).
Canonical OpenStack (based on OpenStack Charms) release cycle can be represented this way:

Also refer to the table below:
#### Tab. 3. Supported versions of Canonical OpenStack (based on OpenStack Charms).
| OpenStack version | Ubuntu version | Released | EOL (standard) | EOL (under Ubuntu Pro) | EOL (under Legacy Support) |
|---------------------|------------------|------------|------------------|--------------------------|------------------------------|
| 2024.1 | 22.04 LTS | Dec 2024 | Apr 2027 | Apr 2032 | Apr 2034 |
| 2023.2 | 22.04 LTS | Oct 2023 | Apr 2025 | Apr 2025 | Apr 2025 |
| Yoga LTS | 22.04 LTS | Apr 2022 | Apr 2027 | Apr 2032 | Apr 2034 |
| Yoga | 20.04 LTS | Apr 2022 | Apr 2025 | Apr 2025 | Apr 2025 |
| Ussuri LTS | 20.04 LTS | May 2020 | Apr 2025 | Apr 2030 | Apr 2032 |
| Queens LTS | 18.04 LTS | Apr 2018 | Apr 2023 | Apr 2028 | Apr 2030 |
## OpenStack packages
OpenStack clouds deployed with third-party tools which use OpenStack packages from official archives benefit from security maintenance under [Ubuntu Pro](https://ubuntu.com/pro), [Ubuntu Pro (Infra-only)](https://ubuntu.com/pro) and [Legacy Support](https://ubuntu.com/support). However, full support is *NOT* available for those environments.
OpenStack versions shipped through the [Ubuntu Archive (UA)](https://packages.ubuntu.com/) benefit from Canonical’s generic commitment to packages from the archive, including up to 12 years of security maintenance for all LTS versions of Ubuntu. However, since Canonical recommends using only LTS versions of Ubuntu in production environments, this limits available OpenStack versions to one by default.
Therefore, Canonical maintains an additional archive - [Ubuntu Cloud Archive (UCA)](https://wiki.ubuntu.com/OpenStack/CloudArchive) - to provide access to newer versions of OpenStack on Ubuntu LTS versions. OpenStack versions shipped through the UCA are maintained for a shorter period of time (usually 18 or 36 months).
Release cycle of OpenStack packages on Ubuntu can be represented this way:

Also refer to the table below:
#### Tab. 4. Supported versions of OpenStack packages on Ubuntu.
| OpenStack version | Archive | Released | EOL (standard) | EOL (under Ubuntu Pro) | EOL (under Legacy Support) |
|---------------------|-----------|---------------------|------------------|--------------------------|------------------------------|
| 2026.1 LTS | UA | Apr 2026 (expected) | Apr 2031 | Apr 2036 | Apr 2038 |
| 2026.1 | UCA | Apr 2026 (expected) | Apr 2029 | Apr 2029 | Apr 2029 |
| 2025.2 | UCA | Oct 2025 (expected) | Apr 2027 | Apr 2027 | Apr 2027 |
| 2025.1 | UCA | Apr 2025 (expected) | Oct 2026 | Oct 2026 | Oct 2026 |
| 2024.2 | UCA | Oct 2024 | Apr 2026 | Apr 2026 | Apr 2026 |
| 2024.1 LTS | UA | Apr 2024 | Apr 2029 | Apr 2034 | Apr 2036 |
| 2024.1 | UCA | Apr 2024 | Apr 2027 | Apr 2027 | Apr 2027 |
| 2023.2 | UCA | Oct 2023 | Apr 2025 | Apr 2025 | Apr 2025 |
| Yoga LTS | UA | Apr 2022 | Apr 2027 | Apr 2032 | Apr 2034 |
| Ussuri LTS | UA | Apr 2020 | Apr 2025 | Apr 2030 | Apr 2032 |
| Queens LTS | UA | Apr 2018 | Apr 2023 | Apr 2028 | Apr 2030 |
# index.html.md
# Proxy ACL access
For a network that is constrained by a proxy server, efforts will be
needed to ensure that Canonical OpenStack works as intended. See the [Manage a
proxied environment](https://canonical-openstack.readthedocs-hosted.com/2024.1//how-to/misc/manage-a-proxied-environment.md) page for guidance.
The proxy server itself must have ACL rules that permit all
nodes to access the resources listed below.
| Resource | Description |
|--------------------------------------|----------------------------|
| streams.canonical.com | Juju agent packages |
| archive.ubuntu.com | Ubuntu archive packages |
| security.ubuntu.com | Ubuntu security packages |
| cloud-images.ubuntu.com | Cloud images |
| api.charmhub.io | Juju charms |
| docker.io | Container images |
| production.cloudflare.docker.com | Container images |
| quay.io | Container images |
| ghcr.io | Container images |
| pkg-containers.githubusercontent.com | Container images |
| registry.k8s.io | Container images |
| pkg.dev | Container images |
| amazonaws.com | Container images |
| registry.jujucharms.com | Container images |
| api.snapcraft.io | Snaps |
| snapcraftcontent.com | Snaps |
| builds.coreos.fedoraproject.org | VM Image for Fedora CoreOS |
| download.cirros-cloud.net | VM Image for CirrOS |
| maas.io | MAAS images [1] |
| contracts.canonical.com | Ubuntu Pro |
| images.lxd.canonical.com | LXD Container images [2] |
[1] Only needed for deployments based on [MAAS](https://maas.io).
[2] Only needed for deployments based on [LXD](https://canonical.com/lxd) controller.
# index.html.md
# API auditing
Canonical OpenStack automatically enables auditing for most OpenStack API
services, leveraging the [Keystone audit middleware](https://docs.openstack.org/keystonemiddleware/latest/audit.html).
The audit events are logged in [CADF](https://www.dmtf.org/standards/cadf)
format using the [pyCADF](https://docs.openstack.org/pycadf/latest/) library.
#### API service support matrix
| Service name | CADF auditing supported |
|----------------|---------------------------|
| Aodh | ✓ |
| Barbican | ✓ |
| Ceilometer | ✓ |
| Cinder | ✓ |
| Designate | ✓ |
| Glance | ✓ |
| Gnocchi | X |
| Heat | ✓ |
| Keystone | ✓ |
| Magnum | ✓ |
| Masakari | ✓ |
| Neutron | ✓ |
| Octavia | ✓ |
| Placement | X |
| Watcher | X |
All the API requests and responses that reach the audit
[api-paste filter](https://docs.pylonsproject.org/projects/pastedeploy).
will be logged.
#### NOTE
Some requests may be rejected by other filters, for example due to an
invalid token. No CADF event will be emitted in this case.
## Sample
The audit middleware will log one notification for the observed request and
another for the corresponding reply.
The records include information such as:
* initiator credentials and address
* target endpoint
* request path and action
* request outcome
* request id, which can be used to correlate logs
```text
$ sudo k8s kubectl logs -n openstack pod/nova-0 \
--container nova-api --since 5m | grep oslo.messaging.notification.audit
2025-06-12T09:45:55.775Z [wsgi-nova-api] 2025-06-12 09:45:55.775335 2025-06-12 09:45:55.774 80 INFO oslo.messaging.notification.audit.http.request [None req-4cf54a26-26b3-4cd3-9442-2630480563b4 1c6dfb96f6ad40cab32a5add1daef45e 123e60b3cd024672b6dfdd0b6db8c32d - - 756f65bca3e74610aed6fffb0cc771c3 756f65bca3e74610aed6fffb0cc771c3] {"message_id": "31f1874a-91ea-4822-84a2-b82570afdc44", "publisher_id": "mod_wsgi", "event_type": "audit.http.request", "priority": "INFO", "payload": {"typeURI": "http://schemas.dmtf.org/cloud/audit/1.0/event", "eventType": "activity", "id": "d7853699-5d1c-5bea-9fe0-815616e40ee0", "eventTime": "2025-06-12T09:45:55.774005+0000", "action": "read/list", "outcome": "pending", "observer": {"id": "target"}, "initiator": {"id": "1c6dfb96f6ad40cab32a5add1daef45e", "typeURI": "service/security/account/user", "name": "admin", "credential": {"token": "***", "identity_status": "Confirmed"}, "host": {"address": "10.1.0.179", "agent": "openstacksdk/3.0.0 keystoneauth1/5.6.0 python-requests/2.31.0 CPython/3.12.3"}, "project_id": "123e60b3cd024672b6dfdd0b6db8c32d", "request_id": "req-4cf54a26-26b3-4cd3-9442-2630480563b4"}, "target": {"id": "nova", "typeURI": "service/compute/servers/detail", "name": "nova", "addresses": [{"url": "http://10.152.183.37:8774/v2.1", "name": "admin"}, {"url": "http://10.7.66.204:80/openstack-nova/v2.1", "name": "private"}, {"url": "http://10.7.66.205:80/openstack-nova/v2.1", "name": "public"}]}, "requestPath": "/openstack-nova/v2.1/servers/detail?deleted=False", "tags": ["correlation_id?value=79a738d0-b97d-556e-9efe-d99536267d1e"]}, "timestamp": "2025-06-12 09:45:55.774487"}
2025-06-12T09:45:56.184Z [wsgi-nova-api] 2025-06-12 09:45:56.184431 2025-06-12 09:45:56.184 80 INFO oslo.messaging.notification.audit.http.response [None req-4cf54a26-26b3-4cd3-9442-2630480563b4 1c6dfb96f6ad40cab32a5add1daef45e 123e60b3cd024672b6dfdd0b6db8c32d - - 756f65bca3e74610aed6fffb0cc771c3 756f65bca3e74610aed6fffb0cc771c3] {"message_id": "1ecdd560-e881-4038-ba27-2a74cf322872", "publisher_id": "mod_wsgi", "event_type": "audit.http.response", "priority": "INFO", "payload": {"typeURI": "http://schemas.dmtf.org/cloud/audit/1.0/event", "eventType": "activity", "id": "d7853699-5d1c-5bea-9fe0-815616e40ee0", "eventTime": "2025-06-12T09:45:55.774005+0000", "action": "read/list", "outcome": "success", "observer": {"id": "target"}, "initiator": {"id": "1c6dfb96f6ad40cab32a5add1daef45e", "typeURI": "service/security/account/user", "name": "admin", "credential": {"token": "***", "identity_status": "Confirmed"}, "host": {"address": "10.1.0.179", "agent": "openstacksdk/3.0.0 keystoneauth1/5.6.0 python-requests/2.31.0 CPython/3.12.3"}, "project_id": "123e60b3cd024672b6dfdd0b6db8c32d", "request_id": "req-4cf54a26-26b3-4cd3-9442-2630480563b4"}, "target": {"id": "nova", "typeURI": "service/compute/servers/detail", "name": "nova", "addresses": [{"url": "http://10.152.183.37:8774/v2.1", "name": "admin"}, {"url": "http://10.7.66.204:80/openstack-nova/v2.1", "name": "private"}, {"url": "http://10.7.66.205:80/openstack-nova/v2.1", "name": "public"}]}, "requestPath": "/openstack-nova/v2.1/servers/detail?deleted=False", "tags": ["correlation_id?value=79a738d0-b97d-556e-9efe-d99536267d1e"], "reason": {"reasonType": "HTTP", "reasonCode": "200"}, "reporterchain": [{"role": "modifier", "reporterTime": "2025-06-12T09:45:56.183492+0000", "reporter": {"id": "target"}}]}, "timestamp": "2025-06-12 09:45:56.183889"}
```
Keystone does not use the audit middleware, but instead will log one
notification for each successful create, modify or delete operation.
Again, the notification will contain the initiator details along with the
requested action.
```text
$ sudo k8s kubectl logs -n openstack pod/keystone-0 \
--container keystone --since 5m | grep oslo.messaging.notification
2025-06-17T10:23:40.242Z [wsgi-keystone] 2025-06-17 10:23:40.242100 2025-06-17 10:23:40.241 1329 INFO oslo.messaging.notification.identity.user.updated [None req-6cf138c4-c390-40e9-92a7-63091d538fcf f28f7f5a711941af99f5a09a42699dc6 c386d8fed6694aa78b6a2d42d2d04348 - - e2f3d227a8db47a1a9204cbe8bc7758c e2f3d227a8db47a1a9204cbe8bc7758c] {"message_id": "e585b0b6-42b2-4423-947a-b5987796dd1e", "publisher_id": "identity.keystone-0", "event_type": "identity.user.updated", "priority": "INFO", "payload": {"typeURI": "http://schemas.dmtf.org/cloud/audit/1.0/event", "eventType": "activity", "id": "0b349407-5549-51bf-adff-e3c484740c0a", "eventTime": "2025-06-17T10:23:40.204955+0000", "action": "updated.user", "outcome": "success", "observer": {"id": "41393a82908d4d59ae36032d92569fd7", "typeURI": "service/security"}, "initiator": {"id": "f28f7f5a711941af99f5a09a42699dc6", "typeURI": "service/security/account/user", "host": {"address": "10.1.0.197", "agent": "python-keystoneclient"}, "user_id": "f28f7f5a711941af99f5a09a42699dc6", "project_id": "c386d8fed6694aa78b6a2d42d2d04348", "request_id": "req-6cf138c4-c390-40e9-92a7-63091d538fcf", "username": "admin"}, "target": {"id": "da9429a6cda54340b9a8652423c21d0a", "typeURI": "data/security/account/user"}, "resource_info": "da9429a6cda54340b9a8652423c21d0a"}, "timestamp": "2025-06-17 10:23:40.241660"}
```
# index.html.md
# Example physical configuration
Sunbeam requires a properly cabled and configured hardware to be able to install Canonical OpenStack. Therefore, we use one example physical configuration across all examples in this documentation. It is highly recommended that you use exactly the same configuration in your environment until you become proficient with both OpenStack and Sunbeam.
#### NOTE
Depending on your scenario you might not need both physical networks and all six machines.
Please refer to instructions under tutorials and how-to guides for exact hardware requirements
for each scenario.
## Layout
Example physical configuration layout is shown in Fig. 1:

## Networks
The following section documents example physical configuration of networks.
### Physical networks
Canonical OpenStack requires at least two physical networks to function properly:
* **External** – used to provide an inbound (south) access to virtual machines (VMs) running on top of OpenStack through the mechanism of floating IPs, and outbound (north) access from instances to networks outside of OpenStack.
* **Generic** – used for any other purposes (machine provisioning, machine management, providing access to OpenStack APIs, etc.).
Those should be plugged into a router with an access to the Internet as shown in Fig. 1.
### Virtual networks
In addition to physical networks listed above, Canonical OpenStack uses virtual networks to
provide an inter-VM communication for tenant’s workloads running inside of a project. These
networks are not routable outside of the Canonical OpenStack installation. We will use one such
network in the example configuration and we will refer to it as **Project** in all parts of the
documentation.
### Reference parameters
Some reference parameters of those three networks are listed in Tab. 1 below:
#### Tab. 1. Reference network parameters.
| Network | Type | CIDR | Gateway | Nameserver | Domain | MAAS space |
|-----------|----------|----------------|-------------|--------------|-------------|--------------|
| Generic | Physical | 172.16.1.0/24 | 172.16.1.1 | 8.8.8.8 | example.com | myspace |
| External | Physical | 172.16.2.0/24 | 172.16.2.1 | N/A | N/A | myspace |
| Project | Virtual | 192.168.0.0/24 | 192.168.0.1 | 8.8.8.8 | N/A | N/A |
Some IP addresses from those networks will be directly assigned to the [machines being used](#id1). However, some other IPs will serve for special purposes instead. Those require dedicated ranges to be defined.
Some reference IP ranges are listed in Tab. 2 below:
#### Tab. 2. Reference IP address ranges.
| | IP address range | MAAS label |
|---------------------------|-----------------------------|----------------------|
| DHCP lease range for MAAS | 172.16.1.61 - 172.16.1.100 | N/A |
| OpenStack internal APIs | 172.16.1.201 - 172.16.1.220 | mycloud-internal-api |
| OpenStack public APIs | 172.16.1.221 - 172.16.1.240 | mycloud-public-api |
| OpenStack floating IPs | 172.16.2.2 - 172.16.2.254 | N/A |
## Machines
The following section documents example physical configuration of machines.
### Physical machines
The example physical configuration assumes 3 Cloud nodes and 3 Governor nodes spread across 3 different physical zones for full HA regardless of the cloud architecture being used. Depending on your scenario you might not need all six machines. Please refer to instructions under tutorials and how-to guides for exact hardware requirements for each scenario.
### Virtual machines
In addition to physical machines listed above, Canonical OpenStack can use virtual machines for the purpose of hosting cloud governance services. In the example physical configuration those are hosted on Governor nodes.
### Reference parameters
Some basic reference parameters of all those machines are listed in Tab. 3 below:
#### Tab. 3. Basic reference machine parameters.
| Machine | Type | Host | Ceph device | NIC | Network | IP |
|----------------------|----------|------------|---------------|-----------------------------------|------------------------------------------|---------------------------------------------------|
| cloud-1 | Physical | N/A | /dev/sdb | eno1 eno2 | Generic External | 172.16.1.101 Unconfigured |
| cloud-2 | Physical | N/A | /dev/sdb | eno1 eno2 | Generic External | 172.16.1.102 Unconfigured |
| cloud-3 | Physical | N/A | /dev/sdb | eno1 eno2 | Generic External | 172.16.1.103 Unconfigured |
| governor-1 | Physical | N/A | N/A | eno1 | Generic | 172.16.1.11 |
| governor-2 | Physical | N/A | N/A | eno1 | Generic | 172.16.1.12 |
| governor-3 | Physical | N/A | N/A | eno1 | Generic | 172.16.1.13 |
| maas-1 | Virtual | governor-1 | N/A | eno1 | Generic | 172.16.1.21 |
| maas-2 | Virtual | governor-2 | N/A | eno1 | Generic | 172.16.1.22 |
| maas-3 | Virtual | governor-3 | N/A | eno1 | Generic | 172.16.1.23 |
| sunbeam-client-1 | Virtual | governor-1 | N/A | eno1 | Generic | 172.16.1.31 |
| sunbeam-controller-1 | Virtual | governor-1 | N/A | eno1 | Generic | 172.16.1.41 |
| sunbeam-controller-2 | Virtual | governor-2 | N/A | eno1 | Generic | 172.16.1.42 |
| sunbeam-controller-3 | Virtual | governor-3 | N/A | eno1 | Generic | 172.16.1.43 |
| juju-controller-1 | Virtual | governor-1 | N/A | eno1 | Generic | 172.16.1.51 |
| juju-controller-2 | Virtual | governor-2 | N/A | eno1 | Generic | 172.16.1.52 |
| juju-controller-3 | Virtual | governor-3 | N/A | eno1 | Generic | 172.16.1.53 |
| observability-1 | Virtual | governor-1 | N/A | eno1 | Generic | 172.16.1.61 |
| observability-2 | Virtual | governor-2 | N/A | eno1 | Generic | 172.16.1.62 |
| observability-3 | Virtual | governor-3 | N/A | eno1 | Generic | 172.16.1.63 |
| landscape-1 | Virtual | governor-1 | N/A | eno1 | Generic | 172.16.1.71 |
| landscape-2 | Virtual | governor-2 | N/A | eno1 | Generic | 172.16.1.72 |
| landscape-3 | Virtual | governor-3 | N/A | eno1 | Generic | 172.16.1.73 |
When using Canonical MAAS as a bare metal provider, some additional parameters have to be set up first. Those are listed in Tab. 4:
#### Tab. 4. Additional reference machine parameters.
| Machine | Zone | Tags | Storage tag (/dev/sdb) | Network tag (eno2) |
|----------------------|--------|----------------------------------------------|--------------------------|----------------------|
| cloud-1 | AZ1 | openstack-mycloud, control, compute, storage | ceph | neutron:physnet1 |
| cloud-2 | AZ2 | openstack-mycloud, control, compute, storage | ceph | neutron:physnet1 |
| cloud-3 | AZ3 | openstack-mycloud, control, compute, storage | ceph | neutron:physnet1 |
| sunbeam-controller-1 | AZ1 | openstack-mycloud, sunbeam | | |
| sunbeam-controller-2 | AZ2 | openstack-mycloud, sunbeam | | |
| sunbeam-controller-3 | AZ3 | openstack-mycloud, sunbeam | | |
| juju-controller-1 | AZ1 | openstack-mycloud, juju-controller | | |
| juju-controller-2 | AZ2 | openstack-mycloud, juju-controller | | |
| juju-controller-3 | AZ3 | openstack-mycloud, juju-controller | | |
| observability-1 | AZ1 | | | |
| observability-2 | AZ2 | | | |
| observability-3 | AZ3 | | | |
| landscape-1 | AZ1 | | | |
| landscape-2 | AZ2 | | | |
| landscape-3 | AZ3 | | | |
## Canonical MAAS
The following section documents example configuration of Canonical MAAS bare metal provider:
* **Deployment name** - `mycloud`
* **Token** - `Nehk886eajph68tGEK:HcaG27ACee2X2LuPA2:2GtynUxLHXWmQsRYznKahfy3F6D8e4ex`
* **VIP** - `172.16.1.24`
# index.html.md
# Network debugging
This page presents a collection of techniques for interrogating your
cloud’s virtual networking system (OVN). Whether prompted by sheer
interest or by necessity (an issue has arisen), this page will assist
you in looking into the internals of your cloud’s networking layer.
#### NOTE
This page was inspired by [upstream OVN documentation](https://docs.ovn.org/en/latest/tutorials/ovn-openstack.html).
Many OVN troubleshooting techniques can be applied equally to a Sunbeam environment.
Contents:
- [Accessing OVN databases](#heading--accessing-ovn-databases)
- [Querying OVN databases](#heading--accessing-ovn-databases)
- [Capturing and tracing an ingress
packet](#heading--capturing-and-tracing-an-ingress-packet)
- [Resolving OpenFlow port
numbers](#heading--resolving-openflow-port-numbers)
## Accessing OVN databases
There are four containers in each `ovn-chassis` pod:
- Northd
- Northbound database
- Southbound database
- the charm itself
These containers can each be accessed with Juju over SSH. Once
connected, start a Bash shell and create aliases for accessing the OVN
tooling:
For the Northbound DB container:
```default
juju ssh -m openstack --container ovn-nb-db-server ovn-central/0
```
Set up aliases:
```text
bash
alias ovn-nbctl='ovn-nbctl --db=ssl:127.0.0.1:6641 -c /etc/ovn/cert_host -p /etc/ovn/key_host -C /etc/ovn/ovn-central.crt'
```
For the Southbound DB container:
```default
juju ssh -m openstack --container ovn-sb-db-server ovn-central/0
```
Set up aliases:
```text
bash
alias ovn-sbctl='ovn-sbctl --db=ssl:127.0.0.1:6642 -c /etc/ovn/cert_host -p /etc/ovn/key_host -C /etc/ovn/ovn-central.crt'
```
## Querying OVN databases
Assuming that all the defaults for a single-node install were used and
`sunbeam launch` was used to create a guest, then there will be a
demo-network, external-network, demo-router, and a guest.
These are some of the entities that are present from an OpenStack
perspective:
```text
openstack server list --all-projects
+--------------------------------------+-----------+--------+-------------------------------------------+--------+---------+
| ID | Name | Status | Networks | Image | Flavor |
+--------------------------------------+-----------+--------+-------------------------------------------+--------+---------+
| 6c446cb5-4934-401a-917d-e3bc215c0b64 | rapid-owl | ACTIVE | demo-network=10.20.20.138, 192.168.122.83 | ubuntu | m1.tiny |
+--------------------------------------+-----------+--------+-------------------------------------------+--------+---------+
openstack network list
+--------------------------------------+------------------+--------------------------------------+
| ID | Name | Subnets |
+--------------------------------------+------------------+--------------------------------------+
| 3f9bc3b1-2520-4658-85f0-545a69e8b06a | demo-network | 17e394f9-e12c-4f31-a269-62ddf3308fc8 |
| 856fe9e3-60bf-4177-bb8b-831f68bb55c0 | external-network | 14c63eaf-eeb7-476d-a99d-0a05f6a674f8 |
+--------------------------------------+------------------+--------------------------------------+
openstack subnet list
+--------------------------------------+-----------------+--------------------------------------+------------------+
| ID | Name | Network | Subnet |
+--------------------------------------+-----------------+--------------------------------------+------------------+
| 14c63eaf-eeb7-476d-a99d-0a05f6a674f8 | external-subnet | 856fe9e3-60bf-4177-bb8b-831f68bb55c0 | 10.20.20.0/24 |
| 17e394f9-e12c-4f31-a269-62ddf3308fc8 | demo-subnet | 3f9bc3b1-2520-4658-85f0-545a69e8b06a | 192.168.122.0/24 |
+--------------------------------------+-----------------+--------------------------------------+------------------+
openstack router list
+--------------------------------------+-------------+--------+-------+----------------------------------+
| ID | Name | Status | State | Project |
+--------------------------------------+-------------+--------+-------+----------------------------------+
| 5c300bae-bf1f-4773-ac98-1d71c23e1bc7 | demo-router | ACTIVE | UP | b8c896d15bb247448edd2d97f7d99f1f |
+--------------------------------------+-------------+--------+-------+----------------------------------+
openstack port list
+--------------------------------------+------+-------------------+-------------------------------------------------------------------------------+--------+
| ID | Name | MAC Address | Fixed IP Addresses | Status |
+--------------------------------------+------+-------------------+-------------------------------------------------------------------------------+--------+
| 418c3e5d-87fa-467c-b1c1-b9832fa1e752 | | fa:16:3e:09:d4:a6 | ip_address='192.168.122.2', subnet_id='17e394f9-e12c-4f31-a269-62ddf3308fc8' | DOWN |
| 56a18b9e-07d4-4249-b28b-b6446961a587 | | fa:16:3e:23:60:97 | ip_address='10.20.20.239', subnet_id='14c63eaf-eeb7-476d-a99d-0a05f6a674f8' | ACTIVE |
| 98835e99-8ab5-4cd3-8b17-207e15538c03 | | fa:16:3e:2d:6e:82 | | DOWN |
| ae7b9a8e-48e8-4c3a-9ef0-710ccba00776 | | fa:16:3e:70:93:8c | ip_address='192.168.122.1', subnet_id='17e394f9-e12c-4f31-a269-62ddf3308fc8' | ACTIVE |
| cd9f7cce-77cb-4fae-ae1c-94964248d8d5 | | fa:16:3e:00:53:35 | ip_address='10.20.20.138', subnet_id='14c63eaf-eeb7-476d-a99d-0a05f6a674f8' | N/A |
| d8174cec-c5ae-4bd0-abb4-9420c3b87e76 | | fa:16:3e:dd:8f:4d | ip_address='192.168.122.83', subnet_id='17e394f9-e12c-4f31-a269-62ddf3308fc8' | ACTIVE |
+--------------------------------------+------+-------------------+-------------------------------------------------------------------------------+--------+
```
To make the structure in OVN more readable, it helps to label the above
ports. Firstly, there are clearly two ports related to the `rapid-owl`
guest:
```text
openstack port set --name rapid-owl-internal d8174cec-c5ae-4bd0-abb4-9420c3b87e76
openstack port set --name rapid-owl-floating cd9f7cce-77cb-4fae-ae1c-94964248d8d5
```
Similarly, there are two ports connected to the `demo-router`:
```text
openstack port set --name demo-router-internal ae7b9a8e-48e8-4c3a-9ef0-710ccba00776
openstack port set --name demo-router-floating 56a18b9e-07d4-4249-b28b-b6446961a587
```
This leaves two ports unaccounted for. By showing the details of these
ports, we see that they are used internally for guest metadata:
```text
openstack port show -c device_id -c device_owner -c network_id 418c3e5d-87fa-467c-b1c1-b9832fa1e752
+--------------+----------------------------------------------+
| Field | Value |
+--------------+----------------------------------------------+
| device_id | ovnmeta-3f9bc3b1-2520-4658-85f0-545a69e8b06a |
| device_owner | network:distributed |
| network_id | 3f9bc3b1-2520-4658-85f0-545a69e8b06a |
+--------------+----------------------------------------------+
openstack port show -c device_id -c device_owner -c network_id 98835e99-8ab5-4cd3-8b17-207e15538c03
+--------------+----------------------------------------------+
| Field | Value |
+--------------+----------------------------------------------+
| device_id | ovnmeta-856fe9e3-60bf-4177-bb8b-831f68bb55c0 |
| device_owner | network:distributed |
| network_id | 856fe9e3-60bf-4177-bb8b-831f68bb55c0 |
+--------------+----------------------------------------------+
```
#### NOTE
The two metadata ports are marked as down and each of the guests floating IP
ports is in a `N/A` state. In both cases, this is normal and not an
indication of any kind of problem.
These entities are reflected in the configuration of the Northbound DB.
```text
ovn-nbctl show
switch 7fd2fe36-74b6-41a4-9005-d521d2a9a0fd (neutron-3f9bc3b1-2520-4658-85f0-545a69e8b06a) (aka demo-network)
port d8174cec-c5ae-4bd0-abb4-9420c3b87e76 (aka rapid-owl-internal)
addresses: ["fa:16:3e:dd:8f:4d 192.168.122.83"]
port 418c3e5d-87fa-467c-b1c1-b9832fa1e752
type: localport
addresses: ["fa:16:3e:09:d4:a6 192.168.122.2"]
port ae7b9a8e-48e8-4c3a-9ef0-710ccba00776 (aka demo-router-internal)
type: router
router-port: lrp-ae7b9a8e-48e8-4c3a-9ef0-710ccba00776
switch 31f5c4f7-725b-4313-86a5-2b5c47d4f03a (neutron-856fe9e3-60bf-4177-bb8b-831f68bb55c0) (aka external-network)
port 98835e99-8ab5-4cd3-8b17-207e15538c03
type: localport
addresses: ["fa:16:3e:2d:6e:82"]
port 56a18b9e-07d4-4249-b28b-b6446961a587 (aka demo-router-floating)
type: router
router-port: lrp-56a18b9e-07d4-4249-b28b-b6446961a587
port provnet-f5363a0a-8963-4271-a844-e545ba5f931b
type: localnet
addresses: ["unknown"]
router 1a6ddfff-8a1e-45a6-bdf8-6f13e7c5d8f9 (neutron-5c300bae-bf1f-4773-ac98-1d71c23e1bc7) (aka demo-router)
port lrp-ae7b9a8e-48e8-4c3a-9ef0-710ccba00776
mac: "fa:16:3e:70:93:8c"
networks: ["192.168.122.1/24"]
port lrp-56a18b9e-07d4-4249-b28b-b6446961a587
mac: "fa:16:3e:23:60:97"
networks: ["10.20.20.239/24"]
gateway chassis: [microk8s06.maas]
nat aba8126c-612d-4de5-9445-6aacb813714a
external ip: "10.20.20.138"
logical ip: "192.168.122.83"
type: "dnat_and_snat"
nat cf7cfd04-ebfa-4407-b14e-1d43f999e233
external ip: "10.20.20.239"
logical ip: "192.168.122.0/24"
type: "snat"
```
Over in the Southbound DB, the chassis for this deployment can be
examined:
```text
ovn-sbctl show
Chassis microk8s06.maas
hostname: microk8s06.maas
Encap geneve
ip: "10.177.200.18"
options: {csum="true"}
Port_Binding "d8174cec-c5ae-4bd0-abb4-9420c3b87e76"
Port_Binding cr-lrp-56a18b9e-07d4-4249-b28b-b6446961a587
```
The flows can also be listed:
```text
ovn-sbctl lflow-list
...
```
## Capturing and tracing an ingress packet
The example below captures and then traces an ICMP echo request packet
destined for a guest. The first step is to capture an echo request
packet. The code:tcpdump command can be used for this. In this example,
there is a single-node install with access to the guests available from
the installation node. The guests floating IP address is
**10.20.20.138**. The routes on the box show that traffic for this
subnet will be routed to **br-ex**.
```text
ip route | grep '10.20.20.0/24'
10.20.20.0/24 dev br-ex proto kernel scope link src 10.20.20.1
```
Listen on the br-ex interface, filter for echo request packets (an ICMP
code of 8), and store the captured packets in a file for later usage:
Window 1:
```text
sudo tcpdump -i br-ex "icmp[0] == 8" -w ping.pcap
```
Window 2:
```text
ping -c3 10.20.20.138
```
The **ping.pcap** file should now contain the echo requests generated by
the ping command. To use these with the OVS trace utility the packet capture
file needs to be converted. The utility for doing this is called
code:ovs-pcap. At the time of writing, this command is included in the
openstack-hypervisor snap but is not exposed. However it can still be
used:
```text
/snap/openstack-hypervisor/current/usr/bin/ovs-pcap ping.pcap > ping.hex
```
The `ping.hex` file will contain three entries corresponding to each
of the echo requests. For this example only the first is needed.
```text
IN_PORT="br-ex"
BRIDGE="br-ex"
PACKET=$(head -1 ping.hex)
sudo openstack-hypervisor.ovs-appctl ofproto/trace $BRIDGE in_port="$IN_PORT" $PACKET
```
If all is well the last rule in the output should end with:
```text
...
65. reg15=0x3,metadata=0x2, priority 100, cookie 0x3d326af3
output:2
```
This shows that the packet was sent out of OpenFlow port number 2. This
corresponds to the intended guest (See “Resolving OpenFlow port numbers”
below).
### Tracing a hypothetical ingress packet
By default, a guest launched in the demo project will respond to an echo
request.
```text
ping -q -c3 10.20.20.138
PING 10.20.20.138 (10.20.20.138) 56(84) bytes of data.
--- 10.20.20.138 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2045ms
rtt min/avg/max/mdev = 0.351/0.472/0.692/0.155 ms
```
This request can be simulated using `ovs-appctl`. Sunbeam installs this
utility as part of the openstack-hypervisor snap and can be accessed via
`openstack-hypervisor.ovs-appctl`:
```text
sudo openstack-hypervisor.ovs-appctl --help
ovs-appctl, for querying and controlling Open vSwitch daemon
...
```
To simulate the echo request above, some information needs to be
gathered. Since the packet enters ovs via the br-ex bridge the first
step is to gather the MAC and IP address of the bridge:
```text
ip address show br-ex
48: br-ex: mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether 46:fc:d8:8d:05:49 brd ff:ff:ff:ff:ff:ff
inet 10.20.20.1/24 scope global br-ex
valid_lft forever preferred_lft forever
inet6 fe80::44fc:d8ff:fe8d:549/64 scope link
valid_lft forever preferred_lft forever
BR_EX_MAC="46:fc:d8:8d:05:49"
BR_EX_IP="10.20.20.1"
```
OpenFlow assigns each port a number so the next step is to find what
number has been assigned to the br-ex port on the br-ex bridge:
```text
sudo openstack-hypervisor.ovs-vsctl get Interface br-ex ofport
65534
PORT_BR_EX=65534
```
Next, gather data about the destination of the request. The IP address
that was pinged earlier was 10.20.20.138:
```text
GUEST_FLOATING_IP="10.20.20.138"
```
The demo-router is going to handle this traffic so the destination MAC
address in this case is actually the MAC address of the demo-routers
port on the external network:
```text
openstack port list --router demo-router
+--------------------------------------+----------------------+-------------------+------------------------------------------------------------------------------+--------+
| ID | Name | MAC Address | Fixed IP Addresses | Status |
+--------------------------------------+----------------------+-------------------+------------------------------------------------------------------------------+--------+
| 56a18b9e-07d4-4249-b28b-b6446961a587 | demo-router-floating | fa:16:3e:23:60:97 | ip_address='10.20.20.239', subnet_id='14c63eaf-eeb7-476d-a99d-0a05f6a674f8' | ACTIVE |
| ae7b9a8e-48e8-4c3a-9ef0-710ccba00776 | demo-router-internal | fa:16:3e:70:93:8c | ip_address='192.168.122.1', subnet_id='17e394f9-e12c-4f31-a269-62ddf3308fc8' | ACTIVE |
+--------------------------------------+----------------------+-------------------+------------------------------------------------------------------------------+--------+
ROUTER_EXT_MAC="fa:16:3e:23:60:97"
```
Since this is going to trace a single packet, information about the type
of packet is needed. In this case, it is the echo request which is part
of the ping. An IPv4 ICMP echo request has an `icmp_type` of 8 and a code
of 0. Lastly, `nw_ttl` needs to be set to accommodate the number of hops
needed. In this case 64 is a reasonable value.
Putting this all together:
```text
sudo openstack-hypervisor.ovs-appctl ofproto/trace \
br-ex \
icmp,\
in_port=$PORT_BR_EX,\
dl_src=$BR_EX_MAC,\
dl_dst=$ROUTER_EXT_MAC,\
nw_src=$BR_EX_IP,\
nw_dst=$GUEST_FLOATING_IP,\
nw_ttl=64,\
icmp_type=8,\
icmp_code=0
```
This produces a large amount of output - details of how the packet is
traversing the OpenFlow rules - but the important piece is at the end:
```text
...
65. reg15=0x3,metadata=0x2, priority 100, cookie 0x3d326af3
output:2
```
This shows that the packet was sent out of OpenFlow port number 2. This
corresponds to the intended guest (see “Resolving OpenFlow port numbers”
below).
Finally, delete the security group rule that is permitting ICMP traffic
and check that the trace command now drops the traffic.
```text
openstack security group list --project demo
+--------------------------------------+---------+------------------------+----------------------------------+------+
| ID | Name | Description | Project | Tags |
+--------------------------------------+---------+------------------------+----------------------------------+------+
| 00aed662-f303-47fa-82a7-86cde90a4ee1 | default | Default security group | b8c896d15bb247448edd2d97f7d99f1f | [] |
+--------------------------------------+---------+------------------------+----------------------------------+------+
openstack security group rule list --ingress --protocol icmp 00aed662-f303-47fa-82a7-86cde90a4ee1
+--------------------------------------+-------------+-----------+-----------+------------+-----------+-----------------------+----------------------+
| ID | IP Protocol | Ethertype | IP Range | Port Range | Direction | Remote Security Group | Remote Address Group |
+--------------------------------------+-------------+-----------+-----------+------------+-----------+-----------------------+----------------------+
| 33237298-6052-45d9-9a7e-1fee0a7587b7 | icmp | IPv4 | 0.0.0.0/0 | | ingress | None | None |
+--------------------------------------+-------------+-----------+-----------+------------+-----------+-----------------------+----------------------+
openstack security group rule delete 33237298-6052-45d9-9a7e-1fee0a7587b7
```
This time the trace command ends with:
```text
...
44. ip,reg0=0x200/0x200,reg15=0x3,metadata=0x2, priority 2001, cookie 0x5eeee244
drop
```
## Resolving OpenFlow port numbers
When looking at OpenFlow rules or tracing a packet, the ports are given
numbers. These are the OpenFlow port numbers. For example, to find what
port 2 corresponds to:
```text
sudo openstack-hypervisor.ovs-vsctl find interface ofport=2 | grep -E "^name"
name : tapd8174cec-c5
```
Often the first part of the corresponding port’s UUID is included in the
name of the device. This enables it to be traced back:
```text
openstack port list | grep d8174cec-c5
| d8174cec-c5ae-4bd0-abb4-9420c3b87e76 | rapid-owl-internal | fa:16:3e:dd:8f:4d | ip_address='192.168.122.83', subnet_id='17e394f9-e12c-4f31-a269-62ddf3308fc8' | ACTIVE |
```
# index.html.md
# Known limitations
This document describes the known limitations of the Sunbeam project.
| Issue | Bug Number | Meaning |
|-------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Intermittent API failures when a control node is down on existing deployments | [LP #2150551](https://bugs.launchpad.net/snap-openstack/+bug/2150551) [k8s-operator #930](https://github.com/canonical/k8s-operator/issues/930) | Clusters bootstrapped with `snap-openstack` versions earlier than **rev998** will continue to experience intermittent API failures (for up to 5 minutes) when a control node becomes unavailable. A known [k8s charm limitation](https://charmhub.io/k8s/configurations#kube-apiserver-extra-args) restricts updates on active deployments, meaning this issue cannot be fixed on clusters deployed prior to this revision. |
# index.html.md
# Enterprise Requirements
## Single-node
For single-node deployments the following minimum hardware specification
applies:
| Component | Specification | Notes |
|-----------------------|-----------------------|-----------------------------------------------------------------|
| CPU | 4 core | amd64 only |
| RAM | 16 GiB | |
| Root Disk | 100 GiB of free space | SSD |
| Control plane network | 1 Gbps | Mainly localhost only networking so minimal requirement |
| External network | 1 Gbps | Optional - only required for remote access to instances |
| Storage | 1 x 100 GiB SSD | Optional - only required for block storage service |
#### NOTE
A single-node deployment has no resilience and has
limited performance.
#### NOTE
More storage may be required for the root disk, if additional features
are enabled that require persistent storage.
## Multi-node
For multi-node deployments the following minimum hardware specification
applies:
| Component | Specification | Notes |
|-----------------------------------|-----------------------|-------------------------------------------------------|
| CPU | 16 core | amd64 only |
| RAM | 32 GiB | |
| Root Disk | 500 GiB of free space | SSD |
| Control plane network network | 1 Gbps | Supports east/west traffic |
| External network | 1 Gbps | Supports north/south traffic |
| Storage | 1 x 500 GiB SSD | Required for block storage and image services |
#### NOTE
Three nodes are required for multi-node operation.
## Role Based Minimum Memory Sizing
For multi-node deployments the following minimum component memory sizing may be
used to size each node based on the roles it hosts within the deployment:
| Component | Kubernetes | Ceph OSD | Ceph MON/MGR | Ceph RGW | Control Plane | SunbeamD | Juju Controller | Sunbeam Client |
|--------------------|--------------|---------------|----------------|------------|-----------------|------------|-------------------|------------------|
| Control | 4 GiB | | | | 10 GiB | | | |
| Compute | | | | | 1 GiB | | | |
| Storage | | 5 GiB per OSD | 2 GiB | 2 GiB | | | | |
| Cloud | 4 GiB | 5 GiB per OSD | 2 GiB | 2 GiB | 11 GiB | | | |
| Sunbeam Controller | | | | | | 4 GiB | | |
| Sunbeam Client | | | | | | | | 1 GiB |
| Juju Controller | | | | | | | 4 GiB | |
#### NOTE
For Ceph components, the scale of the deployment will have an
impact on the memory footprint for MON/MGR daemons (3 nodes) and more memory and
cores may be needed per Ceph OSD if using NVMe drives instead of SSD of spinning
disks.
# index.html.md
# Manifest file reference
This resource aims to provide a definitive structure of a deployment
manifest file will all its supported keys.
#### TIP
For a conceptual overview of manifests, see the [Deployment manifest](https://canonical-openstack.readthedocs-hosted.com/2024.1//explanation/deployment-manifest.md) page.
```yaml
core:
config:
# The identity section allows the configuration of different
# identity providers. At this point, this section configures OpenID Connect
# and SAML2 keystone federated providers.
identity:
# The SAML2 Service Provider x509 certificate and key. When enabling any SAML2
# IDP, this option becomes mandatory.
saml2_x509:
certificate: "/home/ubuntu/cert.pem"
key: "/home/ubuntu/key.pem"
# This section defines th e providers we want to enable.
profiles:
# The name of the provider. This will be used as a provider ID when configured
# in OpenStack.
openid-example:
# The provider type. There are several specific provider types and one generic
# type.
provider: entra | google | okta | canonical | generic
# The federated identity protocol. The "canonical" provider type only supports
# "openid" for now.
protocol: openid | saml2
# Configuration options for the above mentioned provider/protocol pair.
config: { }
# Examples:
# entra-saml2:
# provider: entra
# protocol: saml2
# config:
# app-id: 82590875-2a9c-48cb-ba04-5125f0bed664
# microsoft-tenant: 86e92722-ba4c-4b8d-95f2-216e612a9bc3
# label: "Log in with Entra ID (SAML2)"
# entra-openid:
# provider: entra
# protocol: openid
# config:
# client-id: "the-client-id-goes-here"
# client-secret: "super-secret-client-secret"
# microsoft-tenant: 86e92722-ba4c-4b8d-95f2-216e612a9bc3
# label: "Log in with Entra ID (OIDC)"
# okta-saml2:
# provider: okta
# protocol: saml2
# config:
# app-id: app-id-goes-here
# okta-org: dev-123456
# label: "Log in with Okta (SAML2)"
# okta-openid:
# provider: okta
# protocol: openid
# config:
# client-id: "the-client-id-goes-here"
# client-secret: "super-secret-client-secret"
# okta-org: dev-123456
# label: "Log in with Okta (OIDC)"
# google-saml2:
# provider: google
# protocol: saml2
# config:
# app-id: 82590875-2a9c-48cb-ba04-5125f0bed664
# label: "Log in with Google (SAML2)"
# google-openid:
# provider: google
# protocol: openid
# config:
# client-id: "the-client-id-goes-here"
# client-secret: "super-secret-client-secret"
# label: "Log in with Google (OIDC)"
# canonical-openid:
# provider: canonical
# protocol: openid
# config:
# # This is the offer for the oauth endpoint of the hydra deployment
# # in canonical identity platform
# oauth-offer: "iam.controller/iam.hydra"
# # Optional: the offer for the CA certificate provider of the
# # canonical identity platform.
# cert-offer: iam.controller/iam.self-signed-certificates
# generic-saml2:
# provider: generic
# protocol: saml2
# config:
# metadata-url: https://saml2.example.com/app/sso/saml/metadata
# # optional: The CA chain to validate the IDP.
# ca-chain: /path/to/ca-chain.pem
# label: "Log in with My-SAML2-IDP"
# generic-openid:
# provider: generic
# protocol: openid
# config:
# client-id: "the-client-id-goes-here"
# client-secret: "super-secret-client-secret"
# issuer-url: https://oidc.example.com/.well-known/openid-configuration
# label: "Log in with My-OIDC-IDP"
# Use local network proxy to access external resources
proxy:
proxy_required: [ true,false ]
# Proxy variables to use if 'true' is chosen above
http_proxy: :
https_proxy: :
no_proxy: ,,...
# Configure OVS DPDK datapath (userspace), improving network performance.
dpdk:
# If enabled, OVS bridges are configured to use the netdev (DPDK) datapath
# instead of the standard system datapath.
enabled: [ true, false ]
# The number of CPU cores to allocate for OVS control plane processing.
control_plane_cores: 1
# The number of CPU cores to allocate for OVS data plane processing.
dataplane_cores: 1
# The amount of hugepage memory (MB) to reserve for OVS DPDK.
memory: 1024
# The DPDK compatible driver that will be assigned to physical
# interfaces connected to the DPDK dapapath.
driver: vfio-pci
# A list of physical interfaces to use with DPDK for each node.
#
# The interfaces will be persistently bound to the configured DPDK
# compatible driver, no longer being visible to the host.
#
# OVS bridges containing those interfaces (or bonds) are expected to
# be defined through Netplan or MAAS. Canonical Openstack will move
# the corresponding Netplan configuration to OVS, using the resulting
# OVS DPDK physical ports.
#
# Example:
# ports:
# r740-dc1-ceph.maas:
# - eno2
# - enp94s0
ports:
:
-
-
# This section defines PCI passthrough configuration, allowing SR-IOV
# VFs, GPUs and other PCI devices to be exposed to Openstack instances.
pci:
# A list of PCI filters specifying which devices to expose.
# The specs can contain exact PCI addresses, address wildcards,
# address regular expressions or vendor/product id tuples.
# SR-IOV interfaces may also contain a Neutron physical network,
# usually known as "physnet".
#
# See the Nova documentation for more details.
# https://docs.openstack.org/nova/latest/configuration/config.html#pci.device_spec
#
# Note that the following list applies to all compute nodes, use
# the "excluded_devices" field to define per-node exclusion lists.
#
# Example:
# device_specs:
# - address: "0000:1b:00.0"
# vendor_id: "8086"
# product_id: "1563"
# physical_network: "physnet1"
device_specs: [ ]
# Per-node PCI device exclusion list, containing excluded PCI addresses.
#
# Example:
# excluded_devices:
# r740-dc1-ceph.maas:
# - "0000:19:00.0"
# - "0000:19:00.1"
excluded_devices:
:
-
-
# A list of aliases that can be used to request PCI devices through
# Nova flavor extra specs.
#
# See the Nova documentation for more details.
# https://docs.openstack.org/nova/latest/configuration/config.html#pci.alias
#
# Example:
# aliases:
# - vendor_id: "8086"
# product_id: "1565"
# device_type: type-VF
# name: "intel-vf"
aliases: { }
bootstrap:
# Management networks shared by hosts
management_cidr: ,,...
# Example:
# management_cidr: 192.168.29.0/24
# Enter database toplogy: single/multi (cannot be changed later)
# This will configure number of databases, single for entire cluster or multiple databases with one per openstack service.
database: single
# Enter a region name (cannot be changed later)
region:
# Example:
# region: RegionOne
k8s-addons:
# Load balancer ranges
loadbalancer: ,,...
user:
# Populate OpenStack cloud with demo user, default images, flavors etc
run_demo_setup: [ true,false ]
# Username to use for access to OpenStack
username:
# Password to use for access to OpenStack
password:
# Network to use for initial project network
cidr:
# Nameservers that guests should use for DNS resolution
nameservers: ...
# Enable ping and SSH access to instances
security_group_rules: [ true,false ]
# Local or remote access to VMs
# Local mode - single node only
remote_access_location: [ local,remote ]
# Name of the physical network to populate the demo project network
# external routing
physnet:
# External networking (deprecated, use external-networks instead)
external_network:
nic: # deprecated
nics:
:
# Examples:
# sunbeam-1.localdomain: enp5s0
# sunbeam-2.localdomain: enp8s0
# sunbeam-3.localdomain: eno3
# CIDR of OpenStack external network
cidr:
# IP address of default gateway for external network
gateway:
# External network's allocation range
range:
# Network type for access to external network
network_type: [ flat,vlan ]
# VLAN ID if 'vlan' is chosen above
segmentation_id:
# External networking
external-networks:
:
nics:
:
# Examples:
# sunbeam-1.localdomain: enp5s0
# sunbeam-2.localdomain: enp8s0
# sunbeam-3.localdomain: eno3
# CIDR of OpenStack external network
cidr:
# IP address of default gateway for external network
gateway:
# External network's allocation range
range:
# Network type for access to external network
network_type: [ flat,vlan ]
# VLAN ID if 'vlan' is chosen above
segmentation_id:
# MicroCeph
microceph_config:
# Disks to attach to MicroCeph nodes
:
osd_devices: ,,...
# WARNING: This will wipe ALL devices listed on the
# dangerous_i_acknowledge_i_will_lose_data_wipe_disks: true
# Examples:
# sunbeam-1.localdomain:
# osd_devices: /dev/vdc,/dev/vdd
# sunbeam-2.localdomain:
# osd_devices: /dev/vdc,/dev/vdd
# dangerous_i_acknowledge_i_will_lose_data_wipe_disks: true
# sunbeam-3.localdomain:
# osd_devices: /dev/vdc,/dev/vdd
endpoints:
# Ips must be part of management_cidr defined above
# or public/internal spaces in MAAS deployments
ingress-internal: # optional
ip: # optional
hostname: # optional
ingress-public: # optional
ip: # optional
hostname: # optional
ingress-rgw: # optional
ip: # optional
hostname: # optional
# Examples:
# ingress-internal:
# hostname: internal.openstack.example.com
# ingress-public:
# ip: 192.168.29.27
# hostname: public.openstack.example.com
# ingress-rgw:
# ip: 192.168.29.28
# Openstack Dashboard Customization
horizon:
resources:
custom_theme:
software:
juju:
bootstrap_args:
-
-
- ...
# Examples:
# - --debug
# - --agent-version=3.2.4
# - --model-default=test-mode=true
# - --model-default=logging-config==INFO;unit=DEBUG
charms:
:
channel:
revision:
config:
:
:
# ...
# Examples:
# keystone-k8s:
# channel: 2024.1/candidate
# glance-k8s:
# channel: 2024.1/candidate
# revision: 66
# config:
# debug: true
# pool-type: replicated
# Special cases
# Configure mysql storage in single mysql scenario
# mysql-k8s:
# storage:
# database:
# Configure mysql storage in multi mysql scenario
# mysql-k8s:
# storage-map:
# keystone-k8s:
# database:
# glance-k8s:
# database:
# ...
# Configure mysql configs in multi mysql scenario
# mysql-k8s:
# config-map:
# keystone-k8s:
# :
# glance-k8s:
# :
# ...
# Configure glance image repository for local storage
# glance-k8s:
# storage:
# local-repository:
# Configure traefik configs per application
# traefik-k8s:
# config-map:
# traefik:
# tls-ca:
# tls-cert:
# tls-key:
# traefik-public:
# tls-ca:
# tls-cert:
# tls-key:
# traefik-rgw:
# tls-ca:
# tls-cert:
# tls-key:
# Configure cinder-volume configs per application
# cinder-volume:
# config-map:
# cinder-volume:
# rabbit-user:
# cinder-volume-noha:
# rabbit-user:
terraform:
:
source:
# Example:
# hypervisor-plan:
# source: /home/ubuntu/deploy-openstack-hypervisor
features:
observability:
embedded:
# Storage for embedded COS can be configured before deployment.
# Resizing these storage options after deployment is not currently
# supported.
software:
charms:
:
storage:
:
# Examples:
# prometheus-k8s:
# storage:
# database: "40G" # default: 20G
# loki-k8s:
# storage:
# active-index-directory: "4G" # default: 2G
# loki-chunks: "10G" # default: 5G
# grafana-k8s:
# storage:
# database: "2G" # default: 1G
# alertmanager-k8s:
# storage:
# data: "2G" # default: 1G
# opentelemetry-collector-k8s:
# storage:
# persisted: "8G" # default: 1G
# storage-map:
# opentelemetry-collector:
# persisted: "2G"
# opentelemetry-collector-infra:
# persisted: "3G"
loadbalancer:
config:
# Enable the Octavia Amphora VM-based load-balancer backend.
# Requires the microovn-sdn and loadbalancer-amphora feature gates.
amphora_enabled: [ true, false ]
# Glance tag used by Octavia to locate the Amphora VM image.
# An image with this tag must exist in Glance before Octavia can
# create load-balancer instances.
amp_image_tag: octavia-amphora
# If true, Sunbeam downloads the upstream Octavia Amphora image from
# tarballs.opendev.org and uploads it to Glance with amp_image_tag.
# Set to false if you already have a suitable image in Glance.
autocreate_image: [ true, false ]
# If true, Sunbeam creates a dedicated Nova flavor for Amphora VM
# instances automatically. Set to false to supply your own flavor ID.
autocreate_flavor: [ true, false ]
# Nova flavor ID for Amphora VM instances.
# Required only when autocreate_flavor is false.
amp_flavor_id:
# If true, Sunbeam creates the Octavia lb-mgmt network and subnet
# automatically using an IPv6 ULA subnet (fd00:a9fe:a9fe::/64).
# Set to false to supply your own network and subnet IDs.
autocreate_network: [ true, false ]
# Neutron network ID for the Octavia lb-mgmt management network.
# Required only when autocreate_network is false.
lb_mgmt_network_id:
# Neutron subnet ID within the lb-mgmt network.
# Required only when autocreate_network is false.
lb_mgmt_subnet_id:
# If true, Sunbeam creates the Neutron security groups for Amphora VM
# ports automatically. Set to false to supply your own group IDs.
autocreate_securitygroups: [ true, false ]
# List of Neutron security group IDs for Amphora VM ports
# (passed to the Octavia charm as amp-secgroup-list).
# Required only when autocreate_securitygroups is false.
lb_mgmt_secgroup_ids:
-
# Neutron security group ID for the Octavia health manager port
# (lb-health-mgr-sec-grp).
# Required only when autocreate_securitygroups is false.
lb_health_secgroup_id:
# Octavia Amphora TLS certificates, keyed by CSR x500UniqueIdentifier.
# Run 'sunbeam loadbalancer list_outstanding_csrs' to obtain subjects.
# Two entries are required: one for amphora-controller-cert (leaf cert)
# and one for amphora-issuing-ca (CA cert).
certificates:
:
# Base64-encoded signed certificate (PEM).
# For amphora-issuing-ca this must be a CA certificate
# (basicConstraints: CA:TRUE).
certificate:
# Base64-encoded CA certificate that signed the certificate above.
ca_certificate:
# Base64-encoded full CA chain (intermediate + root CAs).
# Leave empty if the CA certificate is self-signed.
ca_chain:
software:
charms:
octavia-k8s:
channel:
revision:
config:
:
multus:
channel:
revision:
openstack-port-cni-k8s:
channel:
revision:
manual-tls-certificates:
channel:
revision:
tls:
ca:
config:
# TLS
certificates:
:
# Base64 encoded certificate for unit CSR Unique ID: subject
certificate:
vault:
config:
# TLS
certificates:
:
# Base64 encoded certificate for unit CSR Unique ID: subject
certificate:
storage:
# Storage is keyed by backend type, then by instance name.
# Current backend types are dellsc, hitachi, and purestorage.
dellsc:
:
config:
san-ip:
san-login:
san-password:
protocol: [ fc, iscsi ]
# Shared storage config fields.
volume-backend-name:
backend-availability-zone:
# Additional Dell Storage Center options also use kebab-case.
# Same structure as core.software.
software: { }
hitachi:
:
config:
hitachi-storage-id:
hitachi-pools: ,,...
san-ip: