Statistics
| Branch: | Tag: | Revision:

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

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