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