1
# vim: tabstop=4 shiftwidth=4 softtabstop=4
4
# Copyright 2012 Hewlett-Packard Development Company, L.P.
7
# Licensed under the Apache License, Version 2.0 (the "License"); you may
8
# not use this file except in compliance with the License. You may obtain
9
# a copy of the License at
11
# http://www.apache.org/licenses/LICENSE-2.0
13
# Unless required by applicable law or agreed to in writing, software
14
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
16
# License for the specific language governing permissions and limitations
19
"""Tests for baremetal virtual power driver."""
22
from oslo.config import cfg
24
from nova import exception
25
from nova.tests.baremetal.db import base as bm_db_base
26
from nova.tests.baremetal.db import utils as bm_db_utils
27
from nova.tests.image import fake as fake_image
28
from nova.tests import utils
29
from nova import utils as nutils
30
from nova.virt.baremetal import db
31
from nova.virt.baremetal import virtual_power_driver
32
import nova.virt.powervm.common as connection
37
firewall_driver='nova.virt.baremetal.fake.FakeFirewallDriver',
41
BAREMETAL_FLAGS = dict(
42
driver='nova.virt.baremetal.pxe.PXE',
43
instance_type_extra_specs=['cpu_arch:test', 'test_spec:test_value'],
45
'nova.virt.baremetal.virtual_power_driver.VirtualPowerManager',
46
vif_driver='nova.virt.baremetal.fake.FakeVifDriver',
47
volume_driver='nova.virt.baremetal.fake.FakeVolumeDriver',
48
virtual_power_ssh_host=None,
49
virtual_power_type='vbox',
50
virtual_power_host_user=None,
51
virtual_power_host_pass=None,
56
class BareMetalVPDTestCase(bm_db_base.BMDBTestCase):
59
super(BareMetalVPDTestCase, self).setUp()
60
self.flags(**COMMON_FLAGS)
61
self.flags(**BAREMETAL_FLAGS)
63
fake_image.stub_out_image_service(self.stubs)
64
self.context = utils.get_test_admin_context()
65
self.test_block_device_info = None,
66
self.instance = utils.get_test_instance()
67
self.test_network_info = utils.get_test_network_info(),
68
self.node_info = bm_db_utils.new_bm_node(
70
service_host='test_host',
73
prov_mac_address='11:11:11:11:11:11',
76
{'address': '22:22:22:22:22:22', 'datapath_id': '0x1',
78
{'address': '33:33:33:33:33:33', 'datapath_id': '0x2',
81
self.addCleanup(fake_image.FakeImageService_reset)
83
def _create_node(self):
84
self.node = db.bm_node_create(self.context, self.node_info)
85
for nic in self.nic_info:
86
db.bm_interface_create(
93
self.instance['node'] = self.node['id']
96
self.pm = virtual_power_driver.VirtualPowerManager(
98
instance=self.instance)
102
class VPDMissingOptionsTestCase(BareMetalVPDTestCase):
104
def test_get_conn_missing_options(self):
105
self.flags(virtual_power_ssh_host=None, group="baremetal")
106
self.flags(virtual_power_host_user=None, group="baremetal")
107
self.flags(virtual_power_host_pass=None, group="baremetal")
111
self.assertRaises(exception.NovaException,
114
self.flags(virtual_power_ssh_host='127.0.0.1', group="baremetal")
115
self.assertRaises(exception.NovaException,
118
self.flags(virtual_power_host_user='user', group="baremetal")
119
self.assertRaises(exception.NovaException,
123
class VPDClassMethodsTestCase(BareMetalVPDTestCase):
126
super(VPDClassMethodsTestCase, self).setUp()
127
self.flags(virtual_power_ssh_host='127.0.0.1', group="baremetal")
128
self.flags(virtual_power_host_user='user', group="baremetal")
129
self.flags(virtual_power_host_pass='password', group="baremetal")
131
def test_get_conn_success(self):
134
self._conn = self.pm._get_conn()
135
self.mox.StubOutWithMock(connection, 'ssh_connect')
136
connection.ssh_connect(mox.IsA(self._conn)).AndReturn(True)
138
self.pm._set_connection()
139
self.assertEqual(self.pm.connection_data.host, '127.0.0.1')
140
self.assertEqual(self.pm.connection_data.username, 'user')
141
self.assertEqual(self.pm.connection_data.password, 'password')
144
def test_get_full_node_list(self):
148
self.mox.StubOutWithMock(self.pm, '_run_command')
149
cmd = self.pm._vp_cmd.list_cmd
150
self.pm._run_command(cmd).AndReturn("testNode")
153
name = self.pm._get_full_node_list()
154
self.assertEqual(name, 'testNode')
157
def test_check_for_node(self):
161
self.mox.StubOutWithMock(self.pm, '_get_full_node_list')
162
self.pm._get_full_node_list().\
163
AndReturn(["testNode"])
165
self.mox.StubOutWithMock(self.pm, '_run_command')
166
cmd = self.pm._vp_cmd.get_node_macs.replace('{_NodeName_}', 'testNode')
167
self.pm._run_command(cmd).\
168
AndReturn(["111111111111", "ffeeddccbbaa"])
171
name = self.pm._check_for_node()
172
self.assertEqual(name, 'testNode')
175
def test_check_for_node_not_found(self):
179
self.mox.StubOutWithMock(self.pm, '_get_full_node_list')
180
self.pm._get_full_node_list().AndReturn(["testNode"])
182
self.mox.StubOutWithMock(self.pm, '_run_command')
183
cmd = self.pm._vp_cmd.get_node_macs.replace('{_NodeName_}', 'testNode')
184
self.pm._run_command(cmd).AndReturn(["aabbccddeeff", "ffeeddccbbaa"])
187
name = self.pm._check_for_node()
188
self.assertEqual(name, '')
191
def test_activate_node(self):
195
self.mox.StubOutWithMock(self.pm, '_check_for_node')
196
self.mox.StubOutWithMock(self.pm, '_run_command')
197
self.mox.StubOutWithMock(self.pm, 'is_power_on')
198
self.pm._check_for_node().AndReturn("testNode")
199
self.pm._run_command(self.pm._vp_cmd.start_cmd).AndReturn("Started")
200
self.pm.is_power_on().AndReturn(True)
202
state = self.pm.activate_node()
203
self.assertEqual(state, 'active')
206
def test_activate_node_fail(self):
210
self.mox.StubOutWithMock(self.pm, '_check_for_node')
211
self.mox.StubOutWithMock(self.pm, '_run_command')
212
self.mox.StubOutWithMock(self.pm, 'is_power_on')
213
self.pm._check_for_node().AndReturn("testNode")
214
self.pm._run_command(self.pm._vp_cmd.start_cmd).AndReturn("Started")
215
self.pm.is_power_on().AndReturn(False)
217
state = self.pm.activate_node()
218
self.assertEqual(state, 'error')
221
def test_deactivate_node(self):
225
self.mox.StubOutWithMock(self.pm, '_check_for_node')
226
self.mox.StubOutWithMock(self.pm, '_run_command')
227
self.mox.StubOutWithMock(self.pm, 'is_power_on')
228
self.pm._check_for_node().AndReturn("testNode")
229
self.pm.is_power_on().AndReturn(True)
230
self.pm._run_command(self.pm._vp_cmd.stop_cmd).AndReturn("Stopped")
231
self.pm.is_power_on().AndReturn(False)
233
state = self.pm.deactivate_node()
234
self.assertEqual(state, 'deleted')
237
def test_deactivate_node_fail(self):
241
self.mox.StubOutWithMock(self.pm, '_check_for_node')
242
self.mox.StubOutWithMock(self.pm, '_run_command')
243
self.mox.StubOutWithMock(self.pm, 'is_power_on')
244
self.pm._check_for_node().AndReturn("testNode")
245
self.pm.is_power_on().AndReturn(True)
246
self.pm._run_command(self.pm._vp_cmd.stop_cmd).AndReturn("Stopped")
247
self.pm.is_power_on().AndReturn(True)
249
state = self.pm.deactivate_node()
250
self.assertEqual(state, 'error')
253
def test_reboot_node(self):
257
self.mox.StubOutWithMock(self.pm, '_check_for_node')
258
self.mox.StubOutWithMock(self.pm, '_run_command')
259
self.mox.StubOutWithMock(self.pm, 'is_power_on')
260
self.pm._check_for_node().AndReturn(["testNode"])
261
self.pm._run_command(self.pm._vp_cmd.reboot_cmd).AndReturn("Restarted")
262
self.pm.is_power_on().AndReturn(True)
264
state = self.pm.reboot_node()
265
self.assertEqual(state, 'active')
268
def test_reboot_node_fail(self):
272
self.mox.StubOutWithMock(self.pm, '_check_for_node')
273
self.mox.StubOutWithMock(self.pm, '_run_command')
274
self.mox.StubOutWithMock(self.pm, 'is_power_on')
275
self.pm._check_for_node().AndReturn(["testNode"])
276
self.pm._run_command(self.pm._vp_cmd.reboot_cmd).AndReturn("Restarted")
277
self.pm.is_power_on().AndReturn(False)
279
state = self.pm.reboot_node()
280
self.assertEqual(state, 'error')
283
def test_is_power_on(self):
287
self.mox.StubOutWithMock(self.pm, '_check_for_node')
288
self.mox.StubOutWithMock(self.pm, '_run_command')
289
self.pm._check_for_node().AndReturn(["testNode"])
290
self.pm._run_command(self.pm._vp_cmd.list_running_cmd).\
291
AndReturn(["testNode"])
292
self.pm._matched_name = 'testNode'
294
state = self.pm.is_power_on()
295
self.assertEqual(state, True)
298
def test_is_power_on_fail(self):
302
self.mox.StubOutWithMock(self.pm, '_check_for_node')
303
self.mox.StubOutWithMock(self.pm, '_run_command')
304
self.pm._check_for_node().AndReturn(["NotFoundNode"])
305
self.pm._run_command(self.pm._vp_cmd.list_running_cmd).\
306
AndReturn(["NotFoundNode"])
307
self.pm._matched_name = 'testNode'
309
state = self.pm.is_power_on()
310
self.assertEqual(state, False)
313
def test_run_command(self):
317
self.mox.StubOutWithMock(self.pm, '_set_connection')
318
self.mox.StubOutWithMock(nutils, 'ssh_execute')
319
self.pm._set_connection().AndReturn(True)
320
nutils.ssh_execute(None, '/usr/bin/VBoxManage test return',
321
check_exit_code=True).AndReturn(("test\nreturn", ""))
322
self.pm._matched_name = 'testNode'
324
result = self.pm._run_command("test return")
325
self.assertEqual(result, ['test', 'return'])
328
def test_run_command_raises_exception(self):
332
self.mox.StubOutWithMock(self.pm, '_set_connection')
333
self.mox.StubOutWithMock(nutils, 'ssh_execute')
335
self.pm._set_connection().AndReturn(True)
336
nutils.ssh_execute(None, '/usr/bin/VBoxManage test return',
337
check_exit_code=True).\
338
AndRaise(exception.ProcessExecutionError)
341
result = self.pm._run_command("test return")
342
self.assertEqual(result, [])
345
def test_activate_node_with_exception(self):
349
self.mox.StubOutWithMock(self.pm, '_check_for_node')
350
self.mox.StubOutWithMock(nutils, 'ssh_execute')
352
self.pm._check_for_node().AndReturn(["testNode"])
353
self.pm._check_for_node().AndReturn(["testNode"])
354
nutils.ssh_execute('test', '/usr/bin/VBoxManage startvm ',
355
check_exit_code=True).\
356
AndRaise(exception.ProcessExecutionError)
357
nutils.ssh_execute('test', '/usr/bin/VBoxManage list runningvms',
358
check_exit_code=True).\
359
AndRaise(exception.ProcessExecutionError)
362
self.pm._connection = 'test'
363
state = self.pm.activate_node()
364
self.assertEqual(state, 'error')