About Us
diff --git a/assets/js/0058b4c6.31f85ed2.js b/assets/js/0058b4c6.31f85ed2.js deleted file mode 100644 index fb22626b82..0000000000 --- a/assets/js/0058b4c6.31f85ed2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkosism=self.webpackChunkosism||[]).push([[4088],{6462:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Getting started","href":"/docs/","docId":"index","unlisted":false},{"type":"category","label":"Guides","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Concept Guide","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Components","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Ceph","href":"/docs/guides/concept-guide/components/ceph","docId":"guides/concept-guide/components/ceph","unlisted":false},{"type":"link","label":"Cluster API","href":"/docs/guides/concept-guide/components/clusterapi","docId":"guides/concept-guide/components/clusterapi","unlisted":false},{"type":"link","label":"Gardener","href":"/docs/guides/concept-guide/components/gardener","docId":"guides/concept-guide/components/gardener","unlisted":false},{"type":"link","label":"Ironic","href":"/docs/guides/concept-guide/components/ironic","docId":"guides/concept-guide/components/ironic","unlisted":false},{"type":"link","label":"K3S","href":"/docs/guides/concept-guide/components/k3s","docId":"guides/concept-guide/components/k3s","unlisted":false},{"type":"link","label":"Keycloak","href":"/docs/guides/concept-guide/components/keycloak","docId":"guides/concept-guide/components/keycloak","unlisted":false},{"type":"link","label":"Netdata","href":"/docs/guides/concept-guide/components/netdata","docId":"guides/concept-guide/components/netdata","unlisted":false},{"type":"link","label":"OpenStack","href":"/docs/guides/concept-guide/components/openstack","docId":"guides/concept-guide/components/openstack","unlisted":false},{"type":"link","label":"Prometheus & Grafana","href":"/docs/guides/concept-guide/components/prometheus","docId":"guides/concept-guide/components/prometheus","unlisted":false},{"type":"link","label":"Proxmox VE","href":"/docs/guides/concept-guide/components/proxmox","docId":"guides/concept-guide/components/proxmox","unlisted":false},{"type":"link","label":"SONiC & OVN","href":"/docs/guides/concept-guide/components/sonic","docId":"guides/concept-guide/components/sonic","unlisted":false},{"type":"link","label":"Teleport","href":"/docs/guides/concept-guide/components/teleport","docId":"guides/concept-guide/components/teleport","unlisted":false}],"href":"/docs/guides/concept-guide/components/"},{"type":"link","label":"Layers in a cluster","href":"/docs/guides/concept-guide/layers","docId":"guides/concept-guide/layers","unlisted":false},{"type":"link","label":"Nodes in a cluster","href":"/docs/guides/concept-guide/nodes","docId":"guides/concept-guide/nodes","unlisted":false},{"type":"link","label":"Cluster design","href":"/docs/guides/concept-guide/design","docId":"guides/concept-guide/design","unlisted":false},{"type":"link","label":"Use cases","href":"/docs/guides/concept-guide/use-cases","docId":"guides/concept-guide/use-cases","unlisted":false},{"type":"link","label":"Hardware Bill of Materials","href":"/docs/guides/concept-guide/hardware-bom","docId":"guides/concept-guide/hardware-bom","unlisted":false}],"href":"/docs/guides/concept-guide/"},{"type":"category","label":"Deploy Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Seed","href":"/docs/guides/deploy-guide/seed","docId":"guides/deploy-guide/seed","unlisted":false},{"type":"link","label":"Manager","href":"/docs/guides/deploy-guide/manager","docId":"guides/deploy-guide/manager","unlisted":false},{"type":"link","label":"Provisioning","href":"/docs/guides/deploy-guide/provisioning","docId":"guides/deploy-guide/provisioning","unlisted":false},{"type":"link","label":"Bootstrap","href":"/docs/guides/deploy-guide/bootstrap","docId":"guides/deploy-guide/bootstrap","unlisted":false},{"type":"category","label":"Services","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Infrastructure","href":"/docs/guides/deploy-guide/services/infrastructure","docId":"guides/deploy-guide/services/infrastructure","unlisted":false},{"type":"link","label":"Kubernetes","href":"/docs/guides/deploy-guide/services/kubernetes","docId":"guides/deploy-guide/services/kubernetes","unlisted":false},{"type":"link","label":"Network","href":"/docs/guides/deploy-guide/services/network","docId":"guides/deploy-guide/services/network","unlisted":false},{"type":"link","label":"Logging & Monitoring","href":"/docs/guides/deploy-guide/services/logging-monitoring","docId":"guides/deploy-guide/services/logging-monitoring","unlisted":false},{"type":"link","label":"Ceph","href":"/docs/guides/deploy-guide/services/ceph","docId":"guides/deploy-guide/services/ceph","unlisted":false},{"type":"link","label":"OpenStack","href":"/docs/guides/deploy-guide/services/openstack","docId":"guides/deploy-guide/services/openstack","unlisted":false}],"href":"/docs/guides/deploy-guide/services/"},{"type":"category","label":"Examples","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Cloud in a Box","href":"/docs/guides/deploy-guide/examples/cloud-in-a-box","docId":"guides/deploy-guide/examples/cloud-in-a-box","unlisted":false},{"type":"link","label":"Testbed","href":"/docs/guides/deploy-guide/examples/testbed","docId":"guides/deploy-guide/examples/testbed","unlisted":false}],"href":"/docs/guides/deploy-guide/examples/"}],"href":"/docs/guides/deploy-guide/"},{"type":"category","label":"Upgrade Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Manager","href":"/docs/guides/upgrade-guide/manager","docId":"guides/upgrade-guide/manager","unlisted":false},{"type":"link","label":"Network","href":"/docs/guides/upgrade-guide/network","docId":"guides/upgrade-guide/network","unlisted":false},{"type":"link","label":"Ceph","href":"/docs/guides/upgrade-guide/ceph","docId":"guides/upgrade-guide/ceph","unlisted":false},{"type":"link","label":"Docker","href":"/docs/guides/upgrade-guide/docker","docId":"guides/upgrade-guide/docker","unlisted":false},{"type":"link","label":"Infrastructure","href":"/docs/guides/upgrade-guide/infrastructure","docId":"guides/upgrade-guide/infrastructure","unlisted":false},{"type":"link","label":"Logging & Monitoring","href":"/docs/guides/upgrade-guide/logging-monitoring","docId":"guides/upgrade-guide/logging-monitoring","unlisted":false},{"type":"link","label":"OpenStack","href":"/docs/guides/upgrade-guide/openstack","docId":"guides/upgrade-guide/openstack","unlisted":false}],"href":"/docs/guides/upgrade-guide/"},{"type":"category","label":"Configuration Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Configuration repository","href":"/docs/guides/configuration-guide/configuration-repository","docId":"guides/configuration-guide/configuration-repository","unlisted":false},{"type":"link","label":"Inventory","href":"/docs/guides/configuration-guide/inventory","docId":"guides/configuration-guide/inventory","unlisted":false},{"type":"link","label":"Manager","href":"/docs/guides/configuration-guide/manager","docId":"guides/configuration-guide/manager","unlisted":false},{"type":"link","label":"Network","href":"/docs/guides/configuration-guide/network","docId":"guides/configuration-guide/network","unlisted":false},{"type":"link","label":"Proxy","href":"/docs/guides/configuration-guide/proxy","docId":"guides/configuration-guide/proxy","unlisted":false},{"type":"link","label":"Loadbalancer","href":"/docs/guides/configuration-guide/loadbalancer","docId":"guides/configuration-guide/loadbalancer","unlisted":false},{"type":"link","label":"Ceph","href":"/docs/guides/configuration-guide/ceph","docId":"guides/configuration-guide/ceph","unlisted":false},{"type":"category","label":"OpenStack","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Aodh","href":"/docs/guides/configuration-guide/openstack/aodh","docId":"guides/configuration-guide/openstack/aodh","unlisted":false},{"type":"link","label":"Barbican","href":"/docs/guides/configuration-guide/openstack/barbican","docId":"guides/configuration-guide/openstack/barbican","unlisted":false},{"type":"link","label":"Ceilometer","href":"/docs/guides/configuration-guide/openstack/ceilometer","docId":"guides/configuration-guide/openstack/ceilometer","unlisted":false},{"type":"link","label":"Cinder","href":"/docs/guides/configuration-guide/openstack/cinder","docId":"guides/configuration-guide/openstack/cinder","unlisted":false},{"type":"link","label":"Designate","href":"/docs/guides/configuration-guide/openstack/designate","docId":"guides/configuration-guide/openstack/designate","unlisted":false},{"type":"link","label":"Glance","href":"/docs/guides/configuration-guide/openstack/glance","docId":"guides/configuration-guide/openstack/glance","unlisted":false},{"type":"link","label":"Heat","href":"/docs/guides/configuration-guide/openstack/heat","docId":"guides/configuration-guide/openstack/heat","unlisted":false},{"type":"link","label":"Horizon","href":"/docs/guides/configuration-guide/openstack/horizon","docId":"guides/configuration-guide/openstack/horizon","unlisted":false},{"type":"link","label":"Ironic","href":"/docs/guides/configuration-guide/openstack/ironic","docId":"guides/configuration-guide/openstack/ironic","unlisted":false},{"type":"link","label":"Keystone","href":"/docs/guides/configuration-guide/openstack/keystone","docId":"guides/configuration-guide/openstack/keystone","unlisted":false},{"type":"link","label":"Magnum","href":"/docs/guides/configuration-guide/openstack/magnum","docId":"guides/configuration-guide/openstack/magnum","unlisted":false},{"type":"link","label":"Manila","href":"/docs/guides/configuration-guide/openstack/manila","docId":"guides/configuration-guide/openstack/manila","unlisted":false},{"type":"link","label":"Neutron","href":"/docs/guides/configuration-guide/openstack/neutron","docId":"guides/configuration-guide/openstack/neutron","unlisted":false},{"type":"link","label":"Nova","href":"/docs/guides/configuration-guide/openstack/nova","docId":"guides/configuration-guide/openstack/nova","unlisted":false},{"type":"link","label":"Octavia","href":"/docs/guides/configuration-guide/openstack/octavia","docId":"guides/configuration-guide/openstack/octavia","unlisted":false},{"type":"link","label":"Placement","href":"/docs/guides/configuration-guide/openstack/placement","docId":"guides/configuration-guide/openstack/placement","unlisted":false},{"type":"link","label":"Skyline","href":"/docs/guides/configuration-guide/openstack/skyline","docId":"guides/configuration-guide/openstack/skyline","unlisted":false}],"href":"/docs/guides/configuration-guide/openstack/"},{"type":"category","label":"Commons","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Certificates","href":"/docs/guides/configuration-guide/commons/certificates","docId":"guides/configuration-guide/commons/certificates","unlisted":false},{"type":"link","label":"Packages","href":"/docs/guides/configuration-guide/commons/packages","docId":"guides/configuration-guide/commons/packages","unlisted":false},{"type":"link","label":"Resolvconf","href":"/docs/guides/configuration-guide/commons/resolvconf","docId":"guides/configuration-guide/commons/resolvconf","unlisted":false},{"type":"link","label":"Services","href":"/docs/guides/configuration-guide/commons/services","docId":"guides/configuration-guide/commons/services","unlisted":false},{"type":"link","label":"SSH Config","href":"/docs/guides/configuration-guide/commons/sshconfig","docId":"guides/configuration-guide/commons/sshconfig","unlisted":false},{"type":"link","label":"Sysctl","href":"/docs/guides/configuration-guide/commons/sysctl","docId":"guides/configuration-guide/commons/sysctl","unlisted":false},{"type":"link","label":"Timezone","href":"/docs/guides/configuration-guide/commons/timezone","docId":"guides/configuration-guide/commons/timezone","unlisted":false},{"type":"link","label":"User","href":"/docs/guides/configuration-guide/commons/user","docId":"guides/configuration-guide/commons/user","unlisted":false}],"href":"/docs/guides/configuration-guide/commons/"},{"type":"category","label":"Services","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Chrony","href":"/docs/guides/configuration-guide/services/chrony","docId":"guides/configuration-guide/services/chrony","unlisted":false},{"type":"link","label":"Docker","href":"/docs/guides/configuration-guide/services/docker","docId":"guides/configuration-guide/services/docker","unlisted":false},{"type":"link","label":"Tuned","href":"/docs/guides/configuration-guide/services/tuned","docId":"guides/configuration-guide/services/tuned","unlisted":false}],"href":"/docs/guides/configuration-guide/services/"},{"type":"link","label":"Validations","href":"/docs/guides/configuration-guide/validations/","docId":"guides/configuration-guide/validations/index","unlisted":false}],"href":"/docs/guides/configuration-guide/"},{"type":"category","label":"Operations Guide","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Manager","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Apply","href":"/docs/guides/operations-guide/manager/apply","docId":"guides/operations-guide/manager/apply","unlisted":false},{"type":"link","label":"Console","href":"/docs/guides/operations-guide/manager/console","docId":"guides/operations-guide/manager/console","unlisted":false},{"type":"link","label":"Get","href":"/docs/guides/operations-guide/manager/get","docId":"guides/operations-guide/manager/get","unlisted":false},{"type":"link","label":"Logging","href":"/docs/guides/operations-guide/manager/log","docId":"guides/operations-guide/manager/log","unlisted":false},{"type":"link","label":"Task","href":"/docs/guides/operations-guide/manager/task","docId":"guides/operations-guide/manager/task","unlisted":false}],"href":"/docs/guides/operations-guide/manager/"},{"type":"link","label":"Ceph","href":"/docs/guides/operations-guide/ceph","docId":"guides/operations-guide/ceph","unlisted":false},{"type":"link","label":"Infrastructure","href":"/docs/guides/operations-guide/infrastructure","docId":"guides/operations-guide/infrastructure","unlisted":false},{"type":"link","label":"Network","href":"/docs/guides/operations-guide/network","docId":"guides/operations-guide/network","unlisted":false},{"type":"category","label":"OpenStack","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Tools","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Image Manager","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Automated updates","href":"/docs/guides/operations-guide/openstack/tools/image-manager/update","docId":"guides/operations-guide/openstack/tools/image-manager/update","unlisted":false}],"href":"/docs/guides/operations-guide/openstack/tools/image-manager/"},{"type":"link","label":"Flavor Manager","href":"/docs/guides/operations-guide/openstack/tools/flavor-manager","docId":"guides/operations-guide/openstack/tools/flavor-manager","unlisted":false},{"type":"link","label":"Resource Manager","href":"/docs/guides/operations-guide/openstack/tools/resource-manager","docId":"guides/operations-guide/openstack/tools/resource-manager","unlisted":false},{"type":"link","label":"Project Manager","href":"/docs/guides/operations-guide/openstack/tools/project-manager","docId":"guides/operations-guide/openstack/tools/project-manager","unlisted":false},{"type":"link","label":"Sandbox Manager","href":"/docs/guides/operations-guide/openstack/tools/sandbox-manager","docId":"guides/operations-guide/openstack/tools/sandbox-manager","unlisted":false},{"type":"link","label":"Simple Stress","href":"/docs/guides/operations-guide/openstack/tools/simple-stress","docId":"guides/operations-guide/openstack/tools/simple-stress","unlisted":false},{"type":"link","label":"OpenStack Health Monitor","href":"/docs/guides/operations-guide/openstack/tools/openstack-health-monitor","docId":"guides/operations-guide/openstack/tools/openstack-health-monitor","unlisted":false}],"href":"/docs/guides/operations-guide/openstack/tools/"},{"type":"link","label":"Cinder","href":"/docs/guides/operations-guide/openstack/cinder","docId":"guides/operations-guide/openstack/cinder","unlisted":false},{"type":"link","label":"Keystone","href":"/docs/guides/operations-guide/openstack/keystone","docId":"guides/operations-guide/openstack/keystone","unlisted":false},{"type":"link","label":"Neutron","href":"/docs/guides/operations-guide/openstack/neutron","docId":"guides/operations-guide/openstack/neutron","unlisted":false},{"type":"link","label":"Nova","href":"/docs/guides/operations-guide/openstack/nova","docId":"guides/operations-guide/openstack/nova","unlisted":false},{"type":"link","label":"Octavia","href":"/docs/guides/operations-guide/openstack/octavia","docId":"guides/operations-guide/openstack/octavia","unlisted":false}],"href":"/docs/guides/operations-guide/openstack/"}],"href":"/docs/guides/operations-guide/"},{"type":"category","label":"Troubleshooting Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Manager","href":"/docs/guides/troubleshooting-guide/manager","docId":"guides/troubleshooting-guide/manager","unlisted":false},{"type":"link","label":"OpenStack","href":"/docs/guides/troubleshooting-guide/openstack","docId":"guides/troubleshooting-guide/openstack","unlisted":false},{"type":"link","label":"Ceph","href":"/docs/guides/troubleshooting-guide/ceph","docId":"guides/troubleshooting-guide/ceph","unlisted":false}],"href":"/docs/guides/troubleshooting-guide/"},{"type":"category","label":"User Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Migrate from VMware ESXi to OpenStack","href":"/docs/guides/user-guide/migration-vmware-esix","docId":"guides/user-guide/migration-vmware-esix","unlisted":false},{"type":"category","label":"OpenStack","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Client","href":"/docs/guides/user-guide/openstack/openstackclient","docId":"guides/user-guide/openstack/openstackclient","unlisted":false},{"type":"link","label":"Security groups","href":"/docs/guides/user-guide/openstack/security-groups","docId":"guides/user-guide/openstack/security-groups","unlisted":false},{"type":"link","label":"User Data Backups","href":"/docs/guides/user-guide/openstack/user-data-backups","docId":"guides/user-guide/openstack/user-data-backups","unlisted":false}],"href":"/docs/guides/user-guide/openstack/"}],"href":"/docs/guides/user-guide/"},{"type":"category","label":"Other Guides","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Cloud in a Box Guide","href":"/docs/guides/other-guides/cloud-in-a-box","docId":"guides/other-guides/cloud-in-a-box","unlisted":false},{"type":"link","label":"Contributor Guide","href":"/docs/guides/other-guides/contributor-guide","docId":"guides/other-guides/contributor-guide","unlisted":false},{"type":"category","label":"Developer Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Releases","href":"/docs/guides/other-guides/developer-guide/releases","docId":"guides/other-guides/developer-guide/releases","unlisted":false},{"type":"link","label":"Scripts","href":"/docs/guides/other-guides/developer-guide/scripts","docId":"guides/other-guides/developer-guide/scripts","unlisted":false},{"type":"link","label":"Zuul CI","href":"/docs/guides/other-guides/developer-guide/zuul","docId":"guides/other-guides/developer-guide/zuul","unlisted":false}],"href":"/docs/guides/other-guides/developer-guide/"},{"type":"link","label":"Style Guide","href":"/docs/guides/other-guides/style-guide","docId":"guides/other-guides/style-guide","unlisted":false},{"type":"link","label":"Testbed Guide","href":"/docs/guides/other-guides/testbed","docId":"guides/other-guides/testbed","unlisted":false}],"href":"/docs/guides/other-guides/"}],"href":"/docs/guides/"},{"type":"category","label":"References","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Command line interface reference","href":"/docs/references/cli","docId":"references/cli","unlisted":false},{"type":"link","label":"Configuration reference","href":"/docs/references/configuration","docId":"references/configuration","unlisted":false},{"type":"link","label":"Parameters reference","href":"/docs/references/parameters","docId":"references/parameters","unlisted":false}],"href":"/docs/references/"},{"type":"category","label":"Release Notes","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"OSISM 7","href":"/docs/release-notes/osism-7","docId":"release-notes/osism-7","unlisted":false}],"href":"/docs/release-notes/"},{"type":"category","label":"Appendix","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Comparisons","href":"/docs/appendix/comparisons","docId":"appendix/comparisons","unlisted":false},{"type":"link","label":"Glossary","href":"/docs/appendix/glossary","docId":"appendix/glossary","unlisted":false},{"type":"link","label":"Networks","href":"/docs/appendix/networks","docId":"appendix/networks","unlisted":false},{"type":"link","label":"Standards","href":"/docs/appendix/standards","docId":"appendix/standards","unlisted":false}],"href":"/docs/appendix/"}]},"docs":{"appendix/comparisons":{"id":"appendix/comparisons","title":"Comparisons","description":"OSISM vs. FishOS","sidebar":"tutorialSidebar"},"appendix/glossary":{"id":"appendix/glossary","title":"Glossary","description":"\ud83d\udca1 This section serves as the central glossary within OSISM. It is intended to clearly define","sidebar":"tutorialSidebar"},"appendix/index":{"id":"appendix/index","title":"Appendix","description":"","sidebar":"tutorialSidebar"},"appendix/networks":{"id":"appendix/networks","title":"Networks","description":"| Parameter | CIDR |","sidebar":"tutorialSidebar"},"appendix/standards":{"id":"appendix/standards","title":"Standards","description":"| Name | OSISM Documentation | SCS Standard Track | SCS Standard | SCS Documentation |","sidebar":"tutorialSidebar"},"guides/concept-guide/components/ceph":{"id":"guides/concept-guide/components/ceph","title":"Ceph","description":"Ceph is an Open Source software defined storage platform designed to provide highly scalable","sidebar":"tutorialSidebar"},"guides/concept-guide/components/clusterapi":{"id":"guides/concept-guide/components/clusterapi","title":"Cluster API","description":"Kubernetes as a Service (KaaS) is a cloud service model that simplifies the deployment,","sidebar":"tutorialSidebar"},"guides/concept-guide/components/gardener":{"id":"guides/concept-guide/components/gardener","title":"Gardener","description":"Kubernetes as a Service (KaaS) simplifies the deployment, management, and scaling of","sidebar":"tutorialSidebar"},"guides/concept-guide/components/index":{"id":"guides/concept-guide/components/index","title":"Components","description":"* Infrastructure as a Service (IaaS) with OpenStack","sidebar":"tutorialSidebar"},"guides/concept-guide/components/ironic":{"id":"guides/concept-guide/components/ironic","title":"Ironic","description":"OpenStack Ironic is a project that provides Baremetal as a Service (BMaaS), enabling the","sidebar":"tutorialSidebar"},"guides/concept-guide/components/k3s":{"id":"guides/concept-guide/components/k3s","title":"K3S","description":"Lifecycle Management of K3S in OSISM","sidebar":"tutorialSidebar"},"guides/concept-guide/components/keycloak":{"id":"guides/concept-guide/components/keycloak","title":"Keycloak","description":"Lifecycle Management of Keycloak in OSISM","sidebar":"tutorialSidebar"},"guides/concept-guide/components/netdata":{"id":"guides/concept-guide/components/netdata","title":"Netdata","description":"Lifecycle Management of Netdata in OSISM","sidebar":"tutorialSidebar"},"guides/concept-guide/components/openstack":{"id":"guides/concept-guide/components/openstack","title":"OpenStack","description":"Lifecycle Management of OpenStack in OSISM","sidebar":"tutorialSidebar"},"guides/concept-guide/components/prometheus":{"id":"guides/concept-guide/components/prometheus","title":"Prometheus & Grafana","description":"Lifecycle Management of Prometheus in OSISM","sidebar":"tutorialSidebar"},"guides/concept-guide/components/proxmox":{"id":"guides/concept-guide/components/proxmox","title":"Proxmox VE","description":"Proxmox Virtual Environment (Proxmox VE) is an open-source server virtualization management","sidebar":"tutorialSidebar"},"guides/concept-guide/components/sonic":{"id":"guides/concept-guide/components/sonic","title":"SONiC & OVN","description":"Lifecycle Management of SONiC in OSISM","sidebar":"tutorialSidebar"},"guides/concept-guide/components/teleport":{"id":"guides/concept-guide/components/teleport","title":"Teleport","description":"Lifecycle Management of Teleport in OSISM","sidebar":"tutorialSidebar"},"guides/concept-guide/design":{"id":"guides/concept-guide/design","title":"Cluster design","description":"Parts of this chapter are based on the OpenStack Architecture Design Guide.","sidebar":"tutorialSidebar"},"guides/concept-guide/hardware-bom":{"id":"guides/concept-guide/hardware-bom","title":"Hardware Bill of Materials","description":"The brands, models and configurations listed are examples. There is no","sidebar":"tutorialSidebar"},"guides/concept-guide/index":{"id":"guides/concept-guide/index","title":"Concept Guide","description":"Highlevel Overview","sidebar":"tutorialSidebar"},"guides/concept-guide/layers":{"id":"guides/concept-guide/layers","title":"Layers in a cluster","description":"Compute Plane","sidebar":"tutorialSidebar"},"guides/concept-guide/nodes":{"id":"guides/concept-guide/nodes","title":"Nodes in a cluster","description":"Compute Node","sidebar":"tutorialSidebar"},"guides/concept-guide/use-cases":{"id":"guides/concept-guide/use-cases","title":"Use cases","description":"Hyper-converged infrastructure (HCI)","sidebar":"tutorialSidebar"},"guides/configuration-guide/ceph":{"id":"guides/configuration-guide/ceph","title":"Ceph","description":"The official Ceph documentation is located on https://docs.ceph.com/en/latest/rados/configuration/","sidebar":"tutorialSidebar"},"guides/configuration-guide/commons/certificates":{"id":"guides/configuration-guide/commons/certificates","title":"Certificates","description":"With the osism.commons.certificates role, it is possible to add custom CA certificates","sidebar":"tutorialSidebar"},"guides/configuration-guide/commons/index":{"id":"guides/configuration-guide/commons/index","title":"Commons","description":"This section contains the documentation of the Ansible collection osism.commons.","sidebar":"tutorialSidebar"},"guides/configuration-guide/commons/packages":{"id":"guides/configuration-guide/commons/packages","title":"Packages","description":"With the osism.commons.packages role, it is possible to add packages on a node","sidebar":"tutorialSidebar"},"guides/configuration-guide/commons/resolvconf":{"id":"guides/configuration-guide/commons/resolvconf","title":"Resolvconf","description":"With the osism.commons.resolvconf role, it is possible to manage the used DNS servers on a node.","sidebar":"tutorialSidebar"},"guides/configuration-guide/commons/services":{"id":"guides/configuration-guide/commons/services","title":"Services","description":"With the osism.commons.services role, it is possible to manage services on a node","sidebar":"tutorialSidebar"},"guides/configuration-guide/commons/sshconfig":{"id":"guides/configuration-guide/commons/sshconfig","title":"SSH Config","description":"With the osism.commons.sshconfig role, it is possible to manage a SSH config","sidebar":"tutorialSidebar"},"guides/configuration-guide/commons/sysctl":{"id":"guides/configuration-guide/commons/sysctl","title":"Sysctl","description":"With the osism.commons.sysctl role, it is possible to manage the attributes of the kernel","sidebar":"tutorialSidebar"},"guides/configuration-guide/commons/timezone":{"id":"guides/configuration-guide/commons/timezone","title":"Timezone","description":"With the osism.commons.timezone role, it is possible to manage the used timezone on a node.","sidebar":"tutorialSidebar"},"guides/configuration-guide/commons/user":{"id":"guides/configuration-guide/commons/user","title":"User","description":"With the osism.commons.user role, it is possible to manage additional","sidebar":"tutorialSidebar"},"guides/configuration-guide/configuration-repository":{"id":"guides/configuration-guide/configuration-repository","title":"Configuration Repository","description":"The configuration required for an OSISM managed cluster is stored in a single Git","sidebar":"tutorialSidebar"},"guides/configuration-guide/index":{"id":"guides/configuration-guide/index","title":"Configuration Guide","description":"","sidebar":"tutorialSidebar"},"guides/configuration-guide/inventory":{"id":"guides/configuration-guide/inventory","title":"Inventory","description":"The inventory used for the environment is located in the inventory directory.","sidebar":"tutorialSidebar"},"guides/configuration-guide/loadbalancer":{"id":"guides/configuration-guide/loadbalancer","title":"Loadbalancer","description":"IP addresses & FQDNs","sidebar":"tutorialSidebar"},"guides/configuration-guide/manager":{"id":"guides/configuration-guide/manager","title":"Manager","description":"Stable release","sidebar":"tutorialSidebar"},"guides/configuration-guide/network":{"id":"guides/configuration-guide/network","title":"Network","description":"Netplan","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/aodh":{"id":"guides/configuration-guide/openstack/aodh","title":"Aodh","description":"* Aodh admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/barbican":{"id":"guides/configuration-guide/openstack/barbican","title":"Barbican","description":"* Barbican admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/ceilometer":{"id":"guides/configuration-guide/openstack/ceilometer","title":"Ceilometer","description":"* Ceilometer admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/cinder":{"id":"guides/configuration-guide/openstack/cinder","title":"Cinder","description":"* Cinder admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/designate":{"id":"guides/configuration-guide/openstack/designate","title":"Designate","description":"* Designate admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/glance":{"id":"guides/configuration-guide/openstack/glance","title":"Glance","description":"* Glance admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/heat":{"id":"guides/configuration-guide/openstack/heat","title":"Heat","description":"* Heat admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/horizon":{"id":"guides/configuration-guide/openstack/horizon","title":"Horizon","description":"* Horizon admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/index":{"id":"guides/configuration-guide/openstack/index","title":"OpenStack","description":"Image tags","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/ironic":{"id":"guides/configuration-guide/openstack/ironic","title":"Ironic","description":"* Ironic admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/keystone":{"id":"guides/configuration-guide/openstack/keystone","title":"Keystone","description":"* Keystone admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/magnum":{"id":"guides/configuration-guide/openstack/magnum","title":"Magnum","description":"* Magnum admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/manila":{"id":"guides/configuration-guide/openstack/manila","title":"Manila","description":"* Manila admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/neutron":{"id":"guides/configuration-guide/openstack/neutron","title":"Neutron","description":"* Neutron admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/nova":{"id":"guides/configuration-guide/openstack/nova","title":"Nova","description":"* Nova admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/octavia":{"id":"guides/configuration-guide/openstack/octavia","title":"Octavia","description":"* Octavia admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/placement":{"id":"guides/configuration-guide/openstack/placement","title":"Placement","description":"* Placement admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/skyline":{"id":"guides/configuration-guide/openstack/skyline","title":"Skyline","description":"Skyline APIServer","sidebar":"tutorialSidebar"},"guides/configuration-guide/proxy":{"id":"guides/configuration-guide/proxy","title":"Proxy","description":"In the following examples, it is assumed that the Squid proxy integrated by OSISM","sidebar":"tutorialSidebar"},"guides/configuration-guide/services/chrony":{"id":"guides/configuration-guide/services/chrony","title":"Chrony","description":"With the osism.services.chrony role, it is possible to manage the used NTP servers on a node.","sidebar":"tutorialSidebar"},"guides/configuration-guide/services/docker":{"id":"guides/configuration-guide/services/docker","title":"Docker","description":"With the osism.services.docker role, it is possible to manage Docker.","sidebar":"tutorialSidebar"},"guides/configuration-guide/services/index":{"id":"guides/configuration-guide/services/index","title":"Services","description":"This section contains the documentation of the Ansible collection","sidebar":"tutorialSidebar"},"guides/configuration-guide/services/tuned":{"id":"guides/configuration-guide/services/tuned","title":"Tuned","description":"The roller can be applied with osism apply tuned. The role is applied to all","sidebar":"tutorialSidebar"},"guides/configuration-guide/validations/index":{"id":"guides/configuration-guide/validations/index","title":"Validations","description":"This section contains the documentation of the Ansible collection","sidebar":"tutorialSidebar"},"guides/deploy-guide/bootstrap":{"id":"guides/deploy-guide/bootstrap","title":"Bootstrap","description":"The prerequisite for bootstraping the nodes of a cluster the Manager node has to be","sidebar":"tutorialSidebar"},"guides/deploy-guide/examples/cloud-in-a-box":{"id":"guides/deploy-guide/examples/cloud-in-a-box","title":"Cloud in a Box","description":"This section has moved. You can now find the content in the","sidebar":"tutorialSidebar"},"guides/deploy-guide/examples/index":{"id":"guides/deploy-guide/examples/index","title":"Examples","description":"","sidebar":"tutorialSidebar"},"guides/deploy-guide/examples/testbed":{"id":"guides/deploy-guide/examples/testbed","title":"Testbed","description":"This section has moved. You can now find the content in the","sidebar":"tutorialSidebar"},"guides/deploy-guide/index":{"id":"guides/deploy-guide/index","title":"Deploy Guide","description":"OSISM is deployed in a series of successive steps. The steps are documented in the Deploy Guide.","sidebar":"tutorialSidebar"},"guides/deploy-guide/manager":{"id":"guides/deploy-guide/manager","title":"Manager","description":"The prerequisite for deploying the Manager node is a Seed node. What a Seed node is","sidebar":"tutorialSidebar"},"guides/deploy-guide/provisioning":{"id":"guides/deploy-guide/provisioning","title":"Provisioning of bare-metal nodes","description":"For the initial deployment of the management plane and the control plane of OSISM,","sidebar":"tutorialSidebar"},"guides/deploy-guide/seed":{"id":"guides/deploy-guide/seed","title":"Seed","description":"The prerequisite for the deployment of a cluster is a configuration repository.","sidebar":"tutorialSidebar"},"guides/deploy-guide/services/ceph":{"id":"guides/deploy-guide/services/ceph","title":"Ceph","description":"In OSISM it is also possible to integrate and use existing Ceph clusters. It","sidebar":"tutorialSidebar"},"guides/deploy-guide/services/index":{"id":"guides/deploy-guide/services/index","title":"Services","description":"The prerequisite for depoying the services of a cluster is the bootstrap of","sidebar":"tutorialSidebar"},"guides/deploy-guide/services/infrastructure":{"id":"guides/deploy-guide/services/infrastructure","title":"Infrastructure","description":"Common issues with deploying infrastructure services required by OpenStack","sidebar":"tutorialSidebar"},"guides/deploy-guide/services/kubernetes":{"id":"guides/deploy-guide/services/kubernetes","title":"Kubernetes","description":"As of OSISM 7, it is possible to create a Kubernetes cluster on all nodes.","sidebar":"tutorialSidebar"},"guides/deploy-guide/services/logging-monitoring":{"id":"guides/deploy-guide/services/logging-monitoring","title":"Logging & Monitoring","description":"Common issues with deploying logging & monitoring services provided by Kolla","sidebar":"tutorialSidebar"},"guides/deploy-guide/services/network":{"id":"guides/deploy-guide/services/network","title":"Network","description":"1. Open vSwitch (OVS)","sidebar":"tutorialSidebar"},"guides/deploy-guide/services/openstack":{"id":"guides/deploy-guide/services/openstack","title":"OpenStack","description":"Common issues with deploying OpenStack services are documented in the","sidebar":"tutorialSidebar"},"guides/index":{"id":"guides/index","title":"Guides","description":"* The Concept Guide explains which components and modules make up OSISM. It also","sidebar":"tutorialSidebar"},"guides/operations-guide/ceph":{"id":"guides/operations-guide/ceph","title":"Ceph","description":"Where to find docs","sidebar":"tutorialSidebar"},"guides/operations-guide/index":{"id":"guides/operations-guide/index","title":"Operations Guide","description":"Change Node states","sidebar":"tutorialSidebar"},"guides/operations-guide/infrastructure":{"id":"guides/operations-guide/infrastructure","title":"Infrastructure","description":"Loadbalancer","sidebar":"tutorialSidebar"},"guides/operations-guide/manager/apply":{"id":"guides/operations-guide/manager/apply","title":"Apply","description":"List all available plays","sidebar":"tutorialSidebar"},"guides/operations-guide/manager/console":{"id":"guides/operations-guide/manager/console","title":"Console","description":"A console command is available in the OSISM CLI. This allows specific parts of the","sidebar":"tutorialSidebar"},"guides/operations-guide/manager/get":{"id":"guides/operations-guide/manager/get","title":"Get","description":"A get command is available in the OSISM CLI. This allows to gather specific information.","sidebar":"tutorialSidebar"},"guides/operations-guide/manager/index":{"id":"guides/operations-guide/manager/index","title":"Manager","description":"OSISM orchestrator","sidebar":"tutorialSidebar"},"guides/operations-guide/manager/log":{"id":"guides/operations-guide/manager/log","title":"Logging","description":"Ansible","sidebar":"tutorialSidebar"},"guides/operations-guide/manager/task":{"id":"guides/operations-guide/manager/task","title":"Task","description":"List","sidebar":"tutorialSidebar"},"guides/operations-guide/network":{"id":"guides/operations-guide/network","title":"Network","description":"OpenStack, OVN, and Open vSwitch all really like UUIDs.","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/cinder":{"id":"guides/operations-guide/openstack/cinder","title":"Cinder","description":"Remove service","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/index":{"id":"guides/operations-guide/openstack/index","title":"OpenStack","description":"Create an external network","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/keystone":{"id":"guides/operations-guide/openstack/keystone","title":"Keystone","description":"* List all users of a project who have been assigned the member role","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/neutron":{"id":"guides/operations-guide/openstack/neutron","title":"Neutron","description":"Quality of Service (QoS)","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/nova":{"id":"guides/operations-guide/openstack/nova","title":"Nova","description":"Get all servers on a node","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/octavia":{"id":"guides/operations-guide/openstack/octavia","title":"Octavia","description":"Cleanup of amphorae missing from the DB","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/tools/flavor-manager":{"id":"guides/operations-guide/openstack/tools/flavor-manager","title":"Flavor Manager","description":"Overview","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/tools/image-manager/index":{"id":"guides/operations-guide/openstack/tools/image-manager/index","title":"Image Manager","description":"The OpenStack Image Manager is a tool for managing all","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/tools/image-manager/update":{"id":"guides/operations-guide/openstack/tools/image-manager/update","title":"Image Manager update.py","description":"Overview","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/tools/index":{"id":"guides/operations-guide/openstack/tools/index","title":"Tools","description":"","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/tools/openstack-health-monitor":{"id":"guides/operations-guide/openstack/tools/openstack-health-monitor","title":"Setting up OpenStack health monitor on Debian","description":"Kurt Garloff, 2024-02-20","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/tools/project-manager":{"id":"guides/operations-guide/openstack/tools/project-manager","title":"Project Manager","description":"Overview","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/tools/resource-manager":{"id":"guides/operations-guide/openstack/tools/resource-manager","title":"Resource Manager","description":"Preparations","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/tools/sandbox-manager":{"id":"guides/operations-guide/openstack/tools/sandbox-manager","title":"Sandbox Manager","description":"","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/tools/simple-stress":{"id":"guides/operations-guide/openstack/tools/simple-stress","title":"Simple Stress","description":"Overview","sidebar":"tutorialSidebar"},"guides/other-guides/cloud-in-a-box":{"id":"guides/other-guides/cloud-in-a-box","title":"Cloud in a Box - CiaB","description":"\ud83d\udca1 Cloud in a Box (CiaB) is a minimalistic installation of the latest stable OSISM release with only services which are needed to","sidebar":"tutorialSidebar"},"guides/other-guides/contributor-guide":{"id":"guides/other-guides/contributor-guide","title":"Contributor Guide","description":"We welcome any issues, change requests or general feedback. Do not hestiate to open an issue.","sidebar":"tutorialSidebar"},"guides/other-guides/developer-guide/index":{"id":"guides/other-guides/developer-guide/index","title":"Developer Guide","description":"How to add a new service","sidebar":"tutorialSidebar"},"guides/other-guides/developer-guide/releases":{"id":"guides/other-guides/developer-guide/releases","title":"Releases","description":"How we handle releases","sidebar":"tutorialSidebar"},"guides/other-guides/developer-guide/scripts":{"id":"guides/other-guides/developer-guide/scripts","title":"Scripts","description":"Scripts are included in container images to simplify development work and to enable","sidebar":"tutorialSidebar"},"guides/other-guides/developer-guide/zuul":{"id":"guides/other-guides/developer-guide/zuul","title":"Zuul CI","description":"We use Zuul CI as a CI service for OSISM. The service is not required for","sidebar":"tutorialSidebar"},"guides/other-guides/index":{"id":"guides/other-guides/index","title":"Other Guides","description":"","sidebar":"tutorialSidebar"},"guides/other-guides/style-guide":{"id":"guides/other-guides/style-guide","title":"Style Guide","description":"Ansible","sidebar":"tutorialSidebar"},"guides/other-guides/testbed":{"id":"guides/other-guides/testbed","title":"Testbed","description":"With the OSISM Testbed, it is possible to run a full Sovereign Cloud Stack","sidebar":"tutorialSidebar"},"guides/troubleshooting-guide/ceph":{"id":"guides/troubleshooting-guide/ceph","title":"Ceph","description":"Where to find docs","sidebar":"tutorialSidebar"},"guides/troubleshooting-guide/index":{"id":"guides/troubleshooting-guide/index","title":"Troubleshooting Guide","description":"\ud83d\udca1 The Troubleshooting Guide describe how to solve issues.","sidebar":"tutorialSidebar"},"guides/troubleshooting-guide/manager":{"id":"guides/troubleshooting-guide/manager","title":"Manager","description":"Reset","sidebar":"tutorialSidebar"},"guides/troubleshooting-guide/openstack":{"id":"guides/troubleshooting-guide/openstack","title":"OpenStack","description":"Database creation fails","sidebar":"tutorialSidebar"},"guides/upgrade-guide/ceph":{"id":"guides/upgrade-guide/ceph","title":"Ceph","description":"","sidebar":"tutorialSidebar"},"guides/upgrade-guide/docker":{"id":"guides/upgrade-guide/docker","title":"Docker","description":"The Docker version used is defined via the parameter docker_version in the file","sidebar":"tutorialSidebar"},"guides/upgrade-guide/index":{"id":"guides/upgrade-guide/index","title":"Upgrade Guide","description":"In the examples, the pull of images (if supported by a role) is always run first. While","sidebar":"tutorialSidebar"},"guides/upgrade-guide/infrastructure":{"id":"guides/upgrade-guide/infrastructure","title":"Infrastructure","description":"1. Kubernetes","sidebar":"tutorialSidebar"},"guides/upgrade-guide/logging-monitoring":{"id":"guides/upgrade-guide/logging-monitoring","title":"Logging & Monitoring","description":"1. OpenSearch","sidebar":"tutorialSidebar"},"guides/upgrade-guide/manager":{"id":"guides/upgrade-guide/manager","title":"Manager","description":"Always read the release notes first to learn what has changed and what","sidebar":"tutorialSidebar"},"guides/upgrade-guide/network":{"id":"guides/upgrade-guide/network","title":"Network","description":"1. Open vSwitch (OVS)","sidebar":"tutorialSidebar"},"guides/upgrade-guide/openstack":{"id":"guides/upgrade-guide/openstack","title":"OpenStack","description":"When upgrade the different OpenStack services, all containers must be","sidebar":"tutorialSidebar"},"guides/user-guide/index":{"id":"guides/user-guide/index","title":"User Guide","description":"","sidebar":"tutorialSidebar"},"guides/user-guide/migration-vmware-esix":{"id":"guides/user-guide/migration-vmware-esix","title":"Migrate from VMware ESXi to OpenStack","description":"This guide is an example of how to perform a manual migration from a VMware ESXi host to OpenStack.","sidebar":"tutorialSidebar"},"guides/user-guide/openstack/index":{"id":"guides/user-guide/openstack/index","title":"OpenStack","description":"","sidebar":"tutorialSidebar"},"guides/user-guide/openstack/openstackclient":{"id":"guides/user-guide/openstack/openstackclient","title":"Client","description":"OpenStackClient looks for a clouds.yaml configuration file in the following locations:","sidebar":"tutorialSidebar"},"guides/user-guide/openstack/security-groups":{"id":"guides/user-guide/openstack/security-groups","title":"How to configure and use security groups","description":"Security groups in OpenStack are part of the network security mechanisms provided for the users.","sidebar":"tutorialSidebar"},"guides/user-guide/openstack/user-data-backups":{"id":"guides/user-guide/openstack/user-data-backups","title":"User Data Backups","description":"This guide will explain common procedures for creating and restoring backups of user data accumulated in cloud resources such as volumes, images or ephemeral server disks.","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Getting started","description":"OSISM is a solution for the holistic management of sustainable, sovereign","sidebar":"tutorialSidebar"},"references/cli":{"id":"references/cli","title":"Command line interface reference","description":"","sidebar":"tutorialSidebar"},"references/configuration":{"id":"references/configuration","title":"Configuration reference","description":"","sidebar":"tutorialSidebar"},"references/index":{"id":"references/index","title":"References","description":"","sidebar":"tutorialSidebar"},"references/parameters":{"id":"references/parameters","title":"Parameters reference","description":"","sidebar":"tutorialSidebar"},"release-notes/index":{"id":"release-notes/index","title":"Release Notes","description":"The old release notes (before OSISM 7) can be found on the archived page","sidebar":"tutorialSidebar"},"release-notes/osism-7":{"id":"release-notes/osism-7","title":"OSISM 7","description":"Instructions for the upgrade can be found in the Upgrade Guide.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/0058b4c6.607ef452.js b/assets/js/0058b4c6.607ef452.js new file mode 100644 index 0000000000..e2f4f4a97a --- /dev/null +++ b/assets/js/0058b4c6.607ef452.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkosism=self.webpackChunkosism||[]).push([[4088],{6462:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Getting started","href":"/docs/","docId":"index","unlisted":false},{"type":"category","label":"Guides","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Concept Guide","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Components","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Ceph","href":"/docs/guides/concept-guide/components/ceph","docId":"guides/concept-guide/components/ceph","unlisted":false},{"type":"link","label":"Cluster API","href":"/docs/guides/concept-guide/components/clusterapi","docId":"guides/concept-guide/components/clusterapi","unlisted":false},{"type":"link","label":"Gardener","href":"/docs/guides/concept-guide/components/gardener","docId":"guides/concept-guide/components/gardener","unlisted":false},{"type":"link","label":"Ironic","href":"/docs/guides/concept-guide/components/ironic","docId":"guides/concept-guide/components/ironic","unlisted":false},{"type":"link","label":"K3S","href":"/docs/guides/concept-guide/components/k3s","docId":"guides/concept-guide/components/k3s","unlisted":false},{"type":"link","label":"Keycloak","href":"/docs/guides/concept-guide/components/keycloak","docId":"guides/concept-guide/components/keycloak","unlisted":false},{"type":"link","label":"Netdata","href":"/docs/guides/concept-guide/components/netdata","docId":"guides/concept-guide/components/netdata","unlisted":false},{"type":"link","label":"OpenStack","href":"/docs/guides/concept-guide/components/openstack","docId":"guides/concept-guide/components/openstack","unlisted":false},{"type":"link","label":"Prometheus & Grafana","href":"/docs/guides/concept-guide/components/prometheus","docId":"guides/concept-guide/components/prometheus","unlisted":false},{"type":"link","label":"Proxmox VE","href":"/docs/guides/concept-guide/components/proxmox","docId":"guides/concept-guide/components/proxmox","unlisted":false},{"type":"link","label":"SONiC & OVN","href":"/docs/guides/concept-guide/components/sonic","docId":"guides/concept-guide/components/sonic","unlisted":false},{"type":"link","label":"Teleport","href":"/docs/guides/concept-guide/components/teleport","docId":"guides/concept-guide/components/teleport","unlisted":false}],"href":"/docs/guides/concept-guide/components/"},{"type":"link","label":"Layers in a cluster","href":"/docs/guides/concept-guide/layers","docId":"guides/concept-guide/layers","unlisted":false},{"type":"link","label":"Nodes in a cluster","href":"/docs/guides/concept-guide/nodes","docId":"guides/concept-guide/nodes","unlisted":false},{"type":"link","label":"Cluster design","href":"/docs/guides/concept-guide/design","docId":"guides/concept-guide/design","unlisted":false},{"type":"link","label":"Use cases","href":"/docs/guides/concept-guide/use-cases","docId":"guides/concept-guide/use-cases","unlisted":false},{"type":"link","label":"Hardware Bill of Materials","href":"/docs/guides/concept-guide/hardware-bom","docId":"guides/concept-guide/hardware-bom","unlisted":false}],"href":"/docs/guides/concept-guide/"},{"type":"category","label":"Deploy Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Seed","href":"/docs/guides/deploy-guide/seed","docId":"guides/deploy-guide/seed","unlisted":false},{"type":"link","label":"Manager","href":"/docs/guides/deploy-guide/manager","docId":"guides/deploy-guide/manager","unlisted":false},{"type":"link","label":"Provisioning","href":"/docs/guides/deploy-guide/provisioning","docId":"guides/deploy-guide/provisioning","unlisted":false},{"type":"link","label":"Bootstrap","href":"/docs/guides/deploy-guide/bootstrap","docId":"guides/deploy-guide/bootstrap","unlisted":false},{"type":"category","label":"Services","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Infrastructure","href":"/docs/guides/deploy-guide/services/infrastructure","docId":"guides/deploy-guide/services/infrastructure","unlisted":false},{"type":"link","label":"Kubernetes","href":"/docs/guides/deploy-guide/services/kubernetes","docId":"guides/deploy-guide/services/kubernetes","unlisted":false},{"type":"link","label":"Network","href":"/docs/guides/deploy-guide/services/network","docId":"guides/deploy-guide/services/network","unlisted":false},{"type":"link","label":"Logging & Monitoring","href":"/docs/guides/deploy-guide/services/logging-monitoring","docId":"guides/deploy-guide/services/logging-monitoring","unlisted":false},{"type":"link","label":"Ceph","href":"/docs/guides/deploy-guide/services/ceph","docId":"guides/deploy-guide/services/ceph","unlisted":false},{"type":"link","label":"Ceph via Rook (technical preview)","href":"/docs/guides/deploy-guide/services/rook","docId":"guides/deploy-guide/services/rook","unlisted":false},{"type":"link","label":"OpenStack","href":"/docs/guides/deploy-guide/services/openstack","docId":"guides/deploy-guide/services/openstack","unlisted":false}],"href":"/docs/guides/deploy-guide/services/"},{"type":"category","label":"Examples","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Cloud in a Box","href":"/docs/guides/deploy-guide/examples/cloud-in-a-box","docId":"guides/deploy-guide/examples/cloud-in-a-box","unlisted":false},{"type":"link","label":"Testbed","href":"/docs/guides/deploy-guide/examples/testbed","docId":"guides/deploy-guide/examples/testbed","unlisted":false}],"href":"/docs/guides/deploy-guide/examples/"}],"href":"/docs/guides/deploy-guide/"},{"type":"category","label":"Upgrade Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Manager","href":"/docs/guides/upgrade-guide/manager","docId":"guides/upgrade-guide/manager","unlisted":false},{"type":"link","label":"Network","href":"/docs/guides/upgrade-guide/network","docId":"guides/upgrade-guide/network","unlisted":false},{"type":"link","label":"Ceph","href":"/docs/guides/upgrade-guide/ceph","docId":"guides/upgrade-guide/ceph","unlisted":false},{"type":"link","label":"Docker","href":"/docs/guides/upgrade-guide/docker","docId":"guides/upgrade-guide/docker","unlisted":false},{"type":"link","label":"Infrastructure","href":"/docs/guides/upgrade-guide/infrastructure","docId":"guides/upgrade-guide/infrastructure","unlisted":false},{"type":"link","label":"Logging & Monitoring","href":"/docs/guides/upgrade-guide/logging-monitoring","docId":"guides/upgrade-guide/logging-monitoring","unlisted":false},{"type":"link","label":"OpenStack","href":"/docs/guides/upgrade-guide/openstack","docId":"guides/upgrade-guide/openstack","unlisted":false}],"href":"/docs/guides/upgrade-guide/"},{"type":"category","label":"Configuration Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Configuration repository","href":"/docs/guides/configuration-guide/configuration-repository","docId":"guides/configuration-guide/configuration-repository","unlisted":false},{"type":"link","label":"Inventory","href":"/docs/guides/configuration-guide/inventory","docId":"guides/configuration-guide/inventory","unlisted":false},{"type":"link","label":"Manager","href":"/docs/guides/configuration-guide/manager","docId":"guides/configuration-guide/manager","unlisted":false},{"type":"link","label":"Network","href":"/docs/guides/configuration-guide/network","docId":"guides/configuration-guide/network","unlisted":false},{"type":"link","label":"Proxy","href":"/docs/guides/configuration-guide/proxy","docId":"guides/configuration-guide/proxy","unlisted":false},{"type":"link","label":"Loadbalancer","href":"/docs/guides/configuration-guide/loadbalancer","docId":"guides/configuration-guide/loadbalancer","unlisted":false},{"type":"link","label":"Ceph","href":"/docs/guides/configuration-guide/ceph","docId":"guides/configuration-guide/ceph","unlisted":false},{"type":"category","label":"OpenStack","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Aodh","href":"/docs/guides/configuration-guide/openstack/aodh","docId":"guides/configuration-guide/openstack/aodh","unlisted":false},{"type":"link","label":"Barbican","href":"/docs/guides/configuration-guide/openstack/barbican","docId":"guides/configuration-guide/openstack/barbican","unlisted":false},{"type":"link","label":"Ceilometer","href":"/docs/guides/configuration-guide/openstack/ceilometer","docId":"guides/configuration-guide/openstack/ceilometer","unlisted":false},{"type":"link","label":"Cinder","href":"/docs/guides/configuration-guide/openstack/cinder","docId":"guides/configuration-guide/openstack/cinder","unlisted":false},{"type":"link","label":"Designate","href":"/docs/guides/configuration-guide/openstack/designate","docId":"guides/configuration-guide/openstack/designate","unlisted":false},{"type":"link","label":"Glance","href":"/docs/guides/configuration-guide/openstack/glance","docId":"guides/configuration-guide/openstack/glance","unlisted":false},{"type":"link","label":"Heat","href":"/docs/guides/configuration-guide/openstack/heat","docId":"guides/configuration-guide/openstack/heat","unlisted":false},{"type":"link","label":"Horizon","href":"/docs/guides/configuration-guide/openstack/horizon","docId":"guides/configuration-guide/openstack/horizon","unlisted":false},{"type":"link","label":"Ironic","href":"/docs/guides/configuration-guide/openstack/ironic","docId":"guides/configuration-guide/openstack/ironic","unlisted":false},{"type":"link","label":"Keystone","href":"/docs/guides/configuration-guide/openstack/keystone","docId":"guides/configuration-guide/openstack/keystone","unlisted":false},{"type":"link","label":"Magnum","href":"/docs/guides/configuration-guide/openstack/magnum","docId":"guides/configuration-guide/openstack/magnum","unlisted":false},{"type":"link","label":"Manila","href":"/docs/guides/configuration-guide/openstack/manila","docId":"guides/configuration-guide/openstack/manila","unlisted":false},{"type":"link","label":"Neutron","href":"/docs/guides/configuration-guide/openstack/neutron","docId":"guides/configuration-guide/openstack/neutron","unlisted":false},{"type":"link","label":"Nova","href":"/docs/guides/configuration-guide/openstack/nova","docId":"guides/configuration-guide/openstack/nova","unlisted":false},{"type":"link","label":"Octavia","href":"/docs/guides/configuration-guide/openstack/octavia","docId":"guides/configuration-guide/openstack/octavia","unlisted":false},{"type":"link","label":"Placement","href":"/docs/guides/configuration-guide/openstack/placement","docId":"guides/configuration-guide/openstack/placement","unlisted":false},{"type":"link","label":"Skyline","href":"/docs/guides/configuration-guide/openstack/skyline","docId":"guides/configuration-guide/openstack/skyline","unlisted":false}],"href":"/docs/guides/configuration-guide/openstack/"},{"type":"link","label":"Ceph via Rook (technical preview)","href":"/docs/guides/configuration-guide/rook","docId":"guides/configuration-guide/rook","unlisted":false},{"type":"category","label":"Commons","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Certificates","href":"/docs/guides/configuration-guide/commons/certificates","docId":"guides/configuration-guide/commons/certificates","unlisted":false},{"type":"link","label":"Packages","href":"/docs/guides/configuration-guide/commons/packages","docId":"guides/configuration-guide/commons/packages","unlisted":false},{"type":"link","label":"Resolvconf","href":"/docs/guides/configuration-guide/commons/resolvconf","docId":"guides/configuration-guide/commons/resolvconf","unlisted":false},{"type":"link","label":"Services","href":"/docs/guides/configuration-guide/commons/services","docId":"guides/configuration-guide/commons/services","unlisted":false},{"type":"link","label":"SSH Config","href":"/docs/guides/configuration-guide/commons/sshconfig","docId":"guides/configuration-guide/commons/sshconfig","unlisted":false},{"type":"link","label":"Sysctl","href":"/docs/guides/configuration-guide/commons/sysctl","docId":"guides/configuration-guide/commons/sysctl","unlisted":false},{"type":"link","label":"Timezone","href":"/docs/guides/configuration-guide/commons/timezone","docId":"guides/configuration-guide/commons/timezone","unlisted":false},{"type":"link","label":"User","href":"/docs/guides/configuration-guide/commons/user","docId":"guides/configuration-guide/commons/user","unlisted":false}],"href":"/docs/guides/configuration-guide/commons/"},{"type":"category","label":"Services","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Chrony","href":"/docs/guides/configuration-guide/services/chrony","docId":"guides/configuration-guide/services/chrony","unlisted":false},{"type":"link","label":"Docker","href":"/docs/guides/configuration-guide/services/docker","docId":"guides/configuration-guide/services/docker","unlisted":false},{"type":"link","label":"Tuned","href":"/docs/guides/configuration-guide/services/tuned","docId":"guides/configuration-guide/services/tuned","unlisted":false}],"href":"/docs/guides/configuration-guide/services/"},{"type":"link","label":"Validations","href":"/docs/guides/configuration-guide/validations/","docId":"guides/configuration-guide/validations/index","unlisted":false}],"href":"/docs/guides/configuration-guide/"},{"type":"category","label":"Operations Guide","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Manager","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Apply","href":"/docs/guides/operations-guide/manager/apply","docId":"guides/operations-guide/manager/apply","unlisted":false},{"type":"link","label":"Console","href":"/docs/guides/operations-guide/manager/console","docId":"guides/operations-guide/manager/console","unlisted":false},{"type":"link","label":"Get","href":"/docs/guides/operations-guide/manager/get","docId":"guides/operations-guide/manager/get","unlisted":false},{"type":"link","label":"Logging","href":"/docs/guides/operations-guide/manager/log","docId":"guides/operations-guide/manager/log","unlisted":false},{"type":"link","label":"Task","href":"/docs/guides/operations-guide/manager/task","docId":"guides/operations-guide/manager/task","unlisted":false}],"href":"/docs/guides/operations-guide/manager/"},{"type":"link","label":"Ceph","href":"/docs/guides/operations-guide/ceph","docId":"guides/operations-guide/ceph","unlisted":false},{"type":"link","label":"Infrastructure","href":"/docs/guides/operations-guide/infrastructure","docId":"guides/operations-guide/infrastructure","unlisted":false},{"type":"link","label":"Network","href":"/docs/guides/operations-guide/network","docId":"guides/operations-guide/network","unlisted":false},{"type":"category","label":"OpenStack","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Tools","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Image Manager","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Automated updates","href":"/docs/guides/operations-guide/openstack/tools/image-manager/update","docId":"guides/operations-guide/openstack/tools/image-manager/update","unlisted":false}],"href":"/docs/guides/operations-guide/openstack/tools/image-manager/"},{"type":"link","label":"Flavor Manager","href":"/docs/guides/operations-guide/openstack/tools/flavor-manager","docId":"guides/operations-guide/openstack/tools/flavor-manager","unlisted":false},{"type":"link","label":"Resource Manager","href":"/docs/guides/operations-guide/openstack/tools/resource-manager","docId":"guides/operations-guide/openstack/tools/resource-manager","unlisted":false},{"type":"link","label":"Project Manager","href":"/docs/guides/operations-guide/openstack/tools/project-manager","docId":"guides/operations-guide/openstack/tools/project-manager","unlisted":false},{"type":"link","label":"Sandbox Manager","href":"/docs/guides/operations-guide/openstack/tools/sandbox-manager","docId":"guides/operations-guide/openstack/tools/sandbox-manager","unlisted":false},{"type":"link","label":"Simple Stress","href":"/docs/guides/operations-guide/openstack/tools/simple-stress","docId":"guides/operations-guide/openstack/tools/simple-stress","unlisted":false},{"type":"link","label":"OpenStack Health Monitor","href":"/docs/guides/operations-guide/openstack/tools/openstack-health-monitor","docId":"guides/operations-guide/openstack/tools/openstack-health-monitor","unlisted":false}],"href":"/docs/guides/operations-guide/openstack/tools/"},{"type":"link","label":"Cinder","href":"/docs/guides/operations-guide/openstack/cinder","docId":"guides/operations-guide/openstack/cinder","unlisted":false},{"type":"link","label":"Keystone","href":"/docs/guides/operations-guide/openstack/keystone","docId":"guides/operations-guide/openstack/keystone","unlisted":false},{"type":"link","label":"Neutron","href":"/docs/guides/operations-guide/openstack/neutron","docId":"guides/operations-guide/openstack/neutron","unlisted":false},{"type":"link","label":"Nova","href":"/docs/guides/operations-guide/openstack/nova","docId":"guides/operations-guide/openstack/nova","unlisted":false},{"type":"link","label":"Octavia","href":"/docs/guides/operations-guide/openstack/octavia","docId":"guides/operations-guide/openstack/octavia","unlisted":false}],"href":"/docs/guides/operations-guide/openstack/"},{"type":"link","label":"Ceph via Rook (technical preview)","href":"/docs/guides/operations-guide/rook","docId":"guides/operations-guide/rook","unlisted":false}],"href":"/docs/guides/operations-guide/"},{"type":"category","label":"Troubleshooting Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Manager","href":"/docs/guides/troubleshooting-guide/manager","docId":"guides/troubleshooting-guide/manager","unlisted":false},{"type":"link","label":"OpenStack","href":"/docs/guides/troubleshooting-guide/openstack","docId":"guides/troubleshooting-guide/openstack","unlisted":false},{"type":"link","label":"Ceph","href":"/docs/guides/troubleshooting-guide/ceph","docId":"guides/troubleshooting-guide/ceph","unlisted":false}],"href":"/docs/guides/troubleshooting-guide/"},{"type":"category","label":"User Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Migrate from VMware ESXi to OpenStack","href":"/docs/guides/user-guide/migration-vmware-esix","docId":"guides/user-guide/migration-vmware-esix","unlisted":false},{"type":"category","label":"OpenStack","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Client","href":"/docs/guides/user-guide/openstack/openstackclient","docId":"guides/user-guide/openstack/openstackclient","unlisted":false},{"type":"link","label":"Security groups","href":"/docs/guides/user-guide/openstack/security-groups","docId":"guides/user-guide/openstack/security-groups","unlisted":false},{"type":"link","label":"User Data Backups","href":"/docs/guides/user-guide/openstack/user-data-backups","docId":"guides/user-guide/openstack/user-data-backups","unlisted":false}],"href":"/docs/guides/user-guide/openstack/"}],"href":"/docs/guides/user-guide/"},{"type":"category","label":"Other Guides","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Cloud in a Box Guide","href":"/docs/guides/other-guides/cloud-in-a-box","docId":"guides/other-guides/cloud-in-a-box","unlisted":false},{"type":"link","label":"Contributor Guide","href":"/docs/guides/other-guides/contributor-guide","docId":"guides/other-guides/contributor-guide","unlisted":false},{"type":"category","label":"Developer Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Releases","href":"/docs/guides/other-guides/developer-guide/releases","docId":"guides/other-guides/developer-guide/releases","unlisted":false},{"type":"link","label":"Scripts","href":"/docs/guides/other-guides/developer-guide/scripts","docId":"guides/other-guides/developer-guide/scripts","unlisted":false},{"type":"link","label":"Zuul CI","href":"/docs/guides/other-guides/developer-guide/zuul","docId":"guides/other-guides/developer-guide/zuul","unlisted":false}],"href":"/docs/guides/other-guides/developer-guide/"},{"type":"link","label":"Style Guide","href":"/docs/guides/other-guides/style-guide","docId":"guides/other-guides/style-guide","unlisted":false},{"type":"link","label":"Testbed Guide","href":"/docs/guides/other-guides/testbed","docId":"guides/other-guides/testbed","unlisted":false}],"href":"/docs/guides/other-guides/"}],"href":"/docs/guides/"},{"type":"category","label":"References","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Command line interface reference","href":"/docs/references/cli","docId":"references/cli","unlisted":false},{"type":"link","label":"Configuration reference","href":"/docs/references/configuration","docId":"references/configuration","unlisted":false},{"type":"link","label":"Parameters reference","href":"/docs/references/parameters","docId":"references/parameters","unlisted":false}],"href":"/docs/references/"},{"type":"category","label":"Release Notes","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"OSISM 7","href":"/docs/release-notes/osism-7","docId":"release-notes/osism-7","unlisted":false}],"href":"/docs/release-notes/"},{"type":"category","label":"Appendix","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Comparisons","href":"/docs/appendix/comparisons","docId":"appendix/comparisons","unlisted":false},{"type":"link","label":"Glossary","href":"/docs/appendix/glossary","docId":"appendix/glossary","unlisted":false},{"type":"link","label":"Networks","href":"/docs/appendix/networks","docId":"appendix/networks","unlisted":false},{"type":"link","label":"Standards","href":"/docs/appendix/standards","docId":"appendix/standards","unlisted":false}],"href":"/docs/appendix/"}]},"docs":{"appendix/comparisons":{"id":"appendix/comparisons","title":"Comparisons","description":"OSISM vs. FishOS","sidebar":"tutorialSidebar"},"appendix/glossary":{"id":"appendix/glossary","title":"Glossary","description":"\ud83d\udca1 This section serves as the central glossary within OSISM. It is intended to clearly define","sidebar":"tutorialSidebar"},"appendix/index":{"id":"appendix/index","title":"Appendix","description":"","sidebar":"tutorialSidebar"},"appendix/networks":{"id":"appendix/networks","title":"Networks","description":"| Parameter | CIDR |","sidebar":"tutorialSidebar"},"appendix/standards":{"id":"appendix/standards","title":"Standards","description":"| Name | OSISM Documentation | SCS Standard Track | SCS Standard | SCS Documentation |","sidebar":"tutorialSidebar"},"guides/concept-guide/components/ceph":{"id":"guides/concept-guide/components/ceph","title":"Ceph","description":"Ceph is an Open Source software defined storage platform designed to provide highly scalable","sidebar":"tutorialSidebar"},"guides/concept-guide/components/clusterapi":{"id":"guides/concept-guide/components/clusterapi","title":"Cluster API","description":"Kubernetes as a Service (KaaS) is a cloud service model that simplifies the deployment,","sidebar":"tutorialSidebar"},"guides/concept-guide/components/gardener":{"id":"guides/concept-guide/components/gardener","title":"Gardener","description":"Kubernetes as a Service (KaaS) simplifies the deployment, management, and scaling of","sidebar":"tutorialSidebar"},"guides/concept-guide/components/index":{"id":"guides/concept-guide/components/index","title":"Components","description":"* Infrastructure as a Service (IaaS) with OpenStack","sidebar":"tutorialSidebar"},"guides/concept-guide/components/ironic":{"id":"guides/concept-guide/components/ironic","title":"Ironic","description":"OpenStack Ironic is a project that provides Baremetal as a Service (BMaaS), enabling the","sidebar":"tutorialSidebar"},"guides/concept-guide/components/k3s":{"id":"guides/concept-guide/components/k3s","title":"K3S","description":"Lifecycle Management of K3S in OSISM","sidebar":"tutorialSidebar"},"guides/concept-guide/components/keycloak":{"id":"guides/concept-guide/components/keycloak","title":"Keycloak","description":"Lifecycle Management of Keycloak in OSISM","sidebar":"tutorialSidebar"},"guides/concept-guide/components/netdata":{"id":"guides/concept-guide/components/netdata","title":"Netdata","description":"Lifecycle Management of Netdata in OSISM","sidebar":"tutorialSidebar"},"guides/concept-guide/components/openstack":{"id":"guides/concept-guide/components/openstack","title":"OpenStack","description":"Lifecycle Management of OpenStack in OSISM","sidebar":"tutorialSidebar"},"guides/concept-guide/components/prometheus":{"id":"guides/concept-guide/components/prometheus","title":"Prometheus & Grafana","description":"Lifecycle Management of Prometheus in OSISM","sidebar":"tutorialSidebar"},"guides/concept-guide/components/proxmox":{"id":"guides/concept-guide/components/proxmox","title":"Proxmox VE","description":"Proxmox Virtual Environment (Proxmox VE) is an open-source server virtualization management","sidebar":"tutorialSidebar"},"guides/concept-guide/components/sonic":{"id":"guides/concept-guide/components/sonic","title":"SONiC & OVN","description":"Lifecycle Management of SONiC in OSISM","sidebar":"tutorialSidebar"},"guides/concept-guide/components/teleport":{"id":"guides/concept-guide/components/teleport","title":"Teleport","description":"Lifecycle Management of Teleport in OSISM","sidebar":"tutorialSidebar"},"guides/concept-guide/design":{"id":"guides/concept-guide/design","title":"Cluster design","description":"Parts of this chapter are based on the OpenStack Architecture Design Guide.","sidebar":"tutorialSidebar"},"guides/concept-guide/hardware-bom":{"id":"guides/concept-guide/hardware-bom","title":"Hardware Bill of Materials","description":"The brands, models and configurations listed are examples. There is no","sidebar":"tutorialSidebar"},"guides/concept-guide/index":{"id":"guides/concept-guide/index","title":"Concept Guide","description":"Highlevel Overview","sidebar":"tutorialSidebar"},"guides/concept-guide/layers":{"id":"guides/concept-guide/layers","title":"Layers in a cluster","description":"Compute Plane","sidebar":"tutorialSidebar"},"guides/concept-guide/nodes":{"id":"guides/concept-guide/nodes","title":"Nodes in a cluster","description":"Compute Node","sidebar":"tutorialSidebar"},"guides/concept-guide/use-cases":{"id":"guides/concept-guide/use-cases","title":"Use cases","description":"Hyper-converged infrastructure (HCI)","sidebar":"tutorialSidebar"},"guides/configuration-guide/ceph":{"id":"guides/configuration-guide/ceph","title":"Ceph","description":"The official Ceph documentation is located on https://docs.ceph.com/en/latest/rados/configuration/","sidebar":"tutorialSidebar"},"guides/configuration-guide/commons/certificates":{"id":"guides/configuration-guide/commons/certificates","title":"Certificates","description":"With the osism.commons.certificates role, it is possible to add custom CA certificates","sidebar":"tutorialSidebar"},"guides/configuration-guide/commons/index":{"id":"guides/configuration-guide/commons/index","title":"Commons","description":"This section contains the documentation of the Ansible collection osism.commons.","sidebar":"tutorialSidebar"},"guides/configuration-guide/commons/packages":{"id":"guides/configuration-guide/commons/packages","title":"Packages","description":"With the osism.commons.packages role, it is possible to add packages on a node","sidebar":"tutorialSidebar"},"guides/configuration-guide/commons/resolvconf":{"id":"guides/configuration-guide/commons/resolvconf","title":"Resolvconf","description":"With the osism.commons.resolvconf role, it is possible to manage the used DNS servers on a node.","sidebar":"tutorialSidebar"},"guides/configuration-guide/commons/services":{"id":"guides/configuration-guide/commons/services","title":"Services","description":"With the osism.commons.services role, it is possible to manage services on a node","sidebar":"tutorialSidebar"},"guides/configuration-guide/commons/sshconfig":{"id":"guides/configuration-guide/commons/sshconfig","title":"SSH Config","description":"With the osism.commons.sshconfig role, it is possible to manage a SSH config","sidebar":"tutorialSidebar"},"guides/configuration-guide/commons/sysctl":{"id":"guides/configuration-guide/commons/sysctl","title":"Sysctl","description":"With the osism.commons.sysctl role, it is possible to manage the attributes of the kernel","sidebar":"tutorialSidebar"},"guides/configuration-guide/commons/timezone":{"id":"guides/configuration-guide/commons/timezone","title":"Timezone","description":"With the osism.commons.timezone role, it is possible to manage the used timezone on a node.","sidebar":"tutorialSidebar"},"guides/configuration-guide/commons/user":{"id":"guides/configuration-guide/commons/user","title":"User","description":"With the osism.commons.user role, it is possible to manage additional","sidebar":"tutorialSidebar"},"guides/configuration-guide/configuration-repository":{"id":"guides/configuration-guide/configuration-repository","title":"Configuration Repository","description":"The configuration required for an OSISM managed cluster is stored in a single Git","sidebar":"tutorialSidebar"},"guides/configuration-guide/index":{"id":"guides/configuration-guide/index","title":"Configuration Guide","description":"","sidebar":"tutorialSidebar"},"guides/configuration-guide/inventory":{"id":"guides/configuration-guide/inventory","title":"Inventory","description":"The inventory used for the environment is located in the inventory directory.","sidebar":"tutorialSidebar"},"guides/configuration-guide/loadbalancer":{"id":"guides/configuration-guide/loadbalancer","title":"Loadbalancer","description":"IP addresses & FQDNs","sidebar":"tutorialSidebar"},"guides/configuration-guide/manager":{"id":"guides/configuration-guide/manager","title":"Manager","description":"Stable release","sidebar":"tutorialSidebar"},"guides/configuration-guide/network":{"id":"guides/configuration-guide/network","title":"Network","description":"Netplan","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/aodh":{"id":"guides/configuration-guide/openstack/aodh","title":"Aodh","description":"* Aodh admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/barbican":{"id":"guides/configuration-guide/openstack/barbican","title":"Barbican","description":"* Barbican admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/ceilometer":{"id":"guides/configuration-guide/openstack/ceilometer","title":"Ceilometer","description":"* Ceilometer admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/cinder":{"id":"guides/configuration-guide/openstack/cinder","title":"Cinder","description":"* Cinder admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/designate":{"id":"guides/configuration-guide/openstack/designate","title":"Designate","description":"* Designate admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/glance":{"id":"guides/configuration-guide/openstack/glance","title":"Glance","description":"* Glance admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/heat":{"id":"guides/configuration-guide/openstack/heat","title":"Heat","description":"* Heat admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/horizon":{"id":"guides/configuration-guide/openstack/horizon","title":"Horizon","description":"* Horizon admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/index":{"id":"guides/configuration-guide/openstack/index","title":"OpenStack","description":"Image tags","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/ironic":{"id":"guides/configuration-guide/openstack/ironic","title":"Ironic","description":"* Ironic admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/keystone":{"id":"guides/configuration-guide/openstack/keystone","title":"Keystone","description":"* Keystone admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/magnum":{"id":"guides/configuration-guide/openstack/magnum","title":"Magnum","description":"* Magnum admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/manila":{"id":"guides/configuration-guide/openstack/manila","title":"Manila","description":"* Manila admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/neutron":{"id":"guides/configuration-guide/openstack/neutron","title":"Neutron","description":"* Neutron admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/nova":{"id":"guides/configuration-guide/openstack/nova","title":"Nova","description":"* Nova admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/octavia":{"id":"guides/configuration-guide/openstack/octavia","title":"Octavia","description":"* Octavia admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/placement":{"id":"guides/configuration-guide/openstack/placement","title":"Placement","description":"* Placement admin guide","sidebar":"tutorialSidebar"},"guides/configuration-guide/openstack/skyline":{"id":"guides/configuration-guide/openstack/skyline","title":"Skyline","description":"Skyline APIServer","sidebar":"tutorialSidebar"},"guides/configuration-guide/proxy":{"id":"guides/configuration-guide/proxy","title":"Proxy","description":"In the following examples, it is assumed that the Squid proxy integrated by OSISM","sidebar":"tutorialSidebar"},"guides/configuration-guide/rook":{"id":"guides/configuration-guide/rook","title":"Ceph via Rook (technical preview)","description":"The official Ceph documentation is located on https://docs.ceph.com/en/latest/rados/configuration/","sidebar":"tutorialSidebar"},"guides/configuration-guide/services/chrony":{"id":"guides/configuration-guide/services/chrony","title":"Chrony","description":"With the osism.services.chrony role, it is possible to manage the used NTP servers on a node.","sidebar":"tutorialSidebar"},"guides/configuration-guide/services/docker":{"id":"guides/configuration-guide/services/docker","title":"Docker","description":"With the osism.services.docker role, it is possible to manage Docker.","sidebar":"tutorialSidebar"},"guides/configuration-guide/services/index":{"id":"guides/configuration-guide/services/index","title":"Services","description":"This section contains the documentation of the Ansible collection","sidebar":"tutorialSidebar"},"guides/configuration-guide/services/tuned":{"id":"guides/configuration-guide/services/tuned","title":"Tuned","description":"The roller can be applied with osism apply tuned. The role is applied to all","sidebar":"tutorialSidebar"},"guides/configuration-guide/validations/index":{"id":"guides/configuration-guide/validations/index","title":"Validations","description":"This section contains the documentation of the Ansible collection","sidebar":"tutorialSidebar"},"guides/deploy-guide/bootstrap":{"id":"guides/deploy-guide/bootstrap","title":"Bootstrap","description":"The prerequisite for bootstraping the nodes of a cluster the Manager node has to be","sidebar":"tutorialSidebar"},"guides/deploy-guide/examples/cloud-in-a-box":{"id":"guides/deploy-guide/examples/cloud-in-a-box","title":"Cloud in a Box","description":"This section has moved. You can now find the content in the","sidebar":"tutorialSidebar"},"guides/deploy-guide/examples/index":{"id":"guides/deploy-guide/examples/index","title":"Examples","description":"","sidebar":"tutorialSidebar"},"guides/deploy-guide/examples/testbed":{"id":"guides/deploy-guide/examples/testbed","title":"Testbed","description":"This section has moved. You can now find the content in the","sidebar":"tutorialSidebar"},"guides/deploy-guide/index":{"id":"guides/deploy-guide/index","title":"Deploy Guide","description":"OSISM is deployed in a series of successive steps. The steps are documented in the Deploy Guide.","sidebar":"tutorialSidebar"},"guides/deploy-guide/manager":{"id":"guides/deploy-guide/manager","title":"Manager","description":"The prerequisite for deploying the Manager node is a Seed node. What a Seed node is","sidebar":"tutorialSidebar"},"guides/deploy-guide/provisioning":{"id":"guides/deploy-guide/provisioning","title":"Provisioning of bare-metal nodes","description":"For the initial deployment of the management plane and the control plane of OSISM,","sidebar":"tutorialSidebar"},"guides/deploy-guide/seed":{"id":"guides/deploy-guide/seed","title":"Seed","description":"The prerequisite for the deployment of a cluster is a configuration repository.","sidebar":"tutorialSidebar"},"guides/deploy-guide/services/ceph":{"id":"guides/deploy-guide/services/ceph","title":"Ceph","description":"In OSISM it is also possible to integrate and use existing Ceph clusters. It","sidebar":"tutorialSidebar"},"guides/deploy-guide/services/index":{"id":"guides/deploy-guide/services/index","title":"Services","description":"The prerequisite for depoying the services of a cluster is the bootstrap of","sidebar":"tutorialSidebar"},"guides/deploy-guide/services/infrastructure":{"id":"guides/deploy-guide/services/infrastructure","title":"Infrastructure","description":"Common issues with deploying infrastructure services required by OpenStack","sidebar":"tutorialSidebar"},"guides/deploy-guide/services/kubernetes":{"id":"guides/deploy-guide/services/kubernetes","title":"Kubernetes","description":"As of OSISM 7, it is possible to create a Kubernetes cluster on all nodes.","sidebar":"tutorialSidebar"},"guides/deploy-guide/services/logging-monitoring":{"id":"guides/deploy-guide/services/logging-monitoring","title":"Logging & Monitoring","description":"Common issues with deploying logging & monitoring services provided by Kolla","sidebar":"tutorialSidebar"},"guides/deploy-guide/services/network":{"id":"guides/deploy-guide/services/network","title":"Network","description":"1. Open vSwitch (OVS)","sidebar":"tutorialSidebar"},"guides/deploy-guide/services/openstack":{"id":"guides/deploy-guide/services/openstack","title":"OpenStack","description":"Common issues with deploying OpenStack services are documented in the","sidebar":"tutorialSidebar"},"guides/deploy-guide/services/rook":{"id":"guides/deploy-guide/services/rook","title":"Ceph via Rook (technical preview)","description":"This is a technical preview and not recommended for production use yet.","sidebar":"tutorialSidebar"},"guides/index":{"id":"guides/index","title":"Guides","description":"* The Concept Guide explains which components and modules make up OSISM. It also","sidebar":"tutorialSidebar"},"guides/operations-guide/ceph":{"id":"guides/operations-guide/ceph","title":"Ceph","description":"Where to find docs","sidebar":"tutorialSidebar"},"guides/operations-guide/index":{"id":"guides/operations-guide/index","title":"Operations Guide","description":"Change Node states","sidebar":"tutorialSidebar"},"guides/operations-guide/infrastructure":{"id":"guides/operations-guide/infrastructure","title":"Infrastructure","description":"Loadbalancer","sidebar":"tutorialSidebar"},"guides/operations-guide/manager/apply":{"id":"guides/operations-guide/manager/apply","title":"Apply","description":"List all available plays","sidebar":"tutorialSidebar"},"guides/operations-guide/manager/console":{"id":"guides/operations-guide/manager/console","title":"Console","description":"A console command is available in the OSISM CLI. This allows specific parts of the","sidebar":"tutorialSidebar"},"guides/operations-guide/manager/get":{"id":"guides/operations-guide/manager/get","title":"Get","description":"A get command is available in the OSISM CLI. This allows to gather specific information.","sidebar":"tutorialSidebar"},"guides/operations-guide/manager/index":{"id":"guides/operations-guide/manager/index","title":"Manager","description":"OSISM orchestrator","sidebar":"tutorialSidebar"},"guides/operations-guide/manager/log":{"id":"guides/operations-guide/manager/log","title":"Logging","description":"Ansible","sidebar":"tutorialSidebar"},"guides/operations-guide/manager/task":{"id":"guides/operations-guide/manager/task","title":"Task","description":"List","sidebar":"tutorialSidebar"},"guides/operations-guide/network":{"id":"guides/operations-guide/network","title":"Network","description":"OpenStack, OVN, and Open vSwitch all really like UUIDs.","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/cinder":{"id":"guides/operations-guide/openstack/cinder","title":"Cinder","description":"Remove service","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/index":{"id":"guides/operations-guide/openstack/index","title":"OpenStack","description":"Create an external network","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/keystone":{"id":"guides/operations-guide/openstack/keystone","title":"Keystone","description":"* List all users of a project who have been assigned the member role","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/neutron":{"id":"guides/operations-guide/openstack/neutron","title":"Neutron","description":"Quality of Service (QoS)","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/nova":{"id":"guides/operations-guide/openstack/nova","title":"Nova","description":"Get all servers on a node","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/octavia":{"id":"guides/operations-guide/openstack/octavia","title":"Octavia","description":"Cleanup of amphorae missing from the DB","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/tools/flavor-manager":{"id":"guides/operations-guide/openstack/tools/flavor-manager","title":"Flavor Manager","description":"Overview","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/tools/image-manager/index":{"id":"guides/operations-guide/openstack/tools/image-manager/index","title":"Image Manager","description":"The OpenStack Image Manager is a tool for managing all","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/tools/image-manager/update":{"id":"guides/operations-guide/openstack/tools/image-manager/update","title":"Image Manager update.py","description":"Overview","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/tools/index":{"id":"guides/operations-guide/openstack/tools/index","title":"Tools","description":"","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/tools/openstack-health-monitor":{"id":"guides/operations-guide/openstack/tools/openstack-health-monitor","title":"Setting up OpenStack health monitor on Debian","description":"Kurt Garloff, 2024-02-20","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/tools/project-manager":{"id":"guides/operations-guide/openstack/tools/project-manager","title":"Project Manager","description":"Overview","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/tools/resource-manager":{"id":"guides/operations-guide/openstack/tools/resource-manager","title":"Resource Manager","description":"Preparations","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/tools/sandbox-manager":{"id":"guides/operations-guide/openstack/tools/sandbox-manager","title":"Sandbox Manager","description":"","sidebar":"tutorialSidebar"},"guides/operations-guide/openstack/tools/simple-stress":{"id":"guides/operations-guide/openstack/tools/simple-stress","title":"Simple Stress","description":"Overview","sidebar":"tutorialSidebar"},"guides/operations-guide/rook":{"id":"guides/operations-guide/rook","title":"Ceph via Rook (technical preview)","description":"This is a technical preview and not recommended for production use yet.","sidebar":"tutorialSidebar"},"guides/other-guides/cloud-in-a-box":{"id":"guides/other-guides/cloud-in-a-box","title":"Cloud in a Box - CiaB","description":"\ud83d\udca1 Cloud in a Box (CiaB) is a minimalistic installation of the latest stable OSISM release with only services which are needed to","sidebar":"tutorialSidebar"},"guides/other-guides/contributor-guide":{"id":"guides/other-guides/contributor-guide","title":"Contributor Guide","description":"We welcome any issues, change requests or general feedback. Do not hestiate to open an issue.","sidebar":"tutorialSidebar"},"guides/other-guides/developer-guide/index":{"id":"guides/other-guides/developer-guide/index","title":"Developer Guide","description":"How to add a new service","sidebar":"tutorialSidebar"},"guides/other-guides/developer-guide/releases":{"id":"guides/other-guides/developer-guide/releases","title":"Releases","description":"How we handle releases","sidebar":"tutorialSidebar"},"guides/other-guides/developer-guide/scripts":{"id":"guides/other-guides/developer-guide/scripts","title":"Scripts","description":"Scripts are included in container images to simplify development work and to enable","sidebar":"tutorialSidebar"},"guides/other-guides/developer-guide/zuul":{"id":"guides/other-guides/developer-guide/zuul","title":"Zuul CI","description":"We use Zuul CI as a CI service for OSISM. The service is not required for","sidebar":"tutorialSidebar"},"guides/other-guides/index":{"id":"guides/other-guides/index","title":"Other Guides","description":"","sidebar":"tutorialSidebar"},"guides/other-guides/style-guide":{"id":"guides/other-guides/style-guide","title":"Style Guide","description":"Ansible","sidebar":"tutorialSidebar"},"guides/other-guides/testbed":{"id":"guides/other-guides/testbed","title":"Testbed","description":"With the OSISM Testbed, it is possible to run a full Sovereign Cloud Stack","sidebar":"tutorialSidebar"},"guides/troubleshooting-guide/ceph":{"id":"guides/troubleshooting-guide/ceph","title":"Ceph","description":"Where to find docs","sidebar":"tutorialSidebar"},"guides/troubleshooting-guide/index":{"id":"guides/troubleshooting-guide/index","title":"Troubleshooting Guide","description":"\ud83d\udca1 The Troubleshooting Guide describe how to solve issues.","sidebar":"tutorialSidebar"},"guides/troubleshooting-guide/manager":{"id":"guides/troubleshooting-guide/manager","title":"Manager","description":"Reset","sidebar":"tutorialSidebar"},"guides/troubleshooting-guide/openstack":{"id":"guides/troubleshooting-guide/openstack","title":"OpenStack","description":"Database creation fails","sidebar":"tutorialSidebar"},"guides/upgrade-guide/ceph":{"id":"guides/upgrade-guide/ceph","title":"Ceph","description":"See Rook Operations.","sidebar":"tutorialSidebar"},"guides/upgrade-guide/docker":{"id":"guides/upgrade-guide/docker","title":"Docker","description":"The Docker version used is defined via the parameter docker_version in the file","sidebar":"tutorialSidebar"},"guides/upgrade-guide/index":{"id":"guides/upgrade-guide/index","title":"Upgrade Guide","description":"In the examples, the pull of images (if supported by a role) is always run first. While","sidebar":"tutorialSidebar"},"guides/upgrade-guide/infrastructure":{"id":"guides/upgrade-guide/infrastructure","title":"Infrastructure","description":"1. Kubernetes","sidebar":"tutorialSidebar"},"guides/upgrade-guide/logging-monitoring":{"id":"guides/upgrade-guide/logging-monitoring","title":"Logging & Monitoring","description":"1. OpenSearch","sidebar":"tutorialSidebar"},"guides/upgrade-guide/manager":{"id":"guides/upgrade-guide/manager","title":"Manager","description":"Always read the release notes first to learn what has changed and what","sidebar":"tutorialSidebar"},"guides/upgrade-guide/network":{"id":"guides/upgrade-guide/network","title":"Network","description":"1. Open vSwitch (OVS)","sidebar":"tutorialSidebar"},"guides/upgrade-guide/openstack":{"id":"guides/upgrade-guide/openstack","title":"OpenStack","description":"When upgrade the different OpenStack services, all containers must be","sidebar":"tutorialSidebar"},"guides/user-guide/index":{"id":"guides/user-guide/index","title":"User Guide","description":"","sidebar":"tutorialSidebar"},"guides/user-guide/migration-vmware-esix":{"id":"guides/user-guide/migration-vmware-esix","title":"Migrate from VMware ESXi to OpenStack","description":"This guide is an example of how to perform a manual migration from a VMware ESXi host to OpenStack.","sidebar":"tutorialSidebar"},"guides/user-guide/openstack/index":{"id":"guides/user-guide/openstack/index","title":"OpenStack","description":"","sidebar":"tutorialSidebar"},"guides/user-guide/openstack/openstackclient":{"id":"guides/user-guide/openstack/openstackclient","title":"Client","description":"OpenStackClient looks for a clouds.yaml configuration file in the following locations:","sidebar":"tutorialSidebar"},"guides/user-guide/openstack/security-groups":{"id":"guides/user-guide/openstack/security-groups","title":"How to configure and use security groups","description":"Security groups in OpenStack are part of the network security mechanisms provided for the users.","sidebar":"tutorialSidebar"},"guides/user-guide/openstack/user-data-backups":{"id":"guides/user-guide/openstack/user-data-backups","title":"User Data Backups","description":"This guide will explain common procedures for creating and restoring backups of user data accumulated in cloud resources such as volumes, images or ephemeral server disks.","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Getting started","description":"OSISM is a solution for the holistic management of sustainable, sovereign","sidebar":"tutorialSidebar"},"references/cli":{"id":"references/cli","title":"Command line interface reference","description":"","sidebar":"tutorialSidebar"},"references/configuration":{"id":"references/configuration","title":"Configuration reference","description":"","sidebar":"tutorialSidebar"},"references/index":{"id":"references/index","title":"References","description":"","sidebar":"tutorialSidebar"},"references/parameters":{"id":"references/parameters","title":"Parameters reference","description":"","sidebar":"tutorialSidebar"},"release-notes/index":{"id":"release-notes/index","title":"Release Notes","description":"The old release notes (before OSISM 7) can be found on the archived page","sidebar":"tutorialSidebar"},"release-notes/osism-7":{"id":"release-notes/osism-7","title":"OSISM 7","description":"Instructions for the upgrade can be found in the Upgrade Guide.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/06fc275a.bacd9c39.js b/assets/js/06fc275a.bacd9c39.js new file mode 100644 index 0000000000..8a207f9a38 --- /dev/null +++ b/assets/js/06fc275a.bacd9c39.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkosism=self.webpackChunkosism||[]).push([[6759],{6428:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>a});var s=i(5893),t=i(1151);const o={sidebar_label:"Skyline"},r="Skyline",l={id:"guides/configuration-guide/openstack/skyline",title:"Skyline",description:"Skyline APIServer",source:"@site/docs/guides/configuration-guide/openstack/skyline.md",sourceDirName:"guides/configuration-guide/openstack",slug:"/guides/configuration-guide/openstack/skyline",permalink:"/docs/guides/configuration-guide/openstack/skyline",draft:!1,unlisted:!1,editUrl:"https://github.com/osism/osism.github.io/tree/main/docs/guides/configuration-guide/openstack/skyline.md",tags:[],version:"current",frontMatter:{sidebar_label:"Skyline"},sidebar:"tutorialSidebar",previous:{title:"Placement",permalink:"/docs/guides/configuration-guide/openstack/placement"},next:{title:"Ceph via Rook (technical preview)",permalink:"/docs/guides/configuration-guide/rook"}},c={},a=[{value:"Skyline APIServer",id:"skyline-apiserver",level:2},{value:"Skyline Console",id:"skyline-console",level:2}];function d(e){const n={a:"a",h1:"h1",h2:"h2",li:"li",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"skyline",children:"Skyline"}),"\n",(0,s.jsx)(n.h2,{id:"skyline-apiserver",children:"Skyline APIServer"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://docs.openstack.org/skyline-apiserver/latest/configuration/settings.html",children:"Skyline APIServer configuration reference"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"skyline-console",children:"Skyline Console"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://docs.openstack.org/skyline-console/latest/admin/index.html",children:"Skyline Console admin guide"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://docs.openstack.org/skyline-console/latest/configuration/skyline-console-settings.html",children:"Skyline Console configuration reference"})}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>l,a:()=>r});var s=i(7294);const t={},o=s.createContext(t);function r(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/06fc275a.ea18936d.js b/assets/js/06fc275a.ea18936d.js deleted file mode 100644 index 4c0c4de512..0000000000 --- a/assets/js/06fc275a.ea18936d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkosism=self.webpackChunkosism||[]).push([[6759],{6428:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>a});var s=i(5893),t=i(1151);const o={sidebar_label:"Skyline"},l="Skyline",r={id:"guides/configuration-guide/openstack/skyline",title:"Skyline",description:"Skyline APIServer",source:"@site/docs/guides/configuration-guide/openstack/skyline.md",sourceDirName:"guides/configuration-guide/openstack",slug:"/guides/configuration-guide/openstack/skyline",permalink:"/docs/guides/configuration-guide/openstack/skyline",draft:!1,unlisted:!1,editUrl:"https://github.com/osism/osism.github.io/tree/main/docs/guides/configuration-guide/openstack/skyline.md",tags:[],version:"current",frontMatter:{sidebar_label:"Skyline"},sidebar:"tutorialSidebar",previous:{title:"Placement",permalink:"/docs/guides/configuration-guide/openstack/placement"},next:{title:"Commons",permalink:"/docs/guides/configuration-guide/commons/"}},c={},a=[{value:"Skyline APIServer",id:"skyline-apiserver",level:2},{value:"Skyline Console",id:"skyline-console",level:2}];function d(e){const n={a:"a",h1:"h1",h2:"h2",li:"li",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"skyline",children:"Skyline"}),"\n",(0,s.jsx)(n.h2,{id:"skyline-apiserver",children:"Skyline APIServer"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://docs.openstack.org/skyline-apiserver/latest/configuration/settings.html",children:"Skyline APIServer configuration reference"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"skyline-console",children:"Skyline Console"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://docs.openstack.org/skyline-console/latest/admin/index.html",children:"Skyline Console admin guide"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://docs.openstack.org/skyline-console/latest/configuration/skyline-console-settings.html",children:"Skyline Console configuration reference"})}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>r,a:()=>l});var s=i(7294);const t={},o=s.createContext(t);function l(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0e3a612a.04d1cbc8.js b/assets/js/0e3a612a.04d1cbc8.js new file mode 100644 index 0000000000..9cece25f4a --- /dev/null +++ b/assets/js/0e3a612a.04d1cbc8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkosism=self.webpackChunkosism||[]).push([[888],{4963:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>i,toc:()=>c});var s=n(5893),r=n(1151);const t={sidebar_label:"Ceph via Rook (technical preview)",sidebar_position:31},a="Ceph via Rook (technical preview)",i={id:"guides/configuration-guide/rook",title:"Ceph via Rook (technical preview)",description:"The official Ceph documentation is located on https://docs.ceph.com/en/latest/rados/configuration/",source:"@site/docs/guides/configuration-guide/rook.md",sourceDirName:"guides/configuration-guide",slug:"/guides/configuration-guide/rook",permalink:"/docs/guides/configuration-guide/rook",draft:!1,unlisted:!1,editUrl:"https://github.com/osism/osism.github.io/tree/main/docs/guides/configuration-guide/rook.md",tags:[],version:"current",sidebarPosition:31,frontMatter:{sidebar_label:"Ceph via Rook (technical preview)",sidebar_position:31},sidebar:"tutorialSidebar",previous:{title:"Skyline",permalink:"/docs/guides/configuration-guide/openstack/skyline"},next:{title:"Commons",permalink:"/docs/guides/configuration-guide/commons/"}},l={},c=[{value:"Unique Identifier",id:"unique-identifier",level:2},{value:"Client",id:"client",level:2},{value:"Network configuration",id:"network-configuration",level:2},{value:"ConfiguringaddressRanges
",id:"configuring-addressranges",level:3},{value:"Configuring encryption, compression, msgr2",id:"configuring-encryption-compression-msgr2",level:3},{value:"Flexible approach using rook_network
",id:"flexible-approach-using-rook_network",level:3},{value:"RGW service - CephObjectStore CRD",id:"rgw-service---cephobjectstore-crd",level:2},{value:"Cephfs - CephFilesystem CRD",id:"cephfs---cephfilesystem-crd",level:2},{value:"Extra pools - CephBlockPool CRD",id:"extra-pools---cephblockpool-crd",level:2},{value:"Storage configuration",id:"storage-configuration",level:2},{value:"Deploy OSDs on all nodes and found devices",id:"deploy-osds-on-all-nodes-and-found-devices",level:3},{value:"Deploy OSDs on specific nodes and devices based on a device filter",id:"deploy-osds-on-specific-nodes-and-devices-based-on-a-device-filter",level:3},{value:"Deploy OSDs on specific nodes and devices based on device names",id:"deploy-osds-on-specific-nodes-and-devices-based-on-device-names",level:3},{value:"Flexible approach using rook_storage
",id:"flexible-approach-using-rook_storage",level:3},{value:"Encrypted OSDs",id:"encrypted-osds",level:3},{value:"Dashboard",id:"dashboard",level:2},{value:"Enable dashboard and configure ssl and ports",id:"enable-dashboard-and-configure-ssl-and-ports",level:3},{value:"Rook Cluster Name",id:"rook-cluster-name",level:2},{value:"Kubernetes Namespaces",id:"kubernetes-namespaces",level:2},{value:"Number and Placement of Ceph Daemons",id:"number-and-placement-of-ceph-daemons",level:2},{value:"Crash Collector",id:"crash-collector",level:2},{value:"Crash Collector",id:"crash-collector-1",level:2},{value:"Ceph Config",id:"ceph-config",level:2},{value:"Second Ceph cluster",id:"second-ceph-cluster",level:2},{value:"Helm Value File",id:"helm-value-file",level:2}];function d(e){const o={a:"a",admonition:"admonition",code:"code",del:"del",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.h1,{id:"ceph-via-rook-technical-preview",children:"Ceph via Rook (technical preview)"}),"\n",(0,s.jsxs)(o.p,{children:["The official Ceph documentation is located on ",(0,s.jsx)(o.a,{href:"https://docs.ceph.com/en/latest/rados/configuration/",children:"https://docs.ceph.com/en/latest/rados/configuration/"})]}),"\n",(0,s.jsxs)(o.p,{children:["It is ",(0,s.jsx)(o.strong,{children:"strongly advised"})," to use the documentation for the version being used."]}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:["Quincy - ",(0,s.jsx)(o.a,{href:"https://docs.ceph.com/en/quincy/rados/configuration/",children:"https://docs.ceph.com/en/quincy/rados/configuration/"})]}),"\n",(0,s.jsxs)(o.li,{children:["Reef - ",(0,s.jsx)(o.a,{href:"https://docs.ceph.com/en/reef/rados/configuration/",children:"https://docs.ceph.com/en/reef/rados/configuration/"})]}),"\n"]}),"\n",(0,s.jsx)(o.h2,{id:"unique-identifier",children:"Unique Identifier"}),"\n",(0,s.jsx)(o.p,{children:"The File System ID is a unique identifier for the cluster."}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsxs)(o.del,{children:["The identifier is set via the parameter ",(0,s.jsx)(o.code,{children:"fsid"})," in ",(0,s.jsx)(o.code,{children:"environments/rook/configuration.yml"})]}),"\n",(0,s.jsxs)(o.del,{children:["and must be unique. It can be generated with ",(0,s.jsx)(o.code,{children:"uuidgen"}),"."]})]}),"\n",(0,s.jsxs)(o.p,{children:["It is generated automatically by the ",(0,s.jsx)(o.a,{href:"/docs/guides/deploy-guide/services/rook",children:"Rook Deployment"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["TODO: To evaluate if we want and can pass a ",(0,s.jsx)(o.code,{children:"fsid"}),". This is no out-of-the-box Rook feature, though."]}),"\n",(0,s.jsx)(o.h2,{id:"client",children:"Client"}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsxs)(o.del,{children:["The ",(0,s.jsx)(o.code,{children:"client.admin"})," keyring is placed in the file ",(0,s.jsx)(o.code,{children:"environments/infrastructure/files/ceph/ceph.client.admin.keyring"}),"."]})}),"\n",(0,s.jsx)(o.p,{children:"There is no real Ceph client installed on the manager node, but a wrapper to enter the Rook Toolbox can be installed."}),"\n",(0,s.jsx)(o.p,{children:"If the namespace of the rook cluster was changed this needs to be reflected as well as the install type of the client."}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/infrastructure/configuration.yml"',children:"cephclient_install_type: rook\n\ncephclient_rook_namespace: rook-ceph\n"})}),"\n",(0,s.jsx)(o.p,{children:"After successfully configuring the environment for the client, run the installation:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"osism apply cephclient\n"})}),"\n",(0,s.jsxs)(o.p,{children:["TODO: This will try to detect a prior installation of a Ceph client with the install type ",(0,s.jsx)(o.code,{children:"container"})," or ",(0,s.jsx)(o.code,{children:"package"})," and cleanup that."]}),"\n",(0,s.jsx)(o.h2,{id:"network-configuration",children:"Network configuration"}),"\n",(0,s.jsxs)(o.p,{children:["Some useful ansible variables for the options from the ",(0,s.jsx)(o.a,{href:"https://rook.io/docs/rook/latest-release/CRDs/Cluster/ceph-cluster-crd/?h=#network-configuration-settings",children:"Rook Network Configuration Settings"})," are available.\nIf you want complete flexibility, you can also use the ",(0,s.jsx)(o.code,{children:"rook_network"})," variable which abstracts all settings from ",(0,s.jsx)(o.a,{href:"https://rook.io/docs/rook/latest/CRDs/Cluster/ceph-cluster-crd/#network-configuration-settings",children:"Rook Network Configuration Settings"}),"."]}),"\n",(0,s.jsxs)(o.h3,{id:"configuring-addressranges",children:["Configuring ",(0,s.jsx)(o.code,{children:"addressRanges"})]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:'rook_network_public: "192.168.16.0/24"\nrook_network_cluster: "192.168.17.0/24"\n'})}),"\n",(0,s.jsx)(o.h3,{id:"configuring-encryption-compression-msgr2",children:"Configuring encryption, compression, msgr2"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:"rook_network_encryption: true\nrook_network_compression: true\nrook_network_require_msgr2: false\n"})}),"\n",(0,s.jsxs)(o.h3,{id:"flexible-approach-using-rook_network",children:["Flexible approach using ",(0,s.jsx)(o.code,{children:"rook_network"})]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:'rook_network_encryption: true\nrook_network_compression: true\nrook_network_require_msgr2: false\nrook_network_public: "192.168.16.0/20"\nrook_network_cluster: "{{ rook_network_public }}"\nrook_network:\n connections:\n # Whether to encrypt the data in transit across the wire to prevent eavesdropping the data on the network.\n # The default is false. When encryption is enabled, all communication between clients and Ceph daemons, or between Ceph daemons will be encrypted.\n # When encryption is not enabled, clients still establish a strong initial authentication and data integrity is still validated with a crc check.\n # IMPORTANT: Encryption requires the 5.11 kernel for the latest nbd and cephfs drivers. Alternatively for testing only,\n # you can set the "mounter: rbd-nbd" in the rbd storage class, or "mounter: fuse" in the cephfs storage class.\n # The nbd and fuse drivers are *not* recommended in production since restarting the csi driver pod will disconnect the volumes.\n encryption:\n enabled: "{{ rook_network_encryption }}"\n # Whether to compress the data in transit across the wire. The default is false.\n # Requires Ceph Quincy (v17) or newer. Also see the kernel requirements above for encryption.\n compression:\n enabled: "{{ rook_network_compression }}"\n # Whether to require communication over msgr2. If true, the msgr v1 port (6789) will be disabled\n # and clients will be required to connect to the Ceph cluster with the v2 port (3300).\n # Requires a kernel that supports msgr v2 (kernel 5.11 or CentOS 8.4 or newer).\n requireMsgr2: "{{ rook_network_require_msgr2 }}"\n # enable host networking\n provider: host\n addressRanges:\n public:\n - "{{ rook_network_public }}"\n cluster:\n - "{{ rook_network_cluster }}"\n'})}),"\n",(0,s.jsx)(o.h2,{id:"rgw-service---cephobjectstore-crd",children:"RGW service - CephObjectStore CRD"}),"\n",(0,s.jsx)(o.admonition,{type:"info",children:(0,s.jsxs)(o.p,{children:["OpenStack integration between Keystone/Swift and Rook is currently missing upstream in Rook. Please have a look at ",(0,s.jsx)(o.a,{href:"https://github.com/orgs/SovereignCloudStack/projects/18/views/1?layout=board&pane=issue&itemId=63889060",children:"#1027"})," to get the current status of the integration in OSISM."]})}),"\n",(0,s.jsxs)(o.p,{children:["Have a look at ",(0,s.jsx)(o.a,{href:"https://rook.io/docs/rook/latest/CRDs/Object-Storage/ceph-object-store-crd/",children:"CephObjectStore CRD Spec"})," for details on how to configure the RGW service."]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:'rook_cephobjectstore_default_name: rgw\nrook_cephobjectstore_replicated_default_size: 3\nrook_cephobjectstore_erasurecoded_default_datachunks: 2\nrook_cephobjectstore_erasurecoded_default_codingchunks: 1\nrook_cephobjectstore_failuredomain: host\nrook_cephobjectstore_default_port: 8081\nrook_cephobjectstore_preservepoolsondelete: true\nrook_cephobjectstores:\n - name: "{{ rook_cephobjectstore_default_name }}"\n spec:\n metadataPool:\n failureDomain: "{{ rook_cephobjectstore_failuredomain }}"\n replicated:\n size: "{{ rook_cephobjectstore_replicated_default_size }}"\n # erasureCoded:\n # dataChunks: "{{ rook_cephobjectstore_erasurecoded_default_datachunks }}"\n # codingChunks: "{{ rook_cephobjectstore_erasurecoded_default_codingchunks }}"\n dataPool:\n failureDomain: "{{ rook_cephobjectstore_failuredomain }}"\n replicated:\n size: "{{ rook_cephobjectstore_replicated_default_size }}"\n # erasureCoded:\n # dataChunks: "{{ rook_cephobjectstore_erasurecoded_default_datachunks }}"\n # codingChunks: "{{ rook_cephobjectstore_erasurecoded_default_codingchunks }}"\n preservePoolsOnDelete: "{{ rook_cephobjectstore_preservepoolsondelete }}"\n gateway:\n port: "{{ rook_cephobjectstore_default_port }}"\n resources: "{{ rook_resources_cephobjecstore }}"\n # securePort: 443\n # sslCertificateRef:\n instances: 1\n priorityClassName: system-cluster-critical\n placement: "{{ rook_placement_cephobjectstore }}"\n annotations: "{{ rook_annotations_cephobjecstore }}"\n storageClass:\n enabled: false\n'})}),"\n",(0,s.jsx)(o.h2,{id:"cephfs---cephfilesystem-crd",children:"Cephfs - CephFilesystem CRD"}),"\n",(0,s.jsxs)(o.p,{children:["Have a look at ",(0,s.jsx)(o.a,{href:"https://rook.io/docs/rook/latest/CRDs/Shared-Filesystem/ceph-filesystem-crd/",children:"CephFilesystem CRD Spec"})," for details on how to configure Cephfs."]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:'rook_cephfilesystem_default_name: cephfs\nrook_cephfilesystem_replicated_default_size: 3\nrook_cephfilesystem_erasurecoded_default_datachunks: 2\nrook_cephfilesystem_erasurecoded_default_codingchunks: 1\nrook_cephfilesystem_default_metadatapool_parameters_compression_mode: none\nrook_cephfilesystem_default_datapool_parameters_compression_mode: none\nrook_cephfilesystems:\n - name: "{{ rook_cephfilesystem_default_name }}"\n spec:\n metadataPool:\n failureDomain: host\n # The metadata pool spec must use replication.\n replicated:\n size: "{{ rook_cephfilesystem_replicated_default_size }}"\n requireSafeReplicaSize: true\n parameters:\n compression_mode: "{{ rook_cephfilesystem_default_datapool_parameters_compression_mode }}"\n # target_size_ratio: ".5"\n dataPools:\n - failureDomain: host\n # The data pool spec can use replication or erasure coding.\n replicated:\n size: "{{ rook_cephfilesystem_replicated_default_size }}"\n requireSafeReplicaSize: true\n # erasureCoded:\n # dataChunks: "{{ rook_cephfilesystem_erasurecoded_default_datachunks }}"\n # codingChunks: "{{ rook_cephfilesystem_erasurecoded_default_codingchunks }}"\n name: data0\n parameters:\n compression_mode: "{{ rook_cephfilesystem_default_datapool_parameters_compression_mode }}"\n # target_size_ratio: ".5"\n metadataServer:\n activeCount: "{{ rook_mds_count }}"\n activeStandby: true\n resources: "{{ rook_resources_cephfilesystem }}"\n priorityClassName: system-cluster-critical"\n placement: "{{ rook_placement_cephfilesystem }}"\n annotations: "{{ rook_annotations_cephfilesystem }}"\n storageClass:\n enabled: false\n'})}),"\n",(0,s.jsx)(o.h2,{id:"extra-pools---cephblockpool-crd",children:"Extra pools - CephBlockPool CRD"}),"\n",(0,s.jsxs)(o.p,{children:["Extra pools can be defined via the ",(0,s.jsx)(o.code,{children:"rook_cephblockpools"})," parameter. Be sure to also include the default pools.\nThey will use the default values from the ",(0,s.jsx)(o.code,{children:"rook_cephblockpool_*"})," variables."]}),"\n",(0,s.jsxs)(o.p,{children:["Have a look at ",(0,s.jsx)(o.a,{href:"https://rook.io/docs/rook/latest-release/CRDs/Block-Storage/ceph-block-pool-crd/#spec",children:"CephBlockPool CRD Spec"})," for details."]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:'rook_cephblockpool_replicated_default_size: 3\nrook_cephblockpool_erasurecoded_default_datachunks: 2\nrook_cephblockpool_erasurecoded_default_codingchunks: 1\nrook_cephblockpool_default_min_size: "0"\nrook_cephblockpool_default_pg_num: "128"\nrook_cephblockpools:\n # default pools\n - name: backups\n spec:\n failureDomain: host\n replicated:\n size: "{{ rook_cephblockpool_replicated_default_size }}"\n parameters:\n min_size: "{{ rook_cephblockpool_default_min_size }}"\n pg_num: "{{ rook_cephblockpool_default_pg_num }}"\n pgp_num: "{{ rook_cephblockpool_default_pg_num }}"\n storageClass:\n enabled: false\n - name: volumes\n spec:\n failureDomain: host\n replicated:\n size: "{{ rook_cephblockpool_replicated_default_size }}"\n parameters:\n min_size: "{{ rook_cephblockpool_default_min_size }}"\n pg_num: "{{ rook_cephblockpool_default_pg_num }}"\n pgp_num: "{{ rook_cephblockpool_default_pg_num }}"\n storageClass:\n enabled: false\n - name: images\n spec:\n failureDomain: host\n replicated:\n size: "{{ rook_cephblockpool_replicated_default_size }}"\n parameters:\n min_size: "{{ rook_cephblockpool_default_min_size }}"\n pg_num: "{{ rook_cephblockpool_default_pg_num }}"\n pgp_num: "{{ rook_cephblockpool_default_pg_num }}"\n storageClass:\n enabled: false\n - name: metrics\n spec:\n failureDomain: host\n replicated:\n size: "{{ rook_cephblockpool_replicated_default_size }}"\n parameters:\n min_size: "{{ rook_cephblockpool_default_min_size }}"\n pg_num: "{{ rook_cephblockpool_default_pg_num }}"\n pgp_num: "{{ rook_cephblockpool_default_pg_num }}"\n storageClass:\n enabled: false\n - name: vms\n spec:\n failureDomain: host\n replicated:\n size: "{{ rook_cephblockpool_replicated_default_size }}"\n parameters:\n min_size: "{{ rook_cephblockpool_default_min_size }}"\n pg_num: "{{ rook_cephblockpool_default_pg_num }}"\n pgp_num: "{{ rook_cephblockpool_default_pg_num }}"\n storageClass:\n enabled: false\n # extra pools\n - name: extra1\n spec:\n failureDomain: host\n replicated:\n size: "{{ rook_cephblockpool_replicated_default_size }}"\n parameters:\n min_size: "{{ rook_cephblockpool_default_min_size }}"\n pg_num: "{{ rook_cephblockpool_default_pg_num }}"\n pgp_num: "{{ rook_cephblockpool_default_pg_num }}"\n storageClass:\n enabled: false\n - name: extra2\n spec:\n failureDomain: host\n erasureCoded:\n dataChunks: "{{ rook_cephblockpool_erasurecoded_default_datachunks }}"\n codingChunks: "{{ rook_cephblockpool_erasurecoded_default_codingchunks }}" \n parameters:\n min_size: "{{ rook_cephblockpool_default_min_size }}"\n pg_num: "{{ rook_cephblockpool_default_pg_num }}"\n pgp_num: "{{ rook_cephblockpool_default_pg_num }}"\n storageClass:\n enabled: false\n'})}),"\n",(0,s.jsx)(o.h2,{id:"storage-configuration",children:"Storage configuration"}),"\n",(0,s.jsx)(o.admonition,{type:"info",children:(0,s.jsx)(o.p,{children:"In the default setup, no OSD will be deployed (better safe than sorry approach)."})}),"\n",(0,s.jsxs)(o.p,{children:["You have to pass a storage configuration via ",(0,s.jsx)(o.code,{children:"environments/rook/configuration.yml"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["Some useful ansible variables for the options from the ",(0,s.jsx)(o.a,{href:"https://rook.io/docs/rook/latest-release/CRDs/Cluster/ceph-cluster-crd/#storage-selection-settings",children:"Rook Storage Selection Settings"})," are available.\nIf you want complete flexibility, you can also use the ",(0,s.jsx)(o.code,{children:"rook_storage"})," variable which abstracts all settings from ",(0,s.jsx)(o.a,{href:"https://rook.io/docs/rook/latest-release/CRDs/Cluster/ceph-cluster-crd/#storage-selection-settings",children:"Rook Storage Selection Settings"}),"."]}),"\n",(0,s.jsx)(o.h3,{id:"deploy-osds-on-all-nodes-and-found-devices",children:"Deploy OSDs on all nodes and found devices"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:"rook_storage_useallnodes: true\nrook_storage_usealldevices: true\n"})}),"\n",(0,s.jsx)(o.h3,{id:"deploy-osds-on-specific-nodes-and-devices-based-on-a-device-filter",children:"Deploy OSDs on specific nodes and devices based on a device filter"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:'rook_storage_useallnodes: false\nrook_storage_usealldevices: false\nrook_storage_devicefilter: "^sd[b-c]"\nrook_storage_nodes:\n - name: "testbed-node-0"\n - name: "testbed-node-1"\n - name: "testbed-node-2"\n'})}),"\n",(0,s.jsx)(o.h3,{id:"deploy-osds-on-specific-nodes-and-devices-based-on-device-names",children:"Deploy OSDs on specific nodes and devices based on device names"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:'rook_storage_useallnodes: false\nrook_storage_usealldevices: false\nrook_storage_nodes:\n - name: "testbed-node-0"\n devices:\n - name: "/dev/sdb"\n - name: "/dev/sdc"\n - name: "/dev/sde"\n - name: "testbed-node-1"\n devices:\n - name: "/dev/sdf"\n - name: "/dev/sdg"\n - name: "/dev/sdh"\n - name: "testbed-node-2"\n devices:\n - name: "/dev/sdi"\n - name: "/dev/sdj"\n - name: "/dev/sdk"\n'})}),"\n",(0,s.jsxs)(o.h3,{id:"flexible-approach-using-rook_storage",children:["Flexible approach using ",(0,s.jsx)(o.code,{children:"rook_storage"})]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:'# do not use all nodes\nrook_storage_useallnodes: false\n# do not use all found devices\nrook_storage_usealldevices: false\nrook_storage_config_osdsperdevice: "1"\n# enable device encryption\nrook_storage_config_encrypteddevice: "true"\n# define a device filter where to create OSDs\nrook_storage_devicefilter: ""\n# name nodes where to create OSDs\nrook_storage_nodes: []\n# - name: "testbed-node-0"\n# - name: "testbed-node-1"\n# - name: "testbed-node-2"\nrook_storage:\n useAllNodes: "{{ rook_storage_useallnodes }}"\n useAllDevices: "{{ rook_storage_usealldevices }}"\n config:\n crushRoot: "custom-root" # specify a non-default root label for the CRUSH map\n metadataDevice: "md0" # specify a non-rotational storage so ceph-volume will use it as block db device of bluestore.\n databaseSizeMB: "1024" # uncomment if the disks are smaller than 100 GB\n osdsPerDevice: "{{ rook_storage_config_osdsperdevice }}" # this value can be overridden at the node or device level\n encryptedDevice: "{{ rook_storage_config_encrypteddevice }}" # the default value for this option is "false"\n # # Individual nodes and their config can be specified as well, but \'useAllNodes\' above must be set to false. Then, only the named\n # # nodes below will be used as storage resources. Each node\'s \'name\' field should match their \'kubernetes.io/hostname\' label.\n nodes:\n - name: "172.17.4.201"\n devices: # specific devices to use for storage can be specified for each node\n - name: "sdb"\n - name: "nvme01" # multiple osds can be created on high performance devices\n config:\n osdsPerDevice: "5"\n - name: "/dev/disk/by-id/ata-ST4000DM004-XXXX" # devices can be specified using full udev paths\n config: # configuration can be specified at the node level which overrides the cluster level config\n - name: "172.17.4.301"\n deviceFilter: "^sd."\n'})}),"\n",(0,s.jsx)(o.h3,{id:"encrypted-osds",children:"Encrypted OSDs"}),"\n",(0,s.jsx)(o.p,{children:"OSDs are encrypted by default. Rook creates a LUKS on LVM setup for this. Encryption keys are managed by Ceph, as usual."}),"\n",(0,s.jsx)(o.admonition,{type:"info",children:(0,s.jsx)(o.p,{children:"Provisioning LUKS on already existing logical volumes is not supported currently by Rook."})}),"\n",(0,s.jsxs)(o.p,{children:["Have a look at the ",(0,s.jsx)(o.a,{href:"https://docs.ceph.com/en/latest/ceph-volume/lvm/encryption/",children:"Ceph documentation on LVM encryption"})," and the ",(0,s.jsx)(o.a,{href:"https://rook.io/docs/rook/latest-release/CRDs/Cluster/ceph-cluster-crd/?h=#osd-configuration-settings",children:"Rook OSD Configuration Settings"})," for details."]}),"\n",(0,s.jsxs)(o.p,{children:["If you want complete flexibility, look into the details of the ",(0,s.jsx)(o.a,{href:"#helm-value-file",children:"Helm Value File"}),"."]}),"\n",(0,s.jsx)(o.h2,{id:"dashboard",children:"Dashboard"}),"\n",(0,s.jsx)(o.p,{children:"Password for the admin user of the Ceph dashboard is automatically generated by rook and can be retrieved like this:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:"kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath=\"{['data']['password']}\" | base64 --decode && echo\n"})}),"\n",(0,s.jsxs)(o.p,{children:["Have a look at the ",(0,s.jsx)(o.a,{href:"https://rook.io/docs/rook/latest-release/Storage-Configuration/Monitoring/ceph-dashboard/",children:"Rook Ceph Dashboard Documentation"})," for details."]}),"\n",(0,s.jsxs)(o.p,{children:["Some useful ansible variables for the options from the ",(0,s.jsx)(o.a,{href:"https://rook.io/docs/rook/latest-release/Storage-Configuration/Monitoring/ceph-dashboard/",children:"Rook Ceph Dashboard Documentation"})," are available."]}),"\n",(0,s.jsx)(o.h3,{id:"enable-dashboard-and-configure-ssl-and-ports",children:"Enable dashboard and configure ssl and ports"}),"\n",(0,s.jsx)(o.p,{children:"The Ceph dashboard is deployed by default and also an LoadBalancer Service is created in Kubernetes."}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:"rook_dashboard_enabled: true\nrook_dashboard_ssl: true\nrook_dashboard_port: 7000\nrook_dashboard_port_external: 443\n"})}),"\n",(0,s.jsx)(o.h2,{id:"rook-cluster-name",children:"Rook Cluster Name"}),"\n",(0,s.jsx)(o.p,{children:"The name that will be used internally for the Ceph cluster can be changed. Most commonly the name is the same as the namespace since multiple clusters are not supported in the same namespace."}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:"rook_cluster_name: rook-ceph\n"})}),"\n",(0,s.jsx)(o.h2,{id:"kubernetes-namespaces",children:"Kubernetes Namespaces"}),"\n",(0,s.jsx)(o.p,{children:"The Kubernetes namespace that will be created for the Rook cluster can be changed. The services, pods, and other resources created by the operator will be added to this namespace. The common scenario is to create a single Rook cluster. If multiple clusters are created, they must not have conflicting devices or host paths."}),"\n",(0,s.jsxs)(o.p,{children:["By default, both for the operator and the rook cluster, the namespace ",(0,s.jsx)(o.code,{children:"rook-ceph"})," is used."]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:"rook_operator_namespace: rook-ceph\nrook_namespace: rook-ceph\n"})}),"\n",(0,s.jsx)(o.h2,{id:"number-and-placement-of-ceph-daemons",children:"Number and Placement of Ceph Daemons"}),"\n",(0,s.jsx)(o.p,{children:"The number and placement of Ceph daemons can be changed."}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:"rook_mon_count: 3\nrook_mds_count: 3\nrook_mgr_count: 3\n"})}),"\n",(0,s.jsxs)(o.p,{children:["Please read ",(0,s.jsx)(o.a,{href:"https://rook.io/docs/rook/latest-release/CRDs/Cluster/ceph-cluster-crd/#mon-settings",children:"Rook MON Settings"}),", ",(0,s.jsx)(o.a,{href:"https://rook.io/docs/rook/latest-release/CRDs/Cluster/ceph-cluster-crd/#mgr-settings",children:"Rook MGR Settings"})," and ",(0,s.jsx)(o.a,{href:"https://rook.io/docs/rook/latest-release/CRDs/Shared-Filesystem/ceph-filesystem-crd/#metadata-server-settings",children:"Rook MDS Settings"})," to understand which configurations make sense."]}),"\n",(0,s.jsx)(o.p,{children:"The following inventory groups are defined with defaults and can be used to control the node affinity regarding the indicated Ceph components:"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsx)(o.li,{children:(0,s.jsx)(o.code,{children:"rook-mds"})}),"\n",(0,s.jsx)(o.li,{children:(0,s.jsx)(o.code,{children:"rook-mgr"})}),"\n",(0,s.jsx)(o.li,{children:(0,s.jsx)(o.code,{children:"rook-mon"})}),"\n",(0,s.jsx)(o.li,{children:(0,s.jsx)(o.code,{children:"rook-osd"})}),"\n",(0,s.jsx)(o.li,{children:(0,s.jsx)(o.code,{children:"rook-rgw"})}),"\n"]}),"\n",(0,s.jsx)(o.p,{children:"To customise those inventory groups it is possible to do so in the following format:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-ini",metastring:'title="inventory/20-roles"',children:"[rook-mds:children]\nceph-control\n\n[rook-mgr:children]\nceph-control\n\n[rook-mon:children]\nceph-control\n\n[rook-osd:children]\nceph-resource\n\n[rook-rgw:children]\nceph-control\n"})}),"\n",(0,s.jsx)(o.p,{children:"Nodes assigned to those groups will be labeled and then be utilised during the scheduling of the pods with a configuration like the following for each component:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:'nodeAffinity:\n requiredDuringSchedulingIgnoredDuringExecution:\n nodeSelectorTerms:\n - matchExpressions:\n - key: "node-role.osism.tech/{{ rook_placement_label_mon }}"\n operator: In\n values:\n - "true"\n'})}),"\n",(0,s.jsx)(o.p,{children:"TODO: Implement a way to cleanly relabel nodes.\nTODO: Implement reschedule after changing labels"}),"\n",(0,s.jsx)(o.h2,{id:"crash-collector",children:"Crash Collector"}),"\n",(0,s.jsxs)(o.p,{children:["The ",(0,s.jsx)(o.a,{href:"https://docs.ceph.com/en/quincy/mgr/crash/",children:"Ceph Crash Module"})," is enabled by default. You can also configure how long to retain the crash reports."]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:"rook_crashcollector:\n disable: false\n daysToRetrain: 7\n"})}),"\n",(0,s.jsx)(o.h2,{id:"crash-collector-1",children:"Crash Collector"}),"\n",(0,s.jsxs)(o.p,{children:["The ",(0,s.jsx)(o.a,{href:"https://docs.ceph.com/en/quincy/mgr/crash/",children:"Ceph Crash Module"})," is enabled by default. You can also configure how long to retain the crash reports."]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:"rook_crashcollector:\n disable: false\n daysToRetrain: 7\n"})}),"\n",(0,s.jsx)(o.h2,{id:"ceph-config",children:"Ceph Config"}),"\n",(0,s.jsx)(o.admonition,{type:"info",children:(0,s.jsx)(o.p,{children:"The Ceph Config feature is currently in an experimental state in the Rook project."})}),"\n",(0,s.jsxs)(o.p,{children:["Please read ",(0,s.jsx)(o.a,{href:"https://rook.github.io/docs/rook/latest-release/CRDs/Cluster/ceph-cluster-crd/#ceph-config",children:"Ceph Config"})," for details on how to use and what to expect from this feature."]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:'rook_cephconfig:\n global:\n # All values must be quoted so they are considered a string in YAML\n osd_pool_default_size: "3"\n mon_warn_on_pool_no_redundancy: "false"\n osd_crush_update_on_start: "false"\n # Make sure to quote special characters\n "osd.*":\n osd_max_scrubs: "10"\n'})}),"\n",(0,s.jsx)(o.h2,{id:"second-ceph-cluster",children:"Second Ceph cluster"}),"\n",(0,s.jsx)(o.p,{children:"In theory, this is completely customizable by deploying multiple helm releases. No evaluation has been done so far, though and this is currently not implemented in OSISM."}),"\n",(0,s.jsx)(o.h2,{id:"helm-value-file",children:"Helm Value File"}),"\n",(0,s.jsxs)(o.p,{children:["The ",(0,s.jsx)(o.a,{href:"https://github.com/osism/ansible-collection-services/tree/main/roles/rook",children:"OSISM Rook role"})," is an opinionated and sane default configuration. If you reach the limits of what is customizable via ansible variables or have a very custom setup, you can pass a custom or additional [",(0,s.jsx)(o.code,{children:"values.yml"}),"](",(0,s.jsx)(o.a,{href:"https://github.com/osism/ansible-collection-services/blob/main/roles/rook/templates/01-helm-values-all.yml.j2",children:"https://github.com/osism/ansible-collection-services/blob/main/roles/rook/templates/01-helm-values-all.yml.j2"})," files or even any ",(0,s.jsx)(o.a,{href:"https://rook.io/docs/rook/latest-release/CRDs/specification/",children:"Rook CRD"})," to the role and it will be jinja2 templated and roled out to the kubernetes cluster."]}),"\n",(0,s.jsxs)(o.p,{children:["Just overwrite ",(0,s.jsx)(o.code,{children:"rook_configuration_directory"})," and place any ",(0,s.jsx)(o.code,{children:"*.yml.j2"})," files that you want to apply there."]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:'rook_template_directory: "{{ configuration_directory }}/environments/rook/files"\n'})}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:["Helm ",(0,s.jsx)(o.code,{children:"values.yml"})," files need to be named ",(0,s.jsx)(o.code,{children:"*-helm-values-*.yml.j2"})]}),"\n",(0,s.jsxs)(o.li,{children:["custom CRDs need to be named ",(0,s.jsx)(o.code,{children:"*-CRD-*.yml.j2"})]}),"\n"]}),"\n",(0,s.jsx)(o.p,{children:"It makes sense to also include the default templates and change them (to e.g. use already existing ansible variables) add your custom settings on top or change them to fit your use cases."}),"\n",(0,s.jsxs)(o.p,{children:["Get the default templates from the ",(0,s.jsx)(o.code,{children:"osism-ansible"})," container or download them from github."]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:'mkdir /opt/configuration/environments/rook/files\ncd /opt/configuration/environments/rook/files\nfor file in 01-helm-values-all.yml.j2 02-CRD-CephClient.yml.j2 ; do\n curl -O "https://raw.githubusercontent.com/osism/ansible-collection-services/main/roles/rook/templates/${file}"\ndone\n'})})]})}function h(e={}){const{wrapper:o}={...(0,r.a)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1151:(e,o,n)=>{n.d(o,{Z:()=>i,a:()=>a});var s=n(7294);const r={},t=s.createContext(r);function a(e){const o=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),s.createElement(t.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0f52743c.0bbcf24e.js b/assets/js/0f52743c.0bbcf24e.js
deleted file mode 100644
index 77d42071b1..0000000000
--- a/assets/js/0f52743c.0bbcf24e.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkosism=self.webpackChunkosism||[]).push([[6891],{8064:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>n,metadata:()=>u,toc:()=>a});var i=t(5893),s=t(1151);const n={sidebar_label:"Troubleshooting Guide",sidebar_position:40},r="Troubleshooting Guide",u={id:"guides/troubleshooting-guide/index",title:"Troubleshooting Guide",description:"\ud83d\udca1 The Troubleshooting Guide describe how to solve issues.",source:"@site/docs/guides/troubleshooting-guide/index.md",sourceDirName:"guides/troubleshooting-guide",slug:"/guides/troubleshooting-guide/",permalink:"/docs/guides/troubleshooting-guide/",draft:!1,unlisted:!1,editUrl:"https://github.com/osism/osism.github.io/tree/main/docs/guides/troubleshooting-guide/index.md",tags:[],version:"current",sidebarPosition:40,frontMatter:{sidebar_label:"Troubleshooting Guide",sidebar_position:40},sidebar:"tutorialSidebar",previous:{title:"Octavia",permalink:"/docs/guides/operations-guide/openstack/octavia"},next:{title:"Manager",permalink:"/docs/guides/troubleshooting-guide/manager"}},d={},a=[];function c(e){const o={h1:"h1",p:"p",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.h1,{id:"troubleshooting-guide",children:"Troubleshooting Guide"}),"\n",(0,i.jsx)(o.p,{children:"\ud83d\udca1 The Troubleshooting Guide describe how to solve issues."})]})}function l(e={}){const{wrapper:o}={...(0,s.a)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>u,a:()=>r});var i=t(7294);const s={},n=i.createContext(s);function r(e){const o=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function u(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(n.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0f52743c.60ffc92e.js b/assets/js/0f52743c.60ffc92e.js
new file mode 100644
index 0000000000..c5fec0e437
--- /dev/null
+++ b/assets/js/0f52743c.60ffc92e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkosism=self.webpackChunkosism||[]).push([[6891],{8064:(e,o,i)=>{i.r(o),i.d(o,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>n,metadata:()=>u,toc:()=>a});var t=i(5893),s=i(1151);const n={sidebar_label:"Troubleshooting Guide",sidebar_position:40},r="Troubleshooting Guide",u={id:"guides/troubleshooting-guide/index",title:"Troubleshooting Guide",description:"\ud83d\udca1 The Troubleshooting Guide describe how to solve issues.",source:"@site/docs/guides/troubleshooting-guide/index.md",sourceDirName:"guides/troubleshooting-guide",slug:"/guides/troubleshooting-guide/",permalink:"/docs/guides/troubleshooting-guide/",draft:!1,unlisted:!1,editUrl:"https://github.com/osism/osism.github.io/tree/main/docs/guides/troubleshooting-guide/index.md",tags:[],version:"current",sidebarPosition:40,frontMatter:{sidebar_label:"Troubleshooting Guide",sidebar_position:40},sidebar:"tutorialSidebar",previous:{title:"Ceph via Rook (technical preview)",permalink:"/docs/guides/operations-guide/rook"},next:{title:"Manager",permalink:"/docs/guides/troubleshooting-guide/manager"}},d={},a=[];function l(e){const o={h1:"h1",p:"p",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.h1,{id:"troubleshooting-guide",children:"Troubleshooting Guide"}),"\n",(0,t.jsx)(o.p,{children:"\ud83d\udca1 The Troubleshooting Guide describe how to solve issues."})]})}function c(e={}){const{wrapper:o}={...(0,s.a)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},1151:(e,o,i)=>{i.d(o,{Z:()=>u,a:()=>r});var t=i(7294);const s={},n=t.createContext(s);function r(e){const o=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function u(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(n.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/15cba8f7.8977d6f4.js b/assets/js/15cba8f7.8977d6f4.js
new file mode 100644
index 0000000000..980f92b3ff
--- /dev/null
+++ b/assets/js/15cba8f7.8977d6f4.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkosism=self.webpackChunkosism||[]).push([[8019],{1082:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>d,toc:()=>a});var n=t(5893),o=t(1151);const s={sidebar_label:"Ceph",sidebar_position:20},r="Ceph",d={id:"guides/upgrade-guide/ceph",title:"Ceph",description:"See Rook Operations.",source:"@site/docs/guides/upgrade-guide/ceph.md",sourceDirName:"guides/upgrade-guide",slug:"/guides/upgrade-guide/ceph",permalink:"/docs/guides/upgrade-guide/ceph",draft:!1,unlisted:!1,editUrl:"https://github.com/osism/osism.github.io/tree/main/docs/guides/upgrade-guide/ceph.md",tags:[],version:"current",sidebarPosition:20,frontMatter:{sidebar_label:"Ceph",sidebar_position:20},sidebar:"tutorialSidebar",previous:{title:"Network",permalink:"/docs/guides/upgrade-guide/network"},next:{title:"Docker",permalink:"/docs/guides/upgrade-guide/docker"}},c={},a=[];function p(e){const i={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h1,{id:"ceph",children:"Ceph"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{children:"osism apply ceph-rolling_update -e ireallymeanit=yes\nosism apply cephclient\n"})}),"\n",(0,n.jsx)(i.h1,{id:"ceph-via-rook-technical-preview",children:"Ceph via Rook (technical preview)"}),"\n",(0,n.jsxs)(i.p,{children:["See ",(0,n.jsx)(i.a,{href:"/docs/guides/operations-guide/rook",children:"Rook Operations"}),"."]})]})}function u(e={}){const{wrapper:i}={...(0,o.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(p,{...e})}):p(e)}},1151:(e,i,t)=>{t.d(i,{Z:()=>d,a:()=>r});var n=t(7294);const o={},s=n.createContext(o);function r(e){const i=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/15cba8f7.eb46ba30.js b/assets/js/15cba8f7.eb46ba30.js
deleted file mode 100644
index ebfac42ab9..0000000000
--- a/assets/js/15cba8f7.eb46ba30.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkosism=self.webpackChunkosism||[]).push([[8019],{1082:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>r,metadata:()=>d,toc:()=>u});var s=i(5893),n=i(1151);const r={sidebar_label:"Ceph",sidebar_position:20},o="Ceph",d={id:"guides/upgrade-guide/ceph",title:"Ceph",description:"",source:"@site/docs/guides/upgrade-guide/ceph.md",sourceDirName:"guides/upgrade-guide",slug:"/guides/upgrade-guide/ceph",permalink:"/docs/guides/upgrade-guide/ceph",draft:!1,unlisted:!1,editUrl:"https://github.com/osism/osism.github.io/tree/main/docs/guides/upgrade-guide/ceph.md",tags:[],version:"current",sidebarPosition:20,frontMatter:{sidebar_label:"Ceph",sidebar_position:20},sidebar:"tutorialSidebar",previous:{title:"Network",permalink:"/docs/guides/upgrade-guide/network"},next:{title:"Docker",permalink:"/docs/guides/upgrade-guide/docker"}},c={},u=[];function a(e){const t={code:"code",h1:"h1",pre:"pre",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"ceph",children:"Ceph"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"osism apply ceph-rolling_update -e ireallymeanit=yes\nosism apply cephclient\n"})})]})}function p(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>d,a:()=>o});var s=i(7294);const n={},r=s.createContext(n);function o(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/51d1621c.c8208468.js b/assets/js/51d1621c.c8208468.js
new file mode 100644
index 0000000000..dce78137ba
--- /dev/null
+++ b/assets/js/51d1621c.c8208468.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkosism=self.webpackChunkosism||[]).push([[3189],{6788:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var t=r(5893),i=r(1151);r(4866),r(5162);const o={sidebar_label:"Ceph via Rook (technical preview)",sidebar_position:51},s="Ceph via Rook (technical preview)",a={id:"guides/deploy-guide/services/rook",title:"Ceph via Rook (technical preview)",description:"This is a technical preview and not recommended for production use yet.",source:"@site/docs/guides/deploy-guide/services/rook.md",sourceDirName:"guides/deploy-guide/services",slug:"/guides/deploy-guide/services/rook",permalink:"/docs/guides/deploy-guide/services/rook",draft:!1,unlisted:!1,editUrl:"https://github.com/osism/osism.github.io/tree/main/docs/guides/deploy-guide/services/rook.md",tags:[],version:"current",sidebarPosition:51,frontMatter:{sidebar_label:"Ceph via Rook (technical preview)",sidebar_position:51},sidebar:"tutorialSidebar",previous:{title:"Ceph",permalink:"/docs/guides/deploy-guide/services/ceph"},next:{title:"OpenStack",permalink:"/docs/guides/deploy-guide/services/openstack"}},l={},c=[{value:"RGW service",id:"rgw-service",level:2},{value:"Cleanup",id:"cleanup",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"ceph-via-rook-technical-preview",children:"Ceph via Rook (technical preview)"}),"\n",(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsx)(n.p,{children:"This is a technical preview and not recommended for production use yet."})}),"\n",(0,t.jsxs)(n.p,{children:["In OSISM it is also possible to integrate and use existing Ceph clusters. It\nis not necessary to deploy Ceph with OSISM. If Ceph is deployed with OSISM, it\nshould be noted that OSISM does not claim to provide all possible features of Ceph.\nCeph provided with OSISM is intended to provide the storage for Glance, Nova, Cinder\nand Manila. In a specific way that has been implemented by OSISM for years. It\nshould be checked in advance whether the way in OSISM the Ceph deployment and the\nprovided features are sufficient. If this is not the case, it is recommended to\ndeploy Ceph in a different way directly and independently of OSISM. For possible\nopen source projects, please refer to\n",(0,t.jsx)(n.a,{href:"https://docs.ceph.com/en/latest/cephadm/index.html",children:"cephadm"})," and\n",(0,t.jsx)(n.a,{href:"https://rook.io",children:"Rook"}),"."]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Deploy services."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["When using rook, all services are deployed via a single helm chart and at the same time. This could be altered by passing custom CRDs. See ",(0,t.jsx)(n.a,{href:"../../configuration-guide/rook",children:"Rook Configuration Guide"}),"."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install ",(0,t.jsx)(n.a,{href:"/docs/guides/deploy-guide/services/kubernetes",children:"Kubernetes Cluster"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Deploy ",(0,t.jsx)(n.a,{href:"https://rook.io/docs/rook/latest/Helm-Charts/operator-chart/",children:"Rook Operator Helm Chart"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"osism apply rook-operator\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Deploy complete Rook Ceph Cluster"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"osism apply rook\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Copy ceph keyrings to kolla directories (if deploying OpenStack)"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"osism apply rook-fetch-keys\n"})}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Get ceph keyrings. This places the necessary keys in ",(0,t.jsx)(n.code,{children:"/opt/configuration"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"osism apply rook-fetch-keys\n"})}),"\n",(0,t.jsx)(n.p,{children:"After run, these keys must be permanently added to the configuration repository\nvia Git."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"environments/infrastructure/files/ceph/ceph.client.admin.keyring\nenvironments/kolla/files/overlays/gnocchi/ceph.client.gnocchi.keyring\nenvironments/kolla/files/overlays/nova/ceph.client.cinder.keyring\nenvironments/kolla/files/overlays/nova/ceph.client.nova.keyring\nenvironments/kolla/files/overlays/cinder/cinder-backup/ceph.client.cinder.keyring\nenvironments/kolla/files/overlays/cinder/cinder-backup/ceph.client.cinder-backup.keyring\nenvironments/kolla/files/overlays/cinder/cinder-volume/ceph.client.cinder.keyring\nenvironments/kolla/files/overlays/manila/ceph.client.manila.keyring\nenvironments/kolla/files/overlays/glance/ceph.client.glance.keyring\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You can also overwrite the ",(0,t.jsx)(n.code,{children:"rook_cephclients"})," parameter to skip\nthese keys."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:"rook_cephclients: {}\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"A Ceph client (a wrapper on the manager for entering the rook toolbox) can be deployed."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"osism apply cephclient\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You have to make sure the correct ",(0,t.jsx)(n.a,{href:"/docs/guides/configuration-guide/rook#client",children:"Configuration Options for the Rook Ceph Client Wrapper"})," are net."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["After getting the Ceph Keyrings, the ",(0,t.jsx)(n.a,{href:"/docs/guides/deploy-guide/services/openstack",children:"OpenStack Deployment"})," can optionally be done."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"rgw-service",children:"RGW service"}),"\n",(0,t.jsxs)(n.p,{children:["Deployment of the Ceph RGW Service is enabled by default in rook. This is done by creating a default ",(0,t.jsx)(n.a,{href:"https://rook.io/docs/rook/latest-release/CRDs/Object-Storage/ceph-object-store-crd/",children:"CephObjectStore CRD"}),". How the Ceph RGW service can be deployed and integrated into OpenStack is described here."]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["OpenStack integration between Keystone/Swift and Rook is currently missing upstream in Rook. Please have a look at ",(0,t.jsx)(n.a,{href:"https://github.com/orgs/SovereignCloudStack/projects/18/views/1?layout=board&pane=issue&itemId=63889060",children:"#1027"})," to get the current status of the integration in OSISM."]})}),"\n",(0,t.jsx)(n.h2,{id:"cleanup",children:"Cleanup"}),"\n",(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsx)(n.p,{children:"This will permanently delete all your data in the Ceph Cluster. Be sure you know what you are doing before proceeding."})}),"\n",(0,t.jsxs)(n.p,{children:["If you want to cleanup/delete the whole cluster, you can do that by enabling ",(0,t.jsx)(n.code,{children:"rook_cleanup"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="environments/rook/configuration.yml"',children:"rook_cleanup: true\n"})}),"\n",(0,t.jsxs)(n.p,{children:["And running the ",(0,t.jsx)(n.code,{children:"rook-cleanup"})," role."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"osism apply rook-cleanup\n"})})]})}function u(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},5162:(e,n,r)=>{r.d(n,{Z:()=>s});r(7294);var t=r(6905);const i={tabItem:"tabItem_Ymn6"};var o=r(5893);function s(e){let{children:n,hidden:r,className:s}=e;return(0,o.jsx)("div",{role:"tabpanel",className:(0,t.Z)(i.tabItem,s),hidden:r,children:n})}},4866:(e,n,r)=>{r.d(n,{Z:()=>j});var t=r(7294),i=r(6905),o=r(2466),s=r(6550),a=r(469),l=r(1980),c=r(7392),d=r(812);function u(e){return t.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad /etc/hosts
",id:"static-entries-in-etchosts",level:3},{value:"Webinterfaces",id:"webinterfaces",level:3},{value:"Authentication with OIDC",id:"authentication-with-oidc",level:3},{value:"OpenStack web dashboard (Horizon) login via OIDC",id:"openstack-web-dashboard-horizon-login-via-oidc",level:4},{value:"OpenStack web dashboard (Horizon) logout",id:"openstack-web-dashboard-horizon-logout",level:4},{value:"Usage of the OpenStack CLI",id:"usage-of-the-openstack-cli",level:4},{value:"OpenStack CLI operations with OpenID Connect password",id:"openstack-cli-operations-with-openid-connect-password",level:4},{value:"OpenStack CLI token issue with OpenID Connect",id:"openstack-cli-token-issue-with-openid-connect",level:4},{value:"Advanced Usage",id:"advanced-usage",level:2},{value:"External API",id:"external-api",level:3},{value:"Change versions",id:"change-versions",level:3},{value:"Deploy services",id:"deploy-services",level:3},{value:"Upgrade services",id:"upgrade-services",level:3},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Ansible errors",id:"ansible-errors",level:3},{value:"Unsupported locale setting",id:"unsupported-locale-setting",level:3},{value:"Appendix",id:"appendix",level:2},{value:"Configuration",id:"configuration",level:3},{value:"Variables",id:"variables",level:4},{value:"Overrides",id:"overrides",level:4},{value:"Customisations",id:"customisations",level:4},{value:"Notes",id:"notes",level:3},{value:"Supported releases",id:"supported-releases",level:3},{value:"Included services",id:"included-services",level:3},{value:"Infrastructure",id:"infrastructure",level:4},{value:"OpenStack",id:"openstack",level:4},{value:"Makefile reference",id:"makefile-reference",level:3},{value:"CI jobs",id:"ci-jobs",level:3}];function x(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"testbed",children:"Testbed"}),"\n",(0,n.jsxs)(t.p,{children:["With the OSISM Testbed, it is possible to run a full Sovereign Cloud Stack\ndeployment on an existing OpenStack environment such as Cleura or ",(0,n.jsx)(t.a,{href:"https://regio.digital",children:"REGIO.cloud"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["OSISM is the reference implementation for the Infrastructure as a Service (IaaS) layer in the\n",(0,n.jsx)(t.a,{href:"https://scs.community",children:"Sovereign Cloud Stack"})," (SCS) project. The OSISM Testbed is therefore\nused in the SCS project to test and work on the Instrastructure as a Service layer."]}),"\n",(0,n.jsx)(t.p,{children:"The OSISM Testbed is intended as a playground. Further services and integration will\nbe added over time. A increasing number of best practices and experiences from the productive\ndeployments will be included here in the future. It will become more production-like\nover time. However, at no point does it claim to represent a production setup exactly."}),"\n",(0,n.jsx)(t.h2,{id:"requirements",children:"Requirements"}),"\n",(0,n.jsx)(t.h3,{id:"cloud-access",children:"Cloud access"}),"\n",(0,n.jsx)(t.p,{children:"The usual prerequisite is to have an account on one of the supported OpenStack cloud providers.\nAs the OSISM Testbed also virtualizes systems itself, the OpenStack cluster should provide\nthe capabilities for nested virtualization."}),"\n",(0,n.jsx)(t.p,{children:"It is not part of this guide to describe the registration with the individual cloud\nproviders. Please contact the respective cloud provider for this."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Product"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Provider"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Profile name"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Note"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Cleura"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Cleura"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"cleura"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Fuga Cloud"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"FUGA"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"fuga"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"HuaweiCloud"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"HuaweiCloud"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"huaweicloud"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"OVH"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"OVH"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"ovh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"OpenTelekomCloud"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"T-Systems"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"otc"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"pluscloud open"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"plusserver"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"pluscloudopen"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"pluscloud SCS Test"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"plusserver"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"gx-scs"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"REGIO.cloud"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"OSISM"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"regiocloud"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"REGIO.cloud"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"OSISM"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"regio-fast"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"boot from NVMe SSD backed volumes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Wavestack"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"noris network"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"wavestack"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["For each cloud provider listed in the table, a predefined profile is available in the\n",(0,n.jsx)(t.code,{children:"terraform/environments"})," directory. This profile contains the name of the public\nnetwork, which flavors to use, etc."]}),"\n",(0,n.jsxs)(t.p,{children:["Here is an example from the profile for ",(0,n.jsx)(t.a,{href:"https://regio.digital",children:"REGIO.cloud"}),"."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-text",children:'flavor_manager = "SCS-4V-16-50"\nflavor_node = "SCS-8V-32-50"\nvolume_type = "ssd"\nimage = "Ubuntu 22.04"\nimage_node = "Ubuntu 22.04"\npublic = "public"\navailability_zone = "nova"\nvolume_availability_zone = "nova"\nnetwork_availability_zone = "nova"\n'})}),"\n",(0,n.jsx)(t.h3,{id:"cloud-resources",children:"Cloud resources"}),"\n",(0,n.jsx)(t.p,{children:"The OSISM Testbed requires at least the following project quota when using the default flavors:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Quantity"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Resource"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Note"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"4"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Instances"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"28 VCPUs + 112 GByte RAM (3 modes, 1 manager)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"9"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Volumes"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"90 GByte volume storage"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"1"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Floating IP"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"1"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Keypair"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"3"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Security group"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"16"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Security group rules"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"1"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Network"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"1"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Subetwork"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"6"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Ports"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"1"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Router"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"software",children:"Software"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"make"})," must be installed on the system"]}),"\n",(0,n.jsxs)(t.li,{children:["Wireguard or ",(0,n.jsx)(t.code,{children:"sshuttle"})," must be installed on your system for VPN access"]}),"\n",(0,n.jsxs)(t.li,{children:["Python must be installed, the Python version used must be at least 3.10, otherwise\nthe current Ansible release cannot be used (details in the\n",(0,n.jsx)(t.a,{href:"https://docs.ansible.com/ansible/latest/reference_appendices/release_and_maintenance.html#ansible-core-support-matrix",children:"Ansible support matrix"}),")"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"python3-venv"})," must be installed for managing Python dependencies like Ansible"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"deployment",children:"Deployment"}),"\n",(0,n.jsx)(t.p,{children:"This section describes step by step how to deploy the OSISM Testbed."}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Request access from the administrator of the respective cloud or get access to an OpenStack cloud."}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Clone the ",(0,n.jsx)(t.a,{href:"https://github.com/osism/testbed",children:"osism/testbed"})," repository."]}),"\n",(0,n.jsx)(t.p,{children:"The repository can also be cloned to any other location."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"mkdir -p ~/src/github.com/osism\ngit clone https://github.com/osism/testbed ~/src/github.com/osism/testbed\ncd ~/src/github.com/osism/testbed\n"})}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Configure your cloud access profile"}),"\n",(0,n.jsxs)(t.p,{children:["The access data for the cloud provider used is stored in ",(0,n.jsx)(t.code,{children:"terraform/clouds.yaml"})," and (optionally)\nin ",(0,n.jsx)(t.code,{children:"terraform/secure.yaml"})," (same structure, if you want to store credentials on a separate place)."]}),"\n",(0,n.jsxs)(t.p,{children:["In file ",(0,n.jsx)(t.a,{href:"https://github.com/osism/testbed/blob/main/terraform/clouds.yaml.sample",children:"terraform/clouds.yaml.sample"}),"\nyou will find examples of typical setups. Settings that are identical for all users of a cloud can be defined\ncentrally via the profiles of the file\n",(0,n.jsx)(t.a,{href:"https://github.com/osism/testbed/blob/main/terraform/clouds-public.yaml",children:"terraform/clouds-public.yaml"}),".\nYou can reference these settings by using the ",(0,n.jsx)(t.code,{children:"profile"})," parameter in cloud-specific\ndefinition in ",(0,n.jsx)(t.code,{children:"terraform/clouds.yaml"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["The user specific settings of the ",(0,n.jsx)(t.code,{children:"clouds.yaml"})," file are provided by the cloud provider. Please check the\ndocumentation of the cloud provider you are using or their support for details."]}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://regio.digital",children:"REGIO.cloud"})," is used as an example here. The cloud name in ",(0,n.jsx)(t.code,{children:"clouds.yaml"}),"\nand the environment name (value of ",(0,n.jsx)(t.code,{children:"ENVIRONMENT"}),") are ",(0,n.jsx)(t.code,{children:"regiocloud"})," in this case. It is important that\nthe name of the cloud in ",(0,n.jsx)(t.code,{children:"clouds.yaml"})," matches the name of the environment to be used. The names must\nbe identical. It is currently not possible to name the cloud ",(0,n.jsx)(t.code,{children:"regiocloud-123"})," in ",(0,n.jsx)(t.code,{children:"clouds.yaml"})," if the\nenvironment is ",(0,n.jsx)(t.code,{children:"regiocloud"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["If another cloud is used, replace ",(0,n.jsx)(t.code,{children:"regiocloud"})," with the respective profile name ",(0,n.jsx)(t.a,{href:"#cloud-access",children:"from the table above"}),"."]}),"\n",(0,n.jsxs)(i.Z,{children:[(0,n.jsxs)(r.Z,{value:"testbed-cloud-access-with-app-credentials",label:"Application Credentials",children:[(0,n.jsxs)(t.p,{children:["The use of application credentials is preferred. This way it is not necessary to store\ndetails like username, project name or sensitive information like the password in the\n",(0,n.jsx)(t.code,{children:"clouds.yaml"})," file."]}),(0,n.jsxs)(t.p,{children:["The application credentials can be found in Horizon under ",(0,n.jsx)(t.strong,{children:"Identity"}),". Use ",(0,n.jsx)(t.code,{children:"OSISM Testbed"})," as\nname and click ",(0,n.jsx)(t.code,{children:"Create Application Credential"}),"."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",metastring:'title="terraform/clouds.yaml"',children:'clouds:\n regiocloud:\n profile: regiocloud\n auth:\n application_credential_id: ID\n application_credential_secret: SECRET\n auth_type: "v3applicationcredential"\n'})}),(0,n.jsxs)(t.p,{children:["If you want to make use of ",(0,n.jsx)(t.code,{children:"terraform/secure.yaml"})," add your application credential secret there\ninstead of ",(0,n.jsx)(t.code,{children:"terraform/clouds.yaml"}),"."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",metastring:'title="terraform/secure.yaml"',children:"clouds:\n regiocloud:\n auth:\n application_credential_secret: SECRET\n"})})]}),(0,n.jsxs)(r.Z,{value:"testbed-cloud-access-with-username-password",label:"Username/Password",children:[(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",metastring:'title="terraform/clouds.yaml"',children:"clouds:\n regiocloud:\n profile: regiocloud\n auth:\n project_name: PROJECT\n username: USERNAME\n project_domain_name: DOMAIN\n user_domain_name: DOMAIN\n"})}),(0,n.jsxs)(t.p,{children:["If you want to make use of ",(0,n.jsx)(t.code,{children:"terraform/secure.yaml"})," add your password there instead of ",(0,n.jsx)(t.code,{children:"terraform/clouds.yaml"}),"."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",metastring:'title="terraform/secure.yaml"',children:"clouds:\n regiocloud:\n auth:\n password: PASSWORD\n"})})]})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Prepare the deployment."}),"\n",(0,n.jsxs)(t.p,{children:["The versions of Ansible and ",(0,n.jsx)(t.a,{href:"https://opentofu.org",children:"OpenTofu"})," are managed\nautomatically and necessary dependencies are cloned."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"make prepare\n"})}),"\n",(0,n.jsxs)(t.p,{children:["If any error occurs during preparation and you want to run the preparation\nagain, it is important to run ",(0,n.jsx)(t.code,{children:"make wipe-local-install"})," first. Otherwise the\npreparation will not be redone completely and necessary parts will be missing\nlater on."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Create the infrastructure with OpenTofu."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"make ENVIRONMENT=regiocloud create\n"})}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Deploy the OSISM manager and bootstrap all nodes."}),"\n",(0,n.jsxs)(i.Z,{children:[(0,n.jsx)(r.Z,{value:"testbed-deploy-latst",label:"Deploy latest manager version",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"make ENVIRONMENT=regiocloud manager\n"})})}),(0,n.jsx)(r.Z,{value:"testbed-deploy-stable",label:"Deploy a stable manager version",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"make ENVIRONMENT=regiocloud VERSION_MANAGER=7.0.3 manager\n"})})})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"After the bootstrap, you can log in to the manager via SSH."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"make ENVIRONMENT=regiocloud login\n"})}),"\n",(0,n.jsx)(t.p,{children:"Yo can log in to the nodes of the cluster via the manager."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"osism console testbed-node-0\n"})}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Deploy all services."}),"\n",(0,n.jsxs)(i.Z,{children:[(0,n.jsxs)(r.Z,{value:"testbed-deploy-multi-steps",label:"Deployment in single steps",children:[(0,n.jsxs)(t.p,{children:["It is also possible to deploy the services step by step on the\nmanager. To do this, first log in to the manager with ",(0,n.jsx)(t.code,{children:"make ENVIRONMENT=regiocloud login"}),"\nand then execute the deploy scripts one after the other. It is recommended to do this\nwithin a screen session."]}),(0,n.jsx)(t.p,{children:"Deploying the services takes some time and depends on how much bandwidth is available,\nhow the instances are equipped, etc. 90-120 minutes is not unusual when Ceph and OpenStack\nare fully deployed."}),(0,n.jsxs)(t.p,{children:["To speed up the Ansible playbooks, ",(0,n.jsx)(t.a,{href:"https://ara.recordsansible.org",children:"ARA"})," can be disabled. This\nis done by executing ",(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/disable-ara.sh"}),". Run this script ",(0,n.jsx)(t.strong,{children:"before"})," the deployment scripts.\nAfterwards no more logs are available in the ARA web\ninterface. To re-enable ARA use ",(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/enable-ara.sh"}),"."]}),(0,n.jsxs)(t.p,{children:["There is also the option of pre-population of images with ",(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/pull-images.sh"}),"\nso that deployments do not have to be lengthy. Run this script ",(0,n.jsx)(t.strong,{children:"before"})," the deployment scripts."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"/opt/configuration/scripts/deploy/001-helper-services.sh\n/opt/configuration/scripts/deploy/005-kubernetes.sh\n/opt/configuration/scripts/deploy/100-ceph-services-basic.sh\n/opt/configuration/scripts/deploy/200-infrastructure-services-basic.sh\n/opt/configuration/scripts/deploy/300-openstack-services-basic.sh\n/opt/configuration/scripts/deploy/400-monitoring-services.sh\n"})}),(0,n.jsxs)(t.p,{children:["Prepare OpenStack resources like public network, flavors and images by running\n",(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/bootstrap.sh"}),". Run this script ",(0,n.jsx)(t.strong,{children:"after"})," the deployment scripts."]}),(0,n.jsxs)(t.admonition,{type:"info",children:[(0,n.jsxs)(t.p,{children:["If you only want to deploy the monitoring services with ",(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/400-monitoring-services.sh"}),",\na few dependencies must be deployed first. You can then use the monitoring services without having to install a\ncomplete OpenStack & Ceph environment."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"osism apply common\nosism apply loadbalancer\nosism apply opensearch\nosism apply mariadb\n"})})]})]}),(0,n.jsxs)(r.Z,{value:"testbed-deploy-single-step",label:"Deployment of all services",children:[(0,n.jsx)(t.p,{children:"In this single step deployment, Ceph, OpenStack and all necessary\ninfrastructure services (MariaDB, RabbitMQ, ...) are deployed.\nDepending on the cloud, the deployment will take some time. Up to two hours is not unusual."}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"make ENVIRONMENT=regiocloud deploy\n"})})]})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["If you want to verify the deployment with ",(0,n.jsx)(t.a,{href:"https://opendev.org/openinfra/refstack",children:"refstack"})," run\n",(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/check.sh"}),". This step will take some time and is optional."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"The machine images required for the use of Kubernetes Cluster API and the amphora driver of OpenStack Octavia\nservice are not provided by default to save resources on the OSISM Testbed and improve deployment time.\nThese can be provisioned if required."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"/opt/configuration/scripts/bootstrap/301-openstack-octavia-amhpora-image.sh\n/opt/configuration/scripts/bootstrap/302-openstack-k8s-clusterapi-images.sh\n"})}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"If you want you can create a test project with a test user after login. It also\ncreates an instance with a volume attached to a network with a router. This step is optional."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"osism apply --environment openstack test\n"})}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"When the OSISM Testbed is no longer needed, it can be deleted."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"make ENVIRONMENT=regiocloud clean\n"})}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(t.p,{children:"Deployment must be completed at this point."}),"\n",(0,n.jsx)(t.h3,{id:"custom-ca",children:"Custom CA"}),"\n",(0,n.jsxs)(t.p,{children:["The OSISM Testbed deployment currently uses hostnames in the domain ",(0,n.jsx)(t.code,{children:"testbed.osism.xyz"}),". This is a real domain\nand we provide the DNS records matching the addresses used in the OSISM Testbed, so that once you connect to your testbed via a direct\nlink or Wireguard, you can access hosts and servers by their hostname (e.g. ",(0,n.jsx)(t.code,{children:"ssh testbed-manager.testbed.osism.xyz"}),")."]}),"\n",(0,n.jsxs)(t.p,{children:["We also provide a wildcard TLS certificate signed by a custom CA for ",(0,n.jsx)(t.code,{children:"testbed.osism.xyz"})," and ",(0,n.jsx)(t.code,{children:"*.testbed.osism.xyz"}),".\nThis CA is always used for each testbed. The CA is not regenerated and it is not planned to change this for the next 10 years."]}),"\n",(0,n.jsxs)(t.p,{children:["In order for these certificates to be recognized locally as valid, the CA\n",(0,n.jsx)(t.a,{href:"https://raw.githubusercontent.com/osism/testbed/main/environments/kolla/certificates/ca/testbed.crt",children:"environments/kolla/certificates/ca/testbed.crt"}),"\nmust be imported locally."]}),"\n",(0,n.jsx)(t.h3,{id:"vpn-access",children:"VPN access"}),"\n",(0,n.jsx)(t.h4,{id:"wireguard",children:"Wireguard"}),"\n",(0,n.jsxs)(t.p,{children:["Install wireguard on your workstation, if you have not done this before. For instructions how to do\nit on your workstation, please have a look on the documentation of your used distribution. The\nwireguard documentation you will find ",(0,n.jsx)(t.a,{href:"https://www.wireguard.com",children:"here"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"Start the wireguard tunnel.\n(Press CTRL+c to keep the tunnel running forever. The make target also launches a browser tab with references to all services)"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"make vpn-wireguard ENVIRONMENT=regiocloud\n"})}),"\n",(0,n.jsx)(t.p,{children:"If you want to connect to the OSISM Testbed from multiple clients, change the client IP\naddress in the downloaded configuration file to be different on each client."}),"\n",(0,n.jsxs)(t.p,{children:["If you only want to download the Wireguard configuration, you can use the ",(0,n.jsx)(t.code,{children:"vpn-wireguard-config"}),"\ntarget. The configuration is then available in the file ",(0,n.jsx)(t.code,{children:"wg-testbed-regiocloud.conf"}),", for example."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"make vpn-wireguard-config ENVIRONMENT=regiocloud\n"})}),"\n",(0,n.jsx)(t.h4,{id:"sshuttle",children:"sshuttle"}),"\n",(0,n.jsxs)(t.p,{children:["If you do not want to use Wireguard you can also work with ",(0,n.jsx)(t.a,{href:"https://github.com/sshuttle/sshuttle",children:"sshuttle"}),"."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"make vpn-sshuttle ENVIRONMENT=regiocloud\nkillall sshuttle\n"})}),"\n",(0,n.jsxs)(t.h3,{id:"static-entries-in-etchosts",children:["Static entries in ",(0,n.jsx)(t.code,{children:"/etc/hosts"})]}),"\n",(0,n.jsxs)(t.p,{children:["If you are unable to access the following domains, you can customize your local ",(0,n.jsx)(t.code,{children:"/etc/hosts"}),"\nwith the following static entries. This may be necessary, for example, if you use Pi-hole and\nall DNS entries from a public DNS with a non-public IP address are filtered."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"# OSISM Testbed hosts\n192.168.16.5 ara.testbed.osism.xyz ara\n192.168.16.5 cgit.testbed.osism.xyz cgit\n192.168.16.5 flower.testbed.osism.xyz flower\n192.168.16.5 homer.testbed.osism.xyz homer\n192.168.16.5 netbox.testbed.osism.xyz netbox\n192.168.16.5 testbed-manager.testbed.osism.xyz testbed-manager\n192.168.16.5 nexus.testbed.osism.xyz nexus\n192.168.16.5 phpmyadmin.testbed.osism.xyz phpmyadmin\n192.168.16.9 api-int.testbed.osism.xyz api-int\n192.168.16.10 testbed-node-0.testbed.osism.xyz testbed-node-0\n192.168.16.11 testbed-node-1.testbed.osism.xyz testbed-node-1\n192.168.16.12 testbed-node-2.testbed.osism.xyz testbed-node-2\n192.168.16.13 testbed-node-3.testbed.osism.xyz testbed-node-3\n192.168.16.14 testbed-node-4.testbed.osism.xyz testbed-node-4\n192.168.16.15 testbed-node-5.testbed.osism.xyz testbed-node-5\n192.168.16.16 testbed-node-6.testbed.osism.xyz testbed-node-6\n192.168.16.17 testbed-node-7.testbed.osism.xyz testbed-node-7\n192.168.16.18 testbed-node-8.testbed.osism.xyz testbed-node-8\n192.168.16.19 testbed-node-9.testbed.osism.xyz testbed-node-9\n192.168.16.100 keycloak.testbed.osism.xyz keycloak\n192.168.16.254 api.testbed.osism.xyz api\n"})}),"\n",(0,n.jsx)(t.h3,{id:"webinterfaces",children:"Webinterfaces"}),"\n",(0,n.jsxs)(t.p,{children:["All SSL enabled services within the OSISM Testbed use certs which are signed by the self-signed\n",(0,n.jsx)(t.a,{href:"https://raw.githubusercontent.com/osism/testbed/main/environments/kolla/certificates/ca/testbed.crt",children:"OSISM Testbed CA"}),"\n(Download the file and import it as certification authority to your browser)."]}),"\n",(0,n.jsx)(t.p,{children:"If you want to access the services please choose the URL from the following table."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Name"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"URL"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Username"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Password"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Note"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"ARA"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://ara.testbed.osism.xyz",children:"https://ara.testbed.osism.xyz"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"ara"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Ceph"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://api-int.testbed.osism.xyz:8140",children:"https://api-int.testbed.osism.xyz:8140"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"admin"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Flower"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://flower.testbed.osism.xyz",children:"https://flower.testbed.osism.xyz"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}}),(0,n.jsx)(t.td,{style:{textAlign:"left"}}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Grafana"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://api-int.testbed.osism.xyz:3000",children:"https://api-int.testbed.osism.xyz:3000"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"admin"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"HAProxy (testbed-node-0)"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"http://testbed-node-0.testbed.osism.xyz:1984",children:"http://testbed-node-0.testbed.osism.xyz:1984"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"openstack"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"HAProxy (testbed-node-1)"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"http://testbed-node-1.testbed.osism.xyz:1984",children:"http://testbed-node-1.testbed.osism.xyz:1984"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"openstack"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"HAProxy (testbed-node-2)"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"http://testbed-node-2.testbed.osism.xyz:1984",children:"http://testbed-node-2.testbed.osism.xyz:1984"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"openstack"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Homer"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://homer.testbed.osism.xyz",children:"https://homer.testbed.osism.xyz"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}}),(0,n.jsx)(t.td,{style:{textAlign:"left"}}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Horizon (via Keycloak)"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://api.testbed.osism.xyz",children:"https://api.testbed.osism.xyz"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"alice"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Horizon (via Keystone)"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://api.testbed.osism.xyz",children:"https://api.testbed.osism.xyz"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"admin"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"domain: default"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Horizon (via Keystone)"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://api.testbed.osism.xyz",children:"https://api.testbed.osism.xyz"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"test"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"test"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"domain: test"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Keycloak"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://keycloak.testbed.osism.xyz/auth",children:"https://keycloak.testbed.osism.xyz/auth"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"admin"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Netbox"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://netbox.testbed.osism.xyz",children:"https://netbox.testbed.osism.xyz"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"admin"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Netdata"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"http://testbed-manager.testbed.osism.xyz:19999",children:"http://testbed-manager.testbed.osism.xyz:19999"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}}),(0,n.jsx)(t.td,{style:{textAlign:"left"}}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Nexus"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://nexus.testbed.osism.xyz",children:"https://nexus.testbed.osism.xyz"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"admin"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"OpenSearch Dashboards"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://api.testbed.osism.xyz:5601",children:"https://api.testbed.osism.xyz:5601"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"opensearch"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Prometheus"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://api-int.testbed.osism.xyz:9091",children:"https://api-int.testbed.osism.xyz:9091"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"admin"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"RabbitMQ"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://api-int.testbed.osism.xyz:15672",children:"https://api-int.testbed.osism.xyz:15672"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"openstack"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"phpMyAdmin"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://phpmyadmin.testbed.osism.xyz",children:"https://phpmyadmin.testbed.osism.xyz"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"root"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"authentication-with-oidc",children:"Authentication with OIDC"}),"\n",(0,n.jsx)(t.p,{children:"Authentication with OpenID Connect (OIDC) is possible via Keycloak, which is automatically configured for the OIDC mechanism."}),"\n",(0,n.jsx)(t.h4,{id:"openstack-web-dashboard-horizon-login-via-oidc",children:"OpenStack web dashboard (Horizon) login via OIDC"}),"\n",(0,n.jsxs)(t.p,{children:["For logging in via OIDC, open your browser at OpenStack Dashboard Login Page, select ",(0,n.jsx)(t.strong,{children:"Authenticate via Keycloak"}),", after being\nredirected to the Keycloak login page, perform the login with the credentials ",(0,n.jsx)(t.strong,{children:"alice"})," and ",(0,n.jsx)(t.strong,{children:"password"}),".\nAfter that you will be redirected back to the Horizon dashboard, where you will be logged in with the user ",(0,n.jsx)(t.strong,{children:"alice"}),"."]}),"\n",(0,n.jsx)(t.h4,{id:"openstack-web-dashboard-horizon-logout",children:"OpenStack web dashboard (Horizon) logout"}),"\n",(0,n.jsxs)(t.p,{children:["Keep in mind, that clicking ",(0,n.jsx)(t.strong,{children:"Sign Out"})," on the Horizon dashboard currently doesn't revoke your OIDC token, and any consequent\nattempt to ",(0,n.jsx)(t.strong,{children:"Authenticate via Keycloak"})," will succeed without providing the credentials."]}),"\n",(0,n.jsx)(t.p,{children:"The expiration time of the Single Sign On tokens can be controlled on multiple levels in Keycloak."}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["On realm level under ",(0,n.jsx)(t.em,{children:"Realm Settings"})," > ",(0,n.jsx)(t.em,{children:"Tokens"}),".\nAssuming the ",(0,n.jsx)(t.em,{children:"keycloak_realm"})," ansible variable is the default ",(0,n.jsx)(t.em,{children:"osism"}),", and keycloak is listening on\n",(0,n.jsx)(t.a,{href:"https://keycloak.testbed.osism.xyz",children:"keycloak.testbed.osism.xyz"}),", then the configuration form is available\n",(0,n.jsx)(t.a,{href:"https://keycloak.testbed.osism.xyz/auth/admin/master/console/#/realms/osism/token-settings",children:"here"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["Detailed information is available in the Keycloak Server Administrator Documentation\n",(0,n.jsx)(t.a,{href:"https://www.keycloak.org/docs/latest/server_admin/#_timeouts",children:"Session and Token Timeouts"})," section."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["In a realm down on the ",(0,n.jsx)(t.a,{href:"https://keycloak.testbed.osism.xyz/auth/admin/master/console/#/realms/osism/clients",children:"client level"}),"\nselect the client (keystone), and under ",(0,n.jsx)(t.em,{children:"Settings"})," > ",(0,n.jsx)(t.em,{children:"Advanced Settings"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["It is recommended to keep the ",(0,n.jsx)(t.em,{children:"Access Token Lifespan"})," on a relatively low value, with the trend of blocking third party\ncookies. For further information see the Keycloak documentation's ",(0,n.jsx)(t.a,{href:"https://www.keycloak.org/docs/latest/securing_apps/#browsers-with-blocked-third-party-cookies",children:"Browsers with Blocked Third-Party Cookies"})," section."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h4,{id:"usage-of-the-openstack-cli",children:"Usage of the OpenStack CLI"}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"environments/openstack"})," folder contains the needed files for the openstack client:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"cd environments/openstack\nexport OS_CLOUD=/etc/hosts
",id:"static-entries-in-etchosts",level:3},{value:"Webinterfaces",id:"webinterfaces",level:3},{value:"Authentication with OIDC",id:"authentication-with-oidc",level:3},{value:"OpenStack web dashboard (Horizon) login via OIDC",id:"openstack-web-dashboard-horizon-login-via-oidc",level:4},{value:"OpenStack web dashboard (Horizon) logout",id:"openstack-web-dashboard-horizon-logout",level:4},{value:"Usage of the OpenStack CLI",id:"usage-of-the-openstack-cli",level:4},{value:"OpenStack CLI operations with OpenID Connect password",id:"openstack-cli-operations-with-openid-connect-password",level:4},{value:"OpenStack CLI token issue with OpenID Connect",id:"openstack-cli-token-issue-with-openid-connect",level:4},{value:"Advanced Usage",id:"advanced-usage",level:2},{value:"External API",id:"external-api",level:3},{value:"Change versions",id:"change-versions",level:3},{value:"Deploy services",id:"deploy-services",level:3},{value:"Upgrade services",id:"upgrade-services",level:3},{value:"Ceph via Rook (technical preview)",id:"ceph-via-rook-technical-preview",level:3},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Ansible errors",id:"ansible-errors",level:3},{value:"Unsupported locale setting",id:"unsupported-locale-setting",level:3},{value:"Appendix",id:"appendix",level:2},{value:"Configuration",id:"configuration",level:3},{value:"Variables",id:"variables",level:4},{value:"Overrides",id:"overrides",level:4},{value:"Customisations",id:"customisations",level:4},{value:"Notes",id:"notes",level:3},{value:"Supported releases",id:"supported-releases",level:3},{value:"Included services",id:"included-services",level:3},{value:"Infrastructure",id:"infrastructure",level:4},{value:"OpenStack",id:"openstack",level:4},{value:"Makefile reference",id:"makefile-reference",level:3},{value:"CI jobs",id:"ci-jobs",level:3}];function x(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"testbed",children:"Testbed"}),"\n",(0,n.jsxs)(t.p,{children:["With the OSISM Testbed, it is possible to run a full Sovereign Cloud Stack\ndeployment on an existing OpenStack environment such as Cleura or ",(0,n.jsx)(t.a,{href:"https://regio.digital",children:"REGIO.cloud"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["OSISM is the reference implementation for the Infrastructure as a Service (IaaS) layer in the\n",(0,n.jsx)(t.a,{href:"https://scs.community",children:"Sovereign Cloud Stack"})," (SCS) project. The OSISM Testbed is therefore\nused in the SCS project to test and work on the Instrastructure as a Service layer."]}),"\n",(0,n.jsx)(t.p,{children:"The OSISM Testbed is intended as a playground. Further services and integration will\nbe added over time. A increasing number of best practices and experiences from the productive\ndeployments will be included here in the future. It will become more production-like\nover time. However, at no point does it claim to represent a production setup exactly."}),"\n",(0,n.jsx)(t.h2,{id:"requirements",children:"Requirements"}),"\n",(0,n.jsx)(t.h3,{id:"cloud-access",children:"Cloud access"}),"\n",(0,n.jsx)(t.p,{children:"The usual prerequisite is to have an account on one of the supported OpenStack cloud providers.\nAs the OSISM Testbed also virtualizes systems itself, the OpenStack cluster should provide\nthe capabilities for nested virtualization."}),"\n",(0,n.jsx)(t.p,{children:"It is not part of this guide to describe the registration with the individual cloud\nproviders. Please contact the respective cloud provider for this."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Product"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Provider"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Profile name"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Note"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Cleura"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Cleura"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"cleura"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Fuga Cloud"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"FUGA"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"fuga"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"HuaweiCloud"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"HuaweiCloud"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"huaweicloud"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"OVH"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"OVH"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"ovh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"OpenTelekomCloud"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"T-Systems"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"otc"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"pluscloud open"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"plusserver"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"pluscloudopen"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"pluscloud SCS Test"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"plusserver"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"gx-scs"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"REGIO.cloud"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"OSISM"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"regiocloud"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"REGIO.cloud"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"OSISM"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"regio-fast"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"boot from NVMe SSD backed volumes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Wavestack"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"noris network"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"wavestack"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["For each cloud provider listed in the table, a predefined profile is available in the\n",(0,n.jsx)(t.code,{children:"terraform/environments"})," directory. This profile contains the name of the public\nnetwork, which flavors to use, etc."]}),"\n",(0,n.jsxs)(t.p,{children:["Here is an example from the profile for ",(0,n.jsx)(t.a,{href:"https://regio.digital",children:"REGIO.cloud"}),"."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-text",children:'flavor_manager = "SCS-4V-16-50"\nflavor_node = "SCS-8V-32-50"\nvolume_type = "ssd"\nimage = "Ubuntu 22.04"\nimage_node = "Ubuntu 22.04"\npublic = "public"\navailability_zone = "nova"\nvolume_availability_zone = "nova"\nnetwork_availability_zone = "nova"\n'})}),"\n",(0,n.jsx)(t.h3,{id:"cloud-resources",children:"Cloud resources"}),"\n",(0,n.jsx)(t.p,{children:"The OSISM Testbed requires at least the following project quota when using the default flavors:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Quantity"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Resource"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Note"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"4"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Instances"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"28 VCPUs + 112 GByte RAM (3 modes, 1 manager)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"9"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Volumes"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"90 GByte volume storage"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"1"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Floating IP"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"1"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Keypair"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"3"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Security group"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"16"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Security group rules"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"1"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Network"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"1"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Subetwork"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"6"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Ports"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"1"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Router"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"software",children:"Software"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"make"})," must be installed on the system"]}),"\n",(0,n.jsxs)(t.li,{children:["Wireguard or ",(0,n.jsx)(t.code,{children:"sshuttle"})," must be installed on your system for VPN access"]}),"\n",(0,n.jsxs)(t.li,{children:["Python must be installed, the Python version used must be at least 3.10, otherwise\nthe current Ansible release cannot be used (details in the\n",(0,n.jsx)(t.a,{href:"https://docs.ansible.com/ansible/latest/reference_appendices/release_and_maintenance.html#ansible-core-support-matrix",children:"Ansible support matrix"}),")"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"python3-venv"})," must be installed for managing Python dependencies like Ansible"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"deployment",children:"Deployment"}),"\n",(0,n.jsx)(t.p,{children:"This section describes step by step how to deploy the OSISM Testbed."}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Request access from the administrator of the respective cloud or get access to an OpenStack cloud."}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Clone the ",(0,n.jsx)(t.a,{href:"https://github.com/osism/testbed",children:"osism/testbed"})," repository."]}),"\n",(0,n.jsx)(t.p,{children:"The repository can also be cloned to any other location."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"mkdir -p ~/src/github.com/osism\ngit clone https://github.com/osism/testbed ~/src/github.com/osism/testbed\ncd ~/src/github.com/osism/testbed\n"})}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Configure your cloud access profile"}),"\n",(0,n.jsxs)(t.p,{children:["The access data for the cloud provider used is stored in ",(0,n.jsx)(t.code,{children:"terraform/clouds.yaml"})," and (optionally)\nin ",(0,n.jsx)(t.code,{children:"terraform/secure.yaml"})," (same structure, if you want to store credentials on a separate place)."]}),"\n",(0,n.jsxs)(t.p,{children:["In file ",(0,n.jsx)(t.a,{href:"https://github.com/osism/testbed/blob/main/terraform/clouds.yaml.sample",children:"terraform/clouds.yaml.sample"}),"\nyou will find examples of typical setups. Settings that are identical for all users of a cloud can be defined\ncentrally via the profiles of the file\n",(0,n.jsx)(t.a,{href:"https://github.com/osism/testbed/blob/main/terraform/clouds-public.yaml",children:"terraform/clouds-public.yaml"}),".\nYou can reference these settings by using the ",(0,n.jsx)(t.code,{children:"profile"})," parameter in cloud-specific\ndefinition in ",(0,n.jsx)(t.code,{children:"terraform/clouds.yaml"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["The user specific settings of the ",(0,n.jsx)(t.code,{children:"clouds.yaml"})," file are provided by the cloud provider. Please check the\ndocumentation of the cloud provider you are using or their support for details."]}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://regio.digital",children:"REGIO.cloud"})," is used as an example here. The cloud name in ",(0,n.jsx)(t.code,{children:"clouds.yaml"}),"\nand the environment name (value of ",(0,n.jsx)(t.code,{children:"ENVIRONMENT"}),") are ",(0,n.jsx)(t.code,{children:"regiocloud"})," in this case. It is important that\nthe name of the cloud in ",(0,n.jsx)(t.code,{children:"clouds.yaml"})," matches the name of the environment to be used. The names must\nbe identical. It is currently not possible to name the cloud ",(0,n.jsx)(t.code,{children:"regiocloud-123"})," in ",(0,n.jsx)(t.code,{children:"clouds.yaml"})," if the\nenvironment is ",(0,n.jsx)(t.code,{children:"regiocloud"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["If another cloud is used, replace ",(0,n.jsx)(t.code,{children:"regiocloud"})," with the respective profile name ",(0,n.jsx)(t.a,{href:"#cloud-access",children:"from the table above"}),"."]}),"\n",(0,n.jsxs)(i.Z,{children:[(0,n.jsxs)(r.Z,{value:"testbed-cloud-access-with-app-credentials",label:"Application Credentials",children:[(0,n.jsxs)(t.p,{children:["The use of application credentials is preferred. This way it is not necessary to store\ndetails like username, project name or sensitive information like the password in the\n",(0,n.jsx)(t.code,{children:"clouds.yaml"})," file."]}),(0,n.jsxs)(t.p,{children:["The application credentials can be found in Horizon under ",(0,n.jsx)(t.strong,{children:"Identity"}),". Use ",(0,n.jsx)(t.code,{children:"OSISM Testbed"})," as\nname and click ",(0,n.jsx)(t.code,{children:"Create Application Credential"}),"."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",metastring:'title="terraform/clouds.yaml"',children:'clouds:\n regiocloud:\n profile: regiocloud\n auth:\n application_credential_id: ID\n application_credential_secret: SECRET\n auth_type: "v3applicationcredential"\n'})}),(0,n.jsxs)(t.p,{children:["If you want to make use of ",(0,n.jsx)(t.code,{children:"terraform/secure.yaml"})," add your application credential secret there\ninstead of ",(0,n.jsx)(t.code,{children:"terraform/clouds.yaml"}),"."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",metastring:'title="terraform/secure.yaml"',children:"clouds:\n regiocloud:\n auth:\n application_credential_secret: SECRET\n"})})]}),(0,n.jsxs)(r.Z,{value:"testbed-cloud-access-with-username-password",label:"Username/Password",children:[(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",metastring:'title="terraform/clouds.yaml"',children:"clouds:\n regiocloud:\n profile: regiocloud\n auth:\n project_name: PROJECT\n username: USERNAME\n project_domain_name: DOMAIN\n user_domain_name: DOMAIN\n"})}),(0,n.jsxs)(t.p,{children:["If you want to make use of ",(0,n.jsx)(t.code,{children:"terraform/secure.yaml"})," add your password there instead of ",(0,n.jsx)(t.code,{children:"terraform/clouds.yaml"}),"."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",metastring:'title="terraform/secure.yaml"',children:"clouds:\n regiocloud:\n auth:\n password: PASSWORD\n"})})]})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Prepare the deployment."}),"\n",(0,n.jsxs)(t.p,{children:["The versions of Ansible and ",(0,n.jsx)(t.a,{href:"https://opentofu.org",children:"OpenTofu"})," are managed\nautomatically and necessary dependencies are cloned."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"make prepare\n"})}),"\n",(0,n.jsxs)(t.p,{children:["If any error occurs during preparation and you want to run the preparation\nagain, it is important to run ",(0,n.jsx)(t.code,{children:"make wipe-local-install"})," first. Otherwise the\npreparation will not be redone completely and necessary parts will be missing\nlater on."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Create the infrastructure with OpenTofu."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"make ENVIRONMENT=regiocloud create\n"})}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Deploy the OSISM manager and bootstrap all nodes."}),"\n",(0,n.jsxs)(i.Z,{children:[(0,n.jsx)(r.Z,{value:"testbed-deploy-latst",label:"Deploy latest manager version",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"make ENVIRONMENT=regiocloud manager\n"})})}),(0,n.jsx)(r.Z,{value:"testbed-deploy-stable",label:"Deploy a stable manager version",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"make ENVIRONMENT=regiocloud VERSION_MANAGER=7.0.3 manager\n"})})})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"After the bootstrap, you can log in to the manager via SSH."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"make ENVIRONMENT=regiocloud login\n"})}),"\n",(0,n.jsx)(t.p,{children:"Yo can log in to the nodes of the cluster via the manager."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"osism console testbed-node-0\n"})}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Deploy all services."}),"\n",(0,n.jsxs)(i.Z,{children:[(0,n.jsxs)(r.Z,{value:"testbed-deploy-multi-steps",label:"Deployment in single steps",children:[(0,n.jsxs)(t.p,{children:["It is also possible to deploy the services step by step on the\nmanager. To do this, first log in to the manager with ",(0,n.jsx)(t.code,{children:"make ENVIRONMENT=regiocloud login"}),"\nand then execute the deploy scripts one after the other. It is recommended to do this\nwithin a screen session."]}),(0,n.jsx)(t.p,{children:"Deploying the services takes some time and depends on how much bandwidth is available,\nhow the instances are equipped, etc. 90-120 minutes is not unusual when Ceph and OpenStack\nare fully deployed."}),(0,n.jsxs)(t.p,{children:["To speed up the Ansible playbooks, ",(0,n.jsx)(t.a,{href:"https://ara.recordsansible.org",children:"ARA"})," can be disabled. This\nis done by executing ",(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/disable-ara.sh"}),". Run this script ",(0,n.jsx)(t.strong,{children:"before"})," the deployment scripts.\nAfterwards no more logs are available in the ARA web\ninterface. To re-enable ARA use ",(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/enable-ara.sh"}),"."]}),(0,n.jsxs)(t.p,{children:["There is also the option of pre-population of images with ",(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/pull-images.sh"}),"\nso that deployments do not have to be lengthy. Run this script ",(0,n.jsx)(t.strong,{children:"before"})," the deployment scripts."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"/opt/configuration/scripts/deploy/001-helper-services.sh\n/opt/configuration/scripts/deploy/005-kubernetes.sh\n/opt/configuration/scripts/deploy/100-ceph-services-basic.sh\n/opt/configuration/scripts/deploy/200-infrastructure-services-basic.sh\n/opt/configuration/scripts/deploy/300-openstack-services-basic.sh\n/opt/configuration/scripts/deploy/400-monitoring-services.sh\n"})}),(0,n.jsxs)(t.p,{children:["Prepare OpenStack resources like public network, flavors and images by running\n",(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/bootstrap.sh"}),". Run this script ",(0,n.jsx)(t.strong,{children:"after"})," the deployment scripts."]}),(0,n.jsxs)(t.admonition,{type:"info",children:[(0,n.jsxs)(t.p,{children:["If you only want to deploy the monitoring services with ",(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/400-monitoring-services.sh"}),",\na few dependencies must be deployed first. You can then use the monitoring services without having to install a\ncomplete OpenStack & Ceph environment."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"osism apply common\nosism apply loadbalancer\nosism apply opensearch\nosism apply mariadb\n"})})]})]}),(0,n.jsxs)(r.Z,{value:"testbed-deploy-single-step",label:"Deployment of all services",children:[(0,n.jsx)(t.p,{children:"In this single step deployment, Ceph, OpenStack and all necessary\ninfrastructure services (MariaDB, RabbitMQ, ...) are deployed.\nDepending on the cloud, the deployment will take some time. Up to two hours is not unusual."}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"make ENVIRONMENT=regiocloud deploy\n"})})]})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["If you want to verify the deployment with ",(0,n.jsx)(t.a,{href:"https://opendev.org/openinfra/refstack",children:"refstack"})," run\n",(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/check.sh"}),". This step will take some time and is optional."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"The machine images required for the use of Kubernetes Cluster API and the amphora driver of OpenStack Octavia\nservice are not provided by default to save resources on the OSISM Testbed and improve deployment time.\nThese can be provisioned if required."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"/opt/configuration/scripts/bootstrap/301-openstack-octavia-amhpora-image.sh\n/opt/configuration/scripts/bootstrap/302-openstack-k8s-clusterapi-images.sh\n"})}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"If you want you can create a test project with a test user after login. It also\ncreates an instance with a volume attached to a network with a router. This step is optional."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"osism apply --environment openstack test\n"})}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"When the OSISM Testbed is no longer needed, it can be deleted."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"make ENVIRONMENT=regiocloud clean\n"})}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(t.p,{children:"Deployment must be completed at this point."}),"\n",(0,n.jsx)(t.h3,{id:"custom-ca",children:"Custom CA"}),"\n",(0,n.jsxs)(t.p,{children:["The OSISM Testbed deployment currently uses hostnames in the domain ",(0,n.jsx)(t.code,{children:"testbed.osism.xyz"}),". This is a real domain\nand we provide the DNS records matching the addresses used in the OSISM Testbed, so that once you connect to your testbed via a direct\nlink or Wireguard, you can access hosts and servers by their hostname (e.g. ",(0,n.jsx)(t.code,{children:"ssh testbed-manager.testbed.osism.xyz"}),")."]}),"\n",(0,n.jsxs)(t.p,{children:["We also provide a wildcard TLS certificate signed by a custom CA for ",(0,n.jsx)(t.code,{children:"testbed.osism.xyz"})," and ",(0,n.jsx)(t.code,{children:"*.testbed.osism.xyz"}),".\nThis CA is always used for each testbed. The CA is not regenerated and it is not planned to change this for the next 10 years."]}),"\n",(0,n.jsxs)(t.p,{children:["In order for these certificates to be recognized locally as valid, the CA\n",(0,n.jsx)(t.a,{href:"https://raw.githubusercontent.com/osism/testbed/main/environments/kolla/certificates/ca/testbed.crt",children:"environments/kolla/certificates/ca/testbed.crt"}),"\nmust be imported locally."]}),"\n",(0,n.jsx)(t.h3,{id:"vpn-access",children:"VPN access"}),"\n",(0,n.jsx)(t.h4,{id:"wireguard",children:"Wireguard"}),"\n",(0,n.jsxs)(t.p,{children:["Install wireguard on your workstation, if you have not done this before. For instructions how to do\nit on your workstation, please have a look on the documentation of your used distribution. The\nwireguard documentation you will find ",(0,n.jsx)(t.a,{href:"https://www.wireguard.com",children:"here"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"Start the wireguard tunnel.\n(Press CTRL+c to keep the tunnel running forever. The make target also launches a browser tab with references to all services)"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"make vpn-wireguard ENVIRONMENT=regiocloud\n"})}),"\n",(0,n.jsx)(t.p,{children:"If you want to connect to the OSISM Testbed from multiple clients, change the client IP\naddress in the downloaded configuration file to be different on each client."}),"\n",(0,n.jsxs)(t.p,{children:["If you only want to download the Wireguard configuration, you can use the ",(0,n.jsx)(t.code,{children:"vpn-wireguard-config"}),"\ntarget. The configuration is then available in the file ",(0,n.jsx)(t.code,{children:"wg-testbed-regiocloud.conf"}),", for example."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"make vpn-wireguard-config ENVIRONMENT=regiocloud\n"})}),"\n",(0,n.jsx)(t.h4,{id:"sshuttle",children:"sshuttle"}),"\n",(0,n.jsxs)(t.p,{children:["If you do not want to use Wireguard you can also work with ",(0,n.jsx)(t.a,{href:"https://github.com/sshuttle/sshuttle",children:"sshuttle"}),"."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"make vpn-sshuttle ENVIRONMENT=regiocloud\nkillall sshuttle\n"})}),"\n",(0,n.jsxs)(t.h3,{id:"static-entries-in-etchosts",children:["Static entries in ",(0,n.jsx)(t.code,{children:"/etc/hosts"})]}),"\n",(0,n.jsxs)(t.p,{children:["If you are unable to access the following domains, you can customize your local ",(0,n.jsx)(t.code,{children:"/etc/hosts"}),"\nwith the following static entries. This may be necessary, for example, if you use Pi-hole and\nall DNS entries from a public DNS with a non-public IP address are filtered."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"# OSISM Testbed hosts\n192.168.16.5 ara.testbed.osism.xyz ara\n192.168.16.5 cgit.testbed.osism.xyz cgit\n192.168.16.5 flower.testbed.osism.xyz flower\n192.168.16.5 homer.testbed.osism.xyz homer\n192.168.16.5 netbox.testbed.osism.xyz netbox\n192.168.16.5 testbed-manager.testbed.osism.xyz testbed-manager\n192.168.16.5 nexus.testbed.osism.xyz nexus\n192.168.16.5 phpmyadmin.testbed.osism.xyz phpmyadmin\n192.168.16.9 api-int.testbed.osism.xyz api-int\n192.168.16.10 testbed-node-0.testbed.osism.xyz testbed-node-0\n192.168.16.11 testbed-node-1.testbed.osism.xyz testbed-node-1\n192.168.16.12 testbed-node-2.testbed.osism.xyz testbed-node-2\n192.168.16.13 testbed-node-3.testbed.osism.xyz testbed-node-3\n192.168.16.14 testbed-node-4.testbed.osism.xyz testbed-node-4\n192.168.16.15 testbed-node-5.testbed.osism.xyz testbed-node-5\n192.168.16.16 testbed-node-6.testbed.osism.xyz testbed-node-6\n192.168.16.17 testbed-node-7.testbed.osism.xyz testbed-node-7\n192.168.16.18 testbed-node-8.testbed.osism.xyz testbed-node-8\n192.168.16.19 testbed-node-9.testbed.osism.xyz testbed-node-9\n192.168.16.100 keycloak.testbed.osism.xyz keycloak\n192.168.16.254 api.testbed.osism.xyz api\n"})}),"\n",(0,n.jsx)(t.h3,{id:"webinterfaces",children:"Webinterfaces"}),"\n",(0,n.jsxs)(t.p,{children:["All SSL enabled services within the OSISM Testbed use certs which are signed by the self-signed\n",(0,n.jsx)(t.a,{href:"https://raw.githubusercontent.com/osism/testbed/main/environments/kolla/certificates/ca/testbed.crt",children:"OSISM Testbed CA"}),"\n(Download the file and import it as certification authority to your browser)."]}),"\n",(0,n.jsx)(t.p,{children:"If you want to access the services please choose the URL from the following table."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Name"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"URL"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Username"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Password"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Note"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"ARA"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://ara.testbed.osism.xyz",children:"https://ara.testbed.osism.xyz"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"ara"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Ceph"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://api-int.testbed.osism.xyz:8140",children:"https://api-int.testbed.osism.xyz:8140"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"admin"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Flower"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://flower.testbed.osism.xyz",children:"https://flower.testbed.osism.xyz"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}}),(0,n.jsx)(t.td,{style:{textAlign:"left"}}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Grafana"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://api-int.testbed.osism.xyz:3000",children:"https://api-int.testbed.osism.xyz:3000"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"admin"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"HAProxy (testbed-node-0)"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"http://testbed-node-0.testbed.osism.xyz:1984",children:"http://testbed-node-0.testbed.osism.xyz:1984"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"openstack"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"HAProxy (testbed-node-1)"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"http://testbed-node-1.testbed.osism.xyz:1984",children:"http://testbed-node-1.testbed.osism.xyz:1984"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"openstack"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"HAProxy (testbed-node-2)"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"http://testbed-node-2.testbed.osism.xyz:1984",children:"http://testbed-node-2.testbed.osism.xyz:1984"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"openstack"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Homer"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://homer.testbed.osism.xyz",children:"https://homer.testbed.osism.xyz"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}}),(0,n.jsx)(t.td,{style:{textAlign:"left"}}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Horizon (via Keycloak)"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://api.testbed.osism.xyz",children:"https://api.testbed.osism.xyz"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"alice"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Horizon (via Keystone)"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://api.testbed.osism.xyz",children:"https://api.testbed.osism.xyz"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"admin"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"domain: default"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Horizon (via Keystone)"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://api.testbed.osism.xyz",children:"https://api.testbed.osism.xyz"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"test"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"test"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"domain: test"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Keycloak"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://keycloak.testbed.osism.xyz/auth",children:"https://keycloak.testbed.osism.xyz/auth"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"admin"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Netbox"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://netbox.testbed.osism.xyz",children:"https://netbox.testbed.osism.xyz"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"admin"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Netdata"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"http://testbed-manager.testbed.osism.xyz:19999",children:"http://testbed-manager.testbed.osism.xyz:19999"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}}),(0,n.jsx)(t.td,{style:{textAlign:"left"}}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Nexus"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://nexus.testbed.osism.xyz",children:"https://nexus.testbed.osism.xyz"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"admin"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"OpenSearch Dashboards"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://api.testbed.osism.xyz:5601",children:"https://api.testbed.osism.xyz:5601"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"opensearch"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Prometheus"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://api-int.testbed.osism.xyz:9091",children:"https://api-int.testbed.osism.xyz:9091"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"admin"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"RabbitMQ"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://api-int.testbed.osism.xyz:15672",children:"https://api-int.testbed.osism.xyz:15672"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"openstack"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"phpMyAdmin"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.a,{href:"https://phpmyadmin.testbed.osism.xyz",children:"https://phpmyadmin.testbed.osism.xyz"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"root"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"password"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"authentication-with-oidc",children:"Authentication with OIDC"}),"\n",(0,n.jsx)(t.p,{children:"Authentication with OpenID Connect (OIDC) is possible via Keycloak, which is automatically configured for the OIDC mechanism."}),"\n",(0,n.jsx)(t.h4,{id:"openstack-web-dashboard-horizon-login-via-oidc",children:"OpenStack web dashboard (Horizon) login via OIDC"}),"\n",(0,n.jsxs)(t.p,{children:["For logging in via OIDC, open your browser at OpenStack Dashboard Login Page, select ",(0,n.jsx)(t.strong,{children:"Authenticate via Keycloak"}),", after being\nredirected to the Keycloak login page, perform the login with the credentials ",(0,n.jsx)(t.strong,{children:"alice"})," and ",(0,n.jsx)(t.strong,{children:"password"}),".\nAfter that you will be redirected back to the Horizon dashboard, where you will be logged in with the user ",(0,n.jsx)(t.strong,{children:"alice"}),"."]}),"\n",(0,n.jsx)(t.h4,{id:"openstack-web-dashboard-horizon-logout",children:"OpenStack web dashboard (Horizon) logout"}),"\n",(0,n.jsxs)(t.p,{children:["Keep in mind, that clicking ",(0,n.jsx)(t.strong,{children:"Sign Out"})," on the Horizon dashboard currently doesn't revoke your OIDC token, and any consequent\nattempt to ",(0,n.jsx)(t.strong,{children:"Authenticate via Keycloak"})," will succeed without providing the credentials."]}),"\n",(0,n.jsx)(t.p,{children:"The expiration time of the Single Sign On tokens can be controlled on multiple levels in Keycloak."}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["On realm level under ",(0,n.jsx)(t.em,{children:"Realm Settings"})," > ",(0,n.jsx)(t.em,{children:"Tokens"}),".\nAssuming the ",(0,n.jsx)(t.em,{children:"keycloak_realm"})," ansible variable is the default ",(0,n.jsx)(t.em,{children:"osism"}),", and keycloak is listening on\n",(0,n.jsx)(t.a,{href:"https://keycloak.testbed.osism.xyz",children:"keycloak.testbed.osism.xyz"}),", then the configuration form is available\n",(0,n.jsx)(t.a,{href:"https://keycloak.testbed.osism.xyz/auth/admin/master/console/#/realms/osism/token-settings",children:"here"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["Detailed information is available in the Keycloak Server Administrator Documentation\n",(0,n.jsx)(t.a,{href:"https://www.keycloak.org/docs/latest/server_admin/#_timeouts",children:"Session and Token Timeouts"})," section."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["In a realm down on the ",(0,n.jsx)(t.a,{href:"https://keycloak.testbed.osism.xyz/auth/admin/master/console/#/realms/osism/clients",children:"client level"}),"\nselect the client (keystone), and under ",(0,n.jsx)(t.em,{children:"Settings"})," > ",(0,n.jsx)(t.em,{children:"Advanced Settings"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["It is recommended to keep the ",(0,n.jsx)(t.em,{children:"Access Token Lifespan"})," on a relatively low value, with the trend of blocking third party\ncookies. For further information see the Keycloak documentation's ",(0,n.jsx)(t.a,{href:"https://www.keycloak.org/docs/latest/securing_apps/#browsers-with-blocked-third-party-cookies",children:"Browsers with Blocked Third-Party Cookies"})," section."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h4,{id:"usage-of-the-openstack-cli",children:"Usage of the OpenStack CLI"}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"environments/openstack"})," folder contains the needed files for the openstack client:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"cd environments/openstack\nexport OS_CLOUD=api_monitor.sh
iteration",id:"your-first-api_monitorsh-iteration",level:2},{value:"Resource impact and charging",id:"resource-impact-and-charging",level:3},{value:"Automating startup and cleanup",id:"automating-startup-and-cleanup",level:2},{value:"Changing parameters and restarting",id:"changing-parameters-and-restarting",level:3},{value:"Multiple instances",id:"multiple-instances",level:3},{value:"Alarming and Logs",id:"alarming-and-logs",level:2},{value:"eMail",id:"email",level:3},{value:"Log files",id:"log-files",level:3},{value:"Data collection and dashboard",id:"data-collection-and-dashboard",level:2},{value:"telegraf",id:"telegraf",level:3},{value:"influxdb",id:"influxdb",level:3},{value:"Add -S CLOUDNAME
to your run_CLOUDNAME.sh
script",id:"add--s-cloudname-to-your-run_cloudnamesh-script",level:3},{value:"grafana",id:"grafana",level:3},{value:"Basic config",id:"basic-config",level:4},{value:"Enable influx database in grafana",id:"enable-influx-database-in-grafana",level:4},{value:"Importing the dashboard",id:"importing-the-dashboard",level:4},{value:"No data displayed?",id:"no-data-displayed",level:4},{value:"Dashboard features",id:"dashboard-features",level:4},{value:"github OIDC integration",id:"github-oidc-integration",level:4},{value:"Alternative approach to install and configure the dashboard behind a reverse proxy",id:"alternative-approach-to-install-and-configure-the-dashboard-behind-a-reverse-proxy",level:2},{value:"Maintenance",id:"maintenance",level:2},{value:"Unattended upgrades",id:"unattended-upgrades",level:3},{value:"Updating openstack-health-monitor",id:"updating-openstack-health-monitor",level:3},{value:"Backup",id:"backup",level:3},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Debugging issues",id:"debugging-issues",level:3},{value:"Analyzing failures",id:"analyzing-failures",level:3},{value:"Cleaning things up",id:"cleaning-things-up",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"setting-up-openstack-health-monitor-on-debian",children:"Setting up OpenStack health monitor on Debian"}),"\n",(0,o.jsx)(n.p,{children:"Kurt Garloff, 2024-02-20"}),"\n",(0,o.jsx)(n.h2,{id:"intro",children:"Intro"}),"\n",(0,o.jsxs)(n.p,{children:["The development of ",(0,o.jsx)(n.a,{href:"https://github.com/SovereignCloudStack/openstack-health-monitor/",children:"openstack-health-monitor"})," was done on ",(0,o.jsx)(n.a,{href:"https://kfg.images.obs-website.eu-de.otc.t-systems.com/",children:"openSUSE 15.x images"}),", just because the author is very familiar with it and has some of the needed tools preinstalled. That said, the setup is not depending on anything specific from openSUSE and should work on every modern Linux distribution."]}),"\n",(0,o.jsx)(n.p,{children:"Setting it up again in a different environment using Debian 12 images avoids a few of the shortcuts that were used and thus should be very suitable instructions to get it working in general. The step by step instructions are covered here."}),"\n",(0,o.jsxs)(n.p,{children:["Note: This is a rather classical snowflake setup -- we create a VM and do some manual configuration to get everything configured. Having it well documented here should make this more replicatable, and is an important precondition for more automation, but larger steps to full automate this using ansible or helm charts (in a containerized variant) are not addressed here. As we expect a ",(0,o.jsx)(n.a,{href:"https://github.com/SovereignCloudStack/scs-health-monitor",children:"successor project"})," for the increasingly hard to maintain shell code, this may not be worth the trouble."]}),"\n",(0,o.jsxs)(n.p,{children:["openstack-health-monitor implements a scripted scenario test with a large shell-script that uses the openstackclient tools to set up the scenario, test it and tear everything down again in a loop. Any errors are recorded, as well as timings and some very basic benchmarks. The script sets up some virtual network infrastructure (routers, networks, subnets, floating IPs), security groups, keypairs, volumes and finally boots some VMs. Access to these is tested (ensuring metadata injection works) and connectivity between them tested and measured. A loadbalancer (optionally) is set up with a health-monitor and access via it before and after killing some backends is tested.\nThe scenario is described in a bit more detail in the ",(0,o.jsx)(n.a,{href:"https://github.com/SovereignCloudStack/openstack-health-monitor/blob/main/README.md",children:"repository's README.md"})," file."]}),"\n",(0,o.jsxs)(n.p,{children:["The openstack-health-monitor is not the intended long-term solution for monitoring your infrastructure. The SCS project has a project underway that will create more modern, flexible, and more maintainable monitoring infrastructure; the concepts are described on the ",(0,o.jsx)(n.a,{href:"https://docs.scs.community/docs/category/monitoring",children:"monitoring section"})," of the project's documentation. The openstack-health-monitor will thus not see any significant enhancements any more; it will be maintained and kept alive as long as there are users. This guide exclusively focuses on how to set it up."]}),"\n",(0,o.jsx)(n.h2,{id:"setting-up-the-driver-vm",children:"Setting up the driver VM"}),"\n",(0,o.jsxs)(n.p,{children:["So we start a ",(0,o.jsx)(n.code,{children:"Debian 12"})," image on a cloud of our choice. This should work on any OpenStack cloud that is reasonably standard;\nthe instructions use flavor names and image names from the SCS standards.\nFor many, the simplest way may be to use the Web-UI of their cloud (e.g. horizon for OpenStack)."]}),"\n",(0,o.jsx)(n.h3,{id:"internal-vs-external-monitoring",children:"Internal vs external monitoring"}),"\n",(0,o.jsx)(n.p,{children:"There are pros and cons to run the driver VM in the same cloud that is also under test. We obviously don't test the external reachability of the cloud (more precisely its API endpoints and VMs) if we run it on the same cloud -- which may or may not be desirable. Having the tests happily continuing to collect data may actually be valuable in times when external access is barred. If the cloud goes down, we will no longer see API calls against it, although the information of them not being available does not reveal much in terms of insight into the reasons for the outage. Also, the driver VM is the only long-lived VM in the openstack-health-monitor setup, so it may be useful to have it in the same cloud to reveal any issues that do not occur on the short-lived resources created and deleted by the health-monitor."}),"\n",(0,o.jsx)(n.p,{children:"The author tends to see running it internally as advantageous -- ideally combined with a simple API reachability test from the outside that sends alarms as needed to detect any reachability problems."}),"\n",(0,o.jsx)(n.h3,{id:"unprivileged-operation",children:"Unprivileged operation"}),"\n",(0,o.jsx)(n.p,{children:"Nothing in this test requires admin privileges on the cloud where the driver runs nor on the cloud under test. We do install and configure a few software packages in the driver VM, which requires sudo power there, but the script should just run as a normal user. For the cloud under test it is recommended to use a user (or an application credential) with a normal tenant member role to access the cloud under test. If you can, give it an OpenStack project on its own."}),"\n",(0,o.jsxs)(n.p,{children:["If ",(0,o.jsx)(n.code,{children:"openstack availability zone list --compute"})," fails for you without admin rights, please fix your openstack client, e.g. by applying the ",(0,o.jsx)(n.a,{href:"https://raw.githubusercontent.com/SovereignCloudStack/openstack-health-monitor/main/docs/openstackclient-az-list-fallback-f3207bd.diff",children:"patch"})," I mentioned in ",(0,o.jsx)(n.a,{href:"https://storyboard.openstack.org/#!/story/2010989",children:"this issue"}),". (Versions 6.3.0 and 6.4.0 are broken.) Do not consider giving the OpenStack Health-Monitor admin power. (Note: It has a workaround for the broken AZ listing using curl now.)"]}),"\n",(0,o.jsx)(n.h3,{id:"driver-vm-via-openstack-cli",children:"Driver VM via openstack CLI"}),"\n",(0,o.jsxs)(n.p,{children:["The author prefers to setup the VM via ",(0,o.jsx)(n.code,{children:"openstack"})," CLI tooling. He has working entries for all clouds he uses in his ",(0,o.jsx)(n.code,{children:"~/.config/openstack/clouds.yaml"})," and ",(0,o.jsx)(n.code,{children:"secure.yaml"})," and has exported the ",(0,o.jsx)(n.code,{children:"OS_CLOUD"})," environment variable to point to the cloud he is working on to set up the driver VM. The author uses the ",(0,o.jsx)(n.code,{children:"bash"})," shell. All of this of course could be scripted."]}),"\n",(0,o.jsx)(n.p,{children:"So here we go"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Create the network setup for a VM in a network ",(0,o.jsx)(n.code,{children:"oshm-network"})," with an IPv4 subnet, connected to a router that connects (and by default SNATs) to the public network."]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"PUBLIC=$(openstack network list --external -f value -c Name)\nopenstack router create oshm-router\nopenstack router set --external-gateway $PUBLIC oshm-driver-router\nopenstack network create oshm-network\nopenstack subnet create --subnet-range 192.168.192.0/24 --network oshm-network oshm-subnet\nopenstack router add subnet oshm-router oshm-subnet\n"})}),"\n",(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsx)(n.li,{children:"Create a security group that allows ssh and ping access"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"openstack security group create sshping\nopenstack security group rule create --ingress --ethertype ipv4 --protocol tcp --dst-port 22 sshping\nopenstack security group rule create --ingress --ethertype ipv4 --protocol icmp --icmp-type 8 sshping\n"})}),"\n",(0,o.jsxs)(n.ol,{start:"3",children:["\n",(0,o.jsx)(n.li,{children:"Being at it, we also create the security group for grafana"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"openstack security group create grafana\nopenstack security group rule create --ingress --ethertype ipv4 --protocol tcp --dst-port 3000 grafana\n"})}),"\n",(0,o.jsxs)(n.ol,{start:"4",children:["\n",(0,o.jsx)(n.li,{children:"To connect to the VM via ssh later, we create an SSH keypair"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"openstack keypair create --private-key ~/.ssh/oshm-key.pem oshm-key\nchmod og-r ~/.ssh/oshm-key.pem \n"})}),"\n",(0,o.jsxs)(n.p,{children:["Rather than creating a new key (and storing and protecting the private key), we could have passed ",(0,o.jsx)(n.code,{children:"--public-key"})," and used an existing keypair."]}),"\n",(0,o.jsxs)(n.ol,{start:"5",children:["\n",(0,o.jsx)(n.li,{children:"Look up Debian 12 image UUID."}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"IMGUUID=$(openstack image list --name \"Debian 12\" -f value -c ID | tr -d '\\r')\necho $IMGUUID\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Sidenote: The ",(0,o.jsx)(n.code,{children:"tr"})," command is there to handle broken tooling that embeds a trailing ",(0,o.jsx)(n.code,{children:"\\r"})," in the output."]}),"\n",(0,o.jsxs)(n.ol,{start:"6",children:["\n",(0,o.jsx)(n.li,{children:"Boot the driver VM"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"openstack server create --network oshm-network --key-name oshm-key --security-group default --security-group sshping --security-group grafana --flavor SCS-2V-4 --block-device boot_index=0,uuid=$IMGUUID,source_type=image,volume_size=10,destination_type=volume,delete_on_termination=true oshm-driver\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Chose a flavor that exists on your cloud. Here we have used one without root disk and asked nova to create a volume on the fly by passing ",(0,o.jsx)(n.code,{children:"--block-device"}),". See ",(0,o.jsx)(n.a,{href:"https://scs.community/2023/08/21/diskless-flavors/",children:"diskless flavor blog article"}),". For flavors with local root disks, you could have used the ",(0,o.jsx)(n.code,{children:"--image $IMGUUID"})," parameter instead."]}),"\n",(0,o.jsxs)(n.ol,{start:"7",children:["\n",(0,o.jsxs)(n.li,{children:["Wait for it to boot (optional)\nYou can look at the boot log with ",(0,o.jsx)(n.code,{children:"openstack console log show oshm-driver"})," or connect to it via VNC at the URL given by ",(0,o.jsx)(n.code,{children:"openstack console url show oshm-driver"}),". You can of course also query openstack on the status ",(0,o.jsx)(n.code,{children:"openstack server list"})," or ",(0,o.jsx)(n.code,{children:"openstack server show oshm-driver"}),". You can also just create a simple loop:"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'declare -i ctr=0 RC=0\nwhile [ $ctr -le 120 ]; do\n STATUS="$(openstack server list --name oshm-driver -f value -c Status)"\n if [ "$STATUS" = "ACTIVE" ]; then echo "$STATUS"; break; fi \n if [ "$STATUS" = "ERROR" ]; then echo "$STATUS"; RC=1; break; fi\n if [ -z "$STATUS" ]; then echo "No such VM"; RC=2; break; fi\n sleep 2\n let ctr+=1\ndone\n# return $RC\nif [ $RC != 0 ]; then false; fi\n'})}),"\n",(0,o.jsxs)(n.ol,{start:"8",children:["\n",(0,o.jsx)(n.li,{children:"Attach a floating IP so it's reachable from the outside."}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'FIXEDIP=$(openstack server list --name oshm-driver -f value -c Networks | sed "s@^[^:]*:[^\']*\'\\([0-9\\.]*\\)\'.*\\$@\\1@")\nFIXEDPORT=$(openstack port list --fixed-ip ip-address=$FIXEDIP,subnet=oshm-subnet -f value -c ID)\necho $FIXEDIP $FIXEDPORT\nopenstack floating ip create --port $FIXEDPORT $PUBLIC\nFLOATINGIP=$(openstack floating ip list --fixed-ip-address $FIXEDIP -f value -c "Floating IP Address")\necho "Floating IP: $FLOATINGIP"\n'})}),"\n",(0,o.jsx)(n.p,{children:"Remember this floating IP address."}),"\n",(0,o.jsxs)(n.ol,{start:"9",children:["\n",(0,o.jsx)(n.li,{children:"Connect to it via ssh"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"ssh -i ~/.ssh/oshm-key.pem debian@$FLOATINGIP\n"})}),"\n",(0,o.jsx)(n.p,{children:"On the first connection, you need to accept the new ssh host key. (Very careful people would compare the fingerprint with the console log output.)"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"All the following commands are performed on the newly started driver VM."})}),"\n",(0,o.jsx)(n.h3,{id:"configuring-openstack-cli-on-the-driver-vm",children:"Configuring openstack CLI on the driver VM"}),"\n",(0,o.jsx)(n.p,{children:"We need to install the openstack client utilities."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo apt-get update\nsudo apt-get install python3-openstackclient\nsudo apt-get install python3-cinderclient python3-octaviaclient python3-swiftclient python3-designateclient\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Configure your cloud access in ",(0,o.jsx)(n.code,{children:"~/.config/openstack/clouds.yaml"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"clouds:\n CLOUDNAME:\n interface: public\n identity-api-version: 3\n #region_name: REGION\n auth:\n auth_url: KEYSTONE_ENDPOINT\n project_id: PROJECT_UUID\n #alternatively project_name and project_domain_name\n user_domain_name: default\n # change to your real domain\n"})}),"\n",(0,o.jsxs)(n.p,{children:["and ",(0,o.jsx)(n.code,{children:"secure.yaml"})," (in the same directory)"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"clouds:\n CLOUDNAME:\n auth:\n username: USERNAME\n password: PASSWORD\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"CLOUDNAME"})," can be freely chosen. This is the value passed to the openstack CLI with ",(0,o.jsx)(n.code,{children:"--os-cloud"})," or exported to your environment in ",(0,o.jsx)(n.code,{children:"OS_CLOUD"}),". The other uppercase words need to be adjusted to match your cloud. Hint: horizon typically lets you download a sample ",(0,o.jsx)(n.code,{children:"clouds.yaml"})," file that works (but lacks the password)."]}),"\n",(0,o.jsxs)(n.p,{children:["Protect your ",(0,o.jsx)(n.code,{children:"secure.yaml"})," from being read by others: ",(0,o.jsx)(n.code,{children:"chmod 0600 ~/.config/openstack/secure.yaml"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["If you are using application credentials instead of username, password to authenticate, you don't need to specify ",(0,o.jsx)(n.code,{children:"project_id"})," nor project's nor user's domain names in ",(0,o.jsx)(n.code,{children:"clouds.yaml"}),". Just (in ",(0,o.jsx)(n.code,{children:"secure.yaml"}),"):"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'clouds:\n CLOUDNAME:\n auth_type: v3applicationcredential\n auth:\n application_credential_id: APPCRED_ID\n application_credential_secret: "APPCRED_SECRET"\n'})}),"\n",(0,o.jsx)(n.p,{children:"Configure this to be your default cloud:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"export OS_CLOUD=CLOUDNAME\n"})}),"\n",(0,o.jsxs)(n.p,{children:["You might consider adding this to your ",(0,o.jsx)(n.code,{children:"~/.bashrc"})," for convenience. Being at it, you might want to add ",(0,o.jsx)(n.code,{children:"export CLIFF_FIT_WIDTH=1"})," there as well to make openstack command output tables more readable (but sometimes less easy to cut'n'paste)."]}),"\n",(0,o.jsx)(n.p,{children:"Verify that your openstack CLI works:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"openstack catalog list\nopenstack server list\n"})}),"\n",(0,o.jsx)(n.p,{children:"You can use the same project as you use for your driver VM (and possibly other workloads). The openstack-health-monitor is carefully designed to not clean up anything that it has not created. There is however some trickiness, as not all resources have names (floating IPs for example do not) and sometimes names need to be assigned after creation of a resource (volumes of diskless flavors), so in case there are API errors, some heuristics is used to identify resources which may not be safe under all circumstances. So ideally, you have an extra project created just for the health-monitor and configure the credentials for it here, so you can not possibly hit any wrong resource in the script's extensive efforts to clean up in error cases."}),"\n",(0,o.jsx)(n.h3,{id:"custom-ca",children:"Custom CA"}),"\n",(0,o.jsxs)(n.p,{children:["If your cloud API's endpoints don't use TLS certificates that are signed by an official CA, you need to provide your CA to this VM and configure it. (On a SCS Cloud-in-a-Box system, you find it on the manager node in ",(0,o.jsx)(n.code,{children:"/etc/ssl/certs/ca-certificates.crt"}),". You may extract the last cert or just leave them all together.) Copy the CA file to your driver VM and ensure it's readable by the ",(0,o.jsx)(n.code,{children:"debian"})," user."]}),"\n",(0,o.jsxs)(n.p,{children:["Add it to your ",(0,o.jsx)(n.code,{children:"clouds.yaml"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"clouds:\n CLOUDNAME:\n cacert: /PATH/TO/CACERT.CRT\n [...]\n"})}),"\n",(0,o.jsxs)(n.p,{children:["If you want to allow ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," to be able to talk to the service endpoints directly to avoid getting a fresh token from keystone for each call, you also need to export it to your environment:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"export OS_CACERT=/PATH/TO/CACERT.CRT\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Consider adding this to your ",(0,o.jsx)(n.code,{children:"~/.bashrc"})," as well."]}),"\n",(0,o.jsxs)(n.h2,{id:"your-first-api_monitorsh-iteration",children:["Your first ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," iteration"]}),"\n",(0,o.jsx)(n.p,{children:"Checkout openstack-health-monitor:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo apt-get install git bc jq netcat-traditional tmux zstd\ngit clone https://github.com/SovereignCloudStack/openstack-health-monitor\ncd openstack-health-monitor\n"})}),"\n",(0,o.jsxs)(n.p,{children:["You may want to start a ",(0,o.jsx)(n.code,{children:"tmux"})," (or ",(0,o.jsx)(n.code,{children:"screen"}),") session now, so you can do multiple things in parallel (e.g. for debugging) and reconnect."]}),"\n",(0,o.jsxs)(n.p,{children:["The script ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," is the main worker of openstack-health-monitor and runs one to many iterations of a cycle where resources are created, tested and torn down. Its operation is described in the ",(0,o.jsx)(n.a,{href:"https://github.com/SovereignCloudStack/openstack-health-monitor/blob/main/README.md",children:"README.md"})," file."]}),"\n",(0,o.jsxs)(n.p,{children:["It is good practice to use ",(0,o.jsx)(n.code,{children:"tmux"}),". This allows you to return (reattach) to console sessions and to open new windows to investigate things. Traditional people may prefer to ",(0,o.jsx)(n.code,{children:"screen"})," over ",(0,o.jsx)(n.code,{children:"tmux"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"You should be ready to run one iteration of the openstack-health-monitor now. Run it like this:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'export IMG="Debian 12"\nexport JHIMG="Debian 12"\n./api_monitor.sh -O -C -D -n 6 -s -b -B -M -T -LL -i 1\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Leave out the ",(0,o.jsx)(n.code,{children:"-LL"})," if you don't have a working loadbalancer service or replace ",(0,o.jsx)(n.code,{children:"-LL"})," with ",(0,o.jsx)(n.code,{children:"-LO"})," if you want to test the ovn loadbalancer instead of amphorae (saving quite some resources)."]}),"\n",(0,o.jsxs)(n.p,{children:["Feel free to study the meaning of all the command line parameters by looking at the ",(0,o.jsx)(n.a,{href:"https://github.com/SovereignCloudStack/openstack-health-monitor/blob/main/README.md",children:"README.md"}),". (Note: Many of the things enabled by the parameters should be default, but are not for historic reasons. This would change if we rewrite this whole thing in python.)"]}),"\n",(0,o.jsxs)(n.p,{children:["This will run for ~7 minutes, depending on the performance of your OpenStack environment. You should not get any error. (The amber-colored outputs ",(0,o.jsx)(n.code,{children:"DOWN"}),", ",(0,o.jsx)(n.code,{children:"BUILD"}),", ",(0,o.jsx)(n.code,{children:"creating"})," are not errors. Nothing in red should be displayed.) Studying the console output may be instructive to follow the script's progress. You may also open another window (remember the tmux recommendation above) and look at the resources with the usual ",(0,o.jsx)(n.code,{children:"openstack RESOURCE list"})," and ",(0,o.jsx)(n.code,{children:"openstack RESOURCE show NAME"})," and ",(0,o.jsx)(n.code,{children:"RESOURCE"})," being something like ",(0,o.jsx)(n.code,{children:"router"}),", ",(0,o.jsx)(n.code,{children:"network"}),", ",(0,o.jsx)(n.code,{children:"subnet"}),", ",(0,o.jsx)(n.code,{children:"port"}),", ",(0,o.jsx)(n.code,{children:"volume"}),", ",(0,o.jsx)(n.code,{children:"server"}),", ",(0,o.jsx)(n.code,{children:"floating ip"}),", ",(0,o.jsx)(n.code,{children:"loadbalancer"}),", ",(0,o.jsx)(n.code,{children:"loadbalancer pool"}),", ",(0,o.jsx)(n.code,{children:"loadbalancer listener"}),", ",(0,o.jsx)(n.code,{children:"security group"}),", ",(0,o.jsx)(n.code,{children:"keypair"}),", ",(0,o.jsx)(n.code,{children:"image"}),", ...)"]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," uses and ",(0,o.jsx)(n.code,{children:"APIMonitor_TIMESTAMP"})," prefix for all OpenStack resource names. This allows to identify the created resources and clean them up even if things go wrong.\n",(0,o.jsx)(n.code,{children:"TIMESTAMP"})," is an integer number representing the seconds after 1970-01-01 00:00:00 UTC (Unix time)."]}),"\n",(0,o.jsxs)(n.p,{children:["This may be the time to check that you have sufficient quota to create the resources. While we only create 6+N VMs (and volumes) with the above call (N being the number of AZs), we would want to increase this number for larger clouds. For single-AZ deployments, we would want to still use 2 networks at least ",(0,o.jsx)(n.code,{children:"-N 2"})," to test the ability of the router to route traffic between networks. So expect ",(0,o.jsx)(n.code,{children:"-n 6"})," to become ",(0,o.jsx)(n.code,{children:"-N 2 -n 6"})," for a very small single-AZ cloud or ",(0,o.jsx)(n.code,{children:"-n 12"})," for a large 3 AZ cloud region. So, re-run the ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," with the target sizing."]}),"\n",(0,o.jsx)(n.h3,{id:"resource-impact-and-charging",children:"Resource impact and charging"}),"\n",(0,o.jsxs)(n.p,{children:["Note that ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," uses small flavors (",(0,o.jsx)(n.code,{children:"SCS-1V-2"})," for the N jump hosts and ",(0,o.jsx)(n.code,{children:"SCS-1L-1"})," for the other VMs) to keep the impact on your cloud (and on your invoice if you are not monitoring your own cloud) small. You can change the flavors."]}),"\n",(0,o.jsxs)(n.p,{children:["If you have to pay for this, also consider that some clouds are not charging by the minute but may count by the started hour. So when you run ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," in a loop (which you will) with say 10 VMs (e.g. ",(0,o.jsx)(n.code,{children:"-N 2 -n 8"}),") in each iteration and run this for an hour with 8 iterations, you will never have more than 10 VMs in parallel and they only are alive a bit more than half of the time, but rather than being charged for ~6 VM hours, you end up being charged for ~80 VM hours. Similar for volumes, routers, floating IPs. This makes a huge difference."]}),"\n",(0,o.jsxs)(n.p,{children:["Sometimes the cloud under test has issues. That's why we do monitoring ... One thing that might happen is that loadbalancers and volumes (and other resources, but those two are the most prone to this) end up in a broken state that can not be cleaned up by the user any more. Bad providers may charge for these anyhow, although this will never stand a legal dispute. (IANAL, but charging for providing something that is not working is not typically supported by civil law in most jurisdictions and T&Cs that would say so would not normally be legally enforceable.) If this happens, I recommend to keep records of the broken state (store the output of ",(0,o.jsx)(n.code,{children:"openstack volume list"}),", ",(0,o.jsx)(n.code,{children:"openstack volume show BROKEN_VOLUME"}),", ",(0,o.jsx)(n.code,{children:"openstack loadbalancer list"}),", ",(0,o.jsx)(n.code,{children:"openstack loadbalancer show BROKEN_LB"}),".)"]}),"\n",(0,o.jsxs)(n.p,{children:["Using ",(0,o.jsx)(n.code,{children:"-w -1"})," makes ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," wait for interactive input whenever an error occurs; this can be convenient for debugging."]}),"\n",(0,o.jsx)(n.p,{children:"Once you have single iterations working nicely, we can proceed."}),"\n",(0,o.jsx)(n.h2,{id:"automating-startup-and-cleanup",children:"Automating startup and cleanup"}),"\n",(0,o.jsxs)(n.p,{children:["Typically, we run ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," with a limited amount of iterations (200) and then restart it. For each restart, we also output some statistics, compress the log file and look at any leftovers that did not get cleaned up. The latter happens in the start script that we create here."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'#!/bin/bash\n# run_CLOUDNAME.sh\n# Do some global settings\nexport IMG="Debian 12"\nexport JHIMG="Debian 12"\n#export OS_CACERT=/home/debian/ca-certificates.pem\n# Additional settings to override flavors or to\n# configure email addresses for sending alarms can be set here\n\n# Does openstack CLI work?\nopenstack server list >/dev/null || exit 1\n# Upload log files to this swift container (which you need to create)\n#export SWIFTCONTAINER=OS-HM-Logfiles\n\n# CLEANUP\necho "Finding resources from previous runs to clean up ..."\n# Find Floating IPs\nFIPLIST=""\nFIPS=$(openstack floating ip list -f value -c ID)\nfor fip in $FIPS; do\n FIP=$(openstack floating ip show $fip | grep -o "APIMonitor_[0-9]*")\n if test -n "$FIP"; then FIPLIST="${FIPLIST}${FIP}_\n"; fi\ndone\nFIPLIST=$(echo "$FIPLIST" | grep -v \'^$\' | sort -u)\n# Cleanup previous interrupted runs\nSERVERS=$(openstack server list | grep -o "APIMonitor_[0-9]*_" | sort -u)\nKEYPAIR=$(openstack keypair list | grep -o "APIMonitor_[0-9]*_" | sort -u)\nVOLUMES=$(openstack volume list | grep -o "APIMonitor_[0-9]*_" | sort -u)\nNETWORK=$(openstack network list | grep -o "APIMonitor_[0-9]*_" | sort -u)\nLOADBAL=$(openstack loadbalancer list | grep -o "APIMonitor_[0-9]*_" | sort -u)\nROUTERS=$(openstack router list | grep -o "APIMonitor_[0-9]*_" | sort -u)\nSECGRPS=$(openstack security group list | grep -o "APIMonitor_[0-9]*_" | sort -u)\necho CLEANUP: FIPs $FIPLIST Servers $SERVERS Keypairs $KEYPAIR Volumes $VOLUMES Networks $NETWORK LoadBalancers $LOADBAL Routers $ROUTERS SecGrps $SECGRPS\nfor ENV in $FIPLIST; do\n echo "******************************"\n echo "CLEAN $ENV"\n bash ./api_monitor.sh -o -T -q -c CLEANUP $ENV\n echo "******************************"\ndone\nTOCLEAN=$(echo "$SERVERS\n$KEYPAIR\n$VOLUMES\n$NETWORK\n$LOADBAL\n$ROUTERS\n$SECGRPS\n" | grep -v \'^$\' | sort -u)\nfor ENV in $TOCLEAN; do\n echo "******************************"\n echo "CLEAN $ENV"\n bash ./api_monitor.sh -o -q -LL -c CLEANUP $ENV\n echo "******************************"\ndone\n\n# Now run the monitor\n#exec ./api_monitor.sh -O -C -D -N 2 -n 6 -s -M -LO -b -B -a 2 -t -T -R -S ciab "$@"\nexec ./api_monitor.sh -O -C -D -N 2 -n 6 -s -M -LO -b -B -T "$@"\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Compared to the previous run, we have explicitly set two networks here ",(0,o.jsx)(n.code,{children:"-N 2"})," and rely on the iterations being passed in as command line arguments. Add parameter ",(0,o.jsx)(n.code,{children:"-t"})," if your cloud is slow to increase timeouts. We have enabled the ovtavia loadbalancer (",(0,o.jsx)(n.code,{children:"-LO"}),") in this example rather than the amphora based one (",(0,o.jsx)(n.code,{children:"-LL"}),")."]}),"\n",(0,o.jsxs)(n.p,{children:["You may use one of the existing ",(0,o.jsx)(n.code,{children:"run_XXXX.sh"})," scripts as example. Beware: eMail alerting with ",(0,o.jsx)(n.code,{children:"ALARM_EMAIL_ADDRESS"})," and ",(0,o.jsx)(n.code,{children:"NOTE_EMAIL_ADDRESS"})," (and limiting with ",(0,o.jsx)(n.code,{children:"-a"})," and ",(0,o.jsx)(n.code,{children:"-R"})," ) and reporting data to telegraf (option ",(0,o.jsx)(n.code,{children:"-S"}),") may be present in the samples. Make this script executable (",(0,o.jsx)(n.code,{children:"chmod +x run_CLOUDNAME.sh"}),")."]}),"\n",(0,o.jsxs)(n.p,{children:["We wrap a loop around this in ",(0,o.jsx)(n.code,{children:"run_in_loop.sh"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'#!/bin/bash\n# run_in_loop.sh\nrm stop-os-hm 2>/dev/null\nwhile true; do\n ./run_CLOUDNAME.sh -i 200\n if test -e stop-os-hm; then break; fi\n echo -n "Hit ^C to abort ..."\n sleep 15; echo\ndone\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Also make this executable (",(0,o.jsx)(n.code,{children:"chmod +x run_in_loop.sh"}),").\nTo run this automatically in a tmux window whenever the system starts, we follow the steps in the ",(0,o.jsx)(n.a,{href:"https://github.com/SovereignCloudStack/openstack-health-monitor/blob/main/startup/README.md",children:"startup README.md"})]}),"\n",(0,o.jsxs)(n.p,{children:["Change ",(0,o.jsx)(n.code,{children:"OS_CLOUD"})," in ",(0,o.jsx)(n.code,{children:"startup/run-apimon-in-tmux.sh"}),". (If you need to set ",(0,o.jsx)(n.code,{children:"OS_CACERT"}),", also add it in this file and pass it into the windows.)"]}),"\n",(0,o.jsx)(n.p,{children:"Activate everything:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"mkdir -p ~/.config/systemd/user/\ncp -p startup/apimon.service ~/.config/systemd/user/\nsystemctl --user enable apimon\nsystemctl --user start apimon\nsudo loginctl enable-linger debian\ntmux attach oshealthmon\n"})}),"\n",(0,o.jsxs)(n.p,{children:["This assumes that you are using the user ",(0,o.jsx)(n.code,{children:"debian"})," for this monitoring and have checked out the repository at ",(0,o.jsx)(n.code,{children:"~/openstack-health-monitor/"}),". Adjust the paths and user name otherwise. (If for whatever reason you have chosen to install things as root, you will have to install the systemd service unit in the system paths and ensure it's not started too early in the boot process.)"]}),"\n",(0,o.jsx)(n.h3,{id:"changing-parameters-and-restarting",children:"Changing parameters and restarting"}),"\n",(0,o.jsxs)(n.p,{children:["If you want to change the parameters passed to ",(0,o.jsx)(n.code,{children:"api_monitor.sh"}),", you best do this by editing ",(0,o.jsx)(n.code,{children:"run_CLOUDNAME.sh"}),", potentially after testing it with one iteration before."]}),"\n",(0,o.jsxs)(n.p,{children:["To make the change effective, you can wait until the current 200 iterations are completed and the ",(0,o.jsx)(n.code,{children:"run_in_loop.sh"})," calls ",(0,o.jsx)(n.code,{children:"run_CLOUDNAME.sh"})," again. You can also hit ",(0,o.jsx)(n.code,{children:"^C"})," in the tmux window that has",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," running. The script will then exit after the current iteration. Note that sending this interrupt is handled by the script, so it does still continue the current iteration and do all the cleanup work. However, you may interrupt an API call and thus cause a spurious error (which may in the worst case lead to a couple more spurious errors). If you want to avoid this, hit ",(0,o.jsx)(n.code,{children:"^C"})," during the wait/sleep phases of the script (after having done all the tests or after having completed the iteration). If you hit ",(0,o.jsx)(n.code,{children:"^C"})," twice, it will abort the the current iteration, but still try to clean up. Then the outer script will also exit and you have to restart by manually calling ",(0,o.jsx)(n.code,{children:"./run_in_loop.sh"})," again."]}),"\n",(0,o.jsxs)(n.p,{children:["You can also issue the ",(0,o.jsx)(n.code,{children:"systemctl --user stop apimon"})," command; it will basically do the same thing: Send ",(0,o.jsx)(n.code,{children:"^C"})," and then wait for everything to be completed and tear down the tmux session.\nAfter waiting for that to complete, you can start it again with ",(0,o.jsx)(n.code,{children:"systemctl --user start apimon"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"multiple-instances",children:"Multiple instances"}),"\n",(0,o.jsxs)(n.p,{children:["You can run multiple instances of ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," on the same driver VM. In this case, you should rename ",(0,o.jsx)(n.code,{children:"run_in_loop.sh"})," to e.g. ",(0,o.jsx)(n.code,{children:"run_in_loop_CLOUDNAME1.sh"})," and call ",(0,o.jsx)(n.code,{children:"run_CLOUDNAME1.sh"})," from there. Don't forget to adjust ",(0,o.jsx)(n.code,{children:"startup/run-apimon-in-tmux.sh"})," and ",(0,o.jsx)(n.code,{children:"startup/kill-apimon-in-tmux.sh"})," to start more windows."]}),"\n",(0,o.jsxs)(n.p,{children:["It is not recommended to run multiple instances against the same OpenStack project however. While the ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," script carefully keeps track of its own resources and avoids to delete things it has not created, this is not the case for the ",(0,o.jsx)(n.code,{children:"run_CLOUDNAME.sh"})," script, which is explicitly meant to identify anything in the target project that was created by a health monitor and clean it up. If it hits the resources that are currently in use by another health mon instance, this will create spurious errors. This will happen every ~200 iterations, so you could still have some short-term coexistence when you are performing debug operations."]}),"\n",(0,o.jsx)(n.h2,{id:"alarming-and-logs",children:"Alarming and Logs"}),"\n",(0,o.jsx)(n.h3,{id:"email",children:"eMail"}),"\n",(0,o.jsxs)(n.p,{children:["If wanted, the ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," can send statistics and error messages via email, so operator personnel is informed about the state of the monitoring. This email notification service potentially results in many emails; one error may produce several mails. So in case of a systematic problem, expect to receive dozens of mails per hour. This can be reduced a bit using the ",(0,o.jsx)(n.code,{children:"-a N"})," and ",(0,o.jsx)(n.code,{children:"-R"})," options. In order to enable sending emails from the driver VM, it needs to have ",(0,o.jsx)(n.code,{children:"postfix"})," (or another MTA) installed and configured and outgoing connections for eMail need to be allowed. Note that many operators prefer not to use the eMail notifications but rather rely on looking at the dashboards (see further down) regularly."]}),"\n",(0,o.jsxs)(n.p,{children:["Once you have configured ",(0,o.jsx)(n.code,{children:"postfix"}),", you can enable eMail notifications using the option ",(0,o.jsx)(n.code,{children:"-e"}),". Using it twice allows you to differentiate between notes (statistical summaries) and errors. If you want to send mails to more than one recipient, you can do so by passing ",(0,o.jsx)(n.code,{children:"ALARM_EMAIL_ADDRESSES"})," and ",(0,o.jsx)(n.code,{children:"NOTE_EMAIL_ADDRESSES"})," environment variables to ",(0,o.jsx)(n.code,{children:"api_monitor.sh"}),", e.g. by setting it in the ",(0,o.jsx)(n.code,{children:"run_CLOUDNAME.sh"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"log-files",children:"Log files"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"api_monitor.sh"})," writes a log file with the name ",(0,o.jsx)(n.code,{children:"APIMonitor_TIMESTAMP.log"}),". It contains a bit of information to see the progress of the script; more importantly, it logs every single openstack CLI call along with parameters and results. (",(0,o.jsx)(n.code,{children:"TIMESTAMP"})," is the Unix time, i.e. seconds since 1970-01-01 00:00:00 UTC.)"]}),"\n",(0,o.jsxs)(n.p,{children:["Note that ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," does take some care not to expose secrets -- since v1.99, it does also redact issued tokens (which would otherwise give you up to 24hrs of access). But the Log files still may contain moderately sensitive information, so we suggest to not share it with untrusted parties."]}),"\n",(0,o.jsxs)(n.p,{children:["The log file is written to the file system. After finishing the 200 iterations, the log file is compressed. If the environment variable ",(0,o.jsx)(n.code,{children:"SWIFTCONTAINER"})," has been set (in ",(0,o.jsx)(n.code,{children:"run_COULDNAME.sh"}),") when starting ",(0,o.jsx)(n.code,{children:"api_monitor.sh"}),". the log file will be uploaded to a container with that name if it exists and if the swift object storage service is supported by the cloud. So create the container (a bucket in S3 speak) before if you want to use this: ",(0,o.jsx)(n.code,{children:"export SWIFTCONTAINER=OSHM_Logs; openstack container create $SWIFTCONTAINER"})]}),"\n",(0,o.jsxs)(n.p,{children:["After the 200 iterations, a ",(0,o.jsx)(n.code,{children:".psv"})," file (pipe-separated values) is created ",(0,o.jsx)(n.code,{children:"Stats.STARTTIME-ENDTIME.psv"})," (with times as calendar dates) which contains a bit of statistics on the last 200 iterations. This one will also be uploaded to $SWIFTCONTAINER (if configured)."]}),"\n",(0,o.jsx)(n.h2,{id:"data-collection-and-dashboard",children:"Data collection and dashboard"}),"\n",(0,o.jsxs)(n.p,{children:["See ",(0,o.jsx)(n.a,{href:"https://github.com/SovereignCloudStack/openstack-health-monitor/blob/main/dashboard/README.md",children:"https://github.com/SovereignCloudStack/openstack-health-monitor/blob/main/dashboard/README.md"})]}),"\n",(0,o.jsx)(n.h3,{id:"telegraf",children:"telegraf"}),"\n",(0,o.jsx)(n.p,{children:"To install telegraf on Debian 12, we need to add the apt repository provided by InfluxData:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'sudo curl -fsSL https://repos.influxdata.com/influxdata-archive_compat.key -o /etc/apt/keyrings/influxdata-archive_compat.key\necho "deb [signed-by=/etc/apt/keyrings/influxdata-archive_compat.key] https://repos.influxdata.com/debian stable main" | sudo tee /etc/apt/sources.list.d/influxdata.list\nsudo apt update\nsudo apt -y install telegraf\n'})}),"\n",(0,o.jsxs)(n.p,{children:["In the config file ",(0,o.jsx)(n.code,{children:"/etc/telegraf/telegraf.conf"}),", we enable"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'[[inputs.influxdb_listener]]\n service_address = ":8186"\n\n[[outputs.influxdb]]\n urls = ["http://127.0.0.1:8086"]\n'})}),"\n",(0,o.jsxs)(n.p,{children:["and restart the service (",(0,o.jsx)(n.code,{children:"sudo systemctl restart telegraf"}),").\nEnable it on system startup: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable telegraf"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"influxdb",children:"influxdb"}),"\n",(0,o.jsx)(n.p,{children:"We proceed to influxdb:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo apt-get install influxdb\n"})}),"\n",(0,o.jsxs)(n.p,{children:["In the configuration file ",(0,o.jsx)(n.code,{children:"/etc/influxdb/influxdb.conf"}),", ensure that the http interface on port 8086 is enabled."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'[http]\n enabled = true\n bind-address = ":8086"\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Restart influxdb as needed with ",(0,o.jsx)(n.code,{children:"sudo systemctl restart influxdb"}),".\nAlso enable it on system startup: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable influxdb"}),"."]}),"\n",(0,o.jsxs)(n.h3,{id:"add--s-cloudname-to-your-run_cloudnamesh-script",children:["Add ",(0,o.jsx)(n.code,{children:"-S CLOUDNAME"})," to your ",(0,o.jsx)(n.code,{children:"run_CLOUDNAME.sh"})," script"]}),"\n",(0,o.jsxs)(n.p,{children:["You need to tell the monitor that it should send data via telegraf to influxdb by adding the parameter ",(0,o.jsx)(n.code,{children:"-S CLOUDNAME"})," to the ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," call in ",(0,o.jsx)(n.code,{children:"run_CLOUDNAME.sh"}),". Restart it (see above) to make the change effective immediately (and not only after 200 iterations complete)."]}),"\n",(0,o.jsx)(n.h3,{id:"grafana",children:"grafana"}),"\n",(0,o.jsx)(n.h4,{id:"basic-config",children:"Basic config"}),"\n",(0,o.jsxs)(n.p,{children:["Finally grafana: We (still as root) follow ",(0,o.jsx)(n.a,{href:"https://www.server-world.info/en/note?os=Debian_12&p=grafana",children:"https://www.server-world.info/en/note?os=Debian_12&p=grafana"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'sudo wget -q -O /usr/share/keyrings/grafana.key https://packages.grafana.com/gpg.key\necho "deb [signed-by=/usr/share/keyrings/grafana.key] https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list\nsudo apt update\nsudo apt -y install grafana\n'})}),"\n",(0,o.jsxs)(n.p,{children:["The config file ",(0,o.jsx)(n.code,{children:"/etc/grafana/grafana.ini"})," needs some adjustments:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Set the hostname in ",(0,o.jsx)(n.code,{children:"[server]"})," section: ",(0,o.jsx)(n.code,{children:"domain = health.YOURCLOUD.sovereignit.cloud"}),". Set the ",(0,o.jsx)(n.code,{children:"protocol = https"})," if not enabled by default.\nYou can use a hostname of your liking, but we will need to create TLS certificates for this host. So we should have control over DNS TXT records for this domain if we want to use Let's Encrypt with DNSAUTH. The ",(0,o.jsx)(n.code,{children:"sovereignit.cloud"})," domain is controlled by the SCS project team and has been used for a number of health mon instances.\nIn this same section, set ",(0,o.jsx)(n.code,{children:"cert_file = /etc/grafana/health-fullchain.pem"})," and ",(0,o.jsx)(n.code,{children:"cert_key = /etc/grafana/health-key.pem"}),". Ensure that both files are readable by ",(0,o.jsx)(n.code,{children:"root:grafana"})," and that the key file is ",(0,o.jsx)(n.em,{children:"not"})," world-readable."]}),"\n",(0,o.jsxs)(n.li,{children:["Configure the admin access. In section ",(0,o.jsx)(n.code,{children:"[security]"}),", set the ",(0,o.jsx)(n.code,{children:"admin_user = admin"})," and ",(0,o.jsx)(n.code,{children:"admin_password = SOME_SECRET_PASS"})," which you keep private."]}),"\n",(0,o.jsxs)(n.li,{children:["Allow local data sources (same section): ",(0,o.jsx)(n.code,{children:"data_source_proxy_whitelist = localhost:8088 localhost:8086"})]}),"\n",(0,o.jsxs)(n.li,{children:["Let's disallow user signup (in section ",(0,o.jsx)(n.code,{children:"[users]"}),"): ",(0,o.jsx)(n.code,{children:"allow_sign_up = false"})," and ",(0,o.jsx)(n.code,{children:"allow_org_create = false"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["We do the OIDC connection with ",(0,o.jsx)(n.code,{children:"[auth.github]"})," later."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["We can now restart the service: ",(0,o.jsx)(n.code,{children:"sudo systemctl restart grafana-server"}),".\nBeing at it, also enable it on system startup: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable grafana-server"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["You should now be able to access your dashboard on ",(0,o.jsx)(n.code,{children:"https://health.YOURCLOUD.sovereignit.de:3000"})," and log in via the configured username ",(0,o.jsx)(n.code,{children:"admin"})," and your ",(0,o.jsx)(n.code,{children:"SOME_SECRET_PASS"})," password."]}),"\n",(0,o.jsx)(n.h4,{id:"enable-influx-database-in-grafana",children:"Enable influx database in grafana"}),"\n",(0,o.jsxs)(n.p,{children:["In the dashboard, go to Home, Connections, choose InfluxDB and Add new datasource. The defaults (database name, InfluxQL query language) work. You need to explicitly set the URL to ",(0,o.jsx)(n.code,{children:"http://localhost:8086"})," (despite this being the suggestion). Set the database name to ",(0,o.jsx)(n.code,{children:"telegraf"}),". Save&test should succeed."]}),"\n",(0,o.jsx)(n.h4,{id:"importing-the-dashboard",children:"Importing the dashboard"}),"\n",(0,o.jsxs)(n.p,{children:["Go to Home, Dashboards, New, Import.\nUpload the dashboard ",(0,o.jsx)(n.a,{href:"https://github.com/SovereignCloudStack/openstack-health-monitor/blob/main/dashboard/openstack-health-dashboard.json",children:".json file"})," from the repository, user the ",(0,o.jsx)(n.a,{href:"https://github.com/SovereignCloudStack/openstack-health-monitor/blob/main/dashboard/openstack-health-dashboard-10.json",children:"Grafana-10 variant"})," if you use Grafana 10 or newer."]}),"\n",(0,o.jsx)(n.p,{children:"In the dashboard, go to the settings gear wheel, variables, mycloud and add CLOUDNAME to the list of clouds that can be displayed. (There are some existing SCS clouds in that list.)\nSave."}),"\n",(0,o.jsx)(n.p,{children:"Now choose CLOUDNAME as cloud (top of the dashboard, rightmost dropdown for the mycloud filter variable)."}),"\n",(0,o.jsx)(n.h4,{id:"no-data-displayed",children:"No data displayed?"}),"\n",(0,o.jsx)(n.p,{children:'Sometimes, you may see a panel displaying "no data" despite the fact that the first full iteration of data has been sent to influx already. This may be a strange interaction between the browser and Grafana -- we have not analyzed whether that is a bug in Grafana.'}),"\n",(0,o.jsx)(n.p,{children:"One way to work around is to go into the setting of the panel (the three dots in the upper right corner), go to edit and start changing one aspect of the query. Apply. Change it back to the original. Apply. The data will appear. Save to be sure it's conserved."}),"\n",(0,o.jsx)(n.h4,{id:"dashboard-features",children:"Dashboard features"}),"\n",(0,o.jsx)(n.p,{children:"Look at the top line filters: You can filter to only see certain API calls or certain resources; the graphs are very crowded and filtering to better see what you want to focus on is very well intended."}),"\n",(0,o.jsx)(n.p,{children:"The first row of panels give a health impression; there are absolute numbers as well as percentage numbers and the panels turn amber and red in case you have too many errors. Note that the colors on the panels with absolute numbers can not take into account whether you look at just a few hours or at weeks. Accordingly, consider the colors a reasonable hint if things are green or not when looking at a ~24 hours interval. This limitation does not affect the colors on the percentage graph, obviously."}),"\n",(0,o.jsx)(n.p,{children:"You can change the time interval and zoom in also by marking an interval with the mouse. Zooming out to a few months can be a very useful feature to see trends and watch e.g. your API performance, your resource creation times or the benchmarks change over the long term."}),"\n",(0,o.jsx)(n.h4,{id:"github-oidc-integration",children:"github OIDC integration"}),"\n",(0,o.jsxs)(n.p,{children:["The SCS providers do allow all github users that belong to the SovereignCloudStack organization to get Viewer access to the dashboards by adding a ",(0,o.jsx)(n.code,{children:"client_id"})," and ",(0,o.jsx)(n.code,{children:"client_secret"})," in the ",(0,o.jsx)(n.code,{children:"[github.auth]"})," section that you request from the SCS github admins (github's oauth auth). This allows to exchange experience and to get a feeling for the achievable stability. (Hint: A single digit number of API call fails per week and no other failures is achievable on loaded clouds.)"]}),"\n",(0,o.jsx)(n.h2,{id:"alternative-approach-to-install-and-configure-the-dashboard-behind-a-reverse-proxy",children:"Alternative approach to install and configure the dashboard behind a reverse proxy"}),"\n",(0,o.jsxs)(n.p,{children:["Install influxdb via apt: ",(0,o.jsx)(n.a,{href:"https://docs.influxdata.com/influxdb/v1/introduction/install/#installing-influxdb-oss",children:"https://docs.influxdata.com/influxdb/v1/introduction/install/#installing-influxdb-oss"}),"\nInstall telegraf (same apt repo as influxdb): ",(0,o.jsx)(n.code,{children:"sudo apt update && sudo apt install telegraf"}),"\nInstall grafana: ",(0,o.jsx)(n.a,{href:"https://grafana.com/docs/grafana/latest/setup-grafana/installation/debian/#install-from-apt-repository",children:"https://grafana.com/docs/grafana/latest/setup-grafana/installation/debian/#install-from-apt-repository"})]}),"\n",(0,o.jsx)(n.p,{children:"Prepare configuration by using the config files from the repository as an alternative to doing the changes manually (as described above):"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo cp dashboard/telegraf.conf /etc/telegraf && sudo chown root:root /etc/telegraf/telegraf.conf && sudo chmod 0644 /etc/telegraf/telegraf.conf\nsudo cp dashboard/config.toml /etc/influxdb && sudo chown root:influxdb /etc/influxdb/config.toml && sudo chmod 0640 /etc/influxdb/config.toml\nsudo cp dashboard/grafana.ini /etc/grafana && sudo chown root:grafana /etc/grafana/grafana.ini && sudo chmod 0640 /etc/grafana/grafana.ini\n"})}),"\n",(0,o.jsx)(n.p,{children:"These config files should work as long as the versions of telegraf, influxdb and grafana don't evolve too far from the ones used in the repository. (Otherwise refer to above instructions how to tweak the default config files.)"}),"\n",(0,o.jsxs)(n.p,{children:["Changes to ",(0,o.jsx)(n.code,{children:"/etc/grafana/grafana.ini"})," as we do tls termination at the reverse proxy:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["set ",(0,o.jsx)(n.code,{children:"protocol = http"})]}),"\n",(0,o.jsxs)(n.li,{children:["comment out ",(0,o.jsx)(n.code,{children:"domain"})," option (? FIXME) or set it to the hostname"]}),"\n",(0,o.jsxs)(n.li,{children:["comment out ",(0,o.jsx)(n.code,{children:"cert_*"})," options"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Also change the admin password in ",(0,o.jsx)(n.code,{children:"grafana.ini"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["Changes to ",(0,o.jsx)(n.code,{children:"/etc/grafana/grafana.ini"})," if github auth should not be used yet:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["comment out whole ",(0,o.jsx)(n.code,{children:"[auth.github]"})," section for now (can be enabled later)"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Restart services: ",(0,o.jsx)(n.code,{children:"sudo systemctl restart telegraf && sudo systemctl restart influxdb && sudo systemctl restart grafana-server"})]}),"\n",(0,o.jsx)(n.p,{children:"Configuration in grafana web gui:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Login to grafana ",(0,o.jsx)(n.code,{children:"http(s)://api_monitor.sh
iteration",id:"your-first-api_monitorsh-iteration",level:2},{value:"Resource impact and charging",id:"resource-impact-and-charging",level:3},{value:"Automating startup and cleanup",id:"automating-startup-and-cleanup",level:2},{value:"Changing parameters and restarting",id:"changing-parameters-and-restarting",level:3},{value:"Multiple instances",id:"multiple-instances",level:3},{value:"Alarming and Logs",id:"alarming-and-logs",level:2},{value:"eMail",id:"email",level:3},{value:"Log files",id:"log-files",level:3},{value:"Data collection and dashboard",id:"data-collection-and-dashboard",level:2},{value:"telegraf",id:"telegraf",level:3},{value:"influxdb",id:"influxdb",level:3},{value:"Add -S CLOUDNAME
to your run_CLOUDNAME.sh
script",id:"add--s-cloudname-to-your-run_cloudnamesh-script",level:3},{value:"grafana",id:"grafana",level:3},{value:"Basic config",id:"basic-config",level:4},{value:"Enable influx database in grafana",id:"enable-influx-database-in-grafana",level:4},{value:"Importing the dashboard",id:"importing-the-dashboard",level:4},{value:"No data displayed?",id:"no-data-displayed",level:4},{value:"Dashboard features",id:"dashboard-features",level:4},{value:"github OIDC integration",id:"github-oidc-integration",level:4},{value:"Alternative approach to install and configure the dashboard behind a reverse proxy",id:"alternative-approach-to-install-and-configure-the-dashboard-behind-a-reverse-proxy",level:2},{value:"Maintenance",id:"maintenance",level:2},{value:"Unattended upgrades",id:"unattended-upgrades",level:3},{value:"Updating openstack-health-monitor",id:"updating-openstack-health-monitor",level:3},{value:"Backup",id:"backup",level:3},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Debugging issues",id:"debugging-issues",level:3},{value:"Analyzing failures",id:"analyzing-failures",level:3},{value:"Cleaning things up",id:"cleaning-things-up",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"setting-up-openstack-health-monitor-on-debian",children:"Setting up OpenStack health monitor on Debian"}),"\n",(0,o.jsx)(n.p,{children:"Kurt Garloff, 2024-02-20"}),"\n",(0,o.jsx)(n.h2,{id:"intro",children:"Intro"}),"\n",(0,o.jsxs)(n.p,{children:["The development of ",(0,o.jsx)(n.a,{href:"https://github.com/SovereignCloudStack/openstack-health-monitor/",children:"openstack-health-monitor"})," was done on ",(0,o.jsx)(n.a,{href:"https://kfg.images.obs-website.eu-de.otc.t-systems.com/",children:"openSUSE 15.x images"}),", just because the author is very familiar with it and has some of the needed tools preinstalled. That said, the setup is not depending on anything specific from openSUSE and should work on every modern Linux distribution."]}),"\n",(0,o.jsx)(n.p,{children:"Setting it up again in a different environment using Debian 12 images avoids a few of the shortcuts that were used and thus should be very suitable instructions to get it working in general. The step by step instructions are covered here."}),"\n",(0,o.jsxs)(n.p,{children:["Note: This is a rather classical snowflake setup -- we create a VM and do some manual configuration to get everything configured. Having it well documented here should make this more replicatable, and is an important precondition for more automation, but larger steps to full automate this using ansible or helm charts (in a containerized variant) are not addressed here. As we expect a ",(0,o.jsx)(n.a,{href:"https://github.com/SovereignCloudStack/scs-health-monitor",children:"successor project"})," for the increasingly hard to maintain shell code, this may not be worth the trouble."]}),"\n",(0,o.jsxs)(n.p,{children:["openstack-health-monitor implements a scripted scenario test with a large shell-script that uses the openstackclient tools to set up the scenario, test it and tear everything down again in a loop. Any errors are recorded, as well as timings and some very basic benchmarks. The script sets up some virtual network infrastructure (routers, networks, subnets, floating IPs), security groups, keypairs, volumes and finally boots some VMs. Access to these is tested (ensuring metadata injection works) and connectivity between them tested and measured. A loadbalancer (optionally) is set up with a health-monitor and access via it before and after killing some backends is tested.\nThe scenario is described in a bit more detail in the ",(0,o.jsx)(n.a,{href:"https://github.com/SovereignCloudStack/openstack-health-monitor/blob/main/README.md",children:"repository's README.md"})," file."]}),"\n",(0,o.jsxs)(n.p,{children:["The openstack-health-monitor is not the intended long-term solution for monitoring your infrastructure. The SCS project has a project underway that will create more modern, flexible, and more maintainable monitoring infrastructure; the concepts are described on the ",(0,o.jsx)(n.a,{href:"https://docs.scs.community/docs/category/monitoring",children:"monitoring section"})," of the project's documentation. The openstack-health-monitor will thus not see any significant enhancements any more; it will be maintained and kept alive as long as there are users. This guide exclusively focuses on how to set it up."]}),"\n",(0,o.jsx)(n.h2,{id:"setting-up-the-driver-vm",children:"Setting up the driver VM"}),"\n",(0,o.jsxs)(n.p,{children:["So we start a ",(0,o.jsx)(n.code,{children:"Debian 12"})," image on a cloud of our choice. This should work on any OpenStack cloud that is reasonably standard;\nthe instructions use flavor names and image names from the SCS standards.\nFor many, the simplest way may be to use the Web-UI of their cloud (e.g. horizon for OpenStack)."]}),"\n",(0,o.jsx)(n.h3,{id:"internal-vs-external-monitoring",children:"Internal vs external monitoring"}),"\n",(0,o.jsx)(n.p,{children:"There are pros and cons to run the driver VM in the same cloud that is also under test. We obviously don't test the external reachability of the cloud (more precisely its API endpoints and VMs) if we run it on the same cloud -- which may or may not be desirable. Having the tests happily continuing to collect data may actually be valuable in times when external access is barred. If the cloud goes down, we will no longer see API calls against it, although the information of them not being available does not reveal much in terms of insight into the reasons for the outage. Also, the driver VM is the only long-lived VM in the openstack-health-monitor setup, so it may be useful to have it in the same cloud to reveal any issues that do not occur on the short-lived resources created and deleted by the health-monitor."}),"\n",(0,o.jsx)(n.p,{children:"The author tends to see running it internally as advantageous -- ideally combined with a simple API reachability test from the outside that sends alarms as needed to detect any reachability problems."}),"\n",(0,o.jsx)(n.h3,{id:"unprivileged-operation",children:"Unprivileged operation"}),"\n",(0,o.jsx)(n.p,{children:"Nothing in this test requires admin privileges on the cloud where the driver runs nor on the cloud under test. We do install and configure a few software packages in the driver VM, which requires sudo power there, but the script should just run as a normal user. For the cloud under test it is recommended to use a user (or an application credential) with a normal tenant member role to access the cloud under test. If you can, give it an OpenStack project on its own."}),"\n",(0,o.jsxs)(n.p,{children:["If ",(0,o.jsx)(n.code,{children:"openstack availability zone list --compute"})," fails for you without admin rights, please fix your openstack client. (Versions 6.3.0 and 6.4.0 are broken.) Do not consider giving the OpenStack Healh-Monitor admin power. (Note: It has a workaround for the broken AZ listing using curl now.)"]}),"\n",(0,o.jsx)(n.h3,{id:"driver-vm-via-openstack-cli",children:"Driver VM via openstack CLI"}),"\n",(0,o.jsxs)(n.p,{children:["The author prefers to setup the VM via ",(0,o.jsx)(n.code,{children:"openstack"})," CLI tooling. He has working entries for all clouds he uses in his ",(0,o.jsx)(n.code,{children:"~/.config/openstack/clouds.yaml"})," and ",(0,o.jsx)(n.code,{children:"secure.yaml"})," and has exported the ",(0,o.jsx)(n.code,{children:"OS_CLOUD"})," environment variable to point to the cloud he is working on to set up the driver VM. The author uses the ",(0,o.jsx)(n.code,{children:"bash"})," shell. All of this of course could be scripted."]}),"\n",(0,o.jsx)(n.p,{children:"So here we go"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Create the network setup for a VM in a network ",(0,o.jsx)(n.code,{children:"oshm-network"})," with an IPv4 subnet, connected to a router that connects (and by default SNATs) to the public network."]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"PUBLIC=$(openstack network list --external -f value -c Name)\nopenstack router create oshm-router\nopenstack router set --external-gateway $PUBLIC oshm-driver-router\nopenstack network create oshm-network\nopenstack subnet create --subnet-range 192.168.192.0/24 --network oshm-network oshm-subnet\nopenstack router add subnet oshm-router oshm-subnet\n"})}),"\n",(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsx)(n.li,{children:"Create a security group that allows ssh and ping access"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"openstack security group create sshping\nopenstack security group rule create --ingress --ethertype ipv4 --protocol tcp --dst-port 22 sshping\nopenstack security group rule create --ingress --ethertype ipv4 --protocol icmp --icmp-type 8 sshping\n"})}),"\n",(0,o.jsxs)(n.ol,{start:"3",children:["\n",(0,o.jsx)(n.li,{children:"Being at it, we also create the security group for grafana"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"openstack security group create grafana\nopenstack security group rule create --ingress --ethertype ipv4 --protocol tcp --dst-port 3000 grafana\n"})}),"\n",(0,o.jsxs)(n.ol,{start:"4",children:["\n",(0,o.jsx)(n.li,{children:"To connect to the VM via ssh later, we create an SSH keypair"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"openstack keypair create --private-key ~/.ssh/oshm-key.pem oshm-key\nchmod og-r ~/.ssh/oshm-key.pem \n"})}),"\n",(0,o.jsxs)(n.p,{children:["Rather than creating a new key (and storing and protecting the private key), we could have passed ",(0,o.jsx)(n.code,{children:"--public-key"})," and used an existing keypair."]}),"\n",(0,o.jsxs)(n.ol,{start:"5",children:["\n",(0,o.jsx)(n.li,{children:"Look up Debian 12 image UUID."}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"IMGUUID=$(openstack image list --name \"Debian 12\" -f value -c ID | tr -d '\\r')\necho $IMGUUID\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Sidenote: The ",(0,o.jsx)(n.code,{children:"tr"})," command is there to handle broken tooling that embeds a trailing ",(0,o.jsx)(n.code,{children:"\\r"})," in the output."]}),"\n",(0,o.jsxs)(n.ol,{start:"6",children:["\n",(0,o.jsx)(n.li,{children:"Boot the driver VM"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"openstack server create --network oshm-network --key-name oshm-key --security-group default --security-group sshping --security-group grafana --flavor SCS-2V-4 --block-device boot_index=0,uuid=$IMGUUID,source_type=image,volume_size=10,destination_type=volume,delete_on_termination=true oshm-driver\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Chose a flavor that exists on your cloud. Here we have used one without root disk and asked nova to create a volume on the fly by passing ",(0,o.jsx)(n.code,{children:"--block-device"}),". See ",(0,o.jsx)(n.a,{href:"https://scs.community/2023/08/21/diskless-flavors/",children:"diskless flavor blog article"}),". For flavors with local root disks, you could have used the ",(0,o.jsx)(n.code,{children:"--image $IMGUUID"})," parameter instead."]}),"\n",(0,o.jsxs)(n.ol,{start:"7",children:["\n",(0,o.jsxs)(n.li,{children:["Wait for it to boot (optional)\nYou can look at the boot log with ",(0,o.jsx)(n.code,{children:"openstack console log show oshm-driver"})," or connect to it via VNC at the URL given by ",(0,o.jsx)(n.code,{children:"openstack console url show oshm-driver"}),". You can of course also query openstack on the status ",(0,o.jsx)(n.code,{children:"openstack server list"})," or ",(0,o.jsx)(n.code,{children:"openstack server show oshm-driver"}),". You can also just create a simple loop:"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'declare -i ctr=0 RC=0\nwhile [ $ctr -le 120 ]; do\n STATUS="$(openstack server list --name oshm-driver -f value -c Status)"\n if [ "$STATUS" = "ACTIVE" ]; then echo "$STATUS"; break; fi \n if [ "$STATUS" = "ERROR" ]; then echo "$STATUS"; RC=1; break; fi\n if [ -z "$STATUS" ]; then echo "No such VM"; RC=2; break; fi\n sleep 2\n let ctr+=1\ndone\n# return $RC\nif [ $RC != 0 ]; then false; fi\n'})}),"\n",(0,o.jsxs)(n.ol,{start:"8",children:["\n",(0,o.jsx)(n.li,{children:"Attach a floating IP so it's reachable from the outside."}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'FIXEDIP=$(openstack server list --name oshm-driver -f value -c Networks | sed "s@^[^:]*:[^\']*\'\\([0-9\\.]*\\)\'.*\\$@\\1@")\nFIXEDPORT=$(openstack port list --fixed-ip ip-address=$FIXEDIP,subnet=oshm-subnet -f value -c ID)\necho $FIXEDIP $FIXEDPORT\nopenstack floating ip create --port $FIXEDPORT $PUBLIC\nFLOATINGIP=$(openstack floating ip list --fixed-ip-address $FIXEDIP -f value -c "Floating IP Address")\necho "Floating IP: $FLOATINGIP"\n'})}),"\n",(0,o.jsx)(n.p,{children:"Remember this floating IP address."}),"\n",(0,o.jsxs)(n.ol,{start:"9",children:["\n",(0,o.jsx)(n.li,{children:"Connect to it via ssh"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"ssh -i ~/.ssh/oshm-key.pem debian@$FLOATINGIP\n"})}),"\n",(0,o.jsx)(n.p,{children:"On the first connection, you need to accept the new ssh host key. (Very careful people would compare the fingerprint with the console log output.)"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"All the following commands are performed on the newly started driver VM."})}),"\n",(0,o.jsx)(n.h3,{id:"configuring-openstack-cli-on-the-driver-vm",children:"Configuring openstack CLI on the driver VM"}),"\n",(0,o.jsx)(n.p,{children:"We need to install the openstack client utilities."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo apt-get update\nsudo apt-get install python3-openstackclient\nsudo apt-get install python3-cinderclient python3-octaviaclient python3-swiftclient python3-designateclient\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Configure your cloud access in ",(0,o.jsx)(n.code,{children:"~/.config/openstack/clouds.yaml"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"clouds:\n CLOUDNAME:\n interface: public\n identity-api-version: 3\n #region_name: REGION\n auth:\n auth_url: KEYSTONE_ENDPOINT\n project_id: PROJECT_UUID\n #alternatively project_name and project_domain_name\n user_domain_name: default\n # change to your real domain\n"})}),"\n",(0,o.jsxs)(n.p,{children:["and ",(0,o.jsx)(n.code,{children:"secure.yaml"})," (in the same directory)"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"clouds:\n CLOUDNAME:\n auth:\n username: USERNAME\n password: PASSWORD\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"CLOUDNAME"})," can be freely chosen. This is the value passed to the openstack CLI with ",(0,o.jsx)(n.code,{children:"--os-cloud"})," or exported to your environment in ",(0,o.jsx)(n.code,{children:"OS_CLOUD"}),". The other uppercase words need to be adjusted to match your cloud. Hint: horizon typically lets you download a sample ",(0,o.jsx)(n.code,{children:"clouds.yaml"})," file that works (but lacks the password)."]}),"\n",(0,o.jsxs)(n.p,{children:["Protect your ",(0,o.jsx)(n.code,{children:"secure.yaml"})," from being read by others: ",(0,o.jsx)(n.code,{children:"chmod 0600 ~/.config/openstack/secure.yaml"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["If you are using application credentials instead of username, password to authenticate, you don't need to specify ",(0,o.jsx)(n.code,{children:"project_id"})," nor project's nor user's domain names in ",(0,o.jsx)(n.code,{children:"clouds.yaml"}),". Just (in ",(0,o.jsx)(n.code,{children:"secure.yaml"}),"):"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'clouds:\n CLOUDNAME:\n auth_type: v3applicationcredential\n auth:\n application_credential_id: APPCRED_ID\n application_credential_secret: "APPCRED_SECRET"\n'})}),"\n",(0,o.jsx)(n.p,{children:"Configure this to be your default cloud:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"export OS_CLOUD=CLOUDNAME\n"})}),"\n",(0,o.jsxs)(n.p,{children:["You might consider adding this to your ",(0,o.jsx)(n.code,{children:"~/.bashrc"})," for convenience. Being at it, you might want to add ",(0,o.jsx)(n.code,{children:"export CLIFF_FIT_WIDTH=1"})," there as well to make openstack command output tables more readable (but sometimes less easy to cut'n'paste)."]}),"\n",(0,o.jsx)(n.p,{children:"Verify that your openstack CLI works:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"openstack catalog list\nopenstack server list\n"})}),"\n",(0,o.jsx)(n.p,{children:"You can use the same project as you use for your driver VM (and possibly other workloads). The openstack-health-monitor is carefully designed to not clean up anything that it has not created. There is however some trickiness, as not all resources have names (floating IPs for example do not) and sometimes names need to be assigned after creation of a resource (volumes of diskless flavors), so in case there are API errors, some heuristics is used to identify resources which may not be safe under all circumstances. So ideally, you have an extra project created just for the health-monitor and configure the credentials for it here, so you can not possibly hit any wrong resource in the script's extensive efforts to clean up in error cases."}),"\n",(0,o.jsx)(n.h3,{id:"custom-ca",children:"Custom CA"}),"\n",(0,o.jsxs)(n.p,{children:["If your cloud API's endpoints don't use TLS certificates that are signed by an official CA, you need to provide your CA to this VM and configure it. (On a SCS Cloud-in-a-Box system, you find it on the manager node in ",(0,o.jsx)(n.code,{children:"/etc/ssl/certs/ca-certificates.crt"}),". You may extract the last cert or just leave them all together.) Copy the CA file to your driver VM and ensure it's readable by the ",(0,o.jsx)(n.code,{children:"debian"})," user."]}),"\n",(0,o.jsxs)(n.p,{children:["Add it to your ",(0,o.jsx)(n.code,{children:"clouds.yaml"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"clouds:\n CLOUDNAME:\n cacert: /PATH/TO/CACERT.CRT\n [...]\n"})}),"\n",(0,o.jsxs)(n.p,{children:["If you want to allow ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," to be able to talk to the service endpoints directly to avoid getting a fresh token from keystone for each call, you also need to export it to your environment:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"export OS_CACERT=/PATH/TO/CACERT.CRT\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Consider adding this to your ",(0,o.jsx)(n.code,{children:"~/.bashrc"})," as well."]}),"\n",(0,o.jsxs)(n.h2,{id:"your-first-api_monitorsh-iteration",children:["Your first ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," iteration"]}),"\n",(0,o.jsx)(n.p,{children:"Checkout openstack-health-monitor:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo apt-get install git bc jq netcat-traditional tmux zstd\ngit clone https://github.com/SovereignCloudStack/openstack-health-monitor\ncd openstack-health-monitor\n"})}),"\n",(0,o.jsxs)(n.p,{children:["You may want to start a ",(0,o.jsx)(n.code,{children:"tmux"})," (or ",(0,o.jsx)(n.code,{children:"screen"}),") session now, so you can do multiple things in parallel (e.g. for debugging) and reconnect."]}),"\n",(0,o.jsxs)(n.p,{children:["The script ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," is the main worker of openstack-health-monitor and runs one to many iterations of a cycle where resources are created, tested and torn down. Its operation is described in the ",(0,o.jsx)(n.a,{href:"https://github.com/SovereignCloudStack/openstack-health-monitor/blob/main/README.md",children:"README.md"})," file."]}),"\n",(0,o.jsxs)(n.p,{children:["It is good practice to use ",(0,o.jsx)(n.code,{children:"tmux"}),". This allows you to return (reattach) to console sessions and to open new windows to investigate things. Traditional people may prefer to ",(0,o.jsx)(n.code,{children:"screen"})," over ",(0,o.jsx)(n.code,{children:"tmux"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"You should be ready to run one iteration of the openstack-health-monitor now. Run it like this:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'export IMG="Debian 12"\nexport JHIMG="Debian 12"\n./api_monitor.sh -O -C -D -n 6 -s -b -B -M -T -LL -i 1\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Leave out the ",(0,o.jsx)(n.code,{children:"-LL"})," if you don't have a working loadbalancer service or replace ",(0,o.jsx)(n.code,{children:"-LL"})," with ",(0,o.jsx)(n.code,{children:"-LO"})," if you want to test the ovn loadbalancer instead of amphorae (saving quite some resources)."]}),"\n",(0,o.jsxs)(n.p,{children:["Feel free to study the meaning of all the command line parameters by looking at the ",(0,o.jsx)(n.a,{href:"https://github.com/SovereignCloudStack/openstack-health-monitor/blob/main/README.md",children:"README.md"}),". (Note: Many of the things enabled by the parameters should be default, but are not for historic reasons. This would change if we rewrite this whole thing in python.)"]}),"\n",(0,o.jsxs)(n.p,{children:["This will run for ~7 minutes, depending on the performance of your OpenStack environment. You should not get any error. (The amber-colored outputs ",(0,o.jsx)(n.code,{children:"DOWN"}),", ",(0,o.jsx)(n.code,{children:"BUILD"}),", ",(0,o.jsx)(n.code,{children:"creating"})," are not errors. Nothing in red should be displayed.) Studying the console output may be instructive to follow the script's progress. You may also open another window (remember the tmux recommendation above) and look at the resources with the usual ",(0,o.jsx)(n.code,{children:"openstack RESOURCE list"})," and ",(0,o.jsx)(n.code,{children:"openstack RESOURCE show NAME"})," and ",(0,o.jsx)(n.code,{children:"RESOURCE"})," being something like ",(0,o.jsx)(n.code,{children:"router"}),", ",(0,o.jsx)(n.code,{children:"network"}),", ",(0,o.jsx)(n.code,{children:"subnet"}),", ",(0,o.jsx)(n.code,{children:"port"}),", ",(0,o.jsx)(n.code,{children:"volume"}),", ",(0,o.jsx)(n.code,{children:"server"}),", ",(0,o.jsx)(n.code,{children:"floating ip"}),", ",(0,o.jsx)(n.code,{children:"loadbalancer"}),", ",(0,o.jsx)(n.code,{children:"loadbalancer pool"}),", ",(0,o.jsx)(n.code,{children:"loadbalancer listener"}),", ",(0,o.jsx)(n.code,{children:"security group"}),", ",(0,o.jsx)(n.code,{children:"keypair"}),", ",(0,o.jsx)(n.code,{children:"image"}),", ...)"]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," uses and ",(0,o.jsx)(n.code,{children:"APIMonitor_TIMESTAMP"})," prefix for all OpenStack resource names. This allows to identify the created resources and clean them up even if things go wrong.\n",(0,o.jsx)(n.code,{children:"TIMESTAMP"})," is an integer number representing the seconds after 1970-01-01 00:00:00 UTC (Unix time)."]}),"\n",(0,o.jsxs)(n.p,{children:["This may be the time to check that you have sufficient quota to create the resources. While we only create 6+N VMs (and volumes) with the above call (N being the number of AZs), we would want to increase this number for larger clouds. For single-AZ deployments, we would want to still use 2 networks at least ",(0,o.jsx)(n.code,{children:"-N 2"})," to test the ability of the router to route traffic between networks. So expect ",(0,o.jsx)(n.code,{children:"-n 6"})," to become ",(0,o.jsx)(n.code,{children:"-N 2 -n 6"})," for a very small single-AZ cloud or ",(0,o.jsx)(n.code,{children:"-n 12"})," for a large 3 AZ cloud region. So, re-run the ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," with the target sizing."]}),"\n",(0,o.jsx)(n.h3,{id:"resource-impact-and-charging",children:"Resource impact and charging"}),"\n",(0,o.jsxs)(n.p,{children:["Note that ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," uses small flavors (",(0,o.jsx)(n.code,{children:"SCS-1V-2"})," for the N jump hosts and ",(0,o.jsx)(n.code,{children:"SCS-1L-1"})," for the other VMs) to keep the impact on your cloud (and on your invoice if you are not monitoring your own cloud) small. You can change the flavors."]}),"\n",(0,o.jsxs)(n.p,{children:["If you have to pay for this, also consider that some clouds are not charging by the minute but may count by the started hour. So when you run ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," in a loop (which you will) with say 10 VMs (e.g. ",(0,o.jsx)(n.code,{children:"-N 2 -n 8"}),") in each iteration and run this for an hour with 8 iterations, you will never have more than 10 VMs in parallel and they only are alive a bit more than half of the time, but rather than being charged for ~6 VM hours, you end up being charged for ~80 VM hours. Similar for volumes, routers, floating IPs. This makes a huge difference."]}),"\n",(0,o.jsxs)(n.p,{children:["Sometimes the cloud under test has issues. That's why we do monitoring ... One thing that might happen is that loadbalancers and volumes (and other resources, but those two are the most prone to this) end up in a broken state that can not be cleaned up by the user any more. Bad providers may charge for these anyhow, although this will never stand a legal dispute. (IANAL, but charging for providing something that is not working is not typically supported by civil law in most jurisdictions and T&Cs that would say so would not normally be legally enforceable.) If this happens, I recommend to keep records of the broken state (store the output of ",(0,o.jsx)(n.code,{children:"openstack volume list"}),", ",(0,o.jsx)(n.code,{children:"openstack volume show BROKEN_VOLUME"}),", ",(0,o.jsx)(n.code,{children:"openstack loadbalancer list"}),", ",(0,o.jsx)(n.code,{children:"openstack loadbalancer show BROKEN_LB"}),".)"]}),"\n",(0,o.jsxs)(n.p,{children:["Using ",(0,o.jsx)(n.code,{children:"-w -1"})," makes ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," wait for interactive input whenever an error occurs; this can be convenient for debugging."]}),"\n",(0,o.jsx)(n.p,{children:"Once you have single iterations working nicely, we can proceed."}),"\n",(0,o.jsx)(n.h2,{id:"automating-startup-and-cleanup",children:"Automating startup and cleanup"}),"\n",(0,o.jsxs)(n.p,{children:["Typically, we run ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," with a limited amount of iterations (200) and then restart it. For each restart, we also output some statistics, compress the log file and look at any leftovers that did not get cleaned up. The latter happens in the start script that we create here."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'#!/bin/bash\n# run_CLOUDNAME.sh\n# Do some global settings\nexport IMG="Debian 12"\nexport JHIMG="Debian 12"\n#export OS_CACERT=/home/debian/ca-certificates.pem\n# Additional settings to override flavors or to\n# configure email addresses for sending alarms can be set here\n\n# Does openstack CLI work?\nopenstack server list >/dev/null || exit 1\n# Upload log files to this swift container (which you need to create)\n#export SWIFTCONTAINER=OS-HM-Logfiles\n\n# CLEANUP\necho "Finding resources from previous runs to clean up ..."\n# Find Floating IPs\nFIPLIST=""\nFIPS=$(openstack floating ip list -f value -c ID)\nfor fip in $FIPS; do\n FIP=$(openstack floating ip show $fip | grep -o "APIMonitor_[0-9]*")\n if test -n "$FIP"; then FIPLIST="${FIPLIST}${FIP}_\n"; fi\ndone\nFIPLIST=$(echo "$FIPLIST" | grep -v \'^$\' | sort -u)\n# Cleanup previous interrupted runs\nSERVERS=$(openstack server list | grep -o "APIMonitor_[0-9]*_" | sort -u)\nKEYPAIR=$(openstack keypair list | grep -o "APIMonitor_[0-9]*_" | sort -u)\nVOLUMES=$(openstack volume list | grep -o "APIMonitor_[0-9]*_" | sort -u)\nNETWORK=$(openstack network list | grep -o "APIMonitor_[0-9]*_" | sort -u)\nLOADBAL=$(openstack loadbalancer list | grep -o "APIMonitor_[0-9]*_" | sort -u)\nROUTERS=$(openstack router list | grep -o "APIMonitor_[0-9]*_" | sort -u)\nSECGRPS=$(openstack security group list | grep -o "APIMonitor_[0-9]*_" | sort -u)\necho CLEANUP: FIPs $FIPLIST Servers $SERVERS Keypairs $KEYPAIR Volumes $VOLUMES Networks $NETWORK LoadBalancers $LOADBAL Routers $ROUTERS SecGrps $SECGRPS\nfor ENV in $FIPLIST; do\n echo "******************************"\n echo "CLEAN $ENV"\n bash ./api_monitor.sh -o -T -q -c CLEANUP $ENV\n echo "******************************"\ndone\nTOCLEAN=$(echo "$SERVERS\n$KEYPAIR\n$VOLUMES\n$NETWORK\n$LOADBAL\n$ROUTERS\n$SECGRPS\n" | grep -v \'^$\' | sort -u)\nfor ENV in $TOCLEAN; do\n echo "******************************"\n echo "CLEAN $ENV"\n bash ./api_monitor.sh -o -q -LL -c CLEANUP $ENV\n echo "******************************"\ndone\n\n# Now run the monitor\n#exec ./api_monitor.sh -O -C -D -N 2 -n 6 -s -M -LO -b -B -a 2 -t -T -R -S ciab "$@"\nexec ./api_monitor.sh -O -C -D -N 2 -n 6 -s -M -LO -b -B -T "$@"\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Compared to the previous run, we have explicitly set two networks here ",(0,o.jsx)(n.code,{children:"-N 2"})," and rely on the iterations being passed in as command line arguments. Add parameter ",(0,o.jsx)(n.code,{children:"-t"})," if your cloud is slow to increase timeouts. We have enabled the ovtavia loadbalancer (",(0,o.jsx)(n.code,{children:"-LO"}),") in this example rather than the amphora based one (",(0,o.jsx)(n.code,{children:"-LL"}),")."]}),"\n",(0,o.jsxs)(n.p,{children:["You may use one of the existing ",(0,o.jsx)(n.code,{children:"run_XXXX.sh"})," scripts as example. Beware: eMail alerting with ",(0,o.jsx)(n.code,{children:"ALARM_EMAIL_ADDRESS"})," and ",(0,o.jsx)(n.code,{children:"NOTE_EMAIL_ADDRESS"})," (and limiting with ",(0,o.jsx)(n.code,{children:"-a"})," and ",(0,o.jsx)(n.code,{children:"-R"})," ) and reporting data to telegraf (option ",(0,o.jsx)(n.code,{children:"-S"}),") may be present in the samples. Make this script executable (",(0,o.jsx)(n.code,{children:"chmod +x run_CLOUDNAME.sh"}),")."]}),"\n",(0,o.jsxs)(n.p,{children:["We wrap a loop around this in ",(0,o.jsx)(n.code,{children:"run_in_loop.sh"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'#!/bin/bash\n# run_in_loop.sh\nrm stop-os-hm 2>/dev/null\nwhile true; do\n ./run_CLOUDNAME.sh -i 200\n if test -e stop-os-hm; then break; fi\n echo -n "Hit ^C to abort ..."\n sleep 15; echo\ndone\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Also make this executable (",(0,o.jsx)(n.code,{children:"chmod +x run_in_loop.sh"}),").\nTo run this automatically in a tmux window whenever the system starts, we follow the steps in the ",(0,o.jsx)(n.a,{href:"https://github.com/SovereignCloudStack/openstack-health-monitor/blob/main/startup/README.md",children:"startup README.md"})]}),"\n",(0,o.jsxs)(n.p,{children:["Change ",(0,o.jsx)(n.code,{children:"OS_CLOUD"})," in ",(0,o.jsx)(n.code,{children:"startup/run-apimon-in-tmux.sh"}),". (If you need to set ",(0,o.jsx)(n.code,{children:"OS_CACERT"}),", also add it in this file and pass it into the windows.)"]}),"\n",(0,o.jsx)(n.p,{children:"Activate everything:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"mkdir -p ~/.config/systemd/user/\ncp -p startup/apimon.service ~/.config/systemd/user/\nsystemctl --user enable apimon\nsystemctl --user start apimon\nsudo loginctl enable-linger debian\ntmux attach oshealthmon\n"})}),"\n",(0,o.jsxs)(n.p,{children:["This assumes that you are using the user ",(0,o.jsx)(n.code,{children:"debian"})," for this monitoring and have checked out the repository at ",(0,o.jsx)(n.code,{children:"~/openstack-health-monitor/"}),". Adjust the paths and user name otherwise. (If for whatever reason you have chosen to install things as root, you will have to install the systemd service unit in the system paths and ensure it's not started too early in the boot process.)"]}),"\n",(0,o.jsx)(n.h3,{id:"changing-parameters-and-restarting",children:"Changing parameters and restarting"}),"\n",(0,o.jsxs)(n.p,{children:["If you want to change the parameters passed to ",(0,o.jsx)(n.code,{children:"api_monitor.sh"}),", you best do this by editing ",(0,o.jsx)(n.code,{children:"run_CLOUDNAME.sh"}),", potentially after testing it with one iteration before."]}),"\n",(0,o.jsxs)(n.p,{children:["To make the change effective, you can wait until the current 200 iterations are completed and the ",(0,o.jsx)(n.code,{children:"run_in_loop.sh"})," calls ",(0,o.jsx)(n.code,{children:"run_CLOUDNAME.sh"})," again. You can also hit ",(0,o.jsx)(n.code,{children:"^C"})," in the tmux window that has",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," running. The script will then exit after the current iteration. Note that sending this interrupt is handled by the script, so it does still continue the current iteration and do all the cleanup work. However, you may interrupt an API call and thus cause a spurious error (which may in the worst case lead to a couple more spurious errors). If you want to avoid this, hit ",(0,o.jsx)(n.code,{children:"^C"})," during the wait/sleep phases of the script (after having done all the tests or after having completed the iteration). If you hit ",(0,o.jsx)(n.code,{children:"^C"})," twice, it will abort the the current iteration, but still try to clean up. Then the outer script will also exit and you have to restart by manually calling ",(0,o.jsx)(n.code,{children:"./run_in_loop.sh"})," again."]}),"\n",(0,o.jsxs)(n.p,{children:["You can also issue the ",(0,o.jsx)(n.code,{children:"systemctl --user stop apimon"})," command; it will basically do the same thing: Send ",(0,o.jsx)(n.code,{children:"^C"})," and then wait for everything to be completed and tear down the tmux session.\nAfter waiting for that to complete, you can start it again with ",(0,o.jsx)(n.code,{children:"systemctl --user start apimon"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"multiple-instances",children:"Multiple instances"}),"\n",(0,o.jsxs)(n.p,{children:["You can run multiple instances of ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," on the same driver VM. In this case, you should rename ",(0,o.jsx)(n.code,{children:"run_in_loop.sh"})," to e.g. ",(0,o.jsx)(n.code,{children:"run_in_loop_CLOUDNAME1.sh"})," and call ",(0,o.jsx)(n.code,{children:"run_CLOUDNAME1.sh"})," from there. Don't forget to adjust ",(0,o.jsx)(n.code,{children:"startup/run-apimon-in-tmux.sh"})," and ",(0,o.jsx)(n.code,{children:"startup/kill-apimon-in-tmux.sh"})," to start more windows."]}),"\n",(0,o.jsxs)(n.p,{children:["It is not recommended to run multiple instances against the same OpenStack project however. While the ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," script carefully keeps track of its own resources and avoids to delete things it has not created, this is not the case for the ",(0,o.jsx)(n.code,{children:"run_CLOUDNAME.sh"})," script, which is explicitly meant to identify anything in the target project that was created by a health monitor and clean it up. If it hits the resources that are currently in use by another health mon instance, this will create spurious errors. This will happen every ~200 iterations, so you could still have some short-term coexistence when you are performing debug operations."]}),"\n",(0,o.jsx)(n.h2,{id:"alarming-and-logs",children:"Alarming and Logs"}),"\n",(0,o.jsx)(n.h3,{id:"email",children:"eMail"}),"\n",(0,o.jsxs)(n.p,{children:["If wanted, the ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," can send statistics and error messages via email, so operator personnel is informed about the state of the monitoring. This email notification service potentially results in many emails; one error may produce several mails. So in case of a systematic problem, expect to receive dozens of mails per hour. This can be reduced a bit using the ",(0,o.jsx)(n.code,{children:"-a N"})," and ",(0,o.jsx)(n.code,{children:"-R"})," options. In order to enable sending emails from the driver VM, it needs to have ",(0,o.jsx)(n.code,{children:"postfix"})," (or another MTA) installed and configured and outgoing connections for eMail need to be allowed. Note that many operators prefer not to use the eMail notifications but rather rely on looking at the dashboards (see further down) regularly."]}),"\n",(0,o.jsxs)(n.p,{children:["Once you have configured ",(0,o.jsx)(n.code,{children:"postfix"}),", you can enable eMail notifications using the option ",(0,o.jsx)(n.code,{children:"-e"}),". Using it twice allows you to differentiate between notes (statistical summaries) and errors. If you want to send mails to more than one recipient, you can do so by passing ",(0,o.jsx)(n.code,{children:"ALARM_EMAIL_ADDRESSES"})," and ",(0,o.jsx)(n.code,{children:"NOTE_EMAIL_ADDRESSES"})," environment variables to ",(0,o.jsx)(n.code,{children:"api_monitor.sh"}),", e.g. by setting it in the ",(0,o.jsx)(n.code,{children:"run_CLOUDNAME.sh"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"log-files",children:"Log files"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"api_monitor.sh"})," writes a log file with the name ",(0,o.jsx)(n.code,{children:"APIMonitor_TIMESTAMP.log"}),". It contains a bit of information to see the progress of the script; more importantly, it logs every single openstack CLI call along with parameters and results. (",(0,o.jsx)(n.code,{children:"TIMESTAMP"})," is the Unix time, i.e. seconds since 1970-01-01 00:00:00 UTC.)"]}),"\n",(0,o.jsxs)(n.p,{children:["Note that ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," does take some care not to expose secrets -- since v1.99, it does also redact issued tokens (which would otherwise give you up to 24hrs of access). But the Log files still may contain moderately sensitive information, so we suggest to not share it with untrusted parties."]}),"\n",(0,o.jsxs)(n.p,{children:["The log file is written to the file system. After finishing the 200 iterations, the log file is compressed. If the environment variable ",(0,o.jsx)(n.code,{children:"SWIFTCONTAINER"})," has been set (in ",(0,o.jsx)(n.code,{children:"run_COULDNAME.sh"}),") when starting ",(0,o.jsx)(n.code,{children:"api_monitor.sh"}),". the log file will be uploaded to a container with that name if it exists and if the swift object storage service is supported by the cloud. So create the container (a bucket in S3 speak) before if you want to use this: ",(0,o.jsx)(n.code,{children:"export SWIFTCONTAINER=OSHM_Logs; openstack container create $SWIFTCONTAINER"})]}),"\n",(0,o.jsxs)(n.p,{children:["After the 200 iterations, a ",(0,o.jsx)(n.code,{children:".psv"})," file (pipe-separated values) is created ",(0,o.jsx)(n.code,{children:"Stats.STARTTIME-ENDTIME.psv"})," (with times as calendar dates) which contains a bit of statistics on the last 200 iterations. This one will also be uploaded to $SWIFTCONTAINER (if configured)."]}),"\n",(0,o.jsx)(n.h2,{id:"data-collection-and-dashboard",children:"Data collection and dashboard"}),"\n",(0,o.jsxs)(n.p,{children:["See ",(0,o.jsx)(n.a,{href:"https://github.com/SovereignCloudStack/openstack-health-monitor/blob/main/dashboard/README.md",children:"https://github.com/SovereignCloudStack/openstack-health-monitor/blob/main/dashboard/README.md"})]}),"\n",(0,o.jsx)(n.h3,{id:"telegraf",children:"telegraf"}),"\n",(0,o.jsx)(n.p,{children:"To install telegraf on Debian 12, we need to add the apt repository provided by InfluxData:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'sudo curl -fsSL https://repos.influxdata.com/influxdata-archive_compat.key -o /etc/apt/keyrings/influxdata-archive_compat.key\necho "deb [signed-by=/etc/apt/keyrings/influxdata-archive_compat.key] https://repos.influxdata.com/debian stable main" | sudo tee /etc/apt/sources.list.d/influxdata.list\nsudo apt update\nsudo apt -y install telegraf\n'})}),"\n",(0,o.jsxs)(n.p,{children:["In the config file ",(0,o.jsx)(n.code,{children:"/etc/telegraf/telegraf.conf"}),", we enable"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'[[inputs.influxdb_listener]]\n service_address = ":8186"\n\n[[outputs.influxdb]]\n urls = ["http://127.0.0.1:8086"]\n'})}),"\n",(0,o.jsxs)(n.p,{children:["and restart the service (",(0,o.jsx)(n.code,{children:"sudo systemctl restart telegraf"}),").\nEnable it on system startup: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable telegraf"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"influxdb",children:"influxdb"}),"\n",(0,o.jsx)(n.p,{children:"We proceed to influxdb:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo apt-get install influxdb\n"})}),"\n",(0,o.jsxs)(n.p,{children:["In the configuration file ",(0,o.jsx)(n.code,{children:"/etc/influxdb/influxdb.conf"}),", ensure that the http interface on port 8086 is enabled."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'[http]\n enabled = true\n bind-address = ":8086"\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Restart influxdb as needed with ",(0,o.jsx)(n.code,{children:"sudo systemctl restart influxdb"}),".\nAlso enable it on system startup: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable influxdb"}),"."]}),"\n",(0,o.jsxs)(n.h3,{id:"add--s-cloudname-to-your-run_cloudnamesh-script",children:["Add ",(0,o.jsx)(n.code,{children:"-S CLOUDNAME"})," to your ",(0,o.jsx)(n.code,{children:"run_CLOUDNAME.sh"})," script"]}),"\n",(0,o.jsxs)(n.p,{children:["You need to tell the monitor that it should send data via telegraf to influxdb by adding the parameter ",(0,o.jsx)(n.code,{children:"-S CLOUDNAME"})," to the ",(0,o.jsx)(n.code,{children:"api_monitor.sh"})," call in ",(0,o.jsx)(n.code,{children:"run_CLOUDNAME.sh"}),". Restart it (see above) to make the change effective immediately (and not only after 200 iterations complete)."]}),"\n",(0,o.jsx)(n.h3,{id:"grafana",children:"grafana"}),"\n",(0,o.jsx)(n.h4,{id:"basic-config",children:"Basic config"}),"\n",(0,o.jsxs)(n.p,{children:["Finally grafana: We (still as root) follow ",(0,o.jsx)(n.a,{href:"https://www.server-world.info/en/note?os=Debian_12&p=grafana",children:"https://www.server-world.info/en/note?os=Debian_12&p=grafana"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'sudo wget -q -O /usr/share/keyrings/grafana.key https://packages.grafana.com/gpg.key\necho "deb [signed-by=/usr/share/keyrings/grafana.key] https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list\nsudo apt update\nsudo apt -y install grafana\n'})}),"\n",(0,o.jsxs)(n.p,{children:["The config file ",(0,o.jsx)(n.code,{children:"/etc/grafana/grafana.ini"})," needs some adjustments:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Set the hostname in ",(0,o.jsx)(n.code,{children:"[server]"})," section: ",(0,o.jsx)(n.code,{children:"domain = health.YOURCLOUD.sovereignit.cloud"}),". Set the ",(0,o.jsx)(n.code,{children:"protocol = https"})," if not enabled by default.\nYou can use a hostname of your liking, but we will need to create TLS certificates for this host. So we should have control over DNS TXT records for this domain if we want to use Let's Encrypt with DNSAUTH. The ",(0,o.jsx)(n.code,{children:"sovereignit.cloud"})," domain is controlled by the SCS project team and has been used for a number of health mon instances.\nIn this same section, set ",(0,o.jsx)(n.code,{children:"cert_file = /etc/grafana/health-fullchain.pem"})," and ",(0,o.jsx)(n.code,{children:"cert_key = /etc/grafana/health-key.pem"}),". Ensure that both files are readable by ",(0,o.jsx)(n.code,{children:"root:grafana"})," and that the key file is ",(0,o.jsx)(n.em,{children:"not"})," world-readable."]}),"\n",(0,o.jsxs)(n.li,{children:["Configure the admin access. In section ",(0,o.jsx)(n.code,{children:"[security]"}),", set the ",(0,o.jsx)(n.code,{children:"admin_user = admin"})," and ",(0,o.jsx)(n.code,{children:"admin_password = SOME_SECRET_PASS"})," which you keep private."]}),"\n",(0,o.jsxs)(n.li,{children:["Allow local data sources (same section): ",(0,o.jsx)(n.code,{children:"data_source_proxy_whitelist = localhost:8088 localhost:8086"})]}),"\n",(0,o.jsxs)(n.li,{children:["Let's disallow user signup (in section ",(0,o.jsx)(n.code,{children:"[users]"}),"): ",(0,o.jsx)(n.code,{children:"allow_sign_up = false"})," and ",(0,o.jsx)(n.code,{children:"allow_org_create = false"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["We do the OIDC connection with ",(0,o.jsx)(n.code,{children:"[auth.github]"})," later."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["We can now restart the service: ",(0,o.jsx)(n.code,{children:"sudo systemctl restart grafana-server"}),".\nBeing at it, also enable it on system startup: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable grafana-server"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["You should now be able to access your dashboard on ",(0,o.jsx)(n.code,{children:"https://health.YOURCLOUD.sovereignit.de:3000"})," and log in via the configured username ",(0,o.jsx)(n.code,{children:"admin"})," and your ",(0,o.jsx)(n.code,{children:"SOME_SECRET_PASS"})," password."]}),"\n",(0,o.jsx)(n.h4,{id:"enable-influx-database-in-grafana",children:"Enable influx database in grafana"}),"\n",(0,o.jsxs)(n.p,{children:["In the dashboard, go to Home, Connections, choose InfluxDB and Add new datasource. The defaults (database name, InfluxQL query language) work. You need to explicitly set the URL to ",(0,o.jsx)(n.code,{children:"http://localhost:8086"})," (despite this being the suggestion). Set the database name to ",(0,o.jsx)(n.code,{children:"telegraf"}),". Save&test should succeed."]}),"\n",(0,o.jsx)(n.h4,{id:"importing-the-dashboard",children:"Importing the dashboard"}),"\n",(0,o.jsxs)(n.p,{children:["Go to Home, Dashboards, New, Import.\nUpload the dashboard ",(0,o.jsx)(n.a,{href:"https://github.com/SovereignCloudStack/openstack-health-monitor/blob/main/dashboard/openstack-health-dashboard.json",children:".json file"})," from the repository, user the ",(0,o.jsx)(n.a,{href:"https://github.com/SovereignCloudStack/openstack-health-monitor/blob/main/dashboard/openstack-health-dashboard-10.json",children:"Grafana-10 variant"})," if you use Grafana 10 or newer."]}),"\n",(0,o.jsx)(n.p,{children:"In the dashboard, go to the settings gear wheel, variables, mycloud and add CLOUDNAME to the list of clouds that can be displayed. (There are some existing SCS clouds in that list.)\nSave."}),"\n",(0,o.jsx)(n.p,{children:"Now choose CLOUDNAME as cloud (top of the dashboard, rightmost dropdown for the mycloud filter variable)."}),"\n",(0,o.jsx)(n.h4,{id:"no-data-displayed",children:"No data displayed?"}),"\n",(0,o.jsx)(n.p,{children:'Sometimes, you may see a panel displaying "no data" despite the fact that the first full iteration of data has been sent to influx already. This may be a strange interaction between the browser and Grafana -- we have not analyzed whether that is a bug in Grafana.'}),"\n",(0,o.jsx)(n.p,{children:"One way to work around is to go into the setting of the panel (the three dots in the upper right corner), go to edit and start changing one aspect of the query. Apply. Change it back to the original. Apply. The data will appear. Save to be sure it's conserved."}),"\n",(0,o.jsx)(n.h4,{id:"dashboard-features",children:"Dashboard features"}),"\n",(0,o.jsx)(n.p,{children:"Look at the top line filters: You can filter to only see certain API calls or certain resources; the graphs are very crowded and filtering to better see what you want to focus on is very well intended."}),"\n",(0,o.jsx)(n.p,{children:"The first row of panels give a health impression; there are absolute numbers as well as percentage numbers and the panels turn amber and red in case you have too many errors. Note that the colors on the panels with absolute numbers can not take into account whether you look at just a few hours or at weeks. Accordingly, consider the colors a reasonable hint if things are green or not when looking at a ~24 hours interval. This limitation does not affect the colors on the percentage graph, obviously."}),"\n",(0,o.jsx)(n.p,{children:"You can change the time interval and zoom in also by marking an interval with the mouse. Zooming out to a few months can be a very useful feature to see trends and watch e.g. your API performance, your resource creation times or the benchmarks change over the long term."}),"\n",(0,o.jsx)(n.h4,{id:"github-oidc-integration",children:"github OIDC integration"}),"\n",(0,o.jsxs)(n.p,{children:["The SCS providers do allow all github users that belong to the SovereignCloudStack organization to get Viewer access to the dashboards by adding a ",(0,o.jsx)(n.code,{children:"client_id"})," and ",(0,o.jsx)(n.code,{children:"client_secret"})," in the ",(0,o.jsx)(n.code,{children:"[github.auth]"})," section that you request from the SCS github admins (github's oauth auth). This allows to exchange experience and to get a feeling for the achievable stability. (Hint: A single digit number of API call fails per week and no other failures is achievable on loaded clouds.)"]}),"\n",(0,o.jsx)(n.h2,{id:"alternative-approach-to-install-and-configure-the-dashboard-behind-a-reverse-proxy",children:"Alternative approach to install and configure the dashboard behind a reverse proxy"}),"\n",(0,o.jsxs)(n.p,{children:["Install influxdb via apt: ",(0,o.jsx)(n.a,{href:"https://docs.influxdata.com/influxdb/v1/introduction/install/#installing-influxdb-oss",children:"https://docs.influxdata.com/influxdb/v1/introduction/install/#installing-influxdb-oss"}),"\nInstall telegraf (same apt repo as influxdb): ",(0,o.jsx)(n.code,{children:"sudo apt update && sudo apt install telegraf"}),"\nInstall grafana: ",(0,o.jsx)(n.a,{href:"https://grafana.com/docs/grafana/latest/setup-grafana/installation/debian/#install-from-apt-repository",children:"https://grafana.com/docs/grafana/latest/setup-grafana/installation/debian/#install-from-apt-repository"})]}),"\n",(0,o.jsx)(n.p,{children:"Prepare configuration by using the config files from the repository as an alternative to doing the changes manually (as described above):"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo cp dashboard/telegraf.conf /etc/telegraf && sudo chown root:root /etc/telegraf/telegraf.conf && sudo chmod 0644 /etc/telegraf/telegraf.conf\nsudo cp dashboard/config.toml /etc/influxdb && sudo chown root:influxdb /etc/influxdb/config.toml && sudo chmod 0640 /etc/influxdb/config.toml\nsudo cp dashboard/grafana.ini /etc/grafana && sudo chown root:grafana /etc/grafana/grafana.ini && sudo chmod 0640 /etc/grafana/grafana.ini\n"})}),"\n",(0,o.jsx)(n.p,{children:"These config files should work as long as the versions of telegraf, influxdb and grafana don't evolve too far from the ones used in the repository. (Otherwise refer to above instructions how to tweak the default config files.)"}),"\n",(0,o.jsxs)(n.p,{children:["Changes to ",(0,o.jsx)(n.code,{children:"/etc/grafana/grafana.ini"})," as we do tls termination at the reverse proxy:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["set ",(0,o.jsx)(n.code,{children:"protocol = http"})]}),"\n",(0,o.jsxs)(n.li,{children:["comment out ",(0,o.jsx)(n.code,{children:"domain"})," option (? FIXME) or set it to the hostname"]}),"\n",(0,o.jsxs)(n.li,{children:["comment out ",(0,o.jsx)(n.code,{children:"cert_*"})," options"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Also change the admin password in ",(0,o.jsx)(n.code,{children:"grafana.ini"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["Changes to ",(0,o.jsx)(n.code,{children:"/etc/grafana/grafana.ini"})," if github auth should not be used yet:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["comment out whole ",(0,o.jsx)(n.code,{children:"[auth.github]"})," section for now (can be enabled later)"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Restart services: ",(0,o.jsx)(n.code,{children:"sudo systemctl restart telegraf && sudo systemctl restart influxdb && sudo systemctl restart grafana-server"})]}),"\n",(0,o.jsx)(n.p,{children:"Configuration in grafana web gui:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Login to grafana ",(0,o.jsx)(n.code,{children:"http(s)://Your Docusaurus site did not load properly.
\nA very common reason is a wrong site baseUrl configuration.
\nCurrent configured baseUrl = ${e} ${"/"===e?" (default value)":""}
\nWe suggest trying baseUrl =
\n.comment
can become .namespace--comment
) or replace them with your defined ones (like .editor__comment
). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll
and highlightAllUnder
methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),o=n(9642),i=new Set;function a(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...i,...Object.keys(Prism.languages)];o(r,e,t).load((e=>{if(!(e in r.languages))return void(a.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),i.add(e)}))}a.silent=!1,e.exports=a},6854:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,i){if(n.language===r){var a=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof i&&!i(e))return e;for(var o,s=a.length;-1!==n.code.indexOf(o=t(r,s));)++s;return a[s]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,i=Object.keys(n.tokenStack);!function a(s){for(var l=0;l{const s=t.toLowerCase(),l=((e,t)=>{const[n,o]=(0,r.useState)(V(t,e)),i=(0,r.useRef)(),a=(0,r.useRef)();return(0,r.useEffect)((()=>{t===i.current&&e===a.current||(i.current=t,a.current=e,o(V(t,e)))}),[e,t]),n})(s,o),c=(e=>(0,r.useCallback)((t=>{var n=t,{className:r,style:o,line:a}=n,s=_(n,["className","style","line"]);const l=S(x({},s),{className:i("token-line",r)});return"object"==typeof e&&"plain"in e&&(l.style=e.plain),"object"==typeof o&&(l.style=x(x({},l.style||{}),o)),l}),[e]))(l),u=(e=>{const t=(0,r.useCallback)((({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map((t=>e[t])))}),[e]);return(0,r.useCallback)((e=>{var n=e,{token:r,className:o,style:a}=n,s=_(n,["token","className","style"]);const l=S(x({},s),{className:i("token",...r.types,o),children:r.content,style:t(r)});return null!=a&&(l.style=x(x({},l.style||{}),a)),l}),[t])})(l),d=(({prism:e,code:t,grammar:n,language:o})=>{const i=(0,r.useRef)(e);return(0,r.useMemo)((()=>{if(null==n)return Y([t]);const e={code:t,grammar:n,language:o,tokens:[]};return i.current.hooks.run("before-tokenize",e),e.tokens=i.current.tokenize(t,n),i.current.hooks.run("after-tokenize",e),Y(e.tokens)}),[t,n,o])})({prism:a,language:s,code:n,grammar:a.languages[s]});return e({tokens:d,className:`prism-code language-${s}`,style:null!=l?l.root:{},getLineProps:c,getTokenProps:u})},J=e=>(0,r.createElement)(X,S(x({},e),{prism:e.prism||C,theme:e.theme||$,code:e.code,language:e.language}))},8776:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=!0,o="Invariant failed";function i(e,t){if(!e){if(r)throw new Error(o);var n="function"==typeof t?t():t,i=n?"".concat(o,": ").concat(n):o;throw new Error(i)}}},7529:e=>{"use strict";e.exports=JSON.parse('{"generic.more_information":"More information","sidebar.documentation.title":"Documentation","homepage.cta1":"Schedule a demo","homepage.title":"Managing the world\'s cloud infrastructures","homepage.subtitle1":"Manage your own cloud infrastructure and save up to 90% compared to the public cloud","homepage.pagetitle":"OSISM \u2013 Sovereign Cloud Infrastructure","services.title":"Support & Services from OSISM","discover.title":"Discover more about OSISM","discover.cta1":"Request more information","users.title":"Some of our happy OSISM users","partners.title":"Our partners","integration_partners.title":"Our integration partners","module.title":"Supported components","module.openstack.title":"Infrastructure as a Service (IaaS) with OpenStack","module.openstack.description":"Discover the power of flexibility and scalability with OpenStack! In the dynamic world of cloud computing, OpenStack stands out as a comprehensive open-source solution, empowering businesses with robust Infrastructure as a Service (IaaS) capabilities. Embrace unparalleled flexibility as you deploy a variety of workloads, from virtual machines to Kubernetes, all on a platform that seamlessly integrates with your existing systems.","module.sonic.title":"Software Defined Networking (SDN) with SONiC & OVN","module.sonic.description":"With SONiC, experience unparalleled flexibility and scalability in your network operations. It enables you to control your network resources with software, simplifying complex tasks and providing a more efficient and adaptable network environment. This platform is not just about efficiency; it\'s about enabling rapid innovation and customization to meet the ever-evolving demands of cloud computing and data centers.","module.ceph.title":"Software Defined Storage (SDS) with Ceph","module.ceph.description":"In the dynamic world of digital data, Ceph stands out as a game-changer. This highly scalable, open-source software-defined storage solution is designed to address the growing demand for performance, reliability, and flexibility in data management. Whether it\'s for small projects or large-scale enterprise needs, Ceph seamlessly adapts to any environment.","module.ironic.title":"Bare Metal as a Service (BMaaS) with Ironic","module.ironic.description":"With Ironic, you get direct access to bare-metal hardware, eliminating the overhead of virtualization and offering a level of performance that virtual environments can\'t match. Ideal for high-performance computing, large-scale data processing, and intensive workloads.","module.gardener.title":"Kubernetes as a Service (KaaS) with Gardener","module.gardener.description":"Kubernetes as a Service (KaaS) with Gardener offers a dynamic, scalable, and efficient solution for managing containerized applications across multiple cloud environments. Embrace the power of Kubernetes, optimized by Gardener\'s advanced automation and cluster management capabilities. With Gardener, you get seamless integration, simplified operations, and enhanced security for your Kubernetes clusters, whether on-premises, in the cloud, or in a hybrid setting.","module.cluster_api.title":"Kubernetes as a Service (KaaS) mit Cluster API","module.cluster_api.description":"Cluster API is a Kubernetes sub-project focused on providing declarative APIs and tooling to simplify provisioning, upgrading, and operating multiple Kubernetes clusters.","module.k3s.title":"Kubernetes (K8s) with K3S","module.k3s.description":"K3s is an innovative, lightweight Kubernetes distribution that simplifies the deployment and operation. One of the standout features of K3s is its minimal footprint, requiring only 512MB of RAM to run. K3s achieves its lightweight nature by removing legacy, alpha, and non-default features from Kubernetes, packaging all necessary components into a single binary less than 100MB in size. This all-in-one approach simplifies installation, updates, and operations, significantly reducing the overhead and expertise required to manage a Kubernetes cluster.","module.keycloak.title":"Identity & Access Management with Keycloak","module.keycloak.description":"Unlock the full potential of your digital security with Keycloak, the cutting-edge solution for Identity and Access Management (IAM). Designed for modern enterprises, Keycloak offers a robust and flexible platform to manage user identities and control access to applications and services.","module.prometheus.title":"Logging, Monitoring & Telemetry with Prometheus & Grafana","module.prometheus.description":"Integrating Prometheus with Grafana offers a seamless experience. Set up is straightforward, and the synergy between Prometheus\'s detailed data collection and Grafana\'s sophisticated visualization tools provides an unmatched monitoring solution. This powerful combination empowers your team to make data-driven decisions, ensuring your systems are not only performing optimally but also poised for future growth.","module.netdata.title":"Realtime insights with Netdata","module.netdata.description":"Netdata is revolutionizing the world of realtime monitoring, offering an unparalleled experience in tracking system performance and health. This powerful tool provides instant insights, ensuring you\'re always one step ahead in identifying and resolving issues. With its user-friendly interface, Netdata makes monitoring accessible to everyone, regardless of technical expertise.","module.teleport.title":"Privileged Access Management (PAM) to all infrastructure with Teleport","module.teleport.description":"Teleport is an innovative open-source software that redefines the way teams access their infrastructure. Designed with security and efficiency at its core, Teleport allows engineers and DevOps teams to seamlessly access servers, Kubernetes clusters, and internal applications, regardless of where they are located or what device they are using. It centralizes access control, providing a unified gateway to manage permissions and access rights across your entire infrastructure landscape.","module.proxmox.title":"Simple virtualization & containerization with Proxmox VE","module.proxmox.description":"Proxmox VE is a comprehensive open-source platform designed for virtualization and container-based management. It seamlessly combines two virtualization technologies in one solution: KVM for virtual machines and LXC for containerized applications. This dual capability allows to manage VMs and containers through a single, intuitive web-based interface, enhancing operational efficiency and flexibility.","theme.ErrorPageContent.title":"This page crashed.","theme.BackToTopButton.buttonAriaLabel":"Scroll back to top","theme.blog.archive.title":"Archive","theme.blog.archive.description":"Archive","theme.blog.paginator.navAriaLabel":"Blog list page navigation","theme.blog.paginator.newerEntries":"Newer Entries","theme.blog.paginator.olderEntries":"Older Entries","theme.blog.post.paginator.navAriaLabel":"Blog post page navigation","theme.blog.post.paginator.newerPost":"Newer Post","theme.blog.post.paginator.olderPost":"Older Post","theme.blog.post.plurals":"One post|{count} posts","theme.blog.tagTitle":"{nPosts} tagged with \\"{tagName}\\"","theme.tags.tagsPageLink":"View All Tags","theme.colorToggle.ariaLabel":"Switch between dark and light mode (currently {mode})","theme.colorToggle.ariaLabel.mode.dark":"dark mode","theme.colorToggle.ariaLabel.mode.light":"light mode","theme.docs.breadcrumbs.navAriaLabel":"Breadcrumbs","theme.docs.DocCard.categoryDescription":"{count} items","theme.docs.paginator.navAriaLabel":"Docs pages","theme.docs.paginator.previous":"Previous","theme.docs.paginator.next":"Next","theme.docs.tagDocListPageTitle.nDocsTagged":"One doc tagged|{count} docs tagged","theme.docs.tagDocListPageTitle":"{nDocsTagged} with \\"{tagName}\\"","theme.docs.versionBadge.label":"Version: {versionLabel}","theme.docs.versions.unreleasedVersionLabel":"This is unreleased documentation for {siteTitle} {versionLabel} version.","theme.docs.versions.unmaintainedVersionLabel":"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.","theme.docs.versions.latestVersionSuggestionLabel":"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).","theme.docs.versions.latestVersionLinkLabel":"latest version","theme.common.editThisPage":"Edit this page","theme.common.headingLinkTitle":"Direct link to {heading}","theme.lastUpdated.atDate":" on {date}","theme.lastUpdated.byUser":" by {user}","theme.lastUpdated.lastUpdatedAtBy":"Last updated{atDate}{byUser}","theme.NotFound.title":"Page Not Found","theme.navbar.mobileVersionsDropdown.label":"Versions","theme.tags.tagsListLabel":"Tags:","theme.AnnouncementBar.closeButtonAriaLabel":"Close","theme.admonition.caution":"caution","theme.admonition.danger":"danger","theme.admonition.info":"info","theme.admonition.note":"note","theme.admonition.tip":"tip","theme.admonition.warning":"warning","theme.blog.sidebar.navAriaLabel":"Blog recent posts navigation","theme.CodeBlock.copied":"Copied","theme.CodeBlock.copyButtonAriaLabel":"Copy code to clipboard","theme.CodeBlock.copy":"Copy","theme.CodeBlock.wordWrapToggle":"Toggle word wrap","theme.DocSidebarItem.expandCategoryAriaLabel":"Expand sidebar category \'{label}\'","theme.DocSidebarItem.collapseCategoryAriaLabel":"Collapse sidebar category \'{label}\'","theme.NavBar.navAriaLabel":"Main","theme.NotFound.p1":"We could not find what you were looking for.","theme.NotFound.p2":"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.","theme.TOCCollapsible.toggleButtonLabel":"On this page","theme.navbar.mobileLanguageDropdown.label":"Languages","theme.blog.post.readingTime.plurals":"One min read|{readingTime} min read","theme.blog.post.readMore":"Read More","theme.blog.post.readMoreLabel":"Read more about {title}","theme.docs.breadcrumbs.home":"Home page","theme.docs.sidebar.collapseButtonTitle":"Collapse sidebar","theme.docs.sidebar.collapseButtonAriaLabel":"Collapse sidebar","theme.docs.sidebar.navAriaLabel":"Docs sidebar","theme.docs.sidebar.closeSidebarButtonAriaLabel":"Close navigation bar","theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel":"\u2190 Back to main menu","theme.docs.sidebar.toggleSidebarButtonAriaLabel":"Toggle navigation bar","theme.docs.sidebar.expandButtonTitle":"Expand sidebar","theme.docs.sidebar.expandButtonAriaLabel":"Expand sidebar","theme.SearchBar.noResultsText":"No results","theme.SearchBar.seeAll":"See all results","theme.SearchBar.seeAllOutsideContext":"See results outside {context}","theme.SearchBar.searchInContext":"See all results in {context}","theme.SearchBar.label":"Search","theme.SearchPage.existingResultsTitle":"Search results for \\"{query}\\"","theme.SearchPage.emptyResultsTitle":"Search the documentation","theme.SearchPage.searchContext.everywhere":"everywhere","theme.SearchPage.documentsFound.plurals":"1 document found|{count} documents found","theme.SearchPage.noResultsText":"No documents were found","theme.ErrorPageContent.tryAgain":"Try again","theme.common.skipToMainContent":"Skip to main content","theme.tags.tagsPageTitle":"Tags","theme.unlistedContent.title":"Unlisted page","theme.unlistedContent.message":"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."}')},6887:e=>{"use strict";e.exports=JSON.parse('{"/about-us-960":{"__comp":"1f391b9e","__context":{"plugin":"a7456010"},"content":"ccee9b10"},"/blog-3af":{"__comp":"a6aa9e1f","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"08d2a106"},{"content":"95c58dad"},{"content":"a4e0d55c"},{"content":"4f960b61"},{"content":"7d4b540d"},{"content":"53e951cd"}],"__props":"c15d9823"},"/blog/2024-01-11-kubernetes-service-deployment-e02":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"0dedd17d"},"/blog/2024-01-12-restart-of-a-container-on-a-specific-node-eb4":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"7ff15f27"},"/blog/2024-01-14-use-of-the-clustershell-00c":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"8c451eb7"},"/blog/2024-01-16-switch-to-opentofu-e2b":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"a1f2ef26"},"/blog/2024-01-16-use-of-the-container-shell-113":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"6a128ecd"},"/blog/2024-03-04-show-versions-used-on-the-manager-4c8":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"7c20fa24"},"/blog/archive-182":{"__comp":"9e4087bc","__context":{"plugin":"36994c47"},"__props":"f81c1134"},"/blog/tags-287":{"__comp":"01a85c17","__context":{"plugin":"36994c47"},"sidebar":"814f3328","__props":"3a2db09e"},"/blog/tags/kubernetes-48c":{"__comp":"6875c492","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"53e951cd"}],"__props":"25d1f3de"},"/blog/tags/machine-room-a2e":{"__comp":"6875c492","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"08d2a106"},{"content":"a4e0d55c"},{"content":"4f960b61"},{"content":"7d4b540d"}],"__props":"32b5e35d"},"/blog/tags/news-395":{"__comp":"6875c492","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"95c58dad"}],"__props":"4f033264"},"/blog/tags/osism-20c":{"__comp":"6875c492","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"08d2a106"},{"content":"95c58dad"},{"content":"a4e0d55c"},{"content":"4f960b61"},{"content":"7d4b540d"}],"__props":"b89e0d93"},"/blog/tags/sneak-peak-13f":{"__comp":"6875c492","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"53e951cd"}],"__props":"d0b7b1a7"},"/contact-us-d8e":{"__comp":"1f391b9e","__context":{"plugin":"a7456010"},"content":"9731ed60"},"/jobs-563":{"__comp":"1f391b9e","__context":{"plugin":"a7456010"},"content":"c30598cf"},"/legals-952":{"__comp":"1f391b9e","__context":{"plugin":"a7456010"},"content":"e5eb6f7e"},"/partners-43d":{"__comp":"1f391b9e","__context":{"plugin":"a7456010"},"content":"ea4c6a72"},"/privacy-476":{"__comp":"1f391b9e","__context":{"plugin":"a7456010"},"content":"8e33b65d"},"/search-822":{"__comp":"1a4e3797","__context":{"plugin":"138e0e15"}},"/support-ce4":{"__comp":"1f391b9e","__context":{"plugin":"a7456010"},"content":"f2afad6f"},"/terms-235":{"__comp":"1f391b9e","__context":{"plugin":"a7456010"},"content":"445e7840"},"/docs-f59":{"__comp":"5e95c892","__context":{"plugin":"aba21aa0"}},"/docs-eda":{"__comp":"a7bd4aaa","__props":"0058b4c6"},"/docs-cf2":{"__comp":"a94703ab"},"/docs/-4a8":{"__comp":"17896441","content":"c377a04b"},"/docs/appendix/-f91":{"__comp":"17896441","content":"0fd4c4b6"},"/docs/appendix/comparisons-87f":{"__comp":"17896441","content":"e9b984e6"},"/docs/appendix/glossary-16e":{"__comp":"17896441","content":"88884f83"},"/docs/appendix/networks-eb6":{"__comp":"17896441","content":"540b269b"},"/docs/appendix/standards-4db":{"__comp":"17896441","content":"b4b93543"},"/docs/guides/-e13":{"__comp":"17896441","content":"d03241c9"},"/docs/guides/concept-guide/-3f5":{"__comp":"17896441","content":"558d4eb6"},"/docs/guides/concept-guide/components/-55f":{"__comp":"17896441","content":"bde6240a"},"/docs/guides/concept-guide/components/ceph-23a":{"__comp":"17896441","content":"7b04d9ab"},"/docs/guides/concept-guide/components/clusterapi-c76":{"__comp":"17896441","content":"f96dc981"},"/docs/guides/concept-guide/components/gardener-74a":{"__comp":"17896441","content":"5334e6e2"},"/docs/guides/concept-guide/components/ironic-68b":{"__comp":"17896441","content":"0c9d79ac"},"/docs/guides/concept-guide/components/k3s-04c":{"__comp":"17896441","content":"30678d1f"},"/docs/guides/concept-guide/components/keycloak-ea4":{"__comp":"17896441","content":"b3cc9666"},"/docs/guides/concept-guide/components/netdata-384":{"__comp":"17896441","content":"87ff8807"},"/docs/guides/concept-guide/components/openstack-772":{"__comp":"17896441","content":"a7c5002b"},"/docs/guides/concept-guide/components/prometheus-4ac":{"__comp":"17896441","content":"d5f7a6fc"},"/docs/guides/concept-guide/components/proxmox-f51":{"__comp":"17896441","content":"0a3aead7"},"/docs/guides/concept-guide/components/sonic-de3":{"__comp":"17896441","content":"1f2df234"},"/docs/guides/concept-guide/components/teleport-ce4":{"__comp":"17896441","content":"076173c3"},"/docs/guides/concept-guide/design-e9b":{"__comp":"17896441","content":"72d2a3c8"},"/docs/guides/concept-guide/hardware-bom-b58":{"__comp":"17896441","content":"1f001b6c"},"/docs/guides/concept-guide/layers-a24":{"__comp":"17896441","content":"ced2dfef"},"/docs/guides/concept-guide/nodes-ee8":{"__comp":"17896441","content":"23ead882"},"/docs/guides/concept-guide/use-cases-3d9":{"__comp":"17896441","content":"bb89255b"},"/docs/guides/configuration-guide/-c40":{"__comp":"17896441","content":"c78af355"},"/docs/guides/configuration-guide/ceph-fe5":{"__comp":"17896441","content":"8352bc95"},"/docs/guides/configuration-guide/commons/-757":{"__comp":"17896441","content":"8e5f32ed"},"/docs/guides/configuration-guide/commons/certificates-60b":{"__comp":"17896441","content":"1541925c"},"/docs/guides/configuration-guide/commons/packages-2f2":{"__comp":"17896441","content":"e934a396"},"/docs/guides/configuration-guide/commons/resolvconf-beb":{"__comp":"17896441","content":"56c0df94"},"/docs/guides/configuration-guide/commons/services-722":{"__comp":"17896441","content":"59e4bf9a"},"/docs/guides/configuration-guide/commons/sshconfig-1e4":{"__comp":"17896441","content":"096c7093"},"/docs/guides/configuration-guide/commons/sysctl-c91":{"__comp":"17896441","content":"31da1720"},"/docs/guides/configuration-guide/commons/timezone-0f8":{"__comp":"17896441","content":"bed2b685"},"/docs/guides/configuration-guide/commons/user-ea5":{"__comp":"17896441","content":"f4931b40"},"/docs/guides/configuration-guide/configuration-repository-7cf":{"__comp":"17896441","content":"fac2b365"},"/docs/guides/configuration-guide/inventory-955":{"__comp":"17896441","content":"db7ff767"},"/docs/guides/configuration-guide/loadbalancer-a3a":{"__comp":"17896441","content":"6a4596fc"},"/docs/guides/configuration-guide/manager-116":{"__comp":"17896441","content":"76993c56"},"/docs/guides/configuration-guide/network-13c":{"__comp":"17896441","content":"d2b0f7bd"},"/docs/guides/configuration-guide/openstack/-c16":{"__comp":"17896441","content":"2c0b3ec5"},"/docs/guides/configuration-guide/openstack/aodh-7c6":{"__comp":"17896441","content":"bd14d84e"},"/docs/guides/configuration-guide/openstack/barbican-953":{"__comp":"17896441","content":"7373ea57"},"/docs/guides/configuration-guide/openstack/ceilometer-5c7":{"__comp":"17896441","content":"2c0fb91b"},"/docs/guides/configuration-guide/openstack/cinder-998":{"__comp":"17896441","content":"1e083c96"},"/docs/guides/configuration-guide/openstack/designate-6c2":{"__comp":"17896441","content":"97ec1344"},"/docs/guides/configuration-guide/openstack/glance-f43":{"__comp":"17896441","content":"56dcce74"},"/docs/guides/configuration-guide/openstack/heat-cda":{"__comp":"17896441","content":"a7017fd1"},"/docs/guides/configuration-guide/openstack/horizon-9f0":{"__comp":"17896441","content":"6fb2b956"},"/docs/guides/configuration-guide/openstack/ironic-381":{"__comp":"17896441","content":"56285d35"},"/docs/guides/configuration-guide/openstack/keystone-42a":{"__comp":"17896441","content":"07d5b948"},"/docs/guides/configuration-guide/openstack/magnum-93a":{"__comp":"17896441","content":"d7a98899"},"/docs/guides/configuration-guide/openstack/manila-889":{"__comp":"17896441","content":"7c8812f6"},"/docs/guides/configuration-guide/openstack/neutron-317":{"__comp":"17896441","content":"a3144996"},"/docs/guides/configuration-guide/openstack/nova-d3d":{"__comp":"17896441","content":"40dee973"},"/docs/guides/configuration-guide/openstack/octavia-66a":{"__comp":"17896441","content":"4e4d7fb4"},"/docs/guides/configuration-guide/openstack/placement-783":{"__comp":"17896441","content":"ce8be473"},"/docs/guides/configuration-guide/openstack/skyline-bf0":{"__comp":"17896441","content":"06fc275a"},"/docs/guides/configuration-guide/proxy-3a1":{"__comp":"17896441","content":"c9821a2e"},"/docs/guides/configuration-guide/services/-93c":{"__comp":"17896441","content":"ccc45f31"},"/docs/guides/configuration-guide/services/chrony-50e":{"__comp":"17896441","content":"9a9ff86d"},"/docs/guides/configuration-guide/services/docker-643":{"__comp":"17896441","content":"f6217829"},"/docs/guides/configuration-guide/services/tuned-02d":{"__comp":"17896441","content":"3e0c15c2"},"/docs/guides/configuration-guide/validations/-c76":{"__comp":"17896441","content":"b30c80d2"},"/docs/guides/deploy-guide/-0fd":{"__comp":"17896441","content":"42bbc814"},"/docs/guides/deploy-guide/bootstrap-3ec":{"__comp":"17896441","content":"f7e4724a"},"/docs/guides/deploy-guide/examples/-f2f":{"__comp":"17896441","content":"3f74a1dc"},"/docs/guides/deploy-guide/examples/cloud-in-a-box-957":{"__comp":"17896441","content":"3a24b32a"},"/docs/guides/deploy-guide/examples/testbed-772":{"__comp":"17896441","content":"49278f49"},"/docs/guides/deploy-guide/manager-8c5":{"__comp":"17896441","content":"ae934d1a"},"/docs/guides/deploy-guide/provisioning-af9":{"__comp":"17896441","content":"b68de40d"},"/docs/guides/deploy-guide/seed-3f0":{"__comp":"17896441","content":"c45d899e"},"/docs/guides/deploy-guide/services/-e37":{"__comp":"17896441","content":"e0698a94"},"/docs/guides/deploy-guide/services/ceph-f0d":{"__comp":"17896441","content":"dbb7d2f3"},"/docs/guides/deploy-guide/services/infrastructure-b48":{"__comp":"17896441","content":"8da03187"},"/docs/guides/deploy-guide/services/kubernetes-fba":{"__comp":"17896441","content":"1660505f"},"/docs/guides/deploy-guide/services/logging-monitoring-4ab":{"__comp":"17896441","content":"807e695f"},"/docs/guides/deploy-guide/services/network-6ae":{"__comp":"17896441","content":"2b5b0fc4"},"/docs/guides/deploy-guide/services/openstack-ea0":{"__comp":"17896441","content":"dbe528c9"},"/docs/guides/operations-guide/-291":{"__comp":"17896441","content":"de57d45c"},"/docs/guides/operations-guide/ceph-03d":{"__comp":"17896441","content":"08ca43f3"},"/docs/guides/operations-guide/infrastructure-aca":{"__comp":"17896441","content":"31f6c2ce"},"/docs/guides/operations-guide/manager/-cf1":{"__comp":"17896441","content":"74b846e2"},"/docs/guides/operations-guide/manager/apply-393":{"__comp":"17896441","content":"b798ea2b"},"/docs/guides/operations-guide/manager/console-a8d":{"__comp":"17896441","content":"e29aad9d"},"/docs/guides/operations-guide/manager/get-e94":{"__comp":"17896441","content":"02385e42"},"/docs/guides/operations-guide/manager/log-a36":{"__comp":"17896441","content":"4632ab68"},"/docs/guides/operations-guide/manager/task-2dd":{"__comp":"17896441","content":"326f19e1"},"/docs/guides/operations-guide/network-6e9":{"__comp":"17896441","content":"f159c280"},"/docs/guides/operations-guide/openstack/-641":{"__comp":"17896441","content":"a6659507"},"/docs/guides/operations-guide/openstack/cinder-577":{"__comp":"17896441","content":"762b083e"},"/docs/guides/operations-guide/openstack/keystone-df0":{"__comp":"17896441","content":"cf1d2b40"},"/docs/guides/operations-guide/openstack/neutron-888":{"__comp":"17896441","content":"810171c5"},"/docs/guides/operations-guide/openstack/nova-d86":{"__comp":"17896441","content":"6a846528"},"/docs/guides/operations-guide/openstack/octavia-52a":{"__comp":"17896441","content":"78b4ae99"},"/docs/guides/operations-guide/openstack/tools/-b4b":{"__comp":"17896441","content":"5f732743"},"/docs/guides/operations-guide/openstack/tools/flavor-manager-79a":{"__comp":"17896441","content":"c7384a82"},"/docs/guides/operations-guide/openstack/tools/image-manager/-d33":{"__comp":"17896441","content":"9008e2e2"},"/docs/guides/operations-guide/openstack/tools/image-manager/update-dea":{"__comp":"17896441","content":"3e23a1eb"},"/docs/guides/operations-guide/openstack/tools/openstack-health-monitor-efd":{"__comp":"17896441","content":"bd92db3a"},"/docs/guides/operations-guide/openstack/tools/project-manager-b83":{"__comp":"17896441","content":"9f9f68f7"},"/docs/guides/operations-guide/openstack/tools/resource-manager-f5d":{"__comp":"17896441","content":"04276aea"},"/docs/guides/operations-guide/openstack/tools/sandbox-manager-622":{"__comp":"17896441","content":"cfb372b1"},"/docs/guides/operations-guide/openstack/tools/simple-stress-44d":{"__comp":"17896441","content":"555bfc08"},"/docs/guides/other-guides/-849":{"__comp":"17896441","content":"7c2d5d83"},"/docs/guides/other-guides/cloud-in-a-box-4d9":{"__comp":"17896441","content":"58ecd069"},"/docs/guides/other-guides/contributor-guide-628":{"__comp":"17896441","content":"90342430"},"/docs/guides/other-guides/developer-guide/-39e":{"__comp":"17896441","content":"5845507f"},"/docs/guides/other-guides/developer-guide/releases-d02":{"__comp":"17896441","content":"45fcaf07"},"/docs/guides/other-guides/developer-guide/scripts-8ac":{"__comp":"17896441","content":"f3e1e4c4"},"/docs/guides/other-guides/developer-guide/zuul-54b":{"__comp":"17896441","content":"2b48164f"},"/docs/guides/other-guides/style-guide-a32":{"__comp":"17896441","content":"fb66bc4c"},"/docs/guides/other-guides/testbed-a41":{"__comp":"17896441","content":"6235e5b8"},"/docs/guides/troubleshooting-guide/-590":{"__comp":"17896441","content":"0f52743c"},"/docs/guides/troubleshooting-guide/ceph-c65":{"__comp":"17896441","content":"0152cb28"},"/docs/guides/troubleshooting-guide/manager-df5":{"__comp":"17896441","content":"596b1512"},"/docs/guides/troubleshooting-guide/openstack-04c":{"__comp":"17896441","content":"6f6bf91f"},"/docs/guides/upgrade-guide/-6e6":{"__comp":"17896441","content":"02601e42"},"/docs/guides/upgrade-guide/ceph-2a6":{"__comp":"17896441","content":"15cba8f7"},"/docs/guides/upgrade-guide/docker-10b":{"__comp":"17896441","content":"09ec98ee"},"/docs/guides/upgrade-guide/infrastructure-16c":{"__comp":"17896441","content":"1e80d022"},"/docs/guides/upgrade-guide/logging-monitoring-8fc":{"__comp":"17896441","content":"09a97616"},"/docs/guides/upgrade-guide/manager-5f4":{"__comp":"17896441","content":"dd3359e9"},"/docs/guides/upgrade-guide/network-130":{"__comp":"17896441","content":"dbbbc829"},"/docs/guides/upgrade-guide/openstack-ee5":{"__comp":"17896441","content":"d0f03c80"},"/docs/guides/user-guide/-873":{"__comp":"17896441","content":"23082d39"},"/docs/guides/user-guide/migration-vmware-esix-fb5":{"__comp":"17896441","content":"e331e3e2"},"/docs/guides/user-guide/openstack/-cbf":{"__comp":"17896441","content":"0e2caa6c"},"/docs/guides/user-guide/openstack/openstackclient-12c":{"__comp":"17896441","content":"6c4a3323"},"/docs/guides/user-guide/openstack/security-groups-9c3":{"__comp":"17896441","content":"41052329"},"/docs/guides/user-guide/openstack/user-data-backups-c5d":{"__comp":"17896441","content":"e6963042"},"/docs/references/-1f1":{"__comp":"17896441","content":"07742d97"},"/docs/references/cli-c7e":{"__comp":"17896441","content":"456706c7"},"/docs/references/configuration-fca":{"__comp":"17896441","content":"8ff7deab"},"/docs/references/parameters-85e":{"__comp":"17896441","content":"3eec1f83"},"/docs/release-notes/-dfd":{"__comp":"17896441","content":"29cf976d"},"/docs/release-notes/osism-7-b9d":{"__comp":"17896441","content":"f8a055c5"},"/users-4b4":{"__comp":"5e95c892","__context":{"plugin":"d0703ff7"}},"/users-33d":{"__comp":"a7bd4aaa","__props":"2c9eb223"},"/users-5ee":{"__comp":"a94703ab"},"/users/-dff":{"__comp":"17896441","content":"122bda60"},"/-2e1":{"__comp":"c4f5d8e4","__context":{"plugin":"a7456010"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[532],(()=>{return t=7221,e(e.s=t);var t}));e.O()}]);
\ No newline at end of file
diff --git a/assets/js/main.f85543d9.js b/assets/js/main.f85543d9.js
new file mode 100644
index 0000000000..c31a5ed642
--- /dev/null
+++ b/assets/js/main.f85543d9.js
@@ -0,0 +1,2 @@
+/*! For license information please see main.f85543d9.js.LICENSE.txt */
+(self.webpackChunkosism=self.webpackChunkosism||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});n(7294);var r=n(8356),o=n.n(r),i=n(6887);const a={"0058b4c6":[()=>n.e(4088).then(n.t.bind(n,6462,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-175.json",6462],"0152cb28":[()=>n.e(6838).then(n.bind(n,3330)),"@site/docs/guides/troubleshooting-guide/ceph.md",3330],"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,1223)),"@theme/BlogTagsListPage",1223],"02385e42":[()=>n.e(7147).then(n.bind(n,9723)),"@site/docs/guides/operations-guide/manager/get.md",9723],"02601e42":[()=>n.e(6236).then(n.bind(n,5259)),"@site/docs/guides/upgrade-guide/index.md",5259],"04276aea":[()=>n.e(9863).then(n.bind(n,3142)),"@site/docs/guides/operations-guide/openstack/tools/resource-manager.md",3142],"06fc275a":[()=>n.e(6759).then(n.bind(n,6428)),"@site/docs/guides/configuration-guide/openstack/skyline.md",6428],"076173c3":[()=>n.e(7471).then(n.bind(n,4128)),"@site/docs/guides/concept-guide/components/teleport.md",4128],"07742d97":[()=>n.e(6876).then(n.bind(n,9725)),"@site/docs/references/index.md",9725],"07d5b948":[()=>n.e(6299).then(n.bind(n,9270)),"@site/docs/guides/configuration-guide/openstack/keystone.md",9270],"08ca43f3":[()=>n.e(5655).then(n.bind(n,5965)),"@site/docs/guides/operations-guide/ceph.md",5965],"08d2a106":[()=>n.e(7559).then(n.bind(n,4967)),"@site/blog/2024-03-04-show-versions-used-on-the-manager.md?truncated=true",4967],"096c7093":[()=>n.e(5834).then(n.bind(n,9980)),"@site/docs/guides/configuration-guide/commons/sshconfig.md",9980],"09a97616":[()=>n.e(8367).then(n.bind(n,7490)),"@site/docs/guides/upgrade-guide/logging-monitoring.md",7490],"09ec98ee":[()=>n.e(6454).then(n.bind(n,7033)),"@site/docs/guides/upgrade-guide/docker.md",7033],"0a3aead7":[()=>n.e(5571).then(n.bind(n,4908)),"@site/docs/guides/concept-guide/components/proxmox.md",4908],"0c9d79ac":[()=>n.e(1527).then(n.bind(n,5859)),"@site/docs/guides/concept-guide/components/ironic.md",5859],"0dedd17d":[()=>n.e(8059).then(n.bind(n,6207)),"@site/blog/2024-01-11-kubernetes-service-deployments.md",6207],"0e2caa6c":[()=>n.e(2175).then(n.bind(n,9732)),"@site/docs/guides/user-guide/openstack/index.md",9732],"0e3a612a":[()=>n.e(888).then(n.bind(n,4963)),"@site/docs/guides/configuration-guide/rook.md",4963],"0f52743c":[()=>n.e(6891).then(n.bind(n,8064)),"@site/docs/guides/troubleshooting-guide/index.md",8064],"0fd4c4b6":[()=>n.e(2309).then(n.bind(n,5901)),"@site/docs/appendix/index.md",5901],"122bda60":[()=>n.e(2827).then(n.bind(n,9449)),"@site/users/index.md",9449],"138e0e15":[()=>n.e(9524).then(n.t.bind(n,536,19)),"@generated/@easyops-cn/docusaurus-search-local/default/__plugin.json",536],"1541925c":[()=>n.e(8470).then(n.bind(n,1263)),"@site/docs/guides/configuration-guide/commons/certificates.md",1263],"15cba8f7":[()=>n.e(8019).then(n.bind(n,1082)),"@site/docs/guides/upgrade-guide/ceph.md",1082],"1660505f":[()=>n.e(1021).then(n.bind(n,4137)),"@site/docs/guides/deploy-guide/services/kubernetes.md",4137],17896441:[()=>Promise.all([n.e(532),n.e(2802),n.e(7918)]).then(n.bind(n,7362)),"@theme/DocItem",7362],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,1473)),"@theme/SearchPage",1473],"1e083c96":[()=>n.e(2346).then(n.bind(n,4663)),"@site/docs/guides/configuration-guide/openstack/cinder.md",4663],"1e80d022":[()=>n.e(3713).then(n.bind(n,8897)),"@site/docs/guides/upgrade-guide/infrastructure.md",8897],"1f001b6c":[()=>n.e(6881).then(n.bind(n,6961)),"@site/docs/guides/concept-guide/hardware-bom.md",6961],"1f2df234":[()=>n.e(784).then(n.bind(n,7225)),"@site/docs/guides/concept-guide/components/sonic.md",7225],"1f391b9e":[()=>Promise.all([n.e(532),n.e(2802),n.e(3085)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],"23082d39":[()=>n.e(7927).then(n.bind(n,6134)),"@site/docs/guides/user-guide/index.md",6134],"23ead882":[()=>n.e(9619).then(n.bind(n,8966)),"@site/docs/guides/concept-guide/nodes.md",8966],"25d1f3de":[()=>n.e(9684).then(n.t.bind(n,9638,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-kubernetes-bf9.json",9638],"29cf976d":[()=>n.e(2840).then(n.bind(n,391)),"@site/docs/release-notes/index.md",391],"2b48164f":[()=>n.e(5348).then(n.bind(n,2737)),"@site/docs/guides/other-guides/developer-guide/zuul.md",2737],"2b5b0fc4":[()=>n.e(2753).then(n.bind(n,5853)),"@site/docs/guides/deploy-guide/services/network.md",5853],"2c0b3ec5":[()=>n.e(9372).then(n.bind(n,8304)),"@site/docs/guides/configuration-guide/openstack/index.md",8304],"2c0fb91b":[()=>n.e(8129).then(n.bind(n,4133)),"@site/docs/guides/configuration-guide/openstack/ceilometer.md",4133],"2c9eb223":[()=>n.e(4596).then(n.t.bind(n,8006,19)),"@generated/docusaurus-plugin-content-docs/users/p/users-f19.json",8006],"30678d1f":[()=>n.e(5429).then(n.bind(n,6705)),"@site/docs/guides/concept-guide/components/k3s.md",6705],"31da1720":[()=>n.e(7720).then(n.bind(n,6777)),"@site/docs/guides/configuration-guide/commons/sysctl.md",6777],"31f6c2ce":[()=>n.e(1296).then(n.bind(n,1888)),"@site/docs/guides/operations-guide/infrastructure.md",1888],"326f19e1":[()=>n.e(9183).then(n.bind(n,7868)),"@site/docs/guides/operations-guide/manager/task.md",7868],"32b5e35d":[()=>n.e(543).then(n.t.bind(n,7852,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-machine-room-a61.json",7852],"36994c47":[()=>n.e(9208).then(n.t.bind(n,4468,19)),"@generated/docusaurus-plugin-content-blog/default/__plugin.json",4468],"3a24b32a":[()=>n.e(1033).then(n.bind(n,5683)),"@site/docs/guides/deploy-guide/examples/cloud-in-a-box.md",5683],"3a2db09e":[()=>n.e(9361).then(n.t.bind(n,7588,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-df9.json",7588],"3e0c15c2":[()=>n.e(3422).then(n.bind(n,2914)),"@site/docs/guides/configuration-guide/services/tuned.md",2914],"3e23a1eb":[()=>n.e(6018).then(n.bind(n,2210)),"@site/docs/guides/operations-guide/openstack/tools/image-manager/update.md",2210],"3eec1f83":[()=>n.e(6315).then(n.bind(n,6603)),"@site/docs/references/parameters.md",6603],"3f74a1dc":[()=>n.e(770).then(n.bind(n,6985)),"@site/docs/guides/deploy-guide/examples/index.md",6985],"40dee973":[()=>n.e(7383).then(n.bind(n,2149)),"@site/docs/guides/configuration-guide/openstack/nova.md",2149],41052329:[()=>n.e(3736).then(n.bind(n,6740)),"@site/docs/guides/user-guide/openstack/security-groups.md",6740],"42bbc814":[()=>n.e(8730).then(n.bind(n,6579)),"@site/docs/guides/deploy-guide/index.md",6579],"445e7840":[()=>n.e(719).then(n.bind(n,4922)),"@site/src/pages/terms.md",4922],"456706c7":[()=>n.e(9174).then(n.bind(n,2087)),"@site/docs/references/cli.md",2087],"45fcaf07":[()=>n.e(8527).then(n.bind(n,6079)),"@site/docs/guides/other-guides/developer-guide/releases.md",6079],"4632ab68":[()=>n.e(8521).then(n.bind(n,6422)),"@site/docs/guides/operations-guide/manager/log.md",6422],"49278f49":[()=>n.e(7485).then(n.bind(n,516)),"@site/docs/guides/deploy-guide/examples/testbed.md",516],"4e4d7fb4":[()=>n.e(6785).then(n.bind(n,8030)),"@site/docs/guides/configuration-guide/openstack/octavia.md",8030],"4f033264":[()=>n.e(8449).then(n.t.bind(n,2494,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-news-c62.json",2494],"4f960b61":[()=>n.e(7129).then(n.bind(n,8941)),"@site/blog/2024-01-14-use-of-the-clustershell.md?truncated=true",8941],"51d1621c":[()=>Promise.all([n.e(532),n.e(3189)]).then(n.bind(n,6788)),"@site/docs/guides/deploy-guide/services/rook.md",6788],"5334e6e2":[()=>n.e(2959).then(n.bind(n,328)),"@site/docs/guides/concept-guide/components/gardener.md",328],"53e951cd":[()=>n.e(3619).then(n.bind(n,6860)),"@site/blog/2024-01-11-kubernetes-service-deployments.md?truncated=true",6860],"540b269b":[()=>n.e(741).then(n.bind(n,7744)),"@site/docs/appendix/networks.md",7744],"555bfc08":[()=>n.e(2421).then(n.bind(n,6114)),"@site/docs/guides/operations-guide/openstack/tools/simple-stress.md",6114],"558d4eb6":[()=>n.e(3586).then(n.bind(n,8949)),"@site/docs/guides/concept-guide/index.md",8949],"56285d35":[()=>n.e(324).then(n.bind(n,6529)),"@site/docs/guides/configuration-guide/openstack/ironic.md",6529],"56c0df94":[()=>n.e(3674).then(n.bind(n,6366)),"@site/docs/guides/configuration-guide/commons/resolvconf.md",6366],"56dcce74":[()=>n.e(1008).then(n.bind(n,1185)),"@site/docs/guides/configuration-guide/openstack/glance.md",1185],"5845507f":[()=>n.e(4022).then(n.bind(n,8981)),"@site/docs/guides/other-guides/developer-guide/index.md",8981],"58ecd069":[()=>n.e(3360).then(n.bind(n,9150)),"@site/docs/guides/other-guides/cloud-in-a-box.md",9150],"596b1512":[()=>n.e(3724).then(n.bind(n,2404)),"@site/docs/guides/troubleshooting-guide/manager.md",2404],"59e4bf9a":[()=>n.e(4118).then(n.bind(n,4110)),"@site/docs/guides/configuration-guide/commons/services.md",4110],"5e95c892":[()=>n.e(9661).then(n.bind(n,1892)),"@theme/DocsRoot",1892],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5f732743":[()=>n.e(6899).then(n.bind(n,7046)),"@site/docs/guides/operations-guide/openstack/tools/index.md",7046],"6235e5b8":[()=>Promise.all([n.e(532),n.e(9705)]).then(n.bind(n,5675)),"@site/docs/guides/other-guides/testbed.mdx",5675],"6875c492":[()=>Promise.all([n.e(532),n.e(2802),n.e(7534),n.e(8610)]).then(n.bind(n,1714)),"@theme/BlogTagsPostsPage",1714],"6a128ecd":[()=>n.e(332).then(n.bind(n,4046)),"@site/blog/2024-01-16-use-of-the-container-shell.md",4046],"6a4596fc":[()=>n.e(7958).then(n.bind(n,3491)),"@site/docs/guides/configuration-guide/loadbalancer.md",3491],"6a846528":[()=>n.e(8567).then(n.bind(n,8438)),"@site/docs/guides/operations-guide/openstack/nova.md",8438],"6c4a3323":[()=>n.e(2517).then(n.bind(n,5263)),"@site/docs/guides/user-guide/openstack/openstackclient.md",5263],"6f6bf91f":[()=>n.e(9654).then(n.bind(n,9192)),"@site/docs/guides/troubleshooting-guide/openstack.md",9192],"6fb2b956":[()=>n.e(3216).then(n.bind(n,675)),"@site/docs/guides/configuration-guide/openstack/horizon.md",675],"72d2a3c8":[()=>n.e(968).then(n.bind(n,4414)),"@site/docs/guides/concept-guide/design.md",4414],"7373ea57":[()=>n.e(9606).then(n.bind(n,1299)),"@site/docs/guides/configuration-guide/openstack/barbican.md",1299],"74b846e2":[()=>n.e(7155).then(n.bind(n,4300)),"@site/docs/guides/operations-guide/manager/index.md",4300],"762b083e":[()=>n.e(4931).then(n.bind(n,3343)),"@site/docs/guides/operations-guide/openstack/cinder.md",3343],"76993c56":[()=>Promise.all([n.e(532),n.e(2810)]).then(n.bind(n,4898)),"@site/docs/guides/configuration-guide/manager.mdx",4898],"78b4ae99":[()=>n.e(2681).then(n.bind(n,3112)),"@site/docs/guides/operations-guide/openstack/octavia.md",3112],"7b04d9ab":[()=>n.e(9691).then(n.bind(n,922)),"@site/docs/guides/concept-guide/components/ceph.md",922],"7c20fa24":[()=>n.e(7140).then(n.bind(n,5606)),"@site/blog/2024-03-04-show-versions-used-on-the-manager.md",5606],"7c2d5d83":[()=>n.e(4905).then(n.bind(n,8407)),"@site/docs/guides/other-guides/index.md",8407],"7c8812f6":[()=>n.e(2253).then(n.bind(n,3534)),"@site/docs/guides/configuration-guide/openstack/manila.md",3534],"7d4b540d":[()=>n.e(8321).then(n.bind(n,908)),"@site/blog/2024-01-12-restart-of-a-container-on-a-specific-node.md?truncated=true",908],"7ff15f27":[()=>n.e(4032).then(n.bind(n,8713)),"@site/blog/2024-01-12-restart-of-a-container-on-a-specific-node.md",8713],"807e695f":[()=>n.e(1628).then(n.bind(n,2630)),"@site/docs/guides/deploy-guide/services/logging-monitoring.md",2630],"810171c5":[()=>n.e(1674).then(n.bind(n,754)),"@site/docs/guides/operations-guide/openstack/neutron.md",754],"814f3328":[()=>n.e(2535).then(n.t.bind(n,5641,19)),"~blog/default/blog-post-list-prop-default.json",5641],"8352bc95":[()=>n.e(3980).then(n.bind(n,450)),"@site/docs/guides/configuration-guide/ceph.md",450],"87ff8807":[()=>n.e(6636).then(n.bind(n,6761)),"@site/docs/guides/concept-guide/components/netdata.md",6761],"88884f83":[()=>n.e(2540).then(n.bind(n,9654)),"@site/docs/appendix/glossary.md",9654],"8c451eb7":[()=>n.e(1223).then(n.bind(n,5751)),"@site/blog/2024-01-14-use-of-the-clustershell.md",5751],"8da03187":[()=>n.e(3394).then(n.bind(n,7309)),"@site/docs/guides/deploy-guide/services/infrastructure.md",7309],"8e33b65d":[()=>n.e(9052).then(n.bind(n,1312)),"@site/src/pages/privacy.md",1312],"8e5f32ed":[()=>n.e(1748).then(n.bind(n,526)),"@site/docs/guides/configuration-guide/commons/index.md",526],"8ff7deab":[()=>n.e(8187).then(n.bind(n,6567)),"@site/docs/references/configuration.md",6567],"9008e2e2":[()=>n.e(9061).then(n.bind(n,1612)),"@site/docs/guides/operations-guide/openstack/tools/image-manager/index.md",1612],90342430:[()=>n.e(6378).then(n.bind(n,569)),"@site/docs/guides/other-guides/contributor-guide.md",569],"95c58dad":[()=>n.e(5962).then(n.bind(n,2689)),"@site/blog/2024-01-16-switch-to-opentofu.md?truncated=true",2689],"9731ed60":[()=>n.e(2471).then(n.bind(n,1939)),"@site/src/pages/contact-us.md",1939],"97ec1344":[()=>n.e(8445).then(n.bind(n,9233)),"@site/docs/guides/configuration-guide/openstack/designate.md",9233],"9a9ff86d":[()=>n.e(9877).then(n.bind(n,9883)),"@site/docs/guides/configuration-guide/services/chrony.md",9883],"9e4087bc":[()=>n.e(3608).then(n.bind(n,3169)),"@theme/BlogArchivePage",3169],"9f9f68f7":[()=>n.e(779).then(n.bind(n,8835)),"@site/docs/guides/operations-guide/openstack/tools/project-manager.md",8835],a1f2ef26:[()=>n.e(1067).then(n.bind(n,7697)),"@site/blog/2024-01-16-switch-to-opentofu.md",7697],a3144996:[()=>n.e(2221).then(n.bind(n,955)),"@site/docs/guides/configuration-guide/openstack/neutron.md",955],a4e0d55c:[()=>n.e(8317).then(n.bind(n,7338)),"@site/blog/2024-01-16-use-of-the-container-shell.md?truncated=true",7338],a6659507:[()=>n.e(9498).then(n.bind(n,4362)),"@site/docs/guides/operations-guide/openstack/index.md",4362],a6aa9e1f:[()=>Promise.all([n.e(532),n.e(2802),n.e(7534),n.e(3089)]).then(n.bind(n,4351)),"@theme/BlogListPage",4351],a7017fd1:[()=>n.e(7397).then(n.bind(n,7848)),"@site/docs/guides/configuration-guide/openstack/heat.md",7848],a7456010:[()=>n.e(5980).then(n.t.bind(n,9365,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",9365],a7bd4aaa:[()=>n.e(8518).then(n.bind(n,8564)),"@theme/DocVersionRoot",8564],a7c5002b:[()=>n.e(2968).then(n.bind(n,8479)),"@site/docs/guides/concept-guide/components/openstack.md",8479],a94703ab:[()=>Promise.all([n.e(532),n.e(4368)]).then(n.bind(n,2674)),"@theme/DocRoot",2674],aba21aa0:[()=>n.e(3629).then(n.t.bind(n,1765,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",1765],acecf23e:[()=>n.e(7393).then(n.t.bind(n,1838,19)),"~blog/default/blogMetadata-default.json",1838],ae934d1a:[()=>n.e(1943).then(n.bind(n,969)),"@site/docs/guides/deploy-guide/manager.md",969],b30c80d2:[()=>n.e(7682).then(n.bind(n,8661)),"@site/docs/guides/configuration-guide/validations/index.md",8661],b3cc9666:[()=>n.e(5238).then(n.bind(n,9573)),"@site/docs/guides/concept-guide/components/keycloak.md",9573],b4b93543:[()=>n.e(4689).then(n.bind(n,6418)),"@site/docs/appendix/standards.md",6418],b68de40d:[()=>n.e(6641).then(n.bind(n,3906)),"@site/docs/guides/deploy-guide/provisioning.md",3906],b798ea2b:[()=>n.e(4744).then(n.bind(n,2407)),"@site/docs/guides/operations-guide/manager/apply.md",2407],b82e88c8:[()=>n.e(3177).then(n.bind(n,8665)),"@site/docs/guides/operations-guide/rook.md",8665],b89e0d93:[()=>n.e(698).then(n.t.bind(n,9607,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-osism-c1d.json",9607],bb89255b:[()=>n.e(2695).then(n.bind(n,2164)),"@site/docs/guides/concept-guide/use-cases.md",2164],bd14d84e:[()=>n.e(5109).then(n.bind(n,1089)),"@site/docs/guides/configuration-guide/openstack/aodh.md",1089],bd92db3a:[()=>n.e(1594).then(n.bind(n,1693)),"@site/docs/guides/operations-guide/openstack/tools/openstack-health-monitor.md",1693],bde6240a:[()=>n.e(9830).then(n.bind(n,967)),"@site/docs/guides/concept-guide/components/index.md",967],bed2b685:[()=>n.e(4488).then(n.bind(n,5550)),"@site/docs/guides/configuration-guide/commons/timezone.md",5550],c15d9823:[()=>n.e(6642).then(n.t.bind(n,2506,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-bd9.json",2506],c30598cf:[()=>n.e(2684).then(n.bind(n,5959)),"@site/src/pages/jobs.md",5959],c377a04b:[()=>n.e(6971).then(n.bind(n,8463)),"@site/docs/index.md",8463],c45d899e:[()=>n.e(2018).then(n.bind(n,1450)),"@site/docs/guides/deploy-guide/seed.md",1450],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(4195)]).then(n.bind(n,752)),"@site/src/pages/index.js",752],c7384a82:[()=>n.e(5864).then(n.bind(n,8300)),"@site/docs/guides/operations-guide/openstack/tools/flavor-manager.md",8300],c78af355:[()=>n.e(5322).then(n.bind(n,6662)),"@site/docs/guides/configuration-guide/index.md",6662],c9821a2e:[()=>n.e(9246).then(n.bind(n,4009)),"@site/docs/guides/configuration-guide/proxy.md",4009],ccc45f31:[()=>n.e(1100).then(n.bind(n,7004)),"@site/docs/guides/configuration-guide/services/index.md",7004],ccc49370:[()=>Promise.all([n.e(532),n.e(2802),n.e(7534),n.e(6103)]).then(n.bind(n,9209)),"@theme/BlogPostPage",9209],ccee9b10:[()=>n.e(4283).then(n.bind(n,2788)),"@site/src/pages/about-us.md",2788],ce8be473:[()=>n.e(6497).then(n.bind(n,4778)),"@site/docs/guides/configuration-guide/openstack/placement.md",4778],ced2dfef:[()=>n.e(1361).then(n.bind(n,2515)),"@site/docs/guides/concept-guide/layers.md",2515],cf1d2b40:[()=>n.e(5698).then(n.bind(n,7869)),"@site/docs/guides/operations-guide/openstack/keystone.md",7869],cfb372b1:[()=>n.e(3252).then(n.bind(n,3642)),"@site/docs/guides/operations-guide/openstack/tools/sandbox-manager.md",3642],d03241c9:[()=>n.e(2871).then(n.bind(n,5846)),"@site/docs/guides/index.md",5846],d0703ff7:[()=>n.e(6931).then(n.t.bind(n,5796,19)),"@generated/docusaurus-plugin-content-docs/users/__plugin.json",5796],d0b7b1a7:[()=>n.e(5222).then(n.t.bind(n,2221,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-sneak-peak-41a.json",2221],d0f03c80:[()=>n.e(366).then(n.bind(n,8691)),"@site/docs/guides/upgrade-guide/openstack.md",8691],d2b0f7bd:[()=>n.e(3199).then(n.bind(n,5581)),"@site/docs/guides/configuration-guide/network.md",5581],d5f7a6fc:[()=>n.e(1892).then(n.bind(n,1414)),"@site/docs/guides/concept-guide/components/prometheus.md",1414],d7a98899:[()=>n.e(6666).then(n.bind(n,4976)),"@site/docs/guides/configuration-guide/openstack/magnum.md",4976],db7ff767:[()=>n.e(6537).then(n.bind(n,347)),"@site/docs/guides/configuration-guide/inventory.md",347],dbb7d2f3:[()=>Promise.all([n.e(532),n.e(5378)]).then(n.bind(n,9488)),"@site/docs/guides/deploy-guide/services/ceph.mdx",9488],dbbbc829:[()=>n.e(4329).then(n.bind(n,2625)),"@site/docs/guides/upgrade-guide/network.md",2625],dbe528c9:[()=>n.e(6330).then(n.bind(n,7752)),"@site/docs/guides/deploy-guide/services/openstack.md",7752],dd3359e9:[()=>Promise.all([n.e(532),n.e(4134)]).then(n.bind(n,6268)),"@site/docs/guides/upgrade-guide/manager.mdx",6268],de57d45c:[()=>n.e(1574).then(n.bind(n,7623)),"@site/docs/guides/operations-guide/index.md",7623],e0698a94:[()=>n.e(8157).then(n.bind(n,9177)),"@site/docs/guides/deploy-guide/services/index.md",9177],e29aad9d:[()=>n.e(1195).then(n.bind(n,7292)),"@site/docs/guides/operations-guide/manager/console.md",7292],e331e3e2:[()=>n.e(2868).then(n.bind(n,7414)),"@site/docs/guides/user-guide/migration-vmware-esix.md",7414],e5eb6f7e:[()=>n.e(1180).then(n.bind(n,3434)),"@site/src/pages/legals.md",3434],e6963042:[()=>n.e(7937).then(n.bind(n,7417)),"@site/docs/guides/user-guide/openstack/user-data-backups.md",7417],e934a396:[()=>n.e(3188).then(n.bind(n,2716)),"@site/docs/guides/configuration-guide/commons/packages.md",2716],e9b984e6:[()=>n.e(201).then(n.bind(n,9116)),"@site/docs/appendix/comparisons.md",9116],ea4c6a72:[()=>n.e(6985).then(n.bind(n,3612)),"@site/src/pages/partners.md",3612],f159c280:[()=>n.e(2557).then(n.bind(n,9406)),"@site/docs/guides/operations-guide/network.md",9406],f2afad6f:[()=>n.e(7419).then(n.bind(n,1481)),"@site/src/pages/support.md",1481],f3e1e4c4:[()=>n.e(1336).then(n.bind(n,6023)),"@site/docs/guides/other-guides/developer-guide/scripts.md",6023],f4931b40:[()=>n.e(7).then(n.bind(n,8121)),"@site/docs/guides/configuration-guide/commons/user.md",8121],f6217829:[()=>n.e(6882).then(n.bind(n,4565)),"@site/docs/guides/configuration-guide/services/docker.md",4565],f7e4724a:[()=>n.e(5826).then(n.bind(n,3005)),"@site/docs/guides/deploy-guide/bootstrap.md",3005],f81c1134:[()=>n.e(4031).then(n.t.bind(n,4108,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json",4108],f8a055c5:[()=>n.e(289).then(n.bind(n,9155)),"@site/docs/release-notes/osism-7.md",9155],f96dc981:[()=>n.e(6571).then(n.bind(n,9911)),"@site/docs/guides/concept-guide/components/clusterapi.md",9911],fac2b365:[()=>n.e(9377).then(n.bind(n,2201)),"@site/docs/guides/configuration-guide/configuration-repository.md",2201],fb66bc4c:[()=>n.e(5961).then(n.bind(n,6504)),"@site/docs/guides/other-guides/style-guide.md",6504]};var s=n(5893);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(9670),u=n(226);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(1772).then(n.bind(n,1772)),modules:["@theme/NotFound"],webpack:()=>[1772],render(e,t){const n=e.default;return(0,s.jsx)(u.z,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=i[`${e}-${t}`],d={},p=[],f=[],g=(0,c.Z)(r);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=a[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const i=r.default;if(!i)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof i&&"function"!=typeof i||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{i[e]=r[e]}));let a=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{a=a[e]})),a[s[s.length-1]]=i}));const i=o.__comp;delete o.__comp;const a=o.__context;delete o.__context;const l=o.__props;return delete o.__props,(0,s.jsx)(u.z,{value:a,children:(0,s.jsx)(i,{...o,...l,...n})})}})}const p=[{path:"/about-us",component:d("/about-us","960"),exact:!0},{path:"/blog",component:d("/blog","3af"),exact:!0},{path:"/blog/2024-01-11-kubernetes-service-deployment",component:d("/blog/2024-01-11-kubernetes-service-deployment","e02"),exact:!0},{path:"/blog/2024-01-12-restart-of-a-container-on-a-specific-node",component:d("/blog/2024-01-12-restart-of-a-container-on-a-specific-node","eb4"),exact:!0},{path:"/blog/2024-01-14-use-of-the-clustershell",component:d("/blog/2024-01-14-use-of-the-clustershell","00c"),exact:!0},{path:"/blog/2024-01-16-switch-to-opentofu",component:d("/blog/2024-01-16-switch-to-opentofu","e2b"),exact:!0},{path:"/blog/2024-01-16-use-of-the-container-shell",component:d("/blog/2024-01-16-use-of-the-container-shell","113"),exact:!0},{path:"/blog/2024-03-04-show-versions-used-on-the-manager",component:d("/blog/2024-03-04-show-versions-used-on-the-manager","4c8"),exact:!0},{path:"/blog/archive",component:d("/blog/archive","182"),exact:!0},{path:"/blog/tags",component:d("/blog/tags","287"),exact:!0},{path:"/blog/tags/kubernetes",component:d("/blog/tags/kubernetes","48c"),exact:!0},{path:"/blog/tags/machine-room",component:d("/blog/tags/machine-room","a2e"),exact:!0},{path:"/blog/tags/news",component:d("/blog/tags/news","395"),exact:!0},{path:"/blog/tags/osism",component:d("/blog/tags/osism","20c"),exact:!0},{path:"/blog/tags/sneak-peak",component:d("/blog/tags/sneak-peak","13f"),exact:!0},{path:"/contact-us",component:d("/contact-us","d8e"),exact:!0},{path:"/jobs",component:d("/jobs","563"),exact:!0},{path:"/legals",component:d("/legals","952"),exact:!0},{path:"/partners",component:d("/partners","43d"),exact:!0},{path:"/privacy",component:d("/privacy","476"),exact:!0},{path:"/search",component:d("/search","822"),exact:!0},{path:"/support",component:d("/support","ce4"),exact:!0},{path:"/terms",component:d("/terms","235"),exact:!0},{path:"/docs",component:d("/docs","15e"),routes:[{path:"/docs",component:d("/docs","8f8"),routes:[{path:"/docs",component:d("/docs","010"),routes:[{path:"/docs/",component:d("/docs/","4a8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/appendix/",component:d("/docs/appendix/","f91"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/appendix/comparisons",component:d("/docs/appendix/comparisons","87f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/appendix/glossary",component:d("/docs/appendix/glossary","16e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/appendix/networks",component:d("/docs/appendix/networks","eb6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/appendix/standards",component:d("/docs/appendix/standards","4db"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/",component:d("/docs/guides/","e13"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/",component:d("/docs/guides/concept-guide/","3f5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/components/",component:d("/docs/guides/concept-guide/components/","55f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/components/ceph",component:d("/docs/guides/concept-guide/components/ceph","23a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/components/clusterapi",component:d("/docs/guides/concept-guide/components/clusterapi","c76"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/components/gardener",component:d("/docs/guides/concept-guide/components/gardener","74a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/components/ironic",component:d("/docs/guides/concept-guide/components/ironic","68b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/components/k3s",component:d("/docs/guides/concept-guide/components/k3s","04c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/components/keycloak",component:d("/docs/guides/concept-guide/components/keycloak","ea4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/components/netdata",component:d("/docs/guides/concept-guide/components/netdata","384"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/components/openstack",component:d("/docs/guides/concept-guide/components/openstack","772"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/components/prometheus",component:d("/docs/guides/concept-guide/components/prometheus","4ac"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/components/proxmox",component:d("/docs/guides/concept-guide/components/proxmox","f51"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/components/sonic",component:d("/docs/guides/concept-guide/components/sonic","de3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/components/teleport",component:d("/docs/guides/concept-guide/components/teleport","ce4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/design",component:d("/docs/guides/concept-guide/design","e9b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/hardware-bom",component:d("/docs/guides/concept-guide/hardware-bom","b58"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/layers",component:d("/docs/guides/concept-guide/layers","a24"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/nodes",component:d("/docs/guides/concept-guide/nodes","ee8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/concept-guide/use-cases",component:d("/docs/guides/concept-guide/use-cases","3d9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/",component:d("/docs/guides/configuration-guide/","c40"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/ceph",component:d("/docs/guides/configuration-guide/ceph","fe5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/commons/",component:d("/docs/guides/configuration-guide/commons/","757"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/commons/certificates",component:d("/docs/guides/configuration-guide/commons/certificates","60b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/commons/packages",component:d("/docs/guides/configuration-guide/commons/packages","2f2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/commons/resolvconf",component:d("/docs/guides/configuration-guide/commons/resolvconf","beb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/commons/services",component:d("/docs/guides/configuration-guide/commons/services","722"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/commons/sshconfig",component:d("/docs/guides/configuration-guide/commons/sshconfig","1e4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/commons/sysctl",component:d("/docs/guides/configuration-guide/commons/sysctl","c91"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/commons/timezone",component:d("/docs/guides/configuration-guide/commons/timezone","0f8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/commons/user",component:d("/docs/guides/configuration-guide/commons/user","ea5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/configuration-repository",component:d("/docs/guides/configuration-guide/configuration-repository","7cf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/inventory",component:d("/docs/guides/configuration-guide/inventory","955"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/loadbalancer",component:d("/docs/guides/configuration-guide/loadbalancer","a3a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/manager",component:d("/docs/guides/configuration-guide/manager","116"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/network",component:d("/docs/guides/configuration-guide/network","13c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/openstack/",component:d("/docs/guides/configuration-guide/openstack/","c16"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/openstack/aodh",component:d("/docs/guides/configuration-guide/openstack/aodh","7c6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/openstack/barbican",component:d("/docs/guides/configuration-guide/openstack/barbican","953"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/openstack/ceilometer",component:d("/docs/guides/configuration-guide/openstack/ceilometer","5c7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/openstack/cinder",component:d("/docs/guides/configuration-guide/openstack/cinder","998"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/openstack/designate",component:d("/docs/guides/configuration-guide/openstack/designate","6c2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/openstack/glance",component:d("/docs/guides/configuration-guide/openstack/glance","f43"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/openstack/heat",component:d("/docs/guides/configuration-guide/openstack/heat","cda"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/openstack/horizon",component:d("/docs/guides/configuration-guide/openstack/horizon","9f0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/openstack/ironic",component:d("/docs/guides/configuration-guide/openstack/ironic","381"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/openstack/keystone",component:d("/docs/guides/configuration-guide/openstack/keystone","42a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/openstack/magnum",component:d("/docs/guides/configuration-guide/openstack/magnum","93a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/openstack/manila",component:d("/docs/guides/configuration-guide/openstack/manila","889"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/openstack/neutron",component:d("/docs/guides/configuration-guide/openstack/neutron","317"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/openstack/nova",component:d("/docs/guides/configuration-guide/openstack/nova","d3d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/openstack/octavia",component:d("/docs/guides/configuration-guide/openstack/octavia","66a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/openstack/placement",component:d("/docs/guides/configuration-guide/openstack/placement","783"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/openstack/skyline",component:d("/docs/guides/configuration-guide/openstack/skyline","bf0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/proxy",component:d("/docs/guides/configuration-guide/proxy","3a1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/rook",component:d("/docs/guides/configuration-guide/rook","352"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/services/",component:d("/docs/guides/configuration-guide/services/","93c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/services/chrony",component:d("/docs/guides/configuration-guide/services/chrony","50e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/services/docker",component:d("/docs/guides/configuration-guide/services/docker","643"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/services/tuned",component:d("/docs/guides/configuration-guide/services/tuned","02d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/configuration-guide/validations/",component:d("/docs/guides/configuration-guide/validations/","c76"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/deploy-guide/",component:d("/docs/guides/deploy-guide/","0fd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/deploy-guide/bootstrap",component:d("/docs/guides/deploy-guide/bootstrap","3ec"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/deploy-guide/examples/",component:d("/docs/guides/deploy-guide/examples/","f2f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/deploy-guide/examples/cloud-in-a-box",component:d("/docs/guides/deploy-guide/examples/cloud-in-a-box","957"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/deploy-guide/examples/testbed",component:d("/docs/guides/deploy-guide/examples/testbed","772"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/deploy-guide/manager",component:d("/docs/guides/deploy-guide/manager","8c5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/deploy-guide/provisioning",component:d("/docs/guides/deploy-guide/provisioning","af9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/deploy-guide/seed",component:d("/docs/guides/deploy-guide/seed","3f0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/deploy-guide/services/",component:d("/docs/guides/deploy-guide/services/","e37"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/deploy-guide/services/ceph",component:d("/docs/guides/deploy-guide/services/ceph","f0d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/deploy-guide/services/infrastructure",component:d("/docs/guides/deploy-guide/services/infrastructure","b48"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/deploy-guide/services/kubernetes",component:d("/docs/guides/deploy-guide/services/kubernetes","fba"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/deploy-guide/services/logging-monitoring",component:d("/docs/guides/deploy-guide/services/logging-monitoring","4ab"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/deploy-guide/services/network",component:d("/docs/guides/deploy-guide/services/network","6ae"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/deploy-guide/services/openstack",component:d("/docs/guides/deploy-guide/services/openstack","ea0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/deploy-guide/services/rook",component:d("/docs/guides/deploy-guide/services/rook","6d5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/",component:d("/docs/guides/operations-guide/","291"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/ceph",component:d("/docs/guides/operations-guide/ceph","03d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/infrastructure",component:d("/docs/guides/operations-guide/infrastructure","aca"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/manager/",component:d("/docs/guides/operations-guide/manager/","cf1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/manager/apply",component:d("/docs/guides/operations-guide/manager/apply","393"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/manager/console",component:d("/docs/guides/operations-guide/manager/console","a8d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/manager/get",component:d("/docs/guides/operations-guide/manager/get","e94"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/manager/log",component:d("/docs/guides/operations-guide/manager/log","a36"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/manager/task",component:d("/docs/guides/operations-guide/manager/task","2dd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/network",component:d("/docs/guides/operations-guide/network","6e9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/openstack/",component:d("/docs/guides/operations-guide/openstack/","641"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/openstack/cinder",component:d("/docs/guides/operations-guide/openstack/cinder","577"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/openstack/keystone",component:d("/docs/guides/operations-guide/openstack/keystone","df0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/openstack/neutron",component:d("/docs/guides/operations-guide/openstack/neutron","888"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/openstack/nova",component:d("/docs/guides/operations-guide/openstack/nova","d86"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/openstack/octavia",component:d("/docs/guides/operations-guide/openstack/octavia","52a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/openstack/tools/",component:d("/docs/guides/operations-guide/openstack/tools/","b4b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/openstack/tools/flavor-manager",component:d("/docs/guides/operations-guide/openstack/tools/flavor-manager","79a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/openstack/tools/image-manager/",component:d("/docs/guides/operations-guide/openstack/tools/image-manager/","d33"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/openstack/tools/image-manager/update",component:d("/docs/guides/operations-guide/openstack/tools/image-manager/update","dea"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/openstack/tools/openstack-health-monitor",component:d("/docs/guides/operations-guide/openstack/tools/openstack-health-monitor","efd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/openstack/tools/project-manager",component:d("/docs/guides/operations-guide/openstack/tools/project-manager","b83"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/openstack/tools/resource-manager",component:d("/docs/guides/operations-guide/openstack/tools/resource-manager","f5d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/openstack/tools/sandbox-manager",component:d("/docs/guides/operations-guide/openstack/tools/sandbox-manager","622"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/openstack/tools/simple-stress",component:d("/docs/guides/operations-guide/openstack/tools/simple-stress","44d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/operations-guide/rook",component:d("/docs/guides/operations-guide/rook","a43"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/other-guides/",component:d("/docs/guides/other-guides/","849"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/other-guides/cloud-in-a-box",component:d("/docs/guides/other-guides/cloud-in-a-box","4d9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/other-guides/contributor-guide",component:d("/docs/guides/other-guides/contributor-guide","628"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/other-guides/developer-guide/",component:d("/docs/guides/other-guides/developer-guide/","39e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/other-guides/developer-guide/releases",component:d("/docs/guides/other-guides/developer-guide/releases","d02"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/other-guides/developer-guide/scripts",component:d("/docs/guides/other-guides/developer-guide/scripts","8ac"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/other-guides/developer-guide/zuul",component:d("/docs/guides/other-guides/developer-guide/zuul","54b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/other-guides/style-guide",component:d("/docs/guides/other-guides/style-guide","a32"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/other-guides/testbed",component:d("/docs/guides/other-guides/testbed","a41"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/troubleshooting-guide/",component:d("/docs/guides/troubleshooting-guide/","590"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/troubleshooting-guide/ceph",component:d("/docs/guides/troubleshooting-guide/ceph","c65"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/troubleshooting-guide/manager",component:d("/docs/guides/troubleshooting-guide/manager","df5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/troubleshooting-guide/openstack",component:d("/docs/guides/troubleshooting-guide/openstack","04c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/upgrade-guide/",component:d("/docs/guides/upgrade-guide/","6e6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/upgrade-guide/ceph",component:d("/docs/guides/upgrade-guide/ceph","2a6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/upgrade-guide/docker",component:d("/docs/guides/upgrade-guide/docker","10b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/upgrade-guide/infrastructure",component:d("/docs/guides/upgrade-guide/infrastructure","16c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/upgrade-guide/logging-monitoring",component:d("/docs/guides/upgrade-guide/logging-monitoring","8fc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/upgrade-guide/manager",component:d("/docs/guides/upgrade-guide/manager","5f4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/upgrade-guide/network",component:d("/docs/guides/upgrade-guide/network","130"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/upgrade-guide/openstack",component:d("/docs/guides/upgrade-guide/openstack","ee5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/user-guide/",component:d("/docs/guides/user-guide/","873"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/user-guide/migration-vmware-esix",component:d("/docs/guides/user-guide/migration-vmware-esix","fb5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/user-guide/openstack/",component:d("/docs/guides/user-guide/openstack/","cbf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/user-guide/openstack/openstackclient",component:d("/docs/guides/user-guide/openstack/openstackclient","12c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/user-guide/openstack/security-groups",component:d("/docs/guides/user-guide/openstack/security-groups","9c3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/user-guide/openstack/user-data-backups",component:d("/docs/guides/user-guide/openstack/user-data-backups","c5d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/references/",component:d("/docs/references/","1f1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/references/cli",component:d("/docs/references/cli","c7e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/references/configuration",component:d("/docs/references/configuration","fca"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/references/parameters",component:d("/docs/references/parameters","85e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/release-notes/",component:d("/docs/release-notes/","dfd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/release-notes/osism-7",component:d("/docs/release-notes/osism-7","b9d"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/users",component:d("/users","4b4"),routes:[{path:"/users",component:d("/users","33d"),routes:[{path:"/users",component:d("/users","5ee"),routes:[{path:"/users/",component:d("/users/","dff"),exact:!0,sidebar:"adaptorsSidebar"}]}]}]},{path:"/",component:d("/","2e1"),exact:!0},{path:"*",component:d("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>i,t:()=>a});var r=n(7294),o=n(5893);const i=r.createContext(!1);function a(e){let{children:t}=e;const[n,a]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{a(!0)}),[]),(0,o.jsx)(i.Provider,{value:n,children:t})}},7221:(e,t,n)=>{"use strict";var r=n(7294),o=n(745),i=n(405),a=n(3727),s=n(6809),l=n(412);const c=[n(2497),n(3310),n(8320),n(2295)];var u=n(723),d=n(6550),p=n(8790),f=n(5893);function g(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var m=n(5742),h=n(2263),b=n(4996),y=n(6668),v=n(8264),k=n(4711),w=n(9727),x=n(3320),S=n(8780),_=n(197);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,h.Z)(),r=(0,k.l)(),o=n[e].htmlLang,i=e=>e.replace("-","_");return(0,f.jsxs)(m.Z,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:i(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:i(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function C(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.Z)(),{pathname:r}=(0,d.TH)();return e+(0,S.applyTrailingSlash)((0,b.ZP)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,f.jsxs)(m.Z,{children:[(0,f.jsx)("meta",{property:"og:url",content:o}),(0,f.jsx)("link",{rel:"canonical",href:o})]})}function T(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,y.L)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(m.Z,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:w.h})]}),n&&(0,f.jsx)(v.d,{image:n}),(0,f.jsx)(C,{}),(0,f.jsx)(E,{}),(0,f.jsx)(_.Z,{tag:x.HX,locale:e}),(0,f.jsx)(m.Z,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const L=new Map;var P=n(8934),j=n(8940),A=n(469);function R(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r Your Docusaurus site did not load properly. A very common reason is a wrong site baseUrl configuration. Current configured baseUrl = ${e} ${"/"===e?" (default value)":""} We suggest trying baseUrl =