Moves Hyper-V options to the hyperv section

Fixes Bug: 1140778

Due to the large number of options available in Nova, in order to
achieve better option organization and naming (e.g. avoid the hyperv_*
prefix) and to avoid option name clashes, options specific to the
Hyper-V driver are moved to a section named "hyperv".

Backwards compatibility is mantained by providing the "deprecated_group"
argument in option definitions.

For case consistency the group name as been changed to "hyperv" for options
introduced in Grizzly belonging to the group "HYPERV"

Change-Id: If2710822cdf6e4ae108a6d1e7977735ac8104a2e
This commit is contained in:
Alessandro Pilotti
2013-03-03 00:12:21 +02:00
parent d5e728ca08
commit eed3bce425
7 changed files with 54 additions and 39 deletions

View File

@@ -56,7 +56,7 @@ from nova.virt.hyperv import volumeutilsv2
from nova.virt import images
CONF = cfg.CONF
CONF.import_opt('vswitch_name', 'nova.virt.hyperv.vif')
CONF.import_opt('vswitch_name', 'nova.virt.hyperv.vif', 'hyperv')
class HyperVAPITestCase(test.TestCase):
@@ -86,9 +86,11 @@ class HyperVAPITestCase(test.TestCase):
self._setup_stubs()
self.flags(instances_path=r'C:\Hyper-V\test\instances',
vswitch_name='external',
network_api_class='nova.network.quantumv2.api.API',
force_volumeutils_v1=True)
network_api_class='nova.network.quantumv2.api.API')
self.flags(vswitch_name='external',
force_volumeutils_v1=True,
group='hyperv')
self._conn = driver_hyperv.HyperVDriver(None)
@@ -331,7 +333,7 @@ class HyperVAPITestCase(test.TestCase):
cdb.__exit__(None, None, None).AndReturn(None)
if not use_cdrom:
utils.execute(CONF.qemu_img_cmd,
utils.execute(CONF.hyperv.qemu_img_cmd,
'convert',
'-f',
'raw',
@@ -351,7 +353,7 @@ class HyperVAPITestCase(test.TestCase):
def _test_spawn_config_drive(self, use_cdrom):
self.flags(force_config_drive=True)
self.flags(config_drive_cdrom=use_cdrom)
self.flags(config_drive_cdrom=use_cdrom, group='hyperv')
self.flags(mkisofs_cmd='mkisofs.exe')
self._setup_spawn_config_drive_mocks(use_cdrom)
@@ -391,7 +393,7 @@ class HyperVAPITestCase(test.TestCase):
fake_vswitch_port = 'fake port'
m = networkutils.NetworkUtils.get_external_vswitch(
CONF.vswitch_name)
CONF.hyperv.vswitch_name)
m.AndReturn(fake_vswitch_path)
m = networkutils.NetworkUtils.create_vswitch_port(
@@ -410,7 +412,7 @@ class HyperVAPITestCase(test.TestCase):
def setup_vif_mocks():
m = networkutils.NetworkUtils.get_external_vswitch(
CONF.vswitch_name)
CONF.hyperv.vswitch_name)
m.AndRaise(vmutils.HyperVException(_('fake vswitch not found')))
self.assertRaises(vmutils.HyperVException, self._test_spawn_instance,

View File

@@ -35,7 +35,7 @@ hyperv_opts = [
]
CONF = cfg.CONF
CONF.register_opts(hyperv_opts, 'HYPERV')
CONF.register_opts(hyperv_opts, 'hyperv')
CONF.import_opt('instances_path', 'nova.compute.manager')
@@ -70,8 +70,8 @@ class PathUtils(object):
local_instance_path = os.path.normpath(CONF.instances_path)
if remote_server:
if CONF.HYPERV.instances_path_share:
path = CONF.HYPERV.instances_path_share
if CONF.hyperv.instances_path_share:
path = CONF.hyperv.instances_path_share
else:
# Use an administrative share
path = local_instance_path.replace(':', '$')

View File

@@ -29,11 +29,12 @@ hyperv_opts = [
default=None,
help='External virtual switch Name, '
'if not provided, the first external virtual '
'switch is used'),
'switch is used',
deprecated_group='DEFAULT'),
]
CONF = cfg.CONF
CONF.register_opts(hyperv_opts)
CONF.register_opts(hyperv_opts, 'hyperv')
LOG = logging.getLogger(__name__)
@@ -69,7 +70,7 @@ class HyperVNovaNetworkVIFDriver(HyperVBaseVIFDriver):
def plug(self, instance, vif):
vswitch_path = self._netutils.get_external_vswitch(
CONF.vswitch_name)
CONF.hyperv.vswitch_name)
vm_name = instance['name']
LOG.debug(_('Creating vswitch port for instance: %s') % vm_name)

View File

@@ -44,22 +44,26 @@ hyperv_opts = [
cfg.BoolOpt('limit_cpu_features',
default=False,
help='Required for live migration among '
'hosts with different CPU features'),
'hosts with different CPU features',
deprecated_group='DEFAULT'),
cfg.BoolOpt('config_drive_inject_password',
default=False,
help='Sets the admin password in the config drive image'),
help='Sets the admin password in the config drive image',
deprecated_group='DEFAULT'),
cfg.StrOpt('qemu_img_cmd',
default="qemu-img.exe",
help='qemu-img is used to convert between '
'different image types'),
'different image types',
deprecated_group='DEFAULT'),
cfg.BoolOpt('config_drive_cdrom',
default=False,
help='Attaches the Config Drive image as a cdrom drive '
'instead of a disk drive')
'instead of a disk drive',
deprecated_group='DEFAULT')
]
CONF = cfg.CONF
CONF.register_opts(hyperv_opts)
CONF.register_opts(hyperv_opts, 'hyperv')
CONF.import_opt('use_cow_images', 'nova.virt.driver')
CONF.import_opt('network_api_class', 'nova.network')
@@ -160,7 +164,7 @@ class VMOps(object):
self._vmutils.create_vm(instance_name,
instance['memory_mb'],
instance['vcpus'],
CONF.limit_cpu_features)
CONF.hyperv.limit_cpu_features)
if boot_vhd_path:
self._vmutils.attach_ide_drive(instance_name,
@@ -190,7 +194,7 @@ class VMOps(object):
LOG.info(_('Using config drive for instance: %s'), instance=instance)
extra_md = {}
if admin_password and CONF.config_drive_inject_password:
if admin_password and CONF.hyperv.config_drive_inject_password:
extra_md['admin_pass'] = admin_password
inst_md = instance_metadata.InstanceMetadata(instance,
@@ -211,11 +215,11 @@ class VMOps(object):
LOG.error(_('Creating config drive failed with error: %s'),
e, instance=instance)
if not CONF.config_drive_cdrom:
if not CONF.hyperv.config_drive_cdrom:
drive_type = constants.IDE_DISK
configdrive_path = os.path.join(instance_path,
'configdrive.vhd')
utils.execute(CONF.qemu_img_cmd,
utils.execute(CONF.hyperv.qemu_img_cmd,
'convert',
'-f',
'raw',

View File

@@ -33,20 +33,24 @@ from nova.virt.hyperv import volumeutilsv2
LOG = logging.getLogger(__name__)
hyper_volumeops_opts = [
cfg.IntOpt('hyperv_attaching_volume_retry_count',
cfg.IntOpt('volume_attach_retry_count',
default=10,
help='The number of times we retry on attaching volume '),
cfg.IntOpt('hyperv_wait_between_attach_retry',
help='The number of times to retry to attach a volume',
deprecated_name='hyperv_attaching_volume_retry_count',
deprecated_group='DEFAULT'),
cfg.IntOpt('volume_attach_retry_interval',
default=5,
help='The seconds to wait between an volume '
'attachment attempt'),
help='Interval between volume attachment attempts, in seconds',
deprecated_name='hyperv_wait_between_attach_retry',
deprecated_group='DEFAULT'),
cfg.BoolOpt('force_volumeutils_v1',
default=False,
help='Force volumeutils v1'),
help='Force volumeutils v1',
deprecated_group='DEFAULT'),
]
CONF = cfg.CONF
CONF.register_opts(hyper_volumeops_opts)
CONF.register_opts(hyper_volumeops_opts, 'hyperv')
CONF.import_opt('my_ip', 'nova.netconf')
@@ -63,7 +67,7 @@ class VolumeOps(object):
self._default_root_device = 'vda'
def _get_volume_utils(self):
if(not CONF.force_volumeutils_v1 and
if(not CONF.hyperv.force_volumeutils_v1 and
self._hostutils.get_windows_version() >= 6.2):
return volumeutilsv2.VolumeUtilsV2()
else:
@@ -171,12 +175,12 @@ class VolumeOps(object):
LOG.debug(_('Device number: %(device_number)s, '
'target lun: %(target_lun)s') % locals())
#Finding Mounted disk drive
for i in range(1, CONF.hyperv_attaching_volume_retry_count):
for i in range(1, CONF.hyperv.volume_attach_retry_count):
mounted_disk_path = self._vmutils.get_mounted_disk_by_drive_number(
device_number)
if mounted_disk_path:
break
time.sleep(CONF.hyperv_wait_between_attach_retry)
time.sleep(CONF.hyperv.volume_attach_retry_interval)
if not mounted_disk_path:
raise vmutils.HyperVException(_('Unable to find a mounted disk '

View File

@@ -66,8 +66,10 @@ class VolumeUtils(basevolumeutils.BaseVolumeUtils):
self.execute('iscsicli.exe ' + 'LisTargets')
#Sending login
self.execute('iscsicli.exe ' + 'qlogintarget ' + target_iqn)
#Waiting the disk to be mounted. Research this to avoid sleep
time.sleep(CONF.hyperv_wait_between_attach_retry)
#Waiting the disk to be mounted.
#TODO(pnavarro): Check for the operation to end instead of
#relying on a timeout
time.sleep(CONF.hyperv.volume_attach_retry_interval)
def logout_storage_target(self, target_iqn):
"""Logs out storage target through its session id."""

View File

@@ -56,8 +56,10 @@ class VolumeUtilsV2(basevolumeutils.BaseVolumeUtils):
target = self._conn_storage.MSFT_iSCSITarget
target.Connect(NodeAddress=target_iqn,
IsPersistent=True)
#Waiting the disk to be mounted. Research this
time.sleep(CONF.hyperv_wait_between_attach_retry)
#Waiting the disk to be mounted.
#TODO(pnavarro): Check for the operation to end instead of
#relying on a timeout
time.sleep(CONF.hyperv.volume_attach_retry_interval)
def logout_storage_target(self, target_iqn):
"""Logs out storage target through its session id."""