diff --git a/samcli/commands/package/exceptions.py b/samcli/commands/package/exceptions.py index fac98490b7..7775949fcd 100644 --- a/samcli/commands/package/exceptions.py +++ b/samcli/commands/package/exceptions.py @@ -78,6 +78,15 @@ class NoSuchBucketError(UserException): def __init__(self, **kwargs): self.kwargs = kwargs - message_fmt = "\n S3 Bucket does not exist." + message_fmt = "\nS3 Bucket does not exist." super(NoSuchBucketError, self).__init__(message=message_fmt.format(**self.kwargs)) + + +class BucketNotSpecifiedError(UserException): + def __init__(self, **kwargs): + self.kwargs = kwargs + + message_fmt = "\nS3 Bucket not specified, use --s3-bucket to specify a bucket name" + + super(BucketNotSpecifiedError, self).__init__(message=message_fmt.format(**self.kwargs)) diff --git a/samcli/lib/package/s3_uploader.py b/samcli/lib/package/s3_uploader.py index cf5484e025..d89710c0df 100644 --- a/samcli/lib/package/s3_uploader.py +++ b/samcli/lib/package/s3_uploader.py @@ -27,7 +27,7 @@ from boto3.s3 import transfer -from samcli.commands.package.exceptions import NoSuchBucketError +from samcli.commands.package.exceptions import NoSuchBucketError, BucketNotSpecifiedError LOG = logging.getLogger(__name__) @@ -134,6 +134,8 @@ def file_exists(self, remote_path): try: # Find the object that matches this ETag + if not self.bucket_name: + raise BucketNotSpecifiedError() self.s3.head_object(Bucket=self.bucket_name, Key=remote_path) return True except botocore.exceptions.ClientError: diff --git a/tests/unit/lib/package/test_s3_uploader.py b/tests/unit/lib/package/test_s3_uploader.py index 40f22f7981..a2aef1e008 100644 --- a/tests/unit/lib/package/test_s3_uploader.py +++ b/tests/unit/lib/package/test_s3_uploader.py @@ -7,7 +7,7 @@ from pathlib import Path from botocore.exceptions import ClientError -from samcli.commands.package.exceptions import NoSuchBucketError +from samcli.commands.package.exceptions import NoSuchBucketError, BucketNotSpecifiedError from samcli.lib.package.s3_uploader import S3Uploader @@ -144,6 +144,20 @@ def test_s3_upload(self): s3_url = s3_uploader.upload(f.name, remote_path) self.assertEqual(s3_url, "s3://{0}/{1}/{2}".format(self.bucket_name, self.prefix, remote_path)) + def test_s3_upload_no_bucket(self): + s3_uploader = S3Uploader( + s3_client=self.s3, + bucket_name=None, + prefix=self.prefix, + kms_key_id=self.kms_key_id, + force_upload=self.force_upload, + ) + s3_uploader.artifact_metadata = {"a": "b"} + remote_path = Path.joinpath(Path(os.getcwd()), Path("tmp")) + with self.assertRaises(BucketNotSpecifiedError): + with tempfile.NamedTemporaryFile(mode="w", delete=False) as f: + s3_uploader.upload(f.name, remote_path) + def test_s3_upload_with_dedup(self): s3_uploader = S3Uploader( s3_client=self.s3,