Revision a95c82a9
b/snf-cyclades-app/synnefo/api/test/floating_ips.py | ||
---|---|---|
35 | 35 |
|
36 | 36 |
from snf_django.utils.testing import BaseAPITest, mocked_quotaholder |
37 | 37 |
from synnefo.db.models import FloatingIP |
38 |
from synnefo.db.models_factory import FloatingIPFactory, NetworkFactory |
|
38 |
from synnefo.db.models_factory import (FloatingIPFactory, NetworkFactory, |
|
39 |
VirtualMachineFactory, |
|
40 |
NetworkInterfaceFactory) |
|
41 |
from mock import patch |
|
39 | 42 |
|
40 | 43 |
|
41 | 44 |
URL = "/api/v1.1/os-floating-ips" |
... | ... | |
107 | 110 |
|
108 | 111 |
def test_release_in_use(self): |
109 | 112 |
ip = FloatingIPFactory() |
113 |
vm = ip.machine |
|
114 |
vm.operstate = "ACTIVE" |
|
115 |
vm.userid = ip.userid |
|
116 |
vm.save() |
|
117 |
vm.nics.create(index=0, ipv4=ip.ipv4, network=ip.network, |
|
118 |
state="ACTIVE") |
|
119 |
with mocked_quotaholder(): |
|
120 |
response = self.delete(URL + "/%s" % ip.id, ip.userid) |
|
121 |
self.assertFault(response, 409, "conflict") |
|
122 |
# Also send a notification to remove the NIC and assert that FIP is in |
|
123 |
# use until notification from ganeti arrives |
|
124 |
request = {"removeFloatingIp": {"address": ip.ipv4}} |
|
125 |
url = "/api/v1.1/servers/%s/action" % vm.id |
|
126 |
with patch('synnefo.logic.rapi_pool.GanetiRapiClient') as c: |
|
127 |
c().ModifyInstance.return_value = 10 |
|
128 |
response = self.post(url, vm.userid, json.dumps(request), |
|
129 |
"json") |
|
130 |
self.assertEqual(response.status_code, 202) |
|
110 | 131 |
with mocked_quotaholder(): |
111 | 132 |
response = self.delete(URL + "/%s" % ip.id, ip.userid) |
112 | 133 |
self.assertFault(response, 409, "conflict") |
... | ... | |
137 | 158 |
self.assertSuccess(response) |
138 | 159 |
self.assertEqual(json.loads(response.content)["floating_ip_pools"], |
139 | 160 |
[{"name": str(net.id)}]) |
161 |
|
|
162 |
|
|
163 |
class FloatingIPActionsTest(BaseAPITest): |
|
164 |
def setUp(self): |
|
165 |
vm = VirtualMachineFactory() |
|
166 |
vm.operstate = "ACTIVE" |
|
167 |
vm.save() |
|
168 |
self.vm = vm |
|
169 |
|
|
170 |
def test_bad_request(self): |
|
171 |
url = "/api/v1.1/servers/%s/action" % self.vm.id |
|
172 |
response = self.post(url, self.vm.userid, json.dumps({}), "json") |
|
173 |
self.assertBadRequest(response) |
|
174 |
response = self.post(url, self.vm.userid, |
|
175 |
json.dumps({"addFloatingIp": {}}), |
|
176 |
"json") |
|
177 |
self.assertBadRequest(response) |
|
178 |
|
|
179 |
@patch('synnefo.logic.rapi_pool.GanetiRapiClient') |
|
180 |
def test_add_floating_ip(self, mock): |
|
181 |
# Not exists |
|
182 |
url = "/api/v1.1/servers/%s/action" % self.vm.id |
|
183 |
request = {"addFloatingIp": {"address": "10.0.0.1"}} |
|
184 |
response = self.post(url, self.vm.userid, json.dumps(request), "json") |
|
185 |
self.assertItemNotFound(response) |
|
186 |
# In use |
|
187 |
vm1 = VirtualMachineFactory() |
|
188 |
ip1 = FloatingIPFactory(userid=self.vm.userid, machine=vm1) |
|
189 |
request = {"addFloatingIp": {"address": ip1.ipv4}} |
|
190 |
response = self.post(url, self.vm.userid, json.dumps(request), "json") |
|
191 |
self.assertFault(response, 409, "conflict") |
|
192 |
# Success |
|
193 |
ip1 = FloatingIPFactory(userid=self.vm.userid, machine=None) |
|
194 |
request = {"addFloatingIp": {"address": ip1.ipv4}} |
|
195 |
response = self.post(url, self.vm.userid, json.dumps(request), "json") |
|
196 |
self.assertEqual(response.status_code, 202) |
|
197 |
ip1_after = FloatingIP.objects.get(id=ip1.id) |
|
198 |
self.assertEqual(ip1_after.machine, self.vm) |
|
199 |
self.assertTrue(ip1_after.in_use()) |
|
200 |
|
|
201 |
@patch('synnefo.logic.rapi_pool.GanetiRapiClient') |
|
202 |
def test_remove_floating_ip(self, mock): |
|
203 |
# Not exists |
|
204 |
url = "/api/v1.1/servers/%s/action" % self.vm.id |
|
205 |
request = {"removeFloatingIp": {"address": "10.0.0.1"}} |
|
206 |
response = self.post(url, self.vm.userid, json.dumps(request), "json") |
|
207 |
self.assertItemNotFound(response) |
|
208 |
# Not In Use |
|
209 |
ip1 = FloatingIPFactory(userid=self.vm.userid, machine=None) |
|
210 |
request = {"removeFloatingIp": {"address": ip1.ipv4}} |
|
211 |
response = self.post(url, self.vm.userid, json.dumps(request), "json") |
|
212 |
self.assertItemNotFound(response) |
|
213 |
# Success |
|
214 |
ip1 = FloatingIPFactory(userid=self.vm.userid, machine=self.vm) |
|
215 |
NetworkInterfaceFactory(machine=self.vm, ipv4=ip1.ipv4) |
|
216 |
request = {"removeFloatingIp": {"address": ip1.ipv4}} |
|
217 |
response = self.post(url, self.vm.userid, json.dumps(request), "json") |
|
218 |
self.assertEqual(response.status_code, 202) |
|
219 |
# Yet used. Wait for the callbacks |
|
220 |
ip1_after = FloatingIP.objects.get(id=ip1.id) |
|
221 |
self.assertEqual(ip1_after.machine, self.vm) |
|
222 |
self.assertTrue(ip1_after.in_use()) |
Also available in: Unified diff