test: add aio tests (#318)
* test: add aio tests
* ci: fix runs-on node
* ci: add tmate
* Tmate after converge
* Run destroy always
* Disable ipv6 in runner
* Fix permission for ipv6 disable
* disable ipv6 permanently
* Fix sysctl configuration
* Fix typo
* ci: test disable_ipv6
* ci: use focal node
* ci: add aio inside gha
* wip: aio
* ci: fix become for prepare
* ci: add ceph bootstrap
* ci: add ceph backend
* ci: fix ceph + use bigger node
* ci: fix ci for aio
* ci: increase number of cores
* Set virt_type as qemu
* Fix nic name in auto bridge add
* Disable auto bridge add in molecule aio
* ci: run full suite with eth1
* ci: fix molecule command
* ci: clean-up more values
* ci: use correct ip
* ci: use correct keepalived interface
* Fix glance_images
* fix ceph_mon_config_overrides keys and set mon_max_pg_per_osd as 500
* Enable fact gathering in tempest playbook
* Use other address for ceph_public_network and reduce image upload
- 10.0.0.0/22 is confused with cilium network. So mon ip is catched from cilium host nic in idempotence.
* fix(ceph-provisioners): stop depending on ceph-csi-rbd
* fix: allow for hci label adding
* fix: add ceph scenario
* ci: enable nested virt
* ci: final cleanup
---------
Co-authored-by: okozachenko1203 <okozachenko1203@users.noreply.github.com>
diff --git a/.github/workflows/ceph.yml b/.github/workflows/ceph.yml
new file mode 100644
index 0000000..fd03b14
--- /dev/null
+++ b/.github/workflows/ceph.yml
@@ -0,0 +1,50 @@
+# Copyright (c) 2023 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+name: ceph
+
+on:
+ pull_request:
+ push:
+ branches:
+ - main
+
+jobs:
+ test:
+ runs-on: ubuntu-20.04-16-cores
+ steps:
+ - name: Checkout project
+ uses: actions/checkout@v3
+
+ - name: Install Poetry
+ run: pipx install poetry
+
+ - name: Setup Python
+ uses: actions/setup-python@v4
+ with:
+ cache: poetry
+
+ - name: Install dependencies
+ run: poetry install --no-interaction --with dev
+
+ # NOTE(mnaser): LVM commands take a long time if there are any existing
+ # loop devices created by "snapd", so we uninstall it.
+ - name: Uninstall "snapd"
+ run: sudo apt-get purge -y snapd
+
+ - name: Turn off swap
+ run: sudo swapoff -a
+
+ - name: Run Molecule
+ run: poetry run molecule test -s ceph
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 86c96bc..6ddf3a4 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -37,50 +37,3 @@
PROJECT_REF=${{ env.PROJECT_REF }}
tags: |
quay.io/vexxhost/ethtool-exporter:${{ env.PROJECT_REF }}
-
- molecule:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout project
- uses: actions/checkout@v3
-
- - name: Install Poetry
- run: pipx install poetry
-
- - name: Setup Python
- uses: actions/setup-python@v4
- with:
- cache: poetry
-
- - name: Install dependencies
- run: poetry install --no-interaction --all-extras
-
- # TODO(mnaser): Move this out to "cleanup" stage
- - name: Set up Go
- uses: actions/setup-go@v4
- with:
- go-version-file: go.mod
- cache: true
- - name: Clean-up stale stacks
- run: go run ./cmd/atmosphere-ci molecule cleanup
- env:
- OS_AUTH_URL: https://auth.vexxhost.net/v3
- OS_REGION_NAME: ca-ymq-1
- OS_USER_DOMAIN_NAME: Default
- OS_USERNAME: ${{ secrets.OS_USERNAME }}
- OS_PASSWORD: ${{ secrets.OS_PASSWORD }}
- OS_PROJECT_DOMAIN_NAME: Default
- OS_PROJECT_NAME: ${{ secrets.OS_PROJECT_NAME }}
-
- - name: Run Molecule
- run: poetry run molecule test
- timeout-minutes: 120
- env:
- ATMOSPHERE_STACK_NAME: "atmosphere-${{ github.run_id }}-${{ github.run_attempt }}"
- OS_AUTH_URL: https://auth.vexxhost.net/v3
- OS_REGION_NAME: ca-ymq-1
- OS_USER_DOMAIN_NAME: Default
- OS_USERNAME: ${{ secrets.OS_USERNAME }}
- OS_PASSWORD: ${{ secrets.OS_PASSWORD }}
- OS_PROJECT_DOMAIN_NAME: Default
- OS_PROJECT_NAME: ${{ secrets.OS_PROJECT_NAME }}
diff --git a/molecule/ceph/cleanup.yml b/molecule/ceph/cleanup.yml
new file mode 100644
index 0000000..f9359ab
--- /dev/null
+++ b/molecule/ceph/cleanup.yml
@@ -0,0 +1,39 @@
+# Copyright (c) 2023 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- ansible.builtin.import_playbook: vexxhost.ceph.destroy_fake_devices
+
+- hosts: localhost
+ connection: local
+ gather_facts: false
+ no_log: "{{ molecule_no_log }}"
+ vars:
+ workspace_path: "{{ lookup('env', 'MOLECULE_SCENARIO_DIRECTORY') }}"
+ tasks:
+ - name: Capture var files to delete
+ find:
+ paths:
+ - "{{ workspace_path }}/group_vars"
+ - "{{ workspace_path }}/host_vars"
+ file_type: file
+ recurse: true
+ excludes:
+ - "molecule.yml"
+ register: _var_files
+
+ - name: Delete var files
+ file:
+ path: "{{ item.path }}"
+ state: absent
+ with_items: "{{ _var_files['files'] }}"
diff --git a/molecule/ceph/converge.yml b/molecule/ceph/converge.yml
new file mode 100644
index 0000000..fc75f20
--- /dev/null
+++ b/molecule/ceph/converge.yml
@@ -0,0 +1,65 @@
+# Copyright (c) 2023 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- ansible.builtin.import_playbook: vexxhost.ceph.site
+- ansible.builtin.import_playbook: vexxhost.atmosphere.kubernetes
+
+# NOTE(mnaser): When using Docker with custom networks, it will use 127.0.0.11
+# as the DNS server which trips up the CoreDNS "loop" plugin.
+- name: Switch CoreDNS to use CloudFlare DNS
+ hosts: controllers[0]
+ become: true
+ tasks:
+ - name: Update CoreDNS ConfigMap
+ kubernetes.core.k8s:
+ state: present
+ definition:
+ apiVersion: v1
+ kind: ConfigMap
+ metadata:
+ name: coredns
+ namespace: kube-system
+ data:
+ Corefile: |
+ .:53 {
+ errors
+ health {
+ lameduck 5s
+ }
+ ready
+ kubernetes cluster.local in-addr.arpa ip6.arpa {
+ pods insecure
+ fallthrough in-addr.arpa ip6.arpa
+ ttl 30
+ }
+ prometheus :9153
+ forward . 1.1.1.1 {
+ max_concurrent 1000
+ }
+ cache 30
+ loop
+ reload
+ loadbalance
+ }
+ notify:
+ - Rollout CoreDNS
+ - Wait for CoreDNS to be ready
+ handlers:
+ - name: Rollout CoreDNS
+ command: kubectl -n kube-system rollout restart deploy/coredns
+ - name: Wait for CoreDNS to be ready
+ command: kubectl -n kube-system rollout status deploy/coredns
+
+- ansible.builtin.import_playbook: vexxhost.atmosphere.csi
+- ansible.builtin.import_playbook: vexxhost.atmosphere.openstack
diff --git a/molecule/ceph/group_vars/.gitkeep b/molecule/ceph/group_vars/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/molecule/ceph/group_vars/.gitkeep
diff --git a/molecule/ceph/group_vars/all/molecule.yml b/molecule/ceph/group_vars/all/molecule.yml
new file mode 100644
index 0000000..8bed0fc
--- /dev/null
+++ b/molecule/ceph/group_vars/all/molecule.yml
@@ -0,0 +1,115 @@
+ceph_conf_overrides:
+ - section: global
+ option: osd crush chooseleaf type
+ value: 0
+ - section: mon
+ option: auth allow insecure global id reclaim
+ value: false
+
+kubernetes_keepalived_interface: eth0
+
+cilium_helm_values:
+ operator:
+ replicas: 1
+
+csi_driver: local-path-provisioner
+
+cluster_issuer_type: self-signed
+
+ingress_nginx_helm_values:
+ controller:
+ config:
+ worker-processes: 2
+
+percona_xtradb_cluster_spec:
+ allowUnsafeConfigurations: true
+ pxc:
+ size: 1
+ haproxy:
+ size: 1
+
+keystone_helm_values:
+ pod:
+ replicas:
+ api: 1
+
+barbican_helm_values:
+ pod:
+ replicas:
+ api: 1
+
+rook_ceph_cluster_radosgw_spec:
+ metadataPool:
+ failureDomain: osd
+ dataPool:
+ failureDomain: osd
+ gateway:
+ instances: 1
+
+glance_helm_values:
+ conf:
+ glance:
+ DEFAULT:
+ workers: 2
+ pod:
+ replicas:
+ api: 1
+glance_images:
+ - name: cirros
+ url: http://download.cirros-cloud.net/0.6.1/cirros-0.6.1-x86_64-disk.img
+ min_disk: 1
+ disk_format: raw
+ container_format: bare
+ is_public: true
+
+cinder_helm_values:
+ pod:
+ replicas:
+ api: 1
+ scheduler: 1
+
+placement_helm_values:
+ pod:
+ replicas:
+ api: 1
+
+coredns_helm_values:
+ replicaCount: 1
+
+nova_helm_values:
+ conf:
+ nova:
+ DEFAULT:
+ osapi_compute_workers: 2
+ metadata_workers: 2
+ conductor:
+ workers: 2
+ scheduler:
+ workers: 2
+ pod:
+ replicas:
+ api_metadata: 1
+ osapi: 1
+ conductor: 1
+ scheduler: 1
+ novncproxy: 1
+ spiceproxy: 1
+
+neutron_helm_values:
+ conf:
+ auto_bridge_add:
+ br-ex: eth1
+ neutron:
+ DEFAULT:
+ api_workers: 2
+ rpc_workers: 2
+ metadata_workers: 2
+ pod:
+ replicas:
+ server: 1
+
+tempest_helm_values:
+ conf:
+ tempest:
+ service_available:
+ horizon: false
diff --git a/molecule/ceph/host_vars/.gitkeep b/molecule/ceph/host_vars/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/molecule/ceph/host_vars/.gitkeep
diff --git a/molecule/ceph/molecule.yml b/molecule/ceph/molecule.yml
new file mode 100644
index 0000000..2cd63c6
--- /dev/null
+++ b/molecule/ceph/molecule.yml
@@ -0,0 +1,84 @@
+# Copyright (c) 2023 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+dependency:
+ name: galaxy
+driver:
+ name: docker
+platforms:
+ - name: instance
+ image: geerlingguy/docker-${MOLECULE_DISTRO:-ubuntu2004}-ansible:latest
+ command: ${MOLECULE_DOCKER_COMMAND:-""}
+ privileged: true
+ cgroupns_mode: host
+ pre_build_image: true
+ purge_networks: true
+ dns_servers:
+ - 1.1.1.1
+ docker_networks:
+ - name: mgmt
+ ipam_config:
+ - subnet: 10.96.240.0/24
+ gateway: 10.96.240.1
+ - name: public
+ ipam_config:
+ - subnet: 10.96.250.0/24
+ gateway: 10.96.250.1
+ networks:
+ - name: mgmt
+ - name: public
+ security_opts:
+ - apparmor=unconfined
+ volumes:
+ - /dev:/dev
+ - /lib/modules:/lib/modules:ro
+ - /sys/fs/cgroup:/sys/fs/cgroup:rw
+ - /usr/src:/usr/src:ro
+ groups:
+ - controllers
+ - cephs
+ - computes
+provisioner:
+ name: ansible
+ config_options:
+ connection:
+ pipelining: true
+ tags:
+ skip: >-
+ sysctl,
+ ethtool,
+ node-feature-discovery,
+ kube-prometheus-stack,
+ loki,
+ vector,
+ prometheus-ethtool-exporter,
+ ipmi-exporter,
+ prometheus-pushgateway,
+ lpfc,
+ senlin,
+ designate,
+ heat,
+ octavia,
+ magnum,
+ manila,
+ horizon,
+ openstack-exporter
+ options:
+ inventory: "${MOLECULE_EPHEMERAL_DIRECTORY}/workspace"
+ inventory:
+ links:
+ host_vars: "${MOLECULE_SCENARIO_DIRECTORY}/host_vars"
+ group_vars: "${MOLECULE_SCENARIO_DIRECTORY}/group_vars"
+verifier:
+ name: ansible
diff --git a/molecule/ceph/prepare.yml b/molecule/ceph/prepare.yml
new file mode 100644
index 0000000..f3337d9
--- /dev/null
+++ b/molecule/ceph/prepare.yml
@@ -0,0 +1,75 @@
+# Copyright (c) 2023 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- import_playbook: vexxhost.atmosphere.generate_workspace
+ vars:
+ workspace_path: "{{ lookup('env', 'MOLECULE_SCENARIO_DIRECTORY') }}"
+ domain_name: "{{ '{{' }} ansible_default_ipv4['address'].replace('.', '-') {{ '}}' }}.{{ lookup('env', 'ATMOSPHERE_DNS_SUFFIX_NAME') | default('nip.io', True) }}"
+
+- name: Prepare
+ hosts: all
+ become: true
+ pre_tasks:
+ - name: Wait for systemd to complete initialization
+ ansible.builtin.command: systemctl is-system-running
+ register: systemctl_status
+ until: >
+ 'running' in systemctl_status.stdout or
+ 'degraded' in systemctl_status.stdout
+ retries: 30
+ delay: 5
+ changed_when: false
+ failed_when: systemctl_status.rc > 1
+ tasks:
+ - name: Refresh cache & install "iptables"
+ ansible.builtin.package:
+ name: iptables
+ update_cache: true
+
+ # NOTE(mnaser): The base image installs Ansible using `pip` which breaks
+ # the system Python, we uninstall all Python packages.
+ - name: Fix Python installation
+ block:
+ - name: Get all Python packages
+ ansible.builtin.command: pip freeze
+ register: pip_freeze
+
+ - name: Uninstall all Python packages
+ ansible.builtin.pip:
+ name: "{{ pip_freeze.stdout_lines }}"
+ state: absent
+
+- ansible.builtin.import_playbook: vexxhost.ceph.create_fake_devices
+
+- hosts: controllers
+ become: true
+ tasks:
+ - name: Overwrite existing osds.yml file
+ delegate_to: localhost
+ ansible.builtin.copy:
+ dest: "{{ lookup('env', 'MOLECULE_SCENARIO_DIRECTORY') }}/group_vars/cephs/osds.yml"
+ content: |
+ ceph_osd_devices:
+ - "/dev/ceph-{{ inventory_hostname_short }}-osd0/data"
+ - "/dev/ceph-{{ inventory_hostname_short }}-osd1/data"
+ - "/dev/ceph-{{ inventory_hostname_short }}-osd2/data"
+
+ - name: Set masquerade rule
+ become: yes
+ ansible.builtin.iptables:
+ table: nat
+ chain: POSTROUTING
+ source: 10.96.250.0/24
+ out_interface: "{{ ansible_default_ipv4.interface }}"
+ jump: MASQUERADE
diff --git a/molecule/ceph/verify.yml b/molecule/ceph/verify.yml
new file mode 100644
index 0000000..b88e217
--- /dev/null
+++ b/molecule/ceph/verify.yml
@@ -0,0 +1,15 @@
+# Copyright (c) 2023 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- import_playbook: vexxhost.atmosphere.tempest
diff --git a/molecule/default/group_vars/all/molecule.yml b/molecule/default/group_vars/all/molecule.yml
index db8ff71..65ad6dd 100644
--- a/molecule/default/group_vars/all/molecule.yml
+++ b/molecule/default/group_vars/all/molecule.yml
@@ -1,5 +1,7 @@
cluster_issuer_type: self-signed
+kubernetes_keepalived_interface: ens3
+
glance_images:
- name: cirros
url: http://download.cirros-cloud.net/0.6.1/cirros-0.6.1-x86_64-disk.img
diff --git a/playbooks/generate_workspace.yml b/playbooks/generate_workspace.yml
index 59afcf2..3281a38 100644
--- a/playbooks/generate_workspace.yml
+++ b/playbooks/generate_workspace.yml
@@ -126,7 +126,6 @@
with_dict:
kubernetes_hostname: 10.96.240.10
kubernetes_keepalived_vrid: 42
- kubernetes_keepalived_interface: ens3
kubernetes_keepalived_vip: 10.96.240.10
- name: Write new Kubernetes configuration file to disk
diff --git a/playbooks/tempest.yml b/playbooks/tempest.yml
index 3032564..e40e1ba 100644
--- a/playbooks/tempest.yml
+++ b/playbooks/tempest.yml
@@ -13,7 +13,6 @@
# under the License.
- hosts: controllers[0]
- gather_facts: false
become: true
roles:
- role: tempest
diff --git a/roles/ceph_provisioners/defaults/main.yml b/roles/ceph_provisioners/defaults/main.yml
index c9eceee..6c5366b 100644
--- a/roles/ceph_provisioners/defaults/main.yml
+++ b/roles/ceph_provisioners/defaults/main.yml
@@ -22,12 +22,6 @@
# Ansible inventory group containing Ceph monitors.
ceph_provisioners_ceph_mon_group: controllers
-# IP address list of Ceph monitors
-ceph_provisioners_ceph_monitors: "{{ _ceph_csi_rbd_helm_info.status['values']['csiConfig'][0]['monitors'] }}"
-
-# Filesystem ID for Ceph cluster
-ceph_provisioners_ceph_fsid: "{{ _ceph_csi_rbd_helm_info.status['values']['csiConfig'][0]['clusterID'] }}"
-
# Public network used by Ceph
ceph_provisioners_ceph_public_network: "{{ ceph_mon_public_network }}"
diff --git a/roles/ceph_provisioners/meta/main.yml b/roles/ceph_provisioners/meta/main.yml
index 0ffa00b..6e352ed 100644
--- a/roles/ceph_provisioners/meta/main.yml
+++ b/roles/ceph_provisioners/meta/main.yml
@@ -32,4 +32,3 @@
vars:
upload_helm_chart_src: "{{ ceph_provisioners_helm_chart_path }}"
upload_helm_chart_dest: "{{ ceph_provisioners_helm_chart_ref }}"
- - role: ceph_csi_rbd
diff --git a/roles/ceph_provisioners/tasks/main.yml b/roles/ceph_provisioners/tasks/main.yml
index 775ab28..e175a24 100644
--- a/roles/ceph_provisioners/tasks/main.yml
+++ b/roles/ceph_provisioners/tasks/main.yml
@@ -12,11 +12,23 @@
# License for the specific language governing permissions and limitations
# under the License.
-- name: Retrieve Helm values for "ceph-csi-rbd"
- kubernetes.core.helm_info:
- name: ceph-csi-rbd
- release_namespace: kube-system
- register: _ceph_csi_rbd_helm_info
+- name: Collect "ceph mon dump" output from a monitor
+ delegate_to: "{{ groups[ceph_provisioners_ceph_mon_group][0] }}"
+ run_once: true
+ ansible.builtin.command: ceph mon dump -f json
+ changed_when: false
+ register: _ceph_mon_dump
+
+- name: Generate fact with list of Ceph monitors
+ run_once: true
+ ansible.builtin.set_fact:
+ _ceph_provisioners_ceph_fsid: "{{ _ceph_mon_dump.stdout | from_json | community.general.json_query('fsid') }}"
+ _ceph_provisioners_ceph_monitors: |
+ {{
+ _ceph_provisioners_ceph_monitors | default([]) +
+ [{'ip': item}]
+ }}
+ loop: "{{ _ceph_mon_dump.stdout | from_json | community.general.json_query('mons[*].addr') | map('regex_replace', '(.*):(.*)', '\\1') }}"
- name: Create Ceph service
kubernetes.core.k8s:
@@ -42,15 +54,6 @@
port: 9283
targetPort: 9283
-- name: Generate Ceph endpoint list
- ansible.builtin.set_fact:
- _ceph_provisioners_ceph_monitors: |
- {{
- _ceph_provisioners_ceph_monitors | default([]) +
- [{'ip': item}]
- }}
- loop: "{{ ceph_provisioners_ceph_monitors }}"
-
- name: Create Ceph endpoints
kubernetes.core.k8s:
state: present
diff --git a/roles/ceph_provisioners/vars/main.yml b/roles/ceph_provisioners/vars/main.yml
index 193207b..12fa0a6 100644
--- a/roles/ceph_provisioners/vars/main.yml
+++ b/roles/ceph_provisioners/vars/main.yml
@@ -19,7 +19,7 @@
conf:
ceph:
global:
- fsid: "{{ ceph_provisioners_ceph_fsid }}"
+ fsid: "{{ _ceph_provisioners_ceph_fsid }}"
manifests:
configmap_bin: false
configmap_bin_common: false
diff --git a/roles/kubernetes_node_labels/defaults/main.yml b/roles/kubernetes_node_labels/defaults/main.yml
index 256c2e4..0893806 100644
--- a/roles/kubernetes_node_labels/defaults/main.yml
+++ b/roles/kubernetes_node_labels/defaults/main.yml
@@ -19,7 +19,8 @@
{% if inventory_hostname in groups['controllers'] %}
{% set _ = res.update({'openstack-control-plane': 'enabled'}) %}
{% set _ = res.update({'openvswitch': 'enabled'}) %}
- {% elif inventory_hostname in groups['computes'] %}
+ {% endif %}
+ {% if inventory_hostname in groups['computes'] %}
{% set _ = res.update({'openstack-compute-node': 'enabled'}) %}
{% set _ = res.update({'openvswitch': 'enabled'}) %}
{% endif %}
diff --git a/roles/reboot/README.md b/roles/reboot/README.md
index 735fd9e..876bf02 100644
--- a/roles/reboot/README.md
+++ b/roles/reboot/README.md
@@ -4,4 +4,3 @@
server is safe to reboot. If the checks pass, a silence will be created to
prevent alarms from firing during the reboot. Once that's done, the reboot
will start and the silence will be removed once the server is back online.
-