Skip to content

Commit 634bd24

Browse files
feat(storage): support for encryption at rest flag (#141)
1 parent 726b0ab commit 634bd24

File tree

7 files changed

+34
-4
lines changed

7 files changed

+34
-4
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
## [Unreleased]
1111

12-
----
12+
### Added
13+
14+
- Added `encrypted` boolean flag to Storage for encryption at rest support
1315

1416
## [2.5.1] - 2023-09-19
1517

docs/Storage.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ storage1 = manager.create_storage(
5151
zone='fi-hel1',
5252
size=10,
5353
tier="maxiops",
54-
title="my storage disk"
54+
title="my storage disk",
55+
encrypted=False
5556
)
5657

5758
storage2 = manager.create_storage(zone='de-fra1', size=100)

test/json_data/storage_01d4fcd4-e446-433b-8a9c-551a1284952e.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"backups" : {
66
"backup" : []
77
},
8+
"encrypted": "yes",
89
"labels": [
910
{
1011
"key": "role",

test/json_data/storage_post.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"backups": {
66
"backup": []
77
},
8+
"encrypted": "yes",
89
"labels": [
910
{
1011
"key": "role",

test/test_storage.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ def test_get_templates(self, manager):
3131
def test_storage_create(self, manager):
3232
Mock.mock_post("storage")
3333
storage = manager.create_storage(
34-
zone="fi-hel1", size=666, tier="maxiops", title="My data collection"
34+
zone="fi-hel1", encrypted=True, size=666, tier="maxiops", title="My data collection"
3535
)
3636
assert type(storage).__name__ == "Storage"
37+
assert storage.encrypted
3738
assert storage.size == 666
3839
assert storage.tier == "maxiops"
3940
assert storage.title == "My data collection"
@@ -47,6 +48,7 @@ def test_clone_storage(self, manager):
4748
Mock.mock_post("storage/01d4fcd4-e446-433b-8a9c-551a1284952e/clone")
4849
cloned_storage = storage.clone('cloned-storage-test', 'fi-hel1')
4950
assert type(cloned_storage).__name__ == "Storage"
51+
assert not cloned_storage.encrypted
5052
assert cloned_storage.size == 666
5153
assert cloned_storage.tier == "maxiops"
5254
assert cloned_storage.title == "cloned-storage-test"

upcloud_api/cloud_manager/storage_mixin.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ def create_storage(
4545
size: int = 10,
4646
tier: str = 'maxiops',
4747
title: str = 'Storage disk',
48+
encrypted: bool = False,
4849
*,
4950
backup_rule: Optional[dict] = None,
5051
) -> Storage:
@@ -53,13 +54,17 @@ def create_storage(
5354
"""
5455
if backup_rule is None:
5556
backup_rule = {}
57+
58+
encrypted_str = 'yes' if encrypted else 'no'
59+
5660
body = {
5761
'storage': {
5862
'size': size,
5963
'tier': tier,
6064
'title': title,
6165
'zone': zone,
6266
'backup_rule': backup_rule,
67+
'encrypted': encrypted_str,
6368
}
6469
}
6570
res = self.api.post_request('/storage', body)

upcloud_api/storage.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class Storage(UpCloudResource):
2121
ATTRIBUTES = {
2222
'access': None,
2323
'address': None,
24+
'encrypted': None,
2425
'labels': None,
2526
'license': None,
2627
'state': None,
@@ -55,12 +56,26 @@ def _reset(self, **kwargs) -> None:
5556
elif 'storage_size' in kwargs:
5657
self.size = kwargs['storage_size']
5758

59+
if kwargs.get('encrypted') == 'yes':
60+
self.encrypted = True
61+
else:
62+
self.encrypted = False
63+
5864
# send the rest to super._reset
5965

6066
filtered_kwargs = {
6167
key: val
6268
for key, val in kwargs.items()
63-
if key not in ['uuid', 'storage', 'title', 'storage_title', 'size', 'storage_size']
69+
if key
70+
not in [
71+
'uuid',
72+
'storage',
73+
'title',
74+
'storage_title',
75+
'size',
76+
'storage_size',
77+
'encrypted',
78+
]
6479
}
6580
super()._reset(**filtered_kwargs)
6681

@@ -153,6 +168,9 @@ def to_dict(self):
153168
dict_labels.append(label.to_dict())
154169
body['labels'] = dict_labels
155170

171+
if hasattr(self, 'encrypted') and isinstance(self.encrypted, bool):
172+
body['encrypted'] = "yes" if self.encrypted else "no"
173+
156174
return body
157175

158176
@staticmethod

0 commit comments

Comments
 (0)