Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / tests / ports.py @ ba777b02

History | View | Annotate | Download (15.9 kB)

1 5db2001a Marios Kogias
# Copyright 2011-2013 GRNET S.A. All rights reserved.
2 5db2001a Marios Kogias
#
3 5db2001a Marios Kogias
# Redistribution and use in source and binary forms, with or
4 5db2001a Marios Kogias
# without modification, are permitted provided that the following
5 5db2001a Marios Kogias
# conditions are met:
6 5db2001a Marios Kogias
#
7 5db2001a Marios Kogias
#   1. Redistributions of source code must retain the above
8 5db2001a Marios Kogias
#      copyright notice, this list of conditions and the following
9 5db2001a Marios Kogias
#      disclaimer.
10 5db2001a Marios Kogias
#
11 5db2001a Marios Kogias
#   2. Redistributions in binary form must reproduce the above
12 5db2001a Marios Kogias
#      copyright notice, this list of conditions and the following
13 5db2001a Marios Kogias
#      disclaimer in the documentation and/or other materials
14 5db2001a Marios Kogias
#      provided with the distribution.
15 5db2001a Marios Kogias
#
16 5db2001a Marios Kogias
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 5db2001a Marios Kogias
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 5db2001a Marios Kogias
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 5db2001a Marios Kogias
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 5db2001a Marios Kogias
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 5db2001a Marios Kogias
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 5db2001a Marios Kogias
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 5db2001a Marios Kogias
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 5db2001a Marios Kogias
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 5db2001a Marios Kogias
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 5db2001a Marios Kogias
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 5db2001a Marios Kogias
# POSSIBILITY OF SUCH DAMAGE.
28 5db2001a Marios Kogias
#
29 5db2001a Marios Kogias
# The views and conclusions contained in the software and
30 5db2001a Marios Kogias
# documentation are those of the authors and should not be
31 5db2001a Marios Kogias
# interpreted as representing official policies, either expressed
32 5db2001a Marios Kogias
# or implied, of GRNET S.A.i
33 5db2001a Marios Kogias
34 f32e8021 Christos Stavrakakis
from django.conf import settings
35 f32e8021 Christos Stavrakakis
from snf_django.utils.testing import BaseAPITest, override_settings
36 593851e0 Buildbot
from django.utils import simplejson as json
37 593851e0 Buildbot
from synnefo.cyclades_settings import cyclades_services
38 593851e0 Buildbot
from synnefo.lib.services import get_service_path
39 593851e0 Buildbot
from synnefo.lib import join_urls
40 2c2d4f0a Christos Stavrakakis
from mock import patch
41 593851e0 Buildbot
import synnefo.db.models_factory as dbmf
42 593851e0 Buildbot
43 cdd6fc06 Christos Stavrakakis
NETWORK_URL = get_service_path(cyclades_services, 'network',
44 593851e0 Buildbot
                               version='v2.0')
45 cdd6fc06 Christos Stavrakakis
PORTS_URL = join_urls(NETWORK_URL, "ports/")
46 593851e0 Buildbot
47 593851e0 Buildbot
48 593851e0 Buildbot
class PortTest(BaseAPITest):
49 593851e0 Buildbot
    def test_get_ports(self):
50 593851e0 Buildbot
        url = join_urls(PORTS_URL)
51 593851e0 Buildbot
        response = self.get(url)
52 593851e0 Buildbot
        self.assertEqual(response.status_code, 200)
53 593851e0 Buildbot
        ports = json.loads(response.content)
54 593851e0 Buildbot
        self.assertEqual(ports, {"ports": []})
55 593851e0 Buildbot
56 593851e0 Buildbot
    def test_get_port_unfound(self):
57 593851e0 Buildbot
        url = join_urls(PORTS_URL, "123")
58 593851e0 Buildbot
        response = self.get(url)
59 593851e0 Buildbot
        self.assertEqual(response.status_code, 404)
60 593851e0 Buildbot
61 593851e0 Buildbot
    def test_get_port(self):
62 f32e8021 Christos Stavrakakis
        nic = dbmf.NetworkInterfaceFactory()
63 593851e0 Buildbot
        url = join_urls(PORTS_URL, str(nic.id))
64 09b76b7e Christos Stavrakakis
        response = self.get(url, user=nic.userid)
65 593851e0 Buildbot
        self.assertEqual(response.status_code, 200)
66 593851e0 Buildbot
67 2c2d4f0a Christos Stavrakakis
    @patch("synnefo.db.models.get_rapi_client")
68 2c2d4f0a Christos Stavrakakis
    def test_delete_port(self, mrapi):
69 f32e8021 Christos Stavrakakis
        nic = dbmf.NetworkInterfaceFactory(device_owner='vm')
70 593851e0 Buildbot
        url = join_urls(PORTS_URL, str(nic.id))
71 8c15a209 Christos Stavrakakis
        mrapi().ModifyInstance.return_value = 42
72 f32e8021 Christos Stavrakakis
        with override_settings(settings, GANETI_USE_HOTPLUG=True):
73 09b76b7e Christos Stavrakakis
            response = self.delete(url, user=nic.userid)
74 593851e0 Buildbot
        self.assertEqual(response.status_code, 204)
75 f32e8021 Christos Stavrakakis
        with override_settings(settings, GANETI_USE_HOTPLUG=False):
76 09b76b7e Christos Stavrakakis
            response = self.delete(url, user=nic.userid)
77 f32e8021 Christos Stavrakakis
        self.assertEqual(response.status_code, 400)
78 593851e0 Buildbot
79 a3b8aaf6 Marios Kogias
    def test_remove_nic_malformed(self):
80 a3b8aaf6 Marios Kogias
        url = join_urls(PORTS_URL, "123")
81 a3b8aaf6 Marios Kogias
        response = self.delete(url)
82 a3b8aaf6 Marios Kogias
        self.assertItemNotFound(response)
83 a3b8aaf6 Marios Kogias
84 593851e0 Buildbot
    def test_update_port_name(self):
85 f32e8021 Christos Stavrakakis
        nic = dbmf.NetworkInterfaceFactory(device_owner='vm')
86 593851e0 Buildbot
        url = join_urls(PORTS_URL, str(nic.id))
87 593851e0 Buildbot
        request = {'port': {"name": "test-name"}}
88 593851e0 Buildbot
        response = self.put(url, params=json.dumps(request),
89 09b76b7e Christos Stavrakakis
                            user=nic.userid)
90 593851e0 Buildbot
        self.assertEqual(response.status_code, 200)
91 593851e0 Buildbot
        res = json.loads(response.content)
92 593851e0 Buildbot
        self.assertEqual(res['port']['name'], "test-name")
93 593851e0 Buildbot
94 03d430b5 Christos Stavrakakis
    # def test_update_port_sg_unfound(self):
95 03d430b5 Christos Stavrakakis
    #     sg1 = dbmf.SecurityGroupFactory()
96 03d430b5 Christos Stavrakakis
    #     nic = dbmf.NetworkInterfaceFactory(device_owner='vm')
97 03d430b5 Christos Stavrakakis
    #     nic.security_groups.add(sg1)
98 03d430b5 Christos Stavrakakis
    #     nic.save()
99 03d430b5 Christos Stavrakakis
    #     url = join_urls(PORTS_URL, str(nic.id))
100 03d430b5 Christos Stavrakakis
    #     request = {'port': {"security_groups": ["123"]}}
101 03d430b5 Christos Stavrakakis
    #     response = self.put(url, params=json.dumps(request),
102 03d430b5 Christos Stavrakakis
    #                         user=nic.userid)
103 03d430b5 Christos Stavrakakis
    #     self.assertEqual(response.status_code, 404)
104 593851e0 Buildbot
105 03d430b5 Christos Stavrakakis
    # def test_update_port_sg(self):
106 03d430b5 Christos Stavrakakis
    #     sg1 = dbmf.SecurityGroupFactory()
107 03d430b5 Christos Stavrakakis
    #     sg2 = dbmf.SecurityGroupFactory()
108 03d430b5 Christos Stavrakakis
    #     sg3 = dbmf.SecurityGroupFactory()
109 03d430b5 Christos Stavrakakis
    #     nic = dbmf.NetworkInterfaceFactory(device_owner='vm')
110 03d430b5 Christos Stavrakakis
    #     nic.security_groups.add(sg1)
111 03d430b5 Christos Stavrakakis
    #     nic.save()
112 03d430b5 Christos Stavrakakis
    #     url = join_urls(PORTS_URL, str(nic.id))
113 03d430b5 Christos Stavrakakis
    #     request = {'port': {"security_groups": [str(sg2.id), str(sg3.id)]}}
114 03d430b5 Christos Stavrakakis
    #     response = self.put(url, params=json.dumps(request),
115 03d430b5 Christos Stavrakakis
    #                         user=nic.userid)
116 03d430b5 Christos Stavrakakis
    #     res = json.loads(response.content)
117 03d430b5 Christos Stavrakakis
    #     self.assertEqual(res['port']['security_groups'],
118 03d430b5 Christos Stavrakakis
    #                      [str(sg2.id), str(sg3.id)])
119 593851e0 Buildbot
120 593851e0 Buildbot
    def test_create_port_no_network(self):
121 593851e0 Buildbot
        request = {
122 593851e0 Buildbot
            "port": {
123 593851e0 Buildbot
                "device_id": "123",
124 593851e0 Buildbot
                "name": "port1",
125 593851e0 Buildbot
                "network_id": "123"
126 593851e0 Buildbot
            }
127 593851e0 Buildbot
        }
128 593851e0 Buildbot
        response = self.post(PORTS_URL, params=json.dumps(request))
129 593851e0 Buildbot
        self.assertEqual(response.status_code, 404)
130 593851e0 Buildbot
131 2c2d4f0a Christos Stavrakakis
    @patch("synnefo.db.models.get_rapi_client")
132 2c2d4f0a Christos Stavrakakis
    def test_create_port_private_net(self, mrapi):
133 f32e8021 Christos Stavrakakis
        net = dbmf.NetworkFactory(public=False)
134 f32e8021 Christos Stavrakakis
        dbmf.IPv4SubnetFactory(network=net)
135 f32e8021 Christos Stavrakakis
        dbmf.IPv6SubnetFactory(network=net)
136 f32e8021 Christos Stavrakakis
        sg1 = dbmf.SecurityGroupFactory()
137 f32e8021 Christos Stavrakakis
        sg2 = dbmf.SecurityGroupFactory()
138 f32e8021 Christos Stavrakakis
        vm = dbmf.VirtualMachineFactory(userid=net.userid)
139 593851e0 Buildbot
        request = {
140 593851e0 Buildbot
            "port": {
141 593851e0 Buildbot
                "name": "port1",
142 593851e0 Buildbot
                "network_id": str(net.id),
143 593851e0 Buildbot
                "device_id": str(vm.id),
144 593851e0 Buildbot
                "security_groups": [str(sg1.id), str(sg2.id)]
145 593851e0 Buildbot
            }
146 593851e0 Buildbot
        }
147 8c15a209 Christos Stavrakakis
        mrapi().ModifyInstance.return_value = 42
148 f32e8021 Christos Stavrakakis
        with override_settings(settings, GANETI_USE_HOTPLUG=False):
149 f32e8021 Christos Stavrakakis
            response = self.post(PORTS_URL, params=json.dumps(request),
150 f32e8021 Christos Stavrakakis
                                 user=net.userid)
151 f32e8021 Christos Stavrakakis
        self.assertEqual(response.status_code, 400)
152 f32e8021 Christos Stavrakakis
        with override_settings(settings, GANETI_USE_HOTPLUG=True):
153 f32e8021 Christos Stavrakakis
            response = self.post(PORTS_URL, params=json.dumps(request),
154 f32e8021 Christos Stavrakakis
                                 user=net.userid)
155 593851e0 Buildbot
        self.assertEqual(response.status_code, 201)
156 a3b8aaf6 Marios Kogias
157 9c74cc19 Marios Kogias
    def test_create_port_public_net_no_ip(self):
158 f32e8021 Christos Stavrakakis
        net = dbmf.NetworkFactory(public=True)
159 f32e8021 Christos Stavrakakis
        vm = dbmf.VirtualMachineFactory(userid=net.userid)
160 9c74cc19 Marios Kogias
        request = {
161 9c74cc19 Marios Kogias
            "port": {
162 9c74cc19 Marios Kogias
                "name": "port1",
163 9c74cc19 Marios Kogias
                "network_id": str(net.id),
164 9c74cc19 Marios Kogias
                "device_id": str(vm.id),
165 9c74cc19 Marios Kogias
            }
166 9c74cc19 Marios Kogias
        }
167 9c74cc19 Marios Kogias
        response = self.post(PORTS_URL, params=json.dumps(request),
168 9c74cc19 Marios Kogias
                             user=net.userid)
169 9c74cc19 Marios Kogias
        self.assertEqual(response.status_code, 400)
170 9c74cc19 Marios Kogias
171 9c74cc19 Marios Kogias
    def test_create_port_public_net_wrong_ip(self):
172 f32e8021 Christos Stavrakakis
        net = dbmf.NetworkFactory(public=True)
173 f32e8021 Christos Stavrakakis
        vm = dbmf.VirtualMachineFactory(userid=net.userid)
174 9c74cc19 Marios Kogias
        request = {
175 9c74cc19 Marios Kogias
            "port": {
176 9c74cc19 Marios Kogias
                "name": "port1",
177 9c74cc19 Marios Kogias
                "network_id": str(net.id),
178 9c74cc19 Marios Kogias
                "device_id": str(vm.id),
179 2c2d4f0a Christos Stavrakakis
                "fixed_ips": [{"ip_address": "8.8.8.8"}]
180 9c74cc19 Marios Kogias
            }
181 9c74cc19 Marios Kogias
        }
182 9c74cc19 Marios Kogias
        response = self.post(PORTS_URL, params=json.dumps(request),
183 9c74cc19 Marios Kogias
                             user=net.userid)
184 9c74cc19 Marios Kogias
        self.assertEqual(response.status_code, 404)
185 9c74cc19 Marios Kogias
186 9c74cc19 Marios Kogias
    def test_create_port_public_net_conflict(self):
187 f32e8021 Christos Stavrakakis
        net = dbmf.NetworkFactory(public=True)
188 9c74cc19 Marios Kogias
        fip = dbmf.FloatingIPFactory(nic=None, userid=net.userid)
189 f32e8021 Christos Stavrakakis
        vm = dbmf.VirtualMachineFactory(userid=net.userid)
190 9c74cc19 Marios Kogias
        request = {
191 9c74cc19 Marios Kogias
            "port": {
192 9c74cc19 Marios Kogias
                "name": "port1",
193 9c74cc19 Marios Kogias
                "network_id": str(net.id),
194 9c74cc19 Marios Kogias
                "device_id": str(vm.id),
195 2c2d4f0a Christos Stavrakakis
                "fixed_ips": [{"ip_address": fip.address}]
196 9c74cc19 Marios Kogias
            }
197 9c74cc19 Marios Kogias
        }
198 9c74cc19 Marios Kogias
        response = self.post(PORTS_URL, params=json.dumps(request),
199 9c74cc19 Marios Kogias
                             user=net.userid)
200 9c74cc19 Marios Kogias
        self.assertEqual(response.status_code, 409)
201 9c74cc19 Marios Kogias
202 9c74cc19 Marios Kogias
    def test_create_port_public_net_taken_ip(self):
203 f32e8021 Christos Stavrakakis
        net = dbmf.NetworkFactory(public=True)
204 9c74cc19 Marios Kogias
        fip = dbmf.FloatingIPFactory(network=net, userid=net.userid)
205 f32e8021 Christos Stavrakakis
        vm = dbmf.VirtualMachineFactory(userid=net.userid)
206 9c74cc19 Marios Kogias
        request = {
207 9c74cc19 Marios Kogias
            "port": {
208 9c74cc19 Marios Kogias
                "name": "port1",
209 9c74cc19 Marios Kogias
                "network_id": str(net.id),
210 9c74cc19 Marios Kogias
                "device_id": str(vm.id),
211 2c2d4f0a Christos Stavrakakis
                "fixed_ips": [{"ip_address": fip.address}]
212 9c74cc19 Marios Kogias
            }
213 9c74cc19 Marios Kogias
        }
214 9c74cc19 Marios Kogias
        response = self.post(PORTS_URL, params=json.dumps(request),
215 9c74cc19 Marios Kogias
                             user=net.userid)
216 f32e8021 Christos Stavrakakis
        self.assertEqual(response.status_code, 409)
217 9c74cc19 Marios Kogias
218 2c2d4f0a Christos Stavrakakis
    @patch("synnefo.db.models.get_rapi_client")
219 f32e8021 Christos Stavrakakis
    def test_create_port_with_floating_ip(self, mrapi):
220 f32e8021 Christos Stavrakakis
        vm = dbmf.VirtualMachineFactory()
221 f32e8021 Christos Stavrakakis
        fip = dbmf.FloatingIPFactory(network__public=True, nic=None,
222 f32e8021 Christos Stavrakakis
                                     userid=vm.userid)
223 9c74cc19 Marios Kogias
        request = {
224 9c74cc19 Marios Kogias
            "port": {
225 9c74cc19 Marios Kogias
                "name": "port1",
226 f32e8021 Christos Stavrakakis
                "network_id": str(fip.network_id),
227 9c74cc19 Marios Kogias
                "device_id": str(vm.id),
228 2c2d4f0a Christos Stavrakakis
                "fixed_ips": [{"ip_address": fip.address}]
229 9c74cc19 Marios Kogias
            }
230 9c74cc19 Marios Kogias
        }
231 8c15a209 Christos Stavrakakis
        mrapi().ModifyInstance.return_value = 42
232 f32e8021 Christos Stavrakakis
        with override_settings(settings, GANETI_USE_HOTPLUG=True):
233 f32e8021 Christos Stavrakakis
            response = self.post(PORTS_URL, params=json.dumps(request),
234 f32e8021 Christos Stavrakakis
                                 user=vm.userid)
235 2c2d4f0a Christos Stavrakakis
        self.assertEqual(response.status_code, 201)
236 9c74cc19 Marios Kogias
237 69c8d65d Christos Stavrakakis
    @patch("synnefo.db.models.get_rapi_client")
238 69c8d65d Christos Stavrakakis
    def test_create_port_with_address(self, mrapi):
239 69c8d65d Christos Stavrakakis
        """Test creation if IP address is specified."""
240 69c8d65d Christos Stavrakakis
        mrapi().ModifyInstance.return_value = 42
241 69c8d65d Christos Stavrakakis
        vm = dbmf.VirtualMachineFactory()
242 69c8d65d Christos Stavrakakis
        net = dbmf.NetworkWithSubnetFactory(userid=vm.userid,
243 69c8d65d Christos Stavrakakis
                                            public=False,
244 69c8d65d Christos Stavrakakis
                                            subnet__cidr="192.168.2.0/24",
245 f8ce6d44 Christos Stavrakakis
                                            subnet__gateway=None,
246 69c8d65d Christos Stavrakakis
                                            subnet__pool__size=1,
247 69c8d65d Christos Stavrakakis
                                            subnet__pool__offset=1)
248 69c8d65d Christos Stavrakakis
        request = {
249 69c8d65d Christos Stavrakakis
            "port": {
250 69c8d65d Christos Stavrakakis
                "name": "port_with_address",
251 69c8d65d Christos Stavrakakis
                "network_id": str(net.id),
252 69c8d65d Christos Stavrakakis
                "device_id": str(vm.id),
253 69c8d65d Christos Stavrakakis
                "fixed_ips": [{"ip_address": "192.168.2.1"}]
254 69c8d65d Christos Stavrakakis
            }
255 69c8d65d Christos Stavrakakis
        }
256 69c8d65d Christos Stavrakakis
        with override_settings(settings, GANETI_USE_HOTPLUG=True):
257 69c8d65d Christos Stavrakakis
            response = self.post(PORTS_URL, params=json.dumps(request),
258 69c8d65d Christos Stavrakakis
                                 user=vm.userid)
259 69c8d65d Christos Stavrakakis
        self.assertEqual(response.status_code, 201)
260 69c8d65d Christos Stavrakakis
        new_port_ip = json.loads(response.content)["port"]["fixed_ips"][0]
261 69c8d65d Christos Stavrakakis
        self.assertEqual(new_port_ip["ip_address"], "192.168.2.1")
262 69c8d65d Christos Stavrakakis
263 69c8d65d Christos Stavrakakis
        # But 409 if address is already used
264 69c8d65d Christos Stavrakakis
        with override_settings(settings, GANETI_USE_HOTPLUG=True):
265 69c8d65d Christos Stavrakakis
            response = self.post(PORTS_URL, params=json.dumps(request),
266 69c8d65d Christos Stavrakakis
                                 user=vm.userid)
267 69c8d65d Christos Stavrakakis
        self.assertConflict(response)
268 69c8d65d Christos Stavrakakis
269 69c8d65d Christos Stavrakakis
        # And bad request if IPv6 address is specified
270 69c8d65d Christos Stavrakakis
        request["port"]["fixed_ips"][0]["ip_address"] = "babe::"
271 69c8d65d Christos Stavrakakis
        with override_settings(settings, GANETI_USE_HOTPLUG=True):
272 69c8d65d Christos Stavrakakis
            response = self.post(PORTS_URL, params=json.dumps(request),
273 69c8d65d Christos Stavrakakis
                                 user=vm.userid)
274 69c8d65d Christos Stavrakakis
        self.assertBadRequest(response)
275 69c8d65d Christos Stavrakakis
276 fae6e5f0 Christos Stavrakakis
    def test_create_port_without_device(self):
277 fae6e5f0 Christos Stavrakakis
        net = dbmf.NetworkWithSubnetFactory(userid="test_user",
278 fae6e5f0 Christos Stavrakakis
                                            public=False,
279 fae6e5f0 Christos Stavrakakis
                                            subnet__cidr="192.168.2.0/24",
280 f8ce6d44 Christos Stavrakakis
                                            subnet__gateway=None,
281 fae6e5f0 Christos Stavrakakis
                                            subnet__pool__size=3,
282 fae6e5f0 Christos Stavrakakis
                                            subnet__pool__offset=1)
283 fae6e5f0 Christos Stavrakakis
        request = {
284 fae6e5f0 Christos Stavrakakis
            "port": {
285 fae6e5f0 Christos Stavrakakis
                "name": "port_with_address",
286 fae6e5f0 Christos Stavrakakis
                "network_id": str(net.id),
287 fae6e5f0 Christos Stavrakakis
            }
288 fae6e5f0 Christos Stavrakakis
        }
289 fae6e5f0 Christos Stavrakakis
        response = self.post(PORTS_URL, params=json.dumps(request),
290 fae6e5f0 Christos Stavrakakis
                             user="test_user")
291 fae6e5f0 Christos Stavrakakis
        self.assertEqual(response.status_code, 201)
292 fae6e5f0 Christos Stavrakakis
        new_port = json.loads(response.content)["port"]
293 fae6e5f0 Christos Stavrakakis
        self.assertEqual(new_port["device_id"], None)
294 fae6e5f0 Christos Stavrakakis
        # And with address
295 fae6e5f0 Christos Stavrakakis
        request["port"]["fixed_ips"] = [{"ip_address": "192.168.2.2"}]
296 fae6e5f0 Christos Stavrakakis
        with override_settings(settings, GANETI_USE_HOTPLUG=True):
297 fae6e5f0 Christos Stavrakakis
            response = self.post(PORTS_URL, params=json.dumps(request),
298 fae6e5f0 Christos Stavrakakis
                                 user="test_user")
299 fae6e5f0 Christos Stavrakakis
        self.assertEqual(response.status_code, 201)
300 fae6e5f0 Christos Stavrakakis
        new_port = json.loads(response.content)["port"]
301 fae6e5f0 Christos Stavrakakis
        self.assertEqual(new_port["device_id"], None)
302 fae6e5f0 Christos Stavrakakis
        self.assertEqual(new_port["fixed_ips"][0]["ip_address"], "192.168.2.2")
303 fae6e5f0 Christos Stavrakakis
304 a3b8aaf6 Marios Kogias
    def test_add_nic_to_deleted_network(self):
305 a3b8aaf6 Marios Kogias
        user = 'userr'
306 a3b8aaf6 Marios Kogias
        vm = dbmf.VirtualMachineFactory(name='yo', userid=user,
307 2c2d4f0a Christos Stavrakakis
                                        operstate="ACTIVE")
308 a3b8aaf6 Marios Kogias
        net = dbmf.NetworkFactory(state='ACTIVE', userid=user,
309 2c2d4f0a Christos Stavrakakis
                                  deleted=True)
310 a3b8aaf6 Marios Kogias
        request = {
311 a3b8aaf6 Marios Kogias
            "port": {
312 a3b8aaf6 Marios Kogias
                "device_id": str(vm.id),
313 a3b8aaf6 Marios Kogias
                "name": "port1",
314 a3b8aaf6 Marios Kogias
                "network_id": str(net.id)
315 a3b8aaf6 Marios Kogias
            }
316 a3b8aaf6 Marios Kogias
        }
317 a3b8aaf6 Marios Kogias
        response = self.post(PORTS_URL, params=json.dumps(request),
318 a3b8aaf6 Marios Kogias
                             user=net.userid)
319 a3b8aaf6 Marios Kogias
        self.assertBadRequest(response)
320 a3b8aaf6 Marios Kogias
321 a3b8aaf6 Marios Kogias
    def test_add_nic_to_public_network(self):
322 a3b8aaf6 Marios Kogias
        user = 'userr'
323 a3b8aaf6 Marios Kogias
        vm = dbmf.VirtualMachineFactory(name='yo', userid=user)
324 a3b8aaf6 Marios Kogias
        net = dbmf.NetworkFactory(state='ACTIVE', userid=user, public=True)
325 a3b8aaf6 Marios Kogias
        request = {
326 a3b8aaf6 Marios Kogias
            "port": {
327 a3b8aaf6 Marios Kogias
                "device_id": str(vm.id),
328 a3b8aaf6 Marios Kogias
                "name": "port1",
329 a3b8aaf6 Marios Kogias
                "network_id": str(net.id)
330 a3b8aaf6 Marios Kogias
            }
331 a3b8aaf6 Marios Kogias
        }
332 a3b8aaf6 Marios Kogias
        response = self.post(PORTS_URL, params=json.dumps(request),
333 a3b8aaf6 Marios Kogias
                             user=net.userid)
334 2c2d4f0a Christos Stavrakakis
        self.assertBadRequest(response)
335 2c2d4f0a Christos Stavrakakis
        #self.assertFault(response, 403, 'forbidden')
336 a3b8aaf6 Marios Kogias
337 a3b8aaf6 Marios Kogias
    def test_add_nic_malformed_2(self):
338 a3b8aaf6 Marios Kogias
        user = 'userr'
339 a3b8aaf6 Marios Kogias
        vm = dbmf.VirtualMachineFactory(name='yo', userid=user)
340 a3b8aaf6 Marios Kogias
        net = dbmf.NetworkFactory(state='ACTIVE', userid=user)
341 a3b8aaf6 Marios Kogias
        request = {
342 a3b8aaf6 Marios Kogias
            "port": {
343 a3b8aaf6 Marios Kogias
                "device_id": str(vm.id),
344 a3b8aaf6 Marios Kogias
                "name": "port1"
345 a3b8aaf6 Marios Kogias
            }
346 a3b8aaf6 Marios Kogias
        }
347 a3b8aaf6 Marios Kogias
        response = self.post(PORTS_URL, params=json.dumps(request),
348 a3b8aaf6 Marios Kogias
                             user=net.userid)
349 a3b8aaf6 Marios Kogias
        self.assertBadRequest(response)
350 a3b8aaf6 Marios Kogias
351 a3b8aaf6 Marios Kogias
    def test_add_nic_not_active(self):
352 a3b8aaf6 Marios Kogias
        """Test connecting VM to non-active network"""
353 a3b8aaf6 Marios Kogias
        user = 'dummy'
354 a3b8aaf6 Marios Kogias
        vm = dbmf.VirtualMachineFactory(name='yo', userid=user)
355 a3b8aaf6 Marios Kogias
        net = dbmf.NetworkFactory(state='PENDING', userid=user)
356 a3b8aaf6 Marios Kogias
        request = {
357 a3b8aaf6 Marios Kogias
            "port": {
358 a3b8aaf6 Marios Kogias
                "device_id": str(vm.id),
359 a3b8aaf6 Marios Kogias
                "name": "port1",
360 a3b8aaf6 Marios Kogias
                "network_id": str(net.id)
361 a3b8aaf6 Marios Kogias
            }
362 a3b8aaf6 Marios Kogias
        }
363 a3b8aaf6 Marios Kogias
        response = self.post(PORTS_URL, params=json.dumps(request),
364 a3b8aaf6 Marios Kogias
                             user=net.userid)
365 a3b8aaf6 Marios Kogias
        # Test that returns BuildInProgress
366 a3b8aaf6 Marios Kogias
        self.assertEqual(response.status_code, 409)
367 a3b8aaf6 Marios Kogias
368 a3b8aaf6 Marios Kogias
#    def test_add_nic_full_network(self, mrapi):
369 a3b8aaf6 Marios Kogias
#        """Test connecting VM to a full network"""
370 a3b8aaf6 Marios Kogias
#        user = 'userr'
371 a3b8aaf6 Marios Kogias
#        vm = dbmf.VirtualMachineFactory(name='yo', userid=user,
372 a3b8aaf6 Marios Kogias
#                                            operstate="STARTED")
373 a3b8aaf6 Marios Kogias
#        net = dbmf.NetworkFactory(state='ACTIVE', subnet='10.0.0.0/30',
374 a3b8aaf6 Marios Kogias
#                                      userid=user, dhcp=True)
375 a3b8aaf6 Marios Kogias
#        pool = net.get_pool()
376 a3b8aaf6 Marios Kogias
#        while not pool.empty():
377 a3b8aaf6 Marios Kogias
#            pool.get()
378 a3b8aaf6 Marios Kogias
#        pool.save()
379 a3b8aaf6 Marios Kogias
#        pool = net.get_pool()
380 a3b8aaf6 Marios Kogias
#        self.assertTrue(pool.empty())
381 a3b8aaf6 Marios Kogias
#        request = {'add': {'serverRef': vm.id}}
382 a3b8aaf6 Marios Kogias
#        response = self.mypost('networks/%d/action' % net.id,
383 a3b8aaf6 Marios Kogias
#                               net.userid, json.dumps(request), 'json')
384 a3b8aaf6 Marios Kogias
#        # Test that returns OverLimit
385 a3b8aaf6 Marios Kogias
#        self.assertEqual(response.status_code, 413)
386 a3b8aaf6 Marios Kogias
#        self.assertFalse(mrapi.called)