22import json
33from conftest import Mock
44import pytest
5+ from upcloud import FirewallRule
56
67class TestServer ():
78 @responses .activate
@@ -36,7 +37,7 @@ def test_start_server(self, manager):
3637 server = manager .get_server ("009d64ef-31d1-4684-a26b-c86c955cbf46" )
3738
3839 assert server .state == "stopped"
39-
40+
4041 data = Mock .mock_server_operation ("server/009d64ef-31d1-4684-a26b-c86c955cbf46/start" )
4142 server .start ()
4243
@@ -48,7 +49,7 @@ def test_stop_server(self, manager):
4849 server = manager .get_server ("00798b85-efdc-41ca-8021-f6ef457b8531" )
4950
5051 assert server .state == "started"
51-
52+
5253 data = Mock .mock_server_operation ("server/00798b85-efdc-41ca-8021-f6ef457b8531/stop" )
5354 server .stop ()
5455
@@ -60,7 +61,7 @@ def test_restart_server(self, manager):
6061 server = manager .get_server ("00798b85-efdc-41ca-8021-f6ef457b8531" )
6162
6263 assert server .state == "started"
63-
64+
6465 data = Mock .mock_server_operation ("server/00798b85-efdc-41ca-8021-f6ef457b8531/restart" )
6566 server .restart ()
6667
@@ -71,17 +72,17 @@ def test_attach_and_detach_IP(self, manager):
7172 data = Mock .mock_get ("server/00798b85-efdc-41ca-8021-f6ef457b8531" )
7273 server = manager .get_server ("00798b85-efdc-41ca-8021-f6ef457b8531" )
7374 assert len (server .ip_addresses ) == 2
74-
75+
7576 data = Mock .mock_post ("ip_address" )
7677 server .add_IP ()
7778 assert len (server .ip_addresses ) == 3
78-
79+
7980 Mock .mock_delete ("ip_address/" + server .ip_addresses [2 ].address )
8081 server .remove_IP (server .ip_addresses [2 ])
8182 assert len (server .ip_addresses ) == 2
8283
8384 @responses .activate
84- def test_attach_and_detach_storage (self , manager ):
85+ def test_attach_and_detach_storage (self , manager ):
8586 data = Mock .mock_get ("server/00798b85-efdc-41ca-8021-f6ef457b8531" )
8687 server = manager .get_server ("00798b85-efdc-41ca-8021-f6ef457b8531" )
8788 assert len (server .storage_devices ) == 1
@@ -90,9 +91,9 @@ def test_attach_and_detach_storage(self, manager):
9091 data = Mock .mock_get ("storage/01d4fcd4-e446-433b-8a9c-551a1284952e" )
9192 storage = manager .get_storage ("01d4fcd4-e446-433b-8a9c-551a1284952e" )
9293
93-
94+
9495 responses .add (
95- responses .POST ,
96+ responses .POST ,
9697 Mock .base_url + "/server/00798b85-efdc-41ca-8021-f6ef457b8531/storage/attach" ,
9798 body = Mock .read_from_file ("storage_attach.json" ),
9899 status = 200 ,
@@ -104,7 +105,7 @@ def test_attach_and_detach_storage(self, manager):
104105 assert server .storage_devices [1 ].title == "Operating system disk"
105106
106107 responses .add (
107- responses .POST ,
108+ responses .POST ,
108109 Mock .base_url + "/server/00798b85-efdc-41ca-8021-f6ef457b8531/storage/detach" ,
109110 body = Mock .read_from_file ("storage_attach.json" ),
110111 status = 200 ,
@@ -136,8 +137,101 @@ def test_update_server_oop(self, manager):
136137 def test_update_server_non_updateable_fields (self , manager ):
137138 data = Mock .mock_get ("server/00798b85-efdc-41ca-8021-f6ef457b8531" )
138139 server = manager .get_server ("00798b85-efdc-41ca-8021-f6ef457b8531" )
139-
140+
140141 with pytest .raises (Exception ) as excinfo :
141- server .state = "rekt"
142+ server .state = "rekt"
142143 assert "'state' is a readonly field" in str (excinfo .value )
143144
145+ @responses .activate
146+ def test_add_firewall_rule (self , manager ):
147+ Mock .mock_get ("server/00798b85-efdc-41ca-8021-f6ef457b8531" )
148+ server = manager .get_server ("00798b85-efdc-41ca-8021-f6ef457b8531" )
149+
150+ def callback (request ):
151+ required_fields = [
152+ 'position' , 'direction' , 'family' , 'protocol' ,
153+ 'source_address_start' , 'source_address_end' ,
154+ 'destination_port_start' , 'destination_port_end' ,
155+ 'action'
156+ ]
157+
158+ request_body = json .loads (request .body )
159+
160+ for field in required_fields :
161+ if field not in request_body :
162+ raise Exception ('missing required field: {0}' .format (field ))
163+
164+ return (201 , {}, json .dumps ({ 'firewall_rule' : request_body }))
165+
166+
167+ responses .add_callback (
168+ responses .POST ,
169+ Mock .base_url + "/server/00798b85-efdc-41ca-8021-f6ef457b8531/firewall_rule" ,
170+ content_type = 'application/json' ,
171+ callback = callback
172+ )
173+
174+ returned_firewall = server .add_firewall_rule (FirewallRule (
175+ position = "1" ,
176+ direction = "in" ,
177+ family = "IPv4" ,
178+ protocol = "tcp" ,
179+ source_address_start = "192.168.1.1" ,
180+ source_address_end = "192.168.1.255" ,
181+ destination_port_start = "22" ,
182+ destination_port_end = "22" ,
183+ action = "accept"
184+ ))
185+
186+ # everything should run without errors, returned created object
187+ assert returned_firewall .position == "1"
188+ assert returned_firewall .direction == "in"
189+ assert returned_firewall .source_address_end == "192.168.1.255"
190+
191+
192+ @responses .activate
193+ def test_remove_firewall_rule (self , manager ):
194+ Mock .mock_get ("server/00798b85-efdc-41ca-8021-f6ef457b8531" )
195+ server = manager .get_server ("00798b85-efdc-41ca-8021-f6ef457b8531" )
196+
197+ target = "server/00798b85-efdc-41ca-8021-f6ef457b8531/firewall_rule"
198+ Mock .mock_get (target , "firewall_rules.json" )
199+ firewall_rules = server .get_firewall_rules ()
200+
201+ Mock .mock_delete ("server/00798b85-efdc-41ca-8021-f6ef457b8531/firewall_rule/1" )
202+ res = firewall_rules [0 ].destroy ()
203+
204+ Mock .mock_delete ("server/00798b85-efdc-41ca-8021-f6ef457b8531/firewall_rule/1" )
205+ res = server .remove_firewall_rule (firewall_rules [0 ])
206+
207+ assert res == {}
208+
209+ @responses .activate
210+ def test_list_and_get_firewall_rules (self , manager ):
211+ Mock .mock_get ("server/00798b85-efdc-41ca-8021-f6ef457b8531" )
212+ server = manager .get_server ("00798b85-efdc-41ca-8021-f6ef457b8531" )
213+
214+ target = "server/00798b85-efdc-41ca-8021-f6ef457b8531/firewall_rule"
215+ Mock .mock_get (target , "firewall_rules.json" )
216+ firewall_rules = server .get_firewall_rules ()
217+
218+ assert firewall_rules [0 ].position == "1"
219+
220+
221+
222+
223+
224+
225+
226+
227+
228+
229+
230+
231+
232+
233+
234+
235+
236+
237+
0 commit comments