Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / tests / routers.py @ 69dadbe4

History | View | Annotate | Download (11.6 kB)

1
# Copyright 2012-2013 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
from snf_django.utils.testing import BaseAPITest
35
from django.utils import simplejson as json
36
from synnefo.cyclades_settings import cyclades_services
37
from synnefo.lib.services import get_service_path
38
from synnefo.lib import join_urls
39
import synnefo.db.models_factory as dbmf
40

    
41

    
42
COMPUTE_URL = get_service_path(cyclades_services, 'compute',
43
                               version='v2.0')
44
ROUTERS_URL = join_urls(COMPUTE_URL, "routers/")
45

    
46

    
47
class RouterTest(BaseAPITest):
48

    
49
    def test_list_empty_routers(self):
50
        response = self.get(ROUTERS_URL)
51
        self.assertSuccess(response)
52
        routers = json.loads(response.content)
53
        self.assertEqual(routers, {"routers": []})
54

    
55
    def test_list_detail(self):
56
        response = self.get(join_urls(ROUTERS_URL, 'detail'))
57
        self.assertEqual(response.status_code, 200)
58

    
59
    def test_create_router_no_net(self):
60
        request = {
61
            "router": {
62
                "name": "test-router",
63
                "external_gateway_info": {
64
                    "network_id": "123"}
65
            }
66
        }
67
        response = self.post(ROUTERS_URL, params=json.dumps(request),
68
                             user='user')
69
        self.assertEqual(response.status_code, 404)
70

    
71
    def test_create_router_no_external(self):
72
        net = dbmf.NetworkFactory.create(userid='user', external_router=False)
73
        request = {
74
            "router": {
75
                "name": "test-router",
76
                "external_gateway_info": {
77
                    "network_id": str(net.id)
78
                }
79
            }
80
        }
81
        response = self.post(ROUTERS_URL, params=json.dumps(request),
82
                             user='user')
83
        self.assertEqual(response.status_code, 400)
84

    
85
    def test_create_router(self):
86
        try:
87
            flavor = dbmf.FlavorFactory.create(id=1)
88
        except:
89
            pass
90
        net = dbmf.NetworkFactory.create(userid='user', external_router=True)
91
        fip = dbmf.FloatingIPFactory.create(userid='user',
92
                                          network=net, nic=None)
93
        request = {
94
            "router": {
95
                "name": "test-router",
96
                "external_gateway_info": {
97
                    "network_id": str(fip.network.id),
98
                    "floating_ip": fip.address}
99
            }
100
        }
101
        response = self.post(ROUTERS_URL, params=json.dumps(request),
102
                             user='user')
103
        self.assertEqual(response.status_code, 201)
104

    
105
    def test_create_router_no_ip(self):
106
        try:
107
            flavor = dbmf.FlavorFactory.create(id=1)
108
        except:
109
            pass
110
        net = dbmf.NetworkFactory.create(userid='user', external_router=True)
111
        fip = dbmf.FloatingIPFactory.create(userid='user',
112
                                          network=net, nic=None)
113
        request = {
114
            "router": {
115
                "name": "test-router",
116
                "external_gateway_info": {
117
                    "network_id": str(net.id)}
118
            }
119
        }
120
        response = self.post(ROUTERS_URL, params=json.dumps(request),
121
                             user='user')
122
        self.assertEqual(response.status_code, 201)
123

    
124
    def test_get_router(self):
125
        router = dbmf.VirtualMachineFactory.create(router=True)
126
        nic = dbmf.NetworkInterfaceFactory.create(machine=router)
127
        fip = dbmf.FloatingIPFactory.create(userid=router.userid, nic=nic,
128
                                            network=nic.network)
129
        response = self.get(ROUTERS_URL, user=router.userid)
130
        self.assertSuccess(response)
131

    
132
    def test_delete_router(self):
133
        router = dbmf.VirtualMachineFactory.create(router=True)
134
        url = join_urls(ROUTERS_URL, str(router.id))
135
        response = self.delete(url, user=router.userid)
136
        self.assertEqual(response.status_code, 204)
137

    
138
    def test_delete_router_with_private_net(self):
139
        router = dbmf.VirtualMachineFactory.create(router=True)
140
        net = dbmf.NetworkFactory.create(external_router=False)
141
        nic = dbmf.NetworkInterfaceFactory.create(network=net, machine=router)
142
        url = join_urls(ROUTERS_URL, str(router.id))
143
        response = self.delete(url, user=router.userid)
144
        self.assertEqual(response.status_code, 409)
145

    
146
    def test_update_router_network(self):
147
        router = dbmf.VirtualMachineFactory.create(router=True, userid='user')
148
        net = dbmf.NetworkFactory.create(userid='user', external_router=True)
149
        fip = dbmf.FloatingIPFactory.create(userid='user',
150
                                          network=net, nic=None)
151
        request = {
152
            "router": {
153
                "name": "new_name",
154
                "external_gateway_info": {"network_id": str(net.id)}
155
                }
156
            }
157
        url = join_urls(ROUTERS_URL, str(router.id))
158
        response = self.put(url, params=json.dumps(request),
159
                            user=router.userid)
160
        info = json.loads(response.content)
161
        self.assertEqual(info['router']['external_gateway_info']['network_id'],
162
                         str(net.id))
163
        self.assertEqual(info['router']['name'], "new_name")
164

    
165
    def test_update_router_both(self):
166
        router = dbmf.VirtualMachineFactory.create(router=True, userid='user')
167
        net = dbmf.NetworkFactory.create(userid='user', external_router=True)
168
        fip = dbmf.FloatingIPFactory.create(userid='user',
169
                                          network=net, nic=None)
170
        request = {
171
            "router": {
172
                "name": "new_name",
173
                "external_gateway_info": {"network_id": str(net.id),
174
                                           "floating_ip": fip.address}
175
                }
176
            }
177
        url = join_urls(ROUTERS_URL, str(router.id))
178
        response = self.put(url, params=json.dumps(request),
179
                            user=router.userid)
180
        info = json.loads(response.content)
181
        self.assertEqual(info['router']['external_gateway_info']['network_id'],
182
                         str(net.id))
183
        self.assertEqual(info['router']['name'], "new_name")
184

    
185
    def test_update_router_conflict(self):
186
        router = dbmf.VirtualMachineFactory.create(router=True, userid='user')
187
        net = dbmf.NetworkFactory.create(userid='user', external_router=True)
188
        fip = dbmf.FloatingIPFactory.create(userid='user', nic=None)
189
        request = {
190
            "router": {
191
                "name": "new_name",
192
                "external_gateway_info": {"network_id": str(net.id),
193
                                           "floating_ip": fip.address}
194
                }
195
            }
196
        url = join_urls(ROUTERS_URL, str(router.id))
197
        response = self.put(url, params=json.dumps(request),
198
                            user=router.userid)
199
        self.assertEqual(response.status_code, 409)
200

    
201
    def test_remove_interface_no_body(self):
202
        url = join_urls(join_urls(ROUTERS_URL, "123"),
203
                        "remove_router_interface")
204

    
205
        response = self.put(url, params="")
206
        self.assertEqual(response.status_code, 400)
207

    
208
    def test_remove_interface_unfound_subnet(self):
209
        router = dbmf.VirtualMachineFactory.create(router=True)
210
        request = {"subnet_id": "123"}
211
        url = join_urls(join_urls(ROUTERS_URL, str(router.id)),
212
                        "remove_router_interface")
213
        response = self.put(url, params=json.dumps(request),
214
                            user=router.userid)
215
        self.assertEqual(response.status_code, 404)
216

    
217
    def test_remove_interface_no_info(self):
218
        router = dbmf.VirtualMachineFactory.create(router=True)
219
        request = {"wrong": "123"}
220
        url = join_urls(join_urls(ROUTERS_URL, str(router.id)),
221
                        "remove_router_interface")
222
        response = self.put(url, params=json.dumps(request),
223
                            user=router.userid)
224
        self.assertEqual(response.status_code, 400)
225

    
226
    def test_remove_interface_subnet(self):
227
        router = dbmf.VirtualMachineFactory.create(router=True)
228
        net1 = dbmf.NetworkFactory.create(external_router=True,
229
                                          userid=router.userid)
230
        subnet = dbmf.SubnetFactory.create(network=net1)
231
        nic = dbmf.NetworkInterfaceFactory.create(network=net1, machine=router)
232
        request = {"subnet_id": subnet.id}
233
        url = join_urls(join_urls(ROUTERS_URL, str(router.id)),
234
                        "remove_router_interface")
235
        response = self.put(url, params=json.dumps(request),
236
                            user=router.userid)
237
        self.assertEqual(response.status_code, 200)
238

    
239
    def test_add_interface_no_info(self):
240
        url = join_urls(join_urls(ROUTERS_URL, "123"), "add_router_interface")
241
        response = self.put(url, params="")
242
        self.assertEqual(response.status_code, 400)
243

    
244
    def test_add_interface_wrong_info(self):
245
        router = dbmf.VirtualMachineFactory.create(router=True)
246
        url = join_urls(join_urls(ROUTERS_URL, str(router.id)),
247
                        "add_router_interface")
248
        request = {}
249
        response = self.put(url, params=json.dumps(request),
250
                            user=router.userid)
251
        self.assertEqual(response.status_code, 400)
252

    
253
    def test_add_interface_unfound_subnet(self):
254
        router = dbmf.VirtualMachineFactory.create(router=True)
255
        url = join_urls(join_urls(ROUTERS_URL, str(router.id)),
256
                        "add_router_interface")
257
        request = {"subnet_id": "123"}
258
        response = self.put(url, params=json.dumps(request),
259
                            user=router.userid)
260
        self.assertEqual(response.status_code, 404)
261

    
262
    def test_add_interface_subnet(self):
263
        router = dbmf.VirtualMachineFactory.create(router=True)
264
        net1 = dbmf.NetworkFactory.create(external_router=True,
265
                                          userid=router.userid)
266
        subnet = dbmf.SubnetFactory.create(network=net1, ipversion=4)
267
        url = join_urls(join_urls(ROUTERS_URL, str(router.id)),
268
                        "add_router_interface")
269
        request = {"subnet_id": subnet.id}
270
        response = self.put(url, params=json.dumps(request),
271
                            user=router.userid)
272
        self.assertEqual(response.status_code, 200)