diff --git a/lib/ansible/modules/cloud/amazon/aws_s3.py b/lib/ansible/modules/cloud/amazon/aws_s3.py index 9e987547cc1..2eb8b18d2ba 100644 --- a/lib/ansible/modules/cloud/amazon/aws_s3.py +++ b/lib/ansible/modules/cloud/amazon/aws_s3.py @@ -353,7 +353,8 @@ def delete_bucket(module, s3, bucket): # if there are contents then we need to delete them before we can delete the bucket for keys in paginated_list(s3, Bucket=bucket): formatted_keys = [{'Key': key} for key in keys] - s3.delete_objects(Bucket=bucket, Delete={'Objects': formatted_keys}) + if formatted_keys: + s3.delete_objects(Bucket=bucket, Delete={'Objects': formatted_keys}) s3.delete_bucket(Bucket=bucket) return True except botocore.exceptions.ClientError as e: diff --git a/test/integration/targets/aws_s3/aliases b/test/integration/targets/aws_s3/aliases index 4ef4b2067d0..495c6e74ede 100644 --- a/test/integration/targets/aws_s3/aliases +++ b/test/integration/targets/aws_s3/aliases @@ -1 +1,2 @@ cloud/aws +posix/ci/cloud/aws diff --git a/test/integration/targets/aws_s3/defaults/main.yml b/test/integration/targets/aws_s3/defaults/main.yml index 3afd3694e27..eb7dd2d3712 100644 --- a/test/integration/targets/aws_s3/defaults/main.yml +++ b/test/integration/targets/aws_s3/defaults/main.yml @@ -1,2 +1,3 @@ --- # defaults file for s3 +bucket_name: '{{resource_prefix}}' diff --git a/test/integration/targets/aws_s3/tasks/main.yml b/test/integration/targets/aws_s3/tasks/main.yml index 8a9d6fe75cc..7a3225a9338 100644 --- a/test/integration/targets/aws_s3/tasks/main.yml +++ b/test/integration/targets/aws_s3/tasks/main.yml @@ -1,14 +1,9 @@ --- # tasks file for test_s3 # ============================================================ -- name: generate random name for the bucket name - command: bash -c 'echo ansible_test_$RANDOM' - register: bucket -# ============================================================ -# ============================================================ - name: test create bucket s3: - bucket: "{{ bucket.stdout }}" + bucket: "{{ bucket_name }}" mode: create aws_access_key: "{{ ec2_access_key }}" aws_secret_key: "{{ ec2_secret_key }}" @@ -21,7 +16,7 @@ # ============================================================ - name: trying to create a bucket name that already exists s3: - bucket: "{{ bucket.stdout }}" + bucket: "{{ bucket_name }}" mode: create aws_access_key: "{{ ec2_access_key }}" aws_secret_key: "{{ ec2_secret_key }}" @@ -51,7 +46,7 @@ # ============================================================ - name: test putting an object in the bucket s3: - bucket: "{{ bucket.stdout }}" + bucket: "{{ bucket_name }}" mode: put src: "{{ tmp1.path }}" object: delete.txt @@ -67,16 +62,12 @@ - result.changed == True - result.msg == "PUT operation complete" # ============================================================ -- name: wait a few seconds before continuing - pause: - seconds: 3 -# ============================================================ - name: create a second temp file to download the object from the bucket tempfile: register: tmp2 - name: test get object s3: - bucket: "{{ bucket.stdout }}" + bucket: "{{ bucket_name }}" mode: get dest: "{{ tmp2.path }}" object: delete.txt @@ -86,6 +77,7 @@ retries: 3 delay: 3 register: result + until: "result.msg == 'GET operation complete'" - name: get the stat of the file so we can compare the checksums stat: path: "{{ tmp2.path }}" @@ -96,13 +88,9 @@ that: - file1stat.stat.checksum == file2stat.stat.checksum # ============================================================ -- name: wait a few seconds before continuing - pause: - seconds: 3 -# ============================================================ - name: test geturl of the object s3: - bucket: "{{ bucket.stdout }}" + bucket: "{{ bucket_name }}" mode: geturl object: delete.txt security_token: "{{security_token}}" @@ -111,6 +99,7 @@ retries: 3 delay: 3 register: result + until: result.changed - name: assert we have the object's url assert: that: @@ -119,7 +108,7 @@ # ============================================================ - name: test getstr of the object s3: - bucket: "{{ bucket.stdout }}" + bucket: "{{ bucket_name }}" mode: getstr object: delete.txt security_token: "{{security_token}}" @@ -136,7 +125,7 @@ # ============================================================ - name: test list to get all objects in the bucket s3: - bucket: "{{ bucket.stdout }}" + bucket: "{{ bucket_name }}" mode: list security_token: "{{security_token}}" aws_access_key: "{{ ec2_access_key }}" @@ -152,7 +141,7 @@ # ============================================================ - name: test delobj to just delete an object in the bucket s3: - bucket: "{{ bucket.stdout }}" + bucket: "{{ bucket_name }}" mode: delobj object: delete.txt security_token: "{{security_token}}" @@ -169,12 +158,15 @@ # ============================================================ - name: test delete bucket s3: - bucket: "{{ bucket.stdout }}" + bucket: "{{ bucket_name }}" mode: delete security_token: "{{security_token}}" aws_access_key: "{{ ec2_access_key }}" aws_secret_key: "{{ ec2_secret_key }}" register: result + retries: 3 + delay: 3 + until: result.changed - name: assert that changed is True assert: that: @@ -191,7 +183,7 @@ # ============================================================ - name: test create a bucket with a dot in the name s3: - bucket: "{{ bucket.stdout + '.bucket' }}" + bucket: "{{ bucket_name + '.bucket' }}" mode: create security_token: "{{security_token}}" aws_access_key: "{{ ec2_access_key }}" @@ -204,7 +196,7 @@ # ============================================================ - name: test delete a bucket with a dot in the name s3: - bucket: "{{ bucket.stdout + '.bucket' }}" + bucket: "{{ bucket_name + '.bucket' }}" mode: delete security_token: "{{security_token}}" aws_access_key: "{{ ec2_access_key }}" @@ -217,7 +209,7 @@ # ============================================================ - name: test delete a nonexistent bucket s3: - bucket: "{{ bucket.stdout + '.bucket' }}" + bucket: "{{ bucket_name + '.bucket' }}" mode: delete security_token: "{{security_token}}" aws_access_key: "{{ ec2_access_key }}"