Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / tests / floating_ips.py @ 92d2d1ce

History | View | Annotate | Download (14.8 kB)

1 acda838e Christos Stavrakakis
# Copyright 2012 GRNET S.A. All rights reserved.
2 acda838e Christos Stavrakakis
#
3 acda838e Christos Stavrakakis
# Redistribution and use in source and binary forms, with or
4 acda838e Christos Stavrakakis
# without modification, are permitted provided that the following
5 acda838e Christos Stavrakakis
# conditions are met:
6 acda838e Christos Stavrakakis
#
7 acda838e Christos Stavrakakis
#   1. Redistributions of source code must retain the above
8 acda838e Christos Stavrakakis
#      copyright notice, this list of conditions and the following
9 acda838e Christos Stavrakakis
#      disclaimer.
10 acda838e Christos Stavrakakis
#
11 acda838e Christos Stavrakakis
#   2. Redistributions in binary form must reproduce the above
12 acda838e Christos Stavrakakis
#      copyright notice, this list of conditions and the following
13 acda838e Christos Stavrakakis
#      disclaimer in the documentation and/or other materials
14 acda838e Christos Stavrakakis
#      provided with the distribution.
15 acda838e Christos Stavrakakis
#
16 acda838e Christos Stavrakakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 acda838e Christos Stavrakakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 acda838e Christos Stavrakakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 acda838e Christos Stavrakakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 acda838e Christos Stavrakakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 acda838e Christos Stavrakakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 acda838e Christos Stavrakakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 acda838e Christos Stavrakakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 acda838e Christos Stavrakakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 acda838e Christos Stavrakakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 acda838e Christos Stavrakakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 acda838e Christos Stavrakakis
# POSSIBILITY OF SUCH DAMAGE.
28 acda838e Christos Stavrakakis
#
29 acda838e Christos Stavrakakis
# The views and conclusions contained in the software and
30 acda838e Christos Stavrakakis
# documentation are those of the authors and should not be
31 acda838e Christos Stavrakakis
# interpreted as representing official policies, either expressed
32 acda838e Christos Stavrakakis
# or implied, of GRNET S.A.
33 acda838e Christos Stavrakakis
34 acda838e Christos Stavrakakis
import json
35 acda838e Christos Stavrakakis
36 acda838e Christos Stavrakakis
from snf_django.utils.testing import BaseAPITest, mocked_quotaholder
37 326c3ec8 Christos Stavrakakis
from synnefo.db.models import IPAddress
38 92d2d1ce Christos Stavrakakis
from synnefo.db.models_factory import (FloatingIPFactory, NetworkFactory,
39 a95c82a9 Christos Stavrakakis
                                       VirtualMachineFactory,
40 9e8be4fb Christos Stavrakakis
                                       NetworkInterfaceFactory,
41 9e8be4fb Christos Stavrakakis
                                       BackendNetworkFactory)
42 e57893cd Christos Stavrakakis
from mock import patch, Mock
43 9115d567 Christos Stavrakakis
from functools import partial
44 acda838e Christos Stavrakakis
45 2cd55da6 Christos Stavrakakis
from synnefo.cyclades_settings import cyclades_services
46 2cd55da6 Christos Stavrakakis
from synnefo.lib.services import get_service_path
47 2cd55da6 Christos Stavrakakis
from synnefo.lib import join_urls
48 acda838e Christos Stavrakakis
49 2cd55da6 Christos Stavrakakis
50 2cd55da6 Christos Stavrakakis
compute_path = get_service_path(cyclades_services, "compute", version="v2.0")
51 2cd55da6 Christos Stavrakakis
URL = join_urls(compute_path, "os-floating-ips")
52 2cd55da6 Christos Stavrakakis
NETWORKS_URL = join_urls(compute_path, "networks")
53 2cd55da6 Christos Stavrakakis
SERVERS_URL = join_urls(compute_path, "servers")
54 acda838e Christos Stavrakakis
55 92d2d1ce Christos Stavrakakis
56 92d2d1ce Christos Stavrakakis
floating_ips = IPAddress.objects.filter(floating_ip=True)
57 92d2d1ce Christos Stavrakakis
FloatingIPPoolFactory = partial(NetworkFactory, public=True, deleted=False,
58 9115d567 Christos Stavrakakis
                                floating_ip_pool=True)
59 9115d567 Christos Stavrakakis
60 acda838e Christos Stavrakakis
61 92d2d1ce Christos Stavrakakis
class FloatingIPAPITest(BaseAPITest):
62 acda838e Christos Stavrakakis
    def test_no_floating_ip(self):
63 acda838e Christos Stavrakakis
        response = self.get(URL)
64 acda838e Christos Stavrakakis
        self.assertSuccess(response)
65 acda838e Christos Stavrakakis
        self.assertEqual(json.loads(response.content)["floating_ips"], [])
66 acda838e Christos Stavrakakis
67 acda838e Christos Stavrakakis
    def test_list_ips(self):
68 92d2d1ce Christos Stavrakakis
        ip = FloatingIPFactory(userid="user1")
69 92d2d1ce Christos Stavrakakis
        FloatingIPFactory(userid="user1", deleted=True)
70 acda838e Christos Stavrakakis
        with mocked_quotaholder():
71 acda838e Christos Stavrakakis
            response = self.get(URL, "user1")
72 acda838e Christos Stavrakakis
        self.assertSuccess(response)
73 acda838e Christos Stavrakakis
        api_ip = json.loads(response.content)["floating_ips"][0]
74 acda838e Christos Stavrakakis
        self.assertEqual(api_ip,
75 acda838e Christos Stavrakakis
                         {"instance_id": str(ip.machine.id), "ip": ip.ipv4,
76 acda838e Christos Stavrakakis
                          "fixed_ip": None, "id": str(ip.id),  "pool":
77 acda838e Christos Stavrakakis
                          str(ip.network.id)})
78 acda838e Christos Stavrakakis
79 acda838e Christos Stavrakakis
    def test_get_ip(self):
80 92d2d1ce Christos Stavrakakis
        ip = FloatingIPFactory(userid="user1")
81 acda838e Christos Stavrakakis
        with mocked_quotaholder():
82 acda838e Christos Stavrakakis
            response = self.get(URL + "/%s" % ip.id, "user1")
83 acda838e Christos Stavrakakis
        self.assertSuccess(response)
84 acda838e Christos Stavrakakis
        api_ip = json.loads(response.content)["floating_ip"]
85 acda838e Christos Stavrakakis
        self.assertEqual(api_ip,
86 acda838e Christos Stavrakakis
                         {"instance_id": str(ip.machine.id), "ip": ip.ipv4,
87 acda838e Christos Stavrakakis
                          "fixed_ip": None, "id": str(ip.id),  "pool":
88 acda838e Christos Stavrakakis
                          str(ip.network.id)})
89 acda838e Christos Stavrakakis
90 acda838e Christos Stavrakakis
    def test_wrong_user(self):
91 92d2d1ce Christos Stavrakakis
        ip = FloatingIPFactory(userid="user1")
92 acda838e Christos Stavrakakis
        with mocked_quotaholder():
93 acda838e Christos Stavrakakis
            response = self.delete(URL + "/%s" % ip.id, "user2")
94 acda838e Christos Stavrakakis
        self.assertItemNotFound(response)
95 acda838e Christos Stavrakakis
96 acda838e Christos Stavrakakis
    def test_deleted_ip(self):
97 92d2d1ce Christos Stavrakakis
        ip = FloatingIPFactory(userid="user1", deleted=True)
98 acda838e Christos Stavrakakis
        with mocked_quotaholder():
99 acda838e Christos Stavrakakis
            response = self.delete(URL + "/%s" % ip.id, "user1")
100 acda838e Christos Stavrakakis
        self.assertItemNotFound(response)
101 acda838e Christos Stavrakakis
102 acda838e Christos Stavrakakis
    def test_reserve(self):
103 92d2d1ce Christos Stavrakakis
        net = FloatingIPPoolFactory(userid="test_user",
104 9115d567 Christos Stavrakakis
                                    subnet="192.168.2.0/24",
105 9115d567 Christos Stavrakakis
                                    gateway=None)
106 acda838e Christos Stavrakakis
        request = {'pool': net.id}
107 acda838e Christos Stavrakakis
        with mocked_quotaholder():
108 acda838e Christos Stavrakakis
            response = self.post(URL, "test_user", json.dumps(request), "json")
109 acda838e Christos Stavrakakis
        self.assertSuccess(response)
110 92d2d1ce Christos Stavrakakis
        ip = floating_ips.get()
111 acda838e Christos Stavrakakis
        self.assertEqual(ip.ipv4, "192.168.2.1")
112 acda838e Christos Stavrakakis
        self.assertEqual(ip.machine, None)
113 acda838e Christos Stavrakakis
        self.assertEqual(ip.network, net)
114 acda838e Christos Stavrakakis
        self.assertEqual(json.loads(response.content)["floating_ip"],
115 acda838e Christos Stavrakakis
                         {"instance_id": None, "ip": "192.168.2.1",
116 9582e68e Christos Stavrakakis
                          "fixed_ip": None, "id": str(ip.id),
117 9582e68e Christos Stavrakakis
                          "pool": str(net.id)})
118 acda838e Christos Stavrakakis
119 9e8be4fb Christos Stavrakakis
    def test_reserve_no_pool(self):
120 9e8be4fb Christos Stavrakakis
        # No networks
121 9e8be4fb Christos Stavrakakis
        with mocked_quotaholder():
122 9e8be4fb Christos Stavrakakis
            response = self.post(URL, "test_user", json.dumps({}), "json")
123 9e8be4fb Christos Stavrakakis
        self.assertFault(response, 413, "overLimit")
124 9e8be4fb Christos Stavrakakis
        # Full network
125 92d2d1ce Christos Stavrakakis
        FloatingIPPoolFactory(userid="test_user",
126 9115d567 Christos Stavrakakis
                              subnet="192.168.2.0/32",
127 9115d567 Christos Stavrakakis
                              gateway=None)
128 9e8be4fb Christos Stavrakakis
        with mocked_quotaholder():
129 9e8be4fb Christos Stavrakakis
            response = self.post(URL, "test_user", json.dumps({}), "json")
130 9e8be4fb Christos Stavrakakis
        self.assertFault(response, 413, "overLimit")
131 9e8be4fb Christos Stavrakakis
        # Success
132 92d2d1ce Christos Stavrakakis
        net2 = FloatingIPPoolFactory(userid="test_user",
133 9115d567 Christos Stavrakakis
                                     subnet="192.168.2.0/24",
134 9115d567 Christos Stavrakakis
                                     gateway=None)
135 9e8be4fb Christos Stavrakakis
        with mocked_quotaholder():
136 9e8be4fb Christos Stavrakakis
            response = self.post(URL, "test_user", json.dumps({}), "json")
137 9115d567 Christos Stavrakakis
        self.assertSuccess(response)
138 92d2d1ce Christos Stavrakakis
        ip = floating_ips.get()
139 9e8be4fb Christos Stavrakakis
        self.assertEqual(json.loads(response.content)["floating_ip"],
140 9e8be4fb Christos Stavrakakis
                         {"instance_id": None, "ip": "192.168.2.1",
141 9582e68e Christos Stavrakakis
                          "fixed_ip": None, "id": str(ip.id),
142 9582e68e Christos Stavrakakis
                          "pool": str(net2.id)})
143 9e8be4fb Christos Stavrakakis
144 acda838e Christos Stavrakakis
    def test_reserve_full(self):
145 92d2d1ce Christos Stavrakakis
        net = FloatingIPPoolFactory(userid="test_user",
146 9115d567 Christos Stavrakakis
                                    subnet="192.168.2.0/32")
147 acda838e Christos Stavrakakis
        request = {'pool': net.id}
148 acda838e Christos Stavrakakis
        with mocked_quotaholder():
149 acda838e Christos Stavrakakis
            response = self.post(URL, "test_user", json.dumps(request), "json")
150 acda838e Christos Stavrakakis
        self.assertEqual(response.status_code, 413)
151 acda838e Christos Stavrakakis
152 a3d99af0 Christos Stavrakakis
    def test_reserve_with_address(self):
153 92d2d1ce Christos Stavrakakis
        net = FloatingIPPoolFactory(userid="test_user",
154 9115d567 Christos Stavrakakis
                                    subnet="192.168.2.0/24")
155 a3d99af0 Christos Stavrakakis
        request = {'pool': net.id, "address": "192.168.2.10"}
156 a3d99af0 Christos Stavrakakis
        with mocked_quotaholder():
157 a3d99af0 Christos Stavrakakis
            response = self.post(URL, "test_user", json.dumps(request), "json")
158 a3d99af0 Christos Stavrakakis
        self.assertSuccess(response)
159 92d2d1ce Christos Stavrakakis
        ip = floating_ips.get()
160 a3d99af0 Christos Stavrakakis
        self.assertEqual(json.loads(response.content)["floating_ip"],
161 a3d99af0 Christos Stavrakakis
                         {"instance_id": None, "ip": "192.168.2.10",
162 9582e68e Christos Stavrakakis
                          "fixed_ip": None, "id": str(ip.id), "pool":
163 9582e68e Christos Stavrakakis
                          str(net.id)})
164 a3d99af0 Christos Stavrakakis
165 a3d99af0 Christos Stavrakakis
        # Already reserved
166 92d2d1ce Christos Stavrakakis
        FloatingIPFactory(network=net, ipv4="192.168.2.3")
167 a3d99af0 Christos Stavrakakis
        request = {'pool': net.id, "address": "192.168.2.3"}
168 a3d99af0 Christos Stavrakakis
        with mocked_quotaholder():
169 a3d99af0 Christos Stavrakakis
            response = self.post(URL, "test_user", json.dumps(request), "json")
170 a3d99af0 Christos Stavrakakis
        self.assertFault(response, 409, "conflict")
171 a3d99af0 Christos Stavrakakis
172 a3d99af0 Christos Stavrakakis
        # Already used
173 a3d99af0 Christos Stavrakakis
        pool = net.get_pool()
174 a3d99af0 Christos Stavrakakis
        pool.reserve("192.168.2.5")
175 a3d99af0 Christos Stavrakakis
        pool.save()
176 a3d99af0 Christos Stavrakakis
        # ..by another_user
177 a3d99af0 Christos Stavrakakis
        nic = NetworkInterfaceFactory(network=net, ipv4="192.168.2.5",
178 a3d99af0 Christos Stavrakakis
                                      machine__userid="test2")
179 a3d99af0 Christos Stavrakakis
        request = {'pool': net.id, "address": "192.168.2.5"}
180 a3d99af0 Christos Stavrakakis
        with mocked_quotaholder():
181 a3d99af0 Christos Stavrakakis
            response = self.post(URL, "test_user", json.dumps(request), "json")
182 a3d99af0 Christos Stavrakakis
        self.assertFault(response, 409, "conflict")
183 a3d99af0 Christos Stavrakakis
        # ..and by him
184 a3d99af0 Christos Stavrakakis
        nic.delete()
185 a3d99af0 Christos Stavrakakis
        NetworkInterfaceFactory(network=net, ipv4="192.168.2.5",
186 a3d99af0 Christos Stavrakakis
                                machine__userid="test_user")
187 a3d99af0 Christos Stavrakakis
        request = {'pool': net.id, "address": "192.168.2.5"}
188 a3d99af0 Christos Stavrakakis
        with mocked_quotaholder():
189 a3d99af0 Christos Stavrakakis
            response = self.post(URL, "test_user", json.dumps(request), "json")
190 a3d99af0 Christos Stavrakakis
        self.assertSuccess(response)
191 a3d99af0 Christos Stavrakakis
192 a3d99af0 Christos Stavrakakis
        # Address out of pool
193 a3d99af0 Christos Stavrakakis
        request = {'pool': net.id, "address": "192.168.3.5"}
194 a3d99af0 Christos Stavrakakis
        with mocked_quotaholder():
195 a3d99af0 Christos Stavrakakis
            response = self.post(URL, "test_user", json.dumps(request), "json")
196 a3d99af0 Christos Stavrakakis
        self.assertBadRequest(response)
197 a3d99af0 Christos Stavrakakis
198 acda838e Christos Stavrakakis
    def test_release_in_use(self):
199 92d2d1ce Christos Stavrakakis
        ip = FloatingIPFactory()
200 a95c82a9 Christos Stavrakakis
        vm = ip.machine
201 a95c82a9 Christos Stavrakakis
        vm.operstate = "ACTIVE"
202 a95c82a9 Christos Stavrakakis
        vm.userid = ip.userid
203 a95c82a9 Christos Stavrakakis
        vm.save()
204 a95c82a9 Christos Stavrakakis
        vm.nics.create(index=0, ipv4=ip.ipv4, network=ip.network,
205 a95c82a9 Christos Stavrakakis
                       state="ACTIVE")
206 a95c82a9 Christos Stavrakakis
        with mocked_quotaholder():
207 a95c82a9 Christos Stavrakakis
            response = self.delete(URL + "/%s" % ip.id, ip.userid)
208 a95c82a9 Christos Stavrakakis
        self.assertFault(response, 409, "conflict")
209 a95c82a9 Christos Stavrakakis
        # Also send a notification to remove the NIC and assert that FIP is in
210 a95c82a9 Christos Stavrakakis
        # use until notification from ganeti arrives
211 a95c82a9 Christos Stavrakakis
        request = {"removeFloatingIp": {"address": ip.ipv4}}
212 2cd55da6 Christos Stavrakakis
        url = SERVERS_URL + "/%s/action" % vm.id
213 a95c82a9 Christos Stavrakakis
        with patch('synnefo.logic.rapi_pool.GanetiRapiClient') as c:
214 a95c82a9 Christos Stavrakakis
            c().ModifyInstance.return_value = 10
215 a95c82a9 Christos Stavrakakis
            response = self.post(url, vm.userid, json.dumps(request),
216 a95c82a9 Christos Stavrakakis
                                 "json")
217 a95c82a9 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
218 acda838e Christos Stavrakakis
        with mocked_quotaholder():
219 acda838e Christos Stavrakakis
            response = self.delete(URL + "/%s" % ip.id, ip.userid)
220 acda838e Christos Stavrakakis
        self.assertFault(response, 409, "conflict")
221 acda838e Christos Stavrakakis
222 acda838e Christos Stavrakakis
    def test_release(self):
223 92d2d1ce Christos Stavrakakis
        ip = FloatingIPFactory(machine=None)
224 acda838e Christos Stavrakakis
        with mocked_quotaholder():
225 acda838e Christos Stavrakakis
            response = self.delete(URL + "/%s" % ip.id, ip.userid)
226 acda838e Christos Stavrakakis
        self.assertSuccess(response)
227 92d2d1ce Christos Stavrakakis
        ips_after = floating_ips.filter(id=ip.id)
228 acda838e Christos Stavrakakis
        self.assertEqual(len(ips_after), 0)
229 7d368e73 Christos Stavrakakis
230 e57893cd Christos Stavrakakis
    @patch("synnefo.logic.backend", Mock())
231 e57893cd Christos Stavrakakis
    def test_delete_network_with_floating_ips(self):
232 92d2d1ce Christos Stavrakakis
        ip = FloatingIPFactory(machine=None, network__flavor="IP_LESS_ROUTED")
233 e57893cd Christos Stavrakakis
        net = ip.network
234 e57893cd Christos Stavrakakis
        # Can not remove network with floating IPs
235 e57893cd Christos Stavrakakis
        with mocked_quotaholder():
236 2cd55da6 Christos Stavrakakis
            response = self.delete(NETWORKS_URL + "/%s" % net.id,
237 e57893cd Christos Stavrakakis
                                   net.userid)
238 e57893cd Christos Stavrakakis
        self.assertFault(response, 421, "networkInUse")
239 e57893cd Christos Stavrakakis
        # But we can with only deleted Floating Ips
240 e57893cd Christos Stavrakakis
        ip.deleted = True
241 e57893cd Christos Stavrakakis
        ip.save()
242 e57893cd Christos Stavrakakis
        with mocked_quotaholder():
243 2cd55da6 Christos Stavrakakis
            response = self.delete(NETWORKS_URL + "/%s" % net.id,
244 e57893cd Christos Stavrakakis
                                   net.userid)
245 e57893cd Christos Stavrakakis
        self.assertSuccess(response)
246 e57893cd Christos Stavrakakis
247 7d368e73 Christos Stavrakakis
248 2cd55da6 Christos Stavrakakis
POOLS_URL = join_urls(compute_path, "os-floating-ip-pools")
249 7d368e73 Christos Stavrakakis
250 7d368e73 Christos Stavrakakis
251 92d2d1ce Christos Stavrakakis
class FloatingIPPoolsAPITest(BaseAPITest):
252 7d368e73 Christos Stavrakakis
    def test_no_pool(self):
253 7d368e73 Christos Stavrakakis
        response = self.get(POOLS_URL)
254 7d368e73 Christos Stavrakakis
        self.assertSuccess(response)
255 7d368e73 Christos Stavrakakis
        self.assertEqual(json.loads(response.content)["floating_ip_pools"], [])
256 7d368e73 Christos Stavrakakis
257 7d368e73 Christos Stavrakakis
    def test_list_pools(self):
258 92d2d1ce Christos Stavrakakis
        net = FloatingIPPoolFactory(subnet="192.168.0.0/30",
259 0ace35e4 Christos Stavrakakis
                                    gateway="192.168.0.1")
260 7d368e73 Christos Stavrakakis
        NetworkFactory(public=True, deleted=True)
261 7d368e73 Christos Stavrakakis
        NetworkFactory(public=False, deleted=False)
262 9115d567 Christos Stavrakakis
        NetworkFactory(public=True, deleted=False)
263 7d368e73 Christos Stavrakakis
        response = self.get(POOLS_URL)
264 7d368e73 Christos Stavrakakis
        self.assertSuccess(response)
265 7d368e73 Christos Stavrakakis
        self.assertEqual(json.loads(response.content)["floating_ip_pools"],
266 0ace35e4 Christos Stavrakakis
                         [{"name": str(net.id), "size": 4, "free": 1}])
267 a95c82a9 Christos Stavrakakis
268 a95c82a9 Christos Stavrakakis
269 92d2d1ce Christos Stavrakakis
class FloatingIPActionsTest(BaseAPITest):
270 a95c82a9 Christos Stavrakakis
    def setUp(self):
271 a95c82a9 Christos Stavrakakis
        vm = VirtualMachineFactory()
272 a95c82a9 Christos Stavrakakis
        vm.operstate = "ACTIVE"
273 a95c82a9 Christos Stavrakakis
        vm.save()
274 a95c82a9 Christos Stavrakakis
        self.vm = vm
275 a95c82a9 Christos Stavrakakis
276 a95c82a9 Christos Stavrakakis
    def test_bad_request(self):
277 2cd55da6 Christos Stavrakakis
        url = SERVERS_URL + "/%s/action" % self.vm.id
278 a95c82a9 Christos Stavrakakis
        response = self.post(url, self.vm.userid, json.dumps({}), "json")
279 a95c82a9 Christos Stavrakakis
        self.assertBadRequest(response)
280 a95c82a9 Christos Stavrakakis
        response = self.post(url, self.vm.userid,
281 a95c82a9 Christos Stavrakakis
                             json.dumps({"addFloatingIp": {}}),
282 a95c82a9 Christos Stavrakakis
                             "json")
283 a95c82a9 Christos Stavrakakis
        self.assertBadRequest(response)
284 a95c82a9 Christos Stavrakakis
285 a95c82a9 Christos Stavrakakis
    @patch('synnefo.logic.rapi_pool.GanetiRapiClient')
286 a95c82a9 Christos Stavrakakis
    def test_add_floating_ip(self, mock):
287 a95c82a9 Christos Stavrakakis
        # Not exists
288 2cd55da6 Christos Stavrakakis
        url = SERVERS_URL + "/%s/action" % self.vm.id
289 a95c82a9 Christos Stavrakakis
        request = {"addFloatingIp": {"address": "10.0.0.1"}}
290 a95c82a9 Christos Stavrakakis
        response = self.post(url, self.vm.userid, json.dumps(request), "json")
291 a95c82a9 Christos Stavrakakis
        self.assertItemNotFound(response)
292 a95c82a9 Christos Stavrakakis
        # In use
293 a95c82a9 Christos Stavrakakis
        vm1 = VirtualMachineFactory()
294 92d2d1ce Christos Stavrakakis
        ip1 = FloatingIPFactory(userid=self.vm.userid, machine=vm1)
295 9e8be4fb Christos Stavrakakis
        BackendNetworkFactory(network=ip1.network, backend=vm1.backend,
296 9e8be4fb Christos Stavrakakis
                              operstate='ACTIVE')
297 a95c82a9 Christos Stavrakakis
        request = {"addFloatingIp": {"address": ip1.ipv4}}
298 a95c82a9 Christos Stavrakakis
        response = self.post(url, self.vm.userid, json.dumps(request), "json")
299 a95c82a9 Christos Stavrakakis
        self.assertFault(response, 409, "conflict")
300 a95c82a9 Christos Stavrakakis
        # Success
301 92d2d1ce Christos Stavrakakis
        ip1 = FloatingIPFactory(userid=self.vm.userid, machine=None)
302 9e8be4fb Christos Stavrakakis
        BackendNetworkFactory(network=ip1.network, backend=self.vm.backend,
303 9e8be4fb Christos Stavrakakis
                              operstate='ACTIVE')
304 a95c82a9 Christos Stavrakakis
        request = {"addFloatingIp": {"address": ip1.ipv4}}
305 f8675683 Christos Stavrakakis
        mock().ModifyInstance.return_value = 1
306 a95c82a9 Christos Stavrakakis
        response = self.post(url, self.vm.userid, json.dumps(request), "json")
307 a95c82a9 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
308 92d2d1ce Christos Stavrakakis
        ip1_after = floating_ips.get(id=ip1.id)
309 a95c82a9 Christos Stavrakakis
        self.assertEqual(ip1_after.machine, self.vm)
310 a95c82a9 Christos Stavrakakis
        self.assertTrue(ip1_after.in_use())
311 c4ed6248 Christos Stavrakakis
        nic = self.vm.nics.get(ipv4=ip1_after.ipv4)
312 c4ed6248 Christos Stavrakakis
        nic.state = "ACTIVE"
313 c4ed6248 Christos Stavrakakis
        nic.save()
314 78c165cf Christos Stavrakakis
        response = self.get(SERVERS_URL + "/%s" % self.vm.id,
315 78c165cf Christos Stavrakakis
                            self.vm.userid)
316 78c165cf Christos Stavrakakis
        self.assertSuccess(response)
317 78c165cf Christos Stavrakakis
        nic = json.loads(response.content)["server"]["attachments"][0]
318 78c165cf Christos Stavrakakis
        self.assertEqual(nic["OS-EXT-IPS:type"], "floating")
319 a95c82a9 Christos Stavrakakis
320 a95c82a9 Christos Stavrakakis
    @patch('synnefo.logic.rapi_pool.GanetiRapiClient')
321 a95c82a9 Christos Stavrakakis
    def test_remove_floating_ip(self, mock):
322 a95c82a9 Christos Stavrakakis
        # Not exists
323 2cd55da6 Christos Stavrakakis
        url = SERVERS_URL + "/%s/action" % self.vm.id
324 a95c82a9 Christos Stavrakakis
        request = {"removeFloatingIp": {"address": "10.0.0.1"}}
325 a95c82a9 Christos Stavrakakis
        response = self.post(url, self.vm.userid, json.dumps(request), "json")
326 a95c82a9 Christos Stavrakakis
        self.assertItemNotFound(response)
327 a95c82a9 Christos Stavrakakis
        # Not In Use
328 92d2d1ce Christos Stavrakakis
        ip1 = FloatingIPFactory(userid=self.vm.userid, machine=None)
329 a95c82a9 Christos Stavrakakis
        request = {"removeFloatingIp": {"address": ip1.ipv4}}
330 a95c82a9 Christos Stavrakakis
        response = self.post(url, self.vm.userid, json.dumps(request), "json")
331 a95c82a9 Christos Stavrakakis
        self.assertItemNotFound(response)
332 a95c82a9 Christos Stavrakakis
        # Success
333 92d2d1ce Christos Stavrakakis
        ip1 = FloatingIPFactory(userid=self.vm.userid, machine=self.vm)
334 a95c82a9 Christos Stavrakakis
        NetworkInterfaceFactory(machine=self.vm, ipv4=ip1.ipv4)
335 a95c82a9 Christos Stavrakakis
        request = {"removeFloatingIp": {"address": ip1.ipv4}}
336 f8675683 Christos Stavrakakis
        mock().ModifyInstance.return_value = 2
337 a95c82a9 Christos Stavrakakis
        response = self.post(url, self.vm.userid, json.dumps(request), "json")
338 a95c82a9 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
339 a95c82a9 Christos Stavrakakis
        # Yet used. Wait for the callbacks
340 92d2d1ce Christos Stavrakakis
        ip1_after = floating_ips.get(id=ip1.id)
341 a95c82a9 Christos Stavrakakis
        self.assertEqual(ip1_after.machine, self.vm)
342 a95c82a9 Christos Stavrakakis
        self.assertTrue(ip1_after.in_use())