Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / tests / networks.py @ 94537e34

History | View | Annotate | Download (20 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 ece5581b Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user,
331 ece5581b Christos Stavrakakis
                                            operstate="ACTIVE")
332 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user,
333 039e3e61 Christos Stavrakakis
                                      deleted=True)
334 039e3e61 Christos Stavrakakis
        request = {'add': {'serverRef': vm.id}}
335 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
336 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
337 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
338 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
339 039e3e61 Christos Stavrakakis
340 039e3e61 Christos Stavrakakis
    def test_add_nic_to_public_network(self, mrapi):
341 039e3e61 Christos Stavrakakis
        user = 'userr'
342 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
343 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user, public=True)
344 039e3e61 Christos Stavrakakis
        request = {'add': {'serverRef': vm.id}}
345 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
346 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
347 039e3e61 Christos Stavrakakis
        self.assertFault(response, 403, 'forbidden')
348 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
349 039e3e61 Christos Stavrakakis
350 039e3e61 Christos Stavrakakis
    def test_add_nic_malformed_1(self, mrapi):
351 039e3e61 Christos Stavrakakis
        user = 'userr'
352 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
353 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user)
354 039e3e61 Christos Stavrakakis
        request = {'add': {'serveRef': vm.id}}
355 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
356 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
357 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
358 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
359 039e3e61 Christos Stavrakakis
360 039e3e61 Christos Stavrakakis
    def test_add_nic_malformed_2(self, mrapi):
361 039e3e61 Christos Stavrakakis
        user = 'userr'
362 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
363 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user)
364 039e3e61 Christos Stavrakakis
        request = {'add': {'serveRef': [vm.id, 22]}}
365 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
366 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
367 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
368 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
369 039e3e61 Christos Stavrakakis
370 039e3e61 Christos Stavrakakis
    def test_add_nic_not_active(self, mrapi):
371 039e3e61 Christos Stavrakakis
        """Test connecting VM to non-active network"""
372 039e3e61 Christos Stavrakakis
        user = 'dummy'
373 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
374 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='PENDING', subnet='10.0.0.0/31',
375 039e3e61 Christos Stavrakakis
                                      userid=user)
376 41a7fae7 Christos Stavrakakis
        request = {'add': {'serverRef': vm.id}}
377 2cd55da6 Christos Stavrakakis
        response = self.mypost('networks/%d/action' % net.id,
378 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
379 039e3e61 Christos Stavrakakis
        # Test that returns BuildInProgress
380 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 409)
381 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
382 039e3e61 Christos Stavrakakis
383 039e3e61 Christos Stavrakakis
    def test_add_nic_full_network(self, mrapi):
384 039e3e61 Christos Stavrakakis
        """Test connecting VM to a full network"""
385 039e3e61 Christos Stavrakakis
        user = 'userr'
386 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user,
387 41a7fae7 Christos Stavrakakis
                                            operstate="STARTED")
388 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', subnet='10.0.0.0/30',
389 039e3e61 Christos Stavrakakis
                                      userid=user, dhcp=True)
390 039e3e61 Christos Stavrakakis
        pool = net.get_pool()
391 039e3e61 Christos Stavrakakis
        while not pool.empty():
392 039e3e61 Christos Stavrakakis
            pool.get()
393 039e3e61 Christos Stavrakakis
        pool.save()
394 039e3e61 Christos Stavrakakis
        pool = net.get_pool()
395 039e3e61 Christos Stavrakakis
        self.assertTrue(pool.empty())
396 039e3e61 Christos Stavrakakis
        request = {'add': {'serverRef': vm.id}}
397 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
398 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
399 039e3e61 Christos Stavrakakis
        # Test that returns OverLimit
400 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 413)
401 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.called)
402 039e3e61 Christos Stavrakakis
403 039e3e61 Christos Stavrakakis
    def test_remove_nic(self, mrapi):
404 039e3e61 Christos Stavrakakis
        user = 'userr'
405 2cd55da6 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user,
406 2cd55da6 Christos Stavrakakis
                                            operstate="ACTIVE")
407 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user)
408 039e3e61 Christos Stavrakakis
        nic = mfactory.NetworkInterfaceFactory(machine=vm, network=net)
409 41a7fae7 Christos Stavrakakis
        mrapi().ModifyInstance.return_value = 1
410 039e3e61 Christos Stavrakakis
        request = {'remove': {'attachment': 'nic-%s-%s' % (vm.id, nic.index)}}
411 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
412 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
413 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
414 039e3e61 Christos Stavrakakis
        self.assertTrue(NetworkInterface.objects.get(id=nic.id).dirty)
415 41a7fae7 Christos Stavrakakis
        vm.task = None
416 41a7fae7 Christos Stavrakakis
        vm.task_job_id = None
417 41a7fae7 Christos Stavrakakis
        vm.save()
418 039e3e61 Christos Stavrakakis
        # Remove dirty nic
419 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
420 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
421 039e3e61 Christos Stavrakakis
        self.assertFault(response, 409, 'buildInProgress')
422 039e3e61 Christos Stavrakakis
423 039e3e61 Christos Stavrakakis
    def test_remove_nic_malformed(self, mrapi):
424 039e3e61 Christos Stavrakakis
        user = 'userr'
425 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
426 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user)
427 039e3e61 Christos Stavrakakis
        nic = mfactory.NetworkInterfaceFactory(machine=vm, network=net)
428 039e3e61 Christos Stavrakakis
        request = {'remove':
429 039e3e61 Christos Stavrakakis
                    {'att234achment': 'nic-%s-%s' % (vm.id, nic.index)}
430 039e3e61 Christos Stavrakakis
                  }
431 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
432 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
433 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
434 039e3e61 Christos Stavrakakis
435 039e3e61 Christos Stavrakakis
    def test_remove_nic_malformed_2(self, mrapi):
436 039e3e61 Christos Stavrakakis
        user = 'userr'
437 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(name='yo', userid=user)
438 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE', userid=user)
439 039e3e61 Christos Stavrakakis
        request = {'remove':
440 039e3e61 Christos Stavrakakis
                    {'attachment': 'nic-%s' % vm.id}
441 039e3e61 Christos Stavrakakis
                  }
442 7d2fdab9 Georgios D. Tsoukalas
        response = self.mypost('networks/%d/action' % net.id,
443 7d2fdab9 Georgios D. Tsoukalas
                               net.userid, json.dumps(request), 'json')
444 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
445 a3accf03 Georgios D. Tsoukalas
446 a3accf03 Georgios D. Tsoukalas
    def test_catch_wrong_api_paths(self, *args):
447 a3accf03 Georgios D. Tsoukalas
        response = self.myget('nonexistent')
448 a3accf03 Georgios D. Tsoukalas
        self.assertEqual(response.status_code, 400)
449 a3accf03 Georgios D. Tsoukalas
        try:
450 a3accf03 Georgios D. Tsoukalas
            error = json.loads(response.content)
451 a3accf03 Georgios D. Tsoukalas
        except ValueError:
452 a3accf03 Georgios D. Tsoukalas
            self.assertTrue(False)
453 16437e4d Kostas Papadimitriou
454 16437e4d Kostas Papadimitriou
    def test_method_not_allowed(self, *args):
455 16437e4d Kostas Papadimitriou
        # /networks/ allows only POST, GET
456 16437e4d Kostas Papadimitriou
        response = self.myput('networks', '', '')
457 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
458 16437e4d Kostas Papadimitriou
        response = self.mydelete('networks')
459 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
460 16437e4d Kostas Papadimitriou
461 16437e4d Kostas Papadimitriou
        # /networks/<srvid>/ allows only GET, PUT, DELETE
462 16437e4d Kostas Papadimitriou
        response = self.mypost("networks/42")
463 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)