Revision 5962d9a6
b/snf-cyclades-app/synnefo/logic/test/networks.py | ||
---|---|---|
1 |
# vim: set fileencoding=utf-8 : |
|
2 |
# Copyright 2013 GRNET S.A. All rights reserved. |
|
3 |
# |
|
4 |
# Redistribution and use in source and binary forms, with or without |
|
5 |
# modification, are permitted provided that the following conditions |
|
6 |
# are met: |
|
7 |
# |
|
8 |
# 1. Redistributions of source code must retain the above copyright |
|
9 |
# notice, this list of conditions and the following disclaimer. |
|
10 |
# |
|
11 |
# 2. Redistributions in binary form must reproduce the above copyright |
|
12 |
# notice, this list of conditions and the following disclaimer in the |
|
13 |
# documentation and/or other materials provided with the distribution. |
|
14 |
# |
|
15 |
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
|
16 |
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
17 |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
18 |
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
|
19 |
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
|
20 |
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
|
21 |
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
|
22 |
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
|
23 |
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
|
24 |
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
|
25 |
# SUCH DAMAGE. |
|
26 |
# |
|
27 |
# The views and conclusions contained in the software and documentation are |
|
28 |
# those of the authors and should not be interpreted as representing official |
|
29 |
# policies, either expressed or implied, of GRNET S.A. |
|
30 |
|
|
31 |
# Provides automated tests for logic module |
|
32 |
from django.test import TestCase |
|
33 |
from snf_django.lib.api import faults |
|
34 |
from snf_django.utils.testing import mocked_quotaholder |
|
35 |
from synnefo.logic import networks |
|
36 |
from synnefo.db import models_factory as mfactory |
|
37 |
from synnefo.db.models import BridgePoolTable, MacPrefixPoolTable |
|
38 |
from synnefo import settings |
|
39 |
from copy import copy |
|
40 |
|
|
41 |
|
|
42 |
#@patch("synnefo.logic.rapi_pool.GanetiRapiClient") |
|
43 |
class NetworkTest(TestCase): |
|
44 |
def test_create(self): |
|
45 |
kwargs = { |
|
46 |
"name": "test", |
|
47 |
"user_id": "user", |
|
48 |
"subnet": "192.168.20.0/24", |
|
49 |
"flavor": "CUSTOM", |
|
50 |
} |
|
51 |
# wrong gateway |
|
52 |
kw = copy(kwargs) |
|
53 |
kw["gateway"] = "192.168.3.1" |
|
54 |
self.assertRaises(faults.BadRequest, networks.create, **kw) |
|
55 |
# wrong subnet |
|
56 |
kw = copy(kwargs) |
|
57 |
kw["subnet"] = "192.168.2.0" |
|
58 |
self.assertRaises(faults.OverLimit, networks.create, **kw) |
|
59 |
kw["subnet"] = "192.168.0.0/16" |
|
60 |
self.assertRaises(faults.OverLimit, networks.create, **kw) |
|
61 |
kw["subnet"] = "192.168.0.3/24" |
|
62 |
self.assertRaises(faults.BadRequest, networks.create, **kw) |
|
63 |
# wrong flavor |
|
64 |
kw = copy(kwargs) |
|
65 |
kw["flavor"] = "UNKNOWN" |
|
66 |
self.assertRaises(faults.BadRequest, networks.create, **kw) |
|
67 |
# Test create objet |
|
68 |
kwargs["gateway"] = "192.168.20.1" |
|
69 |
kwargs["public"] = True |
|
70 |
kwargs["dhcp"] = False |
|
71 |
with mocked_quotaholder(): |
|
72 |
net = networks.create(**kwargs) |
|
73 |
self.assertEqual(net.subnet, "192.168.20.0/24") |
|
74 |
self.assertEqual(net.gateway, "192.168.20.1") |
|
75 |
self.assertEqual(net.public, True) |
|
76 |
self.assertEqual(net.flavor, "CUSTOM") |
|
77 |
self.assertEqual(net.dhcp, False) |
|
78 |
self.assertEqual(net.action, "CREATE") |
|
79 |
self.assertEqual(net.state, "ACTIVE") |
|
80 |
self.assertEqual(net.name, "test") |
|
81 |
self.assertEqual(net.userid, "user") |
|
82 |
|
|
83 |
# Test for each for flavor type |
|
84 |
# MAC_FILTERED |
|
85 |
kwargs["flavor"] = "MAC_FILTERED" |
|
86 |
# Test exception if no rules exists |
|
87 |
self.assertRaises(faults.ServiceUnavailable, networks.create, **kwargs) |
|
88 |
mfactory.MacPrefixPoolTableFactory(base="aa:bb:0") |
|
89 |
with mocked_quotaholder(): |
|
90 |
net = networks.create(**kwargs) |
|
91 |
self.assertEqual(net.mode, "bridged") |
|
92 |
self.assertEqual(net.mac_prefix, "aa:bb:1") |
|
93 |
self.assertEqual(net.link, settings.DEFAULT_MAC_FILTERED_BRIDGE) |
|
94 |
self.assertEqual(net.backend_tag, ["private-filtered"]) |
|
95 |
pool = MacPrefixPoolTable.get_pool() |
|
96 |
self.assertFalse(pool.is_available("aa:bb:1")) |
|
97 |
|
|
98 |
# PHYSICAL_VLAN |
|
99 |
kwargs["flavor"] = "PHYSICAL_VLAN" |
|
100 |
# Test exception if no rules exists |
|
101 |
self.assertRaises(faults.ServiceUnavailable, networks.create, **kwargs) |
|
102 |
mfactory.BridgePoolTableFactory(base="prv") |
|
103 |
with mocked_quotaholder(): |
|
104 |
net = networks.create(**kwargs) |
|
105 |
self.assertEqual(net.mode, "bridged") |
|
106 |
self.assertEqual(net.mac_prefix, settings.DEFAULT_MAC_PREFIX) |
|
107 |
self.assertEqual(net.link, "prv1") |
|
108 |
self.assertEqual(net.backend_tag, ["physical-vlan"]) |
|
109 |
pool = BridgePoolTable.get_pool() |
|
110 |
self.assertFalse(pool.is_available(net.link)) |
|
111 |
|
|
112 |
# IP_LESS_ROUTED |
|
113 |
kwargs["flavor"] = "IP_LESS_ROUTED" |
|
114 |
with mocked_quotaholder(): |
|
115 |
net = networks.create(**kwargs) |
|
116 |
self.assertEqual(net.mode, "routed") |
|
117 |
self.assertEqual(net.mac_prefix, settings.DEFAULT_MAC_PREFIX) |
|
118 |
self.assertEqual(net.link, settings.DEFAULT_ROUTING_TABLE) |
|
119 |
self.assertEqual(net.backend_tag, ["ip-less-routed"]) |
|
120 |
|
|
121 |
# CUSTOM |
|
122 |
kwargs["flavor"] = "CUSTOM" |
|
123 |
with mocked_quotaholder(): |
|
124 |
net = networks.create(**kwargs) |
|
125 |
self.assertEqual(net.mode, "bridged") |
|
126 |
self.assertEqual(net.mac_prefix, settings.DEFAULT_MAC_PREFIX) |
|
127 |
self.assertEqual(net.link, settings.DEFAULT_BRIDGE) |
|
128 |
self.assertEqual(net.backend_tag, []) |
|
129 |
|
|
130 |
def test_create_network_ipv6(self): |
|
131 |
kwargs = { |
|
132 |
"name": "test", |
|
133 |
"user_id": "user", |
|
134 |
"flavor": "CUSTOM", |
|
135 |
"subnet6": "2001:648:2ffc:1112::/64", |
|
136 |
} |
|
137 |
# Wrong subnet |
|
138 |
kw = copy(kwargs) |
|
139 |
kw["subnet6"] = "2001:64q:2ffc:1112::/64" |
|
140 |
self.assertRaises(faults.BadRequest, networks.create, **kw) |
|
141 |
# Wrong gateway |
|
142 |
kw = copy(kwargs) |
|
143 |
kw["gateway6"] = "2001:64q:2ffc:1119::1" |
|
144 |
self.assertRaises(faults.BadRequest, networks.create, **kw) |
|
145 |
# floating_ip_pools can not be ipv6 only |
|
146 |
kw = copy(kwargs) |
|
147 |
kw["floating_ip_pool"] = True |
|
148 |
self.assertRaises(faults.BadRequest, networks.create, **kw) |
|
149 |
kwargs["gateway6"] = "2001:648:2ffc:1112::1" |
|
150 |
with mocked_quotaholder(): |
|
151 |
net = networks.create(**kwargs) |
|
152 |
self.assertEqual(net.subnet6, "2001:648:2ffc:1112::/64") |
|
153 |
self.assertEqual(net.gateway6, "2001:648:2ffc:1112::1") |
|
154 |
self.assertRaises(Exception, net.get_pool) |
b/snf-cyclades-app/synnefo/logic/test/servers.py | ||
---|---|---|
1 |
# vim: set fileencoding=utf-8 : |
|
2 |
# Copyright 2013 GRNET S.A. All rights reserved. |
|
3 |
# |
|
4 |
# Redistribution and use in source and binary forms, with or without |
|
5 |
# modification, are permitted provided that the following conditions |
|
6 |
# are met: |
|
7 |
# |
|
8 |
# 1. Redistributions of source code must retain the above copyright |
|
9 |
# notice, this list of conditions and the following disclaimer. |
|
10 |
# |
|
11 |
# 2. Redistributions in binary form must reproduce the above copyright |
|
12 |
# notice, this list of conditions and the following disclaimer in the |
|
13 |
# documentation and/or other materials provided with the distribution. |
|
14 |
# |
|
15 |
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
|
16 |
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
17 |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
18 |
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
|
19 |
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
|
20 |
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
|
21 |
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
|
22 |
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
|
23 |
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
|
24 |
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
|
25 |
# SUCH DAMAGE. |
|
26 |
# |
|
27 |
# The views and conclusions contained in the software and documentation are |
|
28 |
# those of the authors and should not be interpreted as representing official |
|
29 |
# policies, either expressed or implied, of GRNET S.A. |
|
30 |
|
|
31 |
# Provides automated tests for logic module |
|
32 |
from django.test import TestCase |
|
33 |
#from snf_django.utils.testing import mocked_quotaholder |
|
34 |
from synnefo.logic import servers |
|
35 |
from synnefo.db import models_factory as mfactory |
|
36 |
from mock import patch |
|
37 |
|
|
38 |
|
|
39 |
@patch("synnefo.logic.rapi_pool.GanetiRapiClient") |
|
40 |
class ServerTest(TestCase): |
|
41 |
def test_connect_network(self, mrapi): |
|
42 |
# Common connect |
|
43 |
net = mfactory.NetworkFactory(subnet="192.168.2.0/24", |
|
44 |
gateway="192.168.2.1", |
|
45 |
state="ACTIVE", |
|
46 |
dhcp=True, |
|
47 |
flavor="CUSTOM") |
|
48 |
vm = mfactory.VirtualMachineFactory() |
|
49 |
mfactory.BackendNetworkFactory(network=net, backend=vm.backend) |
|
50 |
mrapi().ModifyInstance.return_value = 42 |
|
51 |
servers.connect(vm, net) |
|
52 |
pool = net.get_pool(with_lock=False) |
|
53 |
self.assertFalse(pool.is_available("192.168.2.2")) |
|
54 |
args, kwargs = mrapi().ModifyInstance.call_args |
|
55 |
nics = kwargs["nics"][0] |
|
56 |
self.assertEqual(args[0], vm.backend_vm_id) |
|
57 |
self.assertEqual(nics[0], "add") |
|
58 |
self.assertEqual(nics[1]["ip"], "192.168.2.2") |
|
59 |
self.assertEqual(nics[1]["network"], net.backend_id) |
|
60 |
|
|
61 |
# No dhcp |
|
62 |
vm = mfactory.VirtualMachineFactory() |
|
63 |
net = mfactory.NetworkFactory(subnet="192.168.2.0/24", |
|
64 |
gateway="192.168.2.1", |
|
65 |
state="ACTIVE", |
|
66 |
dhcp=False) |
|
67 |
mfactory.BackendNetworkFactory(network=net, backend=vm.backend) |
|
68 |
servers.connect(vm, net) |
|
69 |
pool = net.get_pool(with_lock=False) |
|
70 |
self.assertTrue(pool.is_available("192.168.2.2")) |
|
71 |
args, kwargs = mrapi().ModifyInstance.call_args |
|
72 |
nics = kwargs["nics"][0] |
|
73 |
self.assertEqual(args[0], vm.backend_vm_id) |
|
74 |
self.assertEqual(nics[0], "add") |
|
75 |
self.assertEqual(nics[1]["ip"], None) |
|
76 |
self.assertEqual(nics[1]["network"], net.backend_id) |
|
77 |
|
|
78 |
# Test connect to IPv6 only network |
|
79 |
vm = mfactory.VirtualMachineFactory() |
|
80 |
net = mfactory.NetworkFactory(subnet6="2000::/64", |
|
81 |
state="ACTIVE", |
|
82 |
gateway="2000::1") |
|
83 |
mfactory.BackendNetworkFactory(network=net, backend=vm.backend) |
|
84 |
servers.connect(vm, net) |
|
85 |
args, kwargs = mrapi().ModifyInstance.call_args |
|
86 |
nics = kwargs["nics"][0] |
|
87 |
self.assertEqual(args[0], vm.backend_vm_id) |
|
88 |
self.assertEqual(nics[0], "add") |
|
89 |
self.assertEqual(nics[1]["ip"], None) |
|
90 |
self.assertEqual(nics[1]["network"], net.backend_id) |
b/snf-cyclades-app/synnefo/logic/tests.py | ||
---|---|---|
139 | 139 |
try: |
140 | 140 |
servers.start(vm) |
141 | 141 |
except: |
142 |
m.resolve_commissions.assert_called_once_with('', [],
|
|
143 |
[vm.serial.serial])
|
|
142 |
m.resolve_commissions\
|
|
143 |
.assert_called_once_with('', [], [vm.serial.serial])
|
|
144 | 144 |
|
145 | 145 |
def test_task_after(self, mrapi): |
146 | 146 |
return |
... | ... | |
148 | 148 |
mrapi().StartupInstance.return_value = 1 |
149 | 149 |
mrapi().ShutdownInstance.return_value = 2 |
150 | 150 |
mrapi().RebootInstance.return_value = 2 |
151 |
with mocked_quotaholder() as m:
|
|
151 |
with mocked_quotaholder(): |
|
152 | 152 |
vm.task = None |
153 | 153 |
vm.operstate = "STOPPED" |
154 | 154 |
servers.start(vm) |
155 | 155 |
self.assertEqual(vm.task, "START") |
156 | 156 |
self.assertEqual(vm.task_job_id, 1) |
157 |
with mocked_quotaholder() as m:
|
|
157 |
with mocked_quotaholder(): |
|
158 | 158 |
vm.task = None |
159 | 159 |
vm.operstate = "STARTED" |
160 | 160 |
servers.stop(vm) |
161 | 161 |
self.assertEqual(vm.task, "STOP") |
162 | 162 |
self.assertEqual(vm.task_job_id, 2) |
163 |
with mocked_quotaholder() as m:
|
|
163 |
with mocked_quotaholder(): |
|
164 | 164 |
vm.task = None |
165 | 165 |
servers.reboot(vm) |
166 | 166 |
self.assertEqual(vm.task, "REBOOT") |
167 | 167 |
self.assertEqual(vm.task_job_id, 3) |
168 | 168 |
|
169 | 169 |
|
170 |
|
|
171 | 170 |
## Test Callbacks |
172 |
|
|
173 |
|
|
174 | 171 |
@patch('synnefo.lib.amqp.AMQPClient') |
175 | 172 |
class UpdateDBTest(TestCase): |
176 | 173 |
def create_msg(self, **kwargs): |
... | ... | |
272 | 269 |
fp1 = mfactory.FloatingIPFactory(machine=vm2, network=network) |
273 | 270 |
fp2 = mfactory.FloatingIPFactory(machine=vm2, network=network) |
274 | 271 |
mfactory.NetworkInterfaceFactory(machine=vm2, network=network, |
275 |
ipv4=fp1.ipv4) |
|
272 |
ipv4=fp1.ipv4)
|
|
276 | 273 |
mfactory.NetworkInterfaceFactory(machine=vm2, network=network, |
277 |
ipv4=fp2.ipv4) |
|
274 |
ipv4=fp2.ipv4)
|
|
278 | 275 |
pool = network.get_pool() |
279 | 276 |
pool.reserve(fp1.ipv4) |
280 | 277 |
pool.reserve(fp2.ipv4) |
... | ... | |
461 | 458 |
def test_empty_nic(self, client): |
462 | 459 |
vm = mfactory.VirtualMachineFactory(operstate='ERROR') |
463 | 460 |
for public in [True, False]: |
464 |
net = mfactory.NetworkFactory(public=public) |
|
461 |
net = mfactory.NetworkFactory(public=public, subnet6=None)
|
|
465 | 462 |
msg = self.create_msg(nics=[{'network': net.backend_id}], |
466 | 463 |
instance=vm.backend_vm_id) |
467 | 464 |
update_db(client, msg) |
... | ... | |
481 | 478 |
|
482 | 479 |
def test_full_nic(self, client): |
483 | 480 |
vm = mfactory.VirtualMachineFactory(operstate='ERROR') |
484 |
net = mfactory.NetworkFactory(subnet='10.0.0.0/24') |
|
481 |
net = mfactory.NetworkFactory(subnet='10.0.0.0/24', subnet6=None)
|
|
485 | 482 |
pool = net.get_pool() |
486 | 483 |
self.assertTrue(pool.is_available('10.0.0.22')) |
487 | 484 |
pool.save() |
... | ... | |
573 | 570 |
"""Test network creation when a backend is offline""" |
574 | 571 |
net = mfactory.NetworkFactory(state='ACTIVE') |
575 | 572 |
bn1 = mfactory.BackendNetworkFactory(network=net) |
576 |
bn2 = mfactory.BackendNetworkFactory(network=net,
|
|
577 |
backend__offline=True)
|
|
573 |
mfactory.BackendNetworkFactory(network=net, |
|
574 |
backend__offline=True) |
|
578 | 575 |
msg = self.create_msg(operation='OP_NETWORK_CONNECT', |
579 | 576 |
network=net.backend_id, |
580 | 577 |
cluster=bn1.backend.clustername) |
... | ... | |
889 | 886 |
"nic.networks": [], |
890 | 887 |
"tags": []}] |
891 | 888 |
self.reconciler.reconcile() |
892 |
cmrapi.DeleteInstance.assert_called_once_with(
|
|
893 |
"%s22" % settings.BACKEND_PREFIX_ID)
|
|
889 |
cmrapi.DeleteInstance\
|
|
890 |
.assert_called_once_with("%s22" % settings.BACKEND_PREFIX_ID)
|
|
894 | 891 |
|
895 | 892 |
def test_unsynced_operstate(self, mrapi): |
896 | 893 |
vm1 = mfactory.VirtualMachineFactory(backend=self.backend, |
... | ... | |
972 | 969 |
|
973 | 970 |
from synnefo.logic.test.rapi_pool_tests import * |
974 | 971 |
from synnefo.logic.test.utils_tests import * |
972 |
from synnefo.logic.test.networks import * |
|
973 |
from synnefo.logic.test.servers import * |
Also available in: Unified diff