Update upload-image-swift

This updates upload-image-swift with some changes that have merged
to the originating role in opendev/zuul-providers.  Hopefully with
this change, we can move opendev to use this role.

This anticipates https://review.opendev.org/956219 by adding a default
value of zuul.image_build_name.  That change is not set as a dependency
because it's not strictly necessary and it's harmless if it merges out
of order (or not at all).

Change-Id: Ib26ae8e54174650a2d082ef2504ef70f4804dbc4
This commit is contained in:
James E. Blair
2025-08-01 07:35:45 -07:00
parent 06098ab552
commit a881f3192a
4 changed files with 50 additions and 7 deletions

View File

@@ -4,6 +4,10 @@ This uploads a filesystem image (for example, one built by diskimage
builder) to an OpenStack Object Store (Swift) container. The role
returns an artifact to Zuul suitable for use by the zuul-launcher.
If a `raw` or `vhd` image is provided and the `zstd` command is
available, it will be compressed in the way that zuul-launcher
expects.
**Role Variables**
.. zuul:rolevar:: upload_image_swift_cloud_config
@@ -33,7 +37,7 @@ returns an artifact to Zuul suitable for use by the zuul-launcher.
any objects in the bucket older than this time.
.. zuul:rolevar:: upload_image_swift_image_name
:default: `{{ build_diskimage_image_name }}`
:default: `{{ build_diskimage_image_name | default(zuul.image_build_name) }}`
The Zuul image name for use by zuul-launcher (e.g., `debian-bookworm`).

View File

@@ -1,4 +1,4 @@
upload_image_swift_image_name: '{{ build_diskimage_image_name }}'
upload_image_swift_image_name: '{{ build_diskimage_image_name | default(zuul.image_build_name) }}'
upload_image_swift_delete_after: 0
upload_image_swift_filename: '{{ build_diskimage_image_root }}/{{ build_diskimage_image_name }}.{{ upload_image_swift_extension }}'
upload_image_swift_name: '{{ zuul.build }}-{{ build_diskimage_image_name }}.{{ upload_image_swift_extension }}'

View File

@@ -23,6 +23,7 @@ import sys
import traceback
import openstack
import requests.adapters
import requests.exceptions
import keystoneauth1.exceptions
@@ -34,13 +35,25 @@ SEGMENT_SIZE = 500000000 # 500MB
def get_cloud(cloud):
if isinstance(cloud, dict):
config = openstack.config.loader.OpenStackConfig().get_one(**cloud)
return openstack.connection.Connection(
conn = openstack.connection.Connection(
config=config,
pool_executor=concurrent.futures.ThreadPoolExecutor(
max_workers=10
))
else:
return openstack.connect(cloud=cloud)
conn = openstack.connect(cloud=cloud)
# This backoff configuration should produce this sequence of delays:
# 0 1 2 4 8 16 32 60 60...
retries = requests.adapters.Retry(
total=15,
backoff_factor=1,
backoff_max=60,
)
conn.session.mount(
'http://', requests.adapters.HTTPAdapter(max_retries=retries))
conn.session.mount(
'https://', requests.adapters.HTTPAdapter(max_retries=retries))
return conn
def _add_etag_to_manifest(self, *args, **kw):

View File

@@ -1,4 +1,4 @@
# Run the checksums in the background while we're uploading
# Run the checksums in the background while we're working
- name: Get sha256 hash
stat:
path: '{{ upload_image_swift_filename }}'
@@ -15,15 +15,41 @@
poll: 0
register: md5_task
- name: Check if zstd is installed
shell: "command -v zstd || exit 1"
register: zstd_installed
failed_when: false
- name: Compress image
when:
- "zstd_installed.rc == 0"
- "upload_image_swift_format in ['raw', 'vhd']"
command: zstd '{{ upload_image_swift_filename }}'
- name: Set extension
set_fact:
zj_upload_image_swift_extension: ''
- name: Set extension
when:
- "zstd_installed.rc == 0"
- "upload_image_swift_format in ['raw', 'vhd']"
set_fact:
zj_upload_image_swift_extension: '.zst'
- name: Upload image to swift
upload_image_swift:
cloud: '{{ upload_image_swift_cloud_config }}'
container: '{{ upload_image_swift_container }}'
filename: '{{ upload_image_swift_filename }}'
name: '{{ upload_image_swift_name }}'
filename: '{{ upload_image_swift_filename }}{{ zj_upload_image_swift_extension }}'
name: '{{ upload_image_swift_name }}{{ zj_upload_image_swift_extension }}'
delete_after: '{{ upload_image_swift_delete_after }}'
register: upload_results
- name: Delete uncompressed image
when: "upload_image_swift_format in ['raw', 'vhd']"
command: rm '{{ upload_image_swift_filename }}'
- name: Wait for sha256
async_status:
jid: "{{ sha256_task.ansible_job_id }}"