Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / test / networks.py @ a95c82a9

History | View | Annotate | Download (19.8 kB)

1 039e3e61 Christos Stavrakakis
# Copyright 2012 GRNET S.A. All rights reserved.
2 039e3e61 Christos Stavrakakis
#
3 039e3e61 Christos Stavrakakis
# Redistribution and use in source and binary forms, with or
4 039e3e61 Christos Stavrakakis
# without modification, are permitted provided that the following
5 039e3e61 Christos Stavrakakis
# conditions are met:
6 039e3e61 Christos Stavrakakis
#
7 039e3e61 Christos Stavrakakis
#   1. Redistributions of source code must retain the above
8 039e3e61 Christos Stavrakakis
#      copyright notice, this list of conditions and the following
9 039e3e61 Christos Stavrakakis
#      disclaimer.
10 039e3e61 Christos Stavrakakis
#
11 039e3e61 Christos Stavrakakis
#   2. Redistributions in binary form must reproduce the above
12 039e3e61 Christos Stavrakakis
#      copyright notice, this list of conditions and the following
13 039e3e61 Christos Stavrakakis
#      disclaimer in the documentation and/or other materials
14 039e3e61 Christos Stavrakakis
#      provided with the distribution.
15 039e3e61 Christos Stavrakakis
#
16 039e3e61 Christos Stavrakakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 039e3e61 Christos Stavrakakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 039e3e61 Christos Stavrakakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 039e3e61 Christos Stavrakakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 039e3e61 Christos Stavrakakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 039e3e61 Christos Stavrakakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 039e3e61 Christos Stavrakakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 039e3e61 Christos Stavrakakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 039e3e61 Christos Stavrakakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 039e3e61 Christos Stavrakakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 039e3e61 Christos Stavrakakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 039e3e61 Christos Stavrakakis
# POSSIBILITY OF SUCH DAMAGE.
28 039e3e61 Christos Stavrakakis
#
29 039e3e61 Christos Stavrakakis
# The views and conclusions contained in the software and
30 039e3e61 Christos Stavrakakis
# documentation are those of the authors and should not be
31 039e3e61 Christos Stavrakakis
# interpreted as representing official policies, either expressed
32 039e3e61 Christos Stavrakakis
# or implied, of GRNET S.A.
33 039e3e61 Christos Stavrakakis
34 039e3e61 Christos Stavrakakis
import json
35 039e3e61 Christos Stavrakakis
from mock import patch
36 039e3e61 Christos Stavrakakis
37 184a2a8c Christos Stavrakakis
from snf_django.utils.testing import BaseAPITest, mocked_quotaholder
38 039e3e61 Christos Stavrakakis
from synnefo.db.models import Network, NetworkInterface
39 039e3e61 Christos Stavrakakis
from synnefo.db import models_factory as mfactory
40 7d2fdab9 Georgios D. Tsoukalas
from synnefo.cyclades_settings import cyclades_services
41 7d2fdab9 Georgios D. Tsoukalas
from synnefo.lib.services import get_service_path
42 7d2fdab9 Georgios D. Tsoukalas
from synnefo.lib import join_urls
43 7d2fdab9 Georgios D. Tsoukalas
44 7d2fdab9 Georgios D. Tsoukalas
45 7d2fdab9 Georgios D. Tsoukalas
class ComputeAPITest(BaseAPITest):
46 7d2fdab9 Georgios D. Tsoukalas
    def setUp(self, *args, **kwargs):
47 7d2fdab9 Georgios D. Tsoukalas
        super(ComputeAPITest, self).setUp(*args, **kwargs)
48 7d2fdab9 Georgios D. Tsoukalas
        self.compute_path = get_service_path(cyclades_services, 'compute',
49 7d2fdab9 Georgios D. Tsoukalas
                                             version='v2.0')
50 7d2fdab9 Georgios D. Tsoukalas
    def myget(self, path, *args, **kwargs):
51 7d2fdab9 Georgios D. Tsoukalas
        path = join_urls(self.compute_path, path)
52 7d2fdab9 Georgios D. Tsoukalas
        return self.get(path, *args, **kwargs)
53 7d2fdab9 Georgios D. Tsoukalas
54 7d2fdab9 Georgios D. Tsoukalas
    def myput(self, path, *args, **kwargs):
55 7d2fdab9 Georgios D. Tsoukalas
        path = join_urls(self.compute_path, path)
56 7d2fdab9 Georgios D. Tsoukalas
        return self.put(path, *args, **kwargs)
57 7d2fdab9 Georgios D. Tsoukalas
58 7d2fdab9 Georgios D. Tsoukalas
    def mypost(self, path, *args, **kwargs):
59 7d2fdab9 Georgios D. Tsoukalas
        path = join_urls(self.compute_path, path)
60 7d2fdab9 Georgios D. Tsoukalas
        return self.post(path, *args, **kwargs)
61 7d2fdab9 Georgios D. Tsoukalas
62 7d2fdab9 Georgios D. Tsoukalas
    def mydelete(self, path, *args, **kwargs):
63 7d2fdab9 Georgios D. Tsoukalas
        path = join_urls(self.compute_path, path)
64 7d2fdab9 Georgios D. Tsoukalas
        return self.delete(path, *args, **kwargs)
65 039e3e61 Christos Stavrakakis
66 039e3e61 Christos Stavrakakis
67 039e3e61 Christos Stavrakakis
@patch('synnefo.logic.rapi_pool.GanetiRapiClient')
68 7d2fdab9 Georgios D. Tsoukalas
class NetworkAPITest(ComputeAPITest):
69 039e3e61 Christos Stavrakakis
    def setUp(self):
70 039e3e61 Christos Stavrakakis
        self.mac_prefixes = mfactory.MacPrefixPoolTableFactory()
71 ac47eef6 Christos Stavrakakis
        self.bridges = mfactory.BridgePoolTableFactory(base="link")
72 039e3e61 Christos Stavrakakis
        self.user = 'dummy-user'
73 039e3e61 Christos Stavrakakis
        self.net1 = mfactory.NetworkFactory(userid=self.user)
74 039e3e61 Christos Stavrakakis
        self.vm1 = mfactory.VirtualMachineFactory(userid=self.user)
75 039e3e61 Christos Stavrakakis
        self.nic1 = mfactory.NetworkInterfaceFactory(network=self.net1,
76 039e3e61 Christos Stavrakakis
                                                     machine=self.vm1)
77 039e3e61 Christos Stavrakakis
        self.nic2 = mfactory.NetworkInterfaceFactory(network=self.net1,
78 039e3e61 Christos Stavrakakis
                                                     machine=self.vm1)
79 039e3e61 Christos Stavrakakis
        self.net2 = mfactory.NetworkFactory(userid=self.user)
80 039e3e61 Christos Stavrakakis
        self.nic3 = mfactory.NetworkInterfaceFactory(network=self.net2)
81 7d2fdab9 Georgios D. Tsoukalas
        super(NetworkAPITest, self).setUp()
82 039e3e61 Christos Stavrakakis
83 039e3e61 Christos Stavrakakis
    def assertNetworksEqual(self, db_net, api_net, detail=False):
84 039e3e61 Christos Stavrakakis
        self.assertEqual(str(db_net.id), api_net["id"])
85 039e3e61 Christos Stavrakakis
        self.assertEqual(db_net.name, api_net['name'])
86 039e3e61 Christos Stavrakakis
        if detail:
87 039e3e61 Christos Stavrakakis
            self.assertEqual(db_net.state, api_net['status'])
88 039e3e61 Christos Stavrakakis
            self.assertEqual(db_net.flavor, api_net['type'])
89 039e3e61 Christos Stavrakakis
            self.assertEqual(db_net.subnet, api_net['cidr'])
90 039e3e61 Christos Stavrakakis
            self.assertEqual(db_net.subnet6, api_net['cidr6'])
91 039e3e61 Christos Stavrakakis
            self.assertEqual(db_net.gateway, api_net['gateway'])
92 039e3e61 Christos Stavrakakis
            self.assertEqual(db_net.gateway6, api_net['gateway6'])
93 039e3e61 Christos Stavrakakis
            self.assertEqual(db_net.dhcp, api_net['dhcp'])
94 039e3e61 Christos Stavrakakis
            self.assertEqual(db_net.public, api_net['public'])
95 039e3e61 Christos Stavrakakis
            db_nics = ["nic-%d-%d" % (nic.machine.id, nic.index) for nic in
96 039e3e61 Christos Stavrakakis
                       db_net.nics.filter(machine__userid=db_net.userid)]
97 2d04422f Christos Stavrakakis
            self.assertEqual(db_nics, api_net['attachments'])
98 039e3e61 Christos Stavrakakis
99 039e3e61 Christos Stavrakakis
    def test_create_network_1(self, mrapi):
100 039e3e61 Christos Stavrakakis
        request = {
101 4e1133ab Christos Stavrakakis
            'network': {'name': 'foo', "type": "MAC_FILTERED"}
102 4e1133ab Christos Stavrakakis
        }
103 184a2a8c Christos Stavrakakis
        with mocked_quotaholder():
104 7d2fdab9 Georgios D. Tsoukalas
            response = self.mypost('networks/', 'user1',
105 7d2fdab9 Georgios D. Tsoukalas
                                   json.dumps(request), 'json')
106 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
107 039e3e61 Christos Stavrakakis
        db_networks = Network.objects.filter(userid='user1')
108 039e3e61 Christos Stavrakakis
        self.assertEqual(len(db_networks), 1)
109 039e3e61 Christos Stavrakakis
        db_net = db_networks[0]
110 039e3e61 Christos Stavrakakis
        api_net = json.loads(response.content)['network']
111 039e3e61 Christos Stavrakakis
        self.assertNetworksEqual(db_net, api_net)
112 039e3e61 Christos Stavrakakis
        mrapi.CreateNetwork.assert_called()
113 039e3e61 Christos Stavrakakis
        mrapi.ConnectNetwork.assert_called()
114 039e3e61 Christos Stavrakakis
115 039e3e61 Christos Stavrakakis
    def test_invalid_data_1(self, mrapi):
116 039e3e61 Christos Stavrakakis
        """Test invalid flavor"""
117 039e3e61 Christos Stavrakakis
        request = {
118 039e3e61 Christos Stavrakakis
            'network': {'name': 'foo', 'type': 'LoLo'}
119 039e3e61 Christos Stavrakakis
            }
120 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/', 'user1',
121 7d2fdab9 Georgios D. Tsoukalas
                               json.dumps(request), 'json')
122 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
123 039e3e61 Christos Stavrakakis
        self.assertEqual(len(Network.objects.filter(userid='user1')), 0)
124 039e3e61 Christos Stavrakakis
125 039e3e61 Christos Stavrakakis
    def test_invalid_data_2(self, mrapi):
126 4e1133ab Christos Stavrakakis
        """Test invalid data/subnet"""
127 039e3e61 Christos Stavrakakis
        request = {
128 4e1133ab Christos Stavrakakis
            'network': {'name': 'foo',
129 4e1133ab Christos Stavrakakis
                        'cidr': '10.0.0.0/8', "type":
130 4e1133ab Christos Stavrakakis
                        "MAC_FILTERED"}
131 4e1133ab Christos Stavrakakis
        }
132 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/', 'user1',
133 7d2fdab9 Georgios D. Tsoukalas
                               json.dumps(request), 'json')
134 039e3e61 Christos Stavrakakis
        self.assertFault(response, 413, "overLimit")
135 039e3e61 Christos Stavrakakis
136 039e3e61 Christos Stavrakakis
    def test_invalid_data_3(self, mrapi):
137 039e3e61 Christos Stavrakakis
        """Test unauthorized to create public network"""
138 039e3e61 Christos Stavrakakis
        request = {
139 4e1133ab Christos Stavrakakis
                'network': {'name': 'foo',
140 4e1133ab Christos Stavrakakis
                            "public": "True",
141 4e1133ab Christos Stavrakakis
                            "type": "MAC_FILTERED"}
142 039e3e61 Christos Stavrakakis
            }
143 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/', 'user1',
144 7d2fdab9 Georgios D. Tsoukalas
                               json.dumps(request), 'json')
145 039e3e61 Christos Stavrakakis
        self.assertFault(response, 403, "forbidden")
146 039e3e61 Christos Stavrakakis
147 039e3e61 Christos Stavrakakis
    def test_invalid_data_4(self, mrapi):
148 039e3e61 Christos Stavrakakis
        """Test unauthorized to create network not in settings"""
149 039e3e61 Christos Stavrakakis
        request = {
150 039e3e61 Christos Stavrakakis
                'network': {'name': 'foo', 'type': 'CUSTOM'}
151 039e3e61 Christos Stavrakakis
            }
152 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/', 'user1',
153 7d2fdab9 Georgios D. Tsoukalas
                               json.dumps(request), 'json')
154 039e3e61 Christos Stavrakakis
        self.assertFault(response, 403, "forbidden")
155 039e3e61 Christos Stavrakakis
156 d368ec0c Christos Stavrakakis
    def test_invalid_subnet(self, mrapi):
157 d368ec0c Christos Stavrakakis
        """Test invalid subnet"""
158 d368ec0c Christos Stavrakakis
        request = {
159 4e1133ab Christos Stavrakakis
            'network': {'name': 'foo',
160 4e1133ab Christos Stavrakakis
                        'cidr': '10.0.0.10/27',
161 4e1133ab Christos Stavrakakis
                        "type": "MAC_FILTERED"}
162 4e1133ab Christos Stavrakakis
        }
163 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/', 'user1',
164 7d2fdab9 Georgios D. Tsoukalas
                               json.dumps(request), 'json')
165 d368ec0c Christos Stavrakakis
        self.assertBadRequest(response)
166 d368ec0c Christos Stavrakakis
167 9ae613af Christos Stavrakakis
    def test_invalid_gateway_1(self, mrapi):
168 9ae613af Christos Stavrakakis
        request = {
169 9ae613af Christos Stavrakakis
            'network': {'name': 'foo',
170 9ae613af Christos Stavrakakis
                        'cidr': '10.0.0.0/28',
171 9ae613af Christos Stavrakakis
                        'gateway': '10.0.0.0.300'}
172 9ae613af Christos Stavrakakis
        }
173 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/', 'user1',
174 7d2fdab9 Georgios D. Tsoukalas
                               json.dumps(request), 'json')
175 9ae613af Christos Stavrakakis
        self.assertBadRequest(response)
176 9ae613af Christos Stavrakakis
177 9ae613af Christos Stavrakakis
    def test_invalid_gateway_2(self, mrapi):
178 9ae613af Christos Stavrakakis
        request = {
179 9ae613af Christos Stavrakakis
            'network': {'name': 'foo',
180 9ae613af Christos Stavrakakis
                        'cidr': '10.0.0.0/28',
181 9ae613af Christos Stavrakakis
                        'gateway': '10.2.0.1'}
182 9ae613af Christos Stavrakakis
        }
183 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/', 'user1',
184 7d2fdab9 Georgios D. Tsoukalas
                               json.dumps(request), 'json')
185 9ae613af Christos Stavrakakis
        self.assertBadRequest(response)
186 9ae613af Christos Stavrakakis
187 9ae613af Christos Stavrakakis
    def test_invalid_network6(self, mrapi):
188 9ae613af Christos Stavrakakis
        request = {
189 9ae613af Christos Stavrakakis
            'network': {'name': 'foo',
190 9ae613af Christos Stavrakakis
                        'cidr': '10.0.0.0/28',
191 9ae613af Christos Stavrakakis
                        'subnet6': '10.0.0.0/28',
192 9ae613af Christos Stavrakakis
                        'gateway': '10.2.0.1'}
193 9ae613af Christos Stavrakakis
        }
194 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/', 'user1',
195 7d2fdab9 Georgios D. Tsoukalas
                               json.dumps(request), 'json')
196 9ae613af Christos Stavrakakis
        self.assertBadRequest(response)
197 9ae613af Christos Stavrakakis
198 9ae613af Christos Stavrakakis
    def test_invalid_gateway6(self, mrapi):
199 9ae613af Christos Stavrakakis
        request = {
200 9ae613af Christos Stavrakakis
            'network': {'name': 'foo',
201 9ae613af Christos Stavrakakis
                        'cidr': '10.0.0.0/28',
202 9ae613af Christos Stavrakakis
                        'subnet6': '2001:0db8:0123:4567:89ab:cdef:1234:5678',
203 9ae613af Christos Stavrakakis
                        'gateway': '10.2.0.1'}
204 9ae613af Christos Stavrakakis
        }
205 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/', 'user1',
206 7d2fdab9 Georgios D. Tsoukalas
                               json.dumps(request), 'json')
207 9ae613af Christos Stavrakakis
        self.assertBadRequest(response)
208 9ae613af Christos Stavrakakis
209 039e3e61 Christos Stavrakakis
    def test_list_networks(self, mrapi):
210 039e3e61 Christos Stavrakakis
        """Test that expected list of networks is returned."""
211 039e3e61 Christos Stavrakakis
        # Create a deleted network
212 039e3e61 Christos Stavrakakis
        mfactory.NetworkFactory(userid=self.user, deleted=True)
213 039e3e61 Christos Stavrakakis
214 7d2fdab9 Georgios D. Tsoukalas
        response = self.myget('networks/', self.user)
215 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
216 039e3e61 Christos Stavrakakis
217 039e3e61 Christos Stavrakakis
        db_nets = Network.objects.filter(userid=self.user, deleted=False)
218 2d04422f Christos Stavrakakis
        api_nets = json.loads(response.content)["networks"]
219 039e3e61 Christos Stavrakakis
220 039e3e61 Christos Stavrakakis
        self.assertEqual(len(db_nets), len(api_nets))
221 039e3e61 Christos Stavrakakis
        for api_net in api_nets:
222 039e3e61 Christos Stavrakakis
            net_id = api_net['id']
223 039e3e61 Christos Stavrakakis
            self.assertNetworksEqual(Network.objects.get(id=net_id), api_net)
224 039e3e61 Christos Stavrakakis
225 039e3e61 Christos Stavrakakis
    def test_list_networks_detail(self, mrapi):
226 039e3e61 Christos Stavrakakis
        """Test that expected networks details are returned."""
227 039e3e61 Christos Stavrakakis
        # Create a deleted network
228 039e3e61 Christos Stavrakakis
        mfactory.NetworkFactory(userid=self.user, deleted=True)
229 039e3e61 Christos Stavrakakis
230 7d2fdab9 Georgios D. Tsoukalas
        response = self.myget('networks/detail', self.user)
231 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
232 039e3e61 Christos Stavrakakis
233 039e3e61 Christos Stavrakakis
        db_nets = Network.objects.filter(userid=self.user, deleted=False)
234 2d04422f Christos Stavrakakis
        api_nets = json.loads(response.content)["networks"]
235 039e3e61 Christos Stavrakakis
236 039e3e61 Christos Stavrakakis
        self.assertEqual(len(db_nets), len(api_nets))
237 039e3e61 Christos Stavrakakis
        for api_net in api_nets:
238 039e3e61 Christos Stavrakakis
            net_id = api_net['id']
239 039e3e61 Christos Stavrakakis
            self.assertNetworksEqual(Network.objects.get(id=net_id), api_net,
240 039e3e61 Christos Stavrakakis
                                     detail=True)
241 039e3e61 Christos Stavrakakis
242 939d71dd Christos Stavrakakis
    def test_get_network_building_nics(self, mrapi):
243 939d71dd Christos Stavrakakis
        net = mfactory.NetworkFactory()
244 939d71dd Christos Stavrakakis
        machine = mfactory.VirtualMachineFactory(userid=net.userid)
245 939d71dd Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(network=net, machine=machine,
246 939d71dd Christos Stavrakakis
                                         state="BUILDING")
247 7d2fdab9 Georgios D. Tsoukalas
        response = self.myget('networks/%d' % net.id, net.userid)
248 939d71dd Christos Stavrakakis
        self.assertSuccess(response)
249 939d71dd Christos Stavrakakis
        api_net = json.loads(response.content)["network"]
250 2d04422f Christos Stavrakakis
        self.assertEqual(len(api_net["attachments"]), 0)
251 939d71dd Christos Stavrakakis
252 039e3e61 Christos Stavrakakis
    def test_network_details_1(self, mrapi):
253 039e3e61 Christos Stavrakakis
        """Test that expected details for a network are returned"""
254 7d2fdab9 Georgios D. Tsoukalas
        response = self.myget('networks/%d' % self.net1.id, self.net1.userid)
255 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
256 039e3e61 Christos Stavrakakis
        api_net = json.loads(response.content)["network"]
257 039e3e61 Christos Stavrakakis
        self.assertNetworksEqual(self.net1, api_net, detail=True)
258 039e3e61 Christos Stavrakakis
259 039e3e61 Christos Stavrakakis
    def test_invalid_network(self, mrapi):
260 039e3e61 Christos Stavrakakis
        """Test details for non-existing network."""
261 7d2fdab9 Georgios D. Tsoukalas
        response = self.myget('networks/%d' % 42, self.net1.userid)
262 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
263 039e3e61 Christos Stavrakakis
264 039e3e61 Christos Stavrakakis
    def test_rename_network(self, mrapi):
265 039e3e61 Christos Stavrakakis
        request = {'network': {'name': "new_name"}}
266 7d2fdab9 Georgios D. Tsoukalas
        response = self.myput('networks/%d' % self.net2.id,
267 7d2fdab9 Georgios D. Tsoukalas
                              self.net2.userid, json.dumps(request), 'json')
268 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 204)
269 039e3e61 Christos Stavrakakis
        self.assertEqual(Network.objects.get(id=self.net2.id).name, "new_name")
270 039e3e61 Christos Stavrakakis
        # Check invalid
271 039e3e61 Christos Stavrakakis
        request = {'name': "new_name"}
272 7d2fdab9 Georgios D. Tsoukalas
        response = self.myput('networks/%d' % self.net2.id,
273 7d2fdab9 Georgios D. Tsoukalas
                              self.net2.userid, json.dumps(request), 'json')
274 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
275 039e3e61 Christos Stavrakakis
276 039e3e61 Christos Stavrakakis
    def test_rename_deleted_network(self, mrapi):
277 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(deleted=True)
278 039e3e61 Christos Stavrakakis
        request = {'network': {'name': "new_name"}}
279 7d2fdab9 Georgios D. Tsoukalas
        response = self.myput('networks/%d' % net.id,
280 7d2fdab9 Georgios D. Tsoukalas
                              net.userid, json.dumps(request), 'json')
281 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
282 039e3e61 Christos Stavrakakis
283 039e3e61 Christos Stavrakakis
    def test_rename_public_network(self, mrapi):
284 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(public=True)
285 039e3e61 Christos Stavrakakis
        request = {'network': {'name': "new_name"}}
286 7d2fdab9 Georgios D. Tsoukalas
        response = self.myput('networks/%d' % net.id,
287 7d2fdab9 Georgios D. Tsoukalas
                              self.net2.userid, json.dumps(request), 'json')
288 039e3e61 Christos Stavrakakis
        self.assertFault(response, 403, 'forbidden')
289 039e3e61 Christos Stavrakakis
290 039e3e61 Christos Stavrakakis
    def test_delete_network(self, mrapi):
291 ac47eef6 Christos Stavrakakis
        net = mfactory.NetworkFactory(deleted=False, state='ACTIVE',
292 ac47eef6 Christos Stavrakakis
                                      link="link-10")
293 c6c889f7 Christos Stavrakakis
        with mocked_quotaholder():
294 7d2fdab9 Georgios D. Tsoukalas
            response = self.mydelete('networks/%d' % net.id, net.userid)
295 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 204)
296 039e3e61 Christos Stavrakakis
        net = Network.objects.get(id=net.id, userid=net.userid)
297 039e3e61 Christos Stavrakakis
        self.assertEqual(net.action, 'DESTROY')
298 039e3e61 Christos Stavrakakis
        mrapi.DeleteNetwork.assert_called()
299 039e3e61 Christos Stavrakakis
300 039e3e61 Christos Stavrakakis
    def test_delete_public_network(self, mrapi):
301 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(public=True)
302 7d2fdab9 Georgios D. Tsoukalas
        response = self.mydelete('networks/%d' % net.id, self.net2.userid)
303 039e3e61 Christos Stavrakakis
        self.assertFault(response, 403, 'forbidden')
304 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
305 039e3e61 Christos Stavrakakis
306 039e3e61 Christos Stavrakakis
    def test_delete_deleted_network(self, mrapi):
307 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(deleted=True)
308 7d2fdab9 Georgios D. Tsoukalas
        response = self.mydelete('networks/%d' % net.id, net.userid)
309 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
310 039e3e61 Christos Stavrakakis
311 039e3e61 Christos Stavrakakis
    def test_delete_network_in_use(self, mrapi):
312 039e3e61 Christos Stavrakakis
        net = self.net1
313 7d2fdab9 Georgios D. Tsoukalas
        response = self.mydelete('networks/%d' % net.id, net.userid)
314 039e3e61 Christos Stavrakakis
        self.assertFault(response, 421, 'networkInUse')
315 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
316 039e3e61 Christos Stavrakakis
317 039e3e61 Christos Stavrakakis
    def test_add_nic(self, mrapi):
318 039e3e61 Christos Stavrakakis
        user = 'userr'
319 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
320 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user)
321 41a7fae7 Christos Stavrakakis
        mrapi().ModifyInstance.return_value = 1
322 039e3e61 Christos Stavrakakis
        request = {'add': {'serverRef': vm.id}}
323 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
324 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
325 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
326 039e3e61 Christos Stavrakakis
327 039e3e61 Christos Stavrakakis
    def test_add_nic_to_deleted_network(self, mrapi):
328 039e3e61 Christos Stavrakakis
        user = 'userr'
329 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
330 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user,
331 039e3e61 Christos Stavrakakis
                                      deleted=True)
332 039e3e61 Christos Stavrakakis
        request = {'add': {'serverRef': vm.id}}
333 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
334 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
335 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
336 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
337 039e3e61 Christos Stavrakakis
338 039e3e61 Christos Stavrakakis
    def test_add_nic_to_public_network(self, mrapi):
339 039e3e61 Christos Stavrakakis
        user = 'userr'
340 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
341 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user, public=True)
342 039e3e61 Christos Stavrakakis
        request = {'add': {'serverRef': vm.id}}
343 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
344 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
345 039e3e61 Christos Stavrakakis
        self.assertFault(response, 403, 'forbidden')
346 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
347 039e3e61 Christos Stavrakakis
348 039e3e61 Christos Stavrakakis
    def test_add_nic_malformed_1(self, mrapi):
349 039e3e61 Christos Stavrakakis
        user = 'userr'
350 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
351 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user)
352 039e3e61 Christos Stavrakakis
        request = {'add': {'serveRef': vm.id}}
353 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
354 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
355 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
356 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
357 039e3e61 Christos Stavrakakis
358 039e3e61 Christos Stavrakakis
    def test_add_nic_malformed_2(self, mrapi):
359 039e3e61 Christos Stavrakakis
        user = 'userr'
360 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
361 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user)
362 039e3e61 Christos Stavrakakis
        request = {'add': {'serveRef': [vm.id, 22]}}
363 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
364 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
365 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
366 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
367 039e3e61 Christos Stavrakakis
368 039e3e61 Christos Stavrakakis
    def test_add_nic_not_active(self, mrapi):
369 039e3e61 Christos Stavrakakis
        """Test connecting VM to non-active network"""
370 039e3e61 Christos Stavrakakis
        user = 'dummy'
371 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
372 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='PENDING', subnet='10.0.0.0/31',
373 039e3e61 Christos Stavrakakis
                                      userid=user)
374 41a7fae7 Christos Stavrakakis
        request = {'add': {'serverRef': vm.id}}
375 41a7fae7 Christos Stavrakakis
        response = self.mypost('/api/v1.1/networks/%d/action' % net.id,
376 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
377 039e3e61 Christos Stavrakakis
        # Test that returns BuildInProgress
378 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 409)
379 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
380 039e3e61 Christos Stavrakakis
381 039e3e61 Christos Stavrakakis
    def test_add_nic_full_network(self, mrapi):
382 039e3e61 Christos Stavrakakis
        """Test connecting VM to a full network"""
383 039e3e61 Christos Stavrakakis
        user = 'userr'
384 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user,
385 41a7fae7 Christos Stavrakakis
                                            operstate="STARTED")
386 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', subnet='10.0.0.0/30',
387 039e3e61 Christos Stavrakakis
                                      userid=user, dhcp=True)
388 039e3e61 Christos Stavrakakis
        pool = net.get_pool()
389 039e3e61 Christos Stavrakakis
        while not pool.empty():
390 039e3e61 Christos Stavrakakis
            pool.get()
391 039e3e61 Christos Stavrakakis
        pool.save()
392 039e3e61 Christos Stavrakakis
        pool = net.get_pool()
393 039e3e61 Christos Stavrakakis
        self.assertTrue(pool.empty())
394 039e3e61 Christos Stavrakakis
        request = {'add': {'serverRef': vm.id}}
395 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
396 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
397 039e3e61 Christos Stavrakakis
        # Test that returns OverLimit
398 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 413)
399 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
400 039e3e61 Christos Stavrakakis
401 039e3e61 Christos Stavrakakis
    def test_remove_nic(self, mrapi):
402 039e3e61 Christos Stavrakakis
        user = 'userr'
403 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
404 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user)
405 039e3e61 Christos Stavrakakis
        nic = mfactory.NetworkInterfaceFactory(machine=vm, network=net)
406 41a7fae7 Christos Stavrakakis
        mrapi().ModifyInstance.return_value = 1
407 039e3e61 Christos Stavrakakis
        request = {'remove': {'attachment': 'nic-%s-%s' % (vm.id, nic.index)}}
408 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
409 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
410 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
411 039e3e61 Christos Stavrakakis
        self.assertTrue(NetworkInterface.objects.get(id=nic.id).dirty)
412 41a7fae7 Christos Stavrakakis
        vm.task = None
413 41a7fae7 Christos Stavrakakis
        vm.task_job_id = None
414 41a7fae7 Christos Stavrakakis
        vm.save()
415 039e3e61 Christos Stavrakakis
        # Remove dirty nic
416 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
417 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
418 039e3e61 Christos Stavrakakis
        self.assertFault(response, 409, 'buildInProgress')
419 039e3e61 Christos Stavrakakis
420 039e3e61 Christos Stavrakakis
    def test_remove_nic_malformed(self, mrapi):
421 039e3e61 Christos Stavrakakis
        user = 'userr'
422 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
423 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user)
424 039e3e61 Christos Stavrakakis
        nic = mfactory.NetworkInterfaceFactory(machine=vm, network=net)
425 039e3e61 Christos Stavrakakis
        request = {'remove':
426 039e3e61 Christos Stavrakakis
                    {'att234achment': 'nic-%s-%s' % (vm.id, nic.index)}
427 039e3e61 Christos Stavrakakis
                  }
428 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
429 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
430 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
431 039e3e61 Christos Stavrakakis
432 039e3e61 Christos Stavrakakis
    def test_remove_nic_malformed_2(self, mrapi):
433 039e3e61 Christos Stavrakakis
        user = 'userr'
434 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
435 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user)
436 039e3e61 Christos Stavrakakis
        request = {'remove':
437 039e3e61 Christos Stavrakakis
                    {'attachment': 'nic-%s' % vm.id}
438 039e3e61 Christos Stavrakakis
                  }
439 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
440 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
441 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
442 a3accf03 Georgios D. Tsoukalas
443 a3accf03 Georgios D. Tsoukalas
    def test_catch_wrong_api_paths(self, *args):
444 a3accf03 Georgios D. Tsoukalas
        response = self.myget('nonexistent')
445 a3accf03 Georgios D. Tsoukalas
        self.assertEqual(response.status_code, 400)
446 a3accf03 Georgios D. Tsoukalas
        try:
447 a3accf03 Georgios D. Tsoukalas
            error = json.loads(response.content)
448 a3accf03 Georgios D. Tsoukalas
        except ValueError:
449 a3accf03 Georgios D. Tsoukalas
            self.assertTrue(False)
450 16437e4d Kostas Papadimitriou
451 16437e4d Kostas Papadimitriou
    def test_method_not_allowed(self, *args):
452 16437e4d Kostas Papadimitriou
        # /networks/ allows only POST, GET
453 16437e4d Kostas Papadimitriou
        response = self.myput('networks', '', '')
454 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
455 16437e4d Kostas Papadimitriou
        response = self.mydelete('networks')
456 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
457 16437e4d Kostas Papadimitriou
458 16437e4d Kostas Papadimitriou
        # /networks/<srvid>/ allows only GET, PUT, DELETE
459 16437e4d Kostas Papadimitriou
        response = self.mypost("networks/42")
460 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)