Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (19.9 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 2cd55da6 Christos Stavrakakis
    def __init__(self, *args, **kwargs):
47 2cd55da6 Christos Stavrakakis
        super(ComputeAPITest, self).__init__(*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 2cd55da6 Christos Stavrakakis
51 7d2fdab9 Georgios D. Tsoukalas
    def myget(self, path, *args, **kwargs):
52 7d2fdab9 Georgios D. Tsoukalas
        path = join_urls(self.compute_path, path)
53 7d2fdab9 Georgios D. Tsoukalas
        return self.get(path, *args, **kwargs)
54 7d2fdab9 Georgios D. Tsoukalas
55 7d2fdab9 Georgios D. Tsoukalas
    def myput(self, path, *args, **kwargs):
56 7d2fdab9 Georgios D. Tsoukalas
        path = join_urls(self.compute_path, path)
57 7d2fdab9 Georgios D. Tsoukalas
        return self.put(path, *args, **kwargs)
58 7d2fdab9 Georgios D. Tsoukalas
59 7d2fdab9 Georgios D. Tsoukalas
    def mypost(self, path, *args, **kwargs):
60 7d2fdab9 Georgios D. Tsoukalas
        path = join_urls(self.compute_path, path)
61 7d2fdab9 Georgios D. Tsoukalas
        return self.post(path, *args, **kwargs)
62 7d2fdab9 Georgios D. Tsoukalas
63 7d2fdab9 Georgios D. Tsoukalas
    def mydelete(self, path, *args, **kwargs):
64 7d2fdab9 Georgios D. Tsoukalas
        path = join_urls(self.compute_path, path)
65 7d2fdab9 Georgios D. Tsoukalas
        return self.delete(path, *args, **kwargs)
66 039e3e61 Christos Stavrakakis
67 039e3e61 Christos Stavrakakis
68 039e3e61 Christos Stavrakakis
@patch('synnefo.logic.rapi_pool.GanetiRapiClient')
69 7d2fdab9 Georgios D. Tsoukalas
class NetworkAPITest(ComputeAPITest):
70 039e3e61 Christos Stavrakakis
    def setUp(self):
71 039e3e61 Christos Stavrakakis
        self.mac_prefixes = mfactory.MacPrefixPoolTableFactory()
72 ac47eef6 Christos Stavrakakis
        self.bridges = mfactory.BridgePoolTableFactory(base="link")
73 039e3e61 Christos Stavrakakis
        self.user = 'dummy-user'
74 039e3e61 Christos Stavrakakis
        self.net1 = mfactory.NetworkFactory(userid=self.user)
75 039e3e61 Christos Stavrakakis
        self.vm1 = mfactory.VirtualMachineFactory(userid=self.user)
76 039e3e61 Christos Stavrakakis
        self.nic1 = mfactory.NetworkInterfaceFactory(network=self.net1,
77 039e3e61 Christos Stavrakakis
                                                     machine=self.vm1)
78 039e3e61 Christos Stavrakakis
        self.nic2 = mfactory.NetworkInterfaceFactory(network=self.net1,
79 039e3e61 Christos Stavrakakis
                                                     machine=self.vm1)
80 039e3e61 Christos Stavrakakis
        self.net2 = mfactory.NetworkFactory(userid=self.user)
81 039e3e61 Christos Stavrakakis
        self.nic3 = mfactory.NetworkInterfaceFactory(network=self.net2)
82 7d2fdab9 Georgios D. Tsoukalas
        super(NetworkAPITest, self).setUp()
83 039e3e61 Christos Stavrakakis
84 039e3e61 Christos Stavrakakis
    def assertNetworksEqual(self, db_net, api_net, detail=False):
85 039e3e61 Christos Stavrakakis
        self.assertEqual(str(db_net.id), api_net["id"])
86 039e3e61 Christos Stavrakakis
        self.assertEqual(db_net.name, api_net['name'])
87 039e3e61 Christos Stavrakakis
        if detail:
88 039e3e61 Christos Stavrakakis
            self.assertEqual(db_net.state, api_net['status'])
89 039e3e61 Christos Stavrakakis
            self.assertEqual(db_net.flavor, api_net['type'])
90 039e3e61 Christos Stavrakakis
            self.assertEqual(db_net.subnet, api_net['cidr'])
91 039e3e61 Christos Stavrakakis
            self.assertEqual(db_net.subnet6, api_net['cidr6'])
92 039e3e61 Christos Stavrakakis
            self.assertEqual(db_net.gateway, api_net['gateway'])
93 039e3e61 Christos Stavrakakis
            self.assertEqual(db_net.gateway6, api_net['gateway6'])
94 039e3e61 Christos Stavrakakis
            self.assertEqual(db_net.dhcp, api_net['dhcp'])
95 039e3e61 Christos Stavrakakis
            self.assertEqual(db_net.public, api_net['public'])
96 039e3e61 Christos Stavrakakis
            db_nics = ["nic-%d-%d" % (nic.machine.id, nic.index) for nic in
97 039e3e61 Christos Stavrakakis
                       db_net.nics.filter(machine__userid=db_net.userid)]
98 2d04422f Christos Stavrakakis
            self.assertEqual(db_nics, api_net['attachments'])
99 039e3e61 Christos Stavrakakis
100 039e3e61 Christos Stavrakakis
    def test_create_network_1(self, mrapi):
101 039e3e61 Christos Stavrakakis
        request = {
102 4e1133ab Christos Stavrakakis
            'network': {'name': 'foo', "type": "MAC_FILTERED"}
103 4e1133ab Christos Stavrakakis
        }
104 184a2a8c Christos Stavrakakis
        with mocked_quotaholder():
105 7d2fdab9 Georgios D. Tsoukalas
            response = self.mypost('networks/', 'user1',
106 7d2fdab9 Georgios D. Tsoukalas
                                   json.dumps(request), 'json')
107 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
108 039e3e61 Christos Stavrakakis
        db_networks = Network.objects.filter(userid='user1')
109 039e3e61 Christos Stavrakakis
        self.assertEqual(len(db_networks), 1)
110 039e3e61 Christos Stavrakakis
        db_net = db_networks[0]
111 039e3e61 Christos Stavrakakis
        api_net = json.loads(response.content)['network']
112 039e3e61 Christos Stavrakakis
        self.assertNetworksEqual(db_net, api_net)
113 039e3e61 Christos Stavrakakis
        mrapi.CreateNetwork.assert_called()
114 039e3e61 Christos Stavrakakis
        mrapi.ConnectNetwork.assert_called()
115 039e3e61 Christos Stavrakakis
116 039e3e61 Christos Stavrakakis
    def test_invalid_data_1(self, mrapi):
117 039e3e61 Christos Stavrakakis
        """Test invalid flavor"""
118 039e3e61 Christos Stavrakakis
        request = {
119 039e3e61 Christos Stavrakakis
            'network': {'name': 'foo', 'type': 'LoLo'}
120 039e3e61 Christos Stavrakakis
            }
121 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/', 'user1',
122 7d2fdab9 Georgios D. Tsoukalas
                               json.dumps(request), 'json')
123 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
124 039e3e61 Christos Stavrakakis
        self.assertEqual(len(Network.objects.filter(userid='user1')), 0)
125 039e3e61 Christos Stavrakakis
126 039e3e61 Christos Stavrakakis
    def test_invalid_data_2(self, mrapi):
127 4e1133ab Christos Stavrakakis
        """Test invalid data/subnet"""
128 039e3e61 Christos Stavrakakis
        request = {
129 4e1133ab Christos Stavrakakis
            'network': {'name': 'foo',
130 4e1133ab Christos Stavrakakis
                        'cidr': '10.0.0.0/8', "type":
131 4e1133ab Christos Stavrakakis
                        "MAC_FILTERED"}
132 4e1133ab Christos Stavrakakis
        }
133 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/', 'user1',
134 7d2fdab9 Georgios D. Tsoukalas
                               json.dumps(request), 'json')
135 039e3e61 Christos Stavrakakis
        self.assertFault(response, 413, "overLimit")
136 039e3e61 Christos Stavrakakis
137 039e3e61 Christos Stavrakakis
    def test_invalid_data_3(self, mrapi):
138 039e3e61 Christos Stavrakakis
        """Test unauthorized to create public network"""
139 039e3e61 Christos Stavrakakis
        request = {
140 4e1133ab Christos Stavrakakis
                'network': {'name': 'foo',
141 4e1133ab Christos Stavrakakis
                            "public": "True",
142 4e1133ab Christos Stavrakakis
                            "type": "MAC_FILTERED"}
143 039e3e61 Christos Stavrakakis
            }
144 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/', 'user1',
145 7d2fdab9 Georgios D. Tsoukalas
                               json.dumps(request), 'json')
146 039e3e61 Christos Stavrakakis
        self.assertFault(response, 403, "forbidden")
147 039e3e61 Christos Stavrakakis
148 039e3e61 Christos Stavrakakis
    def test_invalid_data_4(self, mrapi):
149 039e3e61 Christos Stavrakakis
        """Test unauthorized to create network not in settings"""
150 039e3e61 Christos Stavrakakis
        request = {
151 039e3e61 Christos Stavrakakis
                'network': {'name': 'foo', 'type': 'CUSTOM'}
152 039e3e61 Christos Stavrakakis
            }
153 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/', 'user1',
154 7d2fdab9 Georgios D. Tsoukalas
                               json.dumps(request), 'json')
155 039e3e61 Christos Stavrakakis
        self.assertFault(response, 403, "forbidden")
156 039e3e61 Christos Stavrakakis
157 d368ec0c Christos Stavrakakis
    def test_invalid_subnet(self, mrapi):
158 d368ec0c Christos Stavrakakis
        """Test invalid subnet"""
159 d368ec0c Christos Stavrakakis
        request = {
160 4e1133ab Christos Stavrakakis
            'network': {'name': 'foo',
161 4e1133ab Christos Stavrakakis
                        'cidr': '10.0.0.10/27',
162 4e1133ab Christos Stavrakakis
                        "type": "MAC_FILTERED"}
163 4e1133ab Christos Stavrakakis
        }
164 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/', 'user1',
165 7d2fdab9 Georgios D. Tsoukalas
                               json.dumps(request), 'json')
166 d368ec0c Christos Stavrakakis
        self.assertBadRequest(response)
167 d368ec0c Christos Stavrakakis
168 9ae613af Christos Stavrakakis
    def test_invalid_gateway_1(self, mrapi):
169 9ae613af Christos Stavrakakis
        request = {
170 9ae613af Christos Stavrakakis
            'network': {'name': 'foo',
171 9ae613af Christos Stavrakakis
                        'cidr': '10.0.0.0/28',
172 9ae613af Christos Stavrakakis
                        'gateway': '10.0.0.0.300'}
173 9ae613af Christos Stavrakakis
        }
174 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/', 'user1',
175 7d2fdab9 Georgios D. Tsoukalas
                               json.dumps(request), 'json')
176 9ae613af Christos Stavrakakis
        self.assertBadRequest(response)
177 9ae613af Christos Stavrakakis
178 9ae613af Christos Stavrakakis
    def test_invalid_gateway_2(self, mrapi):
179 9ae613af Christos Stavrakakis
        request = {
180 9ae613af Christos Stavrakakis
            'network': {'name': 'foo',
181 9ae613af Christos Stavrakakis
                        'cidr': '10.0.0.0/28',
182 9ae613af Christos Stavrakakis
                        'gateway': '10.2.0.1'}
183 9ae613af Christos Stavrakakis
        }
184 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/', 'user1',
185 7d2fdab9 Georgios D. Tsoukalas
                               json.dumps(request), 'json')
186 9ae613af Christos Stavrakakis
        self.assertBadRequest(response)
187 9ae613af Christos Stavrakakis
188 9ae613af Christos Stavrakakis
    def test_invalid_network6(self, mrapi):
189 9ae613af Christos Stavrakakis
        request = {
190 9ae613af Christos Stavrakakis
            'network': {'name': 'foo',
191 9ae613af Christos Stavrakakis
                        'cidr': '10.0.0.0/28',
192 9ae613af Christos Stavrakakis
                        'subnet6': '10.0.0.0/28',
193 9ae613af Christos Stavrakakis
                        'gateway': '10.2.0.1'}
194 9ae613af Christos Stavrakakis
        }
195 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/', 'user1',
196 7d2fdab9 Georgios D. Tsoukalas
                               json.dumps(request), 'json')
197 9ae613af Christos Stavrakakis
        self.assertBadRequest(response)
198 9ae613af Christos Stavrakakis
199 9ae613af Christos Stavrakakis
    def test_invalid_gateway6(self, mrapi):
200 9ae613af Christos Stavrakakis
        request = {
201 9ae613af Christos Stavrakakis
            'network': {'name': 'foo',
202 9ae613af Christos Stavrakakis
                        'cidr': '10.0.0.0/28',
203 9ae613af Christos Stavrakakis
                        'subnet6': '2001:0db8:0123:4567:89ab:cdef:1234:5678',
204 9ae613af Christos Stavrakakis
                        'gateway': '10.2.0.1'}
205 9ae613af Christos Stavrakakis
        }
206 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/', 'user1',
207 7d2fdab9 Georgios D. Tsoukalas
                               json.dumps(request), 'json')
208 9ae613af Christos Stavrakakis
        self.assertBadRequest(response)
209 9ae613af Christos Stavrakakis
210 039e3e61 Christos Stavrakakis
    def test_list_networks(self, mrapi):
211 039e3e61 Christos Stavrakakis
        """Test that expected list of networks is returned."""
212 039e3e61 Christos Stavrakakis
        # Create a deleted network
213 039e3e61 Christos Stavrakakis
        mfactory.NetworkFactory(userid=self.user, deleted=True)
214 039e3e61 Christos Stavrakakis
215 7d2fdab9 Georgios D. Tsoukalas
        response = self.myget('networks/', self.user)
216 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
217 039e3e61 Christos Stavrakakis
218 039e3e61 Christos Stavrakakis
        db_nets = Network.objects.filter(userid=self.user, deleted=False)
219 2d04422f Christos Stavrakakis
        api_nets = json.loads(response.content)["networks"]
220 039e3e61 Christos Stavrakakis
221 039e3e61 Christos Stavrakakis
        self.assertEqual(len(db_nets), len(api_nets))
222 039e3e61 Christos Stavrakakis
        for api_net in api_nets:
223 039e3e61 Christos Stavrakakis
            net_id = api_net['id']
224 039e3e61 Christos Stavrakakis
            self.assertNetworksEqual(Network.objects.get(id=net_id), api_net)
225 039e3e61 Christos Stavrakakis
226 039e3e61 Christos Stavrakakis
    def test_list_networks_detail(self, mrapi):
227 039e3e61 Christos Stavrakakis
        """Test that expected networks details are returned."""
228 039e3e61 Christos Stavrakakis
        # Create a deleted network
229 039e3e61 Christos Stavrakakis
        mfactory.NetworkFactory(userid=self.user, deleted=True)
230 039e3e61 Christos Stavrakakis
231 7d2fdab9 Georgios D. Tsoukalas
        response = self.myget('networks/detail', self.user)
232 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
233 039e3e61 Christos Stavrakakis
234 039e3e61 Christos Stavrakakis
        db_nets = Network.objects.filter(userid=self.user, deleted=False)
235 2d04422f Christos Stavrakakis
        api_nets = json.loads(response.content)["networks"]
236 039e3e61 Christos Stavrakakis
237 039e3e61 Christos Stavrakakis
        self.assertEqual(len(db_nets), len(api_nets))
238 039e3e61 Christos Stavrakakis
        for api_net in api_nets:
239 039e3e61 Christos Stavrakakis
            net_id = api_net['id']
240 039e3e61 Christos Stavrakakis
            self.assertNetworksEqual(Network.objects.get(id=net_id), api_net,
241 039e3e61 Christos Stavrakakis
                                     detail=True)
242 039e3e61 Christos Stavrakakis
243 939d71dd Christos Stavrakakis
    def test_get_network_building_nics(self, mrapi):
244 939d71dd Christos Stavrakakis
        net = mfactory.NetworkFactory()
245 939d71dd Christos Stavrakakis
        machine = mfactory.VirtualMachineFactory(userid=net.userid)
246 939d71dd Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(network=net, machine=machine,
247 939d71dd Christos Stavrakakis
                                         state="BUILDING")
248 7d2fdab9 Georgios D. Tsoukalas
        response = self.myget('networks/%d' % net.id, net.userid)
249 939d71dd Christos Stavrakakis
        self.assertSuccess(response)
250 939d71dd Christos Stavrakakis
        api_net = json.loads(response.content)["network"]
251 2d04422f Christos Stavrakakis
        self.assertEqual(len(api_net["attachments"]), 0)
252 939d71dd Christos Stavrakakis
253 039e3e61 Christos Stavrakakis
    def test_network_details_1(self, mrapi):
254 039e3e61 Christos Stavrakakis
        """Test that expected details for a network are returned"""
255 7d2fdab9 Georgios D. Tsoukalas
        response = self.myget('networks/%d' % self.net1.id, self.net1.userid)
256 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
257 039e3e61 Christos Stavrakakis
        api_net = json.loads(response.content)["network"]
258 039e3e61 Christos Stavrakakis
        self.assertNetworksEqual(self.net1, api_net, detail=True)
259 039e3e61 Christos Stavrakakis
260 039e3e61 Christos Stavrakakis
    def test_invalid_network(self, mrapi):
261 039e3e61 Christos Stavrakakis
        """Test details for non-existing network."""
262 7d2fdab9 Georgios D. Tsoukalas
        response = self.myget('networks/%d' % 42, self.net1.userid)
263 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
264 039e3e61 Christos Stavrakakis
265 039e3e61 Christos Stavrakakis
    def test_rename_network(self, mrapi):
266 039e3e61 Christos Stavrakakis
        request = {'network': {'name': "new_name"}}
267 7d2fdab9 Georgios D. Tsoukalas
        response = self.myput('networks/%d' % self.net2.id,
268 7d2fdab9 Georgios D. Tsoukalas
                              self.net2.userid, json.dumps(request), 'json')
269 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 204)
270 039e3e61 Christos Stavrakakis
        self.assertEqual(Network.objects.get(id=self.net2.id).name, "new_name")
271 039e3e61 Christos Stavrakakis
        # Check invalid
272 039e3e61 Christos Stavrakakis
        request = {'name': "new_name"}
273 7d2fdab9 Georgios D. Tsoukalas
        response = self.myput('networks/%d' % self.net2.id,
274 7d2fdab9 Georgios D. Tsoukalas
                              self.net2.userid, json.dumps(request), 'json')
275 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
276 039e3e61 Christos Stavrakakis
277 039e3e61 Christos Stavrakakis
    def test_rename_deleted_network(self, mrapi):
278 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(deleted=True)
279 039e3e61 Christos Stavrakakis
        request = {'network': {'name': "new_name"}}
280 7d2fdab9 Georgios D. Tsoukalas
        response = self.myput('networks/%d' % net.id,
281 7d2fdab9 Georgios D. Tsoukalas
                              net.userid, json.dumps(request), 'json')
282 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
283 039e3e61 Christos Stavrakakis
284 039e3e61 Christos Stavrakakis
    def test_rename_public_network(self, mrapi):
285 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(public=True)
286 039e3e61 Christos Stavrakakis
        request = {'network': {'name': "new_name"}}
287 7d2fdab9 Georgios D. Tsoukalas
        response = self.myput('networks/%d' % net.id,
288 7d2fdab9 Georgios D. Tsoukalas
                              self.net2.userid, json.dumps(request), 'json')
289 039e3e61 Christos Stavrakakis
        self.assertFault(response, 403, 'forbidden')
290 039e3e61 Christos Stavrakakis
291 039e3e61 Christos Stavrakakis
    def test_delete_network(self, mrapi):
292 ac47eef6 Christos Stavrakakis
        net = mfactory.NetworkFactory(deleted=False, state='ACTIVE',
293 ac47eef6 Christos Stavrakakis
                                      link="link-10")
294 c6c889f7 Christos Stavrakakis
        with mocked_quotaholder():
295 7d2fdab9 Georgios D. Tsoukalas
            response = self.mydelete('networks/%d' % net.id, net.userid)
296 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 204)
297 039e3e61 Christos Stavrakakis
        net = Network.objects.get(id=net.id, userid=net.userid)
298 039e3e61 Christos Stavrakakis
        self.assertEqual(net.action, 'DESTROY')
299 039e3e61 Christos Stavrakakis
        mrapi.DeleteNetwork.assert_called()
300 039e3e61 Christos Stavrakakis
301 039e3e61 Christos Stavrakakis
    def test_delete_public_network(self, mrapi):
302 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(public=True)
303 7d2fdab9 Georgios D. Tsoukalas
        response = self.mydelete('networks/%d' % net.id, self.net2.userid)
304 039e3e61 Christos Stavrakakis
        self.assertFault(response, 403, 'forbidden')
305 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
306 039e3e61 Christos Stavrakakis
307 039e3e61 Christos Stavrakakis
    def test_delete_deleted_network(self, mrapi):
308 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(deleted=True)
309 7d2fdab9 Georgios D. Tsoukalas
        response = self.mydelete('networks/%d' % net.id, net.userid)
310 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
311 039e3e61 Christos Stavrakakis
312 039e3e61 Christos Stavrakakis
    def test_delete_network_in_use(self, mrapi):
313 039e3e61 Christos Stavrakakis
        net = self.net1
314 7d2fdab9 Georgios D. Tsoukalas
        response = self.mydelete('networks/%d' % net.id, net.userid)
315 039e3e61 Christos Stavrakakis
        self.assertFault(response, 421, 'networkInUse')
316 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
317 039e3e61 Christos Stavrakakis
318 039e3e61 Christos Stavrakakis
    def test_add_nic(self, mrapi):
319 039e3e61 Christos Stavrakakis
        user = 'userr'
320 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
321 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user)
322 41a7fae7 Christos Stavrakakis
        mrapi().ModifyInstance.return_value = 1
323 039e3e61 Christos Stavrakakis
        request = {'add': {'serverRef': vm.id}}
324 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
325 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
326 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
327 039e3e61 Christos Stavrakakis
328 039e3e61 Christos Stavrakakis
    def test_add_nic_to_deleted_network(self, mrapi):
329 039e3e61 Christos Stavrakakis
        user = 'userr'
330 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
331 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user,
332 039e3e61 Christos Stavrakakis
                                      deleted=True)
333 039e3e61 Christos Stavrakakis
        request = {'add': {'serverRef': vm.id}}
334 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
335 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
336 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
337 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
338 039e3e61 Christos Stavrakakis
339 039e3e61 Christos Stavrakakis
    def test_add_nic_to_public_network(self, mrapi):
340 039e3e61 Christos Stavrakakis
        user = 'userr'
341 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
342 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user, public=True)
343 039e3e61 Christos Stavrakakis
        request = {'add': {'serverRef': vm.id}}
344 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
345 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
346 039e3e61 Christos Stavrakakis
        self.assertFault(response, 403, 'forbidden')
347 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
348 039e3e61 Christos Stavrakakis
349 039e3e61 Christos Stavrakakis
    def test_add_nic_malformed_1(self, mrapi):
350 039e3e61 Christos Stavrakakis
        user = 'userr'
351 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
352 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user)
353 039e3e61 Christos Stavrakakis
        request = {'add': {'serveRef': vm.id}}
354 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
355 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
356 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
357 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
358 039e3e61 Christos Stavrakakis
359 039e3e61 Christos Stavrakakis
    def test_add_nic_malformed_2(self, mrapi):
360 039e3e61 Christos Stavrakakis
        user = 'userr'
361 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
362 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user)
363 039e3e61 Christos Stavrakakis
        request = {'add': {'serveRef': [vm.id, 22]}}
364 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
365 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
366 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
367 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
368 039e3e61 Christos Stavrakakis
369 039e3e61 Christos Stavrakakis
    def test_add_nic_not_active(self, mrapi):
370 039e3e61 Christos Stavrakakis
        """Test connecting VM to non-active network"""
371 039e3e61 Christos Stavrakakis
        user = 'dummy'
372 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
373 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='PENDING', subnet='10.0.0.0/31',
374 039e3e61 Christos Stavrakakis
                                      userid=user)
375 41a7fae7 Christos Stavrakakis
        request = {'add': {'serverRef': vm.id}}
376 2cd55da6 Christos Stavrakakis
        response = self.mypost('networks/%d/action' % net.id,
377 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
378 039e3e61 Christos Stavrakakis
        # Test that returns BuildInProgress
379 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 409)
380 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
381 039e3e61 Christos Stavrakakis
382 039e3e61 Christos Stavrakakis
    def test_add_nic_full_network(self, mrapi):
383 039e3e61 Christos Stavrakakis
        """Test connecting VM to a full network"""
384 039e3e61 Christos Stavrakakis
        user = 'userr'
385 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user,
386 41a7fae7 Christos Stavrakakis
                                            operstate="STARTED")
387 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', subnet='10.0.0.0/30',
388 039e3e61 Christos Stavrakakis
                                      userid=user, dhcp=True)
389 039e3e61 Christos Stavrakakis
        pool = net.get_pool()
390 039e3e61 Christos Stavrakakis
        while not pool.empty():
391 039e3e61 Christos Stavrakakis
            pool.get()
392 039e3e61 Christos Stavrakakis
        pool.save()
393 039e3e61 Christos Stavrakakis
        pool = net.get_pool()
394 039e3e61 Christos Stavrakakis
        self.assertTrue(pool.empty())
395 039e3e61 Christos Stavrakakis
        request = {'add': {'serverRef': vm.id}}
396 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
397 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
398 039e3e61 Christos Stavrakakis
        # Test that returns OverLimit
399 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 413)
400 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
401 039e3e61 Christos Stavrakakis
402 039e3e61 Christos Stavrakakis
    def test_remove_nic(self, mrapi):
403 039e3e61 Christos Stavrakakis
        user = 'userr'
404 2cd55da6 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user,
405 2cd55da6 Christos Stavrakakis
                                            operstate="ACTIVE")
406 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user)
407 039e3e61 Christos Stavrakakis
        nic = mfactory.NetworkInterfaceFactory(machine=vm, network=net)
408 41a7fae7 Christos Stavrakakis
        mrapi().ModifyInstance.return_value = 1
409 039e3e61 Christos Stavrakakis
        request = {'remove': {'attachment': 'nic-%s-%s' % (vm.id, nic.index)}}
410 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
411 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
412 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
413 039e3e61 Christos Stavrakakis
        self.assertTrue(NetworkInterface.objects.get(id=nic.id).dirty)
414 41a7fae7 Christos Stavrakakis
        vm.task = None
415 41a7fae7 Christos Stavrakakis
        vm.task_job_id = None
416 41a7fae7 Christos Stavrakakis
        vm.save()
417 039e3e61 Christos Stavrakakis
        # Remove dirty nic
418 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
419 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
420 039e3e61 Christos Stavrakakis
        self.assertFault(response, 409, 'buildInProgress')
421 039e3e61 Christos Stavrakakis
422 039e3e61 Christos Stavrakakis
    def test_remove_nic_malformed(self, mrapi):
423 039e3e61 Christos Stavrakakis
        user = 'userr'
424 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
425 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user)
426 039e3e61 Christos Stavrakakis
        nic = mfactory.NetworkInterfaceFactory(machine=vm, network=net)
427 039e3e61 Christos Stavrakakis
        request = {'remove':
428 039e3e61 Christos Stavrakakis
                    {'att234achment': 'nic-%s-%s' % (vm.id, nic.index)}
429 039e3e61 Christos Stavrakakis
                  }
430 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
431 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
432 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
433 039e3e61 Christos Stavrakakis
434 039e3e61 Christos Stavrakakis
    def test_remove_nic_malformed_2(self, mrapi):
435 039e3e61 Christos Stavrakakis
        user = 'userr'
436 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
437 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user)
438 039e3e61 Christos Stavrakakis
        request = {'remove':
439 039e3e61 Christos Stavrakakis
                    {'attachment': 'nic-%s' % vm.id}
440 039e3e61 Christos Stavrakakis
                  }
441 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
442 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
443 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
444 a3accf03 Georgios D. Tsoukalas
445 a3accf03 Georgios D. Tsoukalas
    def test_catch_wrong_api_paths(self, *args):
446 a3accf03 Georgios D. Tsoukalas
        response = self.myget('nonexistent')
447 a3accf03 Georgios D. Tsoukalas
        self.assertEqual(response.status_code, 400)
448 a3accf03 Georgios D. Tsoukalas
        try:
449 a3accf03 Georgios D. Tsoukalas
            error = json.loads(response.content)
450 a3accf03 Georgios D. Tsoukalas
        except ValueError:
451 a3accf03 Georgios D. Tsoukalas
            self.assertTrue(False)
452 16437e4d Kostas Papadimitriou
453 16437e4d Kostas Papadimitriou
    def test_method_not_allowed(self, *args):
454 16437e4d Kostas Papadimitriou
        # /networks/ allows only POST, GET
455 16437e4d Kostas Papadimitriou
        response = self.myput('networks', '', '')
456 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
457 16437e4d Kostas Papadimitriou
        response = self.mydelete('networks')
458 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
459 16437e4d Kostas Papadimitriou
460 16437e4d Kostas Papadimitriou
        # /networks/<srvid>/ allows only GET, PUT, DELETE
461 16437e4d Kostas Papadimitriou
        response = self.mypost("networks/42")
462 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)