Skip to content

Commit 1d75485

Browse files
committed
Merge branch 'master' into ronerez/edge-mapping
2 parents 26638f6 + 2b429ad commit 1d75485

3 files changed

Lines changed: 50 additions & 8 deletions

File tree

cterasdk/core/buckets.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,27 +40,30 @@ def get(self, name, include=None):
4040
raise ObjectNotFoundException(f'/locations/{name}')
4141
return bucket
4242

43-
def add(self, name, bucket, read_only=False, dedicated_to=None):
43+
def add(self, name, bucket, read_only=False, dedicated_to=None, direct=None):
4444
"""
4545
Add a Bucket
4646
4747
:param str name: Name of the bucket
4848
:param cterasdk.core.types.Bucket bucket: Storage bucket to add
4949
:param bool,optional read_only: Set bucket to read-delete only, defaults to False
5050
:param str,optional dedicated_to: Name of a tenant, defaults to ``None``
51+
:param bool,optional direct: Enable CTERA Direct IO
5152
"""
5253
param = bucket.to_server_object()
5354
param.name = name
5455
param.readOnly = read_only
5556
param.dedicated = bool(dedicated_to)
5657
param.dedicatedPortal = self._get_tenant_base_object_ref(dedicated_to) if dedicated_to else None
58+
if direct is not None:
59+
param.directUpload = direct
5760

58-
logger.info('Adding bucket. %s', {'name': name, 'bucket': bucket.bucket, 'type': bucket.__class__.__name__})
61+
logger.info('Adding %s bucket: %s', bucket.__class__.__name__, name)
5962
response = self._core.api.add('/locations', param)
60-
logger.info('Bucket added. %s', {'name': name, 'bucket': bucket.bucket, 'type': bucket.__class__.__name__})
63+
logger.info('Bucket added: %s', name)
6164
return response
6265

63-
def modify(self, current_name, new_name=None, read_only=None, dedicated_to=None, verify_ssl=None):
66+
def modify(self, current_name, new_name=None, read_only=None, dedicated_to=None, verify_ssl=None, direct=None):
6467
"""
6568
Modify a Bucket
6669
@@ -70,6 +73,7 @@ def modify(self, current_name, new_name=None, read_only=None, dedicated_to=None,
7073
:param bool,optional dedicated: Dedicate bucket to a tenant
7174
:param bool,optional verify_ssl: ``False`` to trust all certificate, ``True`` to verify.
7275
:param str,optional dedicated_to: Tenant name
76+
:param bool,optional direct: Set CTERA Direct IO
7377
"""
7478
param = self._get_entire_object(current_name)
7579
if new_name:
@@ -88,9 +92,11 @@ def modify(self, current_name, new_name=None, read_only=None, dedicated_to=None,
8892
param.dedicatedPortal = self._get_tenant_base_object_ref(dedicated_to) if dedicated_to else None
8993
if verify_ssl is not None:
9094
param.trustAllCertificates = not verify_ssl
91-
logger.info("Modifying bucket. %s", {'name': current_name})
95+
if direct is not None:
96+
param.directUpload = direct
97+
logger.info("Modifying bucket: %s", current_name)
9298
response = self._core.api.put(f'/locations/{current_name}', param)
93-
logger.info("Bucket modified. %s", {'name': current_name})
99+
logger.info("Bucket modified: %s", current_name)
94100
return response
95101

96102
def list_buckets(self, include=None):

docs/source/UserGuides/Miscellaneous/Changelog.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
Changelog
22
=========
33

4+
2.20.16
5+
-------
6+
7+
Improvements
8+
^^^^^^^^^^^^
9+
10+
* Added support for enabling or disabling Direct Mode on CTERA Portal Storage Nodes.
11+
12+
Related issues and pull requests on GitHub: `#310 <https://github.com/ctera/ctera-python-sdk/pull/310>`_
13+
414
2.20.15
515
-------
616

tests/ut/core/admin/test_buckets.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ def test_add_bucket(self):
4343
get_multi_response = munch.Munch({'name': self._tenant_name, 'baseObjectRef': self._tenant_base_object_ref})
4444
self._init_global_admin(get_multi_response=get_multi_response, add_response=add_response)
4545
bucket = AmazonS3(self._bucket_name, self._access_key, self._secret_key)
46-
ret = buckets.Buckets(self._global_admin).add(self._bucket_name, bucket, read_only=True, dedicated_to=self._tenant_name)
46+
ret = buckets.Buckets(self._global_admin).add(
47+
self._bucket_name, bucket, read_only=True,
48+
dedicated_to=self._tenant_name, direct=True)
4749
self._global_admin.api.get_multi.assert_called_once_with(f'/portals/{self._tenant_name}', mock.ANY)
4850
expected_include = ['/' + attr for attr in portals.Portals.default + ['baseObjectRef']]
4951
actual_include = self._global_admin.api.get_multi.call_args[0][1]
@@ -53,7 +55,21 @@ def test_add_bucket(self):
5355
self._global_admin.api.add.assert_called_once_with('/locations', mock.ANY)
5456
expected_param = TestCoreBuckets._customize_bucket(bucket.to_server_object(), name=self._bucket_name,
5557
readOnly=True, dedicated=True,
56-
dedicatedPortal=self._tenant_base_object_ref, trustAllCertificates=False)
58+
dedicatedPortal=self._tenant_base_object_ref,
59+
trustAllCertificates=False, directUpload=True)
60+
actual_param = self._global_admin.api.add.call_args[0][1]
61+
self._assert_equal_objects(actual_param, expected_param)
62+
self.assertEqual(ret, add_response)
63+
64+
def test_add_bucket_default_attrs(self):
65+
add_response = 'Success'
66+
self._init_global_admin(add_response=add_response)
67+
bucket = AmazonS3(self._bucket_name, self._access_key, self._secret_key)
68+
ret = buckets.Buckets(self._global_admin).add(self._bucket_name, bucket)
69+
self._global_admin.api.add.assert_called_once_with('/locations', mock.ANY)
70+
expected_param = TestCoreBuckets._customize_bucket(bucket.to_server_object(), name=self._bucket_name,
71+
readOnly=False, dedicated=False,
72+
dedicatedPortal=None, trustAllCertificates=False)
5773
actual_param = self._global_admin.api.add.call_args[0][1]
5874
self._assert_equal_objects(actual_param, expected_param)
5975
self.assertEqual(ret, add_response)
@@ -68,6 +84,16 @@ def test_modify_bucket_name_ro_remove_dedication(self):
6884
actual_param = self._global_admin.api.put.call_args[0][1]
6985
self._assert_equal_objects(actual_param, expected_param)
7086

87+
def test_modify_bucket_direct_mode(self):
88+
get_response = munch.Munch({'name': self._bucket_name, 'directUpload': False})
89+
self._init_global_admin(get_response=get_response)
90+
buckets.Buckets(self._global_admin).modify(self._bucket_name, direct=True)
91+
self._global_admin.api.get.assert_called_once_with(f'/locations/{self._bucket_name}')
92+
self._global_admin.api.put.assert_called_once_with(f'/locations/{self._bucket_name}', mock.ANY)
93+
expected_param = TestCoreBuckets._get_bucket_param(name=self._bucket_name, directUpload=True)
94+
actual_param = self._global_admin.api.put.call_args[0][1]
95+
self._assert_equal_objects(actual_param, expected_param)
96+
7197
def test_modify_bucket_value_error(self):
7298
self._init_global_admin(get_response=None)
7399
with self.assertRaises(ValueError):

0 commit comments

Comments
 (0)