├── insecure_keys └── .keep ├── ci ├── pinned_vagrant_boxes.txt ├── update_versions.sh ├── check_aio.sh └── update_distros.sh ├── .shellspec ├── .jscpd.json ├── mlc_config.json ├── etc └── kolla │ ├── config │ ├── cinder │ │ ├── cinder-api.conf │ │ └── cinder-volume.conf │ ├── glance │ │ └── glance-api.conf │ └── nova │ │ ├── nova-scheduler.conf │ │ ├── nova-compute.conf │ │ └── nova-api.conf │ ├── neutron │ └── ml2_conf.ini │ └── passwords.yml ├── .editorconfig ├── doc ├── img │ ├── skydive_aio.png │ ├── containers_noha.png │ └── diagram_distributed.png └── src │ └── neutron │ └── network_types.md ├── .textlintrc ├── requirements ├── 2023.2 │ ├── pyproject.toml │ ├── debian_12.txt │ ├── ubuntu_22.txt │ ├── rocky_9.txt │ └── debian_11.txt ├── 2024.1 │ ├── pyproject.toml │ ├── debian_12.txt │ ├── ubuntu_22.txt │ ├── debian_11.txt │ └── rocky_9.txt ├── 2025.1 │ ├── pyproject.toml │ ├── rocky_9.txt │ ├── debian_12.txt │ └── ubuntu_24.txt ├── 2024.2 │ ├── pyproject.toml │ ├── debian_12.txt │ ├── rocky_9.txt │ └── ubuntu_22.txt └── base.sh ├── .gitignore ├── bindep.txt ├── releases.txt ├── .editorconfig-checker.json ├── actionlint.yml ├── .yamlfmt ├── .yaml-lint.yml ├── .rubocop.yml ├── .spellcheck.yml ├── .github ├── .wordlist.txt ├── workflows │ ├── rebase.yml │ ├── spell.yml │ ├── diagram.yml │ ├── distros.yml │ ├── README.md │ ├── on-demand.yml │ ├── on-demand_noha.yml │ ├── scheduled_aio.yml │ ├── linter.yml │ ├── build.yml │ ├── on-demand_aio.yml │ └── update.yml ├── actions │ ├── docker-image │ │ └── action.yml │ └── vagrant-setup │ │ └── action.yml └── prompts │ └── sembr.prompt.md ├── tox.ini ├── controller.sh ├── scripts ├── cinder.sh ├── neutron_trunk.sh └── magnum.sh ├── spec ├── run_kaction_spec.sh ├── undercloud_spec.sh └── commons_spec.sh ├── samples ├── README.md ├── distributed │ ├── README.md │ ├── pdf.yml │ └── Vagrantfile ├── aio │ ├── README.md │ ├── Vagrantfile │ └── hosts.ini └── noha │ ├── README.md │ ├── Vagrantfile │ └── tail.ini ├── distros_supported.yml ├── Makefile ├── compute.sh ├── run_kaction.sh ├── defaults.env ├── upgrade.sh ├── commons.sh ├── node.sh ├── registry.sh ├── README.md ├── undercloud.sh └── install.sh /insecure_keys/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ci/pinned_vagrant_boxes.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.shellspec: -------------------------------------------------------------------------------- 1 | --shell bash 2 | --env __name__=__test__ 3 | -------------------------------------------------------------------------------- /.jscpd.json: -------------------------------------------------------------------------------- 1 | { 2 | "ignore": ["requirements/**"] 3 | } 4 | -------------------------------------------------------------------------------- /mlc_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "aliveStatusCodes": [429, 200, 403] 3 | } 4 | -------------------------------------------------------------------------------- /etc/kolla/config/cinder/cinder-api.conf: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | default_volume_type = lvm-1 3 | -------------------------------------------------------------------------------- /etc/kolla/config/cinder/cinder-volume.conf: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | default_volume_type = lvm-1 3 | -------------------------------------------------------------------------------- /etc/kolla/neutron/ml2_conf.ini: -------------------------------------------------------------------------------- 1 | [ml2_type_vlan] 2 | network_vlan_ranges = physnet1:100:500 3 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.sh] 2 | indent_style = space 3 | indent_size = 4 4 | 5 | [spec/**] 6 | ignore = true 7 | -------------------------------------------------------------------------------- /doc/img/skydive_aio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electrocucaracha/openstack-multinode/HEAD/doc/img/skydive_aio.png -------------------------------------------------------------------------------- /etc/kolla/config/glance/glance-api.conf: -------------------------------------------------------------------------------- 1 | [lvm1] 2 | cinder_volume_type = lvm-1 3 | description = LVM based cinder store 4 | -------------------------------------------------------------------------------- /doc/img/containers_noha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electrocucaracha/openstack-multinode/HEAD/doc/img/containers_noha.png -------------------------------------------------------------------------------- /doc/img/diagram_distributed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electrocucaracha/openstack-multinode/HEAD/doc/img/diagram_distributed.png -------------------------------------------------------------------------------- /.textlintrc: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "rules": { 4 | "terminology": { 5 | "exclude": [ 6 | "Node(?:js)?", 7 | ] 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /requirements/2023.2/pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "Bobcat" 3 | version= "2023.2" 4 | requires-python = ">3.9" 5 | dependencies = [ 6 | "ansible-core>=2.14,<2.16", # GPLv3 7 | "kolla-ansible<18.0", # Apache-2.0 8 | ] 9 | -------------------------------------------------------------------------------- /requirements/2024.1/pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name ="Caracal" 3 | version= "2024.1" 4 | requires-python = ">3.9" 5 | dependencies = [ 6 | "ansible-core>=2.15,<2.16.99", # GPLv3 7 | "kolla-ansible<19.0", # Apache-2.0 8 | ] 9 | -------------------------------------------------------------------------------- /requirements/2025.1/pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name ="Epoxy" 3 | version= "2025.1" 4 | requires-python = ">3.10" 5 | dependencies = [ 6 | "ansible-core>=2.16,<2.17.99", # GPLv3 7 | "kolla-ansible<21.0", # Apache-2.0 8 | ] 9 | -------------------------------------------------------------------------------- /requirements/2024.2/pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name ="Dalmatian" 3 | version= "2024.2" 4 | requires-python = ">3.10" 5 | dependencies = [ 6 | "ansible-core>=2.16,<2.17.99", # GPLv3 7 | "kolla-ansible<20.0", # Apache-2.0 8 | ] 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vagrant 2 | *.log 3 | .tox/ 4 | sources.list 5 | *.tar.gz 6 | output.json 7 | *.img 8 | *.vdi 9 | samples/noha/hosts.ini 10 | samples/noha/header.ini 11 | *.dic 12 | insecure_keys/key* 13 | node_modules/ 14 | package*.json 15 | -------------------------------------------------------------------------------- /etc/kolla/config/nova/nova-scheduler.conf: -------------------------------------------------------------------------------- 1 | [filter_scheduler] 2 | enabled_filters = ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,PciPassthroughFilter 3 | available_filters = nova.scheduler.filters.all_filters 4 | -------------------------------------------------------------------------------- /bindep.txt: -------------------------------------------------------------------------------- 1 | libvirt-client [compute platform:rpm] 2 | python3-docker [compute platform:dpkg] 3 | sshpass [undercloud] 4 | pip [undercloud] 5 | gcc [undercloud] 6 | git [undercloud] 7 | python3-dev [undercloud platform:dpkg] 8 | python3-urllib3 [platform:debian] 9 | python3-idna [platform:debian] 10 | python3-certifi [platform:debian] 11 | -------------------------------------------------------------------------------- /etc/kolla/config/nova/nova-compute.conf: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | force_config_drive = true 3 | 4 | [pci] 5 | passthrough_whitelist = [{ "vendor_id":"8086", "product_id":"0434" },{ "vendor_id":"8086", "product_id":"0435" },{ "vendor_id":"8086", "product_id":"37c8" },{ "vendor_id":"8086", "product_id":"6f54" },{ "vendor_id":"8086", "product_id":"19e2" }] 6 | -------------------------------------------------------------------------------- /releases.txt: -------------------------------------------------------------------------------- 1 | 2025.1 2 | 2024.2 3 | 2024.1 4 | 2023.2 5 | 2023.1 6 | zed 7 | yoga 8 | xena 9 | wallaby 10 | victoria 11 | ussuri 12 | train 13 | stein 14 | rocky 15 | queens 16 | pike 17 | ocata 18 | newton 19 | mitaka 20 | liberty 21 | kilo 22 | juno 23 | icehouse 24 | havana 25 | grizzly 26 | folsom 27 | essex 28 | diablo 29 | cactus 30 | bexar 31 | austin 32 | -------------------------------------------------------------------------------- /.editorconfig-checker.json: -------------------------------------------------------------------------------- 1 | { 2 | "Verbose": false, 3 | "Debug": false, 4 | "IgnoreDefaults": false, 5 | "SpacesAfterTabs": false, 6 | "NoColor": false, 7 | "Exclude": [], 8 | "AllowedContentTypes": [], 9 | "PassedFiles": [], 10 | "Disable": { 11 | "EndOfLine": false, 12 | "Indentation": false, 13 | "IndentSize": false, 14 | "InsertFinalNewline": false, 15 | "TrimTrailingWhitespace": false, 16 | "MaxLineLength": false 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /actionlint.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2025 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | self-hosted-runner: 11 | labels: 12 | - vm-self-hosted 13 | -------------------------------------------------------------------------------- /etc/kolla/config/nova/nova-api.conf: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | cpu_allocation_ratio = 16.0 3 | ram_allocation_ratio = 1.5 4 | 5 | [pci] 6 | alias = { "vendor_id":"8086", "product_id":"0434", "device_type":"type-PCI", "name":"DH895xCC" } 7 | alias = { "vendor_id":"8086", "product_id":"0435", "device_type":"type-PCI", "name":"DH895xCC" } 8 | alias = { "vendor_id":"8086", "product_id":"37c8", "device_type":"type-PCI", "name":"C62x" } 9 | alias = { "vendor_id":"8086", "product_id":"6f54", "device_type":"type-PCI", "name":"D15xx" } 10 | alias = { "vendor_id":"8086", "product_id":"19e2", "device_type":"type-PCI", "name":"C3xxx" } 11 | -------------------------------------------------------------------------------- /.yamlfmt: -------------------------------------------------------------------------------- 1 | # SPDX-license-identifier: Apache-2.0 2 | ############################################################################## 3 | # Copyright (c) 2020 4 | # All rights reserved. This program and the accompanying materials 5 | # are made available under the terms of the Apache License, Version 2.0 6 | # which accompanies this distribution, and is available at 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | ############################################################################## 9 | formatter: 10 | type: basic 11 | include_document_start: true 12 | pad_line_comments: 2 13 | max_line_length: 160 14 | -------------------------------------------------------------------------------- /.yaml-lint.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2022 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | extends: default 11 | yaml-files: 12 | - "*.yml" 13 | ignore: | 14 | .tox/ 15 | rules: 16 | line-length: disable 17 | comments: disable 18 | -------------------------------------------------------------------------------- /.rubocop.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2021 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | AllCops: 11 | NewCops: enable 12 | Metrics/BlockLength: 13 | Enabled: false 14 | Layout/LineLength: 15 | Enabled: false 16 | Style/StringLiterals: 17 | EnforcedStyle: double_quotes # https://github.com/rubocop/rubocop/issues/5306 18 | -------------------------------------------------------------------------------- /.spellcheck.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2021 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | matrix: 11 | - name: markdown 12 | dictionary: 13 | wordlists: 14 | - .github/.wordlist.txt 15 | pipeline: 16 | - pyspelling.filters.markdown: 17 | sources: 18 | - "**/*.md" 19 | aspell: 20 | ignore-case: true 21 | -------------------------------------------------------------------------------- /.github/.wordlist.txt: -------------------------------------------------------------------------------- 1 | aio 2 | Ansible 3 | BCM 4 | boyter 5 | brightgreen 6 | Broadcom 7 | CentOS 8 | COCOMO 9 | codebase 10 | contrib 11 | dev 12 | DHCP 13 | DISTRO 14 | electrocucaracha 15 | eno 16 | fnh 17 | fsSL 18 | githubusercontent 19 | GRE 20 | href 21 | https 22 | img 23 | ini 24 | INIT 25 | initVagrant 26 | IPs 27 | KOLLA 28 | Kubernetes 29 | laobi 30 | Libvirt 31 | Linter 32 | LPDDR 33 | ly 34 | multinode 35 | noha 36 | NUC 37 | NUM 38 | NVMe 39 | opensource 40 | OpenStack 41 | pipermail 42 | png 43 | raspberrypi 44 | RBAC 45 | README 46 | repo 47 | rubocop 48 | runonce 49 | SATA 50 | scalability 51 | Scc 52 | SDRAM 53 | sloc 54 | src 55 | SSD 56 | subnets 57 | svg 58 | topologies 59 | undercloud 60 | vagrantup 61 | vCPUS 62 | VirtualBox 63 | VLAN 64 | VMs 65 | VXLAN 66 | xyz 67 | yml 68 | -------------------------------------------------------------------------------- /tox.ini: -------------------------------------------------------------------------------- 1 | [tox] 2 | minversion = 1.6 3 | skipsdist = True 4 | envlist = bashate 5 | 6 | [testenv] 7 | passenv = http_proxy,HTTP_PROXY,https_proxy,HTTPS_PROXY,no_proxy,NO_PROXY 8 | usedevelop = False 9 | install_command = python -m pip install {opts} {packages} 10 | 11 | [testenv:lint] 12 | deps = 13 | {env:BASHATE_INSTALL_PATH:bashate} 14 | allowlist_externals = bash 15 | commands = bash -c "find {toxinidir} -maxdepth 1 \ 16 | -not \( -type f -name .*.swp* -prune \) \ 17 | -name \*.sh -type f \ 18 | # E005 file does not begin with #! or have a .sh prefix 19 | # E006 check for lines longer than 79 columns 20 | # E042 local declaration hides errors 21 | # E043 Arithmetic compound has inconsistent return semantics 22 | -print0 | xargs -0 bashate -v -iE006 -eE005,E042,E043" 23 | 24 | [testenv:spell] 25 | deps = 26 | pyspelling 27 | commands = pyspelling -c .spellcheck.yml 28 | -------------------------------------------------------------------------------- /controller.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2018 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | set -o nounset 12 | set -o pipefail 13 | set -o errexit 14 | if [[ ${OS_DEBUG:-false} == "true" ]]; then 15 | export PKG_DEBUG=true 16 | set -o xtrace 17 | fi 18 | 19 | _start=$(date +%s) 20 | trap 'printf "Controller installation process: %s secs\n" "$(($(date +%s)-_start))"' EXIT 21 | 22 | # NOTE: Required for HA setups to allow rabbit hostname resolves uniquely to the proper IP address 23 | echo "" | sudo tee /etc/hosts 24 | -------------------------------------------------------------------------------- /scripts/cinder.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2024 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | set -o nounset 12 | set -o pipefail 13 | set -o errexit 14 | if [[ ${OS_DEBUG:-false} == "true" ]]; then 15 | export PKG_DEBUG=true 16 | set -o xtrace 17 | fi 18 | 19 | os_cinder_volume_type="lvm-1" 20 | 21 | if ! openstack volume type list | grep -q "$os_cinder_volume_type"; then 22 | openstack volume type create "$os_cinder_volume_type" \ 23 | --property volume_backend_name="$os_cinder_volume_type" 24 | fi 25 | -------------------------------------------------------------------------------- /spec/run_kaction_spec.sh: -------------------------------------------------------------------------------- 1 | #shellcheck shell=sh 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2023 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | Describe 'run_kaction.sh' 12 | Include run_kaction.sh 13 | 14 | Describe '_get_kolla_ansible_cmd()' 15 | Parameters 16 | 'deploy' 'kolla-ansible deploy --inventory ./samples/aio/hosts.ini' 17 | 'destroy' 'kolla-ansible destroy --inventory ./samples/aio/hosts.ini --yes-i-really-really-mean-it' 18 | End 19 | It 'gets kolla-ansible action' 20 | When call _get_kolla_ansible_cmd "$1" 21 | The output should eq "$2" 22 | The status should be success 23 | End 24 | End 25 | End 26 | -------------------------------------------------------------------------------- /samples/README.md: -------------------------------------------------------------------------------- 1 | # Samples 2 | 3 | This folder contains several Vagrant configurations which can be used to 4 | provision Virtual Machines for testing different deployment 5 | configurations. 6 | 7 | Each sample contains a `README.md` file with specific instructions. 8 | 9 | The current samples are: 10 | 11 | - `aio`: All-in-one configuration 12 | - `noha`: No High Availability configuration 13 | - `distributed`: Distributed configuration 14 | 15 | See the specific sample folders for more details. 16 | 17 | ## Vagrant Configuration 18 | 19 | This project provides configurations which have been validated 20 | using [Vagrant tool][1] on Virtual Machines provisioned on VirtualBox 21 | or Libvirt. It's highly recommended to use the _setup.sh_ script 22 | of the [bootstrap-vagrant project][2] for installing Vagrant 23 | dependencies and plugins required for its project. 24 | 25 | ```bash 26 | curl -fsSL http://bit.ly/initVagrant | PROVIDER=libvirt bash 27 | ``` 28 | 29 | The **setup.sh** script supports VirtualBox and Libvirt providers. 30 | 31 | [1]: https://www.vagrantup.com/ 32 | [2]: https://github.com/electrocucaracha/bootstrap-vagrant 33 | -------------------------------------------------------------------------------- /distros_supported.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2019 - 2025 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | rocky_9: 11 | name: rockylinux/9 12 | vb_controller: IDE Controller 13 | version: "6.0.0" 14 | project_id: rocky-linux-cloud 15 | family: rocky-linux-9 16 | ubuntu_22: 17 | name: generic/ubuntu2204 18 | vb_controller: IDE Controller 19 | version: "4.3.12" 20 | project_id: ubuntu-os-cloud 21 | family: ubuntu-2204-lts 22 | debian_11: 23 | name: debian/bullseye64 24 | vb_controller: SATA Controller 25 | version: "11.20241217.1" 26 | project_id: debian-cloud 27 | family: debian-11 28 | debian_12: 29 | name: debian/bookworm64 30 | vb_controller: SATA Controller 31 | version: "12.20250126.1" 32 | project_id: debian-cloud 33 | family: debian-12 34 | -------------------------------------------------------------------------------- /ci/update_versions.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2021 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | set -o errexit 12 | set -o pipefail 13 | if [[ ${OS_DEBUG:-false} == "true" ]]; then 14 | set -o xtrace 15 | fi 16 | 17 | trap "make fmt" EXIT 18 | 19 | # Update GitHub Action commit hashes 20 | gh_actions=$(grep -r "uses: [a-zA-Z\-]*/[\_a-z\-]*@" .github/ | sed 's/@.*//' | awk -F ': ' '{ print $3 }' | sort -u) 21 | for action in $gh_actions; do 22 | commit_hash=$(git ls-remote "https://github.com/$action" | grep 'refs/tags/[v]\?[0-9][0-9\.]*\^{}$' | sed 's|refs/tags/[vV]\?[\.]\?||g; s|\^{}$||g' | sort -u -k2 -V | tail -1 | awk '{ printf "%s # %s\n",$1,$2 }') 23 | # shellcheck disable=SC2267 24 | grep -ElRZ "uses: $action@" .github/ | xargs -0 -l sed -i -e "s|uses: $action@.*|uses: $action@$commit_hash|g" 25 | done 26 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # SPDX-license-identifier: Apache-2.0 2 | ############################################################################## 3 | # Copyright (c) 2021 4 | # All rights reserved. This program and the accompanying materials 5 | # are made available under the terms of the Apache License, Version 2.0 6 | # which accompanies this distribution, and is available at 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | ############################################################################## 9 | 10 | DOCKER_CMD ?= $(shell which docker 2> /dev/null || which podman 2> /dev/null || echo docker) 11 | 12 | .PHONY: lint 13 | lint: 14 | sudo -E $(DOCKER_CMD) run --rm -v $$(pwd):/tmp/lint \ 15 | -e RUN_LOCAL=true \ 16 | -e LINTER_RULES_PATH=/ \ 17 | -e FILTER_REGEX_EXCLUDE="requirements/.*" \ 18 | -e EDITORCONFIG_FILE_NAME=.editorconfig-checker.json \ 19 | -e VALIDATE_SHELL_SHFMT=false \ 20 | -e VALIDATE_BIOME_FORMAT=false \ 21 | ghcr.io/super-linter/super-linter 22 | tox -e lint 23 | 24 | .PHONY: fmt 25 | fmt: 26 | command -v shfmt > /dev/null || curl -s "https://i.jpillora.com/mvdan/sh!!?as=shfmt" | bash 27 | shfmt -l -w -s -i 4 . 28 | command -v yamlfmt > /dev/null || curl -s "https://i.jpillora.com/google/yamlfmt!!" | bash 29 | yamlfmt -dstar **/*.{yaml,yml} 30 | npm list | grep -q prettier || npm install prettier 31 | npx prettier . --write 32 | -------------------------------------------------------------------------------- /.github/workflows/rebase.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2021 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | name: Automatic Rebase 11 | # yamllint disable-line rule:truthy 12 | on: 13 | issue_comment: 14 | types: [created] 15 | permissions: read-all 16 | jobs: 17 | rebase: 18 | name: Rebase 19 | if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/rebase') 20 | runs-on: ubuntu-latest 21 | steps: 22 | - name: Checkout the latest code 23 | uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 24 | with: 25 | persist-credentials: false 26 | token: ${{ secrets.GITHUB_TOKEN }} 27 | fetch-depth: 0 # otherwise, you will fail to push refs to dest repo 28 | - name: Automatic Rebase 29 | uses: cirrus-actions/rebase@b87d48154a87a85666003575337e27b8cd65f691 # 1.8 30 | env: 31 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 32 | -------------------------------------------------------------------------------- /compute.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2018 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | set -o nounset 12 | set -o pipefail 13 | set -o errexit 14 | if [[ ${OS_DEBUG:-false} == "true" ]]; then 15 | export PKG_DEBUG=true 16 | set -o xtrace 17 | fi 18 | 19 | _start=$(date +%s) 20 | trap 'printf "Compute installation process: %s secs\n" "$(($(date +%s)-_start))"' EXIT 21 | 22 | # Install dependencies 23 | if ! command -v curl; then 24 | # shellcheck disable=SC1091 25 | source /etc/os-release || source /usr/lib/os-release 26 | case ${ID,,} in 27 | ubuntu | debian) 28 | sudo apt-get update 29 | sudo apt-get install -y -qq -o=Dpkg::Use-Pty=0 --no-install-recommends curl 30 | ;; 31 | esac 32 | fi 33 | 34 | # NOTE: Shorten link -> https://github.com/electrocucaracha/pkg-mgr_scripts 35 | curl -fsSL http://bit.ly/install_bin | PKG_BINDEP_PROFILE=compute bash 36 | sudo -E "$(command -v pip)" install docker 37 | -------------------------------------------------------------------------------- /spec/undercloud_spec.sh: -------------------------------------------------------------------------------- 1 | #shellcheck shell=sh 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2023 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | Describe 'undercloud.sh' 12 | Include undercloud.sh 13 | 14 | Describe '_get_kolla_actions()' 15 | Parameters 16 | '13.7.0' 'minimal' 'bootstrap-servers deploy post-deploy' 17 | '13.7.0' 'complete' 'bootstrap-servers prechecks pull deploy check post-deploy' 18 | '14.7.0' 'minimal' 'install-deps bootstrap-servers deploy post-deploy' 19 | '14.7.0' 'complete' 'install-deps bootstrap-servers prechecks pull deploy check post-deploy' 20 | '15.0.0' 'minimal' 'install-deps bootstrap-servers deploy post-deploy' 21 | '15.0.0' 'complete' 'install-deps bootstrap-servers prechecks pull deploy post-deploy' 22 | End 23 | It 'gets kolla actions to perform' 24 | When call _get_kolla_actions "$1" "$2" 25 | The output should eq "$3" 26 | The status should be success 27 | End 28 | End 29 | End 30 | -------------------------------------------------------------------------------- /.github/actions/docker-image/action.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2024 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | name: Docker image 11 | description: Analyzes security vulnerabilities and size of a given docker image 12 | inputs: 13 | image: 14 | description: Docker image name 15 | runs: 16 | using: "composite" 17 | steps: 18 | - name: Get Docker Image layer contents 19 | uses: MaxymVlasov/dive-action@fafb796951b322cc4926b8a5eafda89ab9de8edf # 1.5.1 20 | with: 21 | image: ${{ inputs.image }} 22 | - name: Run Trivy vulnerability scanner 23 | uses: aquasecurity/trivy-action@b6643a29fecd7f34b3597bc6acb0a98b03d33ff8 # 0.33.1 24 | with: 25 | image-ref: "${{ inputs.image }}" 26 | format: sarif 27 | output: results.sarif 28 | - name: Upload Trivy scan results to GitHub Security tab 29 | uses: github/codeql-action/upload-sarif@86b04fb0e47484f7282357688f21d5d0e32175fe # 3.26.9 30 | with: 31 | sarif_file: results.sarif 32 | category: "${{ inputs.image }}" 33 | -------------------------------------------------------------------------------- /requirements/base.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2022 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | set -o errexit 12 | set -o nounset 13 | set -o pipefail 14 | 15 | if [ -f /etc/netplan/01-netcfg.yaml ]; then 16 | sudo sed -i "s/addresses: .*/addresses: [1.1.1.1, 8.8.8.8, 8.8.4.4]/g" /etc/netplan/01-netcfg.yaml 17 | sudo netplan apply 18 | fi 19 | 20 | # shellcheck disable=SC1091 21 | source /etc/os-release || source /usr/lib/os-release 22 | case ${ID,,} in 23 | ubuntu | debian) 24 | nic="$(ip route get 1.1.1.1 | grep "^1." | awk '{ print $5 }' || :)" 25 | if [ "${ID,,}" == "ubuntu" ] && [ -n "$nic" ] && command -v systemd-resolve && (! systemd-resolve --status | grep -q 1.1.1.1); then 26 | sudo systemd-resolve --interface "$nic" --set-dns 1.1.1.1 27 | fi 28 | if ! command -v curl; then 29 | sudo apt-get update -qq >/dev/null 30 | sudo apt-get install -y -qq -o=Dpkg::Use-Pty=0 curl 31 | fi 32 | if ! command -v dpkg-reconfigure; then 33 | sudo dpkg-reconfigure --frontend=noninteractive locales 34 | fi 35 | ;; 36 | esac 37 | -------------------------------------------------------------------------------- /run_kaction.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2020,2023 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | set -o nounset 12 | set -o pipefail 13 | set -o errexit 14 | if [[ ${OS_DEBUG:-false} == "true" ]]; then 15 | set -o xtrace 16 | fi 17 | 18 | # NOTE: PYTHONPATH helps to pass the kolla_ansible module verification using Ansible's python 19 | PYTHONPATH="$(python -c 'import sys; print(":".join(sys.path))')" 20 | EXTRA_OPTS="--extra ansible_user=$USER --extra ansible_become=true --extra ansible_become_method=sudo" 21 | export PYTHONPATH EXTRA_OPTS 22 | 23 | function _get_kolla_ansible_cmd { 24 | local kolla_action=$1 25 | 26 | cmd="$(command -v kolla-ansible || echo kolla-ansible) $kolla_action --inventory ${OS_INVENTORY_FILE:-./samples/aio/hosts.ini}" 27 | if [[ ${OS_DEBUG:-false} == "true" ]]; then 28 | cmd+=" --verbose" 29 | fi 30 | if [[ $1 == "destroy" ]]; then 31 | cmd+=" --yes-i-really-really-mean-it" 32 | fi 33 | 34 | echo "$cmd" 35 | } 36 | 37 | if [[ ${__name__:-"__main__"} == "__main__" ]]; then 38 | ansible_cmd=$(_get_kolla_ansible_cmd "$1") 39 | $ansible_cmd 40 | fi 41 | -------------------------------------------------------------------------------- /defaults.env: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2021 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | export OS_ENABLE_LOCAL_REGISTRY="${OS_ENABLE_LOCAL_REGISTRY:-false}" 12 | export OPENSTACK_RELEASE="${OPENSTACK_RELEASE:-2024.1}" 13 | export OS_KOLLA_OPENSTACK_RELEASE="${OPENSTACK_RELEASE}" 14 | export OS_KOLLA_KOLLA_INSTALL_TYPE="${OS_KOLLA_KOLLA_INSTALL_TYPE:-binary}" 15 | export OS_KOLLA_KOLLA_BASE_DISTRO="${OS_KOLLA_KOLLA_BASE_DISTRO:-ubuntu}" 16 | export OS_KOLLA_ENABLE_CINDER="${OS_KOLLA_ENABLE_CINDER:-yes}" 17 | export OS_KOLLA_NEUTRON_PLUGIN_AGENT="${OS_KOLLA_NEUTRON_PLUGIN_AGENT:-openvswitch}" 18 | export OS_KOLLA_ENABLE_NEUTRON_TRUNK="${OS_KOLLA_ENABLE_NEUTRON_TRUNK:-yes}" 19 | export OS_KOLLA_ENABLE_MAGNUM="${OS_KOLLA_ENABLE_MAGNUM:-no}" 20 | export OS_KOLLA_ENABLE_HAPROXY="${OS_KOLLA_ENABLE_HAPROXY:-no}" 21 | export OS_KOLLA_ENABLE_SKYDIVE="${OS_KOLLA_ENABLE_SKYDIVE:-no}" 22 | # Allow to connect compute instances directly to physical networks avoiding tunnels 23 | export OS_KOLLA_ENABLE_NEUTRON_PROVIDER_NETWORKS="${OS_KOLLA_ENABLE_NEUTRON_PROVIDER_NETWORKS:-no}" 24 | export OS_KOLLA_DEPLOY_PROFILE="${OS_KOLLA_DEPLOY_PROFILE:-complete}" 25 | -------------------------------------------------------------------------------- /.github/actions/vagrant-setup/action.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2022 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | name: Vagrant setup 11 | description: Install and configure tools required for the CI vagrant composite task 12 | inputs: 13 | distro: 14 | description: Linux distribution 15 | default: ubuntu 16 | runs: 17 | using: "composite" 18 | steps: 19 | - name: Cache Vagrant boxes 20 | uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # 4.3.0 21 | with: 22 | path: ~/.vagrant.d/boxes 23 | key: ${{ runner.os }}-vagrant-${{ inputs.distro }}-${{ hashFiles('distros_supported.yml') }} 24 | restore-keys: | 25 | ${{ runner.os }}-vagrant-${{ inputs.distro }}- 26 | ${{ runner.os }}-vagrant-${{ hashFiles('distros_supported.yml') }} 27 | - name: Apply workaround for VBoxHeadless issue on macOS (https://www.virtualbox.org/ticket/20636) 28 | shell: bash 29 | run: | 30 | if [[ "$(VBoxManage --version)" == "6.1.28r147628" ]]; then 31 | find . -type f -iname "Vagrantfile" -exec sed -i 's|v.gui = .*|v.gui = true|g' {} \; 32 | find . -type f -name "*.bak" -delete 33 | fi 34 | -------------------------------------------------------------------------------- /.github/workflows/spell.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2021 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | name: Run misspell 11 | # yamllint disable-line rule:truthy 12 | on: 13 | push: 14 | paths: 15 | - "**.md" 16 | - "!.github/*" 17 | pull_request_review: 18 | types: 19 | - submitted 20 | permissions: read-all 21 | jobs: 22 | check-reviewdog: 23 | name: Check spelling (reviewdog) 24 | runs-on: ubuntu-latest 25 | permissions: 26 | contents: read 27 | steps: 28 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 29 | with: 30 | persist-credentials: false 31 | - uses: reviewdog/action-misspell@9daa94af4357dddb6fd3775de806bc0a8e98d3e4 # 1.26.3 32 | with: 33 | github_token: ${{ secrets.github_token }} 34 | check-spellcheck: 35 | name: Check spelling (pyspelling) 36 | runs-on: ubuntu-latest 37 | permissions: 38 | contents: read 39 | steps: 40 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 41 | with: 42 | persist-credentials: false 43 | - uses: igsekor/pyspelling-any@44278deea34ea69d8f0d5179ac409c140b0a2f5a # 1.0.5 44 | name: Spellcheck 45 | -------------------------------------------------------------------------------- /spec/commons_spec.sh: -------------------------------------------------------------------------------- 1 | #shellcheck shell=sh 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2023 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | Describe 'commons.sh' 12 | Include commons.sh 13 | 14 | Describe 'vercmp()' 15 | Parameters 16 | '1.1.1' '==' '1.1.1' success 17 | '1.1.1' '==' '1.1.0' failure 18 | '1.1.0' '<' '1.1.1' success 19 | '1.1.1' '<' '1.1.0' failure 20 | '1.1.1' '<' '1.1.1' failure 21 | '1.1.1' '<=' '1.1.1' success 22 | '1.1.0' '<=' '1.1.1' success 23 | '1.1.1' '<=' '1.1.0' failure 24 | '1.1.1' '>' '1.1.0' success 25 | '1.1.0' '>' '1.1.1' failure 26 | '1.1.1' '>' '1.1.1' failure 27 | '1.1.1' '>=' '1.1.0' success 28 | '1.1.1' '>=' '1.1.1' success 29 | '1.1.0' '>=' '1.1.1' failure 30 | End 31 | It 'performs comparation' 32 | When call vercmp "$1" "$2" "$3" 33 | The status should be "$4" 34 | End 35 | It 'raises error when specified an invalid operator' 36 | When run vercmp '1.0.0' '!=' '2.0.0' 37 | The stdout should equal "unrecognised op: !=" 38 | The status should be failure 39 | End 40 | End 41 | End 42 | -------------------------------------------------------------------------------- /.github/workflows/diagram.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2022 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | name: Documentation and diagram generation 11 | # yamllint disable-line rule:truthy 12 | on: 13 | push: 14 | paths-ignore: 15 | - codebase-structure.svg 16 | - .github/ 17 | workflow_dispatch: 18 | permissions: read-all 19 | jobs: 20 | check-diagram: 21 | name: Update the codebase structure diagram 22 | runs-on: ubuntu-latest 23 | permissions: 24 | contents: write # for technote-space/create-pr-action to push code 25 | pull-requests: write # for technote-space/create-pr-action to create a PR 26 | steps: 27 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 28 | with: 29 | persist-credentials: false 30 | - name: Update diagram 31 | uses: githubocto/repo-visualizer@a999615bdab757559bf94bda1fe6eef232765f85 # 0.9.1 32 | with: 33 | excluded_paths: "ignore,.github" 34 | output_file: codebase-structure.svg 35 | should_push: false 36 | - uses: technote-space/create-pr-action@91114507cf92349bec0a9a501c2edf1635427bc5 # 2.1.4 37 | with: 38 | COMMIT_MESSAGE: "Upgrade documentation diagram" 39 | COMMIT_NAME: "electrocucaracha bot" 40 | PR_BRANCH_NAME: "versions-update-${PR_ID}" 41 | PR_TITLE: "chore: update diagram" 42 | -------------------------------------------------------------------------------- /samples/distributed/README.md: -------------------------------------------------------------------------------- 1 | # OpenStack Distributed Configuration 2 | 3 | ![Diagram](../../doc/img/diagram_distributed.png) 4 | 5 | ## Host System Requirements 6 | 7 | The system that will host VMs for the solution must be big enough to 8 | support the 10+ Virtual Machines displayed in the diagram above. 9 | 10 | Some configuration details can be configured for the _Distributed_ 11 | setup using its [PDF](pdf.yml). 12 | 13 | ### Current configuration 14 | 15 | | Amount | Node | Memory(GB) | vCPUs | Disk(GB) | 16 | | ------ | ------------------ | ---------- | ----- | -------- | 17 | | 1 | Registry | 8 | 1 | 50 | 18 | | 3 | Controller/Network | 8 | 1 | | 19 | | 1 | Compute | 8 | 1 | | 20 | | 1 | Storage | 8 | 1 | 100 | 21 | | 1 | Monitoring | 8 | 1 | | 22 | | | Total | 64 | 8 | 150 | 23 | 24 | ## Setup 25 | 26 | Once Vagrant is installed, it's possible to deploy an OpenStack 27 | cluster on Virtual Machines. 28 | 29 | ```bash 30 | cd samples/distributed 31 | ``` 32 | 33 | First of all, it's necessary to start the cluster nodes which are 34 | going to host the OpenStack services. Their roles are defined on the 35 | [Ansible inventory file](hosts.ini) and used by the provisioning 36 | server. All these nodes can be initialized in parallel using the 37 | following command: 38 | 39 | ```bash 40 | vagrant up 41 | ``` 42 | 43 | This instruction also starts the registry node, it is an internal 44 | Docker Hub that contains OpenStack Kolla images that will be consumed 45 | during the provisioning process. 46 | 47 | Finally, the provisioning server will be required for the installation 48 | and configuration tasks on target cluster nodes. 49 | 50 | ```bash 51 | vagrant up undercloud 52 | ``` 53 | -------------------------------------------------------------------------------- /.github/workflows/distros.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2021 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | name: Scheduled Latest Vagrant Boxes verification 11 | # yamllint disable-line rule:truthy 12 | on: 13 | schedule: 14 | - cron: "0 0 1 * *" 15 | workflow_dispatch: 16 | permissions: read-all 17 | jobs: 18 | check-versions: 19 | name: Check for latest Vagrant box versions 20 | permissions: 21 | contents: write # for technote-space/create-pr-action to push code 22 | pull-requests: write # for technote-space/create-pr-action to create a PR 23 | runs-on: vm-self-hosted 24 | steps: 25 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 26 | with: 27 | persist-credentials: false 28 | - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # 4.3.0 29 | with: 30 | path: ~/.vagrant.d/boxes 31 | key: ${{ runner.os }}-vagrant-${{ hashFiles('distros_supported.yml') }} 32 | restore-keys: | 33 | ${{ runner.os }}-vagrant- 34 | - uses: technote-space/create-pr-action@91114507cf92349bec0a9a501c2edf1635427bc5 # 2.1.4 35 | env: 36 | PROVIDER: virtualbox 37 | with: 38 | EXECUTE_COMMANDS: | 39 | ./ci/update_distros.sh 40 | COMMIT_MESSAGE: "Upgrade distro list versions" 41 | COMMIT_NAME: "electrocucaracha bot" 42 | PR_BRANCH_NAME: "versions-update-${PR_ID}" 43 | PR_TITLE: "chore: update distro versions" 44 | -------------------------------------------------------------------------------- /.github/workflows/README.md: -------------------------------------------------------------------------------- 1 | # Available workflows 2 | 3 | | Workflow file | Description | Run event | 4 | | :------------------------------------- | ------------------------------------------------------------------------- | ---------------------------------- | 5 | | [build](./build.yml) | Validates Kolla Docker images build and publish process | on new commit, scheduled or manual | 6 | | [diagram](./diagram.yml) | Generates the codebase diagram used by the main README.md file | on new commit or push on master | 7 | | [distros](./distros.yml) | Updates the Vagrant box versions for Distro list supported file | scheduled or manual trigger | 8 | | [linter](./linter.yml) | Counts lines of code, verifies broken links in docs and runs linter tools | on new commit or push on master | 9 | | [on-demand_aio](./on-demand_aio.yml) | Runs upgrade process in all-in-one setups in different supported distros | on new commit or push on master | 10 | | [on-demand_noha](./on-demand_noha.yml) | Runs integration tests for No High Availability setup | on new commit or push on master | 11 | | [on-demand](./on-demand.yml) | Verifies Bash scripts format | on new commit or push on master | 12 | | [rebase](./rebase.yml) | Helps to rebase changes of the Pull Request | manual trigger | 13 | | [scheduled_aio](./scheduled_aio.yml) | Verifies all-in-one setups in different supported distros | scheduled or manual trigger | 14 | | [spell](./spell.yml) | Verifies spelling errors on documentation | on new commit or push on master | 15 | | [update](./update.yml) | Updates Python requirements files and word list in the dictionary | scheduled or manual trigger | 16 | -------------------------------------------------------------------------------- /.github/workflows/on-demand.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2022 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | name: Check Bash scripts 11 | # yamllint disable-line rule:truthy 12 | on: 13 | push: 14 | paths: 15 | - "*.sh" 16 | pull_request_review: 17 | types: 18 | - submitted 19 | permissions: read-all 20 | jobs: 21 | check-format: 22 | name: Check scripts format 23 | if: >- 24 | ( github.event_name == 'pull_request_review' && github.event.review.state == 'approved' ) || github.event_name != 'pull_request_review' 25 | runs-on: ubuntu-latest 26 | permissions: 27 | contents: read 28 | steps: 29 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 30 | with: 31 | persist-credentials: false 32 | - name: Run the sh-checker 33 | uses: luizm/action-sh-checker@17bd25a6ee188d2b91f677060038f4ba37ba14b2 # 0.9.0 34 | env: 35 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 36 | SHFMT_OPTS: -i 4 -s 37 | with: 38 | sh_checker_shellcheck_disable: true 39 | sh_checker_exclude: "spec/" 40 | check-bash-shellspec: 41 | name: Run BDD shell specs for Bash demo 42 | runs-on: ubuntu-latest 43 | permissions: 44 | contents: read 45 | steps: 46 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 47 | with: 48 | persist-credentials: false 49 | - name: Install ShellSpec 50 | run: curl -fsSL https://github.com/shellspec/shellspec/releases/latest/download/shellspec-dist.tar.gz | tar -xz -C .. 51 | - name: Run Shellspec 52 | shell: 'script -q -e -c "bash {0}"' 53 | run: ../shellspec/shellspec --profile --xtrace 54 | -------------------------------------------------------------------------------- /samples/aio/README.md: -------------------------------------------------------------------------------- 1 | # OpenStack All-in-One Configuration 2 | 3 | This configuration was designed to host the OpenStack services in an 4 | [Intel's NUC 10 Performance kit][1]. 5 | 6 | The [provisioning process](../../install.sh) pulls the official Kolla 7 | images and deploys them in a CentOS 7 using the [undercloud 8 | script](../../undercloud.sh). 9 | 10 | The following diagram displays the Networking configuration created by 11 | [init-runonce script][2]. 12 | 13 | ![Diagram](../../doc/img/skydive_aio.png) 14 | 15 | ## Hardware Details 16 | 17 | - 10th Generation Intel® Core™ i5-10210U Processor 18 | - 256 GB NVMe SSD, 1 TB SATA3 HDD 19 | - 16 GB Dual-Channel, LPDDR4-2666 20 | 21 | ## Vagrant execution 22 | 23 | Once Vagrant is installed, it's possible to deploy an OpenStack cluster on 24 | a single Virtual Machine. 25 | 26 | ```bash 27 | vagrant up 28 | ``` 29 | 30 | ### Environment variables 31 | 32 | This table displays the environment variables used to configure some aspects of 33 | the cluster, hardware resources and workflow. 34 | 35 | | Name | Default | Description | 36 | | :--------------------- | :-------- | :-------------------------------------------------------------- | 37 | | OS_DISTRO | debian_11 | Specifies the Linux distribution to be used for this deployment | 38 | | ENABLE_WEAVE_SCOPE | | Enable/Disable Weave Scope | 39 | | OS_KOLLA_RUN_INIT | | Executes the [initialization Kolla script][2] | 40 | | OS_KOLLA_ENABLE_MAGNUM | no | Enable/Disable [OpenStack Magnum service][4] | 41 | | CPU | 8 | Number of vCPUS assigned to the Virtual Machine | 42 | | MEMORY | 16 GB | Memory assigned to the Virtual Machine | 43 | 44 | 45 | 46 | [1]: https://ark.intel.com/content/www/us/en/ark/products/189239/intel-nuc-10-performance-kit-nuc10i5fnh.html 47 | [2]: https://github.com/openstack/kolla-ansible/blob/10.0.0/tools/init-runonce 48 | [4]: https://docs.openstack.org/magnum/latest/ 49 | -------------------------------------------------------------------------------- /upgrade.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2022 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | set -o nounset 12 | set -o pipefail 13 | set -o errexit 14 | if [[ ${OS_DEBUG:-false} == "true" ]]; then 15 | set -o xtrace 16 | fi 17 | 18 | source defaults.env 19 | source commons.sh 20 | # shellcheck disable=SC1091 21 | source /etc/os-release || source /usr/lib/os-release 22 | 23 | function _print_state { 24 | # PEP 370 -- Per user site-packages directory 25 | [[ $PATH != *.local/bin* ]] && export PATH=$PATH:$HOME/.local/bin 26 | if command -v openstack; then 27 | echo "OpenStack client version" 28 | openstack --version 29 | 30 | echo "OpenStack service versions" 31 | openstack versions show 32 | fi 33 | 34 | echo "OpenStack Kolla version" 35 | pip freeze | grep kolla 36 | 37 | if command -v docker; then 38 | echo "OpenStack Kolla services" 39 | sudo docker ps 40 | fi 41 | } 42 | 43 | function _install_deps { 44 | if ! command -v pip; then 45 | # NOTE: Shorten link -> https://github.com/electrocucaracha/pkg-mgr_scripts 46 | curl -fsSL http://bit.ly/install_pkg | PKG=pip bash 47 | fi 48 | echo "Upgrade OpenStack services to ${OPENSTACK_RELEASE} release" 49 | # NOTE: Uninstall mitogen given that it's only supported in some Ansible versions (2.13.x) 50 | pip uninstall mitogen --yes 51 | python -m pip install --ignore-installed --no-warn-script-location --requirement "requirements/${OPENSTACK_RELEASE}/${ID,,}_${VERSION_ID%.*}.txt" 52 | setup_ansible 53 | } 54 | 55 | function main { 56 | _print_state 57 | trap _print_state EXIT 58 | 59 | _install_deps 60 | set_values 61 | run_kolla_actions pull upgrade 62 | } 63 | 64 | if [[ ${__name__:-"__main__"} == "__main__" ]]; then 65 | main 66 | fi 67 | -------------------------------------------------------------------------------- /samples/noha/README.md: -------------------------------------------------------------------------------- 1 | # OpenStack No High Availability Configuration 2 | 3 | This configuration was designed to create a minimal OpenStack cluster 4 | using a [Raspberry Pi 4 Model B][1] without High Availability. 5 | 6 | The [provisioning process](../../install.sh) is executed on the 7 | Controller node. 8 | It creates a local registry on it using the [registry script](../../registry.sh) 9 | and deploys OpenStack services using the [undercloud 10 | script](../../undercloud.sh). 11 | 12 | The following diagram shows the distribution of OpenStack Kolla containers 13 | created by this configuration. 14 | 15 | ## Hardware Details 16 | 17 | - Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.5GHz 18 | - 4GB or 8GB LPDDR4-3200 SDRAM 19 | 20 | ![Diagram](../../doc/img/containers_noha.png) 21 | 22 | ## Vagrant execution 23 | 24 | Once Vagrant is installed, it's possible to deploy an OpenStack cluster on 25 | Virtual Machines. 26 | 27 | ```bash 28 | VAGRANT_EXPERIMENTAL=disks vagrant up 29 | vagrant up controller 30 | ``` 31 | 32 | ### Environment variables 33 | 34 | This table displays the environment variables used to configure some aspects 35 | of the cluster, hardware resources and workflow. 36 | 37 | | Name | Default | Description | 38 | | :----------------------- | :------ | :------------------------------------------------------------------------------------------------------------ | 39 | | OS_NUM_COMPUTE_NODES | 2 | Specifies the number of OpenStack compute nodes | 40 | | OS_ENABLE_LOCAL_REGISTRY | true | Determines if a local registry will be deployed on the Controller node. This includes the Kolla build process | 41 | | CPU | 4 | Number of vCPUS assigned to the Virtual Machine | 42 | | MEMORY | 8 GB | Memory assigned to the Virtual Machine (Compute nodes use 4 GB ) | 43 | 44 | 45 | 46 | [1]: https://www.raspberrypi.com/products/raspberry-pi-4-model-b/ 47 | -------------------------------------------------------------------------------- /requirements/2023.2/debian_12.txt: -------------------------------------------------------------------------------- 1 | # This file was autogenerated by uv via the following command: 2 | # uv pip compile --output-file=/home/runner/work/openstack-multinode/openstack-multinode/requirements/2023.2/debian_12.txt /home/runner/work/openstack-multinode/openstack-multinode/requirements/2023.2/pyproject.toml 3 | ansible-core==2.15.13 4 | # via bobcat (requirements/2023.2/pyproject.toml) 5 | bcrypt==5.0.0 6 | # via 7 | # kolla-ansible 8 | # passlib 9 | certifi==2025.11.12 10 | # via requests 11 | cffi==2.0.0 12 | # via cryptography 13 | charset-normalizer==3.4.4 14 | # via requests 15 | cryptography==46.0.3 16 | # via 17 | # ansible-core 18 | # kolla-ansible 19 | debtcollector==3.0.0 20 | # via oslo-utils 21 | hvac==2.4.0 22 | # via kolla-ansible 23 | idna==3.11 24 | # via requests 25 | iso8601==2.1.0 26 | # via oslo-utils 27 | jinja2==3.1.6 28 | # via 29 | # ansible-core 30 | # kolla-ansible 31 | jmespath==1.0.1 32 | # via kolla-ansible 33 | kolla-ansible==17.9.0 34 | # via bobcat (requirements/2023.2/pyproject.toml) 35 | markupsafe==3.0.3 36 | # via jinja2 37 | netaddr==1.3.0 38 | # via 39 | # oslo-config 40 | # oslo-utils 41 | oslo-config==10.1.0 42 | # via kolla-ansible 43 | oslo-i18n==6.7.0 44 | # via 45 | # oslo-config 46 | # oslo-utils 47 | oslo-utils==9.1.0 48 | # via kolla-ansible 49 | packaging==25.0 50 | # via 51 | # ansible-core 52 | # oslo-utils 53 | passlib==1.7.4 54 | # via kolla-ansible 55 | pbr==7.0.3 56 | # via 57 | # kolla-ansible 58 | # oslo-i18n 59 | # oslo-utils 60 | psutil==7.1.3 61 | # via oslo-utils 62 | pycparser==2.23 63 | # via cffi 64 | pyparsing==3.2.5 65 | # via oslo-utils 66 | pyyaml==6.0.3 67 | # via 68 | # ansible-core 69 | # kolla-ansible 70 | # oslo-config 71 | # oslo-utils 72 | requests==2.32.5 73 | # via 74 | # hvac 75 | # oslo-config 76 | resolvelib==1.0.1 77 | # via ansible-core 78 | rfc3986==2.0.0 79 | # via oslo-config 80 | setuptools==80.9.0 81 | # via pbr 82 | stevedore==5.5.0 83 | # via oslo-config 84 | tzdata==2025.2 85 | # via oslo-utils 86 | urllib3==2.5.0 87 | # via requests 88 | wrapt==2.0.1 89 | # via debtcollector 90 | -------------------------------------------------------------------------------- /requirements/2024.1/debian_12.txt: -------------------------------------------------------------------------------- 1 | # This file was autogenerated by uv via the following command: 2 | # uv pip compile --output-file=/home/runner/work/openstack-multinode/openstack-multinode/requirements/2024.1/debian_12.txt /home/runner/work/openstack-multinode/openstack-multinode/requirements/2024.1/pyproject.toml 3 | ansible-core==2.16.14 4 | # via caracal (requirements/2024.1/pyproject.toml) 5 | bcrypt==5.0.0 6 | # via 7 | # kolla-ansible 8 | # passlib 9 | certifi==2025.11.12 10 | # via requests 11 | cffi==2.0.0 12 | # via cryptography 13 | charset-normalizer==3.4.4 14 | # via requests 15 | cryptography==46.0.3 16 | # via 17 | # ansible-core 18 | # kolla-ansible 19 | debtcollector==3.0.0 20 | # via oslo-utils 21 | hvac==2.4.0 22 | # via kolla-ansible 23 | idna==3.11 24 | # via requests 25 | iso8601==2.1.0 26 | # via oslo-utils 27 | jinja2==3.1.6 28 | # via 29 | # ansible-core 30 | # kolla-ansible 31 | jmespath==1.0.1 32 | # via kolla-ansible 33 | kolla-ansible==18.8.0 34 | # via caracal (requirements/2024.1/pyproject.toml) 35 | markupsafe==3.0.3 36 | # via jinja2 37 | netaddr==1.3.0 38 | # via 39 | # oslo-config 40 | # oslo-utils 41 | oslo-config==10.1.0 42 | # via kolla-ansible 43 | oslo-i18n==6.7.0 44 | # via 45 | # oslo-config 46 | # oslo-utils 47 | oslo-utils==9.1.0 48 | # via kolla-ansible 49 | packaging==25.0 50 | # via 51 | # ansible-core 52 | # oslo-utils 53 | passlib==1.7.4 54 | # via kolla-ansible 55 | pbr==7.0.3 56 | # via 57 | # kolla-ansible 58 | # oslo-i18n 59 | # oslo-utils 60 | psutil==7.1.3 61 | # via oslo-utils 62 | pycparser==2.23 63 | # via cffi 64 | pyparsing==3.2.5 65 | # via oslo-utils 66 | pyyaml==6.0.3 67 | # via 68 | # ansible-core 69 | # kolla-ansible 70 | # oslo-config 71 | # oslo-utils 72 | requests==2.32.5 73 | # via 74 | # hvac 75 | # oslo-config 76 | resolvelib==1.0.1 77 | # via ansible-core 78 | rfc3986==2.0.0 79 | # via oslo-config 80 | setuptools==80.9.0 81 | # via pbr 82 | stevedore==5.5.0 83 | # via oslo-config 84 | tzdata==2025.2 85 | # via oslo-utils 86 | urllib3==2.5.0 87 | # via requests 88 | wrapt==2.0.1 89 | # via debtcollector 90 | -------------------------------------------------------------------------------- /requirements/2023.2/ubuntu_22.txt: -------------------------------------------------------------------------------- 1 | # This file was autogenerated by uv via the following command: 2 | # uv pip compile --output-file=/home/runner/work/openstack-multinode/openstack-multinode/requirements/2023.2/ubuntu_22.txt /home/runner/work/openstack-multinode/openstack-multinode/requirements/2023.2/pyproject.toml 3 | ansible-core==2.15.13 4 | # via bobcat (requirements/2023.2/pyproject.toml) 5 | bcrypt==5.0.0 6 | # via 7 | # kolla-ansible 8 | # passlib 9 | certifi==2025.11.12 10 | # via requests 11 | cffi==2.0.0 12 | # via cryptography 13 | charset-normalizer==3.4.4 14 | # via requests 15 | cryptography==46.0.3 16 | # via 17 | # ansible-core 18 | # kolla-ansible 19 | debtcollector==3.0.0 20 | # via oslo-utils 21 | hvac==2.4.0 22 | # via kolla-ansible 23 | idna==3.11 24 | # via requests 25 | iso8601==2.1.0 26 | # via oslo-utils 27 | jinja2==3.1.6 28 | # via 29 | # ansible-core 30 | # kolla-ansible 31 | jmespath==1.0.1 32 | # via kolla-ansible 33 | kolla-ansible==17.9.0 34 | # via bobcat (requirements/2023.2/pyproject.toml) 35 | markupsafe==3.0.3 36 | # via jinja2 37 | netaddr==1.3.0 38 | # via 39 | # oslo-config 40 | # oslo-utils 41 | oslo-config==10.1.0 42 | # via kolla-ansible 43 | oslo-i18n==6.7.0 44 | # via 45 | # oslo-config 46 | # oslo-utils 47 | oslo-utils==9.1.0 48 | # via kolla-ansible 49 | packaging==25.0 50 | # via 51 | # ansible-core 52 | # oslo-utils 53 | passlib==1.7.4 54 | # via kolla-ansible 55 | pbr==7.0.3 56 | # via 57 | # kolla-ansible 58 | # oslo-i18n 59 | # oslo-utils 60 | psutil==7.1.3 61 | # via oslo-utils 62 | pycparser==2.23 63 | # via cffi 64 | pyparsing==3.2.5 65 | # via oslo-utils 66 | pyyaml==6.0.3 67 | # via 68 | # ansible-core 69 | # kolla-ansible 70 | # oslo-config 71 | # oslo-utils 72 | requests==2.32.5 73 | # via 74 | # hvac 75 | # oslo-config 76 | resolvelib==1.0.1 77 | # via ansible-core 78 | rfc3986==2.0.0 79 | # via oslo-config 80 | setuptools==80.9.0 81 | # via pbr 82 | stevedore==5.5.0 83 | # via oslo-config 84 | typing-extensions==4.15.0 85 | # via cryptography 86 | tzdata==2025.2 87 | # via oslo-utils 88 | urllib3==2.5.0 89 | # via requests 90 | wrapt==2.0.1 91 | # via debtcollector 92 | -------------------------------------------------------------------------------- /requirements/2024.1/ubuntu_22.txt: -------------------------------------------------------------------------------- 1 | # This file was autogenerated by uv via the following command: 2 | # uv pip compile --output-file=/home/runner/work/openstack-multinode/openstack-multinode/requirements/2024.1/ubuntu_22.txt /home/runner/work/openstack-multinode/openstack-multinode/requirements/2024.1/pyproject.toml 3 | ansible-core==2.16.14 4 | # via caracal (requirements/2024.1/pyproject.toml) 5 | bcrypt==5.0.0 6 | # via 7 | # kolla-ansible 8 | # passlib 9 | certifi==2025.11.12 10 | # via requests 11 | cffi==2.0.0 12 | # via cryptography 13 | charset-normalizer==3.4.4 14 | # via requests 15 | cryptography==46.0.3 16 | # via 17 | # ansible-core 18 | # kolla-ansible 19 | debtcollector==3.0.0 20 | # via oslo-utils 21 | hvac==2.4.0 22 | # via kolla-ansible 23 | idna==3.11 24 | # via requests 25 | iso8601==2.1.0 26 | # via oslo-utils 27 | jinja2==3.1.6 28 | # via 29 | # ansible-core 30 | # kolla-ansible 31 | jmespath==1.0.1 32 | # via kolla-ansible 33 | kolla-ansible==18.8.0 34 | # via caracal (requirements/2024.1/pyproject.toml) 35 | markupsafe==3.0.3 36 | # via jinja2 37 | netaddr==1.3.0 38 | # via 39 | # oslo-config 40 | # oslo-utils 41 | oslo-config==10.1.0 42 | # via kolla-ansible 43 | oslo-i18n==6.7.0 44 | # via 45 | # oslo-config 46 | # oslo-utils 47 | oslo-utils==9.1.0 48 | # via kolla-ansible 49 | packaging==25.0 50 | # via 51 | # ansible-core 52 | # oslo-utils 53 | passlib==1.7.4 54 | # via kolla-ansible 55 | pbr==7.0.3 56 | # via 57 | # kolla-ansible 58 | # oslo-i18n 59 | # oslo-utils 60 | psutil==7.1.3 61 | # via oslo-utils 62 | pycparser==2.23 63 | # via cffi 64 | pyparsing==3.2.5 65 | # via oslo-utils 66 | pyyaml==6.0.3 67 | # via 68 | # ansible-core 69 | # kolla-ansible 70 | # oslo-config 71 | # oslo-utils 72 | requests==2.32.5 73 | # via 74 | # hvac 75 | # oslo-config 76 | resolvelib==1.0.1 77 | # via ansible-core 78 | rfc3986==2.0.0 79 | # via oslo-config 80 | setuptools==80.9.0 81 | # via pbr 82 | stevedore==5.5.0 83 | # via oslo-config 84 | typing-extensions==4.15.0 85 | # via cryptography 86 | tzdata==2025.2 87 | # via oslo-utils 88 | urllib3==2.5.0 89 | # via requests 90 | wrapt==2.0.1 91 | # via debtcollector 92 | -------------------------------------------------------------------------------- /scripts/neutron_trunk.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2021 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | set -o nounset 12 | set -o pipefail 13 | set -o errexit 14 | if [[ ${OS_DEBUG:-false} == "true" ]]; then 15 | export PKG_DEBUG=true 16 | set -o xtrace 17 | fi 18 | 19 | net_prefix=demo-net 20 | subnet_prefix=demo-subnet 21 | port_prefix=demo-port 22 | 23 | # PEP 370 -- Per user site-packages directory 24 | [[ $PATH != *.local/bin* ]] && export PATH=$PATH:$HOME/.local/bin 25 | 26 | if ! command -v neutron >/dev/null; then 27 | python -m pip install python-neutronclient 28 | fi 29 | 30 | # Create networks and subnets for the trunk and subports 31 | for i in $(seq 1 5); do 32 | if ! openstack network list -c Name | grep -q "$net_prefix$i"; then 33 | openstack network create "$net_prefix$i" 34 | fi 35 | if ! openstack subnet list -c Name | grep -q "$subnet_prefix$i"; then 36 | openstack subnet create --network "$net_prefix$i" --subnet-range "10.0.$i.0/24" "$subnet_prefix$i" 37 | fi 38 | if ! openstack port list -c name | grep -q "$port_prefix$i"; then 39 | openstack port create --network "$net_prefix$i" "$port_prefix$i" 40 | fi 41 | done 42 | 43 | if ! openstack port list -c name | grep -q "trunk-parent"; then 44 | openstack port create --network demo-net trunk-parent 45 | fi 46 | 47 | # Create the trunk and add subports to the trunk 48 | if ! openstack network trunk list -c Name | grep -q "trunk1"; then 49 | openstack network trunk create --parent-port trunk-parent trunk1 50 | fi 51 | for i in $(seq 1 5); do 52 | openstack network trunk set \ 53 | --subport port="$port_prefix$i,segmentation-type=vlan,segmentation-id=$i" \ 54 | trunk1 55 | done 56 | openstack network trunk show trunk1 57 | 58 | if ! openstack server list -c Name | grep -q "demo1"; then 59 | openstack server create --image cirros --flavor m1.tiny \ 60 | --key-name mykey --port trunk-parent --use-config-drive \ 61 | demo1 62 | fi 63 | -------------------------------------------------------------------------------- /requirements/2023.2/rocky_9.txt: -------------------------------------------------------------------------------- 1 | # This file was autogenerated by uv via the following command: 2 | # uv pip compile --output-file=/home/runner/work/openstack-multinode/openstack-multinode/requirements/2023.2/rocky_9.txt /home/runner/work/openstack-multinode/openstack-multinode/requirements/2023.2/pyproject.toml 3 | ansible-core==2.15.13 4 | # via bobcat (requirements/2023.2/pyproject.toml) 5 | bcrypt==5.0.0 6 | # via 7 | # kolla-ansible 8 | # passlib 9 | certifi==2025.11.12 10 | # via requests 11 | cffi==2.0.0 12 | # via cryptography 13 | charset-normalizer==3.4.4 14 | # via requests 15 | cryptography==46.0.3 16 | # via 17 | # ansible-core 18 | # kolla-ansible 19 | debtcollector==3.0.0 20 | # via oslo-utils 21 | hvac==2.4.0 22 | # via kolla-ansible 23 | idna==3.11 24 | # via requests 25 | importlib-resources==5.0.7 26 | # via ansible-core 27 | iso8601==2.1.0 28 | # via oslo-utils 29 | jinja2==3.1.6 30 | # via 31 | # ansible-core 32 | # kolla-ansible 33 | jmespath==1.0.1 34 | # via kolla-ansible 35 | kolla-ansible==17.9.0 36 | # via bobcat (requirements/2023.2/pyproject.toml) 37 | markupsafe==3.0.3 38 | # via jinja2 39 | netaddr==1.3.0 40 | # via 41 | # oslo-config 42 | # oslo-utils 43 | oslo-config==10.0.0 44 | # via kolla-ansible 45 | oslo-i18n==6.6.0 46 | # via 47 | # oslo-config 48 | # oslo-utils 49 | oslo-utils==9.1.0 50 | # via kolla-ansible 51 | packaging==25.0 52 | # via 53 | # ansible-core 54 | # oslo-utils 55 | passlib==1.7.4 56 | # via kolla-ansible 57 | pbr==7.0.3 58 | # via 59 | # kolla-ansible 60 | # oslo-i18n 61 | # oslo-utils 62 | psutil==7.1.3 63 | # via oslo-utils 64 | pycparser==2.23 65 | # via cffi 66 | pyparsing==3.2.5 67 | # via oslo-utils 68 | pyyaml==6.0.3 69 | # via 70 | # ansible-core 71 | # kolla-ansible 72 | # oslo-config 73 | # oslo-utils 74 | requests==2.32.5 75 | # via 76 | # hvac 77 | # oslo-config 78 | resolvelib==1.0.1 79 | # via ansible-core 80 | rfc3986==2.0.0 81 | # via oslo-config 82 | setuptools==80.9.0 83 | # via pbr 84 | stevedore==5.5.0 85 | # via oslo-config 86 | typing-extensions==4.15.0 87 | # via cryptography 88 | tzdata==2025.2 89 | # via oslo-utils 90 | urllib3==2.5.0 91 | # via requests 92 | wrapt==2.0.1 93 | # via debtcollector 94 | -------------------------------------------------------------------------------- /requirements/2023.2/debian_11.txt: -------------------------------------------------------------------------------- 1 | # This file was autogenerated by uv via the following command: 2 | # uv pip compile --output-file=/home/runner/work/openstack-multinode/openstack-multinode/requirements/2023.2/debian_11.txt /home/runner/work/openstack-multinode/openstack-multinode/requirements/2023.2/pyproject.toml 3 | ansible-core==2.15.13 4 | # via bobcat (requirements/2023.2/pyproject.toml) 5 | bcrypt==5.0.0 6 | # via 7 | # kolla-ansible 8 | # passlib 9 | certifi==2025.11.12 10 | # via requests 11 | cffi==2.0.0 12 | # via cryptography 13 | charset-normalizer==3.4.4 14 | # via requests 15 | cryptography==46.0.3 16 | # via 17 | # ansible-core 18 | # kolla-ansible 19 | debtcollector==3.0.0 20 | # via oslo-utils 21 | hvac==2.4.0 22 | # via kolla-ansible 23 | idna==3.11 24 | # via requests 25 | importlib-resources==5.0.7 26 | # via ansible-core 27 | iso8601==2.1.0 28 | # via oslo-utils 29 | jinja2==3.1.6 30 | # via 31 | # ansible-core 32 | # kolla-ansible 33 | jmespath==1.0.1 34 | # via kolla-ansible 35 | kolla-ansible==17.9.0 36 | # via bobcat (requirements/2023.2/pyproject.toml) 37 | markupsafe==3.0.3 38 | # via jinja2 39 | netaddr==1.3.0 40 | # via 41 | # oslo-config 42 | # oslo-utils 43 | oslo-config==10.0.0 44 | # via kolla-ansible 45 | oslo-i18n==6.6.0 46 | # via 47 | # oslo-config 48 | # oslo-utils 49 | oslo-utils==9.1.0 50 | # via kolla-ansible 51 | packaging==25.0 52 | # via 53 | # ansible-core 54 | # oslo-utils 55 | passlib==1.7.4 56 | # via kolla-ansible 57 | pbr==7.0.3 58 | # via 59 | # kolla-ansible 60 | # oslo-i18n 61 | # oslo-utils 62 | psutil==7.1.3 63 | # via oslo-utils 64 | pycparser==2.23 65 | # via cffi 66 | pyparsing==3.2.5 67 | # via oslo-utils 68 | pyyaml==6.0.3 69 | # via 70 | # ansible-core 71 | # kolla-ansible 72 | # oslo-config 73 | # oslo-utils 74 | requests==2.32.5 75 | # via 76 | # hvac 77 | # oslo-config 78 | resolvelib==1.0.1 79 | # via ansible-core 80 | rfc3986==2.0.0 81 | # via oslo-config 82 | setuptools==80.9.0 83 | # via pbr 84 | stevedore==5.5.0 85 | # via oslo-config 86 | typing-extensions==4.15.0 87 | # via cryptography 88 | tzdata==2025.2 89 | # via oslo-utils 90 | urllib3==2.5.0 91 | # via requests 92 | wrapt==2.0.1 93 | # via debtcollector 94 | -------------------------------------------------------------------------------- /requirements/2024.1/debian_11.txt: -------------------------------------------------------------------------------- 1 | # This file was autogenerated by uv via the following command: 2 | # uv pip compile --output-file=/home/runner/work/openstack-multinode/openstack-multinode/requirements/2024.1/debian_11.txt /home/runner/work/openstack-multinode/openstack-multinode/requirements/2024.1/pyproject.toml 3 | ansible-core==2.15.13 4 | # via caracal (requirements/2024.1/pyproject.toml) 5 | bcrypt==5.0.0 6 | # via 7 | # kolla-ansible 8 | # passlib 9 | certifi==2025.11.12 10 | # via requests 11 | cffi==2.0.0 12 | # via cryptography 13 | charset-normalizer==3.4.4 14 | # via requests 15 | cryptography==46.0.3 16 | # via 17 | # ansible-core 18 | # kolla-ansible 19 | debtcollector==3.0.0 20 | # via oslo-utils 21 | hvac==2.4.0 22 | # via kolla-ansible 23 | idna==3.11 24 | # via requests 25 | importlib-resources==5.0.7 26 | # via ansible-core 27 | iso8601==2.1.0 28 | # via oslo-utils 29 | jinja2==3.1.6 30 | # via 31 | # ansible-core 32 | # kolla-ansible 33 | jmespath==1.0.1 34 | # via kolla-ansible 35 | kolla-ansible==18.8.0 36 | # via caracal (requirements/2024.1/pyproject.toml) 37 | markupsafe==3.0.3 38 | # via jinja2 39 | netaddr==1.3.0 40 | # via 41 | # oslo-config 42 | # oslo-utils 43 | oslo-config==10.0.0 44 | # via kolla-ansible 45 | oslo-i18n==6.6.0 46 | # via 47 | # oslo-config 48 | # oslo-utils 49 | oslo-utils==9.1.0 50 | # via kolla-ansible 51 | packaging==25.0 52 | # via 53 | # ansible-core 54 | # oslo-utils 55 | passlib==1.7.4 56 | # via kolla-ansible 57 | pbr==7.0.3 58 | # via 59 | # kolla-ansible 60 | # oslo-i18n 61 | # oslo-utils 62 | psutil==7.1.3 63 | # via oslo-utils 64 | pycparser==2.23 65 | # via cffi 66 | pyparsing==3.2.5 67 | # via oslo-utils 68 | pyyaml==6.0.3 69 | # via 70 | # ansible-core 71 | # kolla-ansible 72 | # oslo-config 73 | # oslo-utils 74 | requests==2.32.5 75 | # via 76 | # hvac 77 | # oslo-config 78 | resolvelib==1.0.1 79 | # via ansible-core 80 | rfc3986==2.0.0 81 | # via oslo-config 82 | setuptools==80.9.0 83 | # via pbr 84 | stevedore==5.5.0 85 | # via oslo-config 86 | typing-extensions==4.15.0 87 | # via cryptography 88 | tzdata==2025.2 89 | # via oslo-utils 90 | urllib3==2.5.0 91 | # via requests 92 | wrapt==2.0.1 93 | # via debtcollector 94 | -------------------------------------------------------------------------------- /requirements/2024.1/rocky_9.txt: -------------------------------------------------------------------------------- 1 | # This file was autogenerated by uv via the following command: 2 | # uv pip compile --output-file=/home/runner/work/openstack-multinode/openstack-multinode/requirements/2024.1/rocky_9.txt /home/runner/work/openstack-multinode/openstack-multinode/requirements/2024.1/pyproject.toml 3 | ansible-core==2.15.13 4 | # via caracal (requirements/2024.1/pyproject.toml) 5 | bcrypt==5.0.0 6 | # via 7 | # kolla-ansible 8 | # passlib 9 | certifi==2025.11.12 10 | # via requests 11 | cffi==2.0.0 12 | # via cryptography 13 | charset-normalizer==3.4.4 14 | # via requests 15 | cryptography==46.0.3 16 | # via 17 | # ansible-core 18 | # kolla-ansible 19 | debtcollector==3.0.0 20 | # via oslo-utils 21 | hvac==2.4.0 22 | # via kolla-ansible 23 | idna==3.11 24 | # via requests 25 | importlib-resources==5.0.7 26 | # via ansible-core 27 | iso8601==2.1.0 28 | # via oslo-utils 29 | jinja2==3.1.6 30 | # via 31 | # ansible-core 32 | # kolla-ansible 33 | jmespath==1.0.1 34 | # via kolla-ansible 35 | kolla-ansible==18.8.0 36 | # via caracal (requirements/2024.1/pyproject.toml) 37 | markupsafe==3.0.3 38 | # via jinja2 39 | netaddr==1.3.0 40 | # via 41 | # oslo-config 42 | # oslo-utils 43 | oslo-config==10.0.0 44 | # via kolla-ansible 45 | oslo-i18n==6.6.0 46 | # via 47 | # oslo-config 48 | # oslo-utils 49 | oslo-utils==9.1.0 50 | # via kolla-ansible 51 | packaging==25.0 52 | # via 53 | # ansible-core 54 | # oslo-utils 55 | passlib==1.7.4 56 | # via kolla-ansible 57 | pbr==7.0.3 58 | # via 59 | # kolla-ansible 60 | # oslo-i18n 61 | # oslo-utils 62 | psutil==7.1.3 63 | # via oslo-utils 64 | pycparser==2.23 65 | # via cffi 66 | pyparsing==3.2.5 67 | # via oslo-utils 68 | pyyaml==6.0.3 69 | # via 70 | # ansible-core 71 | # kolla-ansible 72 | # oslo-config 73 | # oslo-utils 74 | requests==2.32.5 75 | # via 76 | # hvac 77 | # oslo-config 78 | resolvelib==1.0.1 79 | # via ansible-core 80 | rfc3986==2.0.0 81 | # via oslo-config 82 | setuptools==80.9.0 83 | # via pbr 84 | stevedore==5.5.0 85 | # via oslo-config 86 | typing-extensions==4.15.0 87 | # via cryptography 88 | tzdata==2025.2 89 | # via oslo-utils 90 | urllib3==2.5.0 91 | # via requests 92 | wrapt==2.0.1 93 | # via debtcollector 94 | -------------------------------------------------------------------------------- /samples/distributed/pdf.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2018 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | # Network Definitions: 12 | 13 | # Management Network(mgmt-net) - This interface is used by OpenStack services and databases to communicate to each other. 14 | # Tunnel Network(tunnel-net) - This interface is used by Neutron for vm-to-vm traffic over tunnel-neted networks (like VxLan). 15 | # Storage Network(storage-net) - This interface is used virtual machines to communicate to Ceph. 16 | # External Network(external-net) This is the raw interface given to neutron as its external network port. 17 | - name: "registry" 18 | memory: 8192 19 | cpus: 1 20 | volumes: 21 | - name: sdb 22 | size: 50 23 | mount: /var/lib/docker/ 24 | networks: 25 | - name: tunnel-net 26 | ip: "10.10.13.2" 27 | roles: 28 | - registry 29 | - name: "control01" 30 | memory: 8192 31 | cpus: 1 32 | networks: 33 | - name: tunnel-net 34 | ip: "10.10.13.4" 35 | roles: 36 | - controller 37 | - network 38 | - name: "control02" 39 | memory: 8192 40 | cpus: 1 41 | networks: 42 | - name: tunnel-net 43 | ip: "10.10.13.5" 44 | roles: 45 | - controller 46 | - network 47 | - name: "control03" 48 | memory: 8192 49 | cpus: 1 50 | networks: 51 | - name: tunnel-net 52 | ip: "10.10.13.6" 53 | roles: 54 | - controller 55 | - network 56 | - name: "compute01" 57 | memory: 8192 58 | cpus: 1 59 | networks: 60 | - name: tunnel-net 61 | ip: "10.10.13.33" 62 | - name: storage-net 63 | ip: "10.10.14.33" 64 | roles: 65 | - compute 66 | - name: "storage01" 67 | memory: 8192 68 | cpus: 1 69 | networks: 70 | - name: tunnel-net 71 | ip: "10.10.13.97" 72 | - name: storage-net 73 | ip: "10.10.14.97" 74 | roles: 75 | - storage 76 | volumes: 77 | - name: sdb 78 | size: 100 79 | - name: "monitoring01" 80 | memory: 8192 81 | cpus: 1 82 | networks: 83 | - name: tunnel-net 84 | ip: "10.10.13.129" 85 | roles: 86 | - monitoring 87 | -------------------------------------------------------------------------------- /.github/workflows/on-demand_noha.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2021 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | name: Check No High Availability setup 11 | # yamllint disable-line rule:truthy 12 | on: 13 | push: 14 | paths: 15 | - "*.sh" 16 | - "*.yml" 17 | - "samples/noha/*" 18 | - "etc/**" 19 | - "!.github/**" 20 | pull_request_review: 21 | types: 22 | - submitted 23 | permissions: read-all 24 | jobs: 25 | check-noha-ubuntu: 26 | name: Check No High Availability deployment on Ubuntu Focal Virtual Machines 27 | runs-on: vm-self-hosted 28 | if: >- 29 | ( github.event_name == 'pull_request_review' && github.event.review.state == 'approved' ) || github.event_name != 'pull_request_review' 30 | env: 31 | VAGRANT_DISABLE_VBOXSYMLINKCREATE: 1 32 | VAGRANT_EXPERIMENTAL: disks 33 | OS_NUM_COMPUTE_NODES: 1 34 | steps: 35 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 36 | with: 37 | persist-credentials: false 38 | - uses: ./.github/actions/vagrant-setup 39 | - name: Install Vagrant Reload plugin 40 | run: vagrant plugin install vagrant-reload 41 | - name: Deploy OpenStack Compute nodes 42 | env: 43 | MEMORY: 12288 44 | CPU: 3 45 | working-directory: ./samples/noha 46 | run: vagrant up compute01 47 | - name: Reload OpenStack Compute nodes 48 | env: 49 | MEMORY: 4096 50 | CPU: 1 51 | working-directory: ./samples/noha 52 | run: vagrant reload compute01 53 | # NOTE: macOS provides 3 vCPUS and 14 GB of RAM (https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources) 54 | - name: Deploy OpenStack Control nodes 55 | env: 56 | OS_DEBUG: true 57 | OS_ENABLE_LOCAL_REGISTRY: false 58 | MEMORY: 8192 59 | CPU: 2 60 | working-directory: ./samples/noha 61 | run: vagrant up controller 62 | - name: Check HW resources 63 | if: failure() 64 | run: | 65 | VBoxManage list runningvms --long 66 | cat ~/VirtualBox\ VMs/*/Logs/*.log 67 | -------------------------------------------------------------------------------- /scripts/magnum.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2020 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | set -o nounset 12 | set -o pipefail 13 | set -o errexit 14 | if [[ ${OS_DEBUG:-false} == "true" ]]; then 15 | export PKG_DEBUG=true 16 | set -o xtrace 17 | fi 18 | 19 | fedora_image_file="$HOME/Fedora-Cloud.qcow2" 20 | os_glance_image=fedora-atomic 21 | os_magnum_template=kubernetes-cluster-template 22 | os_magnum_cluster=${1:-kubernetes-cluster} 23 | 24 | # PEP 370 -- Per user site-packages directory 25 | [[ $PATH != *.local/bin* ]] && export PATH=$PATH:$HOME/.local/bin 26 | 27 | # NOTE: Shorten link -> https://github.com/electrocucaracha/pkg-mgr_scripts 28 | curl -fsSL http://bit.ly/install_pkg | PKG_COMMANDS_LIST="pip,kubectl" bash 29 | 30 | if ! command -v magnum; then 31 | python -m pip install python-magnumclient 32 | fi 33 | 34 | if [ ! -f "$fedora_image_file" ]; then 35 | curl -o "$fedora_image_file" -sL https://download.fedoraproject.org/pub/fedora/linux/releases/32/Cloud/x86_64/images/Fedora-Cloud-Base-32-1.6.x86_64.qcow2 36 | fi 37 | 38 | if ! openstack image list --name "$os_glance_image" | grep -q "$os_glance_image"; then 39 | openstack image create --disk-format=qcow2 --container-format=bare \ 40 | --file="$fedora_image_file" --property os_distro='fedora-atomic' \ 41 | "$os_glance_image" 42 | fi 43 | 44 | if ! openstack coe cluster template list | grep -q "$os_magnum_template"; then 45 | openstack coe cluster template create "$os_magnum_template" \ 46 | --image "$os_glance_image" --external-network public1 \ 47 | --dns-nameserver 8.8.8.8 --master-flavor m1.small \ 48 | --flavor m1.small --coe kubernetes --docker-volume-size 3 49 | fi 50 | 51 | if ! openstack coe cluster list | grep -q "$os_magnum_cluster"; then 52 | openstack coe cluster create "$os_magnum_cluster" \ 53 | --cluster-template "$os_magnum_template" \ 54 | --master-count 1 \ 55 | --node-count 1 \ 56 | --keypair mykey 57 | fi 58 | 59 | mkdir -p ~/clusters/kubernetes-cluster 60 | #$(openstack coe cluster config kubernetes-cluster --dir ~/clusters/kubernetes-cluster) 61 | #export KUBECONFIG=/home/user/clusters/kubernetes-cluster/config 62 | #kubectl -n kube-system get po 63 | -------------------------------------------------------------------------------- /.github/workflows/scheduled_aio.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2022 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | name: Scheduled OpenStack All-in-One verification 11 | # yamllint disable-line rule:truthy 12 | on: 13 | schedule: 14 | - cron: "0 0 * * 5" 15 | workflow_dispatch: 16 | permissions: read-all 17 | jobs: 18 | generate-json-matrix: 19 | runs-on: ubuntu-latest 20 | permissions: 21 | contents: read 22 | steps: 23 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 24 | with: 25 | persist-credentials: false 26 | - name: Get matrix values 27 | id: set-matrix 28 | run: | 29 | if ! command -v shyaml; then 30 | if ! command -v pip; then 31 | apt-get update 32 | apt-get install -y --no-install-recommends python3-pip 33 | fi 34 | python -m pip install shyaml 35 | fi 36 | if ! command -v jq; then 37 | apt-get update 38 | apt-get install -y --no-install-recommends jq 39 | fi 40 | echo "matrix=$(shyaml keys < distros_supported.yml|jq -cnR '[inputs | select(length>0)]')" >>"$GITHUB_OUTPUT" 41 | outputs: 42 | matrix: ${{ steps.set-matrix.outputs.matrix }} 43 | check-aio-vms: 44 | name: Check All-in-One deployment on Virtual Machines 45 | needs: generate-json-matrix 46 | strategy: 47 | fail-fast: false 48 | matrix: 49 | distro: ${{ fromJson(needs.generate-json-matrix.outputs.matrix) }} 50 | runs-on: vm-self-hosted 51 | permissions: 52 | contents: read 53 | steps: 54 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 55 | with: 56 | persist-credentials: false 57 | - uses: ./.github/actions/vagrant-setup 58 | - name: Deploy latest release in All-in-One instance 59 | env: 60 | CI_INITIAL_RELEASE_POINTER: 1 61 | CPU: 2 62 | MEMORY: 12288 63 | OS_DISTRO: ${{ matrix.distro }} 64 | run: ./ci/check_aio.sh 65 | - name: Check HW resources 66 | if: failure() 67 | run: | 68 | VBoxManage list runningvms --long 69 | cat ~/VirtualBox\ VMs/*/Logs/*.log 70 | -------------------------------------------------------------------------------- /.github/workflows/linter.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2020 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | name: Lint Code Base 11 | # yamllint disable-line rule:truthy 12 | on: 13 | push: 14 | pull_request: 15 | permissions: read-all 16 | jobs: 17 | get-sloc: 18 | name: Count Lines of Code 19 | runs-on: ubuntu-latest 20 | permissions: 21 | contents: read 22 | steps: 23 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 24 | with: 25 | persist-credentials: false 26 | - name: Setup Go 27 | uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # 6.0.0 28 | with: 29 | go-version: ">=1.20.0" 30 | - name: Install dependencies 31 | run: go install github.com/boyter/scc/v3@latest 32 | - name: Run scc tool 33 | run: scc --format wide 34 | check-broken-links: 35 | name: Check documentation external links 36 | runs-on: ubuntu-latest 37 | permissions: 38 | contents: read 39 | steps: 40 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 41 | with: 42 | persist-credentials: false 43 | - name: Check broken links 44 | uses: tcort/github-action-markdown-link-check@f3d33029dca1c4a24b87e2df648f9f4604ef6533 # 1.1.1 45 | check-super-linter: 46 | name: Check syntax (super-linter) 47 | runs-on: ubuntu-latest 48 | permissions: 49 | contents: read 50 | steps: 51 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 52 | with: 53 | persist-credentials: false 54 | - uses: super-linter/super-linter@2bdd90ed3262e023ac84bf8fe35dc480721fc1f2 # 8.2.1 55 | env: 56 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 57 | LINTER_RULES_PATH: / 58 | EDITORCONFIG_FILE_NAME: .editorconfig-checker.json 59 | FILTER_REGEX_EXCLUDE: "requirements/.*" 60 | VALIDATE_SHELL_SHFMT: false 61 | VALIDATE_BIOME_FORMAT: false 62 | DEFAULT_BRANCH: ${{ github.head_ref || github.ref_name }} 63 | check-tox: 64 | name: Check syntax (tox) 65 | runs-on: ubuntu-latest 66 | permissions: 67 | contents: read 68 | steps: 69 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 70 | with: 71 | persist-credentials: false 72 | - name: Install tox 73 | run: python -m pip install tox --break-system-packages 74 | - name: Run tox lint validation 75 | run: tox -e lint 76 | -------------------------------------------------------------------------------- /requirements/2025.1/rocky_9.txt: -------------------------------------------------------------------------------- 1 | # This file was autogenerated by uv via the following command: 2 | # uv pip compile --output-file=/home/runner/work/openstack-multinode/openstack-multinode/requirements/2025.1/rocky_9.txt /home/runner/work/openstack-multinode/openstack-multinode/requirements/2025.1/pyproject.toml 3 | ansible-core==2.17.14 4 | # via 5 | # epoxy (requirements/2025.1/pyproject.toml) 6 | # kolla-ansible 7 | autopage==0.5.2 8 | # via cliff 9 | bcrypt==5.0.0 10 | # via 11 | # kolla-ansible 12 | # passlib 13 | certifi==2025.11.12 14 | # via requests 15 | cffi==2.0.0 16 | # via cryptography 17 | charset-normalizer==3.4.4 18 | # via requests 19 | cliff==4.11.0 20 | # via kolla-ansible 21 | cmd2==2.7.0 22 | # via cliff 23 | cryptography==46.0.3 24 | # via 25 | # ansible-core 26 | # kolla-ansible 27 | debtcollector==3.0.0 28 | # via oslo-utils 29 | hvac==2.4.0 30 | # via kolla-ansible 31 | idna==3.11 32 | # via requests 33 | iso8601==2.1.0 34 | # via oslo-utils 35 | jinja2==3.1.6 36 | # via 37 | # ansible-core 38 | # kolla-ansible 39 | jmespath==1.0.1 40 | # via kolla-ansible 41 | kolla-ansible==20.3.0 42 | # via epoxy (requirements/2025.1/pyproject.toml) 43 | markdown-it-py==4.0.0 44 | # via rich 45 | markupsafe==3.0.3 46 | # via jinja2 47 | mdurl==0.1.2 48 | # via markdown-it-py 49 | netaddr==1.3.0 50 | # via 51 | # oslo-config 52 | # oslo-utils 53 | oslo-config==10.1.0 54 | # via kolla-ansible 55 | oslo-i18n==6.7.0 56 | # via 57 | # oslo-config 58 | # oslo-utils 59 | oslo-utils==9.1.0 60 | # via kolla-ansible 61 | packaging==25.0 62 | # via 63 | # ansible-core 64 | # oslo-utils 65 | passlib==1.7.4 66 | # via kolla-ansible 67 | pbr==7.0.3 68 | # via 69 | # oslo-i18n 70 | # oslo-utils 71 | prettytable==3.17.0 72 | # via cliff 73 | psutil==7.1.3 74 | # via oslo-utils 75 | pycparser==2.23 76 | # via cffi 77 | pygments==2.19.2 78 | # via rich 79 | pyparsing==3.2.5 80 | # via oslo-utils 81 | pyperclip==1.11.0 82 | # via cmd2 83 | pyyaml==6.0.3 84 | # via 85 | # ansible-core 86 | # cliff 87 | # oslo-config 88 | # oslo-utils 89 | requests==2.32.5 90 | # via 91 | # hvac 92 | # oslo-config 93 | resolvelib==1.0.1 94 | # via ansible-core 95 | rfc3986==2.0.0 96 | # via oslo-config 97 | rich==14.2.0 98 | # via rich-argparse 99 | rich-argparse==1.7.2 100 | # via cmd2 101 | setuptools==80.9.0 102 | # via pbr 103 | stevedore==5.5.0 104 | # via 105 | # cliff 106 | # oslo-config 107 | tzdata==2025.2 108 | # via oslo-utils 109 | urllib3==2.5.0 110 | # via requests 111 | wcwidth==0.2.14 112 | # via 113 | # cmd2 114 | # prettytable 115 | wrapt==2.0.1 116 | # via debtcollector 117 | -------------------------------------------------------------------------------- /requirements/2025.1/debian_12.txt: -------------------------------------------------------------------------------- 1 | # This file was autogenerated by uv via the following command: 2 | # uv pip compile --output-file=/home/runner/work/openstack-multinode/openstack-multinode/requirements/2025.1/debian_12.txt /home/runner/work/openstack-multinode/openstack-multinode/requirements/2025.1/pyproject.toml 3 | ansible-core==2.17.14 4 | # via 5 | # epoxy (requirements/2025.1/pyproject.toml) 6 | # kolla-ansible 7 | autopage==0.5.2 8 | # via cliff 9 | bcrypt==5.0.0 10 | # via 11 | # kolla-ansible 12 | # passlib 13 | certifi==2025.11.12 14 | # via requests 15 | cffi==2.0.0 16 | # via cryptography 17 | charset-normalizer==3.4.4 18 | # via requests 19 | cliff==4.11.0 20 | # via kolla-ansible 21 | cmd2==2.7.0 22 | # via cliff 23 | cryptography==46.0.3 24 | # via 25 | # ansible-core 26 | # kolla-ansible 27 | debtcollector==3.0.0 28 | # via oslo-utils 29 | hvac==2.4.0 30 | # via kolla-ansible 31 | idna==3.11 32 | # via requests 33 | iso8601==2.1.0 34 | # via oslo-utils 35 | jinja2==3.1.6 36 | # via 37 | # ansible-core 38 | # kolla-ansible 39 | jmespath==1.0.1 40 | # via kolla-ansible 41 | kolla-ansible==20.3.0 42 | # via epoxy (requirements/2025.1/pyproject.toml) 43 | markdown-it-py==4.0.0 44 | # via rich 45 | markupsafe==3.0.3 46 | # via jinja2 47 | mdurl==0.1.2 48 | # via markdown-it-py 49 | netaddr==1.3.0 50 | # via 51 | # oslo-config 52 | # oslo-utils 53 | oslo-config==10.1.0 54 | # via kolla-ansible 55 | oslo-i18n==6.7.0 56 | # via 57 | # oslo-config 58 | # oslo-utils 59 | oslo-utils==9.1.0 60 | # via kolla-ansible 61 | packaging==25.0 62 | # via 63 | # ansible-core 64 | # oslo-utils 65 | passlib==1.7.4 66 | # via kolla-ansible 67 | pbr==7.0.3 68 | # via 69 | # oslo-i18n 70 | # oslo-utils 71 | prettytable==3.17.0 72 | # via cliff 73 | psutil==7.1.3 74 | # via oslo-utils 75 | pycparser==2.23 76 | # via cffi 77 | pygments==2.19.2 78 | # via rich 79 | pyparsing==3.2.5 80 | # via oslo-utils 81 | pyperclip==1.11.0 82 | # via cmd2 83 | pyyaml==6.0.3 84 | # via 85 | # ansible-core 86 | # cliff 87 | # oslo-config 88 | # oslo-utils 89 | requests==2.32.5 90 | # via 91 | # hvac 92 | # oslo-config 93 | resolvelib==1.0.1 94 | # via ansible-core 95 | rfc3986==2.0.0 96 | # via oslo-config 97 | rich==14.2.0 98 | # via rich-argparse 99 | rich-argparse==1.7.2 100 | # via cmd2 101 | setuptools==80.9.0 102 | # via pbr 103 | stevedore==5.5.0 104 | # via 105 | # cliff 106 | # oslo-config 107 | tzdata==2025.2 108 | # via oslo-utils 109 | urllib3==2.5.0 110 | # via requests 111 | wcwidth==0.2.14 112 | # via 113 | # cmd2 114 | # prettytable 115 | wrapt==2.0.1 116 | # via debtcollector 117 | -------------------------------------------------------------------------------- /requirements/2025.1/ubuntu_24.txt: -------------------------------------------------------------------------------- 1 | # This file was autogenerated by uv via the following command: 2 | # uv pip compile --output-file=/home/runner/work/openstack-multinode/openstack-multinode/requirements/2025.1/ubuntu_24.txt /home/runner/work/openstack-multinode/openstack-multinode/requirements/2025.1/pyproject.toml 3 | ansible-core==2.17.14 4 | # via 5 | # epoxy (requirements/2025.1/pyproject.toml) 6 | # kolla-ansible 7 | autopage==0.5.2 8 | # via cliff 9 | bcrypt==5.0.0 10 | # via 11 | # kolla-ansible 12 | # passlib 13 | certifi==2025.11.12 14 | # via requests 15 | cffi==2.0.0 16 | # via cryptography 17 | charset-normalizer==3.4.4 18 | # via requests 19 | cliff==4.11.0 20 | # via kolla-ansible 21 | cmd2==2.7.0 22 | # via cliff 23 | cryptography==46.0.3 24 | # via 25 | # ansible-core 26 | # kolla-ansible 27 | debtcollector==3.0.0 28 | # via oslo-utils 29 | hvac==2.4.0 30 | # via kolla-ansible 31 | idna==3.11 32 | # via requests 33 | iso8601==2.1.0 34 | # via oslo-utils 35 | jinja2==3.1.6 36 | # via 37 | # ansible-core 38 | # kolla-ansible 39 | jmespath==1.0.1 40 | # via kolla-ansible 41 | kolla-ansible==20.3.0 42 | # via epoxy (requirements/2025.1/pyproject.toml) 43 | markdown-it-py==4.0.0 44 | # via rich 45 | markupsafe==3.0.3 46 | # via jinja2 47 | mdurl==0.1.2 48 | # via markdown-it-py 49 | netaddr==1.3.0 50 | # via 51 | # oslo-config 52 | # oslo-utils 53 | oslo-config==10.1.0 54 | # via kolla-ansible 55 | oslo-i18n==6.7.0 56 | # via 57 | # oslo-config 58 | # oslo-utils 59 | oslo-utils==9.1.0 60 | # via kolla-ansible 61 | packaging==25.0 62 | # via 63 | # ansible-core 64 | # oslo-utils 65 | passlib==1.7.4 66 | # via kolla-ansible 67 | pbr==7.0.3 68 | # via 69 | # oslo-i18n 70 | # oslo-utils 71 | prettytable==3.17.0 72 | # via cliff 73 | psutil==7.1.3 74 | # via oslo-utils 75 | pycparser==2.23 76 | # via cffi 77 | pygments==2.19.2 78 | # via rich 79 | pyparsing==3.2.5 80 | # via oslo-utils 81 | pyperclip==1.11.0 82 | # via cmd2 83 | pyyaml==6.0.3 84 | # via 85 | # ansible-core 86 | # cliff 87 | # oslo-config 88 | # oslo-utils 89 | requests==2.32.5 90 | # via 91 | # hvac 92 | # oslo-config 93 | resolvelib==1.0.1 94 | # via ansible-core 95 | rfc3986==2.0.0 96 | # via oslo-config 97 | rich==14.2.0 98 | # via rich-argparse 99 | rich-argparse==1.7.2 100 | # via cmd2 101 | setuptools==80.9.0 102 | # via pbr 103 | stevedore==5.5.0 104 | # via 105 | # cliff 106 | # oslo-config 107 | tzdata==2025.2 108 | # via oslo-utils 109 | urllib3==2.5.0 110 | # via requests 111 | wcwidth==0.2.14 112 | # via 113 | # cmd2 114 | # prettytable 115 | wrapt==2.0.1 116 | # via debtcollector 117 | -------------------------------------------------------------------------------- /requirements/2024.2/debian_12.txt: -------------------------------------------------------------------------------- 1 | # This file was autogenerated by uv via the following command: 2 | # uv pip compile --output-file=/home/runner/work/openstack-multinode/openstack-multinode/requirements/2024.2/debian_12.txt /home/runner/work/openstack-multinode/openstack-multinode/requirements/2024.2/pyproject.toml 3 | ansible-core==2.17.14 4 | # via 5 | # dalmatian (requirements/2024.2/pyproject.toml) 6 | # kolla-ansible 7 | autopage==0.5.2 8 | # via cliff 9 | bcrypt==5.0.0 10 | # via 11 | # kolla-ansible 12 | # passlib 13 | certifi==2025.11.12 14 | # via requests 15 | cffi==2.0.0 16 | # via cryptography 17 | charset-normalizer==3.4.4 18 | # via requests 19 | cliff==4.11.0 20 | # via kolla-ansible 21 | cmd2==2.7.0 22 | # via cliff 23 | cryptography==46.0.3 24 | # via 25 | # ansible-core 26 | # kolla-ansible 27 | debtcollector==3.0.0 28 | # via oslo-utils 29 | hvac==2.4.0 30 | # via kolla-ansible 31 | idna==3.11 32 | # via requests 33 | iso8601==2.1.0 34 | # via oslo-utils 35 | jinja2==3.1.6 36 | # via 37 | # ansible-core 38 | # kolla-ansible 39 | jmespath==1.0.1 40 | # via kolla-ansible 41 | kolla-ansible==19.7.0 42 | # via dalmatian (requirements/2024.2/pyproject.toml) 43 | markdown-it-py==4.0.0 44 | # via rich 45 | markupsafe==3.0.3 46 | # via jinja2 47 | mdurl==0.1.2 48 | # via markdown-it-py 49 | netaddr==1.3.0 50 | # via 51 | # oslo-config 52 | # oslo-utils 53 | oslo-config==10.1.0 54 | # via kolla-ansible 55 | oslo-i18n==6.7.0 56 | # via 57 | # oslo-config 58 | # oslo-utils 59 | oslo-utils==9.1.0 60 | # via kolla-ansible 61 | packaging==25.0 62 | # via 63 | # ansible-core 64 | # oslo-utils 65 | passlib==1.7.4 66 | # via kolla-ansible 67 | pbr==7.0.3 68 | # via 69 | # oslo-i18n 70 | # oslo-utils 71 | prettytable==3.17.0 72 | # via cliff 73 | psutil==7.1.3 74 | # via oslo-utils 75 | pycparser==2.23 76 | # via cffi 77 | pygments==2.19.2 78 | # via rich 79 | pyparsing==3.2.5 80 | # via oslo-utils 81 | pyperclip==1.11.0 82 | # via cmd2 83 | pyyaml==6.0.3 84 | # via 85 | # ansible-core 86 | # cliff 87 | # oslo-config 88 | # oslo-utils 89 | requests==2.32.5 90 | # via 91 | # hvac 92 | # oslo-config 93 | resolvelib==1.0.1 94 | # via ansible-core 95 | rfc3986==2.0.0 96 | # via oslo-config 97 | rich==14.2.0 98 | # via rich-argparse 99 | rich-argparse==1.7.2 100 | # via cmd2 101 | setuptools==80.9.0 102 | # via pbr 103 | stevedore==5.5.0 104 | # via 105 | # cliff 106 | # oslo-config 107 | tzdata==2025.2 108 | # via oslo-utils 109 | urllib3==2.5.0 110 | # via requests 111 | wcwidth==0.2.14 112 | # via 113 | # cmd2 114 | # prettytable 115 | wrapt==2.0.1 116 | # via debtcollector 117 | -------------------------------------------------------------------------------- /requirements/2024.2/rocky_9.txt: -------------------------------------------------------------------------------- 1 | # This file was autogenerated by uv via the following command: 2 | # uv pip compile --output-file=/home/runner/work/openstack-multinode/openstack-multinode/requirements/2024.2/rocky_9.txt /home/runner/work/openstack-multinode/openstack-multinode/requirements/2024.2/pyproject.toml 3 | ansible-core==2.17.14 4 | # via 5 | # dalmatian (requirements/2024.2/pyproject.toml) 6 | # kolla-ansible 7 | autopage==0.5.2 8 | # via cliff 9 | bcrypt==5.0.0 10 | # via 11 | # kolla-ansible 12 | # passlib 13 | certifi==2025.11.12 14 | # via requests 15 | cffi==2.0.0 16 | # via cryptography 17 | charset-normalizer==3.4.4 18 | # via requests 19 | cliff==4.11.0 20 | # via kolla-ansible 21 | cmd2==2.7.0 22 | # via cliff 23 | cryptography==46.0.3 24 | # via 25 | # ansible-core 26 | # kolla-ansible 27 | debtcollector==3.0.0 28 | # via oslo-utils 29 | hvac==2.4.0 30 | # via kolla-ansible 31 | idna==3.11 32 | # via requests 33 | iso8601==2.1.0 34 | # via oslo-utils 35 | jinja2==3.1.6 36 | # via 37 | # ansible-core 38 | # kolla-ansible 39 | jmespath==1.0.1 40 | # via kolla-ansible 41 | kolla-ansible==19.7.0 42 | # via dalmatian (requirements/2024.2/pyproject.toml) 43 | markdown-it-py==4.0.0 44 | # via rich 45 | markupsafe==3.0.3 46 | # via jinja2 47 | mdurl==0.1.2 48 | # via markdown-it-py 49 | netaddr==1.3.0 50 | # via 51 | # oslo-config 52 | # oslo-utils 53 | oslo-config==10.1.0 54 | # via kolla-ansible 55 | oslo-i18n==6.7.0 56 | # via 57 | # oslo-config 58 | # oslo-utils 59 | oslo-utils==9.1.0 60 | # via kolla-ansible 61 | packaging==25.0 62 | # via 63 | # ansible-core 64 | # oslo-utils 65 | passlib==1.7.4 66 | # via kolla-ansible 67 | pbr==7.0.3 68 | # via 69 | # oslo-i18n 70 | # oslo-utils 71 | prettytable==3.17.0 72 | # via cliff 73 | psutil==7.1.3 74 | # via oslo-utils 75 | pycparser==2.23 76 | # via cffi 77 | pygments==2.19.2 78 | # via rich 79 | pyparsing==3.2.5 80 | # via oslo-utils 81 | pyperclip==1.11.0 82 | # via cmd2 83 | pyyaml==6.0.3 84 | # via 85 | # ansible-core 86 | # cliff 87 | # oslo-config 88 | # oslo-utils 89 | requests==2.32.5 90 | # via 91 | # hvac 92 | # oslo-config 93 | resolvelib==1.0.1 94 | # via ansible-core 95 | rfc3986==2.0.0 96 | # via oslo-config 97 | rich==14.2.0 98 | # via rich-argparse 99 | rich-argparse==1.7.2 100 | # via cmd2 101 | setuptools==80.9.0 102 | # via pbr 103 | stevedore==5.5.0 104 | # via 105 | # cliff 106 | # oslo-config 107 | tzdata==2025.2 108 | # via oslo-utils 109 | urllib3==2.5.0 110 | # via requests 111 | wcwidth==0.2.14 112 | # via 113 | # cmd2 114 | # prettytable 115 | wrapt==2.0.1 116 | # via debtcollector 117 | -------------------------------------------------------------------------------- /requirements/2024.2/ubuntu_22.txt: -------------------------------------------------------------------------------- 1 | # This file was autogenerated by uv via the following command: 2 | # uv pip compile --output-file=/home/runner/work/openstack-multinode/openstack-multinode/requirements/2024.2/ubuntu_22.txt /home/runner/work/openstack-multinode/openstack-multinode/requirements/2024.2/pyproject.toml 3 | ansible-core==2.17.14 4 | # via 5 | # dalmatian (requirements/2024.2/pyproject.toml) 6 | # kolla-ansible 7 | autopage==0.5.2 8 | # via cliff 9 | bcrypt==5.0.0 10 | # via 11 | # kolla-ansible 12 | # passlib 13 | certifi==2025.11.12 14 | # via requests 15 | cffi==2.0.0 16 | # via cryptography 17 | charset-normalizer==3.4.4 18 | # via requests 19 | cliff==4.11.0 20 | # via kolla-ansible 21 | cmd2==2.7.0 22 | # via cliff 23 | cryptography==46.0.3 24 | # via 25 | # ansible-core 26 | # kolla-ansible 27 | debtcollector==3.0.0 28 | # via oslo-utils 29 | hvac==2.4.0 30 | # via kolla-ansible 31 | idna==3.11 32 | # via requests 33 | iso8601==2.1.0 34 | # via oslo-utils 35 | jinja2==3.1.6 36 | # via 37 | # ansible-core 38 | # kolla-ansible 39 | jmespath==1.0.1 40 | # via kolla-ansible 41 | kolla-ansible==19.7.0 42 | # via dalmatian (requirements/2024.2/pyproject.toml) 43 | markdown-it-py==4.0.0 44 | # via rich 45 | markupsafe==3.0.3 46 | # via jinja2 47 | mdurl==0.1.2 48 | # via markdown-it-py 49 | netaddr==1.3.0 50 | # via 51 | # oslo-config 52 | # oslo-utils 53 | oslo-config==10.1.0 54 | # via kolla-ansible 55 | oslo-i18n==6.7.0 56 | # via 57 | # oslo-config 58 | # oslo-utils 59 | oslo-utils==9.1.0 60 | # via kolla-ansible 61 | packaging==25.0 62 | # via 63 | # ansible-core 64 | # oslo-utils 65 | passlib==1.7.4 66 | # via kolla-ansible 67 | pbr==7.0.3 68 | # via 69 | # oslo-i18n 70 | # oslo-utils 71 | prettytable==3.17.0 72 | # via cliff 73 | psutil==7.1.3 74 | # via oslo-utils 75 | pycparser==2.23 76 | # via cffi 77 | pygments==2.19.2 78 | # via rich 79 | pyparsing==3.2.5 80 | # via oslo-utils 81 | pyperclip==1.11.0 82 | # via cmd2 83 | pyyaml==6.0.3 84 | # via 85 | # ansible-core 86 | # cliff 87 | # oslo-config 88 | # oslo-utils 89 | requests==2.32.5 90 | # via 91 | # hvac 92 | # oslo-config 93 | resolvelib==1.0.1 94 | # via ansible-core 95 | rfc3986==2.0.0 96 | # via oslo-config 97 | rich==14.2.0 98 | # via rich-argparse 99 | rich-argparse==1.7.2 100 | # via cmd2 101 | setuptools==80.9.0 102 | # via pbr 103 | stevedore==5.5.0 104 | # via 105 | # cliff 106 | # oslo-config 107 | typing-extensions==4.15.0 108 | # via cryptography 109 | tzdata==2025.2 110 | # via oslo-utils 111 | urllib3==2.5.0 112 | # via requests 113 | wcwidth==0.2.14 114 | # via 115 | # cmd2 116 | # prettytable 117 | wrapt==2.0.1 118 | # via debtcollector 119 | -------------------------------------------------------------------------------- /ci/check_aio.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2023 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | set -o errexit 12 | set -o pipefail 13 | if [[ ${OS_DEBUG:-false} == "true" ]]; then 14 | set -o xtrace 15 | fi 16 | 17 | export OS_DISTRO="${OS_DISTRO:-ubuntu_22}" 18 | export VAGRANT_DISABLE_VBOXSYMLINKCREATE=1 19 | export VAGRANT_EXPERIMENTAL=disks 20 | export OS_KOLLA_RUN_INIT=false 21 | export OS_KOLLA_ENABLE_HORIZON="no" 22 | export OS_KOLLA_KOLLA_INSTALL_TYPE="source" 23 | 24 | function info { 25 | _print_msg "INFO" "$1" 26 | echo "::notice::$1" 27 | } 28 | 29 | function warn { 30 | _print_msg "WARN" "$1" 31 | echo "::warning::$1" 32 | } 33 | 34 | function _print_msg { 35 | echo "$(date +%H:%M:%S) - $1: $2" 36 | } 37 | 38 | function get_release { 39 | local release_pointer=${CI_INITIAL_RELEASE_POINTER:-3} 40 | 41 | until [ -f "./requirements/$(sed -n "${release_pointer}p" releases.txt)/${OS_DISTRO}.txt" ]; do 42 | release_pointer=$((release_pointer - 1)) 43 | if [[ $release_pointer -lt "0" ]]; then 44 | return 45 | fi 46 | done 47 | 48 | sed -n "${release_pointer}p" releases.txt 49 | } 50 | 51 | function upgrade { 52 | local initial_release=$1 53 | 54 | release_pointer=$(cat -n releases.txt | grep "$initial_release" | awk '{print $1}') 55 | release_pointer=$((release_pointer - 1)) 56 | 57 | while [[ $release_pointer -gt "0" ]]; do 58 | release_name="$(sed -n "${release_pointer}p" releases.txt)" 59 | 60 | if [ -f "./requirements/${release_name}/${OS_DISTRO}.txt" ]; then 61 | pushd samples/aio/ >/dev/null 62 | info "Upgrading ${OS_DISTRO} distro to OpenStack ${release_name} release" 63 | vagrant ssh -- "cd /vagrant; OPENSTACK_RELEASE=$release_name OS_DEBUG=true ./upgrade.sh" 64 | print_hw_stats 65 | popd >/dev/null 66 | else 67 | warn "There is no more releases for ${OS_DISTRO} distro" 68 | break 69 | fi 70 | release_pointer=$((release_pointer - 1)) 71 | done 72 | } 73 | 74 | function print_hw_stats { 75 | ! command -v vm_stat >/dev/null || vm_stat 76 | ! command -v VBoxManage >/dev/null || VBoxManage list runningvms --long 77 | ! command -v virsh >/dev/null || virsh list 78 | } 79 | 80 | initial_release=$(get_release) 81 | if [[ -z $initial_release ]]; then 82 | warn "There is no OpenStack release supported for ${OS_DISTRO}" 83 | exit 84 | fi 85 | pushd samples/aio/ >/dev/null 86 | info "Deploying ${OS_DISTRO} distro with OpenStack ${initial_release} release" 87 | vagrant destroy -f 88 | OPENSTACK_RELEASE="$initial_release" vagrant up 89 | print_hw_stats 90 | popd >/dev/null 91 | upgrade "$initial_release" 92 | -------------------------------------------------------------------------------- /commons.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2022 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | set -o nounset 12 | set -o pipefail 13 | set -o errexit 14 | if [[ ${OS_DEBUG:-false} == "true" ]]; then 15 | export PKG_DEBUG=true 16 | set -o xtrace 17 | fi 18 | 19 | function setup_ansible { 20 | # Setup Mitogen 21 | mitogen_ansible_cfg="" 22 | if pip freeze | grep -q mitogen; then 23 | mitogen_ansible_cfg=" 24 | strategy = mitogen_linear 25 | strategy_plugins = $(dirname "$(sudo find / -name mitogen_linear.py | head -n 1)") 26 | 27 | " 28 | fi 29 | 30 | sudo tee /etc/ansible/ansible.cfg <") 72 | [ "$v1" != "$v2" ] && [ "$result" = "$v2" ] 73 | return 74 | ;; 75 | "<") 76 | [ "$v1" != "$v2" ] && [ "$result" = "$v1" ] 77 | return 78 | ;; 79 | ">=") 80 | [ "$result" = "$v2" ] 81 | return 82 | ;; 83 | "<=") 84 | [ "$result" = "$v1" ] 85 | return 86 | ;; 87 | *) 88 | echo "unrecognised op: $op" 89 | exit 1 90 | ;; 91 | esac 92 | } 93 | 94 | function run_kolla_actions { 95 | for action in "$@"; do 96 | ./run_kaction.sh "$action" | tee "$HOME/$action.log" 97 | echo "Kolla Action statistics:" 98 | grep ': .* -* .*s$' "$HOME/$action.log" || : 99 | done 100 | } 101 | -------------------------------------------------------------------------------- /.github/prompts/sembr.prompt.md: -------------------------------------------------------------------------------- 1 | --- 2 | mode: "agent" 3 | description: "Agent that reformats Markdown files using Semantic Line Breaks according to the full SemBr specification. The output must be raw Markdown with applied semantic line breaks. Do not parse or interpret the output." 4 | --- 5 | 6 | # Task 7 | 8 | Apply **Semantic Line Breaks (SemBr)** to all Markdown (`.md`) documents in 9 | the current project. 10 | 11 | The output must be **raw Markdown** text, rewritten according to the 12 | specification below. 13 | 14 | Do not include explanations, parsing, summaries, or comments — only return 15 | the rewritten Markdown document(s). 16 | 17 | ## Specification 18 | 19 | The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, 20 | “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this 21 | document are to be interpreted as described in RFC 2119. 22 | 23 | 1. Text written as plain text or a compatible markup language MAY use 24 | semantic line breaks. 25 | 2. A semantic line break MUST NOT alter the final rendered output of the 26 | document. 27 | 3. A semantic line break SHOULD NOT alter the intended meaning of the text. 28 | 4. A semantic line break MUST occur after a sentence, as punctuated by a 29 | period (.), exclamation mark (!), or question mark (?). 30 | 5. A semantic line break SHOULD occur after an independent clause as 31 | punctuated by a comma (,), semicolon (;), colon (:), or em dash (—). 32 | 6. A semantic line break MAY occur after a dependent clause in order to 33 | clarify grammatical structure or satisfy line length constraints. 34 | 7. A semantic line break is RECOMMENDED before an enumerated or itemized 35 | list. 36 | 8. A semantic line break MAY be used after one or more items in a list in 37 | order to logically group related items or satisfy line length 38 | constraints. 39 | 9. A semantic line break MUST NOT occur within a hyphenated word. 40 | 10. A semantic line break MAY occur before and after a hyperlink. 41 | 11. A semantic line break MAY occur before inline markup. 42 | 12. A maximum line length of 80 characters is RECOMMENDED. 43 | 13. A line MAY exceed the maximum line length if necessary, such as to 44 | accommodate hyperlinks, code elements, or other markup. 45 | 46 | ## Goals 47 | 48 | 1. For Writers: The agent SHALL structure Markdown text so that the 49 | physical layout of lines reflects the logical and semantic structure of 50 | the author’s thoughts. 51 | 2. For Editors: The agent SHALL produce output that makes grammatical and 52 | structural relationships easier to identify, supporting clear and 53 | efficient editing without changing meaning. 54 | 3. For Readers: The agent SHALL ensure that applied semantic line breaks 55 | do not alter the rendered appearance or interpretation of the text in 56 | any Markdown renderer. 57 | 58 | ## Formatting Rules 59 | 60 | - Preserve existing Markdown structure (headings, lists, code blocks, 61 | tables, HTML, etc.). 62 | - Skip fenced code blocks, inline code, and HTML verbatim. 63 | - Maintain paragraph integrity — do not insert empty lines unless 64 | already present. 65 | - When in doubt, prefer breaking after complete thoughts or clauses. 66 | - Output only the transformed Markdown content — do not add any metadata, 67 | explanations, or syntax highlighting. 68 | 69 | ## Input 70 | 71 | Markdown file(s) from the workspace. 72 | 73 | ## Output 74 | 75 | Raw Markdown text with Semantic Line Breaks applied. 76 | 77 | Do **not** parse, explain, or wrap the output — return only the processed 78 | Markdown content. 79 | -------------------------------------------------------------------------------- /doc/src/neutron/network_types.md: -------------------------------------------------------------------------------- 1 | # Networks 2 | 3 | To configure rich network topologies, you can create and configure networks 4 | and subnets, and instruct other OpenStack services like Compute to attach 5 | virtual devices to ports on these networks. 6 | 7 | ## Provider Networks 8 | 9 | Provider networks offer layer-2 connectivity to instances, with optional 10 | support for DHCP and metadata services. 11 | 12 | These networks connect, or map, to existing layer-2 networks in the data 13 | center, typically using VLAN (802.1q) tagging to identify and separate them. 14 | 15 | - By default, only administrators can create or update provider networks because 16 | they require configuration of physical network infrastructure. 17 | - Provider networks only handle layer-2 connectivity for instances, thus 18 | lacking support for features such as routers and floating IP addresses. 19 | - When a provider network is shared by an administrator, a project user can 20 | view and attach their instances to it. 21 | 22 | ## Self-service or Tenant/Project Networks 23 | 24 | Self-service networks primarily enable general (non-privileged) projects to 25 | manage networks without involving administrators. 26 | 27 | - These networks are entirely virtual and require virtual routers to interact 28 | with provider and external networks such as the internet. 29 | - They usually provide DHCP and metadata services to instances. 30 | - In most cases, self-service networks use overlay protocols such as VXLAN or 31 | GRE because they can support many more networks than layer-2 segmentation 32 | using VLAN tagging (802.1q). 33 | - Floating IP addresses enable access to instances from provider networks via 34 | destination NAT on virtual routers. 35 | - Contrary to provider networks that connect instances to the physical network 36 | infrastructure at layer-2, self-service networks must traverse a layer-3 37 | agent. 38 | 39 | Created by OpenStack users, Neutron automatically selects a network 40 | segmentation type like VXLAN or VLAN; users cannot select the segmentation 41 | type. 42 | 43 | The user in a project can articulate their own networking topology, completely 44 | isolated from other projects in the same cloud, via the support of overlapping 45 | IPs and other technologies. 46 | 47 | ## Summary 48 | 49 | The primary difference between self-service and provider networks revolves 50 | around who provisions them. 51 | 52 | Provider networks are created by the OpenStack administrator on behalf of 53 | tenants, and can be dedicated to a particular tenant, shared by a subset of 54 | tenants (see RBAC for networks), or shared by all tenants. 55 | 56 | On the other hand, self-service networks are created by tenants for use by 57 | their instances and cannot be shared based upon default policy settings. 58 | 59 | | external-router | shared | Description | 60 | | :-------------: | :----: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------- | 61 | | false | false | Only usable by members of the tenant. Typically an overlay (vxlan, gre). | 62 | | false | true | Shared by multiple tenants with RBAC on who can use it. Typically an overlay (vxlan, gre). | 63 | | true | false | Scope is all tenants. Can only be created by administrators. Tenants connect their router for external access. Typically a 'flat' or 'vlan' network. | 64 | | true | true | Scope is all tenants. Can only be created by administrators. Tenants can connect directly to it. Typically known as a 'provider' network and is 'flat' or 'vlan.' | 65 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2021 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | name: Scheduled Kolla Images Build verification 11 | # yamllint disable-line rule:truthy 12 | on: 13 | push: 14 | paths: 15 | - registry.sh 16 | - etc/kolla/kolla-build.ini 17 | pull_request_review: 18 | types: 19 | - submitted 20 | schedule: 21 | - cron: "0 0 * * 5" 22 | workflow_dispatch: 23 | permissions: read-all 24 | jobs: 25 | build-baremetal: 26 | name: Check building and publishing Kolla Docker images in a local Docker registry on an Ubuntu Jammy Virtual Environment 27 | permissions: 28 | security-events: write 29 | runs-on: ubuntu-22.04 30 | if: >- 31 | ( github.event_name == 'pull_request_review' && github.event.review.state == 'approved' ) || github.event_name != 'pull_request_review' 32 | steps: 33 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 34 | with: 35 | persist-credentials: false 36 | - name: Install requirements 37 | env: 38 | OS_KOLLA_BUILD_ARGS: 39 | "keystone --registry 127.0.0.1:5000 --push --threads 4 --quiet --retries 5 --cache --push-threads 2 --squash --base ubuntu --tag ${{ 40 | github.sha }}" 41 | run: ./registry.sh 42 | - name: Analyze Docker Base Image 43 | uses: ./.github/actions/docker-image 44 | with: 45 | image: "127.0.0.1:5000/kolla/base:${{ github.sha }}" 46 | - name: Analyze OpenStack Base Image 47 | uses: ./.github/actions/docker-image 48 | with: 49 | image: "127.0.0.1:5000/kolla/openstack-base:${{ github.sha }}" 50 | - name: Analyze Keystone Image 51 | uses: ./.github/actions/docker-image 52 | with: 53 | image: "127.0.0.1:5000/kolla/keystone:${{ github.sha }}" 54 | - name: Validate images 55 | run: | 56 | sudo docker images 57 | curl -s -X GET http://localhost:5000/v2/_catalog | jq -r '.repositories' 58 | build-virtual_machines: 59 | name: Check building and publishing Kolla Docker images in a local Docker registry Virtual Machines 60 | strategy: 61 | fail-fast: false 62 | matrix: 63 | include: 64 | - distro: ubuntu_22 65 | base: ubuntu 66 | image: nova 67 | - distro: rocky_9 68 | base: rocky 69 | image: glance 70 | - distro: debian_11 71 | base: debian 72 | image: neutron 73 | runs-on: vm-self-hosted 74 | permissions: 75 | contents: read 76 | if: >- 77 | ( github.event_name == 'pull_request_review' && github.event.review.state == 'approved' ) || github.event_name != 'pull_request_review' 78 | steps: 79 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 80 | with: 81 | persist-credentials: false 82 | - uses: ./.github/actions/vagrant-setup 83 | with: 84 | distro: ${{ matrix.distro }} 85 | - name: Deploy All-in-One instance 86 | env: 87 | VAGRANT_DISABLE_VBOXSYMLINKCREATE: 1 88 | OS_DISTRO: ${{ matrix.distro }} 89 | OS_KOLLA_BUILD_ARGS: 90 | ${{ matrix.image }} --registry 127.0.0.1:5000 --push --threads 2 --quiet --retries 5 --cache --push-threads 2 --base ${{ matrix.base 91 | }} 92 | working-directory: ./samples/distributed 93 | run: vagrant up registry 94 | - name: Check HW resources 95 | if: failure() 96 | run: | 97 | VBoxManage list runningvms --long 98 | cat ~/VirtualBox\ VMs/*/Logs/*.log 99 | -------------------------------------------------------------------------------- /node.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2018 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | set -o nounset 12 | set -o pipefail 13 | set -o errexit 14 | if [[ ${OS_DEBUG:-false} == "true" ]]; then 15 | export PKG_DEBUG=true 16 | set -o xtrace 17 | fi 18 | 19 | # shellcheck disable=SC1091 20 | source /etc/os-release || source /usr/lib/os-release 21 | 22 | _start=$(date +%s) 23 | trap 'printf "Node setup process: %s secs\n" "$(($(date +%s)-_start))"' EXIT 24 | 25 | # usage() - Prints the usage of the program 26 | function usage { 27 | cat </dev/null; then 40 | case ${ID,,} in 41 | ubuntu | debian) 42 | sudo apt-get update -qq >/dev/null 43 | sudo apt-get install -y -qq -o=Dpkg::Use-Pty=0 fdisk 44 | ;; 45 | esac 46 | fi 47 | 48 | sudo sfdisk "$dev_name" --no-reread </dev/null; then 77 | case ${ID,,} in 78 | ubuntu | debian) 79 | sudo apt-get -y -qq purge cloud-init 80 | ;; 81 | esac 82 | fi 83 | 84 | if [ -n "${dict_volumes-}" ]; then 85 | for kv in ${dict_volumes//,/ }; do 86 | mount_external_partition "${kv%=*}" "${kv#*=}" 87 | done 88 | fi 89 | 90 | if [ -n "${cinder_volumes-}" ]; then 91 | if ! command -v vgs; then 92 | curl -fsSL http://bit.ly/install_pkg | PKG="lvm2" bash 93 | fi 94 | # Creation of cinder LVM 95 | sudo vgcreate cinder-volumes "$cinder_volumes" -f 96 | sudo vgs 97 | sudo pvdisplay 98 | 99 | # Configure LVM to only scan devices that contain the cinder-volumes volume group 100 | filter_string="" 101 | for pv_info in $(sudo pvs --noheadings -o name); do 102 | filter_string+="\"a|${pv_info##*/}|\", " 103 | done 104 | # shellcheck disable=SC1003 105 | sudo sed -i -e '/# global_filter = \[.*\]/a\' -e "\tglobal_filter = [ $filter_string \"r|.*|\" ]" /etc/lvm/lvm.conf 106 | 107 | sudo modprobe dm_thin_pool 108 | echo "dm_thin_pool" | sudo tee /etc/modules-load.d/dm_thin_pool.conf 109 | sudo modprobe target_core_mod 110 | echo "target_core_mod" | sudo tee /etc/modules-load.d/target_core_mod.conf 111 | fi 112 | 113 | if [[ -n ${OPENSTACK_NODE_ROLES+x} ]]; then 114 | for role in $OPENSTACK_NODE_ROLES; do 115 | if [ -f "$role.sh" ]; then 116 | bash "$role.sh" | sudo tee "$HOME/$role.log" 117 | fi 118 | done 119 | fi 120 | curl -fsSL http://bit.ly/install_bin | PKG_BINDEP_PROFILE=node bash 121 | -------------------------------------------------------------------------------- /ci/update_distros.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2021 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | set -o errexit 12 | set -o pipefail 13 | if [[ ${OS_DEBUG:-false} == "true" ]]; then 14 | set -o xtrace 15 | fi 16 | 17 | PROVIDER=${PROVIDER:-virtualbox} 18 | msg="" 19 | 20 | function _get_box_current_version { 21 | version="" 22 | attempt_counter=0 23 | max_attempts=5 24 | name="$1" 25 | 26 | if [ -f ./ci/pinned_vagrant_boxes.txt ] && grep -q "^${name} .*$PROVIDER" ./ci/pinned_vagrant_boxes.txt; then 27 | version=$(grep "^${name} .*$PROVIDER" ./ci/pinned_vagrant_boxes.txt | awk '{ print $2 }') 28 | else 29 | until [ "$version" ]; do 30 | metadata="$(curl -s "https://app.vagrantup.com/api/v1/box/$name")" 31 | if [ "$metadata" ]; then 32 | version="$(echo "$metadata" | python -c 'import json,sys;print(json.load(sys.stdin)["current_version"]["version"])')" 33 | break 34 | elif [ ${attempt_counter} -eq ${max_attempts} ]; then 35 | echo "Max attempts reached" 36 | exit 1 37 | fi 38 | attempt_counter=$((attempt_counter + 1)) 39 | sleep $((attempt_counter * 2)) 40 | done 41 | fi 42 | 43 | echo "${version#*v}" 44 | } 45 | 46 | function _vagrant_pull { 47 | local alias="$1" 48 | local name="$2" 49 | local project_id="$3" 50 | local family="$4" 51 | local vb_controller="${5:-IDE Controller}" 52 | 53 | version=$(_get_box_current_version "$name") 54 | 55 | if [ "$(curl "https://app.vagrantup.com/${name%/*}/boxes/${name#*/}/versions/$version/providers/$PROVIDER.box" -o /dev/null -w '%{http_code}\n' -s)" == "302" ] && [ "$(vagrant box list | grep -c "$name .*$PROVIDER, $version")" != "1" ]; then 56 | vagrant box remove --provider "$PROVIDER" --all --force "$name" || : 57 | vagrant box add --provider "$PROVIDER" --box-version "$version" "$name" 58 | elif [ "$(vagrant box list | grep -c "$name .*$PROVIDER, $version")" == "1" ]; then 59 | echo "$name($version, $PROVIDER) box is already present in the host" 60 | else 61 | msg+="$name($version, $PROVIDER) box doesn't exist\n" 62 | return 63 | fi 64 | # editorconfig-checker-disable 65 | # prettier-ignore-start 66 | cat <>.distros_supported.yml 67 | $alias: 68 | name: $name 69 | vb_controller: $vb_controller 70 | version: "$version" 71 | project_id: $project_id 72 | family: $family 73 | EOT 74 | # prettier-ignore-end 75 | # editorconfig-checker-enable 76 | } 77 | 78 | if ! command -v vagrant >/dev/null; then 79 | # NOTE: Shorten link -> https://raw.githubusercontent.com/electrocucaracha/pkg-mgr_scripts/master/install.sh 80 | curl -fsSL http://bit.ly/install_pkg | PKG=vagrant bash 81 | fi 82 | 83 | cat <.distros_supported.yml 84 | --- 85 | # SPDX-license-identifier: Apache-2.0 86 | ############################################################################## 87 | # Copyright (c) 2019 - $(date '+%Y') 88 | # All rights reserved. This program and the accompanying materials 89 | # are made available under the terms of the Apache License, Version 2.0 90 | # which accompanies this distribution, and is available at 91 | # http://www.apache.org/licenses/LICENSE-2.0 92 | ############################################################################## 93 | EOT 94 | 95 | _vagrant_pull "rocky_9" "rockylinux/9" "rocky-linux-cloud" "rocky-linux-9" 96 | _vagrant_pull "ubuntu_22" "generic/ubuntu2204" "ubuntu-os-cloud" "ubuntu-2204-lts" 97 | _vagrant_pull "debian_11" "debian/bullseye64" "debian-cloud" "debian-11" "SATA Controller" 98 | _vagrant_pull "debian_12" "debian/bookworm64" "debian-cloud" "debian-12" "SATA Controller" 99 | 100 | if [ "$msg" ]; then 101 | echo -e "$msg" 102 | rm .distros_supported.yml 103 | else 104 | mv .distros_supported.yml distros_supported.yml 105 | fi 106 | -------------------------------------------------------------------------------- /.github/workflows/on-demand_aio.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2021 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | name: Check All-in-One setup 11 | # yamllint disable-line rule:truthy 12 | on: 13 | push: 14 | paths: 15 | - "*.sh" 16 | - "*.yml" 17 | - "samples/aio/*" 18 | - "etc/**" 19 | - "!.github/**" 20 | pull_request_review: 21 | types: 22 | - submitted 23 | permissions: read-all 24 | jobs: 25 | generate-json-matrix: 26 | runs-on: ubuntu-latest 27 | permissions: 28 | contents: read 29 | if: >- 30 | ( github.event_name == 'pull_request_review' && github.event.review.state == 'approved' ) || github.event_name != 'pull_request_review' 31 | steps: 32 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 33 | with: 34 | persist-credentials: false 35 | - name: Get matrix values 36 | id: set-matrix 37 | run: | 38 | if ! command -v shyaml; then 39 | if ! command -v pip; then 40 | apt-get update 41 | apt-get install -y --no-install-recommends python3-pip 42 | fi 43 | python -m pip install shyaml 44 | fi 45 | if ! command -v jq; then 46 | apt-get update 47 | apt-get install -y --no-install-recommends jq 48 | fi 49 | echo "matrix=$(shyaml keys < distros_supported.yml|jq -cnR '[inputs | select(length>0)]')" >>"$GITHUB_OUTPUT" 50 | outputs: 51 | matrix: ${{ steps.set-matrix.outputs.matrix }} 52 | check-aio-vms: 53 | name: Check All-in-One deployment on Virtual Machines 54 | needs: generate-json-matrix 55 | strategy: 56 | fail-fast: false 57 | matrix: 58 | distro: ${{ fromJson(needs.generate-json-matrix.outputs.matrix) }} 59 | runs-on: vm-self-hosted 60 | permissions: 61 | contents: read 62 | steps: 63 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 64 | with: 65 | persist-credentials: false 66 | - uses: ./.github/actions/vagrant-setup 67 | with: 68 | distro: ${{ matrix.distro }} 69 | - name: Deploy previous release in All-in-One instance 70 | env: 71 | CPU: 2 72 | MEMORY: 12288 73 | OS_DISTRO: ${{ matrix.distro }} 74 | run: ./ci/check_aio.sh 75 | - name: Check HW resources 76 | if: failure() 77 | run: | 78 | VBoxManage list runningvms --long 79 | cat ~/VirtualBox\ VMs/*/Logs/*.log 80 | check-aio-baremetal: 81 | runs-on: ubuntu-22.04 82 | permissions: 83 | contents: read 84 | name: Check All-in-One deployment on Ubuntu Jammy Virtual Environment 85 | if: >- 86 | ( github.event_name == 'pull_request_review' && github.event.review.state == 'approved' ) || github.event_name != 'pull_request_review' 87 | steps: 88 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 89 | with: 90 | persist-credentials: false 91 | - name: Install requirements 92 | run: | 93 | sudo apt-get update 94 | sudo apt-get install -y -qq -o=Dpkg::Use-Pty=0 --no-install-recommends bridge-utils python3-testresources 95 | - name: Create a loop device 96 | run: | 97 | dd if=/dev/zero of=~/cinder.img bs=1 count=1 seek=100G 98 | sudo losetup "$(sudo losetup -f)" ~/cinder.img 99 | sudo losetup -l 100 | - name: Setup network external interface 101 | run: | 102 | sudo ip link add veth0 type veth peer name veth1 103 | sudo ip link set veth0 up 104 | sudo brctl addbr uplinkbridge 105 | sudo brctl addif uplinkbridge veth0 106 | sudo ip link set dev uplinkbridge up 107 | sudo ip addr add 10.10.13.7/24 dev veth0 108 | sudo ip route show 109 | 110 | echo "127.0.0.1 localhost" | sudo tee /etc/hosts 111 | - name: Deploy services 112 | env: 113 | OS_DEBUG: true 114 | run: | 115 | ./node.sh -c "$(sudo losetup -l | grep cinder.img | awk '{ print $1 }')" 116 | sed -i "s|localhost|$(hostname)|g" samples/aio/hosts.ini 117 | OS_FOLDER=$(git rev-parse --show-toplevel) ./install.sh 118 | -------------------------------------------------------------------------------- /registry.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2018 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | set -o nounset 12 | set -o pipefail 13 | set -o errexit 14 | if [[ ${OS_DEBUG:-false} == "true" ]]; then 15 | export PKG_DEBUG=true 16 | set -o xtrace 17 | fi 18 | _start=$(date +%s) 19 | trap 'printf "Registry creation process: %s secs\n" "$(($(date +%s)-_start))"' EXIT 20 | 21 | # NOTE: Shorten link -> https://github.com/electrocucaracha/pkg-mgr_scripts 22 | curl -fsSL http://bit.ly/install_pkg | PKG_COMMANDS_LIST="skopeo,docker,jq,git,crudini" bash 23 | 24 | if ! command -v uv; then 25 | curl -LsSf https://astral.sh/uv/install.sh | sh 26 | PATH="$HOME/.local/bin:$PATH" 27 | fi 28 | 29 | if ! command -v kolla-build; then 30 | sudo "$(command -v uv)" pip install "git+https://github.com/openstack/kolla.git@${OS_KOLLA_VERSION:-stable/2025.1}" --system 31 | sudo "$(command -v uv)" pip install docker-squash --system 32 | fi 33 | 34 | # Start local registry 35 | if [[ -z $(sudo docker ps -aqf "name=registry") ]]; then 36 | sudo -E docker run -d --name registry --restart=always \ 37 | -p "${DOCKER_REGISTRY_PORT:-5000}":5000 -v registry:/var/lib/registry registry:2 38 | fi 39 | 40 | # Configure custom values 41 | sudo mkdir -p /etc/kolla 42 | sudo cp ./etc/kolla/kolla-build.ini /etc/kolla/kolla-build.ini 43 | # shellcheck disable=SC1091 44 | source /etc/os-release || source /usr/lib/os-release 45 | num_cpus=$(lscpu | grep "^CPU(s):" | awk '{ print $2 }') 46 | 47 | for kv in "tag=${OPENSTACK_TAG:-"2024.2-${ID,,}-${VERSION_CODENAME:-${VERSION_ID%%.*}}"}" \ 48 | "profile=${OS_KOLLA_PROFILE:-custom}" \ 49 | "registry=${DOCKER_REGISTRY_IP:-127.0.0.1}:${DOCKER_REGISTRY_PORT:-5000}" \ 50 | "openstack_release=${OPENSTACK_RELEASE:-2024.2}" \ 51 | "base=${OS_KOLLA_BASE:-${ID,,}}" \ 52 | "threads=$((num_cpus * 2))" \ 53 | "push_threads=$((num_cpus * 4))"; do 54 | sudo -E "$(command -v crudini)" --set /etc/kolla/kolla-build.ini DEFAULT "${kv%=*}" "${kv#*=}" 55 | done 56 | 57 | bifrost_header="" 58 | bifrost_footer="" 59 | if [ -n "${HTTP_PROXY-}" ]; then 60 | bifrost_header+="ENV http_proxy=$HTTP_PROXY\n" 61 | bifrost_footer+="ENV http_proxy=\"\"\n" 62 | fi 63 | if [ -n "${HTTPS_PROXY-}" ]; then 64 | bifrost_header+="ENV https_proxy=$HTTPS_PROXY\n" 65 | bifrost_footer+="ENV https_proxy=\"\"\n" 66 | fi 67 | if [ -n "${NO_PROXY-}" ]; then 68 | bifrost_header+="ENV no_proxy=$NO_PROXY\n" 69 | bifrost_footer+="ENV no_proxy=\"\"\n" 70 | fi 71 | 72 | cat <"$HOME/template-overrides.j2" 73 | {% extends parent_template %} 74 | 75 | {% block bifrost_base_header %} 76 | $bifrost_header 77 | {% endblock %} 78 | 79 | {% block bifrost_base_footer %} 80 | $bifrost_footer 81 | {% endblock %} 82 | EOL 83 | #sudo kolla-build --type source --template-override $HOME/template-overrides.j2 bifrost-deploy 84 | 85 | # Kolla Docker images creation 86 | kolla_cmd="kolla-build ${OS_KOLLA_BUILD_ARGS:-"--config-file /etc/kolla/kolla-build.ini"}" 87 | newgrp docker < 4 | 5 | [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) 6 | [![GitHub Super-Linter](https://github.com/electrocucaracha/openstack-multinode/workflows/Lint%20Code%20Base/badge.svg)](https://github.com/marketplace/actions/super-linter) 7 | [![Ruby Style Guide](https://img.shields.io/badge/code_style-rubocop-brightgreen.svg)](https://github.com/rubocop/rubocop) 8 | 9 | 10 | 11 | ![visitors](https://visitor-badge.laobi.icu/badge?page_id=electrocucaracha.openstack-multinode) 12 | [![Scc Code Badge](https://sloc.xyz/github/electrocucaracha/openstack-multinode?category=code)](https://github.com/boyter/scc/) 13 | [![Scc COCOMO Badge](https://sloc.xyz/github/electrocucaracha/openstack-multinode?category=cocomo)](https://github.com/boyter/scc/) 14 | 15 | Package based management has been replaced by container based 16 | management systems which help to solve the availability, management 17 | and scalability aspects of deployment. These are some of the benefits 18 | of using a containerized deployment: 19 | 20 | - ~~**OS agnostic:** Ability to run on any platform, regardless of the 21 | physical host OS.~~ 22 | - **Easy to scale up/down:** The operation to add/remove OpenStack 23 | compute nodes is performed through starting/stopping containers. 24 | - **Fast deployment:** Containers already have binaries and 25 | configuration files so provisioning an OpenStack cluster can take 26 | few minutes. 27 | - **Easy to rollback:** Installing, patching or upgrading operations 28 | are atomic, either they will successfully complete or will fail. In 29 | case of failure, they can be removed and the system is back to its old 30 | state. 31 | - **In-place updates:** Instead of rolling-updates, one can follow the 32 | pattern on in-place updates. Whenever a new image is available, one 33 | can simply stop the old-container and start a new container with the 34 | latest image. 35 | - **Enabling/disabling services easily:** Given that everything is 36 | containerized, adding/removing services is now like starting/stopping 37 | containers. 38 | - **Self-healing deployment:** Services can be managed by Kubernetes 39 | or Docker Swarm and failed containers can be automatically restarted. 40 | This results in a self-healing deployment. 41 | - **Immutable and portable:** Images once built don’t change over 42 | time. Hence, you can recreate the same setup on different 43 | days/different environments with exact same piece of code running. 44 | Also, since everything is containerized, it can be moved from one 45 | place to another with ease. 46 | 47 | Almost all the technology giants have been shift their focus to 48 | container based architecture. 49 | 50 | [Kolla][1](from [Greek][2] "κολλα" which means "glue") is an OpenStack 51 | project which aims to provide production-ready containers for OpenStack 52 | deployment and management. This repository offers instructions to deploy 53 | OpenStack services through the use of [Kolla][1] installer in the following 54 | configurations: 55 | 56 | - [All-in-One](samples/aio/): OpenStack Controller and Compute roles 57 | installed on a single CentOS Stream 8 server. This configuration is 58 | limited so it's recommended only for Development purposes. 59 | - [No High Availability](samples/noha/): Kolla Docker Registry and 60 | OpenStack Controller role installed on a single Ubuntu Focal server. Two 61 | additional servers are provisioned with OpenStack Compute role. This 62 | configuration is useful to test distributed applications. 63 | - [Distributed](samples/distributed/): Every role is distributed among 64 | several Ubuntu servers. This configuration pretends to mimic the needs 65 | of a production environment. 66 | 67 | The deployment process uses [node Bash script](node.sh) to mount and 68 | format additional volumes in the target Virtual Machines and other 69 | specialized scripts to setup additional roles, like the 70 | [internal image registry](registry.sh). The [undercloud](undercloud.sh) 71 | Virtual Machine is used to provision other servers. 72 | 73 | ## Deploy All-in-One configuration 74 | 75 | The [install Bash script](install.sh) provides instructions to 76 | deploy an All-in-One OpenStack configuration. It's possible to run 77 | this script remotely: 78 | 79 | ```bash 80 | curl -fsSL https://raw.githubusercontent.com/electrocucaracha/openstack-multinode/master/install.sh | OS_KOLLA_NETWORK_INTERFACE=eno1 bash 81 | ``` 82 | 83 | ## Contribution 84 | 85 | This is an open project, several individuals contribute in different forms like 86 | coding, documenting, testing, spreading the word at events within others. 87 | 88 | Thanks to all the people who already contributed! 89 | 90 | ![Alternate text](https://contrib.rocks/image?repo=electrocucaracha/openstack-multinode) 91 | ![Visualization of the codebase](./codebase-structure.svg) 92 | 93 | [1]: https://docs.openstack.org/kolla/latest/ 94 | [2]: https://lists.openstack.org/pipermail/openstack-dev/2014-September/046911.html 95 | -------------------------------------------------------------------------------- /etc/kolla/passwords.yml: -------------------------------------------------------------------------------- 1 | --- 2 | ################### 3 | # External Ceph options 4 | #################### 5 | # These options must be UUID4 values in string format 6 | # XXXXXXXX-XXXX-4XXX-XXXX-XXXXXXXXXXXX 7 | # for backward compatible consideration, rbd_secret_uuid is only used for nova, 8 | # cinder_rbd_secret_uuid is used for cinder 9 | rbd_secret_uuid: 10 | cinder_rbd_secret_uuid: 11 | ################### 12 | # Database options 13 | #################### 14 | database_password: 15 | # Password for the dedicated backup user account 16 | mariadb_backup_database_password: 17 | # Password for the monitor user 18 | mariadb_monitor_password: 19 | #################### 20 | # Docker options 21 | #################### 22 | # This should only be set if you require a password for your Docker registry 23 | docker_registry_password: 24 | #################### 25 | # VMware support 26 | #################### 27 | vmware_dvs_host_password: 28 | vmware_nsxv_password: 29 | vmware_vcenter_host_password: 30 | nsxv3_api_password: 31 | vmware_nsxp_api_password: 32 | vmware_nsxp_metadata_proxy_shared_secret: 33 | ##################### 34 | # Hitachi NAS support 35 | ##################### 36 | hnas_nfs_password: 37 | ####################### 38 | # Infoblox IPAM support 39 | ####################### 40 | infoblox_admin_password: 41 | #################### 42 | # OpenStack options 43 | #################### 44 | aodh_database_password: 45 | aodh_keystone_password: 46 | barbican_database_password: 47 | barbican_keystone_password: 48 | barbican_p11_password: 49 | barbican_crypto_key: 50 | blazar_database_password: 51 | blazar_keystone_password: 52 | keystone_admin_password: 53 | keystone_database_password: 54 | grafana_database_password: 55 | grafana_admin_password: 56 | glance_database_password: 57 | glance_keystone_password: 58 | gnocchi_database_password: 59 | gnocchi_keystone_password: 60 | kuryr_keystone_password: 61 | nova_database_password: 62 | nova_api_database_password: 63 | nova_keystone_password: 64 | placement_keystone_password: 65 | placement_database_password: 66 | neutron_database_password: 67 | neutron_keystone_password: 68 | metadata_secret: 69 | cinder_database_password: 70 | cinder_keystone_password: 71 | cloudkitty_database_password: 72 | cloudkitty_keystone_password: 73 | cyborg_database_password: 74 | cyborg_keystone_password: 75 | designate_database_password: 76 | designate_keystone_password: 77 | # This option must be UUID4 value in string format 78 | designate_pool_id: 79 | # This option must be HMAC-MD5 value in string format 80 | designate_rndc_key: 81 | heat_database_password: 82 | heat_keystone_password: 83 | heat_domain_admin_password: 84 | ironic_database_password: 85 | ironic_keystone_password: 86 | ironic_inspector_database_password: 87 | ironic_inspector_keystone_password: 88 | magnum_database_password: 89 | magnum_keystone_password: 90 | mistral_database_password: 91 | mistral_keystone_password: 92 | trove_database_password: 93 | trove_keystone_password: 94 | ceilometer_database_password: 95 | ceilometer_keystone_password: 96 | watcher_database_password: 97 | watcher_keystone_password: 98 | horizon_secret_key: 99 | horizon_database_password: 100 | telemetry_secret_key: 101 | manila_database_password: 102 | manila_keystone_password: 103 | octavia_database_password: 104 | octavia_persistence_database_password: 105 | octavia_keystone_password: 106 | octavia_ca_password: 107 | octavia_client_ca_password: 108 | tacker_database_password: 109 | tacker_keystone_password: 110 | zun_database_password: 111 | zun_keystone_password: 112 | venus_database_password: 113 | venus_keystone_password: 114 | masakari_database_password: 115 | masakari_keystone_password: 116 | memcache_secret_key: 117 | skyline_secret_key: 118 | skyline_database_password: 119 | skyline_keystone_password: 120 | # HMAC secret key 121 | osprofiler_secret: 122 | nova_ssh_key: 123 | private_key: 124 | public_key: 125 | kolla_ssh_key: 126 | private_key: 127 | public_key: 128 | keystone_ssh_key: 129 | private_key: 130 | public_key: 131 | bifrost_ssh_key: 132 | private_key: 133 | public_key: 134 | octavia_amp_ssh_key: 135 | private_key: 136 | public_key: 137 | neutron_ssh_key: 138 | private_key: 139 | public_key: 140 | haproxy_ssh_key: 141 | private_key: 142 | public_key: 143 | #################### 144 | # Gnocchi options 145 | #################### 146 | gnocchi_project_id: 147 | gnocchi_resource_id: 148 | gnocchi_user_id: 149 | #################### 150 | # RabbitMQ options 151 | #################### 152 | rabbitmq_password: 153 | rabbitmq_monitoring_password: 154 | rabbitmq_cluster_cookie: 155 | #################### 156 | # HAProxy options 157 | #################### 158 | haproxy_password: 159 | keepalived_password: 160 | #################### 161 | # etcd options 162 | #################### 163 | etcd_cluster_token: 164 | #################### 165 | # redis options 166 | #################### 167 | redis_master_password: 168 | #################### 169 | # Prometheus options 170 | #################### 171 | prometheus_mysql_exporter_database_password: 172 | prometheus_alertmanager_password: 173 | prometheus_password: 174 | prometheus_grafana_password: 175 | prometheus_haproxy_password: 176 | prometheus_skyline_password: 177 | prometheus_bcrypt_salt: 178 | ############################### 179 | # OpenStack identity federation 180 | ############################### 181 | keystone_federation_openid_crypto_password: 182 | #################### 183 | # Ceph RadosGW options 184 | #################### 185 | ceph_rgw_keystone_password: 186 | ################## 187 | # libvirt options 188 | ################## 189 | libvirt_sasl_password: 190 | ############ 191 | # ProxySQL 192 | ############ 193 | proxysql_admin_password: 194 | proxysql_stats_password: 195 | ############ 196 | # OpenSearch 197 | ############ 198 | opensearch_dashboards_password: 199 | -------------------------------------------------------------------------------- /.github/workflows/update.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2021 - 2023 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | name: Scheduled Versions and Dictionary verification 11 | # yamllint disable-line rule:truthy 12 | on: 13 | schedule: 14 | - cron: "0 0 * * *" 15 | workflow_dispatch: 16 | permissions: read-all 17 | jobs: 18 | check-versions: 19 | name: Update python requirements files 20 | permissions: 21 | contents: write # for technote-space/create-pr-action to push code 22 | pull-requests: write # for technote-space/create-pr-action to create a PR 23 | strategy: 24 | max-parallel: 1 25 | fail-fast: false 26 | # NOTE: https://docs.openstack.org/kolla-ansible/latest/user/support-matrix 27 | matrix: 28 | include: 29 | - distro: debian_11 30 | os_release: 2023.2 31 | python_version: 3.9 32 | - distro: debian_12 33 | os_release: 2023.2 34 | python_version: 3.11 35 | - distro: rocky_9 36 | os_release: 2023.2 37 | python_version: 3.9 38 | - distro: ubuntu_22 39 | os_release: 2023.2 40 | python_version: "3.10" 41 | - distro: debian_11 42 | os_release: 2024.1 43 | python_version: 3.9 44 | - distro: debian_12 45 | os_release: 2024.1 46 | python_version: 3.11 47 | - distro: rocky_9 48 | os_release: 2024.1 49 | python_version: 3.9 50 | - distro: ubuntu_22 51 | os_release: 2024.1 52 | python_version: "3.10" 53 | - distro: debian_12 54 | os_release: 2024.2 55 | python_version: 3.11 56 | - distro: rocky_9 57 | os_release: 2024.2 58 | python_version: 3.11 59 | - distro: ubuntu_22 60 | os_release: 2024.2 61 | python_version: "3.10" 62 | - distro: debian_12 63 | os_release: 2025.1 64 | python_version: 3.11 65 | - distro: rocky_9 66 | os_release: 2025.1 67 | python_version: 3.11 68 | - distro: ubuntu_24 69 | os_release: 2025.1 70 | python_version: 3.12 71 | runs-on: ubuntu-latest 72 | steps: 73 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 74 | with: 75 | persist-credentials: true 76 | - uses: astral-sh/setup-uv@3259c6206f993105e3a61b142c2d97bf4b9ef83d # 7.1.0 77 | with: 78 | enable-cache: true 79 | python-version: ${{ matrix.python_version }} 80 | - uses: technote-space/create-pr-action@91114507cf92349bec0a9a501c2edf1635427bc5 # 2.1.4 81 | with: 82 | EXECUTE_COMMANDS: | 83 | uv pip compile --output-file=${GITHUB_WORKSPACE}/requirements/${{ matrix.os_release }}/${{ matrix.distro }}.txt ${GITHUB_WORKSPACE}/requirements/${{ matrix.os_release }}/pyproject.toml --upgrade 84 | COMMIT_MESSAGE: "Upgrade OpenStack Kolla dependencies" 85 | COMMIT_NAME: "electrocucaracha bot" 86 | PR_BRANCH_NAME: "versions-update-${PR_ID}" 87 | PR_TITLE: "chore: update versions" 88 | check-dictionary: 89 | runs-on: ubuntu-latest 90 | permissions: 91 | contents: write # for technote-space/create-pr-action to push code 92 | pull-requests: write # for technote-space/create-pr-action to create a PR 93 | steps: 94 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 95 | with: 96 | persist-credentials: true 97 | - uses: technote-space/create-pr-action@91114507cf92349bec0a9a501c2edf1635427bc5 # 2.1.4 98 | with: 99 | EXECUTE_COMMANDS: | 100 | sudo apt-get update 101 | sudo apt-get -y --no-install-recommends install aspell aspell-en 102 | python -m pip install pyspelling 103 | 104 | sort --ignore-case --output=original.dic .github/.wordlist.txt 105 | echo "" > .github/.wordlist.txt 106 | # Remove leftovers 107 | pyspelling -c .spellcheck.yml | sed '/^<.*>/d;/^!!!/d;/^--/d;/^Misspelled words:/d;/^$/d;/^Spelling check passed :)$/d' | sort --ignore-case | uniq --ignore-case | tee draft.dic 108 | comm -12 --nocheck-order draft.dic original.dic > .github/.wordlist.txt 109 | sort --ignore-case --output=.github/.wordlist.txt .github/.wordlist.txt 110 | 111 | # Add missing words 112 | pyspelling -c .spellcheck.yml | sed '/^<.*>/d;/^!!!/d;/^--/d;/^Misspelled words:/d;/^$/d;/^Spelling check passed :)$/d' | sort --ignore-case | uniq --ignore-case | tee --append .github/.wordlist.txt 113 | sort --ignore-case --output=.github/.wordlist.txt .github/.wordlist.txt 114 | COMMIT_MESSAGE: "Update dictionary definitions" 115 | COMMIT_NAME: "spellchecker bot" 116 | PR_BRANCH_NAME: "versions-update-${PR_ID}" 117 | PR_TITLE: "chore: update dictionary" 118 | check-github-actions: 119 | runs-on: ubuntu-latest 120 | permissions: 121 | contents: write # for technote-space/create-pr-action to push code 122 | pull-requests: write # for technote-space/create-pr-action to create a PR 123 | steps: 124 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 5.0.0 125 | with: 126 | # Fine-grained PAT with contents:write and workflows:write scopes 127 | token: ${{ secrets.WORKFLOW_TOKEN }} 128 | persist-credentials: true 129 | - uses: technote-space/create-pr-action@91114507cf92349bec0a9a501c2edf1635427bc5 # 2.1.4 130 | with: 131 | EXECUTE_COMMANDS: | 132 | ./ci/update_versions.sh 133 | COMMIT_MESSAGE: "Update GitHub Actions" 134 | COMMIT_NAME: "gh versions bot" 135 | PR_BRANCH_NAME: "gh-versions-update-${PR_ID}" 136 | PR_TITLE: "chore: update gh" 137 | -------------------------------------------------------------------------------- /undercloud.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2018,2023 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | set -o nounset 12 | set -o pipefail 13 | set -o errexit 14 | if [[ ${OS_DEBUG:-false} == "true" ]]; then 15 | export PKG_DEBUG=true 16 | set -o xtrace 17 | fi 18 | 19 | source defaults.env 20 | source commons.sh 21 | # shellcheck disable=SC1091 22 | source /etc/os-release || source /usr/lib/os-release 23 | 24 | function _setup_proxy { 25 | if [ -n "${HTTP_PROXY-}" ]; then 26 | sed -i "s|^container_http_proxy: .*$|container_http_proxy: \"${HTTP_PROXY}\"|g" ~/.local/share/kolla-ansible/ansible/group_vars/all.yml 27 | echo "[Service]" | sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf 28 | echo "Environment=\"HTTP_PROXY=$HTTP_PROXY\"" | sudo tee --append /etc/systemd/system/docker.service.d/http-proxy.conf 29 | fi 30 | if [ -n "${HTTPS_PROXY-}" ]; then 31 | sed -i "s|^container_https_proxy: .*$|container_https_proxy: \"${HTTPS_PROXY}\"|g" ~/.local/share/kolla-ansible/ansible/group_vars/all.yml 32 | echo "[Service]" | sudo tee /etc/systemd/system/docker.service.d/https-proxy.conf 33 | echo "Environment=\"HTTPS_PROXY=$HTTPS_PROXY\"" | sudo tee --append /etc/systemd/system/docker.service.d/https-proxy.conf 34 | fi 35 | if [ -n "${NO_PROXY-}" ]; then 36 | sed -i "s|^container_no_proxy: .*$|container_no_proxy: \"${NO_PROXY}\"|g" ~/.local/share/kolla-ansible/ansible/group_vars/all.yml 37 | echo "[Service]" | sudo tee /etc/systemd/system/docker.service.d/no-proxy.conf 38 | echo "Environment=\"NO_PROXY=$NO_PROXY\"" | sudo tee --append /etc/systemd/system/docker.service.d/no-proxy.conf 39 | fi 40 | } 41 | 42 | function _get_kolla_actions { 43 | local kolla_ansible_version="$1" 44 | local kolla_deploy_profile="${2:-$OS_KOLLA_DEPLOY_PROFILE}" 45 | 46 | kolla_actions=(bootstrap-servers) 47 | # Install Ansible Galaxy dependencies (Yoga release onwards) 48 | if vercmp "$kolla_ansible_version" '>=' '14'; then 49 | kolla_actions=(install-deps "${kolla_actions[@]}") 50 | fi 51 | if [ "${kolla_deploy_profile}" == "complete" ]; then 52 | kolla_actions=("${kolla_actions[@]}" prechecks pull) 53 | fi 54 | kolla_actions=("${kolla_actions[@]}" deploy) 55 | if [ "${kolla_deploy_profile}" == "complete" ] && vercmp "$kolla_ansible_version" '<' '15'; then 56 | # NOTE: Smoke tests have been removed in Zed release (https://github.com/openstack/kolla-ansible/commit/591f366ed736977664e899bd834e363191a9472d#diff-707286526f137598948e03470854d542446836f5dd83cbfcb30caab67bb6c7bb) 57 | kolla_actions=("${kolla_actions[@]}" check) 58 | fi 59 | kolla_actions=("${kolla_actions[@]}" post-deploy) 60 | 61 | echo "${kolla_actions[@]}" 62 | } 63 | 64 | function _remove_conflicting_python_pkgs { 65 | case ${ID,,} in 66 | ubuntu | debian) 67 | sanity_pkgs="" 68 | for pkg in python-cryptography python3-cryptography python3-distro-info python3-debian python3-openssl python3-docker python3-urllib3; do 69 | if sudo dpkg -l "$pkg" >/dev/null; then 70 | sanity_pkgs+="$pkg " 71 | fi 72 | done 73 | eval "sudo apt remove -y $sanity_pkgs" 74 | ;; 75 | esac 76 | } 77 | 78 | function _install_deps { 79 | _remove_conflicting_python_pkgs 80 | 81 | # Install dependencies 82 | curl -fsSL http://bit.ly/install_bin | PKG_BINDEP_PROFILE=undercloud PKG_COMMANDS_LIST="yq" PKG_UPDATE=true bash 83 | 84 | # Install Kolla-Ansible dependencies 85 | sudo ln -s "$(command -v pip3)" /usr/bin/pip3 || : 86 | python -m pip install --ignore-installed --no-warn-script-location --requirement "requirements/${OPENSTACK_RELEASE}/${ID,,}_${VERSION_ID%.*}.txt" 87 | # PEP 370 -- Per user site-packages directory 88 | [[ $PATH != *.local/bin* ]] && export PATH=$PATH:$HOME/.local/bin 89 | # https://review.opendev.org/c/openstack/kolla-ansible/+/584427/17/ansible/roles/rabbitmq/templates/rabbitmq-env.conf.j2#6 90 | sudo find / -name rabbitmq-env.conf.j2 -exec sed -i '/export ERL_EPMD_ADDRESS/d' {} \; 91 | } 92 | 93 | function _cleanup_docker_services { 94 | # Remove docker source list to avoid update conflicts 95 | [[ $PATH != *.local/bin* ]] && export PATH=$PATH:$HOME/.local/bin 96 | ansible control -i "${OS_INVENTORY_FILE:-./samples/aio/hosts.ini}" -m file \ 97 | -a 'path=/etc/apt/sources.list.d/docker.list state=absent' -b \ 98 | -e "ansible_user=$USER" 99 | sudo rm -f /etc/docker/daemon.json 100 | } 101 | 102 | function _run_kolla_ansible { 103 | # PEP 370 -- Per user site-packages directory 104 | [[ $PATH != *.local/bin* ]] && export PATH=$PATH:$HOME/.local/bin 105 | kolla-genpwd 106 | kolla_ansible_version="$(pip freeze | grep kolla-ansible | sed 's/^.*=//')" 107 | # shellcheck disable=SC2046 108 | run_kolla_actions $(_get_kolla_actions "$kolla_ansible_version") 109 | sudo chown "$USER" /etc/kolla/admin-openrc.sh 110 | # shellcheck disable=SC2002 111 | cat /etc/kolla/admin-openrc.sh | sudo tee --append /etc/environment 112 | } 113 | 114 | function main { 115 | sudo touch /etc/timezone 116 | 117 | _start=$(date +%s) 118 | trap 'printf "Provisioning process: %s secs\n" "$(($(date +%s)-_start))"' EXIT 119 | 120 | _install_deps 121 | sudo mkdir -p /etc/{kolla,ansible,systemd/system/docker.service.d} 122 | 123 | # Setup configuration values 124 | if [ "${OS_ENABLE_LOCAL_REGISTRY:-false}" == "true" ]; then 125 | export OS_KOLLA_DOCKER_REGISTRY="${DOCKER_REGISTRY_IP:-127.0.0.1}:${DOCKER_REGISTRY_PORT:-5000}" 126 | export OS_KOLLA_DOCKER_REGISTRY_INSECURE="yes" 127 | export OS_KOLLA_DOCKER_NAMESPACE="kolla" 128 | fi 129 | set_values 130 | _setup_proxy 131 | setup_ansible 132 | 133 | _cleanup_docker_services 134 | 135 | _run_kolla_ansible 136 | 137 | if groups | grep -q docker && (! getent group docker | grep -q "$USER"); then 138 | sudo usermod -aG docker "$USER" 139 | fi 140 | } 141 | 142 | if [[ ${__name__:-"__main__"} == "__main__" ]]; then 143 | main 144 | fi 145 | -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # SPDX-license-identifier: Apache-2.0 3 | ############################################################################## 4 | # Copyright (c) 2019 5 | # All rights reserved. This program and the accompanying materials 6 | # are made available under the terms of the Apache License, Version 2.0 7 | # which accompanies this distribution, and is available at 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | ############################################################################## 10 | 11 | set -o nounset 12 | set -o pipefail 13 | set -o errexit 14 | if [[ ${OS_DEBUG:-false} == "true" ]]; then 15 | export PKG_DEBUG=true 16 | set -o xtrace 17 | fi 18 | 19 | ##################### 20 | # Discovery process # 21 | ##################### 22 | 23 | # Management network - Used for internal communication between 24 | # OpenStack Components. The IP addresses on this network should be 25 | # reachable only within the data center and is considered the 26 | # Management Security Domain. 27 | mgmt_nic=$(ip route get 8.8.8.8 | grep "^8." | awk '{ print $5 }') 28 | mgmt_ip=$(ip route get 8.8.8.8 | grep "^8." | awk '{ print $7 }') 29 | 30 | # Guest network - Used for VM data communication within the cloud 31 | # deployment. The IP addressing requirements of this network depend 32 | # on the OpenStack Networking plug-in in use and the network 33 | # configuration choices of the virtual networks made by the tenant. 34 | # This network is considered the Guest Security Domain. 35 | 36 | # External network - Used to provide VMs with Internet access in some 37 | # deployment scenarios. The IP addresses on this network should be 38 | # reachable by anyone on the Internet. This network is considered to 39 | # be in the Public Security Domain. 40 | 41 | # API network - Exposes all OpenStack APIs, including the OpenStack 42 | # Networking API, to tenants. The IP addresses on this network should 43 | # be reachable by anyone on the Internet. This may be the same network 44 | # as the external network, as it is possible to create a subnet for 45 | # the external network that uses IP allocation ranges to use only less 46 | # than the full range of IP addresses in an IP block. This network is 47 | # considered the Public Security Domain. 48 | if ip route | grep -q "^10.10"; then 49 | public_nic=$(ip route | grep "^10.10" | awk '{ print $3 }') 50 | else 51 | if [ -z "${OS_KOLLA_NEUTRON_EXTERNAL_INTERFACE-}" ]; then 52 | echo "ERROR: Using the management network interface as Neutron External can result in losing external connectivity" 53 | exit 1 54 | fi 55 | public_nic=${mgmt_nic} 56 | fi 57 | public_ip=$(ip addr | awk "/${public_nic}\$/ { sub(/\/[0-9]*/, \"\","' $2); print $2}') 58 | 59 | export DOCKER_REGISTRY_PORT=${DOCKER_REGISTRY_PORT:-6000} 60 | OS_FOLDER=${OS_FOLDER:-/opt/openstack-multinode} 61 | export OS_KOLLA_KOLLA_INTERNAL_VIP_ADDRESS=${OS_KOLLA_KOLLA_INTERNAL_VIP_ADDRESS:-$mgmt_ip} 62 | export OS_KOLLA_NETWORK_INTERFACE=$mgmt_nic 63 | if [ -z "${OS_KOLLA_NEUTRON_EXTERNAL_INTERFACE-}" ]; then 64 | export OS_KOLLA_NEUTRON_EXTERNAL_INTERFACE=$public_nic 65 | fi 66 | 67 | ###################### 68 | # Validation process # 69 | ###################### 70 | 71 | # Validating passwordless sudo 72 | if ! sudo -n "true"; then 73 | echo "" 74 | echo "passwordless sudo is needed for '$(id -nu)' user." 75 | echo "Please fix your /etc/sudoers file. You likely want an" 76 | echo "entry like the following one..." 77 | echo "" 78 | echo "$(id -nu) ALL=(ALL) NOPASSWD: ALL" 79 | exit 1 80 | fi 81 | 82 | # Validating local IP addresses in no_proxy environment variable 83 | if [ -n "${NO_PROXY-}" ]; then 84 | for ip in $(hostname --ip-address || hostname -i) ${mgmt_ip} ${public_ip}; do 85 | if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ && $NO_PROXY != *"$ip"* ]]; then 86 | echo "The $ip IP address is not defined in NO_PROXY env" 87 | exit 1 88 | fi 89 | done 90 | fi 91 | 92 | # Validating SELinux 93 | if command -v sestatus && [[ $(sestatus | grep Current) != *permissive* ]]; then 94 | echo "" 95 | echo "SELinux requires to be configured as Permissive mode." 96 | echo "Please fix your /etc/selinux/config file." 97 | exit 1 98 | fi 99 | 100 | # Ensuring project's source code 101 | if [ ! -d "${OS_FOLDER}" ]; then 102 | # NOTE: Shorten link -> https://github.com/electrocucaracha/pkg-mgr_scripts 103 | curl -fsSL http://bit.ly/install_pkg | PKG_COMMANDS_LIST="git" bash 104 | 105 | echo "Cloning and configuring openstack-multinode project..." 106 | sudo -E git clone --depth 1 https://github.com/electrocucaracha/openstack-multinode "${OS_FOLDER:-/opt/openstack-multinode}" 107 | sudo chown -R "$USER" "${OS_FOLDER}" 108 | fi 109 | cd "${OS_FOLDER}" || exit 110 | sudo mkdir -p /etc/kolla/config 111 | sudo cp -R etc/kolla/* /etc/kolla/ 112 | sudo chown "$USER" /etc/kolla/passwords.yml 113 | 114 | for os_var in $(printenv | grep OS_); do 115 | echo "export $os_var" | sudo tee --append /etc/environment 116 | done 117 | 118 | ############################### 119 | # OpenStack Registry creation # 120 | ############################### 121 | 122 | if [ "${OS_ENABLE_LOCAL_REGISTRY:-false}" == "true" ]; then 123 | export DOCKER_REGISTRY_IP=${mgmt_ip} 124 | export DOCKER_REGISTRY_PORT=${DOCKER_REGISTRY_PORT} 125 | ./registry.sh 126 | fi 127 | 128 | ################################ 129 | # OpenStack Deployment process # 130 | ################################ 131 | 132 | ./undercloud.sh 133 | 134 | # Post-Install actions 135 | if [ "${OS_KOLLA_RUN_INIT:-true}" == "true" ]; then 136 | python -m pip install --ignore-installed --no-warn-script-location python-openstackclient 137 | 138 | # PEP 370 -- Per user site-packages directory 139 | [[ $PATH != *.local/bin* ]] && export PATH=$PATH:$HOME/.local/bin 140 | openstack complete | sudo tee /etc/bash_completion.d/osc.bash_completion >/dev/null 141 | 142 | sudo chown "$USER:" /etc/kolla/admin-openrc.sh 143 | # https://docs.openstack.org/openstacksdk/latest/user/guides/connect_from_config.html 144 | sudo chown "$USER:" /etc/kolla/clouds.yaml || : 145 | # shellcheck disable=SC1091 146 | source /etc/kolla/admin-openrc.sh 147 | curl -fsSL "https://raw.githubusercontent.com/openstack/kolla-ansible/${OS_KOLLA_VERSION:-stable/2025.1}/tools/init-runonce" | bash 148 | 149 | [ "${OS_KOLLA_ENABLE_CINDER:-yes}" == "yes" ] && ./scripts/cinder.sh 150 | [ "${OS_KOLLA_ENABLE_MAGNUM:-no}" == "yes" ] && ./scripts/magnum.sh 151 | [ "${OS_KOLLA_ENABLE_NEUTRON_TRUNK:-yes}" == "yes" ] && ./scripts/neutron_trunk.sh 152 | fi 153 | 154 | echo "Statistics:" 155 | printf "CPU usage: " 156 | grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage " %"}' 157 | printf "Memory free(Kb):" 158 | awk -v low="$(grep low /proc/zoneinfo | awk '{k+=$2}END{print k}')" '{a[$1]=$2} END{ print a["MemFree:"]+a["Active(file):"]+a["Inactive(file):"]+a["SReclaimable:"]-(12*low);}' /proc/meminfo 159 | -------------------------------------------------------------------------------- /samples/distributed/Vagrantfile: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # -*- mode: ruby -*- 4 | # vi: set ft=ruby : 5 | # SPDX-license-identifier: Apache-2.0 6 | ############################################################################## 7 | # Copyright (c) 2020 8 | # All rights reserved. This program and the accompanying materials 9 | # are made available under the terms of the Apache License, Version 2.0 10 | # which accompanies this distribution, and is available at 11 | # http://www.apache.org/licenses/LICENSE-2.0 12 | ############################################################################## 13 | 14 | require "yaml" 15 | 16 | def which(cmd) 17 | exts = ENV["PATHEXT"] ? ENV["PATHEXT"].split(";") : [""] 18 | ENV["PATH"].split(File::PATH_SEPARATOR).each do |path| 19 | exts.each do |ext| 20 | exe = File.join(path, "#{cmd}#{ext}") 21 | return exe if File.executable?(exe) && !File.directory?(exe) 22 | end 23 | end 24 | nil 25 | end 26 | 27 | nodes = YAML.load_file("#{File.dirname(__FILE__)}/pdf.yml") 28 | vagrant_boxes = YAML.load_file("#{File.dirname(__FILE__)}/../../distros_supported.yml") 29 | 30 | no_proxy = ENV["NO_PROXY"] || ENV["no_proxy"] || "127.0.0.1,localhost" 31 | hosts = "127.0.0.1 localhost\n" 32 | hosts += `virsh net-dhcp-leases administration | grep 10.0.2 | grep -v undercloud | awk '{ sub("/24", "", $5); print($5,$6)}'` if which "virsh" 33 | nodes.each do |node| 34 | next unless node.key? "networks" 35 | 36 | node["networks"].each do |network| 37 | no_proxy += ",#{network['ip']}" 38 | hosts += "#{network['ip']} #{node['name']}\n" 39 | end 40 | end 41 | (1..254).each do |i| 42 | no_proxy += ",10.0.2.#{i}" 43 | end 44 | # NOTE: This is the kolla_internal_vip_address value 45 | no_proxy += ",10.10.13.3" 46 | socks_proxy = ENV["socks_proxy"] || ENV["SOCKS_PROXY"] || "" 47 | 48 | os_distro = ENV["OS_DISTRO"] || "ubuntu_22" 49 | box = vagrant_boxes[os_distro] 50 | 51 | system("echo -e \"\n\n\n\" | ssh-keygen -f #{File.dirname(__FILE__)}/../../insecure_keys/key -t rsa -N ''") unless File.exist?("#{File.dirname(__FILE__)}/../../insecure_keys/key") 52 | 53 | Vagrant.configure("2") do |config| 54 | config.vm.provider :libvirt 55 | config.vm.provider :virtualbox 56 | 57 | config.vm.synced_folder "../../", "/vagrant" 58 | config.vm.box = box["name"] 59 | config.vm.box_version = box["version"] 60 | config.ssh.insert_key = false 61 | config.vm.provider :libvirt do |v, override| 62 | override.vm.synced_folder "../../", "/vagrant", type: "virtiofs" 63 | v.memorybacking :access, mode: "shared" 64 | v.management_network_address = "10.0.2.0/24" 65 | v.management_network_name = "administration" # Administration - Provides Internet access for all nodes and is used for administration to install software packages 66 | v.random_hostname = true 67 | v.cpu_mode = "host-passthrough" 68 | v.disk_device = "sda" 69 | v.disk_bus = "sata" 70 | end 71 | config.vm.provider "virtualbox" do |v| 72 | v.gui = false 73 | v.customize ["modifyvm", :id, "--nictype1", "virtio", "--cableconnected1", "on"] 74 | # Enable nested paging for memory management in hardware 75 | v.customize ["modifyvm", :id, "--nestedpaging", "on"] 76 | # Use large pages to reduce Translation Lookaside Buffers usage 77 | v.customize ["modifyvm", :id, "--largepages", "on"] 78 | # Use virtual processor identifiers to accelerate context switching 79 | v.customize ["modifyvm", :id, "--vtxvpid", "on"] 80 | end 81 | 82 | if Vagrant.has_plugin?("vagrant-proxyconf") && (!ENV["http_proxy"].nil? || !ENV["HTTP_PROXY"].nil? || !ENV["https_proxy"].nil? || !ENV["HTTPS_PROXY"].nil?) 83 | config.proxy.http = ENV["http_proxy"] || ENV["HTTP_PROXY"] || "" 84 | config.proxy.https = ENV["https_proxy"] || ENV["HTTPS_PROXY"] || "" 85 | config.proxy.no_proxy = no_proxy 86 | config.proxy.enabled = { docker: false } 87 | end 88 | 89 | # Basic requirements installation 90 | config.vm.provision "shell", path: "#{File.dirname(__FILE__)}/../../requirements/base.sh" 91 | 92 | config.vm.provision "shell", inline: <<~SHELL 93 | if command -v sestatus; then 94 | sudo setenforce Permissive 95 | sudo sed -i "s/^SELINUX=.*/SELINUX=permissive/g" /etc/selinux/config 96 | fi 97 | SHELL 98 | config.trigger.after :up do |trigger| 99 | trigger.info = "Configure Authorized Keys" 100 | trigger.run_remote = { inline: "cat /vagrant/insecure_keys/key.pub >> /home/vagrant/.ssh/authorized_keys" } 101 | end 102 | 103 | nodes.each do |node| 104 | config.vm.define node["name"] do |nodeconfig| 105 | nodeconfig.vm.hostname = node["name"] 106 | 107 | %i[virtualbox libvirt].each do |provider| 108 | nodeconfig.vm.provider provider do |p| 109 | p.cpus = node["cpus"] 110 | p.memory = node["memory"] 111 | end 112 | end 113 | 114 | # Networks 115 | if node.key? "networks" 116 | node["networks"].each do |network| 117 | nodeconfig.vm.network :private_network, ip: network["ip"], type: :static, libvirt__network_name: network["name"], nic_type: "virtio", virtualbox__intnet: true 118 | end 119 | end 120 | nodeconfig.vm.network :private_network, ip: "0.0.0.0", auto_network: true, libvirt__network_name: "external-net", nic_type: "virtio", virtualbox__intnet: true if node["roles"].include?("network") 121 | 122 | nodeconfig.vm.provider "virtualbox" do |v| 123 | if node.key? "volumes" 124 | node["volumes"].each do |volume| 125 | volume_file = "#{node['name']}-#{volume['name']}.vdi" 126 | v.customize ["createmedium", "disk", "--filename", volume_file, "--size", (volume["size"] * 1024)] unless File.exist?(volume_file) 127 | v.customize ["storageattach", :id, "--storagectl", box["vb_controller"], "--port", 1, "--device", 0, "--type", "hdd", "--medium", volume_file] 128 | end 129 | end 130 | end 131 | nodeconfig.vm.provider :libvirt do |v| 132 | if node.key? "volumes" 133 | node["volumes"].each do |volume| 134 | v.storage :file, bus: "sata", device: volume["name"], size: volume["size"] 135 | end 136 | end 137 | v.nested = true if node["roles"].include?("compute") 138 | end 139 | 140 | volume_mounts_dict = "" 141 | cinder_volume = "" 142 | if node.key? "volumes" 143 | node["volumes"].each do |volume| 144 | if volume.key? "mount" 145 | volume_mounts_dict += "#{volume['name']}=#{volume['mount']}," 146 | else 147 | cinder_volume += "/dev/#{volume['name']}," 148 | end 149 | end 150 | end 151 | nodeconfig.vm.provision "shell", privileged: false do |sh| 152 | sh.env = { 153 | SOCKS_PROXY: socks_proxy.to_s, 154 | OPENSTACK_NODE_ROLES: node["roles"].join(" ").to_s, 155 | OPENSTACK_SCRIPTS_DIR: "/vagrant", 156 | OS_KOLLA_BUILD_ARGS: ENV.fetch("OS_KOLLA_BUILD_ARGS", nil), 157 | OS_DEBUG: ENV.fetch("OS_DEBUG", nil), 158 | DOCKER_REGISTRY_IP: "10.10.13.2" 159 | } 160 | sh.inline = <<-SHELL 161 | set -o errexit 162 | cd /vagrant/ 163 | ./node.sh -v "#{volume_mounts_dict[0...-1]}" -c "#{cinder_volume[0...-1]}" | tee ~/node.log 164 | SHELL 165 | end 166 | end 167 | end 168 | 169 | config.vm.define :undercloud, primary: true, autostart: false do |undercloud| 170 | undercloud.vm.hostname = "undercloud" 171 | 172 | # SSH Keys configuration 173 | undercloud.vm.provision "shell", privileged: false, inline: <<-SHELL 174 | cd /vagrant 175 | cp insecure_keys/key ~/.ssh/id_rsa 176 | cp insecure_keys/key.pub ~/.ssh/id_rsa.pub 177 | chown "$USER" ~/.ssh/id_rsa 178 | chmod 400 ~/.ssh/id_rsa 179 | SHELL 180 | 181 | undercloud.vm.provision "shell", privileged: false do |sh| 182 | undercloud.trigger.after :up do |trigger| 183 | trigger.info = "OpenStack environment variables" 184 | trigger.run_remote = { inline: "printenv | grep OS_ ||:" } 185 | end 186 | sh.env = { 187 | DOCKER_REGISTRY_IP: "10.10.13.2", 188 | OS_KOLLA_KOLLA_INTERNAL_VIP_ADDRESS: "10.10.13.3", 189 | OS_ENABLE_LOCAL_REGISTRY: "true", 190 | OS_KOLLA_NETWORK_INTERFACE: "eth0", 191 | OS_KOLLA_API_INTERFACE: "eth1", 192 | OS_KOLLA_NEUTRON_EXTERNAL_INTERFACE: "eth2", 193 | OS_KOLLA_ENABLE_HAPROXY: "yes", 194 | OS_INVENTORY_FILE: "/vagrant/samples/distributed/hosts.ini" 195 | } 196 | sh.inline = <<-SHELL 197 | echo "#{hosts}" | sudo tee /etc/hosts 198 | 199 | for os_var in $(printenv | grep OS_); do echo "export $os_var" | sudo tee --append /etc/environment ; done 200 | 201 | cd /vagrant/ 202 | sudo mkdir -p /etc/kolla/config 203 | sudo cp -R etc/kolla/* /etc/kolla/ 204 | sudo chown "$USER" /etc/kolla/passwords.yml 205 | 206 | ./undercloud.sh | tee ~/undercloud.log 207 | SHELL 208 | end 209 | end 210 | end 211 | -------------------------------------------------------------------------------- /samples/aio/Vagrantfile: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # -*- mode: ruby -*- 4 | # vi: set ft=ruby : 5 | # SPDX-license-identifier: Apache-2.0 6 | ############################################################################## 7 | # Copyright (c) 2020 8 | # All rights reserved. This program and the accompanying materials 9 | # are made available under the terms of the Apache License, Version 2.0 10 | # which accompanies this distribution, and is available at 11 | # http://www.apache.org/licenses/LICENSE-2.0 12 | ############################################################################## 13 | 14 | require "yaml" 15 | 16 | vagrant_boxes = YAML.load_file("#{File.dirname(__FILE__)}/../../distros_supported.yml") 17 | 18 | no_proxy = ENV["NO_PROXY"] || ENV["no_proxy"] || "127.0.0.1,localhost" 19 | (1..254).each do |i| 20 | no_proxy += ",10.0.2.#{i}" 21 | end 22 | socks_proxy = ENV["socks_proxy"] || ENV["SOCKS_PROXY"] || "" 23 | os_distro = ENV["OS_DISTRO"] || "debian_12" 24 | box = vagrant_boxes[os_distro] 25 | enable_magnum = ENV["OS_KOLLA_ENABLE_MAGNUM"] || "no" 26 | 27 | Vagrant.configure("2") do |config| 28 | config.vm.provider :libvirt 29 | config.vm.provider :virtualbox 30 | config.vm.provider :google 31 | 32 | config.vm.synced_folder "../../", "/vagrant" 33 | config.vm.box = box["name"] 34 | config.vm.box_version = box["version"] 35 | config.vm.box_check_update = false 36 | config.ssh.insert_key = false 37 | config.vm.hostname = "aio" 38 | 39 | # Basic requirements installation 40 | config.vm.provision "shell", path: "#{File.dirname(__FILE__)}/../../requirements/base.sh" 41 | 42 | # SSH Keys configuration 43 | config.vm.provision "shell", privileged: false, inline: <<-SHELL 44 | sudo sed -i '/^PermitRootLogin no/d' /etc/ssh/sshd_config 45 | rm -f ~/.ssh/id_rsa* 46 | sudo mkdir -p /root/.ssh/ 47 | echo -e "\n\n\n" | ssh-keygen -t rsa -N "" 48 | if [ "$EUID" -ne "0" ]; then 49 | # Attempt to copy file when non root else cmd fails with 'same file' message 50 | sudo cp ~/.ssh/id_rsa /root/.ssh/id_rsa 51 | fi 52 | < ~/.ssh/id_rsa.pub tee --append ~/.ssh/authorized_keys | sudo tee --append /root/.ssh/authorized_keys 53 | chmod og-wx ~/.ssh/authorized_keys 54 | SHELL 55 | 56 | # Configure single NIC limitation 57 | config.vm.provision "shell", privileged: false, inline: <<~SHELL 58 | set -o xtrace 59 | 60 | sudo ip link add veth0 type veth peer name veth1 61 | source /etc/os-release || source /usr/lib/os-release 62 | case ${ID,,} in 63 | ubuntu|debian) 64 | sudo ip link set dev veth0 up 65 | if ! command -v brctl; then 66 | sudo apt-get update ||: 67 | sudo apt-get install -y -qq -o=Dpkg::Use-Pty=0 --reinstall --no-install-recommends bridge-utils 68 | fi 69 | sudo brctl addbr uplinkbridge 70 | sudo brctl addif uplinkbridge veth0 71 | sudo ip link set uplinkbridge up 72 | ;; 73 | rhel|centos|fedora|rocky) 74 | if command -v nmcli; then 75 | sudo nmcli c add type bridge ifname uplinkbridge 76 | sudo nmcli c add type ethernet slave-type bridge con-name uplinkbridge ifname veth0 master uplinkbridge 77 | sudo nmcli c add type ethernet ifname veth0 con-name uplinkbridge ip4 10.10.13.7/24 78 | sudo nmcli c show 79 | sudo nmcli c up uplinkbridge 80 | fi 81 | ;; 82 | esac 83 | sudo ip addr add 10.10.13.7/24 dev veth0 84 | sudo ip route show 85 | 86 | sudo mkdir -p /etc/rc.d/ 87 | sudo tee /etc/rc.d/rc.local << EOF 88 | #!/bin/bash 89 | sudo ip link add veth0 type veth peer name veth1 90 | sudo ip addr add 10.10.13.7/24 dev veth0 91 | EOF 92 | sudo chmod +x /etc/rc.d/rc.local 93 | SHELL 94 | 95 | # Configure fake cinder LVM 96 | config.vm.provision "shell", privileged: false, inline: <<~SHELL 97 | dd if=/dev/zero of=~/cinder.img bs=1 count=1 seek=100G 98 | sudo losetup $(sudo losetup -f) ~/cinder.img 99 | sudo losetup -l 100 | SHELL 101 | 102 | # Ensure Permissive SELinux policy 103 | config.vm.provision "shell", privileged: false, inline: <<-SHELL 104 | if command -v sestatus; then 105 | sudo setenforce Permissive 106 | sudo sed -i "s/^SELINUX=.*/SELINUX=permissive/g" /etc/selinux/config 107 | fi 108 | SHELL 109 | 110 | config.vm.provision "shell", privileged: false do |sh| 111 | sh.env = { 112 | SOCKS_PROXY: socks_proxy.to_s, 113 | OS_DEBUG: ENV.fetch("OS_DEBUG", "false"), 114 | OPENSTACK_RELEASE: ENV.fetch("OPENSTACK_RELEASE", nil), 115 | OS_FOLDER: "/vagrant/", 116 | OS_KOLLA_DEPLOY_PROFILE: "minimal", 117 | OS_KOLLA_KOLLA_INSTALL_TYPE: ENV.fetch("OS_KOLLA_KOLLA_INSTALL_TYPE", "binary"), 118 | ENABLE_WEAVE_SCOPE: ENV.fetch("ENABLE_WEAVE_SCOPE", nil), 119 | OS_KOLLA_RUN_INIT: ENV.fetch("OS_KOLLA_RUN_INIT", nil), 120 | OPENSTACK_NODE_ROLES: "compute", 121 | OS_KOLLA_ENABLE_HEAT: "no", 122 | OS_KOLLA_ENABLE_HORIZON: ENV.fetch("OS_KOLLA_ENABLE_HORIZON", nil), 123 | OS_KOLLA_ENABLE_MAGNUM: enable_magnum.to_s, 124 | OS_KOLLA_ENABLE_NEUTRON_PROVIDER_NETWORKS: "yes", 125 | EXT_NET_RANGE: "start=10.0.2.20,end=10.0.2.100", 126 | EXT_NET_CIDR: "10.0.2.0/24" 127 | } 128 | sh.inline = <<~SHELL 129 | set -o errexit 130 | 131 | export EXT_NET_GATEWAY=$(ip r | grep "^default" | awk 'NR==1{print $3}') 132 | source /etc/os-release || source /usr/lib/os-release 133 | export OS_KOLLA_KOLLA_BASE_DISTRO=${ID,,} 134 | 135 | cd /vagrant 136 | echo "127.0.0.1 localhost" | sudo tee /etc/hosts 137 | 138 | ./node.sh -v sdb=/var/lib/docker/ -c "$(sudo losetup -l | grep cinder.img | awk '{ print $1 }')" | tee ~/node_aio.log 139 | ./install.sh 140 | 141 | grep --no-filename ": .* secs" ~/*.log 142 | grep ': .* -* .*s$' ~/*.log | awk '{ print $NF,$0 }' | sort -k1,1 -n -r | cut -f2- -d' ' | head 143 | sudo docker stats --no-stream 144 | 145 | if [ "${ENABLE_WEAVE_SCOPE:-false}" == "true" ]; then 146 | sudo curl -L git.io/scope -o /usr/local/bin/scope 147 | sudo chmod a+x /usr/local/bin/scope 148 | newgrp docker < /etc/hosts 104 | 127.0.0.1 localhost 105 | #{hosts} 106 | EOF 107 | SHELL 108 | 109 | (1..num_compute_nodes.to_i).each do |i| 110 | config.vm.define "compute#{i.to_s.rjust(2, '0')}" do |nodeconfig| 111 | nodeconfig.vm.hostname = "compute#{i.to_s.rjust(2, '0')}" 112 | nodeconfig.vm.network :private_network, ip: "#{subnet}.#{i + 8}", type: :static, libvirt__network_name: "tunnel-net", nic_type: "virtio", virtualbox__intnet: true 113 | nodeconfig.vm.network :public_network, dev: public_nic, bridge: vb_public_nic, auto_config: false 114 | 115 | %i[virtualbox libvirt].each do |provider| 116 | nodeconfig.vm.provider provider do |p| 117 | p.memory = ENV["MEMORY"] || (4 * 1024) 118 | end 119 | end 120 | 121 | config.vm.provider "virtualbox" do |v| 122 | v.customize ["modifyvm", :id, "--nested-hw-virt", "on"] 123 | end 124 | nodeconfig.vm.disk :disk, name: "cinder", size: "50GB" 125 | 126 | nodeconfig.vm.provider :libvirt do |v| 127 | v.nested = true 128 | v.storage :file, bus: "sata", device: "sdb", size: 50 # Cinder volume 129 | end 130 | nodeconfig.vm.provision "shell", privileged: false do |sh| 131 | sh.env = { 132 | OPENSTACK_NODE_ROLES: "compute", 133 | OS_DEBUG: debug.to_s 134 | } 135 | sh.inline = <<-SHELL 136 | cd /vagrant 137 | ./node.sh -c /dev/sdb | tee ~/node_$(hostname).log 138 | SHELL 139 | end 140 | nodeconfig.trigger.after :up do |trigger| 141 | trigger.info = "Configure Authorized Keys" 142 | trigger.run_remote = { inline: "cat /vagrant/insecure_keys/key.pub >> /home/vagrant/.ssh/authorized_keys" } 143 | end 144 | end 145 | end 146 | 147 | config.vm.define "controller", primary: true, autostart: false do |controller| 148 | controller.vm.hostname = "controller" 149 | controller.vm.network :private_network, ip: controller_ip.to_s, type: :static, libvirt__network_name: "tunnel-net", nic_type: "virtio", virtualbox__intnet: true 150 | controller.vm.network :public_network, dev: public_nic, bridge: vb_public_nic, auto_config: false 151 | 152 | # SSH Keys configuration 153 | controller.vm.provision "shell", privileged: false, inline: <<-SHELL 154 | cd /vagrant 155 | cp insecure_keys/key ~/.ssh/id_rsa 156 | cp insecure_keys/key.pub ~/.ssh/id_rsa.pub 157 | chown "$USER" ~/.ssh/id_rsa 158 | chmod 400 ~/.ssh/id_rsa 159 | SHELL 160 | controller.vm.provision "shell", privileged: false do |sh| 161 | sh.env = { 162 | SOCKS_PROXY: ENV["socks_proxy"] || ENV["SOCKS_PROXY"] || "", 163 | OS_FOLDER: "/vagrant/", 164 | OS_DEBUG: debug.to_s, 165 | OS_ENABLE_LOCAL_REGISTRY: ENV["OS_ENABLE_LOCAL_REGISTRY"] || "true", 166 | OS_INVENTORY_FILE: "./samples/noha/hosts.ini", 167 | OS_KOLLA_API_INTERFACE: "eth1", 168 | OS_KOLLA_NEUTRON_EXTERNAL_INTERFACE: "eth2", 169 | OS_KOLLA_ENABLE_NEUTRON_PROVIDER_NETWORKS: "yes", 170 | OS_KOLLA_KOLLA_INTERNAL_VIP_ADDRESS: controller_ip.to_s, 171 | OS_KOLLA_ENABLE_HEAT: ENV["OS_KOLLA_ENABLE_HEAT"] || "false", 172 | EXT_NET_RANGE: "start=#{cloud_public_cidr.sub('0/24', '50')},end=#{cloud_public_cidr.sub('0/24', '100')}", 173 | EXT_NET_CIDR: cloud_public_cidr.to_s, 174 | EXT_NET_GATEWAY: cloud_public_gw.to_s 175 | } 176 | sh.inline = <<-SHELL 177 | set -o errexit 178 | 179 | for os_var in $(printenv | grep "OS_|EXT_NET_" ); do echo "export $os_var" | sudo tee --append /etc/environment ; done 180 | 181 | cd /vagrant 182 | cat ./insecure_keys/key.pub >> ~/.ssh/authorized_keys 183 | 184 | # Create ansible inventory file 185 | pushd samples/noha/ 186 | rm -f $(basename $OS_INVENTORY_FILE) 187 | cat header.ini | tee --append $(basename $OS_INVENTORY_FILE) 188 | cat tail.ini | tee --append $(basename $OS_INVENTORY_FILE) 189 | popd 190 | 191 | ./node.sh -v sdb=/var/lib/docker/ | tee ~/node_controller.log 192 | ./install.sh | tee ~/install_controller.log 193 | SHELL 194 | end 195 | %i[virtualbox libvirt].each do |provider| 196 | config.vm.provider provider do |p| 197 | p.cpus = ENV["CPU"] || 4 198 | p.memory = ENV["MEMORY"] || (8 * 1024) 199 | end 200 | end 201 | 202 | # Volumes 203 | controller.vm.disk :disk, name: "docker", size: "50GB" 204 | controller.vm.provider :libvirt do |v| 205 | v.storage :file, bus: "sata", device: "sdb", size: 50 206 | end 207 | controller.trigger.after :up do |trigger| 208 | trigger.info = "OpenStack environment variables" 209 | trigger.run_remote = { inline: "printenv | grep OS_ ||:" } 210 | end 211 | end 212 | 213 | if !ENV["http_proxy"].nil? && !ENV["https_proxy"].nil? && Vagrant.has_plugin?("vagrant-proxyconf") 214 | config.proxy.http = ENV["http_proxy"] || ENV["HTTP_PROXY"] || "" 215 | config.proxy.https = ENV["https_proxy"] || ENV["HTTPS_PROXY"] || "" 216 | config.proxy.no_proxy = no_proxy 217 | config.proxy.enabled = { docker: false } 218 | end 219 | end 220 | -------------------------------------------------------------------------------- /samples/noha/tail.ini: -------------------------------------------------------------------------------- 1 | # When compute nodes and control nodes use different interfaces, 2 | # you need to comment out "api_interface" and other interfaces from the globals.yml 3 | # and specify like below: 4 | #compute01 neutron_external_interface=eth0 api_interface=em1 tunnel_interface=em1 5 | 6 | [deployment] 7 | localhost ansible_connection=local 8 | 9 | [baremetal:children] 10 | control 11 | network 12 | compute 13 | storage 14 | monitoring 15 | 16 | [tls-backend:children] 17 | control 18 | 19 | # You can explicitly specify which hosts run each project by updating the 20 | # groups in the sections below. Common services are grouped together. 21 | 22 | [common:children] 23 | control 24 | network 25 | compute 26 | storage 27 | monitoring 28 | 29 | [collectd:children] 30 | compute 31 | 32 | [grafana:children] 33 | monitoring 34 | 35 | [etcd:children] 36 | control 37 | 38 | [influxdb:children] 39 | monitoring 40 | 41 | [prometheus:children] 42 | monitoring 43 | 44 | [telegraf:children] 45 | compute 46 | control 47 | monitoring 48 | network 49 | storage 50 | 51 | [hacluster:children] 52 | control 53 | 54 | [hacluster-remote:children] 55 | compute 56 | 57 | [loadbalancer:children] 58 | network 59 | 60 | [mariadb:children] 61 | control 62 | 63 | [rabbitmq:children] 64 | control 65 | 66 | [keystone:children] 67 | control 68 | 69 | [glance:children] 70 | control 71 | 72 | [nova:children] 73 | control 74 | 75 | [neutron:children] 76 | network 77 | 78 | [openvswitch:children] 79 | network 80 | compute 81 | manila-share 82 | 83 | [cinder:children] 84 | control 85 | 86 | [cloudkitty:children] 87 | control 88 | 89 | [memcached:children] 90 | control 91 | 92 | [horizon:children] 93 | control 94 | 95 | [barbican:children] 96 | control 97 | 98 | [heat:children] 99 | control 100 | 101 | [ironic:children] 102 | control 103 | 104 | [magnum:children] 105 | control 106 | 107 | [mistral:children] 108 | control 109 | 110 | [manila:children] 111 | control 112 | 113 | [ceilometer:children] 114 | control 115 | 116 | [aodh:children] 117 | control 118 | 119 | [cyborg:children] 120 | control 121 | compute 122 | 123 | [gnocchi:children] 124 | control 125 | 126 | [tacker:children] 127 | control 128 | 129 | [trove:children] 130 | control 131 | 132 | [watcher:children] 133 | control 134 | 135 | [octavia:children] 136 | control 137 | 138 | [designate:children] 139 | control 140 | 141 | [placement:children] 142 | control 143 | 144 | [bifrost:children] 145 | deployment 146 | 147 | [zun:children] 148 | control 149 | 150 | [skyline:children] 151 | control 152 | 153 | [redis:children] 154 | control 155 | 156 | [blazar:children] 157 | control 158 | 159 | [venus:children] 160 | monitoring 161 | 162 | [letsencrypt:children] 163 | loadbalancer 164 | 165 | # Additional control implemented here. These groups allow you to control which 166 | # services run on which hosts at a per-service level. 167 | # 168 | # Word of caution: Some services are required to run on the same host to 169 | # function appropriately. For example, neutron-metadata-agent must run on the 170 | # same host as the l3-agent and (depending on configuration) the dhcp-agent. 171 | 172 | # Common 173 | [cron:children] 174 | common 175 | 176 | [fluentd:children] 177 | common 178 | 179 | [kolla-logs:children] 180 | common 181 | 182 | [kolla-toolbox:children] 183 | common 184 | 185 | [opensearch:children] 186 | control 187 | 188 | # Opensearch dashboards 189 | [opensearch-dashboards:children] 190 | opensearch 191 | 192 | # Glance 193 | [glance-api:children] 194 | glance 195 | 196 | # Nova 197 | [nova-api:children] 198 | nova 199 | 200 | [nova-conductor:children] 201 | nova 202 | 203 | [nova-metadata:children] 204 | nova 205 | 206 | [nova-super-conductor:children] 207 | nova 208 | 209 | [nova-novncproxy:children] 210 | nova 211 | 212 | [nova-scheduler:children] 213 | nova 214 | 215 | [nova-spicehtml5proxy:children] 216 | nova 217 | 218 | [nova-compute-ironic:children] 219 | nova 220 | 221 | [nova-serialproxy:children] 222 | nova 223 | 224 | # Neutron 225 | [neutron-server:children] 226 | control 227 | 228 | [neutron-dhcp-agent:children] 229 | neutron 230 | 231 | [neutron-l3-agent:children] 232 | neutron 233 | 234 | [neutron-metadata-agent:children] 235 | neutron 236 | 237 | [neutron-ovn-metadata-agent:children] 238 | compute 239 | network 240 | 241 | [neutron-bgp-dragent:children] 242 | neutron 243 | 244 | [neutron-infoblox-ipam-agent:children] 245 | neutron 246 | 247 | [neutron-metering-agent:children] 248 | neutron 249 | 250 | [ironic-neutron-agent:children] 251 | neutron 252 | 253 | [neutron-ovn-agent:children] 254 | compute 255 | network 256 | 257 | # Cinder 258 | [cinder-api:children] 259 | cinder 260 | 261 | [cinder-backup:children] 262 | storage 263 | 264 | [cinder-scheduler:children] 265 | cinder 266 | 267 | [cinder-volume:children] 268 | storage 269 | 270 | # Cloudkitty 271 | [cloudkitty-api:children] 272 | cloudkitty 273 | 274 | [cloudkitty-processor:children] 275 | cloudkitty 276 | 277 | # iSCSI 278 | [iscsid:children] 279 | compute 280 | storage 281 | ironic 282 | 283 | [tgtd:children] 284 | storage 285 | 286 | # Manila 287 | [manila-api:children] 288 | manila 289 | 290 | [manila-scheduler:children] 291 | manila 292 | 293 | [manila-share:children] 294 | network 295 | 296 | [manila-data:children] 297 | manila 298 | 299 | # Barbican 300 | [barbican-api:children] 301 | barbican 302 | 303 | [barbican-keystone-listener:children] 304 | barbican 305 | 306 | [barbican-worker:children] 307 | barbican 308 | 309 | # Heat 310 | [heat-api:children] 311 | heat 312 | 313 | [heat-api-cfn:children] 314 | heat 315 | 316 | [heat-engine:children] 317 | heat 318 | 319 | # Ironic 320 | [ironic-api:children] 321 | ironic 322 | 323 | [ironic-conductor:children] 324 | ironic 325 | 326 | [ironic-inspector:children] 327 | ironic 328 | 329 | [ironic-tftp:children] 330 | ironic 331 | 332 | [ironic-http:children] 333 | ironic 334 | 335 | # Magnum 336 | [magnum-api:children] 337 | magnum 338 | 339 | [magnum-conductor:children] 340 | magnum 341 | 342 | # Mistral 343 | [mistral-api:children] 344 | mistral 345 | 346 | [mistral-executor:children] 347 | mistral 348 | 349 | [mistral-engine:children] 350 | mistral 351 | 352 | [mistral-event-engine:children] 353 | mistral 354 | 355 | # Ceilometer 356 | [ceilometer-central:children] 357 | ceilometer 358 | 359 | [ceilometer-notification:children] 360 | ceilometer 361 | 362 | [ceilometer-compute:children] 363 | compute 364 | 365 | [ceilometer-ipmi:children] 366 | compute 367 | 368 | # Aodh 369 | [aodh-api:children] 370 | aodh 371 | 372 | [aodh-evaluator:children] 373 | aodh 374 | 375 | [aodh-listener:children] 376 | aodh 377 | 378 | [aodh-notifier:children] 379 | aodh 380 | 381 | # Cyborg 382 | [cyborg-api:children] 383 | cyborg 384 | 385 | [cyborg-agent:children] 386 | compute 387 | 388 | [cyborg-conductor:children] 389 | cyborg 390 | 391 | # Gnocchi 392 | [gnocchi-api:children] 393 | gnocchi 394 | 395 | [gnocchi-statsd:children] 396 | gnocchi 397 | 398 | [gnocchi-metricd:children] 399 | gnocchi 400 | 401 | # Trove 402 | [trove-api:children] 403 | trove 404 | 405 | [trove-conductor:children] 406 | trove 407 | 408 | [trove-taskmanager:children] 409 | trove 410 | 411 | # Multipathd 412 | [multipathd:children] 413 | compute 414 | storage 415 | 416 | # Watcher 417 | [watcher-api:children] 418 | watcher 419 | 420 | [watcher-engine:children] 421 | watcher 422 | 423 | [watcher-applier:children] 424 | watcher 425 | 426 | # Octavia 427 | [octavia-api:children] 428 | octavia 429 | 430 | [octavia-driver-agent:children] 431 | octavia 432 | 433 | [octavia-health-manager:children] 434 | octavia 435 | 436 | [octavia-housekeeping:children] 437 | octavia 438 | 439 | [octavia-worker:children] 440 | octavia 441 | 442 | # Designate 443 | [designate-api:children] 444 | designate 445 | 446 | [designate-central:children] 447 | designate 448 | 449 | [designate-producer:children] 450 | designate 451 | 452 | [designate-mdns:children] 453 | network 454 | 455 | [designate-worker:children] 456 | designate 457 | 458 | [designate-sink:children] 459 | designate 460 | 461 | [designate-backend-bind9:children] 462 | designate 463 | 464 | # Placement 465 | [placement-api:children] 466 | placement 467 | 468 | # Zun 469 | [zun-api:children] 470 | zun 471 | 472 | [zun-wsproxy:children] 473 | zun 474 | 475 | [zun-compute:children] 476 | compute 477 | 478 | [zun-cni-daemon:children] 479 | compute 480 | 481 | # Skyline 482 | [skyline-apiserver:children] 483 | skyline 484 | 485 | [skyline-console:children] 486 | skyline 487 | 488 | # Tacker 489 | [tacker-server:children] 490 | tacker 491 | 492 | [tacker-conductor:children] 493 | tacker 494 | 495 | # Blazar 496 | [blazar-api:children] 497 | blazar 498 | 499 | [blazar-manager:children] 500 | blazar 501 | 502 | # Prometheus 503 | [prometheus-node-exporter:children] 504 | monitoring 505 | control 506 | compute 507 | network 508 | storage 509 | 510 | [prometheus-mysqld-exporter:children] 511 | mariadb 512 | 513 | [prometheus-memcached-exporter:children] 514 | memcached 515 | 516 | [prometheus-cadvisor:children] 517 | monitoring 518 | control 519 | compute 520 | network 521 | storage 522 | 523 | [prometheus-alertmanager:children] 524 | monitoring 525 | 526 | [prometheus-openstack-exporter:children] 527 | monitoring 528 | 529 | [prometheus-elasticsearch-exporter:children] 530 | opensearch 531 | 532 | [prometheus-blackbox-exporter:children] 533 | monitoring 534 | 535 | [prometheus-libvirt-exporter:children] 536 | compute 537 | 538 | [masakari-api:children] 539 | control 540 | 541 | [masakari-engine:children] 542 | control 543 | 544 | [masakari-hostmonitor:children] 545 | control 546 | 547 | [masakari-instancemonitor:children] 548 | compute 549 | 550 | [ovn-controller:children] 551 | ovn-controller-compute 552 | ovn-controller-network 553 | 554 | [ovn-controller-compute:children] 555 | compute 556 | 557 | [ovn-controller-network:children] 558 | network 559 | 560 | [ovn-database:children] 561 | control 562 | 563 | [ovn-northd:children] 564 | ovn-database 565 | 566 | [ovn-nb-db:children] 567 | ovn-database 568 | 569 | [ovn-sb-db:children] 570 | ovn-database 571 | 572 | [ovn-sb-db-relay:children] 573 | ovn-database 574 | 575 | [venus-api:children] 576 | venus 577 | 578 | [venus-manager:children] 579 | venus 580 | 581 | [letsencrypt-webserver:children] 582 | letsencrypt 583 | 584 | [letsencrypt-lego:children] 585 | letsencrypt 586 | -------------------------------------------------------------------------------- /samples/aio/hosts.ini: -------------------------------------------------------------------------------- 1 | # These initial groups are the only groups required to be modified. The 2 | # additional groups are for more control of the environment. 3 | [control] 4 | localhost ansible_connection=local 5 | 6 | [network] 7 | localhost ansible_connection=local 8 | 9 | [compute] 10 | localhost ansible_connection=local 11 | 12 | [storage] 13 | localhost ansible_connection=local 14 | 15 | [monitoring] 16 | localhost ansible_connection=local 17 | 18 | [deployment] 19 | localhost ansible_connection=local 20 | 21 | # You can explicitly specify which hosts run each project by updating the 22 | # groups in the sections below. Common services are grouped together. 23 | 24 | [common:children] 25 | control 26 | network 27 | compute 28 | storage 29 | monitoring 30 | 31 | [collectd:children] 32 | compute 33 | 34 | [baremetal:children] 35 | control 36 | 37 | [tls-backend:children] 38 | control 39 | 40 | [grafana:children] 41 | monitoring 42 | 43 | [etcd:children] 44 | control 45 | 46 | [telegraf:children] 47 | compute 48 | control 49 | monitoring 50 | network 51 | storage 52 | 53 | [hacluster:children] 54 | control 55 | 56 | [hacluster-remote:children] 57 | compute 58 | 59 | [loadbalancer:children] 60 | network 61 | 62 | [mariadb:children] 63 | control 64 | 65 | [rabbitmq:children] 66 | control 67 | 68 | [keystone:children] 69 | control 70 | 71 | [glance:children] 72 | control 73 | 74 | [nova:children] 75 | control 76 | 77 | [neutron:children] 78 | network 79 | 80 | [openvswitch:children] 81 | network 82 | compute 83 | manila-share 84 | 85 | [cinder:children] 86 | control 87 | 88 | [cloudkitty:children] 89 | control 90 | 91 | [memcached:children] 92 | control 93 | 94 | [horizon:children] 95 | control 96 | 97 | [barbican:children] 98 | control 99 | 100 | [heat:children] 101 | control 102 | 103 | [ironic:children] 104 | control 105 | 106 | [influxdb:children] 107 | monitoring 108 | 109 | [prometheus:children] 110 | monitoring 111 | 112 | [magnum:children] 113 | control 114 | 115 | [mistral:children] 116 | control 117 | 118 | [manila:children] 119 | control 120 | 121 | [gnocchi:children] 122 | control 123 | 124 | [ceilometer:children] 125 | control 126 | 127 | [aodh:children] 128 | control 129 | 130 | [cyborg:children] 131 | control 132 | compute 133 | 134 | [tacker:children] 135 | control 136 | 137 | [trove:children] 138 | control 139 | 140 | [watcher:children] 141 | control 142 | 143 | [octavia:children] 144 | control 145 | 146 | [designate:children] 147 | control 148 | 149 | [placement:children] 150 | control 151 | 152 | [bifrost:children] 153 | deployment 154 | 155 | [zun:children] 156 | control 157 | 158 | [skyline:children] 159 | control 160 | 161 | [redis:children] 162 | control 163 | 164 | [blazar:children] 165 | control 166 | 167 | [venus:children] 168 | monitoring 169 | 170 | [letsencrypt:children] 171 | loadbalancer 172 | 173 | # Additional control implemented here. These groups allow you to control which 174 | # services run on which hosts at a per-service level. 175 | # 176 | # Word of caution: Some services are required to run on the same host to 177 | # function appropriately. For example, neutron-metadata-agent must run on the 178 | # same host as the l3-agent and (depending on configuration) the dhcp-agent. 179 | 180 | # Common 181 | [cron:children] 182 | common 183 | 184 | [fluentd:children] 185 | common 186 | 187 | [kolla-logs:children] 188 | common 189 | 190 | [kolla-toolbox:children] 191 | common 192 | 193 | [opensearch:children] 194 | control 195 | 196 | # Opensearch dashboards 197 | [opensearch-dashboards:children] 198 | opensearch 199 | 200 | # Glance 201 | [glance-api:children] 202 | glance 203 | 204 | # Nova 205 | [nova-api:children] 206 | nova 207 | 208 | [nova-conductor:children] 209 | nova 210 | 211 | [nova-metadata:children] 212 | nova 213 | 214 | [nova-super-conductor:children] 215 | nova 216 | 217 | [nova-novncproxy:children] 218 | nova 219 | 220 | [nova-scheduler:children] 221 | nova 222 | 223 | [nova-spicehtml5proxy:children] 224 | nova 225 | 226 | [nova-compute-ironic:children] 227 | nova 228 | 229 | [nova-serialproxy:children] 230 | nova 231 | 232 | # Neutron 233 | [neutron-server:children] 234 | control 235 | 236 | [neutron-dhcp-agent:children] 237 | neutron 238 | 239 | [neutron-l3-agent:children] 240 | neutron 241 | 242 | [neutron-metadata-agent:children] 243 | neutron 244 | 245 | [neutron-ovn-metadata-agent:children] 246 | compute 247 | network 248 | 249 | [neutron-ovn-agent:children] 250 | compute 251 | 252 | [neutron-bgp-dragent:children] 253 | neutron 254 | 255 | [neutron-infoblox-ipam-agent:children] 256 | neutron 257 | 258 | [neutron-metering-agent:children] 259 | neutron 260 | 261 | [ironic-neutron-agent:children] 262 | neutron 263 | 264 | # Cinder 265 | [cinder-api:children] 266 | cinder 267 | 268 | [cinder-backup:children] 269 | storage 270 | 271 | [cinder-scheduler:children] 272 | cinder 273 | 274 | [cinder-volume:children] 275 | storage 276 | 277 | # Cloudkitty 278 | [cloudkitty-api:children] 279 | cloudkitty 280 | 281 | [cloudkitty-processor:children] 282 | cloudkitty 283 | 284 | # iSCSI 285 | [iscsid:children] 286 | compute 287 | storage 288 | ironic 289 | 290 | [tgtd:children] 291 | storage 292 | 293 | # Manila 294 | [manila-api:children] 295 | manila 296 | 297 | [manila-scheduler:children] 298 | manila 299 | 300 | [manila-share:children] 301 | network 302 | 303 | [manila-data:children] 304 | manila 305 | 306 | # Barbican 307 | [barbican-api:children] 308 | barbican 309 | 310 | [barbican-keystone-listener:children] 311 | barbican 312 | 313 | [barbican-worker:children] 314 | barbican 315 | 316 | # Trove 317 | [trove-api:children] 318 | trove 319 | 320 | [trove-conductor:children] 321 | trove 322 | 323 | [trove-taskmanager:children] 324 | trove 325 | 326 | # Heat 327 | [heat-api:children] 328 | heat 329 | 330 | [heat-api-cfn:children] 331 | heat 332 | 333 | [heat-engine:children] 334 | heat 335 | 336 | # Ironic 337 | [ironic-api:children] 338 | ironic 339 | 340 | [ironic-conductor:children] 341 | ironic 342 | 343 | [ironic-inspector:children] 344 | ironic 345 | 346 | [ironic-tftp:children] 347 | ironic 348 | 349 | [ironic-http:children] 350 | ironic 351 | 352 | # Magnum 353 | [magnum-api:children] 354 | magnum 355 | 356 | [magnum-conductor:children] 357 | magnum 358 | 359 | # Mistral 360 | [mistral-api:children] 361 | mistral 362 | 363 | [mistral-executor:children] 364 | mistral 365 | 366 | [mistral-engine:children] 367 | mistral 368 | 369 | [mistral-event-engine:children] 370 | mistral 371 | 372 | # Aodh 373 | [aodh-api:children] 374 | aodh 375 | 376 | [aodh-evaluator:children] 377 | aodh 378 | 379 | [aodh-listener:children] 380 | aodh 381 | 382 | [aodh-notifier:children] 383 | aodh 384 | 385 | # Cyborg 386 | [cyborg-api:children] 387 | cyborg 388 | 389 | [cyborg-agent:children] 390 | compute 391 | 392 | [cyborg-conductor:children] 393 | cyborg 394 | 395 | # Gnocchi 396 | [gnocchi-api:children] 397 | gnocchi 398 | 399 | [gnocchi-statsd:children] 400 | gnocchi 401 | 402 | [gnocchi-metricd:children] 403 | gnocchi 404 | 405 | # Ceilometer 406 | [ceilometer-central:children] 407 | ceilometer 408 | 409 | [ceilometer-notification:children] 410 | ceilometer 411 | 412 | [ceilometer-compute:children] 413 | compute 414 | 415 | [ceilometer-ipmi:children] 416 | compute 417 | 418 | # Multipathd 419 | [multipathd:children] 420 | compute 421 | storage 422 | 423 | # Watcher 424 | [watcher-api:children] 425 | watcher 426 | 427 | [watcher-engine:children] 428 | watcher 429 | 430 | [watcher-applier:children] 431 | watcher 432 | 433 | # Octavia 434 | [octavia-api:children] 435 | octavia 436 | 437 | [octavia-driver-agent:children] 438 | octavia 439 | 440 | [octavia-health-manager:children] 441 | octavia 442 | 443 | [octavia-housekeeping:children] 444 | octavia 445 | 446 | [octavia-worker:children] 447 | octavia 448 | 449 | # Designate 450 | [designate-api:children] 451 | designate 452 | 453 | [designate-central:children] 454 | designate 455 | 456 | [designate-producer:children] 457 | designate 458 | 459 | [designate-mdns:children] 460 | network 461 | 462 | [designate-worker:children] 463 | designate 464 | 465 | [designate-sink:children] 466 | designate 467 | 468 | [designate-backend-bind9:children] 469 | designate 470 | 471 | # Placement 472 | [placement-api:children] 473 | placement 474 | 475 | # Zun 476 | [zun-api:children] 477 | zun 478 | 479 | [zun-wsproxy:children] 480 | zun 481 | 482 | [zun-compute:children] 483 | compute 484 | 485 | [zun-cni-daemon:children] 486 | compute 487 | 488 | # Skyline 489 | [skyline-apiserver:children] 490 | skyline 491 | 492 | [skyline-console:children] 493 | skyline 494 | 495 | # Tacker 496 | [tacker-server:children] 497 | tacker 498 | 499 | [tacker-conductor:children] 500 | tacker 501 | 502 | # Blazar 503 | [blazar-api:children] 504 | blazar 505 | 506 | [blazar-manager:children] 507 | blazar 508 | 509 | # Prometheus 510 | [prometheus-node-exporter:children] 511 | monitoring 512 | control 513 | compute 514 | network 515 | storage 516 | 517 | [prometheus-mysqld-exporter:children] 518 | mariadb 519 | 520 | [prometheus-memcached-exporter:children] 521 | memcached 522 | 523 | [prometheus-cadvisor:children] 524 | monitoring 525 | control 526 | compute 527 | network 528 | storage 529 | 530 | [prometheus-alertmanager:children] 531 | monitoring 532 | 533 | [prometheus-openstack-exporter:children] 534 | monitoring 535 | 536 | [prometheus-elasticsearch-exporter:children] 537 | opensearch 538 | 539 | [prometheus-blackbox-exporter:children] 540 | monitoring 541 | 542 | [prometheus-libvirt-exporter:children] 543 | compute 544 | 545 | [masakari-api:children] 546 | control 547 | 548 | [masakari-engine:children] 549 | control 550 | 551 | [masakari-hostmonitor:children] 552 | control 553 | 554 | [masakari-instancemonitor:children] 555 | compute 556 | 557 | [ovn-controller:children] 558 | ovn-controller-compute 559 | ovn-controller-network 560 | 561 | [ovn-controller-compute:children] 562 | compute 563 | 564 | [ovn-controller-network:children] 565 | network 566 | 567 | [ovn-database:children] 568 | control 569 | 570 | [ovn-northd:children] 571 | ovn-database 572 | 573 | [ovn-nb-db:children] 574 | ovn-database 575 | 576 | [ovn-sb-db:children] 577 | ovn-database 578 | 579 | [ovn-sb-db-relay:children] 580 | ovn-database 581 | 582 | [venus-api:children] 583 | venus 584 | 585 | [venus-manager:children] 586 | venus 587 | 588 | [letsencrypt-webserver:children] 589 | letsencrypt 590 | 591 | [letsencrypt-lego:children] 592 | letsencrypt 593 | --------------------------------------------------------------------------------