Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / neutron / tests / api.py @ 0dae1b9f

History | View | Annotate | Download (8.8 kB)

1 d6b24130 Marios Kogias
from snf_django.utils.testing import BaseAPITest
2 d6b24130 Marios Kogias
from django.utils import simplejson as json
3 d6b24130 Marios Kogias
from synnefo.cyclades_settings import cyclades_services
4 d6b24130 Marios Kogias
from synnefo.lib.services import get_service_path
5 d6b24130 Marios Kogias
from synnefo.lib import join_urls
6 d6e16760 Marios Kogias
import json
7 b0cda6f9 Marios Kogias
import synnefo.neutron.models_factory as mf
8 d6e16760 Marios Kogias
import synnefo.db.models_factory as dbmf
9 d6b24130 Marios Kogias
10 d6b24130 Marios Kogias
NEUTRON_URL = get_service_path(cyclades_services, "neutron", "v2.0")
11 d6b24130 Marios Kogias
NETWORKS_URL = join_urls(NEUTRON_URL, "networks/")
12 7eae8fce Dionysis Grigoropoulos
SUBNETS_URL = join_urls(NEUTRON_URL, "subnets/")
13 d6b24130 Marios Kogias
14 d6b24130 Marios Kogias
15 d6b24130 Marios Kogias
class NetworkTest(BaseAPITest):
16 b0cda6f9 Marios Kogias
17 d6b24130 Marios Kogias
    def test_list_networks(self):
18 d6b24130 Marios Kogias
        response = self.get(NETWORKS_URL)
19 d6b24130 Marios Kogias
        self.assertSuccess(response)
20 d6b24130 Marios Kogias
        networks = json.loads(response.content)
21 d6b24130 Marios Kogias
        self.assertEqual(networks, {'networks': []})
22 d6b24130 Marios Kogias
23 d6b24130 Marios Kogias
    def test_create_network(self):
24 d6e16760 Marios Kogias
        request = {
25 d6e16760 Marios Kogias
            "network": {
26 d6e16760 Marios Kogias
                "name": "sample_network"
27 b0cda6f9 Marios Kogias
                }
28 d6e16760 Marios Kogias
        }
29 b0cda6f9 Marios Kogias
        response = self.post(NETWORKS_URL, params=json.dumps(request))
30 d6b24130 Marios Kogias
        code = response.status_code
31 b0cda6f9 Marios Kogias
        self.assertEqual(code, 201)
32 b0cda6f9 Marios Kogias
33 d6e16760 Marios Kogias
    def test_create_network_no_name(self):
34 d6e16760 Marios Kogias
        response = self.post(NETWORKS_URL, params="")
35 d6e16760 Marios Kogias
        print response.content
36 d6e16760 Marios Kogias
        code = response.status_code
37 d6e16760 Marios Kogias
        self.assertEqual(code, 201)
38 d6b24130 Marios Kogias
39 d6b24130 Marios Kogias
    def test_get_unfound_network(self):
40 d6e16760 Marios Kogias
        url = join_urls(NETWORKS_URL, "123")
41 d6b24130 Marios Kogias
        response = self.get(url)
42 d6b24130 Marios Kogias
        self.assertItemNotFound(response)
43 d6b24130 Marios Kogias
44 b0cda6f9 Marios Kogias
    def test_get_network(self):
45 b0cda6f9 Marios Kogias
        test_net = mf.NetworkFactory.create()
46 d6e16760 Marios Kogias
        url = join_urls(NETWORKS_URL, str(test_net.id))
47 b0cda6f9 Marios Kogias
        response = self.get(url, user=test_net.userid)
48 d6e16760 Marios Kogias
        # validate response
49 d6e16760 Marios Kogias
        res = json.loads(response.content)
50 d6e16760 Marios Kogias
        net = res['network']
51 d6e16760 Marios Kogias
        keys = net.keys()
52 d6e16760 Marios Kogias
        must_send = set(["status", "subnets", "name", "admin_state_up",
53 d6e16760 Marios Kogias
                        "tenant_id", "id"])
54 d6e16760 Marios Kogias
        self.assertEqual(set(keys).issuperset(must_send), True)
55 b0cda6f9 Marios Kogias
        self.assertEqual(response.status_code, 200)
56 b0cda6f9 Marios Kogias
57 d6e16760 Marios Kogias
    def test_get_deleted_network(self):
58 d6e16760 Marios Kogias
        test_net = mf.NetworkFactory.create()
59 d6e16760 Marios Kogias
        url = join_urls(NETWORKS_URL, str(test_net.id))
60 d6e16760 Marios Kogias
        self.delete(url, user=test_net.userid)
61 d6e16760 Marios Kogias
        response = self.get(url, user=test_net.userid)
62 d6e16760 Marios Kogias
        self.assertEqual(response.status_code, 400)
63 d6e16760 Marios Kogias
64 d6b24130 Marios Kogias
    def test_delete_unfound_network(self):
65 d6e16760 Marios Kogias
        url = join_urls(NETWORKS_URL, "123")
66 b0cda6f9 Marios Kogias
        response = self.delete(url)
67 b0cda6f9 Marios Kogias
        self.assertItemNotFound(response)
68 b0cda6f9 Marios Kogias
69 b0cda6f9 Marios Kogias
    def test_delete_network(self):
70 b0cda6f9 Marios Kogias
        test_net = mf.NetworkFactory.create()
71 d6e16760 Marios Kogias
        url = join_urls(NETWORKS_URL, str(test_net.id))
72 b0cda6f9 Marios Kogias
        response = self.delete(url, user=test_net.userid)
73 b0cda6f9 Marios Kogias
        self.assertEqual(response.status_code, 204)
74 b0cda6f9 Marios Kogias
75 d6e16760 Marios Kogias
    def test_delete_network_in_use(self):
76 d6e16760 Marios Kogias
        test_net = mf.NetworkFactory.create()
77 d6e16760 Marios Kogias
        test_iface = mf.NetworkInterfaceFactory.create(network=test_net)
78 d6e16760 Marios Kogias
        url = join_urls(NETWORKS_URL, str(test_net.id))
79 d6e16760 Marios Kogias
        response = self.delete(url, user=test_net.userid)
80 d6e16760 Marios Kogias
        self.assertEqual(response.status_code, 409)
81 d6e16760 Marios Kogias
82 b0cda6f9 Marios Kogias
    def test_put_unfound_network(self):
83 d6e16760 Marios Kogias
        url = join_urls(NETWORKS_URL, "123")
84 d6b24130 Marios Kogias
        response = self.delete(url)
85 d6b24130 Marios Kogias
        self.assertItemNotFound(response)
86 d6b24130 Marios Kogias
87 b0cda6f9 Marios Kogias
    def test_put_network(self):
88 b0cda6f9 Marios Kogias
        test_net = mf.NetworkFactory.create()
89 d6e16760 Marios Kogias
        url = join_urls(NETWORKS_URL, str(test_net.id))
90 d6e16760 Marios Kogias
        request = {
91 d6e16760 Marios Kogias
            "network": {
92 d6e16760 Marios Kogias
                "name": "new_name"}
93 b0cda6f9 Marios Kogias
        }
94 d6e16760 Marios Kogias
        response = self.put(url, params=json.dumps(request),
95 d6e16760 Marios Kogias
                            user=test_net.userid)
96 b0cda6f9 Marios Kogias
        self.assertEqual(response.status_code, 200)
97 7eae8fce Dionysis Grigoropoulos
98 d6e16760 Marios Kogias
    def test_put_network_wrong_data(self):
99 b0cda6f9 Marios Kogias
        test_net = mf.NetworkFactory.create()
100 d6e16760 Marios Kogias
        url = join_urls(NETWORKS_URL, str(test_net.id))
101 d6e16760 Marios Kogias
        request = {
102 d6e16760 Marios Kogias
            "network": {
103 d6e16760 Marios Kogias
                "wronng_field": "new_name"}
104 b0cda6f9 Marios Kogias
        }
105 d6e16760 Marios Kogias
        response = self.put(url, params=json.dumps(request),
106 d6e16760 Marios Kogias
                            user=test_net.userid)
107 b0cda6f9 Marios Kogias
        self.assertEqual(response.status_code, 400)
108 7eae8fce Dionysis Grigoropoulos
109 d6e16760 Marios Kogias
    def test_put_no_data(self):
110 d6e16760 Marios Kogias
        test_net = mf.NetworkFactory.create()
111 d6e16760 Marios Kogias
        url = join_urls(NETWORKS_URL, str(test_net.id))
112 d6e16760 Marios Kogias
        print url
113 d6e16760 Marios Kogias
        response = self.put(url, params="", user=test_net.userid)
114 d6e16760 Marios Kogias
        self.assertEqual(response.status_code, 400)
115 d6e16760 Marios Kogias
116 d6e16760 Marios Kogias
117 7eae8fce Dionysis Grigoropoulos
class SubnetTest(BaseAPITest):
118 7eae8fce Dionysis Grigoropoulos
    def test_list_subnets(self):
119 0dae1b9f Dionysis Grigoropoulos
        '''Test list subnets without data'''
120 7eae8fce Dionysis Grigoropoulos
        response = self.get(SUBNETS_URL)
121 7eae8fce Dionysis Grigoropoulos
        self.assertSuccess(response)
122 7eae8fce Dionysis Grigoropoulos
        subnets = json.loads(response.content)
123 7eae8fce Dionysis Grigoropoulos
        self.assertEqual(subnets, {'subnets': []})
124 6de57f9c Dionysis Grigoropoulos
125 0dae1b9f Dionysis Grigoropoulos
    def test_list_subnets_data(self):
126 0dae1b9f Dionysis Grigoropoulos
        '''Test list subnets with data'''
127 0dae1b9f Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
128 0dae1b9f Dionysis Grigoropoulos
        test_subnet_ipv4 = mf.SubnetFactory(network=test_net)
129 0dae1b9f Dionysis Grigoropoulos
        test_subnet_ipv6 = mf.SubnetFactory(network=test_net, ipversion=6,
130 0dae1b9f Dionysis Grigoropoulos
                                            cidr='2620:0:2d0:200::7/32')
131 0dae1b9f Dionysis Grigoropoulos
        response = self.get(SUBNETS_URL, user=test_net.userid)
132 0dae1b9f Dionysis Grigoropoulos
        self.assertSuccess(response)
133 0dae1b9f Dionysis Grigoropoulos
134 6de57f9c Dionysis Grigoropoulos
    def test_get_subnet(self):
135 0dae1b9f Dionysis Grigoropoulos
        '''Test get info of a single subnet'''
136 0dae1b9f Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
137 0dae1b9f Dionysis Grigoropoulos
        test_subnet = mf.SubnetFactory(network=test_net)
138 0dae1b9f Dionysis Grigoropoulos
        url = join_urls(SUBNETS_URL, str(test_subnet.id))
139 0dae1b9f Dionysis Grigoropoulos
        response = self.get(url, user=test_net.userid)
140 6de57f9c Dionysis Grigoropoulos
        self.assertSuccess(response)
141 6de57f9c Dionysis Grigoropoulos
142 6de57f9c Dionysis Grigoropoulos
    def test_get_subnet_404(self):
143 6de57f9c Dionysis Grigoropoulos
        '''Test get info of a subnet that doesn't exist'''
144 0dae1b9f Dionysis Grigoropoulos
        url = join_urls(SUBNETS_URL, '42')
145 6de57f9c Dionysis Grigoropoulos
        response = self.get(url)
146 6de57f9c Dionysis Grigoropoulos
        self.assertItemNotFound(response)
147 6de57f9c Dionysis Grigoropoulos
148 f261896d Dionysis Grigoropoulos
    def test_subnet_delete(self):
149 882b662f Dionysis Grigoropoulos
        '''Test delete a subnet -- not supported'''
150 6de57f9c Dionysis Grigoropoulos
        url = join_urls(SUBNETS_URL, '42')
151 0dae1b9f Dionysis Grigoropoulos
        response = self.delete(url)
152 0dae1b9f Dionysis Grigoropoulos
        self.assertBadRequest(response)
153 0dae1b9f Dionysis Grigoropoulos
154 0dae1b9f Dionysis Grigoropoulos
   # def test_create_subnet_success(self):
155 0dae1b9f Dionysis Grigoropoulos
   #     '''Test create a subnet successfully'''
156 0dae1b9f Dionysis Grigoropoulos
   #     test_net = mf.NetworkFactory()
157 0dae1b9f Dionysis Grigoropoulos
   #     request = {
158 0dae1b9f Dionysis Grigoropoulos
   #         'subnet': {
159 0dae1b9f Dionysis Grigoropoulos
   #             'network_id': test_net.id,
160 0dae1b9f Dionysis Grigoropoulos
   #             'cidr': '10.0.3.0/24',
161 0dae1b9f Dionysis Grigoropoulos
   #             'ip_version': 4}
162 0dae1b9f Dionysis Grigoropoulos
   #     }
163 0dae1b9f Dionysis Grigoropoulos
   #     response = self.post(SUBNETS_URL, test_net.userid,
164 0dae1b9f Dionysis Grigoropoulos
   #                          json.dumps(request), "json")
165 0dae1b9f Dionysis Grigoropoulos
   #     self.assertSuccess(response)
166 0dae1b9f Dionysis Grigoropoulos
167 0dae1b9f Dionysis Grigoropoulos
    def test_create_subnet_with_invalid_network_id(self):
168 0dae1b9f Dionysis Grigoropoulos
        '''Test create a subnet with a network id that doesn't exist'''
169 0dae1b9f Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
170 0dae1b9f Dionysis Grigoropoulos
        request = {
171 0dae1b9f Dionysis Grigoropoulos
            'subnet': {
172 0dae1b9f Dionysis Grigoropoulos
                'network_id': '42',
173 0dae1b9f Dionysis Grigoropoulos
                'cidr': '10.0.3.0/24',
174 0dae1b9f Dionysis Grigoropoulos
                'ip_version': 4}
175 0dae1b9f Dionysis Grigoropoulos
        }
176 0dae1b9f Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid, json.dumps(request),
177 0dae1b9f Dionysis Grigoropoulos
                             "json")
178 6de57f9c Dionysis Grigoropoulos
        self.assertItemNotFound(response)
179 f261896d Dionysis Grigoropoulos
180 f261896d Dionysis Grigoropoulos
    def test_create_subnet_with_malformed_ipversion(self):
181 f261896d Dionysis Grigoropoulos
        '''Create a subnet with a malformed ip_version type'''
182 0dae1b9f Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
183 882b662f Dionysis Grigoropoulos
        request = {
184 882b662f Dionysis Grigoropoulos
            'subnet': {
185 0dae1b9f Dionysis Grigoropoulos
                'network_id': test_net.id,
186 882b662f Dionysis Grigoropoulos
                'cidr': '10.0.3.0/24',
187 882b662f Dionysis Grigoropoulos
                'ip_version': 8}
188 882b662f Dionysis Grigoropoulos
        }
189 0dae1b9f Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid, json.dumps(request),
190 0dae1b9f Dionysis Grigoropoulos
                             "json")
191 882b662f Dionysis Grigoropoulos
        self.assertBadRequest(response)
192 882b662f Dionysis Grigoropoulos
193 882b662f Dionysis Grigoropoulos
    def test_create_subnet_with_invalid_cidr(self):
194 882b662f Dionysis Grigoropoulos
        '''Create a subnet with an invalid cidr'''
195 0dae1b9f Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
196 882b662f Dionysis Grigoropoulos
        request = {
197 882b662f Dionysis Grigoropoulos
            'subnet': {
198 0dae1b9f Dionysis Grigoropoulos
                'network_id': test_net.id,
199 882b662f Dionysis Grigoropoulos
                'cidr': '192.168.3.0/8'}
200 882b662f Dionysis Grigoropoulos
        }
201 0dae1b9f Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid, json.dumps(request),
202 0dae1b9f Dionysis Grigoropoulos
                             "json")
203 882b662f Dionysis Grigoropoulos
        self.assertBadRequest(response)
204 f261896d Dionysis Grigoropoulos
205 882b662f Dionysis Grigoropoulos
    def test_create_subnet_with_invalid_gateway(self):
206 882b662f Dionysis Grigoropoulos
        '''Create a subnet with a gateway outside of the subnet range'''
207 0dae1b9f Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
208 882b662f Dionysis Grigoropoulos
        request = {
209 882b662f Dionysis Grigoropoulos
            'subnet': {
210 0dae1b9f Dionysis Grigoropoulos
                'network_id': test_net.id,
211 882b662f Dionysis Grigoropoulos
                'cidr': '192.168.3.0/24',
212 882b662f Dionysis Grigoropoulos
                'gateway_ip': '192.168.0.1'}
213 882b662f Dionysis Grigoropoulos
        }
214 0dae1b9f Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid, json.dumps(request),
215 0dae1b9f Dionysis Grigoropoulos
                             "json")
216 882b662f Dionysis Grigoropoulos
        self.assertBadRequest(response)
217 882b662f Dionysis Grigoropoulos
218 0dae1b9f Dionysis Grigoropoulos
    def test_create_subnet_with_invalid_name(self):
219 882b662f Dionysis Grigoropoulos
        '''Create a subnet with an invalid subnet name'''
220 0dae1b9f Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
221 882b662f Dionysis Grigoropoulos
        request = {
222 882b662f Dionysis Grigoropoulos
            'subnet': {
223 0dae1b9f Dionysis Grigoropoulos
                'network_id': test_net.id,
224 882b662f Dionysis Grigoropoulos
                'cidr': '192.168.3.0/24',
225 0dae1b9f Dionysis Grigoropoulos
                'name': 'a' * 300}
226 882b662f Dionysis Grigoropoulos
        }
227 0dae1b9f Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid, json.dumps(request),
228 0dae1b9f Dionysis Grigoropoulos
                             "json")
229 882b662f Dionysis Grigoropoulos
        self.assertBadRequest(response)
230 882b662f Dionysis Grigoropoulos
231 882b662f Dionysis Grigoropoulos
    def test_create_subnet_with_invalid_dhcp(self):
232 882b662f Dionysis Grigoropoulos
        '''Create a subnet with an invalid dhcp value'''
233 0dae1b9f Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
234 882b662f Dionysis Grigoropoulos
        request = {
235 882b662f Dionysis Grigoropoulos
            'subnet': {
236 0dae1b9f Dionysis Grigoropoulos
                'network_id': test_net.id,
237 882b662f Dionysis Grigoropoulos
                'cidr': '192.168.3.0/24',
238 882b662f Dionysis Grigoropoulos
                'enable_dhcp': 'None'}
239 882b662f Dionysis Grigoropoulos
        }
240 0dae1b9f Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid, json.dumps(request),
241 0dae1b9f Dionysis Grigoropoulos
                             "json")
242 f261896d Dionysis Grigoropoulos
        self.assertBadRequest(response)