Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / logic / tests / servers.py @ 6e9255ab

History | View | Annotate | Download (10.8 kB)

1 0208770b Christos Stavrakakis
# vim: set fileencoding=utf-8 :
2 0208770b Christos Stavrakakis
# Copyright 2013 GRNET S.A. All rights reserved.
3 0208770b Christos Stavrakakis
#
4 0208770b Christos Stavrakakis
# Redistribution and use in source and binary forms, with or without
5 0208770b Christos Stavrakakis
# modification, are permitted provided that the following conditions
6 0208770b Christos Stavrakakis
# are met:
7 0208770b Christos Stavrakakis
#
8 0208770b Christos Stavrakakis
#   1. Redistributions of source code must retain the above copyright
9 0208770b Christos Stavrakakis
#      notice, this list of conditions and the following disclaimer.
10 0208770b Christos Stavrakakis
#
11 0208770b Christos Stavrakakis
#  2. Redistributions in binary form must reproduce the above copyright
12 0208770b Christos Stavrakakis
#     notice, this list of conditions and the following disclaimer in the
13 0208770b Christos Stavrakakis
#     documentation and/or other materials provided with the distribution.
14 0208770b Christos Stavrakakis
#
15 0208770b Christos Stavrakakis
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
16 0208770b Christos Stavrakakis
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 0208770b Christos Stavrakakis
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 0208770b Christos Stavrakakis
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
19 0208770b Christos Stavrakakis
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 0208770b Christos Stavrakakis
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 0208770b Christos Stavrakakis
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 0208770b Christos Stavrakakis
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 0208770b Christos Stavrakakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 0208770b Christos Stavrakakis
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 0208770b Christos Stavrakakis
# SUCH DAMAGE.
26 0208770b Christos Stavrakakis
#
27 0208770b Christos Stavrakakis
# The views and conclusions contained in the software and documentation are
28 0208770b Christos Stavrakakis
# those of the authors and should not be interpreted as representing official
29 0208770b Christos Stavrakakis
# policies, either expressed or implied, of GRNET S.A.
30 0208770b Christos Stavrakakis
31 0208770b Christos Stavrakakis
# Provides automated tests for logic module
32 0208770b Christos Stavrakakis
from django.test import TestCase
33 0208770b Christos Stavrakakis
#from snf_django.utils.testing import mocked_quotaholder
34 0208770b Christos Stavrakakis
from synnefo.logic import servers
35 0208770b Christos Stavrakakis
from synnefo.db import models_factory as mfactory
36 0208770b Christos Stavrakakis
from mock import patch
37 0208770b Christos Stavrakakis
38 0208770b Christos Stavrakakis
from snf_django.lib.api import faults
39 0208770b Christos Stavrakakis
from snf_django.utils.testing import mocked_quotaholder, override_settings
40 0208770b Christos Stavrakakis
from synnefo import settings
41 0208770b Christos Stavrakakis
42 0208770b Christos Stavrakakis
43 0208770b Christos Stavrakakis
@patch("synnefo.logic.rapi_pool.GanetiRapiClient")
44 0208770b Christos Stavrakakis
class ServerTest(TestCase):
45 0208770b Christos Stavrakakis
    def test_create(self, mrapi):
46 0208770b Christos Stavrakakis
        flavor = mfactory.FlavorFactory()
47 0208770b Christos Stavrakakis
        backend = mfactory.BackendFactory()
48 0208770b Christos Stavrakakis
        kwargs = {
49 0208770b Christos Stavrakakis
            "userid": "test",
50 0208770b Christos Stavrakakis
            "name": "test_vm",
51 0208770b Christos Stavrakakis
            "password": "1234",
52 0208770b Christos Stavrakakis
            "flavor": flavor,
53 0208770b Christos Stavrakakis
            "image": {"id": "foo", "backend_id": "foo", "format": "diskdump",
54 0208770b Christos Stavrakakis
                      "metadata": "{}"},
55 0208770b Christos Stavrakakis
            "metadata": {"foo": "bar"},
56 0208770b Christos Stavrakakis
            "personality": [],
57 0208770b Christos Stavrakakis
            "use_backend": backend,
58 0208770b Christos Stavrakakis
        }
59 0208770b Christos Stavrakakis
60 0208770b Christos Stavrakakis
        mrapi().CreateInstance.return_value = 42
61 0208770b Christos Stavrakakis
        with override_settings(settings,
62 0208770b Christos Stavrakakis
                               DEFAULT_INSTANCE_NETWORKS=[]):
63 0208770b Christos Stavrakakis
            with mocked_quotaholder():
64 0208770b Christos Stavrakakis
                vm = servers.create(**kwargs)
65 0208770b Christos Stavrakakis
        self.assertEqual(vm.nics.count(), 0)
66 0208770b Christos Stavrakakis
67 0208770b Christos Stavrakakis
        # test connect in IPv6 only network
68 0208770b Christos Stavrakakis
        net = mfactory.IPv6NetworkFactory(state="ACTIVE")
69 0208770b Christos Stavrakakis
        mfactory.BackendNetworkFactory(network=net)
70 0208770b Christos Stavrakakis
        with override_settings(settings,
71 0208770b Christos Stavrakakis
                               DEFAULT_INSTANCE_NETWORKS=[str(net.id)]):
72 0208770b Christos Stavrakakis
            with mocked_quotaholder():
73 0208770b Christos Stavrakakis
                vm = servers.create(**kwargs)
74 0208770b Christos Stavrakakis
        nics = vm.nics.all()
75 0208770b Christos Stavrakakis
        self.assertEqual(len(nics), 1)
76 0208770b Christos Stavrakakis
        self.assertEqual(nics[0].ipv4, None)
77 0208770b Christos Stavrakakis
        args, kwargs = mrapi().CreateInstance.call_args
78 0208770b Christos Stavrakakis
        ganeti_nic = kwargs["nics"][0]
79 0208770b Christos Stavrakakis
        self.assertEqual(ganeti_nic["ip"], None)
80 0208770b Christos Stavrakakis
        self.assertEqual(ganeti_nic["network"], net.backend_id)
81 0208770b Christos Stavrakakis
82 0208770b Christos Stavrakakis
    def test_connect_network(self, mrapi):
83 0208770b Christos Stavrakakis
        # Common connect
84 0208770b Christos Stavrakakis
        net = mfactory.NetworkFactory(subnet="192.168.2.0/24",
85 0208770b Christos Stavrakakis
                                      gateway="192.168.2.1",
86 0208770b Christos Stavrakakis
                                      state="ACTIVE",
87 0208770b Christos Stavrakakis
                                      dhcp=True,
88 0208770b Christos Stavrakakis
                                      flavor="CUSTOM")
89 0208770b Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate="ACTIVE")
90 0208770b Christos Stavrakakis
        mfactory.BackendNetworkFactory(network=net, backend=vm.backend)
91 0208770b Christos Stavrakakis
        mrapi().ModifyInstance.return_value = 42
92 0208770b Christos Stavrakakis
        servers.connect(vm, net)
93 0208770b Christos Stavrakakis
        pool = net.get_pool(with_lock=False)
94 0208770b Christos Stavrakakis
        self.assertFalse(pool.is_available("192.168.2.2"))
95 0208770b Christos Stavrakakis
        args, kwargs = mrapi().ModifyInstance.call_args
96 0208770b Christos Stavrakakis
        nics = kwargs["nics"][0]
97 0208770b Christos Stavrakakis
        self.assertEqual(args[0], vm.backend_vm_id)
98 0208770b Christos Stavrakakis
        self.assertEqual(nics[0], "add")
99 0208770b Christos Stavrakakis
        self.assertEqual(nics[1]["ip"], "192.168.2.2")
100 0208770b Christos Stavrakakis
        self.assertEqual(nics[1]["network"], net.backend_id)
101 0208770b Christos Stavrakakis
102 0208770b Christos Stavrakakis
        # No dhcp
103 0208770b Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate="ACTIVE")
104 0208770b Christos Stavrakakis
        net = mfactory.NetworkFactory(subnet="192.168.2.0/24",
105 0208770b Christos Stavrakakis
                                      gateway="192.168.2.1",
106 0208770b Christos Stavrakakis
                                      state="ACTIVE",
107 0208770b Christos Stavrakakis
                                      dhcp=False)
108 0208770b Christos Stavrakakis
        mfactory.BackendNetworkFactory(network=net, backend=vm.backend)
109 0208770b Christos Stavrakakis
        servers.connect(vm, net)
110 0208770b Christos Stavrakakis
        pool = net.get_pool(with_lock=False)
111 0208770b Christos Stavrakakis
        self.assertTrue(pool.is_available("192.168.2.2"))
112 0208770b Christos Stavrakakis
        args, kwargs = mrapi().ModifyInstance.call_args
113 0208770b Christos Stavrakakis
        nics = kwargs["nics"][0]
114 0208770b Christos Stavrakakis
        self.assertEqual(args[0], vm.backend_vm_id)
115 0208770b Christos Stavrakakis
        self.assertEqual(nics[0], "add")
116 0208770b Christos Stavrakakis
        self.assertEqual(nics[1]["ip"], None)
117 0208770b Christos Stavrakakis
        self.assertEqual(nics[1]["network"], net.backend_id)
118 0208770b Christos Stavrakakis
119 0208770b Christos Stavrakakis
        # Test connect to IPv6 only network
120 0208770b Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate="ACTIVE")
121 0208770b Christos Stavrakakis
        net = mfactory.NetworkFactory(subnet6="2000::/64",
122 0208770b Christos Stavrakakis
                                      state="ACTIVE",
123 0208770b Christos Stavrakakis
                                      gateway="2000::1")
124 0208770b Christos Stavrakakis
        mfactory.BackendNetworkFactory(network=net, backend=vm.backend)
125 0208770b Christos Stavrakakis
        servers.connect(vm, net)
126 0208770b Christos Stavrakakis
        args, kwargs = mrapi().ModifyInstance.call_args
127 0208770b Christos Stavrakakis
        nics = kwargs["nics"][0]
128 0208770b Christos Stavrakakis
        self.assertEqual(args[0], vm.backend_vm_id)
129 0208770b Christos Stavrakakis
        self.assertEqual(nics[0], "add")
130 0208770b Christos Stavrakakis
        self.assertEqual(nics[1]["ip"], None)
131 0208770b Christos Stavrakakis
        self.assertEqual(nics[1]["network"], net.backend_id)
132 0208770b Christos Stavrakakis
133 0208770b Christos Stavrakakis
134 0208770b Christos Stavrakakis
@patch("synnefo.logic.rapi_pool.GanetiRapiClient")
135 0208770b Christos Stavrakakis
class ServerCommandTest(TestCase):
136 0208770b Christos Stavrakakis
    def test_pending_task(self, mrapi):
137 0208770b Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(task="REBOOT", task_job_id=1)
138 0208770b Christos Stavrakakis
        self.assertRaises(faults.BadRequest, servers.start, vm)
139 0208770b Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(task="BUILD", task_job_id=1)
140 0208770b Christos Stavrakakis
        self.assertRaises(faults.BuildInProgress, servers.start, vm)
141 0208770b Christos Stavrakakis
        # Assert always succeeds
142 0208770b Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(task="BUILD", task_job_id=1)
143 0208770b Christos Stavrakakis
        mrapi().DeleteInstance.return_value = 1
144 0208770b Christos Stavrakakis
        with mocked_quotaholder():
145 0208770b Christos Stavrakakis
            servers.destroy(vm)
146 0208770b Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(task="REBOOT", task_job_id=1)
147 0208770b Christos Stavrakakis
        with mocked_quotaholder():
148 0208770b Christos Stavrakakis
            servers.destroy(vm)
149 0208770b Christos Stavrakakis
150 0208770b Christos Stavrakakis
    def test_deleted_vm(self, mrapi):
151 0208770b Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(deleted=True)
152 0208770b Christos Stavrakakis
        self.assertRaises(faults.BadRequest, servers.start, vm)
153 0208770b Christos Stavrakakis
154 0208770b Christos Stavrakakis
    def test_invalid_operstate_for_action(self, mrapi):
155 0208770b Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate="STARTED")
156 0208770b Christos Stavrakakis
        self.assertRaises(faults.BadRequest, servers.start, vm)
157 0208770b Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate="STOPPED")
158 0208770b Christos Stavrakakis
        self.assertRaises(faults.BadRequest, servers.stop, vm)
159 0208770b Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate="STARTED")
160 0208770b Christos Stavrakakis
        self.assertRaises(faults.BadRequest, servers.resize, vm)
161 0208770b Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate="STOPPED")
162 0208770b Christos Stavrakakis
        self.assertRaises(faults.BadRequest, servers.stop, vm)
163 0208770b Christos Stavrakakis
        #test valid
164 0208770b Christos Stavrakakis
        mrapi().StartupInstance.return_value = 1
165 0208770b Christos Stavrakakis
        with mocked_quotaholder():
166 0208770b Christos Stavrakakis
            servers.start(vm)
167 0208770b Christos Stavrakakis
        vm.task = None
168 0208770b Christos Stavrakakis
        vm.task_job_id = None
169 0208770b Christos Stavrakakis
        vm.save()
170 0208770b Christos Stavrakakis
        mrapi().RebootInstance.return_value = 1
171 0208770b Christos Stavrakakis
        with mocked_quotaholder():
172 0208770b Christos Stavrakakis
            servers.reboot(vm, "HARD")
173 0208770b Christos Stavrakakis
174 0208770b Christos Stavrakakis
    def test_commission(self, mrapi):
175 0208770b Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate="STOPPED")
176 0208770b Christos Stavrakakis
        # Still pending
177 0208770b Christos Stavrakakis
        vm.serial = mfactory.QuotaHolderSerialFactory(serial=200,
178 0208770b Christos Stavrakakis
                                                      resolved=False,
179 0208770b Christos Stavrakakis
                                                      pending=True)
180 0208770b Christos Stavrakakis
        serial = vm.serial
181 0208770b Christos Stavrakakis
        mrapi().StartupInstance.return_value = 1
182 0208770b Christos Stavrakakis
        with mocked_quotaholder() as m:
183 0208770b Christos Stavrakakis
            servers.start(vm)
184 0208770b Christos Stavrakakis
            m.resolve_commissions.assert_called_once_with('', [],
185 0208770b Christos Stavrakakis
                                                          [serial.serial])
186 0208770b Christos Stavrakakis
            self.assertTrue(m.issue_one_commission.called)
187 0208770b Christos Stavrakakis
        # Not pending, rejct
188 0208770b Christos Stavrakakis
        vm.task = None
189 0208770b Christos Stavrakakis
        vm.serial = mfactory.QuotaHolderSerialFactory(serial=400,
190 0208770b Christos Stavrakakis
                                                      resolved=False,
191 0208770b Christos Stavrakakis
                                                      pending=False,
192 0208770b Christos Stavrakakis
                                                      accept=False)
193 0208770b Christos Stavrakakis
        serial = vm.serial
194 0208770b Christos Stavrakakis
        mrapi().StartupInstance.return_value = 1
195 0208770b Christos Stavrakakis
        with mocked_quotaholder() as m:
196 0208770b Christos Stavrakakis
            servers.start(vm)
197 0208770b Christos Stavrakakis
            m.resolve_commissions.assert_called_once_with('', [],
198 0208770b Christos Stavrakakis
                                                          [serial.serial])
199 0208770b Christos Stavrakakis
            self.assertTrue(m.issue_one_commission.called)
200 0208770b Christos Stavrakakis
        # Not pending, accept
201 0208770b Christos Stavrakakis
        vm.task = None
202 0208770b Christos Stavrakakis
        vm.serial = mfactory.QuotaHolderSerialFactory(serial=600,
203 0208770b Christos Stavrakakis
                                                      resolved=False,
204 0208770b Christos Stavrakakis
                                                      pending=False,
205 0208770b Christos Stavrakakis
                                                      accept=True)
206 0208770b Christos Stavrakakis
        serial = vm.serial
207 0208770b Christos Stavrakakis
        mrapi().StartupInstance.return_value = 1
208 0208770b Christos Stavrakakis
        with mocked_quotaholder() as m:
209 0208770b Christos Stavrakakis
            servers.start(vm)
210 0208770b Christos Stavrakakis
            m.resolve_commissions.assert_called_once_with('', [serial.serial],
211 0208770b Christos Stavrakakis
                                                          [])
212 0208770b Christos Stavrakakis
            self.assertTrue(m.issue_one_commission.called)
213 0208770b Christos Stavrakakis
214 0208770b Christos Stavrakakis
        mrapi().StartupInstance.side_effect = ValueError
215 0208770b Christos Stavrakakis
        vm.task = None
216 0208770b Christos Stavrakakis
        vm.serial = None
217 0208770b Christos Stavrakakis
        # Test reject if Ganeti erro
218 0208770b Christos Stavrakakis
        with mocked_quotaholder() as m:
219 0208770b Christos Stavrakakis
            try:
220 0208770b Christos Stavrakakis
                servers.start(vm)
221 0208770b Christos Stavrakakis
            except:
222 0208770b Christos Stavrakakis
                m.resolve_commissions\
223 0208770b Christos Stavrakakis
                 .assert_called_once_with('', [], [vm.serial.serial])
224 0208770b Christos Stavrakakis
225 0208770b Christos Stavrakakis
    def test_task_after(self, mrapi):
226 0208770b Christos Stavrakakis
        return
227 0208770b Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
228 0208770b Christos Stavrakakis
        mrapi().StartupInstance.return_value = 1
229 0208770b Christos Stavrakakis
        mrapi().ShutdownInstance.return_value = 2
230 0208770b Christos Stavrakakis
        mrapi().RebootInstance.return_value = 2
231 0208770b Christos Stavrakakis
        with mocked_quotaholder():
232 0208770b Christos Stavrakakis
            vm.task = None
233 0208770b Christos Stavrakakis
            vm.operstate = "STOPPED"
234 0208770b Christos Stavrakakis
            servers.start(vm)
235 0208770b Christos Stavrakakis
            self.assertEqual(vm.task, "START")
236 0208770b Christos Stavrakakis
            self.assertEqual(vm.task_job_id, 1)
237 0208770b Christos Stavrakakis
        with mocked_quotaholder():
238 0208770b Christos Stavrakakis
            vm.task = None
239 0208770b Christos Stavrakakis
            vm.operstate = "STARTED"
240 0208770b Christos Stavrakakis
            servers.stop(vm)
241 0208770b Christos Stavrakakis
            self.assertEqual(vm.task, "STOP")
242 0208770b Christos Stavrakakis
            self.assertEqual(vm.task_job_id, 2)
243 0208770b Christos Stavrakakis
        with mocked_quotaholder():
244 0208770b Christos Stavrakakis
            vm.task = None
245 0208770b Christos Stavrakakis
            servers.reboot(vm)
246 0208770b Christos Stavrakakis
            self.assertEqual(vm.task, "REBOOT")
247 0208770b Christos Stavrakakis
            self.assertEqual(vm.task_job_id, 3)