diff --git a/docs/Storage.md b/docs/Storage.md index 6074e76..969335e 100644 --- a/docs/Storage.md +++ b/docs/Storage.md @@ -51,7 +51,8 @@ storage1 = manager.create_storage( zone='fi-hel1', size=10, tier="maxiops", - title="my storage disk" + title="my storage disk", + encrypted=True ) storage2 = manager.create_storage(zone='de-fra1', size=100) diff --git a/test/json_data/storage_01d4fcd4-e446-433b-8a9c-551a1284952e.json b/test/json_data/storage_01d4fcd4-e446-433b-8a9c-551a1284952e.json index cc62d8d..e6e5f4f 100644 --- a/test/json_data/storage_01d4fcd4-e446-433b-8a9c-551a1284952e.json +++ b/test/json_data/storage_01d4fcd4-e446-433b-8a9c-551a1284952e.json @@ -5,6 +5,7 @@ "backups" : { "backup" : [] }, + "encrypted": "yes", "labels": [ { "key": "role", diff --git a/test/json_data/storage_post.json b/test/json_data/storage_post.json index 33cec53..856bc65 100644 --- a/test/json_data/storage_post.json +++ b/test/json_data/storage_post.json @@ -5,6 +5,7 @@ "backups": { "backup": [] }, + "encrypted": "yes", "labels": [ { "key": "role", diff --git a/test/test_storage.py b/test/test_storage.py index 76f1973..42c7640 100644 --- a/test/test_storage.py +++ b/test/test_storage.py @@ -31,9 +31,10 @@ def test_get_templates(self, manager): def test_storage_create(self, manager): Mock.mock_post("storage") storage = manager.create_storage( - zone="fi-hel1", size=666, tier="maxiops", title="My data collection" + zone="fi-hel1", encrypted=True, size=666, tier="maxiops", title="My data collection" ) assert type(storage).__name__ == "Storage" + assert storage.encrypted assert storage.size == 666 assert storage.tier == "maxiops" assert storage.title == "My data collection" @@ -47,6 +48,7 @@ def test_clone_storage(self, manager): Mock.mock_post("storage/01d4fcd4-e446-433b-8a9c-551a1284952e/clone") cloned_storage = storage.clone('cloned-storage-test', 'fi-hel1') assert type(cloned_storage).__name__ == "Storage" + assert not cloned_storage.encrypted assert cloned_storage.size == 666 assert cloned_storage.tier == "maxiops" assert cloned_storage.title == "cloned-storage-test" diff --git a/upcloud_api/cloud_manager/storage_mixin.py b/upcloud_api/cloud_manager/storage_mixin.py index 1e30c70..dd3e8c9 100644 --- a/upcloud_api/cloud_manager/storage_mixin.py +++ b/upcloud_api/cloud_manager/storage_mixin.py @@ -39,12 +39,23 @@ def get_storage(self, storage: str) -> Storage: res = self.api.get_request('/storage/' + str(storage)) return Storage(cloud_manager=self, **res['storage']) + def _modify_storage(self, storage, size, title, backup_rule: Optional[dict] = None): + body = {'storage': {}} + if size: + body['storage']['size'] = size + if title: + body['storage']['title'] = title + if backup_rule: + body['storage']['backup_rule'] = backup_rule + return self.api.put_request('/storage/' + str(storage), body) + def create_storage( self, zone: str, size: int = 10, tier: str = 'maxiops', title: str = 'Storage disk', + encrypted: bool = False, *, backup_rule: Optional[dict] = None, ) -> Storage: @@ -53,6 +64,12 @@ def create_storage( """ if backup_rule is None: backup_rule = {} + + if encrypted: + encrypted_str = 'yes' + else: + encrypted_str = 'no' + body = { 'storage': { 'size': size, @@ -60,21 +77,12 @@ def create_storage( 'title': title, 'zone': zone, 'backup_rule': backup_rule, + 'encrypted': encrypted_str, } } res = self.api.post_request('/storage', body) return Storage(cloud_manager=self, **res['storage']) - def _modify_storage(self, storage, size, title, backup_rule: Optional[dict] = None): - body = {'storage': {}} - if size: - body['storage']['size'] = size - if title: - body['storage']['title'] = title - if backup_rule: - body['storage']['backup_rule'] = backup_rule - return self.api.put_request('/storage/' + str(storage), body) - def modify_storage( self, storage: str, size: int, title: str, backup_rule: Optional[dict] = None ) -> Storage: diff --git a/upcloud_api/storage.py b/upcloud_api/storage.py index 9771ef2..88508f5 100644 --- a/upcloud_api/storage.py +++ b/upcloud_api/storage.py @@ -21,6 +21,7 @@ class Storage(UpCloudResource): ATTRIBUTES = { 'access': None, 'address': None, + 'encrypted': None, 'labels': None, 'license': None, 'state': None, @@ -55,12 +56,25 @@ def _reset(self, **kwargs) -> None: elif 'storage_size' in kwargs: self.size = kwargs['storage_size'] + if 'encrypted' in kwargs and kwargs['encrypted'] == 'yes': + self.encrypted = True + else: + self.encrypted = False + # send the rest to super._reset filtered_kwargs = { key: val for key, val in kwargs.items() - if key not in ['uuid', 'storage', 'title', 'storage_title', 'size', 'storage_size'] + if key not in [ + 'uuid', + 'storage', + 'title', + 'storage_title', + 'size', + 'storage_size', + 'encrypted', + ] } super()._reset(**filtered_kwargs) @@ -153,6 +167,9 @@ def to_dict(self): dict_labels.append(label.to_dict()) body['labels'] = dict_labels + if hasattr(self, 'enrypted') and isinstance(self.enrypted, bool): + body['server']['enrypted'] = "yes" if self.enrypted else "no" + return body @staticmethod