Skip to content

Commit

Permalink
feat(storage): support for encryption at rest
Browse files Browse the repository at this point in the history
  • Loading branch information
villevsv-upcloud committed May 17, 2024
1 parent 726b0ab commit 15a9e2d
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 13 deletions.
3 changes: 2 additions & 1 deletion docs/Storage.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"backups" : {
"backup" : []
},
"encrypted": "yes",
"labels": [
{
"key": "role",
Expand Down
1 change: 1 addition & 0 deletions test/json_data/storage_post.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"backups": {
"backup": []
},
"encrypted": "yes",
"labels": [
{
"key": "role",
Expand Down
4 changes: 3 additions & 1 deletion test/test_storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"
Expand Down
28 changes: 18 additions & 10 deletions upcloud_api/cloud_manager/storage_mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -53,28 +64,25 @@ def create_storage(
"""
if backup_rule is None:
backup_rule = {}

if encrypted:
encrypted_str = 'yes'
else:
encrypted_str = 'no'

body = {
'storage': {
'size': size,
'tier': tier,
'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:
Expand Down
19 changes: 18 additions & 1 deletion upcloud_api/storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class Storage(UpCloudResource):
ATTRIBUTES = {
'access': None,
'address': None,
'encrypted': None,
'labels': None,
'license': None,
'state': None,
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 15a9e2d

Please sign in to comment.