From 1c310dbc86ffc7e3a674076481f275e01f1da319 Mon Sep 17 00:00:00 2001 From: berendt Date: Mon, 7 Oct 2024 07:11:31 +0000 Subject: [PATCH] deploy: 9963444b0aff4f6c72e0614531f6f6933c57454d --- 404.html | 4 ++-- about-us/index.html | 4 ++-- assets/js/6235e5b8.0d02a674.js | 1 - assets/js/6235e5b8.9481a2ce.js | 1 + assets/js/{main.63bb4bfb.js => main.dcf27989.js} | 4 ++-- ...b4bfb.js.LICENSE.txt => main.dcf27989.js.LICENSE.txt} | 0 ...runtime~main.0142531b.js => runtime~main.560fcb88.js} | 2 +- blog/2024-01-11-kubernetes-service-deployment/index.html | 4 ++-- .../index.html | 4 ++-- blog/2024-01-14-use-of-the-clustershell/index.html | 4 ++-- blog/2024-01-16-switch-to-opentofu/index.html | 4 ++-- blog/2024-01-16-use-of-the-container-shell/index.html | 4 ++-- .../index.html | 4 ++-- blog/archive/index.html | 4 ++-- blog/authors/index.html | 4 ++-- blog/index.html | 4 ++-- blog/tags/index.html | 4 ++-- blog/tags/kubernetes/index.html | 4 ++-- blog/tags/machine-room/index.html | 4 ++-- blog/tags/news/index.html | 4 ++-- blog/tags/osism/index.html | 4 ++-- blog/tags/sneak-peak/index.html | 4 ++-- contact-us/index.html | 4 ++-- de/404.html | 4 ++-- de/about-us/index.html | 4 ++-- de/assets/js/6235e5b8.73767954.js | 1 + de/assets/js/6235e5b8.fb918d72.js | 1 - de/assets/js/{main.71696212.js => main.13b1e575.js} | 4 ++-- ...96212.js.LICENSE.txt => main.13b1e575.js.LICENSE.txt} | 0 ...runtime~main.d2a0876e.js => runtime~main.fe74c436.js} | 2 +- .../2024-01-11-kubernetes-service-deployment/index.html | 4 ++-- .../index.html | 4 ++-- de/blog/2024-01-14-use-of-the-clustershell/index.html | 4 ++-- de/blog/2024-01-16-switch-to-opentofu/index.html | 4 ++-- de/blog/2024-01-16-use-of-the-container-shell/index.html | 4 ++-- .../index.html | 4 ++-- de/blog/archive/index.html | 4 ++-- de/blog/authors/index.html | 4 ++-- de/blog/index.html | 4 ++-- de/blog/tags/index.html | 4 ++-- de/blog/tags/kubernetes/index.html | 4 ++-- de/blog/tags/machine-room/index.html | 4 ++-- de/blog/tags/news/index.html | 4 ++-- de/blog/tags/osism/index.html | 4 ++-- de/blog/tags/sneak-peak/index.html | 4 ++-- de/contact-us/index.html | 4 ++-- de/docs/appendix/comparisons/index.html | 4 ++-- de/docs/appendix/glossary/index.html | 4 ++-- de/docs/appendix/index.html | 4 ++-- de/docs/appendix/networks/index.html | 4 ++-- de/docs/appendix/standards/index.html | 4 ++-- de/docs/guides/concept-guide/components/ceph/index.html | 4 ++-- .../concept-guide/components/clusterapi/index.html | 4 ++-- .../guides/concept-guide/components/gardener/index.html | 4 ++-- de/docs/guides/concept-guide/components/index.html | 4 ++-- .../guides/concept-guide/components/ironic/index.html | 4 ++-- de/docs/guides/concept-guide/components/k3s/index.html | 4 ++-- .../guides/concept-guide/components/keycloak/index.html | 4 ++-- .../guides/concept-guide/components/netdata/index.html | 4 ++-- .../guides/concept-guide/components/openstack/index.html | 4 ++-- .../concept-guide/components/prometheus/index.html | 4 ++-- .../guides/concept-guide/components/proxmox/index.html | 4 ++-- de/docs/guides/concept-guide/components/sonic/index.html | 4 ++-- .../guides/concept-guide/components/teleport/index.html | 4 ++-- de/docs/guides/concept-guide/design/index.html | 4 ++-- de/docs/guides/concept-guide/hardware-bom/index.html | 4 ++-- de/docs/guides/concept-guide/index.html | 4 ++-- de/docs/guides/concept-guide/layers/index.html | 4 ++-- de/docs/guides/concept-guide/nodes/index.html | 4 ++-- de/docs/guides/concept-guide/use-cases/index.html | 4 ++-- de/docs/guides/configuration-guide/ceph/index.html | 4 ++-- .../configuration-guide/commons/certificates/index.html | 4 ++-- de/docs/guides/configuration-guide/commons/index.html | 4 ++-- .../configuration-guide/commons/packages/index.html | 4 ++-- .../configuration-guide/commons/resolvconf/index.html | 4 ++-- .../configuration-guide/commons/services/index.html | 4 ++-- .../configuration-guide/commons/sshconfig/index.html | 4 ++-- .../guides/configuration-guide/commons/sysctl/index.html | 4 ++-- .../configuration-guide/commons/timezone/index.html | 4 ++-- .../guides/configuration-guide/commons/user/index.html | 4 ++-- .../configuration-repository/index.html | 4 ++-- de/docs/guides/configuration-guide/index.html | 4 ++-- de/docs/guides/configuration-guide/inventory/index.html | 4 ++-- .../guides/configuration-guide/loadbalancer/index.html | 4 ++-- de/docs/guides/configuration-guide/manager/index.html | 4 ++-- de/docs/guides/configuration-guide/network/index.html | 4 ++-- .../guides/configuration-guide/openstack/aodh/index.html | 4 ++-- .../configuration-guide/openstack/barbican/index.html | 4 ++-- .../configuration-guide/openstack/ceilometer/index.html | 4 ++-- .../configuration-guide/openstack/cinder/index.html | 4 ++-- .../configuration-guide/openstack/designate/index.html | 4 ++-- .../configuration-guide/openstack/glance/index.html | 4 ++-- .../guides/configuration-guide/openstack/heat/index.html | 4 ++-- .../configuration-guide/openstack/horizon/index.html | 4 ++-- de/docs/guides/configuration-guide/openstack/index.html | 4 ++-- .../configuration-guide/openstack/ironic/index.html | 4 ++-- .../configuration-guide/openstack/keystone/index.html | 4 ++-- .../configuration-guide/openstack/magnum/index.html | 4 ++-- .../configuration-guide/openstack/manila/index.html | 4 ++-- .../configuration-guide/openstack/neutron/index.html | 4 ++-- .../guides/configuration-guide/openstack/nova/index.html | 4 ++-- .../configuration-guide/openstack/octavia/index.html | 4 ++-- .../configuration-guide/openstack/placement/index.html | 4 ++-- .../configuration-guide/openstack/skyline/index.html | 4 ++-- de/docs/guides/configuration-guide/proxy/index.html | 4 ++-- de/docs/guides/configuration-guide/rook/index.html | 4 ++-- .../configuration-guide/services/chrony/index.html | 4 ++-- .../configuration-guide/services/docker/index.html | 4 ++-- de/docs/guides/configuration-guide/services/index.html | 4 ++-- .../guides/configuration-guide/services/tuned/index.html | 4 ++-- .../guides/configuration-guide/validations/index.html | 4 ++-- de/docs/guides/deploy-guide/bootstrap/index.html | 4 ++-- .../deploy-guide/examples/cloud-in-a-box/index.html | 4 ++-- de/docs/guides/deploy-guide/examples/index.html | 4 ++-- de/docs/guides/deploy-guide/examples/testbed/index.html | 4 ++-- de/docs/guides/deploy-guide/index.html | 4 ++-- de/docs/guides/deploy-guide/manager/index.html | 4 ++-- de/docs/guides/deploy-guide/provisioning/index.html | 4 ++-- de/docs/guides/deploy-guide/seed/index.html | 4 ++-- de/docs/guides/deploy-guide/services/ceph/index.html | 4 ++-- de/docs/guides/deploy-guide/services/index.html | 4 ++-- .../deploy-guide/services/infrastructure/index.html | 4 ++-- .../guides/deploy-guide/services/kubernetes/index.html | 4 ++-- .../deploy-guide/services/logging-monitoring/index.html | 4 ++-- de/docs/guides/deploy-guide/services/network/index.html | 4 ++-- .../guides/deploy-guide/services/openstack/index.html | 4 ++-- de/docs/guides/deploy-guide/services/rook/index.html | 4 ++-- de/docs/guides/index.html | 4 ++-- de/docs/guides/operations-guide/ceph/index.html | 4 ++-- de/docs/guides/operations-guide/index.html | 4 ++-- .../guides/operations-guide/infrastructure/index.html | 4 ++-- de/docs/guides/operations-guide/manager/apply/index.html | 4 ++-- .../guides/operations-guide/manager/console/index.html | 4 ++-- de/docs/guides/operations-guide/manager/get/index.html | 4 ++-- de/docs/guides/operations-guide/manager/index.html | 4 ++-- de/docs/guides/operations-guide/manager/log/index.html | 4 ++-- de/docs/guides/operations-guide/manager/task/index.html | 4 ++-- de/docs/guides/operations-guide/network/index.html | 4 ++-- .../guides/operations-guide/openstack/cinder/index.html | 4 ++-- de/docs/guides/operations-guide/openstack/index.html | 4 ++-- .../operations-guide/openstack/keystone/index.html | 4 ++-- .../guides/operations-guide/openstack/neutron/index.html | 4 ++-- .../guides/operations-guide/openstack/nova/index.html | 4 ++-- .../guides/operations-guide/openstack/octavia/index.html | 4 ++-- .../openstack/tools/flavor-manager/index.html | 4 ++-- .../openstack/tools/image-manager/index.html | 4 ++-- .../openstack/tools/image-manager/update/index.html | 4 ++-- .../guides/operations-guide/openstack/tools/index.html | 4 ++-- .../openstack/tools/openstack-health-monitor/index.html | 4 ++-- .../openstack/tools/project-manager/index.html | 4 ++-- .../openstack/tools/resource-manager/index.html | 4 ++-- .../openstack/tools/sandbox-manager/index.html | 4 ++-- .../openstack/tools/simple-stress/index.html | 4 ++-- de/docs/guides/operations-guide/rook/index.html | 4 ++-- de/docs/guides/other-guides/cloud-in-a-box/index.html | 4 ++-- .../running-on-a-virtual-machine/index.html | 4 ++-- de/docs/guides/other-guides/contributor-guide/index.html | 4 ++-- de/docs/guides/other-guides/developer-guide/index.html | 4 ++-- .../other-guides/developer-guide/releases/index.html | 4 ++-- .../other-guides/developer-guide/scripts/index.html | 4 ++-- .../guides/other-guides/developer-guide/zuul/index.html | 4 ++-- de/docs/guides/other-guides/index.html | 4 ++-- de/docs/guides/other-guides/style-guide/index.html | 4 ++-- de/docs/guides/other-guides/testbed/index.html | 9 ++++++--- de/docs/guides/troubleshooting-guide/ceph/index.html | 4 ++-- de/docs/guides/troubleshooting-guide/index.html | 4 ++-- de/docs/guides/troubleshooting-guide/manager/index.html | 4 ++-- .../guides/troubleshooting-guide/openstack/index.html | 4 ++-- de/docs/guides/upgrade-guide/ceph/index.html | 4 ++-- de/docs/guides/upgrade-guide/docker/index.html | 4 ++-- de/docs/guides/upgrade-guide/index.html | 4 ++-- de/docs/guides/upgrade-guide/infrastructure/index.html | 4 ++-- .../guides/upgrade-guide/logging-monitoring/index.html | 4 ++-- de/docs/guides/upgrade-guide/manager/index.html | 4 ++-- de/docs/guides/upgrade-guide/network/index.html | 4 ++-- de/docs/guides/upgrade-guide/openstack/index.html | 4 ++-- de/docs/guides/user-guide/index.html | 4 ++-- .../guides/user-guide/migration-vmware-esxi/index.html | 4 ++-- de/docs/guides/user-guide/openstack/index.html | 4 ++-- .../user-guide/openstack/openstackclient/index.html | 4 ++-- .../user-guide/openstack/security-groups/index.html | 4 ++-- .../user-guide/openstack/user-data-backups/index.html | 4 ++-- de/docs/index.html | 4 ++-- de/docs/references/cli/index.html | 4 ++-- de/docs/references/configuration/index.html | 4 ++-- de/docs/references/index.html | 4 ++-- de/docs/references/parameters/index.html | 4 ++-- de/docs/release-notes/index.html | 4 ++-- de/docs/release-notes/osism-7/index.html | 4 ++-- de/docs/release-notes/osism-8/index.html | 4 ++-- de/index.html | 4 ++-- de/jobs/index.html | 4 ++-- de/legals/index.html | 4 ++-- de/partners/index.html | 4 ++-- de/privacy/index.html | 4 ++-- de/search-index.json | 2 +- de/search/index.html | 4 ++-- de/support/index.html | 4 ++-- de/terms/index.html | 4 ++-- de/users/index.html | 4 ++-- docs/appendix/comparisons/index.html | 4 ++-- docs/appendix/glossary/index.html | 4 ++-- docs/appendix/index.html | 4 ++-- docs/appendix/networks/index.html | 4 ++-- docs/appendix/standards/index.html | 4 ++-- docs/guides/concept-guide/components/ceph/index.html | 4 ++-- .../concept-guide/components/clusterapi/index.html | 4 ++-- docs/guides/concept-guide/components/gardener/index.html | 4 ++-- docs/guides/concept-guide/components/index.html | 4 ++-- docs/guides/concept-guide/components/ironic/index.html | 4 ++-- docs/guides/concept-guide/components/k3s/index.html | 4 ++-- docs/guides/concept-guide/components/keycloak/index.html | 4 ++-- docs/guides/concept-guide/components/netdata/index.html | 4 ++-- .../guides/concept-guide/components/openstack/index.html | 4 ++-- .../concept-guide/components/prometheus/index.html | 4 ++-- docs/guides/concept-guide/components/proxmox/index.html | 4 ++-- docs/guides/concept-guide/components/sonic/index.html | 4 ++-- docs/guides/concept-guide/components/teleport/index.html | 4 ++-- docs/guides/concept-guide/design/index.html | 4 ++-- docs/guides/concept-guide/hardware-bom/index.html | 4 ++-- docs/guides/concept-guide/index.html | 4 ++-- docs/guides/concept-guide/layers/index.html | 4 ++-- docs/guides/concept-guide/nodes/index.html | 4 ++-- docs/guides/concept-guide/use-cases/index.html | 4 ++-- docs/guides/configuration-guide/ceph/index.html | 4 ++-- .../configuration-guide/commons/certificates/index.html | 4 ++-- docs/guides/configuration-guide/commons/index.html | 4 ++-- .../configuration-guide/commons/packages/index.html | 4 ++-- .../configuration-guide/commons/resolvconf/index.html | 4 ++-- .../configuration-guide/commons/services/index.html | 4 ++-- .../configuration-guide/commons/sshconfig/index.html | 4 ++-- .../guides/configuration-guide/commons/sysctl/index.html | 4 ++-- .../configuration-guide/commons/timezone/index.html | 4 ++-- docs/guides/configuration-guide/commons/user/index.html | 4 ++-- .../configuration-repository/index.html | 4 ++-- docs/guides/configuration-guide/index.html | 4 ++-- docs/guides/configuration-guide/inventory/index.html | 4 ++-- docs/guides/configuration-guide/loadbalancer/index.html | 4 ++-- docs/guides/configuration-guide/manager/index.html | 4 ++-- docs/guides/configuration-guide/network/index.html | 4 ++-- .../guides/configuration-guide/openstack/aodh/index.html | 4 ++-- .../configuration-guide/openstack/barbican/index.html | 4 ++-- .../configuration-guide/openstack/ceilometer/index.html | 4 ++-- .../configuration-guide/openstack/cinder/index.html | 4 ++-- .../configuration-guide/openstack/designate/index.html | 4 ++-- .../configuration-guide/openstack/glance/index.html | 4 ++-- .../guides/configuration-guide/openstack/heat/index.html | 4 ++-- .../configuration-guide/openstack/horizon/index.html | 4 ++-- docs/guides/configuration-guide/openstack/index.html | 4 ++-- .../configuration-guide/openstack/ironic/index.html | 4 ++-- .../configuration-guide/openstack/keystone/index.html | 4 ++-- .../configuration-guide/openstack/magnum/index.html | 4 ++-- .../configuration-guide/openstack/manila/index.html | 4 ++-- .../configuration-guide/openstack/neutron/index.html | 4 ++-- .../guides/configuration-guide/openstack/nova/index.html | 4 ++-- .../configuration-guide/openstack/octavia/index.html | 4 ++-- .../configuration-guide/openstack/placement/index.html | 4 ++-- .../configuration-guide/openstack/skyline/index.html | 4 ++-- docs/guides/configuration-guide/proxy/index.html | 4 ++-- docs/guides/configuration-guide/rook/index.html | 4 ++-- .../configuration-guide/services/chrony/index.html | 4 ++-- .../configuration-guide/services/docker/index.html | 4 ++-- docs/guides/configuration-guide/services/index.html | 4 ++-- .../guides/configuration-guide/services/tuned/index.html | 4 ++-- docs/guides/configuration-guide/validations/index.html | 4 ++-- docs/guides/deploy-guide/bootstrap/index.html | 4 ++-- .../deploy-guide/examples/cloud-in-a-box/index.html | 4 ++-- docs/guides/deploy-guide/examples/index.html | 4 ++-- docs/guides/deploy-guide/examples/testbed/index.html | 4 ++-- docs/guides/deploy-guide/index.html | 4 ++-- docs/guides/deploy-guide/manager/index.html | 4 ++-- docs/guides/deploy-guide/provisioning/index.html | 4 ++-- docs/guides/deploy-guide/seed/index.html | 4 ++-- docs/guides/deploy-guide/services/ceph/index.html | 4 ++-- docs/guides/deploy-guide/services/index.html | 4 ++-- .../deploy-guide/services/infrastructure/index.html | 4 ++-- docs/guides/deploy-guide/services/kubernetes/index.html | 4 ++-- .../deploy-guide/services/logging-monitoring/index.html | 4 ++-- docs/guides/deploy-guide/services/network/index.html | 4 ++-- docs/guides/deploy-guide/services/openstack/index.html | 4 ++-- docs/guides/deploy-guide/services/rook/index.html | 4 ++-- docs/guides/index.html | 4 ++-- docs/guides/operations-guide/ceph/index.html | 4 ++-- docs/guides/operations-guide/index.html | 4 ++-- docs/guides/operations-guide/infrastructure/index.html | 4 ++-- docs/guides/operations-guide/manager/apply/index.html | 4 ++-- docs/guides/operations-guide/manager/console/index.html | 4 ++-- docs/guides/operations-guide/manager/get/index.html | 4 ++-- docs/guides/operations-guide/manager/index.html | 4 ++-- docs/guides/operations-guide/manager/log/index.html | 4 ++-- docs/guides/operations-guide/manager/task/index.html | 4 ++-- docs/guides/operations-guide/network/index.html | 4 ++-- docs/guides/operations-guide/openstack/cinder/index.html | 4 ++-- docs/guides/operations-guide/openstack/index.html | 4 ++-- .../operations-guide/openstack/keystone/index.html | 4 ++-- .../guides/operations-guide/openstack/neutron/index.html | 4 ++-- docs/guides/operations-guide/openstack/nova/index.html | 4 ++-- .../guides/operations-guide/openstack/octavia/index.html | 4 ++-- .../openstack/tools/flavor-manager/index.html | 4 ++-- .../openstack/tools/image-manager/index.html | 4 ++-- .../openstack/tools/image-manager/update/index.html | 4 ++-- docs/guides/operations-guide/openstack/tools/index.html | 4 ++-- .../openstack/tools/openstack-health-monitor/index.html | 4 ++-- .../openstack/tools/project-manager/index.html | 4 ++-- .../openstack/tools/resource-manager/index.html | 4 ++-- .../openstack/tools/sandbox-manager/index.html | 4 ++-- .../openstack/tools/simple-stress/index.html | 4 ++-- docs/guides/operations-guide/rook/index.html | 4 ++-- docs/guides/other-guides/cloud-in-a-box/index.html | 4 ++-- .../running-on-a-virtual-machine/index.html | 4 ++-- docs/guides/other-guides/contributor-guide/index.html | 4 ++-- docs/guides/other-guides/developer-guide/index.html | 4 ++-- .../other-guides/developer-guide/releases/index.html | 4 ++-- .../other-guides/developer-guide/scripts/index.html | 4 ++-- docs/guides/other-guides/developer-guide/zuul/index.html | 4 ++-- docs/guides/other-guides/index.html | 4 ++-- docs/guides/other-guides/style-guide/index.html | 4 ++-- docs/guides/other-guides/testbed/index.html | 9 ++++++--- docs/guides/troubleshooting-guide/ceph/index.html | 4 ++-- docs/guides/troubleshooting-guide/index.html | 4 ++-- docs/guides/troubleshooting-guide/manager/index.html | 4 ++-- docs/guides/troubleshooting-guide/openstack/index.html | 4 ++-- docs/guides/upgrade-guide/ceph/index.html | 4 ++-- docs/guides/upgrade-guide/docker/index.html | 4 ++-- docs/guides/upgrade-guide/index.html | 4 ++-- docs/guides/upgrade-guide/infrastructure/index.html | 4 ++-- docs/guides/upgrade-guide/logging-monitoring/index.html | 4 ++-- docs/guides/upgrade-guide/manager/index.html | 4 ++-- docs/guides/upgrade-guide/network/index.html | 4 ++-- docs/guides/upgrade-guide/openstack/index.html | 4 ++-- docs/guides/user-guide/index.html | 4 ++-- docs/guides/user-guide/migration-vmware-esxi/index.html | 4 ++-- docs/guides/user-guide/openstack/index.html | 4 ++-- .../user-guide/openstack/openstackclient/index.html | 4 ++-- .../user-guide/openstack/security-groups/index.html | 4 ++-- .../user-guide/openstack/user-data-backups/index.html | 4 ++-- docs/index.html | 4 ++-- docs/references/cli/index.html | 4 ++-- docs/references/configuration/index.html | 4 ++-- docs/references/index.html | 4 ++-- docs/references/parameters/index.html | 4 ++-- docs/release-notes/index.html | 4 ++-- docs/release-notes/osism-7/index.html | 4 ++-- docs/release-notes/osism-8/index.html | 4 ++-- index.html | 4 ++-- jobs/index.html | 4 ++-- legals/index.html | 4 ++-- partners/index.html | 4 ++-- privacy/index.html | 4 ++-- search-index.json | 2 +- search/index.html | 4 ++-- support/index.html | 4 ++-- terms/index.html | 4 ++-- users/index.html | 4 ++-- 354 files changed, 702 insertions(+), 696 deletions(-) delete mode 100644 assets/js/6235e5b8.0d02a674.js create mode 100644 assets/js/6235e5b8.9481a2ce.js rename assets/js/{main.63bb4bfb.js => main.dcf27989.js} (99%) rename assets/js/{main.63bb4bfb.js.LICENSE.txt => main.dcf27989.js.LICENSE.txt} (100%) rename assets/js/{runtime~main.0142531b.js => runtime~main.560fcb88.js} (99%) create mode 100644 de/assets/js/6235e5b8.73767954.js delete mode 100644 de/assets/js/6235e5b8.fb918d72.js rename de/assets/js/{main.71696212.js => main.13b1e575.js} (99%) rename de/assets/js/{main.71696212.js.LICENSE.txt => main.13b1e575.js.LICENSE.txt} (100%) rename de/assets/js/{runtime~main.d2a0876e.js => runtime~main.fe74c436.js} (99%) diff --git a/404.html b/404.html index 8c282641c0..deda551c9a 100644 --- a/404.html +++ b/404.html @@ -5,8 +5,8 @@ Page Not Found | OSISM – Sovereign Cloud Infrastructure - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/about-us/index.html b/about-us/index.html index b2c502e454..2fbf9e62b0 100644 --- a/about-us/index.html +++ b/about-us/index.html @@ -5,8 +5,8 @@ About Us | OSISM – Sovereign Cloud Infrastructure - - + +
Skip to main content

About Us

diff --git a/assets/js/6235e5b8.0d02a674.js b/assets/js/6235e5b8.0d02a674.js deleted file mode 100644 index 1b8172bb16..0000000000 --- a/assets/js/6235e5b8.0d02a674.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkosism=self.webpackChunkosism||[]).push([[9705],{5675:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>p,frontMatter:()=>d,metadata:()=>c,toc:()=>h});var n=s(5893),l=s(1151),i=s(4866),r=s(5162);const d={sidebar_label:"Testbed Guide"},o="Testbed",c={id:"guides/other-guides/testbed",title:"Testbed",description:"With the OSISM Testbed, it is possible to run a full Sovereign Cloud Stack",source:"@site/docs/guides/other-guides/testbed.mdx",sourceDirName:"guides/other-guides",slug:"/guides/other-guides/testbed",permalink:"/docs/guides/other-guides/testbed",draft:!1,unlisted:!1,editUrl:"https://github.com/osism/osism.github.io/tree/main/docs/guides/other-guides/testbed.mdx",tags:[],version:"current",frontMatter:{sidebar_label:"Testbed Guide"},sidebar:"tutorialSidebar",previous:{title:"Style Guide",permalink:"/docs/guides/other-guides/style-guide"},next:{title:"References",permalink:"/docs/references/"}},a={},h=[{value:"Requirements",id:"requirements",level:2},{value:"Cloud access",id:"cloud-access",level:3},{value:"Cloud resources",id:"cloud-resources",level:3},{value:"Software",id:"software",level:3},{value:"Deployment",id:"deployment",level:2},{value:"Usage",id:"usage",level:2},{value:"Custom CA",id:"custom-ca",level:3},{value:"VPN access",id:"vpn-access",level:3},{value:"Wireguard",id:"wireguard",level:4},{value:"sshuttle",id:"sshuttle",level:4},{value:"Static entries in /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:"Add new OSD in Ceph",id:"add-new-osd-in-ceph",level:3},{value:"Ceph via Rook (technical preview)",id:"ceph-via-rook-technical-preview",level:3},{value:"Using testbed for OpenStack development",id:"using-testbed-for-openstack-development",level:2},{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",header:"header",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.header,{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"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"CNDS Cloud"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"artcodix"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"artcodix"})}),(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.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= # i.e. admin\nopenstack floating ip list\n"})}),"\n",(0,n.jsx)(t.h4,{id:"openstack-cli-operations-with-openid-connect-password",children:"OpenStack CLI operations with OpenID Connect password"}),"\n",(0,n.jsxs)(t.p,{children:["Using the OpenStack cli is also possible via OIDC, assuming you provisioned the user ",(0,n.jsx)(t.strong,{children:"alice"})," with password ",(0,n.jsx)(t.strong,{children:"password"}),",\nthen you can perform a simple ",(0,n.jsx)(t.code,{children:"project list"})," operation like this:"]}),"\n",(0,n.jsx)(t.p,{children:'See chapter "Usage the OpenStack CLI" for basic openstack usage.'}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"openstack \\\n --os-cacert /etc/ssl/certs/ca-certificates.crt \\\n --os-auth-url https://api.testbed.osism.xyz:5000/v3 \\\n --os-auth-type v3oidcpassword \\\n --os-client-id keystone \\\n --os-client-secret 0056b89c-030f-486b-a6ad-f0fa398fa4ad \\\n --os-username alice \\\n --os-password password \\\n --os-identity-provider keycloak \\\n --os-protocol openid \\\n --os-identity-api-version 3 \\\n --os-discovery-endpoint https://keycloak.testbed.osism.xyz/auth/realms/osism/.well-known/openid-configuration \\\nproject list\n"})}),"\n",(0,n.jsx)(t.h4,{id:"openstack-cli-token-issue-with-openid-connect",children:"OpenStack CLI token issue with OpenID Connect"}),"\n",(0,n.jsxs)(t.p,{children:["It is also possible to exchange your username/password to a token, for further use with the cli.\nThe ",(0,n.jsx)(t.code,{children:"token issue"})," subcommand returns an SQL table, in which the ",(0,n.jsx)(t.code,{children:"id"})," column's ",(0,n.jsx)(t.code,{children:"value"})," field contains the token:"]}),"\n",(0,n.jsx)(t.p,{children:'See chapter "Usage the OpenStack CLI" for basic openstack usage.'}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:'openstack \\\n --os-cacert /etc/ssl/certs/ca-certificates.crt \\\n --os-auth-url https://api.testbed.osism.xyz:5000/v3 \\\n --os-auth-type v3oidcpassword \\\n --os-client-id keystone \\\n --os-client-secret 0056b89c-030f-486b-a6ad-f0fa398fa4ad \\\n --os-username alice \\\n --os-password password \\\n --os-identity-provider keycloak \\\n --os-protocol openid \\\n --os-identity-api-version 3 \\\n --os-discovery-endpoint https://keycloak.testbed.osism.xyz/auth/realms/osism/.well-known/openid-configuration \\\n --os-openid-scope "openid profile email" \\\ntoken issue \\\n -c id\n -f value\n'})}),"\n",(0,n.jsx)(t.p,{children:"An example token is like:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"gAAAAABhC98gL8nsQWknro3JWDXWLFCG3CDr3Mi9OIlvVAZMjy2mNgYtlXv_0yAIy-\nnSlLAaLIGhht17-mwf8uclKgRuNVsYLSmgUpB163l89-ch2w2_OFe9zNSQNWf4qfd8\nCl7E7XvvUoFr1N8Gh09vaYLvRvYgCGV05xBUSs76qCHa0qElPUsk56s5ft4ALrSrzD\n4cEQRVb5PXNjywdZk9_gtJziz31A7sD4LPIy82O5N9NryDoDw\n"})}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"TODO: OpenStack CLI operations with token"}),"\n",(0,n.jsx)(t.li,{children:"TODO: OpenStack CLI token revoke"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"advanced-usage",children:"Advanced Usage"}),"\n",(0,n.jsx)(t.h3,{id:"external-api",children:"External API"}),"\n",(0,n.jsxs)(t.p,{children:["It is possible to provide the OpenStack APIs and the OpenStack Dashboard via the manager's public IP address.\nThis is not enabled by default, with the exception of the OTC profile. To provide the OpenStack APIs and the\nOpenStack dashboard via the public IP address of the manager, the following changes are necessary in the\n",(0,n.jsx)(t.code,{children:"terraform/environments/regiocloud.tfvars"})," file. If a cloud other than the REGIO.cloud is used, the profile\nof the other cloud is changed accordingly."]}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Add the customisation ",(0,n.jsx)(t.code,{children:"external_api"}),". This customisation makes sure that the required security group rules\nare created for the various OpenStack APIs and the OpenStack dashboard."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"# customisation:external_api\n"})}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Set parameter ",(0,n.jsx)(t.code,{children:"external_api"})," to ",(0,n.jsx)(t.code,{children:"true"}),". This makes sure that all necessary changes are made in the configuration\nrepository when the Manager service is deployed. It is correct that this is added as a comment."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"external_api = true\n"})}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["After the deployment of the Manager service and the OpenStack services, the OpenStack APIs and the OpenStack\ndashboard can be reached via a DNS name. The service ",(0,n.jsx)(t.a,{href:"https://traefik.me",children:"traefik.me"})," is used for the DNS record.\nRun the following two commands on the manager node to get the DNS record."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:'$ source /opt/manager-vars.sh\n$ echo "api-${MANAGER_PUBLIC_IP_ADDRESS//./-}.traefik.me"\napi-80-158-46-219.traefik.me\n'})}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"change-versions",children:"Change versions"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["Go to ",(0,n.jsx)(t.code,{children:"/opt/configuration"})," on ",(0,n.jsx)(t.code,{children:"testbed-manager"})]}),"\n",(0,n.jsxs)(t.li,{children:["Run ",(0,n.jsx)(t.code,{children:"./scripts/set-openstack-version.sh 2023.2"})," to set the OpenStack version to ",(0,n.jsx)(t.code,{children:"2023.2"})]}),"\n",(0,n.jsxs)(t.li,{children:["Run ",(0,n.jsx)(t.code,{children:"./scripts/set-ceph-version.sh reef"})," to set the Ceph version to ",(0,n.jsx)(t.code,{children:"reef"})]}),"\n",(0,n.jsxs)(t.li,{children:["Run ",(0,n.jsx)(t.code,{children:"osism update manager"})," to update the Manager service"]}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"deploy-services",children:"Deploy services"}),"\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:"Script"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/000-manager-service.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/001-helper-services.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/100-ceph-services-basic.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"alternative to ceph"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/100-rook-services-basic.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/200-infrastructure-services-basic.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/210-infrastructure-services-extended.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/300-openstack-services-basic.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/310-openstack-services-extended.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/320-openstack-services-baremetal.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/330-openstack-services-additional.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/400-monitoring-services.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"upgrade-services",children:"Upgrade services"}),"\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:"Script"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/upgrade/100-ceph-services.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/upgrade/100-rook-services.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"alternative to ceph"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/upgrade/200-infrastructure-services-basic.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/upgrade/300-openstack-services-basic.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/upgrade/310-openstack-services-extended.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/upgrade/320-openstack-services-baremetal.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/upgrade/330-openstack-services-additional.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"add-new-osd-in-ceph",children:"Add new OSD in Ceph"}),"\n",(0,n.jsx)(t.p,{children:"In the testbed, three volumes per node are provided for use by Ceph by default. Two of\nthese devices are used as OSDs during the initial deployment. The third device is intended\nfor testing the addition of a further OSD to the Ceph cluster."}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["Add ",(0,n.jsx)(t.code,{children:"sdd"})," to ",(0,n.jsx)(t.code,{children:"ceph_osd_devices"})," in ",(0,n.jsx)(t.code,{children:"/opt/configuration/inventory/host_vars/testbed-node-0.testbed.osism.xyz/ceph-lvm-configuration.yml"}),".\nThe following content is an example, the IDs look different everywhere. Do not copy 1:1\nbut only add ",(0,n.jsx)(t.code,{children:"sdd"})," to the file."]}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:"---\n#\n# This is Ceph LVM configuration for testbed-node-0.testbed.osism.xyz\n# generated by ceph-configure-lvm-volumes playbook.\n#\nceph_osd_devices:\n sdb:\n osd_lvm_uuid: 95a9a2e0-b23f-55b2-a04f-e02ddfc0e82a\n sdc:\n osd_lvm_uuid: 29899765-42bf-557b-ae9c-5c7c984b2243\n sdd:\nlvm_volumes:\n- data: osd-block-95a9a2e0-b23f-55b2-a04f-e02ddfc0e82a\n data_vg: ceph-95a9a2e0-b23f-55b2-a04f-e02ddfc0e82a\n- data: osd-block-29899765-42bf-557b-ae9c-5c7c984b2243\n data_vg: ceph-29899765-42bf-557b-ae9c-5c7c984b2243\n"})}),"\n",(0,n.jsxs)(t.ol,{start:"2",children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Run ",(0,n.jsx)(t.code,{children:"osism apply ceph-configure-lvm-volumes -l testbed-node-0.testbed.osism.xyz"})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Run ",(0,n.jsx)(t.code,{children:"cp /tmp/testbed-node-0.testbed.osism.xyz-ceph-lvm-configuration.yml /opt/configuration/inventory/host_vars/testbed-node-0.testbed.osism.xyz/ceph-lvm-configuration.yml"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Run ",(0,n.jsx)(t.code,{children:"osism reconciler sync"})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Run ",(0,n.jsx)(t.code,{children:"osism apply ceph-create-lvm-devices -l testbed-node-0.testbed.osism.xyz"})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Run ",(0,n.jsx)(t.code,{children:"osism apply ceph-osds -l testbed-node-0.testbed.osism.xyz -e ceph_handler_osds_restart=false"})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Check the OSD tree"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"$ ceph osd tree\nID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF\n-1 0.13640 root default\n-3 0.05846 host testbed-node-0\n 2 hdd 0.01949 osd.2 up 1.00000 1.00000\n 4 hdd 0.01949 osd.4 up 1.00000 1.00000\n 6 hdd 0.01949 osd.6 up 1.00000 1.00000\n-5 0.03897 host testbed-node-1\n 0 hdd 0.01949 osd.0 up 1.00000 1.00000\n 5 hdd 0.01949 osd.5 up 1.00000 1.00000\n-7 0.03897 host testbed-node-2\n 1 hdd 0.01949 osd.1 up 1.00000 1.00000\n 3 hdd 0.01949 osd.3 up 1.00000 1.00000\n"})}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"ceph-via-rook-technical-preview",children:"Ceph via Rook (technical preview)"}),"\n",(0,n.jsxs)(t.p,{children:["Please have a look at ",(0,n.jsx)(t.a,{href:"/docs/guides/deploy-guide/services/rook",children:"Deploy Guide - Services - Rook"})," and ",(0,n.jsx)(t.a,{href:"/docs/guides/configuration-guide/rook",children:"Configuration Guide - Rook"})," for details on how to configure Rook."]}),"\n",(0,n.jsx)(t.p,{children:"To deploy this in the testbed, you can use an environment variable in your make target."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"make CEPH_STACK=rook manager\nmake CEPH_STACK=rook ceph\n"})}),"\n",(0,n.jsxs)(t.p,{children:["This will make sure ",(0,n.jsx)(t.code,{children:"/opt/manager-vars.sh"})," gets ",(0,n.jsx)(t.code,{children:"CEPH_STACK=rook"})," set which is later being used by:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy-services.sh\n/opt/configuration/scripts/deploy-ceph-services.sh\n/opt/configuration/scripts/upgrade/100-rook-services.sh\n"})}),"\n",(0,n.jsx)(t.h2,{id:"using-testbed-for-openstack-development",children:"Using testbed for OpenStack development"}),"\n",(0,n.jsxs)(t.p,{children:["Testbed may be used for doing development on OpenStack services through ",(0,n.jsx)(t.a,{href:"https://docs.openstack.org/kolla-ansible/latest/contributor/kolla-for-openstack-development.html",children:(0,n.jsx)(t.code,{children:"kolla_dev_mode"})}),".\n",(0,n.jsx)(t.code,{children:"kolla_dev_mode"})," may be activated for all supported service by adding"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"kolla_dev_mode: true\n"})}),"\n",(0,n.jsxs)(t.p,{children:["to ",(0,n.jsx)(t.code,{children:"environments/kolla/configuration.yml"}),". This will check out the ",(0,n.jsx)(t.code,{children:"git"})," repositories of all supported and enabled OpenStack services under ",(0,n.jsx)(t.code,{children:"/opt/stack"})," and bind mount them into the appropriate containers.\nSince this will fetch a lot of repositories it is advisable to enable this only selectively for the services you are going to work on. You can do so by adding a boolean variable to ",(0,n.jsx)(t.code,{children:"environments/kolla/configuration.yml"})," consisting of the service name and the suffix ",(0,n.jsx)(t.code,{children:"_dev_mode"}),", e.g.:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"cinder_dev_mode: true\n"})}),"\n",(0,n.jsxs)(t.p,{children:["You may customise the used ",(0,n.jsx)(t.code,{children:"git"})," repository by adding ",(0,n.jsx)(t.code,{children:"kolla_repos_git"})," to ",(0,n.jsx)(t.code,{children:"environments/kolla/configuration.yml"})," to specify a common root for the repositories of all services, which will be completed by the service's name, e.g.:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:'kolla_repos_git: "https://github.com/openstack"\n'})}),"\n",(0,n.jsxs)(t.p,{children:["will pull services from their ",(0,n.jsx)(t.code,{children:"github"})," mirror. E.g. pull nova from ",(0,n.jsx)(t.a,{href:"https://github.com/openstack/nova",children:"https://github.com/openstack/nova"}),"\nThe complete repository of a single service may be changed by adding a variable consisting of the service name and the suffix ",(0,n.jsx)(t.code,{children:"_git_repository"}),", e.g."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:'cinder_git_repository: "https://github.com/myorg/my_custom_cinder_fork"\n'})}),"\n",(0,n.jsxs)(t.p,{children:["You may Specify the ",(0,n.jsx)(t.code,{children:"git"})," reference globally by setting"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"kolla_source_version: my_feature_branch\n"})}),"\n",(0,n.jsxs)(t.p,{children:["in ",(0,n.jsx)(t.code,{children:"environments/kolla/configuration.yml"})," or for specific services via service name and suffix ",(0,n.jsx)(t.code,{children:"_source_version"}),", e.g."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"cinder_source_version: my_cinder_feature\n"})}),"\n",(0,n.jsxs)(t.p,{children:["In order to update the ",(0,n.jsx)(t.code,{children:"git"})," repositories on ",(0,n.jsx)(t.code,{children:"kolla-ansible"})," deployments set either"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"kolla_dev_repos_pull: true\n"})}),"\n",(0,n.jsx)(t.p,{children:"or, e.g."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"cinder_dev_repos_pull: true\n"})}),"\n",(0,n.jsxs)(t.p,{children:["in ",(0,n.jsx)(t.code,{children:"environments/kolla/configuration.yml"})," to set the setting for all repositories or a service specific one."]}),"\n",(0,n.jsx)(t.p,{children:"Thus, as an example for a development workflow:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Create a ",(0,n.jsx)(t.code,{children:"git"})," mirror of the OpenStack service you want to work on"]}),"\n",(0,n.jsxs)(t.li,{children:["In ",(0,n.jsx)(t.code,{children:"environments/kolla/configuration.yml"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Set the corresponding ",(0,n.jsx)(t.code,{children:"_dev_mode"})," variable to ",(0,n.jsx)(t.code,{children:"true"})]}),"\n",(0,n.jsxs)(t.li,{children:["Set the corresponding ",(0,n.jsx)(t.code,{children:"_git_repository"})," variable to your development mirror created above"]}),"\n",(0,n.jsxs)(t.li,{children:["Set the corresponding ",(0,n.jsx)(t.code,{children:"_source_version"})," variable to a branch name you intend to push your changes to"]}),"\n",(0,n.jsxs)(t.li,{children:["Set the corresponding ",(0,n.jsx)(t.code,{children:"_dev_repos_pull"})," variable to ",(0,n.jsx)(t.code,{children:"true"})]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.li,{children:"Commit your changes and push them to the specified branch in the specified mirror"}),"\n",(0,n.jsxs)(t.li,{children:["Run ",(0,n.jsx)(t.code,{children:"osism apply "})," on the manager to checkout the code on every testbed node"]}),"\n",(0,n.jsx)(t.li,{children:"Restart the service containers to actually pick up the new code"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,n.jsx)(t.h3,{id:"ansible-errors",children:"Ansible errors"}),"\n",(0,n.jsxs)(t.p,{children:["Ansible errors that have something to do with undefined variables (e.g. ",(0,n.jsx)(t.code,{children:"AnsibleUndefined"}),") are most likely due to cached\nfacts that are no longer valid. The facts can be updated by running ",(0,n.jsx)(t.code,{children:"osism apply facts"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"unsupported-locale-setting",children:"Unsupported locale setting"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"$ make prepare\nansible-playbook -i localhost, ansible/check-local-versions.yml\nERROR: Ansible could not initialize the preferred locale: unsupported locale setting\nmake: *** [prepare] Error 1\n"})}),"\n",(0,n.jsxs)(t.p,{children:["To solve the problem you have to modify the ",(0,n.jsx)(t.code,{children:"Makefile"}),". Change the 1st line as follows."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"export LC_ALL=en_US.UTF-8\n"})}),"\n",(0,n.jsxs)(t.p,{children:["To find out the locale used on the system ",(0,n.jsx)(t.code,{children:"printenv"})," can be used."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:'$ printenv | grep -i lang|locale\nLANG="en_US.UTF-8"\nLC_COLLATE="en_US.UTF-8"\nLC_CTYPE="UTF-8"\nLC_MESSAGES="en_US.UTF-8"\nLC_MONETARY="en_US.UTF-8"\nLC_NUMERIC="en_US.UTF-8"\nLC_TIME="en_US.UTF-8"\nLC_ALL=\n'})}),"\n",(0,n.jsx)(t.h2,{id:"appendix",children:"Appendix"}),"\n",(0,n.jsx)(t.h3,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsx)(t.p,{children:"This section describes how to configure and customise the OSISM Testbed."}),"\n",(0,n.jsx)(t.h4,{id:"variables",children:"Variables"}),"\n",(0,n.jsxs)(t.p,{children:["The defaults for the OpenTofu variables are intended for ",(0,n.jsx)(t.a,{href:"https://regio.digital",children:"REGIO.cloud"}),"."]}),"\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:"Variable"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Default"}),(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:"availability_zone"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"nova"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"ceph_version"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"quincy"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"cloud_provider"}),(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:"configuration_version"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"main"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"deploy_monitoring"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"false"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"dns_nameservers"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:'["8.8.8.8", "9.9.9.9"]'})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"enable_config_drive"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"true"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"external_api"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"false"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"flavor_manager"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"SCS-4V-16-50"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"flavor_node"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"SCS-8V-32-50"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"image"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"Ubuntu 22.04"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Only Ubuntu 22.04 is currently supported"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"image_node"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"Ubuntu 22.04"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Only Ubuntu 22.04 is currently supported"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"keypair"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"testbed"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"manager_version"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"latest"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"network_availability_zone"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"nova"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"number_of_nodes"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"3"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"number_of_volumes"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"3"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"openstack_version"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"2023.2"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"prefix"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"testbed"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"public"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"external"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"refstack"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"false"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"volume_availability_zone"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"nova"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"volume_size_base"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"30"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"volume_size_storage"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"10"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"volume_type"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"__DEFAULT__"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]})]})]}),"\n",(0,n.jsx)(t.h4,{id:"overrides",children:"Overrides"}),"\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:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"manager_boot_from_image"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"manager_boot_from_volume"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"neutron_availability_zone_hints_network"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"neutron_availability_zone_hints_router"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"neutron_router_enable_snat"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"nodes_boot_from_image"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"nodes_boot_from_volume"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"nodes_use_ephemeral_storage"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]})]})]}),"\n",(0,n.jsx)(t.h4,{id:"customisations",children:"Customisations"}),"\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:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"access_floatingip"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"access_ipv4"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"access_ipv6"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"default"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"external_api"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"neutron_floatingip"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"notes",children:"Notes"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"The configuration is intentionally kept quite static. Please create no PRs to make the configuration more flexible/dynamic."}),"\n",(0,n.jsx)(t.li,{children:"The OSISM documentation uses hostnames, examples, addresses etc. from OSISM Testbed."}),"\n",(0,n.jsxs)(t.li,{children:["The third volume (",(0,n.jsx)(t.code,{children:"/dev/sdd"}),") is not enabled for Ceph by default. This is to test the scaling of Ceph."]}),"\n",(0,n.jsx)(t.li,{children:"The manager is used as pull through cache for Docker images and Ubuntu packages. This reduces the amount of traffic consumed."}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"supported-releases",children:"Supported releases"}),"\n",(0,n.jsx)(t.p,{children:"The following stable Ceph and OpenStack releases are supported."}),"\n",(0,n.jsxs)(t.p,{children:["The deployment of Ceph is based on ",(0,n.jsx)(t.a,{href:"https://docs.ceph.com/ceph-ansible/",children:"ceph-ansible"}),"."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Ceph Quincy (",(0,n.jsx)(t.strong,{children:"default"}),")"]}),"\n",(0,n.jsx)(t.li,{children:"Ceph Reef"}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["The deployment of OpenStack is based on ",(0,n.jsx)(t.a,{href:"https://docs.openstack.org/kolla-ansible/latest/",children:"kolla-ansible"}),"."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"OpenStack 2023.1"}),"\n",(0,n.jsxs)(t.li,{children:["OpenStack 2023.2 (",(0,n.jsx)(t.strong,{children:"default"}),")"]}),"\n",(0,n.jsx)(t.li,{children:"OpenStack 2024.1"}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["The deployment of Kubernetes is based on ",(0,n.jsx)(t.a,{href:"https://github.com/techno-tim/k3s-ansible",children:"k3s-ansible"}),"."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Kubernetes v1.29 (",(0,n.jsx)(t.strong,{children:"default"}),")"]}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"included-services",children:"Included services"}),"\n",(0,n.jsx)(t.p,{children:"The following services can currently be used with the OSISM Testbed without further adjustments."}),"\n",(0,n.jsx)(t.h4,{id:"infrastructure",children:"Infrastructure"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Ceph"}),"\n",(0,n.jsx)(t.li,{children:"Cluster API Management Cluster"}),"\n",(0,n.jsx)(t.li,{children:"Fluentd"}),"\n",(0,n.jsx)(t.li,{children:"Gnocchi"}),"\n",(0,n.jsx)(t.li,{children:"Grafana"}),"\n",(0,n.jsx)(t.li,{children:"Haproxy"}),"\n",(0,n.jsx)(t.li,{children:"Influxdb"}),"\n",(0,n.jsx)(t.li,{children:"Keepalived"}),"\n",(0,n.jsx)(t.li,{children:"Keycloak"}),"\n",(0,n.jsx)(t.li,{children:"Kubernetes"}),"\n",(0,n.jsx)(t.li,{children:"Mariadb"}),"\n",(0,n.jsx)(t.li,{children:"Memcached"}),"\n",(0,n.jsx)(t.li,{children:"Netbox"}),"\n",(0,n.jsx)(t.li,{children:"Netdata"}),"\n",(0,n.jsx)(t.li,{children:"Opensearch"}),"\n",(0,n.jsx)(t.li,{children:"Openvswitch"}),"\n",(0,n.jsx)(t.li,{children:"Patchman"}),"\n",(0,n.jsx)(t.li,{children:"Prometheus exporters"}),"\n",(0,n.jsx)(t.li,{children:"Rabbitmq"}),"\n",(0,n.jsx)(t.li,{children:"Redis"}),"\n"]}),"\n",(0,n.jsx)(t.h4,{id:"openstack",children:"OpenStack"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Barbican"}),"\n",(0,n.jsx)(t.li,{children:"Ceilometer"}),"\n",(0,n.jsx)(t.li,{children:"Cinder"}),"\n",(0,n.jsx)(t.li,{children:"Designate"}),"\n",(0,n.jsx)(t.li,{children:"Glance"}),"\n",(0,n.jsx)(t.li,{children:"Heat"}),"\n",(0,n.jsx)(t.li,{children:"Horizon"}),"\n",(0,n.jsx)(t.li,{children:"Ironic"}),"\n",(0,n.jsx)(t.li,{children:"Keystone"}),"\n",(0,n.jsx)(t.li,{children:"Magnum"}),"\n",(0,n.jsx)(t.li,{children:"Manila"}),"\n",(0,n.jsx)(t.li,{children:"Neutron"}),"\n",(0,n.jsx)(t.li,{children:"Nova (with Libvirt/KVM)"}),"\n",(0,n.jsx)(t.li,{children:"Octavia"}),"\n",(0,n.jsx)(t.li,{children:"Senlin"}),"\n",(0,n.jsx)(t.li,{children:"Skyline"}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"makefile-reference",children:"Makefile reference"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"$ make help\n\nUsage:\n make \n help Display this help.\n clean Destroy infrastructure with OpenTofu.\n wipe-local-install Wipe the software dependencies in `venv`.\n create Create required infrastructure with OpenTofu.\n login Log in on the manager.\n vpn-wireguard Establish a wireguard vpn tunnel.\n vpn-sshuttle Establish a sshuttle vpn tunnel.\n bootstrap Bootstrap everything.\n manager Deploy only the manager service.\n identity Deploy only identity services.\n ceph Deploy only ceph services.\n deploy Deploy everything and then check it.\n prepare Run local preperations.\n deps Install software preconditions to `venv`.\n\n$ make \n"})}),"\n",(0,n.jsx)(t.h3,{id:"ci-jobs",children:"CI jobs"}),"\n",(0,n.jsxs)(t.p,{children:["You can inspect the ",(0,n.jsx)(t.a,{href:"https://zuul.services.betacloud.xyz/t/osism/builds?project=osism%2Ftestbed&skip=0",children:"results of the daily zuul jobs"}),"."]}),"\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:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"testbed-deploy"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"testbed-deploy-ceph"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"testbed-deploy-stable"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"testbed-update-stable"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"testbed-upgrade"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"testbed-upgrade-ceph"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"testbed-upgrade-stable"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]})]})]})]})}function p(e={}){const{wrapper:t}={...(0,l.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(x,{...e})}):x(e)}},5162:(e,t,s)=>{s.d(t,{Z:()=>r});s(7294);var n=s(6905);const l={tabItem:"tabItem_Ymn6"};var i=s(5893);function r(e){let{children:t,hidden:s,className:r}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,n.Z)(l.tabItem,r),hidden:s,children:t})}},4866:(e,t,s)=>{s.d(t,{Z:()=>A});var n=s(7294),l=s(6905),i=s(2466),r=s(6550),d=s(469),o=s(1980),c=s(7392),a=s(812);function h(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function x(e){const{values:t,children:s}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return h(e).map((e=>{let{props:{value:t,label:s,attributes:n,default:l}}=e;return{value:t,label:s,attributes:n,default:l}}))}(s);return function(e){const t=(0,c.lx)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,s])}function p(e){let{value:t,tabValues:s}=e;return s.some((e=>e.value===t))}function u(e){let{queryString:t=!1,groupId:s}=e;const l=(0,r.k6)(),i=function(e){let{queryString:t=!1,groupId:s}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!s)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return s??null}({queryString:t,groupId:s});return[(0,o._X)(i),(0,n.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(l.location.search);t.set(i,e),l.replace({...l.location,search:t.toString()})}),[i,l])]}function j(e){const{defaultValue:t,queryString:s=!1,groupId:l}=e,i=x(e),[r,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:s}=e;if(0===s.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:s}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${s.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=s.find((e=>e.default))??s[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:i}))),[c,h]=u({queryString:s,groupId:l}),[j,f]=function(e){let{groupId:t}=e;const s=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,i]=(0,a.Nk)(s);return[l,(0,n.useCallback)((e=>{s&&i.set(e)}),[s,i])]}({groupId:l}),g=(()=>{const e=c??j;return p({value:e,tabValues:i})?e:null})();(0,d.Z)((()=>{g&&o(g)}),[g]);return{selectedValue:r,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);o(e),h(e),f(e)}),[h,f,i]),tabValues:i}}var f=s(2389);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var y=s(5893);function m(e){let{className:t,block:s,selectedValue:n,selectValue:r,tabValues:d}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.o5)(),a=e=>{const t=e.currentTarget,s=o.indexOf(t),l=d[s].value;l!==n&&(c(t),r(l))},h=e=>{let t=null;switch(e.key){case"Enter":a(e);break;case"ArrowRight":{const s=o.indexOf(e.currentTarget)+1;t=o[s]??o[0];break}case"ArrowLeft":{const s=o.indexOf(e.currentTarget)-1;t=o[s]??o[o.length-1];break}}t?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":s},t),children:d.map((e=>{let{value:t,label:s,attributes:i}=e;return(0,y.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>o.push(e),onKeyDown:h,onClick:a,...i,className:(0,l.Z)("tabs__item",g.tabItem,i?.className,{"tabs__item--active":n===t}),children:s??t},t)}))})}function b(e){let{lazy:t,children:s,selectedValue:i}=e;const r=(Array.isArray(s)?s:[s]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===i));return e?(0,n.cloneElement)(e,{className:(0,l.Z)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==i})))})}function v(e){const t=j(e);return(0,y.jsxs)("div",{className:(0,l.Z)("tabs-container",g.tabList),children:[(0,y.jsx)(m,{...t,...e}),(0,y.jsx)(b,{...t,...e})]})}function A(e){const t=(0,f.Z)();return(0,y.jsx)(v,{...e,children:h(e.children)},String(t))}},1151:(e,t,s)=>{s.d(t,{Z:()=>d,a:()=>r});var n=s(7294);const l={},i=n.createContext(l);function r(e){const t=n.useContext(i);return n.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(l):e.components||l:r(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6235e5b8.9481a2ce.js b/assets/js/6235e5b8.9481a2ce.js new file mode 100644 index 0000000000..b072f7b75a --- /dev/null +++ b/assets/js/6235e5b8.9481a2ce.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkosism=self.webpackChunkosism||[]).push([[9705],{5675:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>p,frontMatter:()=>d,metadata:()=>c,toc:()=>h});var n=s(5893),l=s(1151),i=s(4866),r=s(5162);const d={sidebar_label:"Testbed Guide"},o="Testbed",c={id:"guides/other-guides/testbed",title:"Testbed",description:"With the OSISM Testbed, it is possible to run a full Sovereign Cloud Stack",source:"@site/docs/guides/other-guides/testbed.mdx",sourceDirName:"guides/other-guides",slug:"/guides/other-guides/testbed",permalink:"/docs/guides/other-guides/testbed",draft:!1,unlisted:!1,editUrl:"https://github.com/osism/osism.github.io/tree/main/docs/guides/other-guides/testbed.mdx",tags:[],version:"current",frontMatter:{sidebar_label:"Testbed Guide"},sidebar:"tutorialSidebar",previous:{title:"Style Guide",permalink:"/docs/guides/other-guides/style-guide"},next:{title:"References",permalink:"/docs/references/"}},a={},h=[{value:"Requirements",id:"requirements",level:2},{value:"Cloud access",id:"cloud-access",level:3},{value:"Cloud resources",id:"cloud-resources",level:3},{value:"Software",id:"software",level:3},{value:"Deployment",id:"deployment",level:2},{value:"Usage",id:"usage",level:2},{value:"Custom CA",id:"custom-ca",level:3},{value:"VPN access",id:"vpn-access",level:3},{value:"Wireguard",id:"wireguard",level:4},{value:"sshuttle",id:"sshuttle",level:4},{value:"Static entries in /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:"Add new OSD in Ceph",id:"add-new-osd-in-ceph",level:3},{value:"Ceph via Rook (technical preview)",id:"ceph-via-rook-technical-preview",level:3},{value:"Using testbed for OpenStack development",id:"using-testbed-for-openstack-development",level:2},{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",header:"header",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.header,{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"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"CNDS Cloud"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"artcodix"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"artcodix"})}),(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=8.0.1 manager\n"})})})]}),"\n",(0,n.jsxs)(t.p,{children:["Replace the version with the version you prefer.\nCheck the ",(0,n.jsx)(t.a,{href:"https://osism.tech/docs/release-notes/",children:"OSISM release notes"}),"\nto find out what's available."]}),"\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.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= # i.e. admin\nopenstack floating ip list\n"})}),"\n",(0,n.jsx)(t.h4,{id:"openstack-cli-operations-with-openid-connect-password",children:"OpenStack CLI operations with OpenID Connect password"}),"\n",(0,n.jsxs)(t.p,{children:["Using the OpenStack cli is also possible via OIDC, assuming you provisioned the user ",(0,n.jsx)(t.strong,{children:"alice"})," with password ",(0,n.jsx)(t.strong,{children:"password"}),",\nthen you can perform a simple ",(0,n.jsx)(t.code,{children:"project list"})," operation like this:"]}),"\n",(0,n.jsx)(t.p,{children:'See chapter "Usage the OpenStack CLI" for basic openstack usage.'}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"openstack \\\n --os-cacert /etc/ssl/certs/ca-certificates.crt \\\n --os-auth-url https://api.testbed.osism.xyz:5000/v3 \\\n --os-auth-type v3oidcpassword \\\n --os-client-id keystone \\\n --os-client-secret 0056b89c-030f-486b-a6ad-f0fa398fa4ad \\\n --os-username alice \\\n --os-password password \\\n --os-identity-provider keycloak \\\n --os-protocol openid \\\n --os-identity-api-version 3 \\\n --os-discovery-endpoint https://keycloak.testbed.osism.xyz/auth/realms/osism/.well-known/openid-configuration \\\nproject list\n"})}),"\n",(0,n.jsx)(t.h4,{id:"openstack-cli-token-issue-with-openid-connect",children:"OpenStack CLI token issue with OpenID Connect"}),"\n",(0,n.jsxs)(t.p,{children:["It is also possible to exchange your username/password to a token, for further use with the cli.\nThe ",(0,n.jsx)(t.code,{children:"token issue"})," subcommand returns an SQL table, in which the ",(0,n.jsx)(t.code,{children:"id"})," column's ",(0,n.jsx)(t.code,{children:"value"})," field contains the token:"]}),"\n",(0,n.jsx)(t.p,{children:'See chapter "Usage the OpenStack CLI" for basic openstack usage.'}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:'openstack \\\n --os-cacert /etc/ssl/certs/ca-certificates.crt \\\n --os-auth-url https://api.testbed.osism.xyz:5000/v3 \\\n --os-auth-type v3oidcpassword \\\n --os-client-id keystone \\\n --os-client-secret 0056b89c-030f-486b-a6ad-f0fa398fa4ad \\\n --os-username alice \\\n --os-password password \\\n --os-identity-provider keycloak \\\n --os-protocol openid \\\n --os-identity-api-version 3 \\\n --os-discovery-endpoint https://keycloak.testbed.osism.xyz/auth/realms/osism/.well-known/openid-configuration \\\n --os-openid-scope "openid profile email" \\\ntoken issue \\\n -c id\n -f value\n'})}),"\n",(0,n.jsx)(t.p,{children:"An example token is like:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"gAAAAABhC98gL8nsQWknro3JWDXWLFCG3CDr3Mi9OIlvVAZMjy2mNgYtlXv_0yAIy-\nnSlLAaLIGhht17-mwf8uclKgRuNVsYLSmgUpB163l89-ch2w2_OFe9zNSQNWf4qfd8\nCl7E7XvvUoFr1N8Gh09vaYLvRvYgCGV05xBUSs76qCHa0qElPUsk56s5ft4ALrSrzD\n4cEQRVb5PXNjywdZk9_gtJziz31A7sD4LPIy82O5N9NryDoDw\n"})}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"TODO: OpenStack CLI operations with token"}),"\n",(0,n.jsx)(t.li,{children:"TODO: OpenStack CLI token revoke"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"advanced-usage",children:"Advanced Usage"}),"\n",(0,n.jsx)(t.h3,{id:"external-api",children:"External API"}),"\n",(0,n.jsxs)(t.p,{children:["It is possible to provide the OpenStack APIs and the OpenStack Dashboard via the manager's public IP address.\nThis is not enabled by default, with the exception of the OTC profile. To provide the OpenStack APIs and the\nOpenStack dashboard via the public IP address of the manager, the following changes are necessary in the\n",(0,n.jsx)(t.code,{children:"terraform/environments/regiocloud.tfvars"})," file. If a cloud other than the REGIO.cloud is used, the profile\nof the other cloud is changed accordingly."]}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Add the customisation ",(0,n.jsx)(t.code,{children:"external_api"}),". This customisation makes sure that the required security group rules\nare created for the various OpenStack APIs and the OpenStack dashboard."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"# customisation:external_api\n"})}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Set parameter ",(0,n.jsx)(t.code,{children:"external_api"})," to ",(0,n.jsx)(t.code,{children:"true"}),". This makes sure that all necessary changes are made in the configuration\nrepository when the Manager service is deployed. It is correct that this is added as a comment."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"external_api = true\n"})}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["After the deployment of the Manager service and the OpenStack services, the OpenStack APIs and the OpenStack\ndashboard can be reached via a DNS name. The service ",(0,n.jsx)(t.a,{href:"https://traefik.me",children:"traefik.me"})," is used for the DNS record.\nRun the following two commands on the manager node to get the DNS record."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:'$ source /opt/manager-vars.sh\n$ echo "api-${MANAGER_PUBLIC_IP_ADDRESS//./-}.traefik.me"\napi-80-158-46-219.traefik.me\n'})}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"change-versions",children:"Change versions"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["Go to ",(0,n.jsx)(t.code,{children:"/opt/configuration"})," on ",(0,n.jsx)(t.code,{children:"testbed-manager"})]}),"\n",(0,n.jsxs)(t.li,{children:["Run ",(0,n.jsx)(t.code,{children:"./scripts/set-openstack-version.sh 2023.2"})," to set the OpenStack version to ",(0,n.jsx)(t.code,{children:"2023.2"})]}),"\n",(0,n.jsxs)(t.li,{children:["Run ",(0,n.jsx)(t.code,{children:"./scripts/set-ceph-version.sh reef"})," to set the Ceph version to ",(0,n.jsx)(t.code,{children:"reef"})]}),"\n",(0,n.jsxs)(t.li,{children:["Run ",(0,n.jsx)(t.code,{children:"osism update manager"})," to update the Manager service"]}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"deploy-services",children:"Deploy services"}),"\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:"Script"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/000-manager-service.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/001-helper-services.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/100-ceph-services-basic.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"alternative to ceph"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/100-rook-services-basic.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/200-infrastructure-services-basic.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/210-infrastructure-services-extended.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/300-openstack-services-basic.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/310-openstack-services-extended.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/320-openstack-services-baremetal.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/330-openstack-services-additional.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy/400-monitoring-services.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"upgrade-services",children:"Upgrade services"}),"\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:"Script"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/upgrade/100-ceph-services.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/upgrade/100-rook-services.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"alternative to ceph"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/upgrade/200-infrastructure-services-basic.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/upgrade/300-openstack-services-basic.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/upgrade/310-openstack-services-extended.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/upgrade/320-openstack-services-baremetal.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/upgrade/330-openstack-services-additional.sh"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"add-new-osd-in-ceph",children:"Add new OSD in Ceph"}),"\n",(0,n.jsx)(t.p,{children:"In the testbed, three volumes per node are provided for use by Ceph by default. Two of\nthese devices are used as OSDs during the initial deployment. The third device is intended\nfor testing the addition of a further OSD to the Ceph cluster."}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["Add ",(0,n.jsx)(t.code,{children:"sdd"})," to ",(0,n.jsx)(t.code,{children:"ceph_osd_devices"})," in ",(0,n.jsx)(t.code,{children:"/opt/configuration/inventory/host_vars/testbed-node-0.testbed.osism.xyz/ceph-lvm-configuration.yml"}),".\nThe following content is an example, the IDs look different everywhere. Do not copy 1:1\nbut only add ",(0,n.jsx)(t.code,{children:"sdd"})," to the file."]}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:"---\n#\n# This is Ceph LVM configuration for testbed-node-0.testbed.osism.xyz\n# generated by ceph-configure-lvm-volumes playbook.\n#\nceph_osd_devices:\n sdb:\n osd_lvm_uuid: 95a9a2e0-b23f-55b2-a04f-e02ddfc0e82a\n sdc:\n osd_lvm_uuid: 29899765-42bf-557b-ae9c-5c7c984b2243\n sdd:\nlvm_volumes:\n- data: osd-block-95a9a2e0-b23f-55b2-a04f-e02ddfc0e82a\n data_vg: ceph-95a9a2e0-b23f-55b2-a04f-e02ddfc0e82a\n- data: osd-block-29899765-42bf-557b-ae9c-5c7c984b2243\n data_vg: ceph-29899765-42bf-557b-ae9c-5c7c984b2243\n"})}),"\n",(0,n.jsxs)(t.ol,{start:"2",children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Run ",(0,n.jsx)(t.code,{children:"osism apply ceph-configure-lvm-volumes -l testbed-node-0.testbed.osism.xyz"})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Run ",(0,n.jsx)(t.code,{children:"cp /tmp/testbed-node-0.testbed.osism.xyz-ceph-lvm-configuration.yml /opt/configuration/inventory/host_vars/testbed-node-0.testbed.osism.xyz/ceph-lvm-configuration.yml"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Run ",(0,n.jsx)(t.code,{children:"osism reconciler sync"})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Run ",(0,n.jsx)(t.code,{children:"osism apply ceph-create-lvm-devices -l testbed-node-0.testbed.osism.xyz"})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Run ",(0,n.jsx)(t.code,{children:"osism apply ceph-osds -l testbed-node-0.testbed.osism.xyz -e ceph_handler_osds_restart=false"})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Check the OSD tree"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"$ ceph osd tree\nID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF\n-1 0.13640 root default\n-3 0.05846 host testbed-node-0\n 2 hdd 0.01949 osd.2 up 1.00000 1.00000\n 4 hdd 0.01949 osd.4 up 1.00000 1.00000\n 6 hdd 0.01949 osd.6 up 1.00000 1.00000\n-5 0.03897 host testbed-node-1\n 0 hdd 0.01949 osd.0 up 1.00000 1.00000\n 5 hdd 0.01949 osd.5 up 1.00000 1.00000\n-7 0.03897 host testbed-node-2\n 1 hdd 0.01949 osd.1 up 1.00000 1.00000\n 3 hdd 0.01949 osd.3 up 1.00000 1.00000\n"})}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"ceph-via-rook-technical-preview",children:"Ceph via Rook (technical preview)"}),"\n",(0,n.jsxs)(t.p,{children:["Please have a look at ",(0,n.jsx)(t.a,{href:"/docs/guides/deploy-guide/services/rook",children:"Deploy Guide - Services - Rook"})," and ",(0,n.jsx)(t.a,{href:"/docs/guides/configuration-guide/rook",children:"Configuration Guide - Rook"})," for details on how to configure Rook."]}),"\n",(0,n.jsx)(t.p,{children:"To deploy this in the testbed, you can use an environment variable in your make target."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"make CEPH_STACK=rook manager\nmake CEPH_STACK=rook ceph\n"})}),"\n",(0,n.jsxs)(t.p,{children:["This will make sure ",(0,n.jsx)(t.code,{children:"/opt/manager-vars.sh"})," gets ",(0,n.jsx)(t.code,{children:"CEPH_STACK=rook"})," set which is later being used by:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"/opt/configuration/scripts/deploy-services.sh\n/opt/configuration/scripts/deploy-ceph-services.sh\n/opt/configuration/scripts/upgrade/100-rook-services.sh\n"})}),"\n",(0,n.jsx)(t.h2,{id:"using-testbed-for-openstack-development",children:"Using testbed for OpenStack development"}),"\n",(0,n.jsxs)(t.p,{children:["Testbed may be used for doing development on OpenStack services through ",(0,n.jsx)(t.a,{href:"https://docs.openstack.org/kolla-ansible/latest/contributor/kolla-for-openstack-development.html",children:(0,n.jsx)(t.code,{children:"kolla_dev_mode"})}),".\n",(0,n.jsx)(t.code,{children:"kolla_dev_mode"})," may be activated for all supported service by adding"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"kolla_dev_mode: true\n"})}),"\n",(0,n.jsxs)(t.p,{children:["to ",(0,n.jsx)(t.code,{children:"environments/kolla/configuration.yml"}),". This will check out the ",(0,n.jsx)(t.code,{children:"git"})," repositories of all supported and enabled OpenStack services under ",(0,n.jsx)(t.code,{children:"/opt/stack"})," and bind mount them into the appropriate containers.\nSince this will fetch a lot of repositories it is advisable to enable this only selectively for the services you are going to work on. You can do so by adding a boolean variable to ",(0,n.jsx)(t.code,{children:"environments/kolla/configuration.yml"})," consisting of the service name and the suffix ",(0,n.jsx)(t.code,{children:"_dev_mode"}),", e.g.:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"cinder_dev_mode: true\n"})}),"\n",(0,n.jsxs)(t.p,{children:["You may customise the used ",(0,n.jsx)(t.code,{children:"git"})," repository by adding ",(0,n.jsx)(t.code,{children:"kolla_repos_git"})," to ",(0,n.jsx)(t.code,{children:"environments/kolla/configuration.yml"})," to specify a common root for the repositories of all services, which will be completed by the service's name, e.g.:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:'kolla_repos_git: "https://github.com/openstack"\n'})}),"\n",(0,n.jsxs)(t.p,{children:["will pull services from their ",(0,n.jsx)(t.code,{children:"github"})," mirror. E.g. pull nova from ",(0,n.jsx)(t.a,{href:"https://github.com/openstack/nova",children:"https://github.com/openstack/nova"}),"\nThe complete repository of a single service may be changed by adding a variable consisting of the service name and the suffix ",(0,n.jsx)(t.code,{children:"_git_repository"}),", e.g."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:'cinder_git_repository: "https://github.com/myorg/my_custom_cinder_fork"\n'})}),"\n",(0,n.jsxs)(t.p,{children:["You may Specify the ",(0,n.jsx)(t.code,{children:"git"})," reference globally by setting"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"kolla_source_version: my_feature_branch\n"})}),"\n",(0,n.jsxs)(t.p,{children:["in ",(0,n.jsx)(t.code,{children:"environments/kolla/configuration.yml"})," or for specific services via service name and suffix ",(0,n.jsx)(t.code,{children:"_source_version"}),", e.g."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"cinder_source_version: my_cinder_feature\n"})}),"\n",(0,n.jsxs)(t.p,{children:["In order to update the ",(0,n.jsx)(t.code,{children:"git"})," repositories on ",(0,n.jsx)(t.code,{children:"kolla-ansible"})," deployments set either"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"kolla_dev_repos_pull: true\n"})}),"\n",(0,n.jsx)(t.p,{children:"or, e.g."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"cinder_dev_repos_pull: true\n"})}),"\n",(0,n.jsxs)(t.p,{children:["in ",(0,n.jsx)(t.code,{children:"environments/kolla/configuration.yml"})," to set the setting for all repositories or a service specific one."]}),"\n",(0,n.jsx)(t.p,{children:"Thus, as an example for a development workflow:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Create a ",(0,n.jsx)(t.code,{children:"git"})," mirror of the OpenStack service you want to work on"]}),"\n",(0,n.jsxs)(t.li,{children:["In ",(0,n.jsx)(t.code,{children:"environments/kolla/configuration.yml"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Set the corresponding ",(0,n.jsx)(t.code,{children:"_dev_mode"})," variable to ",(0,n.jsx)(t.code,{children:"true"})]}),"\n",(0,n.jsxs)(t.li,{children:["Set the corresponding ",(0,n.jsx)(t.code,{children:"_git_repository"})," variable to your development mirror created above"]}),"\n",(0,n.jsxs)(t.li,{children:["Set the corresponding ",(0,n.jsx)(t.code,{children:"_source_version"})," variable to a branch name you intend to push your changes to"]}),"\n",(0,n.jsxs)(t.li,{children:["Set the corresponding ",(0,n.jsx)(t.code,{children:"_dev_repos_pull"})," variable to ",(0,n.jsx)(t.code,{children:"true"})]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.li,{children:"Commit your changes and push them to the specified branch in the specified mirror"}),"\n",(0,n.jsxs)(t.li,{children:["Run ",(0,n.jsx)(t.code,{children:"osism apply "})," on the manager to checkout the code on every testbed node"]}),"\n",(0,n.jsx)(t.li,{children:"Restart the service containers to actually pick up the new code"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,n.jsx)(t.h3,{id:"ansible-errors",children:"Ansible errors"}),"\n",(0,n.jsxs)(t.p,{children:["Ansible errors that have something to do with undefined variables (e.g. ",(0,n.jsx)(t.code,{children:"AnsibleUndefined"}),") are most likely due to cached\nfacts that are no longer valid. The facts can be updated by running ",(0,n.jsx)(t.code,{children:"osism apply facts"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"unsupported-locale-setting",children:"Unsupported locale setting"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"$ make prepare\nansible-playbook -i localhost, ansible/check-local-versions.yml\nERROR: Ansible could not initialize the preferred locale: unsupported locale setting\nmake: *** [prepare] Error 1\n"})}),"\n",(0,n.jsxs)(t.p,{children:["To solve the problem you have to modify the ",(0,n.jsx)(t.code,{children:"Makefile"}),". Change the 1st line as follows."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"export LC_ALL=en_US.UTF-8\n"})}),"\n",(0,n.jsxs)(t.p,{children:["To find out the locale used on the system ",(0,n.jsx)(t.code,{children:"printenv"})," can be used."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:'$ printenv | grep -i lang|locale\nLANG="en_US.UTF-8"\nLC_COLLATE="en_US.UTF-8"\nLC_CTYPE="UTF-8"\nLC_MESSAGES="en_US.UTF-8"\nLC_MONETARY="en_US.UTF-8"\nLC_NUMERIC="en_US.UTF-8"\nLC_TIME="en_US.UTF-8"\nLC_ALL=\n'})}),"\n",(0,n.jsx)(t.h2,{id:"appendix",children:"Appendix"}),"\n",(0,n.jsx)(t.h3,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsx)(t.p,{children:"This section describes how to configure and customise the OSISM Testbed."}),"\n",(0,n.jsx)(t.h4,{id:"variables",children:"Variables"}),"\n",(0,n.jsxs)(t.p,{children:["The defaults for the OpenTofu variables are intended for ",(0,n.jsx)(t.a,{href:"https://regio.digital",children:"REGIO.cloud"}),"."]}),"\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:"Variable"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Default"}),(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:"availability_zone"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"nova"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"ceph_version"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"quincy"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"cloud_provider"}),(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:"configuration_version"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"main"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"deploy_monitoring"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"false"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"dns_nameservers"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:'["8.8.8.8", "9.9.9.9"]'})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"enable_config_drive"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"true"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"external_api"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"false"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"flavor_manager"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"SCS-4V-16-50"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"flavor_node"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"SCS-8V-32-50"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"image"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"Ubuntu 22.04"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Only Ubuntu 22.04 is currently supported"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"image_node"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"Ubuntu 22.04"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Only Ubuntu 22.04 is currently supported"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"keypair"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"testbed"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"manager_version"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"latest"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"network_availability_zone"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"nova"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"number_of_nodes"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"3"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"number_of_volumes"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"3"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"openstack_version"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"2023.2"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"prefix"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"testbed"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"public"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"external"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"refstack"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"false"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"volume_availability_zone"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"nova"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"volume_size_base"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"30"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"volume_size_storage"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"10"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"volume_type"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"__DEFAULT__"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]})]})]}),"\n",(0,n.jsx)(t.h4,{id:"overrides",children:"Overrides"}),"\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:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"manager_boot_from_image"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"manager_boot_from_volume"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"neutron_availability_zone_hints_network"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"neutron_availability_zone_hints_router"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"neutron_router_enable_snat"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"nodes_boot_from_image"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"nodes_boot_from_volume"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"nodes_use_ephemeral_storage"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]})]})]}),"\n",(0,n.jsx)(t.h4,{id:"customisations",children:"Customisations"}),"\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:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"access_floatingip"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"access_ipv4"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"access_ipv6"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"default"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"external_api"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"neutron_floatingip"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"notes",children:"Notes"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"The configuration is intentionally kept quite static. Please create no PRs to make the configuration more flexible/dynamic."}),"\n",(0,n.jsx)(t.li,{children:"The OSISM documentation uses hostnames, examples, addresses etc. from OSISM Testbed."}),"\n",(0,n.jsxs)(t.li,{children:["The third volume (",(0,n.jsx)(t.code,{children:"/dev/sdd"}),") is not enabled for Ceph by default. This is to test the scaling of Ceph."]}),"\n",(0,n.jsx)(t.li,{children:"The manager is used as pull through cache for Docker images and Ubuntu packages. This reduces the amount of traffic consumed."}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"supported-releases",children:"Supported releases"}),"\n",(0,n.jsx)(t.p,{children:"The following stable Ceph and OpenStack releases are supported."}),"\n",(0,n.jsxs)(t.p,{children:["The deployment of Ceph is based on ",(0,n.jsx)(t.a,{href:"https://docs.ceph.com/ceph-ansible/",children:"ceph-ansible"}),"."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Ceph Quincy (",(0,n.jsx)(t.strong,{children:"default"}),")"]}),"\n",(0,n.jsx)(t.li,{children:"Ceph Reef"}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["The deployment of OpenStack is based on ",(0,n.jsx)(t.a,{href:"https://docs.openstack.org/kolla-ansible/latest/",children:"kolla-ansible"}),"."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"OpenStack 2023.1"}),"\n",(0,n.jsxs)(t.li,{children:["OpenStack 2023.2 (",(0,n.jsx)(t.strong,{children:"default"}),")"]}),"\n",(0,n.jsx)(t.li,{children:"OpenStack 2024.1"}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["The deployment of Kubernetes is based on ",(0,n.jsx)(t.a,{href:"https://github.com/techno-tim/k3s-ansible",children:"k3s-ansible"}),"."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Kubernetes v1.29 (",(0,n.jsx)(t.strong,{children:"default"}),")"]}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"included-services",children:"Included services"}),"\n",(0,n.jsx)(t.p,{children:"The following services can currently be used with the OSISM Testbed without further adjustments."}),"\n",(0,n.jsx)(t.h4,{id:"infrastructure",children:"Infrastructure"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Ceph"}),"\n",(0,n.jsx)(t.li,{children:"Cluster API Management Cluster"}),"\n",(0,n.jsx)(t.li,{children:"Fluentd"}),"\n",(0,n.jsx)(t.li,{children:"Gnocchi"}),"\n",(0,n.jsx)(t.li,{children:"Grafana"}),"\n",(0,n.jsx)(t.li,{children:"Haproxy"}),"\n",(0,n.jsx)(t.li,{children:"Influxdb"}),"\n",(0,n.jsx)(t.li,{children:"Keepalived"}),"\n",(0,n.jsx)(t.li,{children:"Keycloak"}),"\n",(0,n.jsx)(t.li,{children:"Kubernetes"}),"\n",(0,n.jsx)(t.li,{children:"Mariadb"}),"\n",(0,n.jsx)(t.li,{children:"Memcached"}),"\n",(0,n.jsx)(t.li,{children:"Netbox"}),"\n",(0,n.jsx)(t.li,{children:"Netdata"}),"\n",(0,n.jsx)(t.li,{children:"Opensearch"}),"\n",(0,n.jsx)(t.li,{children:"Openvswitch"}),"\n",(0,n.jsx)(t.li,{children:"Patchman"}),"\n",(0,n.jsx)(t.li,{children:"Prometheus exporters"}),"\n",(0,n.jsx)(t.li,{children:"Rabbitmq"}),"\n",(0,n.jsx)(t.li,{children:"Redis"}),"\n"]}),"\n",(0,n.jsx)(t.h4,{id:"openstack",children:"OpenStack"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Barbican"}),"\n",(0,n.jsx)(t.li,{children:"Ceilometer"}),"\n",(0,n.jsx)(t.li,{children:"Cinder"}),"\n",(0,n.jsx)(t.li,{children:"Designate"}),"\n",(0,n.jsx)(t.li,{children:"Glance"}),"\n",(0,n.jsx)(t.li,{children:"Heat"}),"\n",(0,n.jsx)(t.li,{children:"Horizon"}),"\n",(0,n.jsx)(t.li,{children:"Ironic"}),"\n",(0,n.jsx)(t.li,{children:"Keystone"}),"\n",(0,n.jsx)(t.li,{children:"Magnum"}),"\n",(0,n.jsx)(t.li,{children:"Manila"}),"\n",(0,n.jsx)(t.li,{children:"Neutron"}),"\n",(0,n.jsx)(t.li,{children:"Nova (with Libvirt/KVM)"}),"\n",(0,n.jsx)(t.li,{children:"Octavia"}),"\n",(0,n.jsx)(t.li,{children:"Senlin"}),"\n",(0,n.jsx)(t.li,{children:"Skyline"}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"makefile-reference",children:"Makefile reference"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"$ make help\n\nUsage:\n make \n help Display this help.\n clean Destroy infrastructure with OpenTofu.\n wipe-local-install Wipe the software dependencies in `venv`.\n create Create required infrastructure with OpenTofu.\n login Log in on the manager.\n vpn-wireguard Establish a wireguard vpn tunnel.\n vpn-sshuttle Establish a sshuttle vpn tunnel.\n bootstrap Bootstrap everything.\n manager Deploy only the manager service.\n identity Deploy only identity services.\n ceph Deploy only ceph services.\n deploy Deploy everything and then check it.\n prepare Run local preperations.\n deps Install software preconditions to `venv`.\n\n$ make \n"})}),"\n",(0,n.jsx)(t.h3,{id:"ci-jobs",children:"CI jobs"}),"\n",(0,n.jsxs)(t.p,{children:["You can inspect the ",(0,n.jsx)(t.a,{href:"https://zuul.services.betacloud.xyz/t/osism/builds?project=osism%2Ftestbed&skip=0",children:"results of the daily zuul jobs"}),"."]}),"\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:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"testbed-deploy"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"testbed-deploy-ceph"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"testbed-deploy-stable"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"testbed-update-stable"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"testbed-upgrade"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"testbed-upgrade-ceph"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"testbed-upgrade-stable"}),(0,n.jsx)(t.td,{style:{textAlign:"left"}})]})]})]})]})}function p(e={}){const{wrapper:t}={...(0,l.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(x,{...e})}):x(e)}},5162:(e,t,s)=>{s.d(t,{Z:()=>r});s(7294);var n=s(6905);const l={tabItem:"tabItem_Ymn6"};var i=s(5893);function r(e){let{children:t,hidden:s,className:r}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,n.Z)(l.tabItem,r),hidden:s,children:t})}},4866:(e,t,s)=>{s.d(t,{Z:()=>A});var n=s(7294),l=s(6905),i=s(2466),r=s(6550),d=s(469),o=s(1980),c=s(7392),a=s(812);function h(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function x(e){const{values:t,children:s}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return h(e).map((e=>{let{props:{value:t,label:s,attributes:n,default:l}}=e;return{value:t,label:s,attributes:n,default:l}}))}(s);return function(e){const t=(0,c.lx)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,s])}function p(e){let{value:t,tabValues:s}=e;return s.some((e=>e.value===t))}function u(e){let{queryString:t=!1,groupId:s}=e;const l=(0,r.k6)(),i=function(e){let{queryString:t=!1,groupId:s}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!s)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return s??null}({queryString:t,groupId:s});return[(0,o._X)(i),(0,n.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(l.location.search);t.set(i,e),l.replace({...l.location,search:t.toString()})}),[i,l])]}function j(e){const{defaultValue:t,queryString:s=!1,groupId:l}=e,i=x(e),[r,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:s}=e;if(0===s.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:s}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${s.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=s.find((e=>e.default))??s[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:i}))),[c,h]=u({queryString:s,groupId:l}),[j,f]=function(e){let{groupId:t}=e;const s=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,i]=(0,a.Nk)(s);return[l,(0,n.useCallback)((e=>{s&&i.set(e)}),[s,i])]}({groupId:l}),g=(()=>{const e=c??j;return p({value:e,tabValues:i})?e:null})();(0,d.Z)((()=>{g&&o(g)}),[g]);return{selectedValue:r,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);o(e),h(e),f(e)}),[h,f,i]),tabValues:i}}var f=s(2389);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var y=s(5893);function m(e){let{className:t,block:s,selectedValue:n,selectValue:r,tabValues:d}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.o5)(),a=e=>{const t=e.currentTarget,s=o.indexOf(t),l=d[s].value;l!==n&&(c(t),r(l))},h=e=>{let t=null;switch(e.key){case"Enter":a(e);break;case"ArrowRight":{const s=o.indexOf(e.currentTarget)+1;t=o[s]??o[0];break}case"ArrowLeft":{const s=o.indexOf(e.currentTarget)-1;t=o[s]??o[o.length-1];break}}t?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":s},t),children:d.map((e=>{let{value:t,label:s,attributes:i}=e;return(0,y.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>o.push(e),onKeyDown:h,onClick:a,...i,className:(0,l.Z)("tabs__item",g.tabItem,i?.className,{"tabs__item--active":n===t}),children:s??t},t)}))})}function b(e){let{lazy:t,children:s,selectedValue:i}=e;const r=(Array.isArray(s)?s:[s]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===i));return e?(0,n.cloneElement)(e,{className:(0,l.Z)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==i})))})}function v(e){const t=j(e);return(0,y.jsxs)("div",{className:(0,l.Z)("tabs-container",g.tabList),children:[(0,y.jsx)(m,{...t,...e}),(0,y.jsx)(b,{...t,...e})]})}function A(e){const t=(0,f.Z)();return(0,y.jsx)(v,{...e,children:h(e.children)},String(t))}},1151:(e,t,s)=>{s.d(t,{Z:()=>d,a:()=>r});var n=s(7294);const l={},i=n.createContext(l);function r(e){const t=n.useContext(i);return n.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(l):e.components||l:r(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.63bb4bfb.js b/assets/js/main.dcf27989.js similarity index 99% rename from assets/js/main.63bb4bfb.js rename to assets/js/main.dcf27989.js index 8b7becb7a4..1084382cb7 100644 --- a/assets/js/main.63bb4bfb.js +++ b/assets/js/main.dcf27989.js @@ -1,2 +1,2 @@ -/*! For license information please see main.63bb4bfb.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,9152)),"@theme/DocItem",9152],"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],"3599813e":[()=>n.e(5626).then(n.bind(n,819)),"@site/docs/guides/other-guides/cloud-in-a-box/running-on-a-virtual-machine.md",819],"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],"3ae5f478":[()=>n.e(978).then(n.bind(n,3799)),"@site/docs/release-notes/osism-8.md",3799],"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],"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],"60257cf7":[()=>n.e(833).then(n.bind(n,2759)),"@site/docs/guides/other-guides/cloud-in-a-box/index.md",2759],"621db11d":[()=>Promise.all([n.e(532),n.e(2277),n.e(3940)]).then(n.bind(n,5885)),"@theme/Blog/Pages/BlogAuthorsListPage",5885],"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(2277),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":[()=>Promise.all([n.e(532),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(2277),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,4547)),"@theme/DocRoot",4547],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(2277),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],d27d7a26:[()=>n.e(9540).then(n.bind(n,5660)),"@site/docs/guides/user-guide/migration-vmware-esxi.md",5660],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],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],ef8b811a:[()=>n.e(2644).then(n.t.bind(n,9441,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-authors-790.json",9441],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/authors",component:d("/blog/authors","0b7"),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","483"),routes:[{path:"/docs",component:d("/docs","9d5"),routes:[{path:"/docs",component:d("/docs","a71"),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/","d25"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/other-guides/cloud-in-a-box/running-on-a-virtual-machine",component:d("/docs/guides/other-guides/cloud-in-a-box/running-on-a-virtual-machine","1c6"),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-esxi",component:d("/docs/guides/user-guide/migration-vmware-esxi","daa"),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:"/docs/release-notes/osism-8",component:d("/docs/release-notes/osism-8","02e"),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})}},2849:(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 h=n(5742),m=n(2263),b=n(4996),y=n(6668),v=n(8264),w=n(4711),k=n(9727);const x="default";var S=n(8780),_=n(197);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,m.Z)(),r=(0,w.l)(),o=n[e].htmlLang,i=e=>e.replace("-","_");return(0,f.jsxs)(h.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,m.Z)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,m.Z)(),{pathname:r}=(0,d.TH)();return e+(0,S.Do)((0,b.ZP)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,f.jsxs)(h.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,m.Z)(),{metadata:t,image:n}=(0,y.L)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(h.Z,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:k.h})]}),n&&(0,f.jsx)(v.d,{image:n}),(0,f.jsx)(C,{}),(0,f.jsx)(E,{}),(0,f.jsx)(_.Z,{tag:x,locale:e}),(0,f.jsx)(h.Z,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const L=new Map;var j=n(8934),P=n(8940),A=n(469);function R(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const O=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,A.Z)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,i=t.search===n.search;if(r&&o&&!i)return;const{hash:a}=t;if(a){const e=decodeURIComponent(a.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),R("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function N(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,p.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?R("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=R("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),N(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(O,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(d.AW,{location:t,render:()=>e})})}}const D=I,F="__docusaurus-base-url-issue-banner-container",M="__docusaurus-base-url-issue-banner",B="__docusaurus-base-url-issue-banner-suggestion-container";function z(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${F}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{let{route:t}=e;return!0===t.exact})))return L.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return L.set(e.pathname,t),{...e,pathname:t}}((0,d.TH)());return(0,f.jsx)(D,{location:e,children:Z})}function G(){return(0,f.jsx)(H.Z,{children:(0,f.jsx)(P.M,{children:(0,f.jsxs)(j.t,{children:[(0,f.jsxs)(g,{children:[(0,f.jsx)(q,{}),(0,f.jsx)(T,{}),(0,f.jsx)(U,{}),(0,f.jsx)(W,{})]}),(0,f.jsx)(V,{})]})})})}var K=n(6887);const Y=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var X=n(9670);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,p.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(K).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Y(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),N(e))},re=Object.freeze(ne);function oe(e){let{children:t}=e;return"hash"===s.default.future.experimental_router?(0,f.jsx)(a.UT,{children:t}):(0,f.jsx)(a.VK,{children:t})}const ie=Boolean(!0);if(l.Z.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(i.B6,{children:(0,f.jsx)(oe,{children:(0,f.jsx)(G,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},a=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(ie)window.docusaurusRoot=o.hydrateRoot(e,t,{onRecoverableError:n});else{const r=o.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};N(window.location.pathname).then((()=>{(0,r.startTransition)(a)}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>d,M:()=>p});var r=n(7294),o=n(6809);const i=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"index","docs":[{"id":"appendix/comparisons","path":"/docs/appendix/comparisons","sidebar":"tutorialSidebar"},{"id":"appendix/glossary","path":"/docs/appendix/glossary","sidebar":"tutorialSidebar"},{"id":"appendix/index","path":"/docs/appendix/","sidebar":"tutorialSidebar"},{"id":"appendix/networks","path":"/docs/appendix/networks","sidebar":"tutorialSidebar"},{"id":"appendix/standards","path":"/docs/appendix/standards","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/components/ceph","path":"/docs/guides/concept-guide/components/ceph","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/components/clusterapi","path":"/docs/guides/concept-guide/components/clusterapi","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/components/gardener","path":"/docs/guides/concept-guide/components/gardener","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/components/index","path":"/docs/guides/concept-guide/components/","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/components/ironic","path":"/docs/guides/concept-guide/components/ironic","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/components/k3s","path":"/docs/guides/concept-guide/components/k3s","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/components/keycloak","path":"/docs/guides/concept-guide/components/keycloak","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/components/netdata","path":"/docs/guides/concept-guide/components/netdata","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/components/openstack","path":"/docs/guides/concept-guide/components/openstack","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/components/prometheus","path":"/docs/guides/concept-guide/components/prometheus","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/components/proxmox","path":"/docs/guides/concept-guide/components/proxmox","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/components/sonic","path":"/docs/guides/concept-guide/components/sonic","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/components/teleport","path":"/docs/guides/concept-guide/components/teleport","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/design","path":"/docs/guides/concept-guide/design","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/hardware-bom","path":"/docs/guides/concept-guide/hardware-bom","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/index","path":"/docs/guides/concept-guide/","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/layers","path":"/docs/guides/concept-guide/layers","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/nodes","path":"/docs/guides/concept-guide/nodes","sidebar":"tutorialSidebar"},{"id":"guides/concept-guide/use-cases","path":"/docs/guides/concept-guide/use-cases","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/ceph","path":"/docs/guides/configuration-guide/ceph","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/commons/certificates","path":"/docs/guides/configuration-guide/commons/certificates","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/commons/index","path":"/docs/guides/configuration-guide/commons/","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/commons/packages","path":"/docs/guides/configuration-guide/commons/packages","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/commons/resolvconf","path":"/docs/guides/configuration-guide/commons/resolvconf","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/commons/services","path":"/docs/guides/configuration-guide/commons/services","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/commons/sshconfig","path":"/docs/guides/configuration-guide/commons/sshconfig","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/commons/sysctl","path":"/docs/guides/configuration-guide/commons/sysctl","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/commons/timezone","path":"/docs/guides/configuration-guide/commons/timezone","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/commons/user","path":"/docs/guides/configuration-guide/commons/user","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/configuration-repository","path":"/docs/guides/configuration-guide/configuration-repository","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/index","path":"/docs/guides/configuration-guide/","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/inventory","path":"/docs/guides/configuration-guide/inventory","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/loadbalancer","path":"/docs/guides/configuration-guide/loadbalancer","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/manager","path":"/docs/guides/configuration-guide/manager","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/network","path":"/docs/guides/configuration-guide/network","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/openstack/aodh","path":"/docs/guides/configuration-guide/openstack/aodh","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/openstack/barbican","path":"/docs/guides/configuration-guide/openstack/barbican","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/openstack/ceilometer","path":"/docs/guides/configuration-guide/openstack/ceilometer","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/openstack/cinder","path":"/docs/guides/configuration-guide/openstack/cinder","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/openstack/designate","path":"/docs/guides/configuration-guide/openstack/designate","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/openstack/glance","path":"/docs/guides/configuration-guide/openstack/glance","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/openstack/heat","path":"/docs/guides/configuration-guide/openstack/heat","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/openstack/horizon","path":"/docs/guides/configuration-guide/openstack/horizon","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/openstack/index","path":"/docs/guides/configuration-guide/openstack/","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/openstack/ironic","path":"/docs/guides/configuration-guide/openstack/ironic","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/openstack/keystone","path":"/docs/guides/configuration-guide/openstack/keystone","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/openstack/magnum","path":"/docs/guides/configuration-guide/openstack/magnum","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/openstack/manila","path":"/docs/guides/configuration-guide/openstack/manila","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/openstack/neutron","path":"/docs/guides/configuration-guide/openstack/neutron","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/openstack/nova","path":"/docs/guides/configuration-guide/openstack/nova","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/openstack/octavia","path":"/docs/guides/configuration-guide/openstack/octavia","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/openstack/placement","path":"/docs/guides/configuration-guide/openstack/placement","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/openstack/skyline","path":"/docs/guides/configuration-guide/openstack/skyline","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/proxy","path":"/docs/guides/configuration-guide/proxy","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/rook","path":"/docs/guides/configuration-guide/rook","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/services/chrony","path":"/docs/guides/configuration-guide/services/chrony","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/services/docker","path":"/docs/guides/configuration-guide/services/docker","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/services/index","path":"/docs/guides/configuration-guide/services/","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/services/tuned","path":"/docs/guides/configuration-guide/services/tuned","sidebar":"tutorialSidebar"},{"id":"guides/configuration-guide/validations/index","path":"/docs/guides/configuration-guide/validations/","sidebar":"tutorialSidebar"},{"id":"guides/deploy-guide/bootstrap","path":"/docs/guides/deploy-guide/bootstrap","sidebar":"tutorialSidebar"},{"id":"guides/deploy-guide/examples/cloud-in-a-box","path":"/docs/guides/deploy-guide/examples/cloud-in-a-box","sidebar":"tutorialSidebar"},{"id":"guides/deploy-guide/examples/index","path":"/docs/guides/deploy-guide/examples/","sidebar":"tutorialSidebar"},{"id":"guides/deploy-guide/examples/testbed","path":"/docs/guides/deploy-guide/examples/testbed","sidebar":"tutorialSidebar"},{"id":"guides/deploy-guide/index","path":"/docs/guides/deploy-guide/","sidebar":"tutorialSidebar"},{"id":"guides/deploy-guide/manager","path":"/docs/guides/deploy-guide/manager","sidebar":"tutorialSidebar"},{"id":"guides/deploy-guide/provisioning","path":"/docs/guides/deploy-guide/provisioning","sidebar":"tutorialSidebar"},{"id":"guides/deploy-guide/seed","path":"/docs/guides/deploy-guide/seed","sidebar":"tutorialSidebar"},{"id":"guides/deploy-guide/services/ceph","path":"/docs/guides/deploy-guide/services/ceph","sidebar":"tutorialSidebar"},{"id":"guides/deploy-guide/services/index","path":"/docs/guides/deploy-guide/services/","sidebar":"tutorialSidebar"},{"id":"guides/deploy-guide/services/infrastructure","path":"/docs/guides/deploy-guide/services/infrastructure","sidebar":"tutorialSidebar"},{"id":"guides/deploy-guide/services/kubernetes","path":"/docs/guides/deploy-guide/services/kubernetes","sidebar":"tutorialSidebar"},{"id":"guides/deploy-guide/services/logging-monitoring","path":"/docs/guides/deploy-guide/services/logging-monitoring","sidebar":"tutorialSidebar"},{"id":"guides/deploy-guide/services/network","path":"/docs/guides/deploy-guide/services/network","sidebar":"tutorialSidebar"},{"id":"guides/deploy-guide/services/openstack","path":"/docs/guides/deploy-guide/services/openstack","sidebar":"tutorialSidebar"},{"id":"guides/deploy-guide/services/rook","path":"/docs/guides/deploy-guide/services/rook","sidebar":"tutorialSidebar"},{"id":"guides/index","path":"/docs/guides/","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/ceph","path":"/docs/guides/operations-guide/ceph","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/index","path":"/docs/guides/operations-guide/","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/infrastructure","path":"/docs/guides/operations-guide/infrastructure","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/manager/apply","path":"/docs/guides/operations-guide/manager/apply","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/manager/console","path":"/docs/guides/operations-guide/manager/console","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/manager/get","path":"/docs/guides/operations-guide/manager/get","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/manager/index","path":"/docs/guides/operations-guide/manager/","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/manager/log","path":"/docs/guides/operations-guide/manager/log","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/manager/task","path":"/docs/guides/operations-guide/manager/task","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/network","path":"/docs/guides/operations-guide/network","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/openstack/cinder","path":"/docs/guides/operations-guide/openstack/cinder","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/openstack/index","path":"/docs/guides/operations-guide/openstack/","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/openstack/keystone","path":"/docs/guides/operations-guide/openstack/keystone","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/openstack/neutron","path":"/docs/guides/operations-guide/openstack/neutron","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/openstack/nova","path":"/docs/guides/operations-guide/openstack/nova","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/openstack/octavia","path":"/docs/guides/operations-guide/openstack/octavia","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/openstack/tools/flavor-manager","path":"/docs/guides/operations-guide/openstack/tools/flavor-manager","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/openstack/tools/image-manager/index","path":"/docs/guides/operations-guide/openstack/tools/image-manager/","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/openstack/tools/image-manager/update","path":"/docs/guides/operations-guide/openstack/tools/image-manager/update","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/openstack/tools/index","path":"/docs/guides/operations-guide/openstack/tools/","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/openstack/tools/openstack-health-monitor","path":"/docs/guides/operations-guide/openstack/tools/openstack-health-monitor","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/openstack/tools/project-manager","path":"/docs/guides/operations-guide/openstack/tools/project-manager","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/openstack/tools/resource-manager","path":"/docs/guides/operations-guide/openstack/tools/resource-manager","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/openstack/tools/sandbox-manager","path":"/docs/guides/operations-guide/openstack/tools/sandbox-manager","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/openstack/tools/simple-stress","path":"/docs/guides/operations-guide/openstack/tools/simple-stress","sidebar":"tutorialSidebar"},{"id":"guides/operations-guide/rook","path":"/docs/guides/operations-guide/rook","sidebar":"tutorialSidebar"},{"id":"guides/other-guides/cloud-in-a-box/index","path":"/docs/guides/other-guides/cloud-in-a-box/","sidebar":"tutorialSidebar"},{"id":"guides/other-guides/cloud-in-a-box/running-on-a-virtual-machine","path":"/docs/guides/other-guides/cloud-in-a-box/running-on-a-virtual-machine","sidebar":"tutorialSidebar"},{"id":"guides/other-guides/contributor-guide","path":"/docs/guides/other-guides/contributor-guide","sidebar":"tutorialSidebar"},{"id":"guides/other-guides/developer-guide/index","path":"/docs/guides/other-guides/developer-guide/","sidebar":"tutorialSidebar"},{"id":"guides/other-guides/developer-guide/releases","path":"/docs/guides/other-guides/developer-guide/releases","sidebar":"tutorialSidebar"},{"id":"guides/other-guides/developer-guide/scripts","path":"/docs/guides/other-guides/developer-guide/scripts","sidebar":"tutorialSidebar"},{"id":"guides/other-guides/developer-guide/zuul","path":"/docs/guides/other-guides/developer-guide/zuul","sidebar":"tutorialSidebar"},{"id":"guides/other-guides/index","path":"/docs/guides/other-guides/","sidebar":"tutorialSidebar"},{"id":"guides/other-guides/style-guide","path":"/docs/guides/other-guides/style-guide","sidebar":"tutorialSidebar"},{"id":"guides/other-guides/testbed","path":"/docs/guides/other-guides/testbed","sidebar":"tutorialSidebar"},{"id":"guides/troubleshooting-guide/ceph","path":"/docs/guides/troubleshooting-guide/ceph","sidebar":"tutorialSidebar"},{"id":"guides/troubleshooting-guide/index","path":"/docs/guides/troubleshooting-guide/","sidebar":"tutorialSidebar"},{"id":"guides/troubleshooting-guide/manager","path":"/docs/guides/troubleshooting-guide/manager","sidebar":"tutorialSidebar"},{"id":"guides/troubleshooting-guide/openstack","path":"/docs/guides/troubleshooting-guide/openstack","sidebar":"tutorialSidebar"},{"id":"guides/upgrade-guide/ceph","path":"/docs/guides/upgrade-guide/ceph","sidebar":"tutorialSidebar"},{"id":"guides/upgrade-guide/docker","path":"/docs/guides/upgrade-guide/docker","sidebar":"tutorialSidebar"},{"id":"guides/upgrade-guide/index","path":"/docs/guides/upgrade-guide/","sidebar":"tutorialSidebar"},{"id":"guides/upgrade-guide/infrastructure","path":"/docs/guides/upgrade-guide/infrastructure","sidebar":"tutorialSidebar"},{"id":"guides/upgrade-guide/logging-monitoring","path":"/docs/guides/upgrade-guide/logging-monitoring","sidebar":"tutorialSidebar"},{"id":"guides/upgrade-guide/manager","path":"/docs/guides/upgrade-guide/manager","sidebar":"tutorialSidebar"},{"id":"guides/upgrade-guide/network","path":"/docs/guides/upgrade-guide/network","sidebar":"tutorialSidebar"},{"id":"guides/upgrade-guide/openstack","path":"/docs/guides/upgrade-guide/openstack","sidebar":"tutorialSidebar"},{"id":"guides/user-guide/index","path":"/docs/guides/user-guide/","sidebar":"tutorialSidebar"},{"id":"guides/user-guide/migration-vmware-esxi","path":"/docs/guides/user-guide/migration-vmware-esxi","sidebar":"tutorialSidebar"},{"id":"guides/user-guide/openstack/index","path":"/docs/guides/user-guide/openstack/","sidebar":"tutorialSidebar"},{"id":"guides/user-guide/openstack/openstackclient","path":"/docs/guides/user-guide/openstack/openstackclient","sidebar":"tutorialSidebar"},{"id":"guides/user-guide/openstack/security-groups","path":"/docs/guides/user-guide/openstack/security-groups","sidebar":"tutorialSidebar"},{"id":"guides/user-guide/openstack/user-data-backups","path":"/docs/guides/user-guide/openstack/user-data-backups","sidebar":"tutorialSidebar"},{"id":"index","path":"/docs/","sidebar":"tutorialSidebar"},{"id":"references/cli","path":"/docs/references/cli","sidebar":"tutorialSidebar"},{"id":"references/configuration","path":"/docs/references/configuration","sidebar":"tutorialSidebar"},{"id":"references/index","path":"/docs/references/","sidebar":"tutorialSidebar"},{"id":"references/parameters","path":"/docs/references/parameters","sidebar":"tutorialSidebar"},{"id":"release-notes/index","path":"/docs/release-notes/","sidebar":"tutorialSidebar"},{"id":"release-notes/osism-7","path":"/docs/release-notes/osism-7","sidebar":"tutorialSidebar"},{"id":"release-notes/osism-8","path":"/docs/release-notes/osism-8","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/","label":"Getting started"}}}}],"breadcrumbs":true},"users":{"path":"/users","versions":[{"name":"current","label":"Next","isLast":true,"path":"/users","mainDocId":"index","docs":[{"id":"index","path":"/users/","sidebar":"adaptorsSidebar"}],"draftIds":[],"sidebars":{"adaptorsSidebar":{"link":{"path":"/users/","label":"index"}}}}],"breadcrumbs":true}}}'),a=JSON.parse('{"defaultLocale":"en","locales":["en","de"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"},"de":{"label":"Deutsch","direction":"ltr","htmlLang":"de","calendar":"gregory","path":"de"}}}');var s=n(7529);const l=JSON.parse('{"docusaurusVersion":"3.5.2","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.5.2"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.5.2"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.5.2"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.5.2"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.5.2"},"@easyops-cn/docusaurus-search-local":{"type":"package","name":"@easyops-cn/docusaurus-search-local","version":"0.44.2"}}}');var c=n(5893);const u={siteConfig:o.default,siteMetadata:l,globalData:i,i18n:a,codeTranslations:s},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>h});var r=n(7294),o=n(412),i=n(5742),a=n(8780),s=n(8955),l=n(226),c=n(5893);function u(e){let{error:t,tryAgain:n}=e;return(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,a.BN)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function p(e){let{children:t}=e;return(0,c.jsx)(l.z,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function f(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(p,{children:(0,c.jsxs)(h,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(i.Z,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(s.Z,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const g=e=>(0,c.jsx)(f,{...e});class h extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??g)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});n(7294);var r=n(405),o=n(5893);function i(e){return(0,o.jsx)(r.ql,{...e})}},3692:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),o=n(3727),i=n(8780),a=n(2263),s=n(3919),l=n(412),c=n(8138),u=n(4996),d=n(5893);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:g,isActive:h,"data-noBrokenLinkCheck":m,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:v}=(0,a.Z)(),{trailingSlash:w,baseUrl:k}=v,x=v.future.experimental_router,{withBaseUrl:S}=(0,u.Cg)(),_=(0,c.Z)(),E=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>E.current));const C=p||f;const T=(0,s.Z)(C),L=C?.replace("pathname://","");let j=void 0!==L?(P=L,b&&(e=>e.startsWith("/"))(P)?S(P):P):void 0;var P;"hash"===x&&j?.startsWith("./")&&(j=j?.slice(1)),j&&T&&(j=(0,i.Do)(j,{trailingSlash:w,baseUrl:k}));const A=(0,r.useRef)(!1),R=n?o.OL:o.rU,O=l.Z.canUseIntersectionObserver,N=(0,r.useRef)(),I=()=>{A.current||null==j||(window.docusaurus.preload(j),A.current=!0)};(0,r.useEffect)((()=>(!O&&T&&l.Z.canUseDOM&&null!=j&&window.docusaurus.prefetch(j),()=>{O&&N.current&&N.current.disconnect()})),[N,j,O,T]);const D=j?.startsWith("#")??!1,F=!y.target||"_self"===y.target,M=!j||!T||!F||D&&"hash"!==x;m||!D&&M||_.collectLink(j),y.id&&_.collectAnchor(y.id);const B={};return M?(0,d.jsx)("a",{ref:E,href:j,...C&&!T&&{target:"_blank",rel:"noopener noreferrer"},...y,...B}):(0,d.jsx)(R,{...y,onMouseEnter:I,onTouchStart:I,innerRef:e=>{E.current=e,O&&e&&T&&(N.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=j&&window.docusaurus.prefetch(j))}))})),N.current.observe(e))},to:j,...n&&{isActive:h,activeClassName:g},...B})}const f=r.forwardRef(p)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c,I:()=>l});var r=n(7294),o=n(5893);function i(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var a=n(7529);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return a[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return i(s({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const a=s({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:i(a,r)})}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>o,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{Cg:()=>a,ZP:()=>s});var r=n(7294),o=n(2263),i=n(3919);function a(){const{siteConfig:e}=(0,o.Z)(),{baseUrl:t,url:n}=e,a=e.future.experimental_router,s=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:o=!1,absolute:a=!1}={},router:s}=e;if(!r||r.startsWith("#")||(0,i.b)(r))return r;if("hash"===s)return r.startsWith("/")?`.${r}`:`./${r}`;if(o)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const l=r.startsWith(n)?r:n+r.replace(/^\//,"");return a?t+l:l}({siteUrl:n,baseUrl:t,url:e,options:r,router:a})),[n,t,a]);return{withBaseUrl:s}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=a();return n(e,t)}},8138:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294);n(5893);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),i=()=>(0,r.useContext)(o);function a(){return i()}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(7294),o=n(8940);function i(){return(0,r.useContext)(o._)}},8084:(e,t,n)=>{"use strict";n.d(t,{OD:()=>i,eZ:()=>a});var r=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,r.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}function a(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(7294),o=n(8934);function i(){return(0,r.useContext)(o._)}},469:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const o=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect},5102:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(7294),o=n(226);function i(){const e=r.useContext(o._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[i,a]=n;const s=o?`${o}.${i}`:i;r(a)?e(a,s):t[s]=a}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>i,z:()=>a});var r=n(7294),o=n(5893);const i=r.createContext(null);function a(e){let{children:t,value:n}=e;const a=r.useContext(i),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:a,value:n})),[a,n]);return(0,o.jsx)(i.Provider,{value:s,children:t})}},298:(e,t,n)=>{"use strict";n.d(t,{J:()=>y,L5:()=>m,Oh:()=>v});var r=n(7294),o=n(4104),i=n(9935),a=n(6668),s=n(812),l=n(902),c=n(5893);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,s.WA)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,s.WA)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,s.WA)(u(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function g(){const e=(0,o._r)(),t=(0,a.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[i,s]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[i,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=g();return(0,c.jsx)(f.Provider,{value:n,children:t})}function m(e){let{children:t}=e;return(0,c.jsx)(h,{children:t})}function b(){const e=(0,r.useContext)(f);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=i.m);const t=(0,o.zh)(e),[n,a]=b(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{a.savePreferredVersion(e,t)}),[a,e])}}function v(){const e=(0,o._r)(),[t]=b();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},4165:(e,t,n)=>{"use strict";n.d(t,{J:()=>i,z:()=>a});var r=n(4104),o=n(298);function i(e,t){return`docs-${e}-${t}`}function a(){const e=(0,r._r)(),t=(0,r.WS)(),n=(0,o.Oh)();return[...Object.keys(e).map((function(r){const o=t?.activePlugin.pluginId===r?t.activeVersion:void 0,a=n[r],s=e[r].versions.find((e=>e.isLast));return i(r,(o??a??s).name)}))]}},4731:(e,t,n)=>{"use strict";n.d(t,{V:()=>c,b:()=>l});var r=n(7294),o=n(902),i=n(5893);const a=Symbol("EmptyContext"),s=r.createContext(a);function l(e){let{children:t,name:n,items:o}=e;const a=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,i.jsx)(s.Provider,{value:a,children:t})}function c(){const e=(0,r.useContext)(s);if(e===a)throw new o.i6("DocsSidebarProvider");return e}},9690:(e,t,n)=>{"use strict";n.d(t,{LM:()=>p,MN:()=>E,SN:()=>_,_F:()=>m,f:()=>y,jA:()=>f,lO:()=>k,oz:()=>x,s1:()=>w,vY:()=>S});var r=n(7294),o=n(6550),i=n(8790),a=n(4104),s=n(8596),l=n(7392),c=n(298),u=n(3797),d=n(4731);function p(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=p(t);if(e)return e}}(e):void 0:e.href}function f(){const{pathname:e}=(0,o.TH)(),t=(0,d.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=v({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const g=(e,t)=>void 0!==e&&(0,s.Mg)(e,t),h=(e,t)=>e.some((e=>m(e,t)));function m(e,t){return"link"===e.type?g(e.href,t):"category"===e.type&&(g(e.href,t)||h(e.items,t))}function b(e,t){switch(e.type){case"category":return m(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||m(e,t);default:return!0}}function y(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const i of t)if("category"===i.type&&((0,s.Mg)(i.href,n)||e(i.items))||"link"===i.type&&(0,s.Mg)(i.href,n)){return r&&"category"!==i.type||o.unshift(i),!0}return!1}(t),o}function w(){const e=(0,d.V)(),{pathname:t}=(0,o.TH)(),n=(0,a.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function k(e){const{activeVersion:t}=(0,a.Iw)(e),{preferredVersion:n}=(0,c.J)(e),o=(0,a.yW)(e);return(0,r.useMemo)((()=>(0,l.jj)([t,n,o].filter(Boolean))),[t,n,o])}function x(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function S(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,l.jj)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t}=e;const n=(0,o.TH)(),r=(0,u.E)(),a=t.routes,s=a.find((e=>(0,o.LX)(n.pathname,e)));if(!s)return null;const l=s.sidebar,c=l?r.docsSidebars[l]:void 0;return{docElement:(0,i.H)(a),sidebarName:l,sidebarItems:c}}function E(e){return e.filter((e=>!("category"===e.type||"link"===e.type)||!!p(e)))}},3797:(e,t,n)=>{"use strict";n.d(t,{E:()=>l,q:()=>s});var r=n(7294),o=n(902),i=n(5893);const a=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,i.jsx)(a.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(a);if(null===e)throw new o.i6("DocsVersionProvider");return e}},4104:(e,t,n)=>{"use strict";n.d(t,{MN:()=>l.MN,Iw:()=>y,gA:()=>g,WS:()=>h,_r:()=>p,jA:()=>l.jA,Jo:()=>v,z1:()=>u.z,zh:()=>f,J:()=>c.J,yW:()=>b,gB:()=>m});var r=n(6550),o=n(8084);const i=e=>e.versions.find((e=>e.isLast));function a(e,t){return[...e.versions].sort(((e,t)=>e.path===t.path?0:e.path.includes(t.path)?-1:t.path.includes(e.path)?1:0)).find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function s(e,t){const n=a(e,t),o=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}var l=n(9690),c=n(298),u=n(4165);const d={},p=()=>(0,o.OD)("docusaurus-plugin-content-docs")??d,f=e=>{try{return(0,o.eZ)("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function g(e){void 0===e&&(e={});const t=p(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),i=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!i&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return i}(t,n,e)}function h(e){void 0===e&&(e={});const t=g(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:a(t.pluginData,n)}}function m(e){return f(e).versions}function b(e){const t=f(e);return i(t)}function y(e){const t=f(e),{pathname:n}=(0,r.TH)();return s(t,n)}function v(e){const t=f(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=i(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>i});var r=n(4865),o=n.n(r);o().configure({showSpinner:!1});const i={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(4965),o=n(6809);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(6854),n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(r.p1)},2503:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(7294);var r=n(6905),o=n(5999),i=n(6668),a=n(3692),s=n(8138);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(5893);function u(e){let{as:t,id:n,...u}=e;const d=(0,s.Z)(),{navbar:{hideOnScroll:p}}=(0,i.L)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,o.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.Z)("anchor",p?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(a.Z,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});n(7294);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(5893);function i(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},8955:(e,t,n)=>{"use strict";n.d(t,{Z:()=>zt});var r=n(7294),o=n(6905),i=n(4763),a=n(8264),s=n(6550),l=n(5999),c=n(5936),u=n(5893);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const g=(0,l.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??g,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":g,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var m=n(5281),b=n(9727);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(h,{className:y.skipToContent})}var w=n(6668),k=n(9689);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:i,...a}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...a,children:(0,u.jsx)("g",{stroke:r,strokeWidth:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function _(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.Z)("clean-btn close",S.closeButton,e.className),children:(0,u.jsx)(x,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.Z)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function L(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.n)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:i}=e;return(0,u.jsxs)("div",{className:T.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[i&&(0,u.jsx)("div",{className:T.announcementBarPlaceholder}),(0,u.jsx)(C,{className:T.announcementBarContent}),i&&(0,u.jsx)(_,{onClick:n,className:T.announcementBarClose})]})}var j=n(3163),P=n(2466);var A=n(902),R=n(3102);const O=r.createContext(null);function N(e){let{children:t}=e;const n=function(){const e=(0,j.e)(),t=(0,R.HY)(),[n,o]=(0,r.useState)(!1),i=null!==t.component,a=(0,A.D9)(i);return(0,r.useEffect)((()=>{i&&!a&&o(!0)}),[i,a]),(0,r.useEffect)((()=>{i?e.shown||o(!0):o(!1)}),[e.shown,i]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(O.Provider,{value:n,children:t})}function I(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function D(){const e=(0,r.useContext)(O);if(!e)throw new A.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),i=(0,R.HY)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:I(i)})),[o,i,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:i}=D();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var M=n(2949),B=n(2389);function z(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:r,onChange:i}=e;const a=(0,B.Z)(),s=(0,l.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.Z)(U.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.Z)("clean-btn",U.toggleButton,!a&&U.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===r?"light":"dark"),disabled:!a,title:s,"aria-label":s,"aria-live":"polite",children:[(0,u.jsx)(z,{className:(0,o.Z)(U.toggleIcon,U.lightToggleIcon)}),(0,u.jsx)($,{className:(0,o.Z)(U.toggleIcon,U.darkToggleIcon)})]})})}const H=r.memo(q),Q={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){let{className:t}=e;const n=(0,w.L)().navbar.style,r=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:i}=(0,M.I)();return r?null:(0,u.jsx)(H,{className:t,buttonClassName:"dark"===n?Q.darkNavbarColorModeToggle:void 0,value:o,onChange:i})}var Z=n(1327);function W(){return(0,u.jsx)(Z.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function G(){const e=(0,j.e)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(x,{color:"var(--ifm-color-emphasis-600)"})})}function K(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(W,{}),(0,u.jsx)(V,{className:"margin-right--md"}),(0,u.jsx)(G,{})]})}var Y=n(3692),X=n(4996),J=n(3919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:i,html:a,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,X.ZP)(r),p=(0,X.ZP)(t),f=(0,X.ZP)(o,{forcePrependBaseUrl:!0}),g=i&&o&&!(0,J.Z)(o),h=a?{dangerouslySetInnerHTML:{__html:a}}:{children:(0,u.jsxs)(u.Fragment,{children:[i,g&&(0,u.jsx)(te.Z,{...s&&{width:12,height:12}})]})};return o?(0,u.jsx)(Y.Z,{href:l?f:o,...c,...h}):(0,u.jsx)(Y.Z,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},...c,...h})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const i=(0,u.jsx)(ne,{className:(0,o.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:i}):i}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.Z)("menu__link",t),...r})})}function ie(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,u.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ae=n(6043),se=n(8596),le=n(2263);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:i,onClick:a,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,u.jsxs)("div",{ref:l,className:(0,o.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,o.Z)("navbar__link",i),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Xe,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:i,onClick:a,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:g}=(0,ae.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&g(!d)}),[c,d,g]),(0,u.jsxs)("li",{className:(0,o.Z)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.Z)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),f()},children:l.children??l.label}),(0,u.jsx)(ae.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(Xe,{mobile:!0,isDropdownItem:!0,onClick:a,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var ge=n(4711);function he(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const me="iconLanguage_nlXk";var be=n(1029),ye=n(6010);var ve=n(8084);const we={},ke=()=>(0,ve.OD)("docusaurus-plugin-content-docs")??we;function xe(e){void 0===e&&(e={});const t=ke(),{pathname:n}=(0,s.TH)();return function(e,t,n){void 0===n&&(n={});const r=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,s.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=r?{pluginId:r[0],pluginData:r[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}var Se=n(22),_e=n(8202),Ee=n(3545),Ce=n(3926),Te=n(1073),Le=n(2539),je=n(726);const Pe='',Ae='',Re='',Oe='',Ne='',Ie='',De='',Fe={searchBar:"searchBar_RVTs",dropdownMenu:"dropdownMenu_qbY6",searchBarLeft:"searchBarLeft_MXDe",suggestion:"suggestion_fB_2",cursor:"cursor_eG29",hitTree:"hitTree_kk6K",hitIcon:"hitIcon_a7Zy",hitPath:"hitPath_ieM4",noResultsIcon:"noResultsIcon_EBY5",hitFooter:"hitFooter_E9YW",hitWrapper:"hitWrapper_sAK8",hitTitle:"hitTitle_vyVt",hitAction:"hitAction_NqkB",hideAction:"hideAction_vcyE",noResults:"noResults_l6Q3",searchBarContainer:"searchBarContainer_NW3z",searchBarLoadingRing:"searchBarLoadingRing_YnHq",searchClearButton:"searchClearButton_qk4g",searchIndexLoading:"searchIndexLoading_EJ1f",searchHintContainer:"searchHintContainer_Pkmr",searchHint:"searchHint_iIMx",focused:"focused_OWtg",input:"input_FOTf",hint:"hint_URu1",suggestions:"suggestions_X8XU",dataset:"dataset_QiCy",empty:"empty_eITn"};function Me(e){let{document:t,type:n,page:r,metadata:o,tokens:i,isInterOfTree:a,isLastOfTree:s}=e;const l=n===Ee.P.Title,c=n===Ee.P.Keywords,u=l||c,d=n===Ee.P.Heading,p=[];a?p.push(Ie):s&&p.push(De);const f=p.map((e=>`${e}`)),g=`${u?Pe:d?Ae:Re}`,h=[`${c?(0,Le.C)(t.s,i):(0,je.o)(t.t,(0,Te.m)(o,"t"),i)}`];if(!a&&!s&&be.H6){const e=r?r.b?.concat(r.t).concat(t.s&&t.s!==r.t?t.s:[]):t.b;h.push(`${(0,Ce.e)(e??[])}`)}else u||h.push(`${(0,Le.C)(r.t||(t.u.startsWith("/docs/api-reference/")?"API Reference":""),i)}`);const m=`${Oe}`;return[...f,g,``,...h,"",m].join("")}function Be(){return`${Ne}${(0,l.I)({id:"theme.SearchBar.noResultsText",message:"No results"})}`}var ze=n(311),$e=n(51);async function Ue(){const e=await Promise.all([n.e(8443),n.e(5525)]).then(n.t.bind(n,8443,23)),t=e.default;return t.noConflict?t.noConflict():e.noConflict&&e.noConflict(),t}const qe="_highlight";const He=function(e){let{handleSearchBarToggle:t}=e;const o=(0,B.Z)(),{siteConfig:{baseUrl:i},i18n:{currentLocale:a}}=(0,le.Z)(),c=xe();let d=i;try{const{preferredVersion:e}=function(){return n(4104).J(...arguments)}(c?.pluginId??be.gQ);e&&!e.isLast&&(d=e.path+"/")}catch(M){if(be.l9&&!(M instanceof A.i6))throw M}const p=(0,s.k6)(),f=(0,s.TH)(),g=(0,r.useRef)(null),h=(0,r.useRef)(new Map),m=(0,r.useRef)(!1),[b,y]=(0,r.useState)(!1),[v,w]=(0,r.useState)(!1),[k,x]=(0,r.useState)(""),S=(0,r.useRef)(null),_=(0,r.useRef)(""),[E,C]=(0,r.useState)("");(0,r.useEffect)((()=>{if(!Array.isArray(be.Kc))return;let e="";if(f.pathname.startsWith(d)){const t=f.pathname.substring(d.length);let n;for(const e of be.Kc){const r="string"==typeof e?e:e.path;if(t===r||t.startsWith(`${r}/`)){n=r;break}}n&&(e=n)}_.current!==e&&(h.current.delete(e),_.current=e),C(e)}),[f.pathname,d]);const T=!!be.hG&&Array.isArray(be.Kc)&&""===E,L=(0,r.useCallback)((async()=>{if(T||h.current.get(E))return;h.current.set(E,"loading"),S.current?.autocomplete.destroy(),y(!0);const[{wrappedIndexes:e,zhDictionary:t},n]=await Promise.all([(0,Se.w)(d,E),Ue()]);if(S.current=n(g.current,{hint:!1,autoselect:!0,openOnFocus:!0,cssClasses:{root:(0,ye.Z)(Fe.searchBar,{[Fe.searchBarLeft]:"left"===be.pu}),noPrefix:!0,dropdownMenu:Fe.dropdownMenu,input:Fe.input,hint:Fe.hint,suggestions:Fe.suggestions,suggestion:Fe.suggestion,cursor:Fe.cursor,dataset:Fe.dataset,empty:Fe.empty}},[{source:(0,_e.v)(e,t,be.qo),templates:{suggestion:Me,empty:Be,footer:e=>{let{query:t,isEmpty:n}=e;if(n&&(!E||!be.pQ))return;const r=(e=>{let{query:t,isEmpty:n}=e;const r=document.createElement("a"),o=new URLSearchParams;let s;if(o.set("q",t),E){const e=E&&Array.isArray(be.Kc)?be.Kc.find((e=>"string"==typeof e?e===E:e.path===E)):E,t=e?(0,$e._)(e,a).label:E;s=be.pQ&&n?(0,l.I)({id:"theme.SearchBar.seeAllOutsideContext",message:'See all results outside "{context}"'},{context:t}):(0,l.I)({id:"theme.SearchBar.searchInContext",message:'See all results within "{context}"'},{context:t})}else s=(0,l.I)({id:"theme.SearchBar.seeAll",message:"See all results"});if(!E||!Array.isArray(be.Kc)||be.pQ&&n||o.set("ctx",E),d!==i){if(!d.startsWith(i))throw new Error(`Version url '${d}' does not start with base url '${i}', this is a bug of \`@easyops-cn/docusaurus-search-local\`, please report it.`);o.set("version",d.substring(i.length))}const c=`${i}search?${o.toString()}`;return r.href=c,r.textContent=s,r.addEventListener("click",(e=>{e.ctrlKey||e.metaKey||(e.preventDefault(),S.current?.autocomplete.close(),p.push(c))})),r})({query:t,isEmpty:n}),o=document.createElement("div");return o.className=Fe.hitFooter,o.appendChild(r),o}}}]).on("autocomplete:selected",(function(e,t){let{document:{u:n,h:r},tokens:o}=t;g.current?.blur();let i=n;if(be.vc&&o.length>0){const e=new URLSearchParams;for(const t of o)e.append(qe,t);i+=`?${e.toString()}`}r&&(i+=r),p.push(i)})).on("autocomplete:closed",(()=>{g.current?.blur()})),h.current.set(E,"done"),y(!1),m.current){const e=g.current;e.value&&S.current?.autocomplete.open(),e.focus()}}),[T,E,d,i,p]);(0,r.useEffect)((()=>{if(!be.vc)return;const e=o?new URLSearchParams(f.search).getAll(qe):[];setTimeout((()=>{const t=document.querySelector("article");if(!t)return;const n=new be.vc(t);n.unmark(),0!==e.length&&n.mark(e),x(e.join(" ")),S.current?.autocomplete.setVal(e.join(" "))}))}),[o,f.search,f.pathname]);const[j,P]=(0,r.useState)(!1),R=(0,r.useCallback)((()=>{m.current=!0,L(),P(!0),t?.(!0)}),[t,L]),O=(0,r.useCallback)((()=>{P(!1),t?.(!1)}),[t]),N=(0,r.useCallback)((()=>{L()}),[L]),I=(0,r.useCallback)((e=>{x(e.target.value),e.target.value&&w(!0)}),[]),D=!!o&&/mac/i.test(navigator.userAgentData?.platform??navigator.platform);(0,r.useEffect)((()=>{if(!be.AY)return;const e=e=>{!(D?e.metaKey:e.ctrlKey)||"k"!==e.key&&"K"!==e.key||(e.preventDefault(),g.current?.focus(),R())};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[D,R]);const F=(0,r.useCallback)((()=>{const e=new URLSearchParams(f.search);e.delete(qe);const t=e.toString(),n=f.pathname+(""!=t?`?${t}`:"")+f.hash;n!=f.pathname+f.search+f.hash&&p.push(n),x(""),S.current?.autocomplete.setVal("")}),[f.pathname,f.search,f.hash,p]);return(0,u.jsxs)("div",{className:(0,ye.Z)("navbar__search",Fe.searchBarContainer,{[Fe.searchIndexLoading]:b&&v,[Fe.focused]:j}),hidden:T,dir:"ltr",children:[(0,u.jsx)("input",{placeholder:(0,l.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),"aria-label":"Search",className:"navbar__search-input",onMouseEnter:N,onFocus:R,onBlur:O,onChange:I,ref:g,value:k}),(0,u.jsx)(ze.Z,{className:Fe.searchBarLoadingRing}),be.AY&&be.t_&&(""!==k?(0,u.jsx)("button",{className:Fe.searchClearButton,onClick:F,children:"\u2715"}):o&&(0,u.jsxs)("div",{className:Fe.searchHintContainer,children:[(0,u.jsx)("kbd",{className:Fe.searchHint,children:D?"\u2318":"ctrl"}),(0,u.jsx)("kbd",{className:Fe.searchHint,children:"K"})]}))]})},Qe={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Ve(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.Z)(n,Qe.navbarSearchContainer),children:t})}var Ze=n(4104),We=n(9690);var Ge=n(298);function Ke(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find((t=>t.id===e.mainDocId))}(e)}const Ye={default:ie,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...i}=e;const{i18n:{currentLocale:a,locales:c,localeConfigs:d}}=(0,le.Z)(),p=(0,ge.l)(),{search:f,hash:g}=(0,s.TH)(),h=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${g}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===a?t?"menu__link--active":"dropdown__link--active":""}})),...r],m=t?(0,l.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[a].label;return(0,u.jsx)(fe,{...i,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(he,{className:me}),m]}),items:h})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(Ve,{className:n,children:(0,u.jsx)(He,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:i=!1}=e;const a=i?"li":"div";return(0,u.jsx)(a,{className:(0,o.Z)({navbar__item:!r&&!i,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:i}=(0,Ze.Iw)(r),a=(0,We.vY)(t,r),s=i?.path===a?.path;return null===a||a.unlisted&&!s?null:(0,u.jsx)(ie,{exact:!0,...o,isActive:()=>s||!!i?.sidebar&&i.sidebar===a.sidebar,label:n??a.id,to:a.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:i}=(0,Ze.Iw)(r),a=(0,We.oz)(t,r).link;if(!a)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(ie,{exact:!0,...o,isActive:()=>i?.sidebar===t,label:n??a.label,to:a.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const i=(0,We.lO)(r)[0],a=t??i.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return(0,u.jsx)(ie,{...o,label:a,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:i,...a}=e;const{search:c,hash:d}=(0,s.TH)(),p=(0,Ze.Iw)(n),f=(0,Ze.gB)(n),{savePreferredVersionName:g}=(0,Ge.J)(n),h=[...o,...f.map((function(e){const t=Ke(e,p);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>g(e.name)}})),...i],m=(0,We.lO)(n)[0],b=t&&h.length>1?(0,l.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):m.label,y=t&&h.length>1?void 0:Ke(m,p).path;return h.length<=1?(0,u.jsx)(ie,{...a,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...a,mobile:t,label:b,to:y,items:h,isActive:r?()=>!1:void 0})}};function Xe(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Ye[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function Je(){const e=(0,j.e)(),t=(0,w.L)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Xe,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function et(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function tt(){const e=0===(0,w.L)().navbar.items.length,t=D();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(et,{onClick:()=>t.hide()}),t.content]})}function nt(){const e=(0,j.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(F,{header:(0,u.jsx)(K,{}),primaryMenu:(0,u.jsx)(Je,{}),secondaryMenu:(0,u.jsx)(tt,{})}):null}const rt={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function ot(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.Z)("navbar-sidebar__backdrop",e.className)})}function it(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:i}}=(0,w.L)(),a=(0,j.e)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),i=(0,r.useRef)(0),a=(0,r.useCallback)((e=>{null!==e&&(i.current=e.getBoundingClientRect().height)}),[]);return(0,P.RF)(((t,r)=>{let{scrollY:a}=t;if(!e)return;if(a=s?n(!1):a+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:a,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,l.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.Z)("navbar","navbar--fixed-top",n&&[rt.navbarHideable,!d&&rt.navbarHidden],{"navbar--dark":"dark"===i,"navbar--primary":"primary"===i,"navbar-sidebar--show":a.shown}),children:[t,(0,u.jsx)(ot,{onClick:a.toggle}),(0,u.jsx)(nt,{})]})}var at=n(8780);const st={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function lt(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(l.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function ct(e){let{error:t}=e;const n=(0,at.BN)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:st.errorBoundaryError,children:n})}class ut extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const dt="right";function pt(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function ft(){const{toggle:e,shown:t}=(0,j.e)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(pt,{})})}const gt={colorModeToggle:"colorModeToggle_DEke"};function ht(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(ut,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(Xe,{...e})},t)))})}function mt(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function bt(){const e=(0,j.e)(),t=(0,w.L)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??dt)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(mt,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(ft,{}),(0,u.jsx)(W,{}),(0,u.jsx)(ht,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(ht,{items:r}),(0,u.jsx)(V,{className:gt.colorModeToggle}),!o&&(0,u.jsx)(Ve,{children:(0,u.jsx)(He,{})})]})})}function yt(){return(0,u.jsx)(it,{children:(0,u.jsx)(bt,{})})}function vt(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:i,...a}=t,s=(0,X.ZP)(n),l=(0,X.ZP)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Y.Z,{className:"footer__link-item",...r?{href:i?l:r}:{to:s},...a,children:[o,r&&!(0,J.Z)(r)&&(0,u.jsx)(te.Z,{})]})}function wt(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(vt,{item:t})},t.href??t.to)}function kt(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(wt,{item:e},t)))})]})}function xt(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(kt,{column:e},t)))})}function St(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function _t(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(vt,{item:t})}function Et(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(_t,{item:e}),t.length!==n+1&&(0,u.jsx)(St,{})]},n)))})})}function Ct(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(xt,{columns:t}):(0,u.jsx)(Et,{links:t})}var Tt=n(9965);const Lt={footerLogoLink:"footerLogoLink_BH7S"};function jt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.Cg)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(Tt.Z,{className:(0,o.Z)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function Pt(e){let{logo:t}=e;return t.href?(0,u.jsx)(Y.Z,{href:t.href,className:Lt.footerLogoLink,target:t.target,children:(0,u.jsx)(jt,{logo:t})}):(0,u.jsx)(jt,{logo:t})}function At(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Rt(e){let{style:t,links:n,logo:r,copyright:i}=e;return(0,u.jsx)("footer",{className:(0,o.Z)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||i)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),i]})]})})}function Ot(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(Rt,{style:o,links:n&&n.length>0&&(0,u.jsx)(Ct,{links:n}),logo:r&&(0,u.jsx)(Pt,{logo:r}),copyright:t&&(0,u.jsx)(At,{copyright:t})})}const Nt=r.memo(Ot),It=(0,A.Qc)([M.S,k.p,P.OC,Ge.L5,a.VC,function(e){let{children:t}=e;return(0,u.jsx)(R.n2,{children:(0,u.jsx)(j.M,{children:(0,u.jsx)(N,{children:t})})})}]);function Dt(e){let{children:t}=e;return(0,u.jsx)(It,{children:t})}var Ft=n(2503);function Mt(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(Ft.Z,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(lt,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(ct,{error:t})})]})})})}const Bt={mainWrapper:"mainWrapper_z2l0"};function zt(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,b.t)(),(0,u.jsxs)(Dt,{children:[(0,u.jsx)(a.d,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(L,{}),(0,u.jsx)(yt,{}),(0,u.jsx)("div",{id:d,className:(0,o.Z)(m.k.wrapper.main,Bt.mainWrapper,r),children:(0,u.jsx)(i.Z,{fallback:e=>(0,u.jsx)(Mt,{...e}),children:t})}),!n&&(0,u.jsx)(Nt,{})]})}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(7294);var r=n(3692),o=n(4996),i=n(2263),a=n(6668),s=n(9965),l=n(5893);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const i={light:(0,o.ZP)(t.src),dark:(0,o.ZP)(t.srcDark||t.src)},a=(0,l.jsx)(s.Z,{className:t.className,sources:i,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:a}):a}function u(e){const{siteConfig:{title:t}}=(0,i.Z)(),{navbar:{title:n,logo:s}}=(0,a.L)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,o.ZP)(s?.href||"/"),g=n?"":t,h=s?.alt??g;return(0,l.jsxs)(r.Z,{to:f,...p,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:h,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});n(7294);var r=n(5742),o=n(5893);function i(e){let{locale:t,version:n,tag:i}=e;const a=t;return(0,o.jsxs)(r.Z,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),i&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:i}),a&&(0,o.jsx)("meta",{name:"docsearch:language",content:a}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),i&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:i})]})}},9965:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7294),o=n(788),i=n(2389),a=n(2949);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(5893);function c(e){let{className:t,children:n}=e;const c=(0,i.Z)(),{colorMode:u}=(0,a.I)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const i=n({theme:e,className:(0,o.Z)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:i},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:i}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:i,...o})}})}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>c,z:()=>b});var r=n(7294),o=n(412),i=n(469),a=n(1442),s=n(5893);const l="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),i=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:i}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const i=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,a.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!i.current)return p(e,n),void(i.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function g(e){if(!o.Z.canUseDOM)return e?u:d}function h(e){let{as:t="div",collapsed:n,children:o,animation:i,onCollapseTransitionEnd:a,className:l,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:i}),(0,s.jsx)(t,{ref:u,style:c?void 0:g(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),a?.(n))},className:l,children:o})}function m(e){let{collapsed:t,...n}=e;const[o,a]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,i.Z)((()=>{t||a(!0)}),[t]),(0,i.Z)((()=>{o&&c(t)}),[o,t]),o?(0,s.jsx)(h,{...n,collapsed:l}):null}function b(e){let{lazy:t,...n}=e;const r=t?m:h;return(0,s.jsx)(r,{...n})}},9689:(e,t,n)=>{"use strict";n.d(t,{n:()=>h,p:()=>g});var r=n(7294),o=n(2389),i=n(812),a=n(902),s=n(6668),l=n(5893);const c=(0,i.WA)("docusaurus.announcement.dismiss"),u=(0,i.WA)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function g(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.L)(),t=(0,o.Z)(),[n,i]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{i(d())}),[]);const a=(0,r.useCallback)((()=>{p(!0),i(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||i(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:a})),[e,n,a])}();return(0,l.jsx)(f.Provider,{value:n,children:t})}function h(){const e=(0,r.useContext)(f);if(!e)throw new a.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>b,S:()=>m});var r=n(7294),o=n(412),i=n(902),a=n(812),s=n(6668),l=n(5893);const c=r.createContext(void 0),u="theme",d=(0,a.WA)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,g=e=>o.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),h=e=>{d.set(f(e))};function m(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[o,i]=(0,r.useState)(g(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const a=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(i(t),o&&h(t)):(i(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&a(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,a]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:a(null)};return e.addListener(r),()=>e.removeListener(r)}),[a,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:a,get isDarkTheme(){return o===p.dark},setLightTheme(){a(p.light)},setDarkTheme(){a(p.dark)}})),[o,a])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(c);if(null==e)throw new i.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>p,e:()=>f});var r=n(7294),o=n(3102),i=n(7524),a=n(1980),s=n(6668),l=n(902),c=n(5893);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,o.HY)(),{items:t}=(0,s.L)().navbar;return 0===t.length&&!e.component}(),t=(0,i.i)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,a.Rb)((()=>{if(l)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:l})),[e,n,u,l])}function p(e){let{children:t}=e;const n=d();return(0,c.jsx)(u.Provider,{value:n,children:t})}function f(){const e=r.useContext(u);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>c,n2:()=>s});var r=n(7294),o=n(902),i=n(5893);const a=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,i.jsx)(a.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(a);if(!e)throw new o.i6("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const i=(0,r.useContext)(a);if(!i)throw new o.i6("NavbarSecondaryMenuContentProvider");const[,s]=i,l=(0,o.Ql)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>o,t:()=>i});var r=n(7294);const o="navigation-with-keyboard";function i(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>s});var r=n(7294),o=n(412);const i={desktop:"desktop",mobile:"mobile",ssr:"ssr"},a=996;function s(e){let{desktopBreakpoint:t=a}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(function(e){if(!o.Z.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?i.desktop:i.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},1980:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>a,_X:()=>l});var r=n(7294),o=n(6550),i=n(902);function a(e){!function(e){const t=(0,o.k6)(),n=(0,i.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){const t=(0,o.k6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}function l(e){return s((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},7392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function o(e){return Array.from(new Set(e))}function i(e,t){const n={};let r=0;for(const o of e){const e=t(o,r);n[e]??=[],n[e].push(o),r+=1}return n}n.d(t,{jj:()=>o,lx:()=>r,vM:()=>i})},8264:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>u,VC:()=>f});var r=n(7294),o=n(788),i=n(5742),a=n(5102),s=n(4996),l=n(2263);var c=n(5893);function u(e){let{title:t,description:n,keywords:r,image:o,children:a}=e;const u=function(e){const{siteConfig:t}=(0,l.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.Cg)(),p=o?d(o,{absolute:!0}):void 0;return(0,c.jsxs)(i.Z,{children:[t&&(0,c.jsx)("title",{children:u}),t&&(0,c.jsx)("meta",{property:"og:title",content:u}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,c.jsx)("meta",{property:"og:image",content:p}),p&&(0,c.jsx)("meta",{name:"twitter:image",content:p}),a]})}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const a=r.useContext(d),s=(0,o.Z)(a,t);return(0,c.jsxs)(d.Provider,{value:s,children:[(0,c.jsx)(i.Z,{children:(0,c.jsx)("html",{className:s})}),n]})}function f(e){let{children:t}=e;const n=(0,a.Z)(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(p,{className:(0,o.Z)(r,i),children:t})}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>s,Qc:()=>u,Ql:()=>c,i6:()=>l,zX:()=>a});var r=n(7294),o=n(469),i=n(5893);function a(e){const t=(0,r.useRef)(e);return(0,o.Z)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,o.Z)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,i.jsx)(i.Fragment,{children:e.reduceRight(((e,t)=>(0,i.jsx)(t,{children:e})),n)})}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>a,Ns:()=>s});var r=n(7294),o=n(723),i=n(2263);function a(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,i.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>h,OC:()=>u,RF:()=>f,o5:()=>g});var r=n(7294),o=n(412),i=n(2389),a=n(469),s=n(902),l=n(5893);const c=r.createContext(void 0);function u(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function d(){const e=(0,r.useContext)(c);if(null==e)throw new s.i6("ScrollControllerProvider");return e}const p=()=>o.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),o=(0,r.useRef)(p()),i=(0,s.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=p();i(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[i,n,...t])}function g(){const e=d(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),o=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,a.Z)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:o}}function h(){const e=(0,r.useRef)(null),t=(0,i.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&ot&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},812:(e,t,n)=>{"use strict";n.d(t,{WA:()=>u,Nk:()=>d});var r=n(7294);const o=JSON.parse('{"d":"localStorage","u":""}'),i=o.d;function a(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const i=document.createEvent("StorageEvent");i.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(i)}function s(e){if(void 0===e&&(e=i),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const c={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){const n=`${e}${o.u}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const r=s(t?.persistence);return null===r?c:{get:()=>{try{return r.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=r.getItem(n);r.setItem(n,e),a({key:n,oldValue:t,newValue:e,storage:r})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=r.getItem(n);r.removeItem(n),a({key:n,oldValue:e,newValue:null,storage:r})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===r&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}function d(e,t){const n=(0,r.useRef)((()=>null===e?c:u(e,t))).current(),o=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,r.useSyncExternalStore)(o,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>a});var r=n(2263),o=n(6550),i=n(8780);function a(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:a,currentLocale:s}}=(0,r.Z)(),{pathname:l}=(0,o.TH)(),c=(0,i.Do)(l,{trailingSlash:n,baseUrl:e}),u=s===a?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===a?`${u}`:`${u}${e}/`}(n)}${d}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>a});var r=n(7294),o=n(6550),i=n(902);function a(e){const t=(0,o.TH)(),n=(0,i.D9)(t),a=(0,i.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&a({location:t,previousLocation:n})}),[a,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>o});var r=n(2263);function o(){return(0,r.Z)().siteConfig.themeConfig}},8802:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=o,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),s="/"===a||a===r?a:(l=a,c=n,c?o(l):i(l));var l,c;return e.replace(a,s)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=i;const r=n(5913);function o(e){return e.endsWith("/")?e:`${e}/`}function i(e){return(0,r.removeSuffix)(e,"/")}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},8780:(e,t,n)=>{"use strict";t.BN=t.Do=t.uR=void 0;const r=n(7582);t.uR="__blog-post-container";var o=n(8802);Object.defineProperty(t,"Do",{enumerable:!0,get:function(){return r.__importDefault(o).default}});var i=n(5913);var a=n(4143);Object.defineProperty(t,"BN",{enumerable:!0,get:function(){return a.getErrorCausalChain}})},5913:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){if(""===t)return e;return e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},311:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(7294);var r=n(6010);const o={loadingRing:"loadingRing_RJI3","loading-ring":"loading-ring_FB5o"};var i=n(5893);function a(e){let{className:t}=e;return(0,i.jsxs)("div",{className:(0,r.Z)(o.loadingRing,t),children:[(0,i.jsx)("div",{}),(0,i.jsx)("div",{}),(0,i.jsx)("div",{}),(0,i.jsx)("div",{})]})}},22:(e,t,n)=>{"use strict";n.d(t,{w:()=>s});var r=n(1336),o=n.n(r),i=n(1029);const a=new Map;function s(e,t){const n=`${e}${t}`;let r=a.get(n);return r||(r=async function(e,t){{const n=`${e}${i.J.replace("{dir}",t?`-${t.replace(/\//g,"-")}`:"")}`;if(new URL(n,location.origin).origin!==location.origin)throw new Error("Unexpected version url");const r=await(await fetch(n)).json(),a=r.map(((e,t)=>{let{documents:n,index:r}=e;return{type:t,documents:n,index:o().Index.load(r)}})),s=r.reduce(((e,t)=>{for(const n of t.index.invertedIndex)/\p{Unified_Ideograph}/u.test(n[0][0])&&e.add(n[0]);return e}),new Set);return{wrappedIndexes:a,zhDictionary:Array.from(s)}}return{wrappedIndexes:[],zhDictionary:[]}}(e,t),a.set(n,r)),r}},8202:(e,t,n)=>{"use strict";n.d(t,{v:()=>c});var r=n(1336),o=n.n(r);var i=n(1029);function a(e){return s(e).concat(s(e.filter((e=>{const t=e[e.length-1];return!t.trailing&&t.maybeTyping})),!0))}function s(e,t){return e.map((e=>({tokens:e.map((e=>e.value)),term:e.map((e=>({value:e.value,presence:o().Query.presence.REQUIRED,wildcard:(t?e.trailing||e.maybeTyping:e.trailing)?o().Query.wildcard.TRAILING:o().Query.wildcard.NONE})))})))}var l=n(3545);function c(e,t,n){return function(r,s){const c=function(e,t){if(1===t.length&&["ja","jp","th"].includes(t[0]))return o()[t[0]].tokenizer(e).map((e=>e.toString()));let n=/[^-\s]+/g;return t.includes("zh")&&(n=/\w+|\p{Unified_Ideograph}+/gu),e.toLowerCase().match(n)||[]}(r,i.dK);if(0===c.length)return void s([]);const u=function(e,t){const n=function(e,t){const n=[];return function e(r,o){if(0===r.length)return void n.push(o);const i=r[0];if(/\p{Unified_Ideograph}/u.test(i)){const n=function(e,t){const n=[];return function e(r,o){let i=0,a=!1;for(const s of t)if(r.substr(0,s.length)===s){const t={missed:o.missed,term:o.term.concat({value:s})};r.length>s.length?e(r.substr(s.length),t):n.push(t),a=!0}else for(let t=s.length-1;t>i;t-=1){const l=s.substr(0,t);if(r.substr(0,t)===l){i=t;const s={missed:o.missed,term:o.term.concat({value:l,trailing:!0})};r.length>t?e(r.substr(t),s):n.push(s),a=!0;break}}a||(r.length>0?e(r.substr(1),{missed:o.missed+1,term:o.term}):o.term.length>0&&n.push(o))}(e,{missed:0,term:[]}),n.sort(((e,t)=>{const n=e.missed>0?1:0,r=t.missed>0?1:0;return n!==r?n-r:e.term.length-t.term.length})).map((e=>e.term))}(i,t);for(const t of n){const n=o.concat(...t);e(r.slice(1),n)}}else{const t=o.concat({value:i});e(r.slice(1),t)}}(e,[]),n}(e,t);if(0===n.length)return[{tokens:e,term:e.map((e=>({value:e,presence:o().Query.presence.REQUIRED,wildcard:o().Query.wildcard.LEADING|o().Query.wildcard.TRAILING})))}];for(const o of n)o[o.length-1].maybeTyping=!0;const r=[];for(const a of i.dK)if("en"===a)i._k||r.unshift(o().stopWordFilter);else{const e=o()[a];e.stopWordFilter&&r.unshift(e.stopWordFilter)}let s;if(r.length>0){const e=e=>r.reduce(((e,t)=>e.filter((e=>t(e.value)))),e);s=[];const t=[];for(const r of n){const n=e(r);s.push(n),n.length0&&t.push(n)}n.push(...t)}else s=n.slice();const l=[];for(const o of s)if(o.length>2)for(let e=o.length-1;e>=0;e-=1)l.push(o.slice(0,e).concat(o.slice(e+1)));return a(n).concat(a(l))}(c,t),d=[];e:for(const{term:t,tokens:o}of u)for(const{documents:r,index:i,type:a}of e)if(d.push(...i.query((e=>{for(const n of t)e.term(n.value,{wildcard:n.wildcard,presence:n.presence})})).slice(0,n).filter((e=>!d.some((t=>t.document.i.toString()===e.ref)))).slice(0,n-d.length).map((t=>{const n=r.find((e=>e.i.toString()===t.ref));return{document:n,type:a,page:a!==l.P.Title&&e[0].documents.find((e=>e.i===n.p)),metadata:t.matchData.metadata,tokens:o,score:t.score}}))),d.length>=n)break e;!function(e){e.forEach(((e,t)=>{e.index=t})),e.sort(((t,n)=>{let r=t.type!==l.P.Heading&&t.type!==l.P.Content&&t.type!==l.P.Description||!t.page?t.index:e.findIndex((e=>e.document===t.page)),o=n.type!==l.P.Heading&&n.type!==l.P.Content&&n.type!==l.P.Description||!n.page?n.index:e.findIndex((e=>e.document===n.page));if(-1===r&&(r=t.index),-1===o&&(o=n.index),r===o){const e=(0===n.type?1:0)-(0===t.type?1:0);return 0===e?t.index-n.index:e}return r-o}))}(d),function(e){e.forEach(((t,n)=>{n>0&&t.page&&e.slice(0,n).some((e=>(e.type===l.P.Keywords?e.page:e.document)===t.page))&&(n{"use strict";function r(e){return e.join(" \u203a ")}n.d(t,{e:()=>r})},1690:(e,t,n)=>{"use strict";function r(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}n.d(t,{X:()=>r})},1073:(e,t,n)=>{"use strict";function r(e,t){const n=[];for(const r of Object.values(e))r[t]&&n.push(...r[t].position);return n.sort(((e,t)=>e[0]-t[0]||t[1]-e[1]))}n.d(t,{m:()=>r})},2539:(e,t,n)=>{"use strict";n.d(t,{C:()=>o});var r=n(1690);function o(e,t,n){const i=[];for(const a of t){const n=e.toLowerCase().indexOf(a);if(n>=0){n>0&&i.push(o(e.substr(0,n),t)),i.push(`${(0,r.X)(e.substr(n,a.length))}`);const s=n+a.length;s${(0,r.X)(e)}`:(0,r.X)(e):i.join("")}},726:(e,t,n)=>{"use strict";n.d(t,{o:()=>l});var r=n(1690),o=n(2539);const i=/\w+|\p{Unified_Ideograph}/u;function a(e){const t=[];let n=0,r=e;for(;r.length>0;){const o=r.match(i);if(!o){t.push(r);break}o.index>0&&t.push(r.substring(0,o.index)),t.push(o[0]),n+=o.index+o[0].length,r=e.substring(n)}return t}var s=n(1029);function l(e,t,n,i){void 0===i&&(i=s.Hk);const{chunkIndex:l,chunks:c}=function(e,t,n){const i=[];let s=0,l=0,c=-1;for(;sl){const t=a(e.substring(l,u)).map((e=>({html:(0,r.X)(e),textLength:e.length})));for(const e of t)i.push(e)}-1===c&&(c=i.length),l=u+d,i.push({html:(0,o.C)(e.substring(u,l),n,!0),textLength:d})}}if(l({html:(0,r.X)(e),textLength:e.length})));for(const e of t)i.push(e)}return{chunkIndex:c,chunks:i}}(e,t,n),u=c.slice(0,l),d=c[l],p=[d.html],f=c.slice(l+1);let g=d.textLength,h=0,m=0,b=!1,y=!1;for(;g0){const e=u.pop();g+e.textLength<=i?(p.unshift(e.html),h+=e.textLength,g+=e.textLength):(b=!0,u.length=0)}else{if(!(f.length>0))break;{const e=f.shift();g+e.textLength<=i?(p.push(e.html),m+=e.textLength,g+=e.textLength):(y=!0,f.length=0)}}return(b||u.length>0)&&p.unshift("\u2026"),(y||f.length>0)&&p.push("\u2026"),p.join("")}},51:(e,t,n)=>{"use strict";function r(e,t){if("string"==typeof e)return{label:e,path:e};{const{label:n,path:r}=e;return"string"==typeof n?{label:n,path:r}:Object.prototype.hasOwnProperty.call(n,t)?{label:n[t],path:r}:{label:r,path:r}}}n.d(t,{_:()=>r})},1029:(e,t,n)=>{"use strict";n.d(t,{vc:()=>i,gQ:()=>f,H6:()=>c,hG:()=>m,l9:()=>g,dK:()=>r,_k:()=>o,pu:()=>p,AY:()=>u,t_:()=>d,Kc:()=>h,J:()=>a,Hk:()=>l,qo:()=>s,pQ:()=>b});n(1336);const r=["en"],o=!1,i=null,a="search-index{dir}.json?_=816c3ebe",s=8,l=50,c=!1,u=!0,d=!0,p="right",f=void 0,g=!0,h=null,m=!1,b=!1},3545:(e,t,n)=>{"use strict";var r;n.d(t,{P:()=>r}),function(e){e[e.Title=0]="Title",e[e.Heading=1]="Heading",e[e.Description=2]="Description",e[e.Keywords=3]="Keywords",e[e.Content=4]="Content"}(r||(r={}))},6010:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;to});const o=function(){for(var e,t,n=0,o="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>f,PP:()=>L,Ep:()=>p});var r=n(7462);function o(e){return"/"===e.charAt(0)}function i(e,t){for(var n=t,r=n+1,o=e.length;r=0;p--){var f=a[p];"."===f?i(a,p):".."===f?(i(a,p),d++):d&&(i(a,p),d--)}if(!c)for(;d--;d)a.unshift("..");!c||""===a[0]||a[0]&&o(a[0])||a.unshift("");var g=a.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};var s=n(8776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function f(e,t,n,o){var i;"string"==typeof e?(i=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var i=t.indexOf("?");return-1!==i&&(n=t.substr(i),t=t.substr(0,i)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),i.state=t):(void 0===(i=(0,r.Z)({},e)).pathname&&(i.pathname=""),i.search?"?"!==i.search.charAt(0)&&(i.search="?"+i.search):i.search="",i.hash?"#"!==i.hash.charAt(0)&&(i.hash="#"+i.hash):i.hash="",void 0!==t&&void 0===i.state&&(i.state=t));try{i.pathname=decodeURI(i.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+i.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(i.key=n),o?i.pathname?"/"!==i.pathname.charAt(0)&&(i.pathname=a(i.pathname,o.pathname)):i.pathname=o.pathname:i.pathname||(i.pathname="/"),i}function g(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var i="function"==typeof e?e(t,n):e;"string"==typeof i?"function"==typeof r?r(i,o):o(!0):o(!1!==i)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,h(),w.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(w.entries[w.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},i={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},a={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?a:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=a;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(g){var o=f(n);o&&o!==g&&e(t,o,r)}var a=u(n);d&&(a=a.concat(d(n)));for(var s=l(t),h=l(n),m=0;m{"use strict";e.exports=function(e,t,n,r,o,i,a,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,i,a,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},1336:(e,t,n)=>{var r,o;!function(){var i,a,s,l,c,u,d,p,f,g,h,m,b,y,v,w,k,x,S,_,E,C,T,L,j,P,A,R,O,N,I=function(e){var t=new I.Builder;return t.pipeline.add(I.trimmer,I.stopWordFilter,I.stemmer),t.searchPipeline.add(I.stemmer),e.call(t,t),t.build()};I.version="2.3.9",I.utils={},I.utils.warn=(i=this,function(e){i.console&&console.warn&&console.warn(e)}),I.utils.asString=function(e){return null==e?"":e.toString()},I.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var l=I.utils.clone(t)||{};l.position=[a,s],l.index=o.length,o.push(new I.Token(n.slice(a,i),l))}a=i+1}}return o},I.tokenizer.separator=/[\s\-]+/,I.Pipeline=function(){this._stack=[]},I.Pipeline.registeredFunctions=Object.create(null),I.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&I.utils.warn("Overwriting existing registered function: "+t),e.label=t,I.Pipeline.registeredFunctions[e.label]=e},I.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||I.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},I.Pipeline.load=function(e){var t=new I.Pipeline;return e.forEach((function(e){var n=I.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},I.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){I.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},I.Pipeline.prototype.after=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},I.Pipeline.prototype.before=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},I.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},I.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(ie&&(n=o),i!=e);)r=n-t,o=t+Math.floor(r/2),i=this.elements[2*o];return i==e||i>e?2*o:is?c+=2:a==s&&(t+=n[l+1]*r[c+1],l+=2,c+=2);return t},I.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},I.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var i,a=o.str.charAt(0);a in o.node.edges?i=o.node.edges[a]:(i=new I.TokenSet,o.node.edges[a]=i),1==o.str.length&&(i.final=!0),r.push({node:i,editsRemaining:o.editsRemaining,str:o.str.slice(1)})}if(0!=o.editsRemaining){if("*"in o.node.edges)var s=o.node.edges["*"];else{s=new I.TokenSet;o.node.edges["*"]=s}if(0==o.str.length&&(s.final=!0),r.push({node:s,editsRemaining:o.editsRemaining-1,str:o.str}),o.str.length>1&&r.push({node:o.node,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)}),1==o.str.length&&(o.node.final=!0),o.str.length>=1){if("*"in o.node.edges)var l=o.node.edges["*"];else{l=new I.TokenSet;o.node.edges["*"]=l}1==o.str.length&&(l.final=!0),r.push({node:l,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)})}if(o.str.length>1){var c,u=o.str.charAt(0),d=o.str.charAt(1);d in o.node.edges?c=o.node.edges[d]:(c=new I.TokenSet,o.node.edges[d]=c),1==o.str.length&&(c.final=!0),r.push({node:c,editsRemaining:o.editsRemaining-1,str:u+o.str.slice(2)})}}}return n},I.TokenSet.fromString=function(e){for(var t=new I.TokenSet,n=t,r=0,o=e.length;r=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},I.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},I.Index.prototype.search=function(e){return this.query((function(t){new I.QueryParser(e,t).parse()}))},I.Index.prototype.query=function(e){for(var t=new I.Query(this.fields),n=Object.create(null),r=Object.create(null),o=Object.create(null),i=Object.create(null),a=Object.create(null),s=0;s1?1:e},I.Builder.prototype.k1=function(e){this._k1=e},I.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var o=0;o=this.length)return I.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},I.QueryLexer.prototype.width=function(){return this.pos-this.start},I.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},I.QueryLexer.prototype.backup=function(){this.pos-=1},I.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=I.QueryLexer.EOS&&this.backup()},I.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(I.QueryLexer.TERM)),e.ignore(),e.more())return I.QueryLexer.lexText},I.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.EDIT_DISTANCE),I.QueryLexer.lexText},I.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.BOOST),I.QueryLexer.lexText},I.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(I.QueryLexer.TERM)},I.QueryLexer.termSeparator=I.tokenizer.separator,I.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==I.QueryLexer.EOS)return I.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return I.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if(t.match(I.QueryLexer.termSeparator))return I.QueryLexer.lexTerm}else e.escapeCharacter()}},I.QueryParser=function(e,t){this.lexer=new I.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},I.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=I.QueryParser.parseClause;e;)e=e(this);return this.query},I.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},I.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},I.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},I.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case I.QueryLexer.PRESENCE:return I.QueryParser.parsePresence;case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new I.QueryParseError(n,t.start,t.end)}},I.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=I.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=I.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new I.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new I.QueryParseError(n,t.start,t.end)}switch(r.type){case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new I.QueryParseError(n,r.start,r.end)}}},I.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var o=e.peekLexeme();if(null==o){r="expecting term, found nothing";throw new I.QueryParseError(r,t.start,t.end)}if(o.type===I.QueryLexer.TERM)return I.QueryParser.parseTerm;r="expecting term, found '"+o.type+"'";throw new I.QueryParseError(r,o.start,o.end)}},I.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new I.QueryParseError(r,n.start,n.end)}else e.nextClause()}},I.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new I.QueryParseError(r,o.start,o.end)}else e.nextClause()}},I.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new I.QueryParseError(r,o.start,o.end)}else e.nextClause()}},void 0===(o="function"==typeof(r=function(){return I})?r.call(t,n,t,e):r)||(e.exports=o)}()},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function o(e,t,n){return en?n:e}function i(e){return 100*(-1+e)}function a(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+i(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+i(e)+"%,0)"}:{"margin-left":i(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var i=n.render(!t),c=i.querySelector(r.barSelector),u=r.speed,d=r.easing;return i.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,a(e,u,d)),1===e?(l(i,{transition:"none",opacity:1}),i.offsetWidth,setTimeout((function(){l(i,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,a=t.querySelector(r.barSelector),s=e?"-100":i(n.status||0),c=document.querySelector(r.parent);return l(a,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,i=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+i)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function i(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&i(e,n,r);else i(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},9901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.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=i.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=i[o],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),g=p.indexOf(f);if(g>-1){++o;var h=p.substring(0,g),m=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(g+f.length),y=[];h&&y.push.apply(y,a([h])),y.push(m),b&&y.push.apply(y,a([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(y)):c.content=y}}else c.content&&a(c.content)}return s}(n.tokens)}}}})}(Prism)},6726:(e,t,n)=>{var r={"./":2885};function o(e){var t=i(e);return n(t)}function i(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=i,e.exports=o,o.id=6726},6500:(e,t,n)=>{var r={"./":2885};function o(e){var t=i(e);return n(t)}function i(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=i,e.exports=o,o.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var s={},l=e[r];if(l){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in s))for(var a in o(t,i),s[t]=!0,n[t])s[a]=!0}t(l.require,c),t(l.optional,c),t(l.modify,c)}n[r]=s,i.pop()}}return function(e){var t=n[e];return t||(o(e,r),t=n[e]),t}}function o(e){for(var t in e)return!0;return!1}return function(i,a,s){var l=function(e){var t={};for(var n in e){var r=e[n];for(var o in r)if("meta"!=o){var i=r[o];t[o]="string"==typeof i?{title:i}:i}}return t}(i),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var o in n={},e){var i=e[o];t(i&&i.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+o+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+o+" because it is a component.");n[t]=o}))}return n[r]||r}}(l);a=a.map(c),s=(s||[]).map(c);var u=n(a),d=n(s);a.forEach((function e(n){var r=l[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var p,f=r(l),g=u;o(g);){for(var h in p={},g){var m=l[h];t(m&&m.modify,(function(e){e in d&&(p[e]=!0)}))}for(var b in d)if(!(b in u))for(var y in f(b))if(y in u){p[b]=!0;break}for(var v in g=p)u[v]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,o){var i=o?o.series:void 0,a=o?o.parallel:e,s={},l={};function c(e){if(e in s)return s[e];l[e]=!0;var o,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)o=r(e);else{var p=a(u.map((function(e){var t=c(e);return delete l[e],t})));i?o=i(p,(function(){return r(e)})):r(e)}return s[e]=o}for(var u in n)c(u);var d=[];for(var p in l)d.push(s[p]);return a(d)}(f,u,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function o(){}function i(){}i.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,i,a){if(a!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:i,resetWarningCache:o};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n