
Modules import nova.config for two reasons right now - firstly, to reference nova.config.CONF and, secondly, if they use one of the options defined in nova.config. Often modules import nova.openstack.common.cfg and nova.config which is a bit pointless since they could just use cfg.CONF if they just want to nova.config in order to reference CONF. Let's just use cfg.CONF everywhere and we can explicitly state where we actually require options defined in nova.config. Change-Id: Ie4184a74e3e78c99658becb18dce1c2087e450bb
190 lines
6.1 KiB
Python
190 lines
6.1 KiB
Python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
|
|
# Copyright 2012 IBM
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
"""
|
|
Test suite for PowerVMDriver.
|
|
"""
|
|
|
|
from nova import context
|
|
from nova import db
|
|
from nova import test
|
|
|
|
from nova.compute import power_state
|
|
from nova.openstack.common import log as logging
|
|
from nova.virt import images
|
|
|
|
from nova.virt.powervm import driver as powervm_driver
|
|
from nova.virt.powervm import exception
|
|
from nova.virt.powervm import lpar
|
|
from nova.virt.powervm import operator
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
def fake_lpar(instance_name):
|
|
return lpar.LPAR(name=instance_name,
|
|
lpar_id=1, desired_mem=1024,
|
|
max_mem=2048, max_procs=2,
|
|
uptime=939395, state='Running')
|
|
|
|
|
|
class FakeIVMOperator(object):
|
|
|
|
def get_lpar(self, instance_name, resource_type='lpar'):
|
|
return fake_lpar(instance_name)
|
|
|
|
def list_lpar_instances(self):
|
|
return ['instance-00000001', 'instance-00000002']
|
|
|
|
def create_lpar(self, lpar):
|
|
pass
|
|
|
|
def start_lpar(self, instance_name):
|
|
pass
|
|
|
|
def stop_lpar(self, instance_name):
|
|
pass
|
|
|
|
def remove_lpar(self, instance_name):
|
|
pass
|
|
|
|
def get_vhost_by_instance_id(self, instance_id):
|
|
return 'vhostfake'
|
|
|
|
def get_virtual_eth_adapter_id(self):
|
|
return 1
|
|
|
|
def get_disk_name_by_vhost(self, vhost):
|
|
return 'lvfake01'
|
|
|
|
def remove_disk(self, disk_name):
|
|
pass
|
|
|
|
def create_logical_volume(self, size):
|
|
return 'lvfake01'
|
|
|
|
def remove_logical_volume(self, lv_name):
|
|
pass
|
|
|
|
def copy_file_to_device(self, sourcePath, device):
|
|
pass
|
|
|
|
def copy_image_file(self, sourcePath, remotePath):
|
|
finalPath = '/home/images/rhel62.raw.7e358754160433febd6f3318b7c9e335'
|
|
size = 4294967296
|
|
return finalPath, size
|
|
|
|
def run_cfg_dev(self, device_name):
|
|
pass
|
|
|
|
def attach_disk_to_vhost(self, disk, vhost):
|
|
pass
|
|
|
|
def get_memory_info(self):
|
|
return {'total_mem': 65536, 'avail_mem': 46336}
|
|
|
|
def get_cpu_info(self):
|
|
return {'total_procs': 8.0, 'avail_procs': 6.3}
|
|
|
|
def get_disk_info(self):
|
|
return {'disk_total': 10168,
|
|
'disk_used': 0,
|
|
'disk_avail': 10168}
|
|
|
|
def get_hostname(self):
|
|
return 'fake-powervm'
|
|
|
|
|
|
def fake_get_powervm_operator():
|
|
return FakeIVMOperator()
|
|
|
|
|
|
class PowerVMDriverTestCase(test.TestCase):
|
|
"""Unit tests for PowerVM connection calls."""
|
|
|
|
def setUp(self):
|
|
super(PowerVMDriverTestCase, self).setUp()
|
|
self.stubs.Set(operator, 'get_powervm_operator',
|
|
fake_get_powervm_operator)
|
|
self.powervm_connection = powervm_driver.PowerVMDriver(None)
|
|
self.instance = self._create_instance()
|
|
|
|
def _create_instance(self):
|
|
return db.instance_create(context.get_admin_context(),
|
|
{'user_id': 'fake',
|
|
'project_id': 'fake',
|
|
'instance_type_id': 1,
|
|
'memory_mb': 1024,
|
|
'vcpus': 2})
|
|
|
|
def test_list_instances(self):
|
|
instances = self.powervm_connection.list_instances()
|
|
self.assertTrue('instance-00000001' in instances)
|
|
self.assertTrue('instance-00000002' in instances)
|
|
|
|
def test_instance_exists(self):
|
|
name = self.instance['name']
|
|
self.assertTrue(self.powervm_connection.instance_exists(name))
|
|
|
|
def test_spawn(self):
|
|
def fake_image_fetch_to_raw(context, image_id, file_path,
|
|
user_id, project_id):
|
|
pass
|
|
self.flags(powervm_img_local_path='/images/')
|
|
self.stubs.Set(images, 'fetch_to_raw', fake_image_fetch_to_raw)
|
|
image_meta = {}
|
|
image_meta['id'] = '666'
|
|
self.powervm_connection.spawn(context.get_admin_context(),
|
|
self.instance, image_meta, 's3cr3t', [])
|
|
state = self.powervm_connection.get_info(self.instance)['state']
|
|
self.assertEqual(state, power_state.RUNNING)
|
|
|
|
def test_spawn_cleanup_on_fail(self):
|
|
"""Verify on a failed spawn, we get the original exception raised"""
|
|
# helper function
|
|
def raise_(ex):
|
|
raise ex
|
|
|
|
self.flags(powervm_img_local_path='/images/')
|
|
self.stubs.Set(images, 'fetch_to_raw', lambda *x, **y: None)
|
|
self.stubs.Set(
|
|
self.powervm_connection._powervm._operator,
|
|
'copy_image_file',
|
|
lambda *x, **y: raise_(exception.PowerVMImageCreationFailed()))
|
|
self.stubs.Set(
|
|
self.powervm_connection._powervm, '_cleanup',
|
|
lambda *x, **y: raise_(Exception('This should be logged.')))
|
|
|
|
self.assertRaises(exception.PowerVMImageCreationFailed,
|
|
self.powervm_connection.spawn,
|
|
context.get_admin_context(),
|
|
self.instance,
|
|
{'id': 'ANY_ID'}, 's3cr3t', [])
|
|
|
|
def test_destroy(self):
|
|
self.powervm_connection.destroy(self.instance, None)
|
|
self.stubs.Set(FakeIVMOperator, 'get_lpar', lambda x, y: None)
|
|
name = self.instance['name']
|
|
self.assertFalse(self.powervm_connection.instance_exists(name))
|
|
|
|
def test_get_info(self):
|
|
info = self.powervm_connection.get_info(self.instance)
|
|
self.assertEqual(info['state'], power_state.RUNNING)
|
|
self.assertEqual(info['max_mem'], 2048)
|
|
self.assertEqual(info['mem'], 1024)
|
|
self.assertEqual(info['num_cpu'], 2)
|
|
self.assertEqual(info['cpu_time'], 939395)
|