From da66b4eb4138211c4ad8e24c04acc69b3cea1633 Mon Sep 17 00:00:00 2001 From: Simon Westphahl Date: Mon, 13 Oct 2025 11:12:42 +0200 Subject: [PATCH] Allow upload-image-s3 role to export S3 URLS In order to directly import images from S3 in AWS we need the s3:// instead of the default HTTP URL. Make this configurable via a config flag. Change-Id: I51279bf176a7e7a877d0939113cb8b55f3c46520 --- roles/upload-image-s3/README.rst | 5 +++++ roles/upload-image-s3/defaults/main.yaml | 1 + roles/upload-image-s3/library/upload_image_s3.py | 13 +++++++++++-- roles/upload-image-s3/tasks/main.yaml | 1 + 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/roles/upload-image-s3/README.rst b/roles/upload-image-s3/README.rst index ac8f37b02..7f7f92aef 100644 --- a/roles/upload-image-s3/README.rst +++ b/roles/upload-image-s3/README.rst @@ -82,3 +82,8 @@ zuul-launcher expects. :default: 600 The async timeout for md5/sha256 image hash tasks. + +.. zuul:rolevar:: upload_image_s3_export_s3_url + :default: false + + Export the image location as s3:// URL. diff --git a/roles/upload-image-s3/defaults/main.yaml b/roles/upload-image-s3/defaults/main.yaml index 1114624a3..802461614 100644 --- a/roles/upload-image-s3/defaults/main.yaml +++ b/roles/upload-image-s3/defaults/main.yaml @@ -5,3 +5,4 @@ upload_image_s3_name: '{{ zuul.build }}-{{ build_diskimage_image_name }}.{{ uplo upload_image_s3_extension: '{{ upload_image_s3_format }}' upload_image_s3_compress_image: true upload_image_s3_hash_timeout: 600 +upload_image_s3_export_s3_url: false diff --git a/roles/upload-image-s3/library/upload_image_s3.py b/roles/upload-image-s3/library/upload_image_s3.py index aa9feaf22..d9818db83 100644 --- a/roles/upload-image-s3/library/upload_image_s3.py +++ b/roles/upload-image-s3/library/upload_image_s3.py @@ -38,7 +38,7 @@ def prune(bucket, delete_after): def run(endpoint, bucket_name, aws_access_key, aws_secret_key, - filename, name, delete_after=None): + filename, name, delete_after=None, export_s3_url=False): endpoint = endpoint or 'https://s3.amazonaws.com/' s3 = boto3.resource('s3', endpoint_url=endpoint, @@ -50,7 +50,10 @@ def run(endpoint, bucket_name, aws_access_key, aws_secret_key, bucket.upload_file(filename, name) - url = os.path.join(endpoint, bucket_name, name) + if export_s3_url: + url = os.path.join("s3://", bucket_name, name) + else: + url = os.path.join(endpoint, bucket_name, name) return url @@ -62,6 +65,7 @@ def ansible_main(): filename=dict(required=True, type='path'), name=dict(required=True, type='str'), delete_after=dict(type='int'), + export_s3_url=dict(type='bool', default=False), aws_access_key=dict(type='str'), aws_secret_key=dict(type='str', no_log=True), ) @@ -78,6 +82,7 @@ def ansible_main(): p.get('filename'), p.get('name'), delete_after=p.get('delete_after'), + export_s3_url=p.get('export_s3_url'), ) except Exception: s = "Error uploading to S3" @@ -110,6 +115,9 @@ def cli_main(): 'upload. Default is 3 days (259200 seconds) ' 'and if set to 0 X-Delete-After will not be set', type=int) + parser.add_argument('--export-s3-url', + help='Export the image location as s3:// URL', + action='store_true') args = parser.parse_args() @@ -125,6 +133,7 @@ def cli_main(): args.filename, args.name, delete_after=args.delete_after, + export_s3_url=args.export_s3_url, ) print(url) diff --git a/roles/upload-image-s3/tasks/main.yaml b/roles/upload-image-s3/tasks/main.yaml index f8a5a0f4d..ea5708fc8 100644 --- a/roles/upload-image-s3/tasks/main.yaml +++ b/roles/upload-image-s3/tasks/main.yaml @@ -51,6 +51,7 @@ filename: '{{ upload_image_s3_filename }}{{ zj_upload_image_s3_extension }}' name: '{{ upload_image_s3_name }}{{ zj_upload_image_s3_extension }}' delete_after: '{{ upload_image_s3_delete_after }}' + export_s3_url: '{{ upload_image_s3_export_s3_url }}' register: upload_results - name: Delete uncompressed image