diff --git a/s3fs/core.py b/s3fs/core.py index 907ef190..2f418e33 100644 --- a/s3fs/core.py +++ b/s3fs/core.py @@ -772,7 +772,15 @@ def put(self, filename, path, **kwargs): f2.write(data) def mkdir(self, path, acl="", **kwargs): - """ Make new bucket or empty key """ + """ Make new bucket or empty key + + Parameters + ---------- + acl: str + ACL to set when creating + region_name : str + region in which the bucket should be created + """ acl = acl or self.s3_additional_kwargs.get('ACL', '') self.touch(path, acl=acl, **kwargs) @@ -961,7 +969,14 @@ def touch(self, path, acl="", **kwargs): if acl and acl not in buck_acls: raise ValueError('ACL not in %s', buck_acls) try: - self.s3.create_bucket(Bucket=bucket, ACL=acl) + params = {"Bucket": bucket, 'ACL': acl} + region_name = (kwargs.get("region_name", None) or + self.client_kwargs.get("region_name", None)) + if region_name: + params['CreateBucketConfiguration'] = { + 'LocationConstraint': region_name + } + self.s3.create_bucket(**params) self.invalidate_cache('') self.invalidate_cache(bucket) except (ClientError, ParamValidationError): diff --git a/s3fs/tests/test_s3fs.py b/s3fs/tests/test_s3fs.py index e1e84133..6435587b 100644 --- a/s3fs/tests/test_s3fs.py +++ b/s3fs/tests/test_s3fs.py @@ -294,6 +294,31 @@ def test_rmdir(s3): assert bucket not in s3.ls('/') +def test_mkdir(s3): + bucket = 'test1_bucket' + s3.mkdir(bucket) + assert bucket in s3.ls('/') + + +def test_mkdir_region_name(s3): + bucket = 'test1_bucket' + s3.mkdir(bucket, region_name="eu-central-1") + assert bucket in s3.ls('/') + + +def test_mkdir_client_region_name(): + bucket = 'test1_bucket' + try: + m = moto.mock_s3() + m.start() + s3 = S3FileSystem(anon=False, client_kwargs={"region_name": + "eu-central-1"}) + s3.mkdir(bucket) + assert bucket in s3.ls('/') + finally: + m.stop() + + def test_bulk_delete(s3): with pytest.raises((OSError, IOError)): s3.bulk_delete(['nonexistent/file'])