Skip to content

Commit 45ad231

Browse files
authored
Merge pull request #1 from Faustasm/cd_rom_and_backup_operations
Cd rom and backup operations
2 parents 8f1b733 + 8856cbf commit 45ad231

6 files changed

+199
-7
lines changed

test/conftest.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,25 @@ def mock_get(target, response_file=None):
5151
return data
5252

5353
@staticmethod
54-
def __put_post_callback(request, target, data):
54+
def __put_post_callback(request, target, data, ignore_data_field=False, empty_payload=False):
5555
data_field = target.split("/")[0]
56-
payload = json.loads(request.body)
5756

58-
for field in data[data_field]:
59-
if field in payload[data_field]:
60-
data[data_field][field] = payload[data_field][field]
57+
if not empty_payload:
58+
payload = json.loads(request.body)
59+
60+
if not ignore_data_field:
61+
for field in data[data_field]:
62+
if field in payload[data_field]:
63+
data[data_field][field] = payload[data_field][field]
6164
return(200, {}, json.dumps(data))
6265

6366
@staticmethod
64-
def mock_post(target, empty_content=False):
67+
def mock_post(target, empty_content=False, ignore_data_field=False, empty_payload=False):
6568

6669
def callback(request):
6770
if not empty_content:
6871
data = json.loads(Mock.read_from_file(target + '_post.json'))
69-
return Mock.__put_post_callback(request, target, data)
72+
return Mock.__put_post_callback(request, target, data, ignore_data_field, empty_payload)
7073
else:
7174
return(200, {}, '{}')
7275

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
{
2+
"server" : {
3+
"boot_order" : "disk",
4+
"core_number" : "0",
5+
"firewall" : "on",
6+
"hostname" : "fi.example.com",
7+
"ip_addresses" : {
8+
"ip_address" : [
9+
{
10+
"access" : "private",
11+
"address" : "10.0.0.0",
12+
"family": "IPv4"
13+
},
14+
{
15+
"access" : "public",
16+
"address" : "0.0.0.0",
17+
"family": "IPv4"
18+
}
19+
]
20+
},
21+
"license" : 0,
22+
"memory_amount" : "1024",
23+
"nic_model" : "e1000",
24+
"state" : "started",
25+
"storage_devices" : {
26+
"storage_device" : [
27+
{
28+
"address" : "virtio:0",
29+
"storage" : "012580a1-32a1-466e-a323-689ca16f2d43",
30+
"storage_size" : 100,
31+
"storage_title" : "Storage for server1.example.com",
32+
"type" : "disk"
33+
}
34+
]
35+
},
36+
"tags": {
37+
"tag": [
38+
"web1",
39+
"web2"
40+
]
41+
},
42+
"timezone" : "UTC",
43+
"title" : "Helsinki server",
44+
"uuid" : "00798b85-efdc-41ca-8021-f6ef457b8531",
45+
"video_model" : "cirrus",
46+
"vnc" : "on",
47+
"vnc_host" : "fi-he1l.vnc.upcloud.com",
48+
"vnc_password" : "aabbccdd",
49+
"vnc_port" : "00000",
50+
"zone" : "fi-hel1",
51+
"plan": "custom"
52+
}
53+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
{
2+
"server" : {
3+
"boot_order" : "disk",
4+
"core_number" : "0",
5+
"firewall" : "on",
6+
"hostname" : "fi.example.com",
7+
"ip_addresses" : {
8+
"ip_address" : [
9+
{
10+
"access" : "private",
11+
"address" : "10.0.0.0",
12+
"family": "IPv4"
13+
},
14+
{
15+
"access" : "public",
16+
"address" : "0.0.0.0",
17+
"family": "IPv4"
18+
}
19+
]
20+
},
21+
"license" : 0,
22+
"memory_amount" : "1024",
23+
"nic_model" : "e1000",
24+
"state" : "started",
25+
"storage_devices" : {
26+
"storage_device" : [
27+
{
28+
"address" : "ide:0:0",
29+
"boot_disk": "0",
30+
"storage" : "01ec5c26-a25d-4752-94e4-27bd88b62816",
31+
"storage_size" : 10,
32+
"storage_title" : "cd-rom test",
33+
"type" : "cdrom"
34+
},
35+
{
36+
"address" : "virtio:0",
37+
"storage" : "012580a1-32a1-466e-a323-689ca16f2d43",
38+
"storage_size" : 100,
39+
"storage_title" : "Storage for server1.example.com",
40+
"type" : "disk"
41+
}
42+
]
43+
},
44+
"tags": {
45+
"tag": [
46+
"web1",
47+
"web2"
48+
]
49+
},
50+
"timezone" : "UTC",
51+
"title" : "Helsinki server",
52+
"uuid" : "00798b85-efdc-41ca-8021-f6ef457b8531",
53+
"video_model" : "cirrus",
54+
"vnc" : "on",
55+
"vnc_host" : "fi-he1l.vnc.upcloud.com",
56+
"vnc_password" : "aabbccdd",
57+
"vnc_port" : "00000",
58+
"zone" : "fi-hel1",
59+
"plan": "custom"
60+
}
61+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{"storage":
2+
{
3+
"access": "private",
4+
"created": "2020-09-21T17:36:50Z",
5+
"license": 0,
6+
"origin": "01ec5c26-a25d-4752-94e4-27bd88b62816",
7+
"progress": "0",
8+
"servers": {"server": []},
9+
"size": 666,
10+
"state": "maintenance",
11+
"title": "test-backup",
12+
"type": "backup",
13+
"uuid": "01350eec-6ebf-4418-abe4-e8bb1d5c9643",
14+
"zone": "fi-hel1"
15+
}
16+
}

test/test_storage.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,32 @@ def test_cancel_clone_storage(self, manager):
5959
res = manager.cancel_clone_storage(cloned_storage)
6060
assert res == {}
6161

62+
@responses.activate
63+
def test_load_cd_rom(self, manager):
64+
data = Mock.mock_post("server/00798b85-efdc-41ca-8021-f6ef457b8531/cdrom/load", ignore_data_field=True)
65+
storage_devices = manager.load_cd_rom("00798b85-efdc-41ca-8021-f6ef457b8531", "01ec5c26-a25d-4752-94e4-27bd88b62816")
66+
assert len(storage_devices) == 2
67+
68+
@responses.activate
69+
def test_eject_cd_rom(self, manager):
70+
data = Mock.mock_post("server/00798b85-efdc-41ca-8021-f6ef457b8531/cdrom/eject", ignore_data_field=True, empty_payload=True)
71+
storage_devices = manager.eject_cd_rom("00798b85-efdc-41ca-8021-f6ef457b8531")
72+
assert len(storage_devices) == 1
73+
74+
@responses.activate
75+
def test_create_storage_backup(self, manager):
76+
data = Mock.mock_post("storage/01d4fcd4-e446-433b-8a9c-551a1284952e/backup")
77+
storage = manager.create_storage_backup("01d4fcd4-e446-433b-8a9c-551a1284952e", "test-backup")
78+
assert storage.title == "test-backup"
79+
assert storage.size == 666
80+
assert storage.zone == "fi-hel1"
81+
82+
@responses.activate
83+
def test_restore_storage_backup(self, manager):
84+
data = Mock.mock_post("storage/01350eec-6ebf-4418-abe4-e8bb1d5c9643/restore", empty_content=True)
85+
res = manager.restore_storage_backup("01350eec-6ebf-4418-abe4-e8bb1d5c9643")
86+
assert res == {}
87+
6288
@responses.activate
6389
def test_storage_update(self, manager):
6490

upcloud_api/cloud_manager/storage_mixin.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,3 +108,36 @@ def detach_storage(self, server, address):
108108
url = '/server/{0}/storage/detach'.format(server)
109109
res = self.post_request(url, body)
110110
return Storage._create_storage_objs(res['server']['storage_devices'], cloud_manager=self)
111+
112+
def load_cd_rom(self, server, address):
113+
"""
114+
Loads a storage as a CD-ROM in the CD-ROM device of a server.
115+
"""
116+
body = {'storage_device': {'storage': address}}
117+
url = '/server/{0}/cdrom/load'.format(server)
118+
res = self.post_request(url, body)
119+
return Storage._create_storage_objs(res['server']['storage_devices'], cloud_manager=self)
120+
121+
def eject_cd_rom(self, server):
122+
"""
123+
Ejects the storage from the CD-ROM device of a server.
124+
"""
125+
url = '/server/{0}/cdrom/eject'.format(server)
126+
res = self.post_request(url)
127+
return Storage._create_storage_objs(res['server']['storage_devices'], cloud_manager=self)
128+
129+
def create_storage_backup(self, storage, title):
130+
"""
131+
Creates a point-in-time backup of a storage resource.
132+
"""
133+
url = '/storage/{0}/backup'.format(storage)
134+
body = {'storage': {'title': title}}
135+
res = self.post_request(url, body)
136+
return Storage(cloud_manager=self, **res['storage'])
137+
138+
def restore_storage_backup(self, storage):
139+
"""
140+
Restores the origin storage with data from the specified backup storage.
141+
"""
142+
url = '/storage/{0}/restore'.format(storage)
143+
return self.post_request(url)

0 commit comments

Comments
 (0)