diff --git a/.github/workflows/overcloud-host-image-build-periodic.yml b/.github/workflows/overcloud-host-image-build-periodic.yml new file mode 100644 index 000000000..d766f43b0 --- /dev/null +++ b/.github/workflows/overcloud-host-image-build-periodic.yml @@ -0,0 +1,31 @@ +--- +name: Periodic overcloud host images build +on: + schedule: + # Runs every Monday at 3:30 AM ("30 3 * * 1"). + - cron: "30 3 * * 1" + +jobs: + x86-overcloud-host-image-build: + name: Build x86_64 overcloud host images + uses: ./.github/workflows/overcloud-host-image-build.yml + with: + runner_env: "SMS Lab" + cpu-platform-architecture: "x86_64" + rocky9: true + ubuntu-noble: true + ubuntu-jammy: true + secrets: inherit + if: github.repository == 'stackhpc/stackhpc-kayobe-config' + + aarch64-overcloud-host-image-build: + name: Build aarch64 overcloud host images + uses: ./.github/workflows/overcloud-host-image-build.yml + with: + runner_env: "SMS Lab" + cpu-platform-architecture: "aarch64" + rocky9: true + ubuntu-noble: true + ubuntu-jammy: true + secrets: inherit + if: github.repository == 'stackhpc/stackhpc-kayobe-config' diff --git a/.github/workflows/overcloud-host-image-build.yml b/.github/workflows/overcloud-host-image-build.yml index 54777bd6c..5c1b13d7c 100644 --- a/.github/workflows/overcloud-host-image-build.yml +++ b/.github/workflows/overcloud-host-image-build.yml @@ -1,6 +1,7 @@ --- name: Build overcloud host images on: + #THIS IS FOR THE MANUAL ACTION DISPATCH workflow_dispatch: inputs: rocky9: @@ -11,6 +12,10 @@ on: description: Build Ubuntu 24.04 Noble type: boolean default: true + ubuntu-jammy: + description: Build Ubuntu 22.04 Jammy + type: boolean + default: false runner_env: description: Which cloud to run on? type: choice @@ -18,11 +23,49 @@ 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 CLOUDS_YAML: required: true + CLOUDS_YAML_OTHER_CLOUD: + required: true + OS_APPLICATION_CREDENTIAL_ID: + required: true + OS_APPLICATION_CREDENTIAL_SECRET: + required: true + #THIS IS FOR THE PERIODIC WORKFLOW + workflow_call: + inputs: + rocky9: + type: boolean + default: true + ubuntu-noble: + type: boolean + default: true + ubuntu-jammy: + type: boolean + default: true + runner_env: + type: string + default: SMS Lab + cpu-platform-architecture: + type: string + required: true + secrets: + KAYOBE_VAULT_PASSWORD: + required: true + CLOUDS_YAML: + required: true + CLOUDS_YAML_OTHER_CLOUD: + required: true OS_APPLICATION_CREDENTIAL_ID: required: true OS_APPLICATION_CREDENTIAL_SECRET: @@ -32,6 +75,8 @@ 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' }} + pulp_artifact_path: ${{ inputs.cpu-platform-architecture == 'x86_64' && 'kayobe-images' || 'kayobe-images/aarch64' }} jobs: runner-selection: uses: ./.github/workflows/runner-selector.yml @@ -212,7 +257,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" --show-output + --command "sudo apt update && sudo apt -y install gcc git libffi-dev python3-dev python-is-python3 python3-venv qemu-user-static" --show-output env: KAYOBE_VAULT_PASSWORD: ${{ secrets.KAYOBE_VAULT_PASSWORD }} @@ -256,7 +301,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_path }} \ -e file_regex="*.qcow2" \ -e os_distribution="rocky" \ -e os_release="9" @@ -271,7 +316,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,13 +331,84 @@ 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 }} OS_APPLICATION_CREDENTIAL_SECRET: ${{ secrets.OS_APPLICATION_CREDENTIAL_SECRET_OTHER_CLOUD }} if: inputs.rocky9 && steps.build_rocky_9.outcome == 'success' + - name: Build an Ubuntu Jammy 22.04 overcloud host image + id: build_ubuntu_jammy + continue-on-error: true + run: | + source venvs/kayobe/bin/activate && + source src/kayobe-config/kayobe-env --environment ci-builder && + kayobe overcloud host image build --force-rebuild \ + -e os_distribution="ubuntu" \ + -e os_release="jammy" \ + -e stackhpc_overcloud_dib_name=overcloud-ubuntu-jammy + env: + KAYOBE_VAULT_PASSWORD: ${{ secrets.KAYOBE_VAULT_PASSWORD }} + if: inputs.ubuntu-jammy + + - name: Show last error logs + continue-on-error: true + run: | + source venvs/kayobe/bin/activate && + source src/kayobe-config/kayobe-env --environment ci-builder && + kayobe seed host command run --command "tail -200 /opt/kayobe/images/overcloud-ubuntu-jammy/overcloud-ubuntu-jammy.stdout" --show-output + env: + KAYOBE_VAULT_PASSWORD: ${{ secrets.KAYOBE_VAULT_PASSWORD }} + if: steps.build_ubuntu_jammy.outcome == 'failure' + + - name: Upload Ubuntu Jammy 22.04 overcloud host image to Ark + run: | + source venvs/kayobe/bin/activate && + source src/kayobe-config/kayobe-env --environment ci-builder && + kayobe playbook run \ + src/kayobe-config/etc/kayobe/ansible/pulp-artifact-upload.yml \ + -e artifact_path=/opt/kayobe/images/overcloud-ubuntu-jammy \ + -e artifact_tag=${{ steps.host_image_tag.outputs.host_image_tag }} \ + -e artifact_type=${{ env.pulp_artifact_path }} \ + -e file_regex="*.qcow2" \ + -e os_distribution="ubuntu" \ + -e os_release="jammy" + env: + KAYOBE_VAULT_PASSWORD: ${{ secrets.KAYOBE_VAULT_PASSWORD }} + if: inputs.ubuntu-jammy && steps.build_ubuntu_jammy.outcome == 'success' + + - name: Upload Ubuntu Jammy overcloud host image to current Dev Cloud (SMS/Leafcloud) + run: | + source venvs/kayobe/bin/activate && + source src/kayobe-config/kayobe-env --environment ci-builder && + kayobe playbook run \ + src/kayobe-config/etc/kayobe/ansible/openstack-host-image-upload.yml \ + -e local_image_path="/opt/kayobe/images/overcloud-ubuntu-jammy/overcloud-ubuntu-jammy.qcow2" \ + -e image_name=overcloud-ubuntu-jammy-${{ 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 }} + OS_APPLICATION_CREDENTIAL_SECRET: ${{ secrets.OS_APPLICATION_CREDENTIAL_SECRET }} + if: inputs.ubuntu-jammy && steps.build_ubuntu_jammy.outcome == 'success' + + - name: Upload Ubuntu Jammy overcloud host image to other Dev Cloud (Leafcloud/SMS) + run: | + source venvs/kayobe/bin/activate && + source src/kayobe-config/kayobe-env --environment ci-builder && + kayobe playbook run \ + src/kayobe-config/etc/kayobe/ansible/openstack-host-image-upload.yml \ + -e local_image_path="/opt/kayobe/images/overcloud-ubuntu-jammy/overcloud-ubuntu-jammy.qcow2" \ + -e image_name=overcloud-ubuntu-jammy-${{ 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 }} + OS_APPLICATION_CREDENTIAL_SECRET: ${{ secrets.OS_APPLICATION_CREDENTIAL_SECRET_OTHER_CLOUD }} + if: inputs.ubuntu-jammy && steps.build_ubuntu_jammy.outcome == 'success' + - name: Build an Ubuntu Noble 24.04 overcloud host image id: build_ubuntu_noble continue-on-error: true @@ -324,7 +441,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_path }} \ -e file_regex="*.qcow2" \ -e os_distribution="ubuntu" \ -e os_release="noble" @@ -339,7 +456,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 +471,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/etc/kayobe/ansible/openstack-host-image-upload.yml b/etc/kayobe/ansible/openstack-host-image-upload.yml index daff0549d..128780ec5 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 }}-{{ cpu-platform }} tasks: - name: Upload image to Glance block: diff --git a/etc/kayobe/kolla.yml b/etc/kayobe/kolla.yml index 6892d9e99..78ecd2e52 100644 --- a/etc/kayobe/kolla.yml +++ b/etc/kayobe/kolla.yml @@ -62,11 +62,6 @@ 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 container image distribution. Options are "centos", "debian", # "rocky", "ubuntu". Default is {{ os_distribution }}. #kolla_base_distro: @@ -443,6 +438,11 @@ kolla_build_customizations: "{{ kolla_build_customizations_common | combine(koll # Dict mapping Kolla Dockerfile ARG names to their values. kolla_build_args: {} +############################################################################### +# Kolla platform architecture configuration. + +kolla_base_arch: "{{ 'aarch64' if stackhpc_cpu_arch == 'arm64' else stackhpc_cpu_arch }}" + ############################################################################### # Kolla-ansible inventory configuration. diff --git a/etc/kayobe/overcloud-dib.yml b/etc/kayobe/overcloud-dib.yml index e824bdf5a..7c449837f 100644 --- a/etc/kayobe/overcloud-dib.yml +++ b/etc/kayobe/overcloud-dib.yml @@ -70,6 +70,9 @@ overcloud_dib_git_elements_extra: version: "v1.6.3" elements_path: "elements" +# 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 99f5ae836..800945c86 100644 --- a/etc/kayobe/stackhpc-overcloud-dib.yml +++ b/etc/kayobe/stackhpc-overcloud-dib.yml @@ -15,6 +15,9 @@ stackhpc_overcloud_dib_host_image: elements: "{{ stackhpc_overcloud_dib_elements }}" env: "{{ stackhpc_overcloud_dib_env_vars }}" packages: "{{ stackhpc_overcloud_dib_packages }}" + properties: + - cpu_arch: "{{ overcloud_dib_architecture }}" + # StackHPC overcloud DIB image name. stackhpc_overcloud_dib_name: "deployment_image" @@ -58,27 +61,37 @@ stackhpc_overcloud_dib_env_vars: 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 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 c009f8e8f..d85013216 100644 --- a/etc/kayobe/stackhpc-overcloud-host-images.yml +++ b/etc/kayobe/stackhpc-overcloud-host-images.yml @@ -8,6 +8,7 @@ stackhpc_download_overcloud_host_images: 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 4588d1e02..d41c98e8b 100644 --- a/etc/kayobe/stackhpc.yml +++ b/etc/kayobe/stackhpc.yml @@ -27,6 +27,10 @@ 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 +stackhpc_cpu_arch: 'x86_64' + ############################################################################### # Debs # Ubuntu noble