diff --git a/.github/workflows/overcloud-host-image-build.yml b/.github/workflows/overcloud-host-image-build.yml index 145cc3170f..0048e3e153 100644 --- a/.github/workflows/overcloud-host-image-build.yml +++ b/.github/workflows/overcloud-host-image-build.yml @@ -18,6 +18,13 @@ on: options: - SMS Lab - Leafcloud + cpu-platform-architecture: + description: Select the image's build architecture + type: choice + default: x86_64 + options: + - x86_64 + - aarch64 secrets: KAYOBE_VAULT_PASSWORD: required: true @@ -32,6 +39,9 @@ env: ANSIBLE_FORCE_COLOR: True KAYOBE_ENVIRONMENT: ci-builder KAYOBE_VAULT_PASSWORD: ${{ secrets.KAYOBE_VAULT_PASSWORD }} + overcloud_dib_architecture: ${{ inputs.cpu-platform-architecture == 'x86_64' && 'amd64' || 'arm64' }} + stackhpc_cpu_arch_override: ${{ inputs.cpu-platform-architecture == 'aarch64' && 'arm64' || 'x86_64' }} + pulp_artifact_type: ${{ inputs.cpu-platform-architecture == 'x86_64' && 'kayobe-images' || 'kayobe-images/aarch64' }} jobs: runner-selection: uses: ./.github/workflows/runner-selector.yml @@ -212,7 +222,7 @@ jobs: source venvs/kayobe/bin/activate && source src/kayobe-config/kayobe-env --environment ci-builder && kayobe seed host command run \ - --command "sudo apt update && sudo apt -y install gcc git libffi-dev python3-dev python-is-python3 python3-venv containerd docker.io docker-buildx" --show-output + --command "sudo apt update && sudo apt -y install gcc git libffi-dev python3-dev python-is-python3 python3-venv containerd docker.io docker-buildx qemu-user-static" --show-output env: KAYOBE_VAULT_PASSWORD: ${{ secrets.KAYOBE_VAULT_PASSWORD }} @@ -233,7 +243,8 @@ jobs: kayobe overcloud host image build --force-rebuild \ -e os_distribution="rocky" \ -e os_release="9" \ - -e stackhpc_overcloud_dib_name=overcloud-rocky-9 + -e stackhpc_overcloud_dib_name=overcloud-rocky-9 \ + -e overcloud_dib_architecture=${{ inputs.cpu-platform-architecture == 'x86_64' && 'amd64' || 'aarch64' }} env: KAYOBE_VAULT_PASSWORD: ${{ secrets.KAYOBE_VAULT_PASSWORD }} if: inputs.rocky9 @@ -256,7 +267,7 @@ jobs: src/kayobe-config/etc/kayobe/ansible/pulp-artifact-upload.yml \ -e artifact_path=/opt/kayobe/images/overcloud-rocky-9 \ -e artifact_tag=${{ steps.host_image_tag.outputs.host_image_tag }} \ - -e artifact_type="kayobe-images" \ + -e artifact_type=${{ env.pulp_artifact_type }} \ -e file_regex="*.qcow2" \ -e os_distribution="rocky" \ -e os_release="9" @@ -271,7 +282,8 @@ jobs: kayobe playbook run \ src/kayobe-config/etc/kayobe/ansible/openstack-host-image-upload.yml \ -e local_image_path="/opt/kayobe/images/overcloud-rocky-9/overcloud-rocky-9.qcow2" \ - -e image_name=overcloud-rocky-9-${{ steps.host_image_tag.outputs.host_image_tag }} + -e image_name=overcloud-rocky-9-${{ steps.host_image_tag.outputs.host_image_tag }} \ + -e cpu_platform=${{ env.overcloud_dib_architecture }} env: CLOUDS_YAML: ${{ secrets.CLOUDS_YAML }} OS_APPLICATION_CREDENTIAL_ID: ${{ secrets.OS_APPLICATION_CREDENTIAL_ID }} @@ -285,7 +297,8 @@ jobs: kayobe playbook run \ src/kayobe-config/etc/kayobe/ansible/openstack-host-image-upload.yml \ -e local_image_path="/opt/kayobe/images/overcloud-rocky-9/overcloud-rocky-9.qcow2" \ - -e image_name=overcloud-rocky-9-${{ steps.host_image_tag.outputs.host_image_tag }} + -e image_name=overcloud-rocky-9-${{ steps.host_image_tag.outputs.host_image_tag }} \ + -e cpu_platform=${{ env.overcloud_dib_architecture }} env: CLOUDS_YAML: ${{ secrets.CLOUDS_YAML_OTHER_CLOUD }} OS_APPLICATION_CREDENTIAL_ID: ${{ secrets.OS_APPLICATION_CREDENTIAL_ID_OTHER_CLOUD }} @@ -301,7 +314,8 @@ jobs: kayobe overcloud host image build --force-rebuild \ -e os_distribution="ubuntu" \ -e os_release="noble" \ - -e stackhpc_overcloud_dib_name=overcloud-ubuntu-noble + -e stackhpc_overcloud_dib_name=overcloud-ubuntu-noble \ + -e overcloud_dib_architecture=${{ inputs.cpu-platform-architecture == 'x86_64' && 'amd64' || 'aarch64' }} env: KAYOBE_VAULT_PASSWORD: ${{ secrets.KAYOBE_VAULT_PASSWORD }} if: inputs.ubuntu-noble @@ -324,7 +338,7 @@ jobs: src/kayobe-config/etc/kayobe/ansible/pulp-artifact-upload.yml \ -e artifact_path=/opt/kayobe/images/overcloud-ubuntu-noble \ -e artifact_tag=${{ steps.host_image_tag.outputs.host_image_tag }} \ - -e artifact_type="kayobe-images" \ + -e artifact_type=${{ env.pulp_artifact_type }} \ -e file_regex="*.qcow2" \ -e os_distribution="ubuntu" \ -e os_release="noble" @@ -339,7 +353,8 @@ jobs: kayobe playbook run \ src/kayobe-config/etc/kayobe/ansible/openstack-host-image-upload.yml \ -e local_image_path="/opt/kayobe/images/overcloud-ubuntu-noble/overcloud-ubuntu-noble.qcow2" \ - -e image_name=overcloud-ubuntu-noble-${{ steps.host_image_tag.outputs.host_image_tag }} + -e image_name=overcloud-ubuntu-noble-${{ steps.host_image_tag.outputs.host_image_tag }} \ + -e cpu_platform=${{ env.overcloud_dib_architecture }} env: CLOUDS_YAML: ${{ secrets.CLOUDS_YAML }} OS_APPLICATION_CREDENTIAL_ID: ${{ secrets.OS_APPLICATION_CREDENTIAL_ID }} @@ -353,7 +368,8 @@ jobs: kayobe playbook run \ src/kayobe-config/etc/kayobe/ansible/openstack-host-image-upload.yml \ -e local_image_path="/opt/kayobe/images/overcloud-ubuntu-noble/overcloud-ubuntu-noble.qcow2" \ - -e image_name=overcloud-ubuntu-noble-${{ steps.host_image_tag.outputs.host_image_tag }} + -e image_name=overcloud-ubuntu-noble-${{ steps.host_image_tag.outputs.host_image_tag }} \ + -e cpu_platform=${{ env.overcloud_dib_architecture }} env: CLOUDS_YAML: ${{ secrets.CLOUDS_YAML_OTHER_CLOUD }} OS_APPLICATION_CREDENTIAL_ID: ${{ secrets.OS_APPLICATION_CREDENTIAL_ID_OTHER_CLOUD }} diff --git a/.github/workflows/overcloud-host-image-promote.yml b/.github/workflows/overcloud-host-image-promote.yml index 960dbc0df8..3d0e1f473b 100644 --- a/.github/workflows/overcloud-host-image-promote.yml +++ b/.github/workflows/overcloud-host-image-promote.yml @@ -15,8 +15,17 @@ on: description: Tag to promote type: string required: true + cpu-platform-architecture: + description: What is the tagged image's architecture + type: choice + required: true + default: x86_64 + options: + - x86_64 + - aarch64 env: ANSIBLE_FORCE_COLOR: True + pulp_artifact_type: ${{ inputs.cpu-platform-architecture == 'x86_64' && 'kayobe-images' || 'kayobe-images/aarch64' }} jobs: overcloud-host-image-promote: name: Promote overcloud host image @@ -77,7 +86,7 @@ jobs: source src/kayobe-config/kayobe-env --environment ci-builder && kayobe playbook run \ src/kayobe-config/etc/kayobe/ansible/pulp-artifact-promote.yml \ - -e artifact_type="kayobe-images" \ + -e artifact_type=${{ env.pulp_artifact_type }} \ -e os_distribution='rocky' \ -e os_release='9' env: @@ -91,7 +100,7 @@ jobs: source src/kayobe-config/kayobe-env --environment ci-builder && kayobe playbook run \ src/kayobe-config/etc/kayobe/ansible/pulp-artifact-promote.yml \ - -e artifact_type="kayobe-images" \ + -e artifact_type=${{ env.pulp_artifact_type }} \ -e os_distribution='ubuntu' \ -e os_release='noble' env: diff --git a/etc/kayobe/ansible/openstack-host-image-upload.yml b/etc/kayobe/ansible/openstack-host-image-upload.yml index daff0549d1..32d1844ab1 100644 --- a/etc/kayobe/ansible/openstack-host-image-upload.yml +++ b/etc/kayobe/ansible/openstack-host-image-upload.yml @@ -6,7 +6,7 @@ hosts: seed vars: local_image_path: /opt/kayobe/images/overcloud-{{ os_distribution }}-{{ os_release }}/overcloud-{{ os_distribution }}-{{ os_release }}.qcow2 - image_name: overcloud-{{ os_distribution }}-{{ os_release }} + image_name: overcloud-{{ os_distribution }}-{{ os_release }}{{ '-arm64' if cpu_platform == 'arm64' else '' }} tasks: - name: Upload image to Glance block: @@ -42,6 +42,8 @@ disk_format: qcow2 state: present filename: "{{ local_image_path }}" + properties: + hw_architecture: "{{ 'aarch64' if cpu_platform == 'arm64' else 'x86_64' }}" always: - name: Remove clouds.yaml diff --git a/etc/kayobe/kolla.yml b/etc/kayobe/kolla.yml index 6892d9e999..795a4631b2 100644 --- a/etc/kayobe/kolla.yml +++ b/etc/kayobe/kolla.yml @@ -62,10 +62,16 @@ kolla_ansible_source_version: "{{ stackhpc_kolla_ansible_source_version }}" ############################################################################### # Kolla configuration. + # Kolla base container image architecture. Options are "x86_64", "aarch64". # Default is "{{ ansible_facts.architecture }}" # NOTE(bbezak): evaluating this var locally for non facts gathering playbooks -kolla_base_arch: "{{ 'aarch64' if lookup('pipe','uname -m') in ['aarch64','arm64'] else 'x86_64' }}" +kolla_base_arch: >- + {{ + 'aarch64' if (stackhpc_cpu_arch_override is defined and stackhpc_cpu_arch_override | length > 0 and stackhpc_cpu_arch_override == 'arm64') + else (stackhpc_cpu_arch_override if (stackhpc_cpu_arch_override is defined and stackhpc_cpu_arch_override | length > 0) + else ('aarch64' if lookup('pipe','uname -m') in ['aarch64','arm64'] else 'x86_64')) + }} # Kolla base container image distribution. Options are "centos", "debian", # "rocky", "ubuntu". Default is {{ os_distribution }}. diff --git a/etc/kayobe/overcloud-dib.yml b/etc/kayobe/overcloud-dib.yml index 625e86fa18..a492734a11 100644 --- a/etc/kayobe/overcloud-dib.yml +++ b/etc/kayobe/overcloud-dib.yml @@ -66,6 +66,9 @@ overcloud_dib_host_packages_extra: # elements. See stackhpc.openstack.os_images role for usage. Default is empty. overcloud_dib_git_elements_extra: "{{ stackhpc_dib_image_elements_repos }}" +# Selects the architecture of the overcloud host image being built. +overcloud_dib_architecture: "{{ 'amd64' if stackhpc_cpu_arch == 'x86_64' else 'arm64' }}" + # List of git repositories containing Diskimage Builder (DIB) elements. See # stackhpc.openstack.os_images role for usage. Default is a combination of # overcloud_dib_git_elements_default and overcloud_dib_git_elements_extra. diff --git a/etc/kayobe/stackhpc-overcloud-dib.yml b/etc/kayobe/stackhpc-overcloud-dib.yml index 89d6ac5984..1da20507c1 100644 --- a/etc/kayobe/stackhpc-overcloud-dib.yml +++ b/etc/kayobe/stackhpc-overcloud-dib.yml @@ -15,6 +15,7 @@ stackhpc_overcloud_dib_host_image: elements: "{{ stackhpc_overcloud_dib_elements }}" env: "{{ stackhpc_overcloud_dib_env_vars }}" packages: "{{ stackhpc_overcloud_dib_packages }}" + architecture: "{{ overcloud_dib_architecture }}" # StackHPC overcloud DIB image name. stackhpc_overcloud_dib_name: "deployment_image" @@ -55,6 +56,7 @@ stackhpc_overcloud_dib_env_vars_default: YUM: dnf # Workaround for stack user home ownership bug DIB_IMAGE_CACHE: "/tmp/yum" + DIB_CONTAINERFILE_BUILDOPTS: "--platform linux/{{ overcloud_dib_architecture }}" stackhpc_overcloud_dib_env_vars_ark: DIB_CONTAINERFILE_BUILDOPTS: >- @@ -63,25 +65,34 @@ stackhpc_overcloud_dib_env_vars_ark: DIB_DISTRIBUTION_MIRROR: "{{ stackhpc_repo_ubuntu_noble_url if os_distribution == 'ubuntu' else '' }}" # StackHPC overcloud DIB image packages. -stackhpc_overcloud_dib_packages: - - "ethtool" - - "git" - - "less" - - "logrotate" - - "net-tools" - - "nvme-cli" - - "pciutils" - - "python3" - - "smartmontools" - - "vim" - - "{% if os_distribution == 'ubuntu' %}netbase{% endif %}" - - "{% if os_distribution == 'ubuntu' %}iputils-ping{% endif %}" - - "{% if os_distribution == 'ubuntu' %}curl{% endif %}" - - "{% if os_distribution == 'ubuntu' %}apt-utils{% endif %}" - - "{% if os_distribution == 'rocky' %}NetworkManager-config-server{% endif %}" - - "{% if os_distribution == 'rocky' %}linux-firmware{% endif %}" - - "{% if os_distribution == 'rocky' %}cloud-utils-growpart{% endif %}" - - "{% if os_distribution == 'ubuntu' %}cloud-guest-utils{% endif %}" +stackhpc_overcloud_dib_packages_common: + - ethtool + - git + - less + - logrotate + - net-tools + - nvme-cli + - pciutils + - python3 + - smartmontools + - vim + +stackhpc_overcloud_dib_packages_ubuntu: + - netbase + - iputils-ping + - curl + - apt-utils + - cloud-guest-utils + +stackhpc_overcloud_dib_packages_rocky: + - NetworkManager-config-server + - linux-firmware + - cloud-utils-growpart + +stackhpc_overcloud_dib_packages: >- + {{ stackhpc_overcloud_dib_packages_common + + (stackhpc_overcloud_dib_packages_ubuntu if os_distribution == 'ubuntu' else []) + + (stackhpc_overcloud_dib_packages_rocky if os_distribution == 'rocky' else []) }} # StackHPC overcloud DIB image block device configuration. # This image layout conforms to the CIS partition benchmarks. diff --git a/etc/kayobe/stackhpc-overcloud-host-images.yml b/etc/kayobe/stackhpc-overcloud-host-images.yml index 59c3626b8e..3c995a0916 100644 --- a/etc/kayobe/stackhpc-overcloud-host-images.yml +++ b/etc/kayobe/stackhpc-overcloud-host-images.yml @@ -11,6 +11,7 @@ stackhpc_build_overcloud_image_from_pulp_package_mirrors: false # The overcloud host image source, defined by os_distribution, os_release, # and the current stable version. stackhpc_overcloud_host_image_url: "{{ stackhpc_release_pulp_content_url_with_auth }}/kayobe-images/\ + {{ 'aarch64/' if stackhpc_cpu_arch == 'arm64' else '' }}\ {{ openstack_release }}/{{ os_distribution }}/{{ os_release }}/\ {{ stackhpc_overcloud_host_image_version }}/\ overcloud-{{ os_distribution }}-{{ os_release }}.qcow2" diff --git a/etc/kayobe/stackhpc.yml b/etc/kayobe/stackhpc.yml index d34d6eb7a2..550c526a18 100644 --- a/etc/kayobe/stackhpc.yml +++ b/etc/kayobe/stackhpc.yml @@ -27,6 +27,15 @@ stackhpc_include_os_minor_version_in_repo_url: false stackhpc_rocky_9_url_version: "{{ '9.' + stackhpc_pulp_repo_rocky_9_minor_version | string if stackhpc_include_os_minor_version_in_repo_url | bool else '9' }}" +# Pick build architecture for kolla and disk image builder +# Choose between x86_64 or arm64. Leaving unset will default +# to the local architecture. +stackhpc_cpu_arch_override: "" + +# If the override variable hasnt been set above then both kolla_base_arch and +# stackhpc_cpu_arch will default to the local architecture. +stackhpc_cpu_arch: "{{ 'arm64' if kolla_base_arch == 'aarch64' else kolla_base_arch }}" + ############################################################################### # Debs # Ubuntu noble