From 4f7cedbeb01ee0e54a44603271b383308a2f4f5d Mon Sep 17 00:00:00 2001 From: Christopher Lefelhocz Date: Wed, 30 Oct 2013 07:57:43 +0000 Subject: [PATCH] xenapi: Move settings to their own config section This commit changes xenapi_* config options to their own section with the xenapi_ prefix removed where appropriate. The change is done in a backwards compatible fashion such that previous nova.conf files still work. As part of this update the sample file and text strings are also updated to reflect new config options. Test cases have been adjusted to handle the config hierarchy. 2642897d6f5b8a211424519d99feddc89c3bf180 was followed to implement this change. Change-Id: I2e9f720ddce284fc112d6a5651fd277e6e31a17a Closes-Bug: 1207253 DocImpact --- etc/nova/nova.conf.sample | 448 +++++++++--------- nova/tests/compute/test_compute_xen.py | 7 +- .../virt/xenapi/image/test_bittorrent.py | 15 +- nova/tests/virt/xenapi/image/test_glance.py | 7 +- nova/tests/virt/xenapi/test_agent.py | 10 +- nova/tests/virt/xenapi/test_driver.py | 8 +- nova/tests/virt/xenapi/test_vm_utils.py | 61 +-- nova/tests/virt/xenapi/test_xenapi.py | 158 +++--- nova/virt/xenapi/agent.py | 58 ++- nova/virt/xenapi/driver.py | 90 ++-- nova/virt/xenapi/image/bittorrent.py | 55 ++- nova/virt/xenapi/pool.py | 16 +- nova/virt/xenapi/vif.py | 12 +- nova/virt/xenapi/vm_utils.py | 119 +++-- nova/virt/xenapi/vmops.py | 28 +- 15 files changed, 613 insertions(+), 479 deletions(-) diff --git a/etc/nova/nova.conf.sample b/etc/nova/nova.conf.sample index 001f15242ea8..fd704e6ad343 100644 --- a/etc/nova/nova.conf.sample +++ b/etc/nova/nova.conf.sample @@ -2209,229 +2209,6 @@ #powervm_img_local_path=/tmp -# -# Options defined in nova.virt.xenapi.agent -# - -# number of seconds to wait for agent reply (integer value) -#agent_timeout=30 - -# number of seconds to wait for agent to be fully operational -# (integer value) -#agent_version_timeout=300 - -# number of seconds to wait for agent reply to resetnetwork -# request (integer value) -#agent_resetnetwork_timeout=60 - -# Specifies the path in which the xenapi guest agent should be -# located. If the agent is present, network configuration is -# not injected into the image. Used if -# compute_driver=xenapi.XenAPIDriver and flat_injected=True -# (string value) -#xenapi_agent_path=usr/sbin/xe-update-networking - -# Disables the use of the XenAPI agent in any image regardless -# of what image properties are present. (boolean value) -#xenapi_disable_agent=false - -# Determines if the xenapi agent should be used when the image -# used does not contain a hint to declare if the agent is -# present or not. The hint is a glance property -# "xenapi_use_agent" that has the value "true" or "false". -# Note that waiting for the agent when it is not present will -# significantly increase server boot times. (boolean value) -#xenapi_use_agent_default=false - - -# -# Options defined in nova.virt.xenapi.driver -# - -# URL for connection to XenServer/Xen Cloud Platform. A -# special value of unix://local can be used to connect to the -# local unix socket. Required if -# compute_driver=xenapi.XenAPIDriver (string value) -#xenapi_connection_url= - -# Username for connection to XenServer/Xen Cloud Platform. -# Used only if compute_driver=xenapi.XenAPIDriver (string -# value) -#xenapi_connection_username=root - -# Password for connection to XenServer/Xen Cloud Platform. -# Used only if compute_driver=xenapi.XenAPIDriver (string -# value) -#xenapi_connection_password= - -# Maximum number of concurrent XenAPI connections. Used only -# if compute_driver=xenapi.XenAPIDriver (integer value) -#xenapi_connection_concurrent=5 - -# The interval used for polling of coalescing vhds. Used only -# if compute_driver=xenapi.XenAPIDriver (floating point value) -#xenapi_vhd_coalesce_poll_interval=5.0 - -# Ensure compute service is running on host XenAPI connects -# to. (boolean value) -#xenapi_check_host=true - -# Max number of times to poll for VHD to coalesce. Used only -# if compute_driver=xenapi.XenAPIDriver (integer value) -#xenapi_vhd_coalesce_max_attempts=5 - -# Base path to the storage repository (string value) -#xenapi_sr_base_path=/var/run/sr-mount - -# iSCSI Target Host (string value) -#target_host= - -# iSCSI Target Port, 3260 Default (string value) -#target_port=3260 - -# IQN Prefix (string value) -#iqn_prefix=iqn.2010-10.org.openstack - -# Used to enable the remapping of VBD dev (Works around an -# issue in Ubuntu Maverick) (boolean value) -#xenapi_remap_vbd_dev=false - -# Specify prefix to remap VBD dev to (ex. /dev/xvdb -> -# /dev/sdb) (string value) -#xenapi_remap_vbd_dev_prefix=sd - -# Timeout in seconds for XenAPI login. (integer value) -#xenapi_login_timeout=10 - - -# -# Options defined in nova.virt.xenapi.image.bittorrent -# - -# Base URL for torrent files. (string value) -#xenapi_torrent_base_url= - -# Probability that peer will become a seeder. (1.0 = 100%) -# (floating point value) -#xenapi_torrent_seed_chance=1.0 - -# Number of seconds after downloading an image via BitTorrent -# that it should be seeded for other peers. (integer value) -#xenapi_torrent_seed_duration=3600 - -# Cached torrent files not accessed within this number of -# seconds can be reaped (integer value) -#xenapi_torrent_max_last_accessed=86400 - -# Beginning of port range to listen on (integer value) -#xenapi_torrent_listen_port_start=6881 - -# End of port range to listen on (integer value) -#xenapi_torrent_listen_port_end=6891 - -# Number of seconds a download can remain at the same progress -# percentage w/o being considered a stall (integer value) -#xenapi_torrent_download_stall_cutoff=600 - -# Maximum number of seeder processes to run concurrently -# within a given dom0. (-1 = no limit) (integer value) -#xenapi_torrent_max_seeder_processes_per_host=1 - - -# -# Options defined in nova.virt.xenapi.pool -# - -# To use for hosts with different CPUs (boolean value) -#use_join_force=true - - -# -# Options defined in nova.virt.xenapi.vif -# - -# Name of Integration Bridge used by Open vSwitch (string -# value) -#xenapi_ovs_integration_bridge=xapi1 - - -# -# Options defined in nova.virt.xenapi.vm_utils -# - -# Cache glance images locally. `all` will cache all images, -# `some` will only cache images that have the image_property -# `cache_in_nova=True`, and `none` turns off caching entirely -# (string value) -#cache_images=all - -# Compression level for images, e.g., 9 for gzip -9. Range is -# 1-9, 9 being most compressed but most CPU intensive on dom0. -# (integer value) -#xenapi_image_compression_level= - -# Default OS type (string value) -#default_os_type=linux - -# Time to wait for a block device to be created (integer -# value) -#block_device_creation_timeout=10 - -# Maximum size in bytes of kernel or ramdisk images (integer -# value) -#max_kernel_ramdisk_size=16777216 - -# Filter for finding the SR to be used to install guest -# instances on. To use the Local Storage in default -# XenServer/XCP installations set this flag to other-config -# :i18n-key=local-storage. To select an SR with a different -# matching criteria, you could set it to other- -# config:my_favorite_sr=true. On the other hand, to fall back -# on the Default SR, as displayed by XenCenter, set this flag -# to: default-sr:true (string value) -#sr_matching_filter=default-sr:true - -# Whether to use sparse_copy for copying data on a resize down -# (False will use standard dd). This speeds up resizes down -# considerably since large runs of zeros won't have to be -# rsynced (boolean value) -#xenapi_sparse_copy=true - -# Maximum number of retries to unplug VBD (integer value) -#xenapi_num_vbd_unplug_retries=10 - -# Whether or not to download images via Bit Torrent -# (all|some|none). (string value) -#xenapi_torrent_images=none - -# Name of network to use for booting iPXE ISOs (string value) -#xenapi_ipxe_network_name= - -# URL to the iPXE boot menu (string value) -#xenapi_ipxe_boot_menu_url= - -# Name and optionally path of the tool used for ISO image -# creation (string value) -#xenapi_ipxe_mkisofs_cmd=mkisofs - - -# -# Options defined in nova.virt.xenapi.vmops -# - -# number of seconds to wait for instance to go to running -# state (integer value) -#xenapi_running_timeout=60 - -# The XenAPI VIF driver using XenServer Network APIs. (string -# value) -#xenapi_vif_driver=nova.virt.xenapi.vif.XenAPIBridgeDriver - -# Dom0 plugin driver used to handle image uploads. (string -# value) -#xenapi_image_upload_handler=nova.virt.xenapi.image.glance.GlanceStore - - # # Options defined in nova.vnc # @@ -3091,6 +2868,231 @@ #password= +[xenserver] + +# +# Options defined in nova.virt.xenapi.agent +# + +# number of seconds to wait for agent reply (integer value) +#agent_timeout=30 + +# number of seconds to wait for agent to be fully operational +# (integer value) +#agent_version_timeout=300 + +# number of seconds to wait for agent reply to resetnetwork +# request (integer value) +#agent_resetnetwork_timeout=60 + +# Specifies the path in which the xenapi guest agent should be +# located. If the agent is present, network configuration is +# not injected into the image. Used if +# compute_driver=xenapi.XenAPIDriver and flat_injected=True +# (string value) +#agent_path=usr/sbin/xe-update-networking + +# Disables the use of the XenAPI agent in any image regardless +# of what image properties are present. (boolean value) +#disable_agent=false + +# Determines if the xenapi agent should be used when the image +# used does not contain a hint to declare if the agent is +# present or not. The hint is a glance property +# "xenapi_use_agent" that has the value "true" or "false". +# Note that waiting for the agent when it is not present will +# significantly increase server boot times. (boolean value) +#use_agent_default=false + + +# +# Options defined in nova.virt.xenapi.driver +# + +# URL for connection to XenServer/Xen Cloud Platform. A +# special value of unix://local can be used to connect to the +# local unix socket. Required if +# compute_driver=xenapi.XenAPIDriver (string value) +#connection_url= + +# Username for connection to XenServer/Xen Cloud Platform. +# Used only if compute_driver=xenapi.XenAPIDriver (string +# value) +#connection_username=root + +# Password for connection to XenServer/Xen Cloud Platform. +# Used only if compute_driver=xenapi.XenAPIDriver (string +# value) +#connection_password= + +# Maximum number of concurrent XenAPI connections. Used only +# if compute_driver=xenapi.XenAPIDriver (integer value) +#connection_concurrent=5 + +# The interval used for polling of coalescing vhds. Used only +# if compute_driver=xenapi.XenAPIDriver (floating point value) +#vhd_coalesce_poll_interval=5.0 + +# Ensure compute service is running on host XenAPI connects +# to. (boolean value) +#check_host=true + +# Max number of times to poll for VHD to coalesce. Used only +# if compute_driver=xenapi.XenAPIDriver (integer value) +#vhd_coalesce_max_attempts=5 + +# Base path to the storage repository (string value) +#sr_base_path=/var/run/sr-mount + +# iSCSI Target Host (string value) +#target_host= + +# iSCSI Target Port, 3260 Default (string value) +#target_port=3260 + +# IQN Prefix (string value) +#iqn_prefix=iqn.2010-10.org.openstack + +# Used to enable the remapping of VBD dev (Works around an +# issue in Ubuntu Maverick) (boolean value) +#remap_vbd_dev=false + +# Specify prefix to remap VBD dev to (ex. /dev/xvdb -> +# /dev/sdb) (string value) +#remap_vbd_dev_prefix=sd + +# Timeout in seconds for XenAPI login. (integer value) +#login_timeout=10 + + +# +# Options defined in nova.virt.xenapi.image.bittorrent +# + +# Base URL for torrent files. (string value) +#torrent_base_url= + +# Probability that peer will become a seeder. (1.0 = 100%) +# (floating point value) +#torrent_seed_chance=1.0 + +# Number of seconds after downloading an image via BitTorrent +# that it should be seeded for other peers. (integer value) +#torrent_seed_duration=3600 + +# Cached torrent files not accessed within this number of +# seconds can be reaped (integer value) +#torrent_max_last_accessed=86400 + +# Beginning of port range to listen on (integer value) +#torrent_listen_port_start=6881 + +# End of port range to listen on (integer value) +#torrent_listen_port_end=6891 + +# Number of seconds a download can remain at the same progress +# percentage w/o being considered a stall (integer value) +#torrent_download_stall_cutoff=600 + +# Maximum number of seeder processes to run concurrently +# within a given dom0. (-1 = no limit) (integer value) +#torrent_max_seeder_processes_per_host=1 + + +# +# Options defined in nova.virt.xenapi.pool +# + +# To use for hosts with different CPUs (boolean value) +#use_join_force=true + + +# +# Options defined in nova.virt.xenapi.vif +# + +# Name of Integration Bridge used by Open vSwitch (string +# value) +#ovs_integration_bridge=xapi1 + + +# +# Options defined in nova.virt.xenapi.vm_utils +# + +# Cache glance images locally. `all` will cache all images, +# `some` will only cache images that have the image_property +# `cache_in_nova=True`, and `none` turns off caching entirely +# (string value) +#cache_images=all + +# Compression level for images, e.g., 9 for gzip -9. Range is +# 1-9, 9 being most compressed but most CPU intensive on dom0. +# (integer value) +#image_compression_level= + +# Default OS type (string value) +#default_os_type=linux + +# Time to wait for a block device to be created (integer +# value) +#block_device_creation_timeout=10 + +# Maximum size in bytes of kernel or ramdisk images (integer +# value) +#max_kernel_ramdisk_size=16777216 + +# Filter for finding the SR to be used to install guest +# instances on. To use the Local Storage in default +# XenServer/XCP installations set this flag to other-config +# :i18n-key=local-storage. To select an SR with a different +# matching criteria, you could set it to other- +# config:my_favorite_sr=true. On the other hand, to fall back +# on the Default SR, as displayed by XenCenter, set this flag +# to: default-sr:true (string value) +#sr_matching_filter=default-sr:true + +# Whether to use sparse_copy for copying data on a resize down +# (False will use standard dd). This speeds up resizes down +# considerably since large runs of zeros won't have to be +# rsynced (boolean value) +#sparse_copy=true + +# Maximum number of retries to unplug VBD (integer value) +#num_vbd_unplug_retries=10 + +# Whether or not to download images via Bit Torrent +# (all|some|none). (string value) +#torrent_images=none + +# Name of network to use for booting iPXE ISOs (string value) +#ipxe_network_name= + +# URL to the iPXE boot menu (string value) +#ipxe_boot_menu_url= + +# Name and optionally path of the tool used for ISO image +# creation (string value) +#ipxe_mkisofs_cmd=mkisofs + + +# +# Options defined in nova.virt.xenapi.vmops +# + +# number of seconds to wait for instance to go to running +# state (integer value) +#running_timeout=60 + +# The XenAPI VIF driver using XenServer Network APIs. (string +# value) +#vif_driver=nova.virt.xenapi.vif.XenAPIBridgeDriver + +# Dom0 plugin driver used to handle image uploads. (string +# value) +#image_upload_handler=nova.virt.xenapi.image.glance.GlanceStore + + [ssl] # diff --git a/nova/tests/compute/test_compute_xen.py b/nova/tests/compute/test_compute_xen.py index 06a2ac68367b..52cff50420f2 100644 --- a/nova/tests/compute/test_compute_xen.py +++ b/nova/tests/compute/test_compute_xen.py @@ -30,9 +30,10 @@ CONF.import_opt('compute_driver', 'nova.virt.driver') class ComputeXenTestCase(stubs.XenAPITestBaseNoDB): def setUp(self): super(ComputeXenTestCase, self).setUp() - self.flags(compute_driver='xenapi.XenAPIDriver', - xenapi_connection_url='test_url', - xenapi_connection_password='test_pass') + self.flags(compute_driver='xenapi.XenAPIDriver') + self.flags(connection_url='test_url', + connection_password='test_pass', + group='xenserver') stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) self.compute = importutils.import_object(CONF.compute_manager) diff --git a/nova/tests/virt/xenapi/image/test_bittorrent.py b/nova/tests/virt/xenapi/image/test_bittorrent.py index bc31b8bcad69..97b21cad43c7 100644 --- a/nova/tests/virt/xenapi/image/test_bittorrent.py +++ b/nova/tests/virt/xenapi/image/test_bittorrent.py @@ -35,9 +35,10 @@ class TestBittorrentStore(stubs.XenAPITestBaseNoDB): self.store = bittorrent.BittorrentStore() self.mox = mox.Mox() - self.flags(xenapi_torrent_base_url='http://foo', - xenapi_connection_url='test_url', - xenapi_connection_password='test_pass') + self.flags(torrent_base_url='http://foo', + connection_url='test_url', + connection_password='test_pass', + group='xenserver') self.context = context.RequestContext( 'user', 'project', auth_token='foobar') @@ -121,18 +122,20 @@ class LookupTorrentURLTestCase(test.NoDBTestCase): return [] def test_default_fetch_url_no_base_url_set(self): - self.flags(xenapi_torrent_base_url=None) + self.flags(torrent_base_url=None, + group='xenserver') self.stubs.Set(pkg_resources, 'iter_entry_points', self._mock_iter_none) exc = self.assertRaises( RuntimeError, self.store._lookup_torrent_url_fn) self.assertEqual(_('Cannot create default bittorrent URL without' - ' xenapi_torrent_base_url set'), + ' torrent_base_url set'), str(exc)) def test_default_fetch_url_base_url_is_set(self): - self.flags(xenapi_torrent_base_url='http://foo') + self.flags(torrent_base_url='http://foo', + group='xenserver') self.stubs.Set(pkg_resources, 'iter_entry_points', self._mock_iter_none) diff --git a/nova/tests/virt/xenapi/image/test_glance.py b/nova/tests/virt/xenapi/image/test_glance.py index 090957f9c55c..c1493de33e96 100644 --- a/nova/tests/virt/xenapi/image/test_glance.py +++ b/nova/tests/virt/xenapi/image/test_glance.py @@ -33,9 +33,10 @@ class TestGlanceStore(stubs.XenAPITestBaseNoDB): self.flags(glance_host='1.1.1.1', glance_port=123, - glance_api_insecure=False, - xenapi_connection_url='test_url', - xenapi_connection_password='test_pass') + glance_api_insecure=False) + self.flags(connection_url='test_url', + connection_password='test_pass', + group='xenserver') self.context = context.RequestContext( 'user', 'project', auth_token='foobar') diff --git a/nova/tests/virt/xenapi/test_agent.py b/nova/tests/virt/xenapi/test_agent.py index 28e4c319277d..913ef9c751c3 100644 --- a/nova/tests/virt/xenapi/test_agent.py +++ b/nova/tests/virt/xenapi/test_agent.py @@ -53,31 +53,31 @@ class AgentTestCaseBase(test.NoDBTestCase): class AgentImageFlagsTestCase(AgentTestCaseBase): def test_agent_is_present(self): - self.flags(xenapi_use_agent_default=False) + self.flags(use_agent_default=False, group='xenserver') instance = {"system_metadata": [{"key": "image_xenapi_use_agent", "value": "true"}]} self.assertTrue(agent.should_use_agent(instance)) def test_agent_is_disabled(self): - self.flags(xenapi_use_agent_default=True) + self.flags(use_agent_default=True, group='xenserver') instance = {"system_metadata": [{"key": "image_xenapi_use_agent", "value": "false"}]} self.assertFalse(agent.should_use_agent(instance)) def test_agent_uses_deafault_when_prop_invalid(self): - self.flags(xenapi_use_agent_default=True) + self.flags(use_agent_default=True, group='xenserver') instance = {"system_metadata": [{"key": "image_xenapi_use_agent", "value": "bob"}], "uuid": "uuid"} self.assertTrue(agent.should_use_agent(instance)) def test_agent_default_not_present(self): - self.flags(xenapi_use_agent_default=False) + self.flags(use_agent_default=False, group='xenserver') instance = {"system_metadata": []} self.assertFalse(agent.should_use_agent(instance)) def test_agent_default_present(self): - self.flags(xenapi_use_agent_default=True) + self.flags(use_agent_default=True, group='xenserver') instance = {"system_metadata": []} self.assertTrue(agent.should_use_agent(instance)) diff --git a/nova/tests/virt/xenapi/test_driver.py b/nova/tests/virt/xenapi/test_driver.py index e293845597c9..56e6933ef418 100644 --- a/nova/tests/virt/xenapi/test_driver.py +++ b/nova/tests/virt/xenapi/test_driver.py @@ -36,8 +36,8 @@ class XenAPIDriverTestCase(stubs.XenAPITestBaseNoDB): 'host_cpu_info': {'cpu_count': 50}} def test_available_resource(self): - self.flags(xenapi_connection_url='test_url', - xenapi_connection_password='test_pass') + self.flags(connection_url='test_url', + connection_password='test_pass', group='xenserver') stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) driver = xenapi.XenAPIDriver(fake.FakeVirtAPI(), False) @@ -58,8 +58,8 @@ class XenAPIDriverTestCase(stubs.XenAPITestBaseNoDB): self.assertEqual(50, resources['cpu_info']) def test_overhead(self): - self.flags(xenapi_connection_url='test_url', - xenapi_connection_password='test_pass') + self.flags(connection_url='test_url', + connection_password='test_pass', group='xenserver') stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) driver = xenapi.XenAPIDriver(fake.FakeVirtAPI(), False) instance = {'memory_mb': 30720} diff --git a/nova/tests/virt/xenapi/test_vm_utils.py b/nova/tests/virt/xenapi/test_vm_utils.py index bcf4d6ec484d..660b9a2c4b9b 100644 --- a/nova/tests/virt/xenapi/test_vm_utils.py +++ b/nova/tests/virt/xenapi/test_vm_utils.py @@ -325,9 +325,10 @@ class FetchVhdImageTestCase(VMUtilsTestBase): self.mox.VerifyAll() def test_fetch_vhd_image_works_with_bittorrent(self): - cfg.CONF.import_opt('xenapi_torrent_base_url', - 'nova.virt.xenapi.image.bittorrent') - self.flags(xenapi_torrent_base_url='http://foo') + cfg.CONF.import_opt('torrent_base_url', + 'nova.virt.xenapi.image.bittorrent', + group='xenserver') + self.flags(torrent_base_url='http://foo', group='xenserver') self.mox.StubOutWithMock(vm_utils, '_image_uses_bittorrent') vm_utils._image_uses_bittorrent( @@ -384,9 +385,10 @@ class FetchVhdImageTestCase(VMUtilsTestBase): self.mox.VerifyAll() def test_fallback_to_default_handler(self): - cfg.CONF.import_opt('xenapi_torrent_base_url', - 'nova.virt.xenapi.image.bittorrent') - self.flags(xenapi_torrent_base_url='http://foo') + cfg.CONF.import_opt('torrent_base_url', + 'nova.virt.xenapi.image.bittorrent', + group='xenserver') + self.flags(torrent_base_url='http://foo', group='xenserver') self.mox.StubOutWithMock(vm_utils, '_image_uses_bittorrent') vm_utils._image_uses_bittorrent( @@ -417,9 +419,10 @@ class FetchVhdImageTestCase(VMUtilsTestBase): self.mox.VerifyAll() def test_default_handler_doesnt_fallback_to_itself(self): - cfg.CONF.import_opt('xenapi_torrent_base_url', - 'nova.virt.xenapi.image.bittorrent') - self.flags(xenapi_torrent_base_url='http://foo') + cfg.CONF.import_opt('torrent_base_url', + 'nova.virt.xenapi.image.bittorrent', + group='xenserver') + self.flags(torrent_base_url='http://foo', group='xenserver') self.mox.StubOutWithMock(vm_utils, '_image_uses_bittorrent') vm_utils._image_uses_bittorrent( @@ -439,11 +442,11 @@ class TestImageCompression(VMUtilsTestBase): def test_image_compression(self): # Testing for nova.conf, too low, negative, and a correct value. self.assertIsNone(vm_utils.get_compression_level()) - self.flags(xenapi_image_compression_level=0) + self.flags(image_compression_level=0, group='xenserver') self.assertIsNone(vm_utils.get_compression_level()) - self.flags(xenapi_image_compression_level=-6) + self.flags(image_compression_level=-6, group='xenserver') self.assertIsNone(vm_utils.get_compression_level()) - self.flags(xenapi_image_compression_level=6) + self.flags(image_compression_level=6, group='xenserver') self.assertEqual(vm_utils.get_compression_level(), 6) @@ -604,9 +607,10 @@ class GetInstanceForVdisForSrTestCase(VMUtilsTestBase): self.flags(disable_process_locking=True, instance_name_template='%d', firewall_driver='nova.virt.xenapi.firewall.' - 'Dom0IptablesFirewallDriver', - xenapi_connection_url='test_url', - xenapi_connection_password='test_pass',) + 'Dom0IptablesFirewallDriver') + self.flags(connection_url='test_url', + connection_password='test_pass', + group='xenserver') def test_get_instance_vdis_for_sr(self): vm_ref = fake.create_vm("foo", "Running") @@ -731,13 +735,13 @@ class BittorrentTestCase(VMUtilsTestBase): def test_image_uses_bittorrent(self): instance = {'system_metadata': {'image_bittorrent': True}} - self.flags(xenapi_torrent_images='some') + self.flags(torrent_images='some', group='xenserver') self.assertTrue(vm_utils._image_uses_bittorrent(self.context, instance)) def _test_create_image(self, cache_type): instance = {'system_metadata': {'image_cache_in_nova': True}} - self.flags(cache_images=cache_type) + self.flags(cache_images=cache_type, group='xenserver') was = {'called': None} @@ -960,7 +964,7 @@ class VDIOtherConfigTestCase(VMUtilsTestBase): def test_create_image(self): # Other images are registered implicitly when they are dropped into # the SR by a dom0 plugin or some other process - self.flags(cache_images='none') + self.flags(cache_images='none', group='xenserver') def fake_fetch_image(*args): return {'root': {'uuid': 'fake-uuid'}} @@ -1025,9 +1029,10 @@ class GenerateDiskTestCase(VMUtilsTestBase): self.flags(disable_process_locking=True, instance_name_template='%d', firewall_driver='nova.virt.xenapi.firewall.' - 'Dom0IptablesFirewallDriver', - xenapi_connection_url='test_url', - xenapi_connection_password='test_pass',) + 'Dom0IptablesFirewallDriver') + self.flags(connection_url='test_url', + connection_password='test_pass', + group='xenserver') stubs.stubout_session(self.stubs, fake.SessionBase) driver = xenapi_conn.XenAPIDriver(False) self.session = driver._session @@ -1255,9 +1260,10 @@ class VMUtilsSRPath(VMUtilsTestBase): self.flags(disable_process_locking=True, instance_name_template='%d', firewall_driver='nova.virt.xenapi.firewall.' - 'Dom0IptablesFirewallDriver', - xenapi_connection_url='test_url', - xenapi_connection_password='test_pass',) + 'Dom0IptablesFirewallDriver') + self.flags(connection_url='test_url', + connection_password='test_pass', + group='xenserver') stubs.stubout_session(self.stubs, fake.SessionBase) driver = xenapi_conn.XenAPIDriver(False) self.session = driver._session @@ -1427,9 +1433,10 @@ class AllowVSSProviderTest(VMUtilsTestBase): self.flags(disable_process_locking=True, instance_name_template='%d', firewall_driver='nova.virt.xenapi.firewall.' - 'Dom0IptablesFirewallDriver', - xenapi_connection_url='test_url', - xenapi_connection_password='test_pass',) + 'Dom0IptablesFirewallDriver') + self.flags(connection_url='test_url', + connection_password='test_pass', + group='xenserver') stubs.stubout_session(self.stubs, fake.SessionBase) driver = xenapi_conn.XenAPIDriver(False) self.session = driver._session diff --git a/nova/tests/virt/xenapi/test_xenapi.py b/nova/tests/virt/xenapi/test_xenapi.py index 13be19f448da..3c9294fafaa1 100644 --- a/nova/tests/virt/xenapi/test_xenapi.py +++ b/nova/tests/virt/xenapi/test_xenapi.py @@ -200,9 +200,10 @@ class XenAPIVolumeTestCase(stubs.XenAPITestBaseNoDB): super(XenAPIVolumeTestCase, self).setUp() self.flags(disable_process_locking=True, firewall_driver='nova.virt.xenapi.firewall.' - 'Dom0IptablesFirewallDriver', - xenapi_connection_url='test_url', - xenapi_connection_password='test_pass') + 'Dom0IptablesFirewallDriver') + self.flags(connection_url='test_url', + connection_password='test_pass', + group='xenserver') self.instance = fake_instance.fake_db_instance(name='foo') @@ -290,9 +291,10 @@ class XenAPIVMTestCase(stubs.XenAPITestBase): self.flags(disable_process_locking=True, instance_name_template='%d', firewall_driver='nova.virt.xenapi.firewall.' - 'Dom0IptablesFirewallDriver', - xenapi_connection_url='test_url', - xenapi_connection_password='test_pass',) + 'Dom0IptablesFirewallDriver') + self.flags(connection_url='test_url', + connection_password='test_pass', + group='xenserver') db_fakes.stub_out_db_instance_api(self.stubs) xenapi_fake.create_network('fake', 'fake_br1') stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) @@ -380,7 +382,8 @@ class XenAPIVMTestCase(stubs.XenAPITestBase): self.assertEqual(set(uuids), set(instance_uuids)) def test_get_rrd_server(self): - self.flags(xenapi_connection_url='myscheme://myaddress/') + self.flags(connection_url='myscheme://myaddress/', + group='xenserver') server_info = vm_utils._get_rrd_server() self.assertEqual(server_info[0], 'myscheme') self.assertEqual(server_info[1], 'myaddress') @@ -655,17 +658,17 @@ class XenAPIVMTestCase(stubs.XenAPITestBase): self.assertEqual(self.vm['HVM_boot_policy'], '') def _list_vdis(self): - url = CONF.xenapi_connection_url - username = CONF.xenapi_connection_username - password = CONF.xenapi_connection_password + url = CONF.xenserver.connection_url + username = CONF.xenserver.connection_username + password = CONF.xenserver.connection_password session = xenapi_conn.XenAPISession(url, username, password, fake.FakeVirtAPI()) return session.call_xenapi('VDI.get_all') def _list_vms(self): - url = CONF.xenapi_connection_url - username = CONF.xenapi_connection_username - password = CONF.xenapi_connection_password + url = CONF.xenserver.connection_url + username = CONF.xenserver.connection_username + password = CONF.xenserver.connection_password session = xenapi_conn.XenAPISession(url, username, password, fake.FakeVirtAPI()) return session.call_xenapi('VM.get_all') @@ -736,9 +739,10 @@ class XenAPIVMTestCase(stubs.XenAPITestBase): self.mox.StubOutWithMock(vm_utils, 'get_sr_path') vm_utils.get_sr_path(mox.IgnoreArg()).AndReturn('/sr/path') - self.flags(xenapi_ipxe_network_name='test1', - xenapi_ipxe_boot_menu_url='http://boot.example.com', - xenapi_ipxe_mkisofs_cmd='/root/mkisofs') + self.flags(ipxe_network_name='test1', + ipxe_boot_menu_url='http://boot.example.com', + ipxe_mkisofs_cmd='/root/mkisofs', + group='xenserver') self.mox.StubOutWithMock(self.conn._session, 'call_plugin_serialized') self.conn._session.call_plugin_serialized( 'ipxe', 'inject', '/sr/path', mox.IgnoreArg(), @@ -749,8 +753,9 @@ class XenAPIVMTestCase(stubs.XenAPITestBase): self._test_spawn(IMAGE_IPXE_ISO, None, None) def test_spawn_ipxe_iso_no_network_name(self): - self.flags(xenapi_ipxe_network_name=None, - xenapi_ipxe_boot_menu_url='http://boot.example.com') + self.flags(ipxe_network_name=None, + ipxe_boot_menu_url='http://boot.example.com', + group='xenserver') # call_plugin_serialized shouldn't be called self.mox.StubOutWithMock(self.conn._session, 'call_plugin_serialized') @@ -759,8 +764,9 @@ class XenAPIVMTestCase(stubs.XenAPITestBase): self._test_spawn(IMAGE_IPXE_ISO, None, None) def test_spawn_ipxe_iso_no_boot_menu_url(self): - self.flags(xenapi_ipxe_network_name='test1', - xenapi_ipxe_boot_menu_url=None) + self.flags(ipxe_network_name='test1', + ipxe_boot_menu_url=None, + group='xenserver') # call_plugin_serialized shouldn't be called self.mox.StubOutWithMock(self.conn._session, 'call_plugin_serialized') @@ -769,8 +775,9 @@ class XenAPIVMTestCase(stubs.XenAPITestBase): self._test_spawn(IMAGE_IPXE_ISO, None, None) def test_spawn_ipxe_iso_unknown_network_name(self): - self.flags(xenapi_ipxe_network_name='test2', - xenapi_ipxe_boot_menu_url='http://boot.example.com') + self.flags(ipxe_network_name='test2', + ipxe_boot_menu_url='http://boot.example.com', + group='xenserver') # call_plugin_serialized shouldn't be called self.mox.StubOutWithMock(self.conn._session, 'call_plugin_serialized') @@ -1024,7 +1031,8 @@ class XenAPIVMTestCase(stubs.XenAPITestBase): def test_spawn_ssh_key_injection(self): # Test spawning with key_data on an instance. Should use # agent file injection. - self.flags(xenapi_use_agent_default=True) + self.flags(use_agent_default=True, + group='xenserver') actual_injected_files = [] def fake_inject_file(self, method, args): @@ -1054,7 +1062,8 @@ class XenAPIVMTestCase(stubs.XenAPITestBase): def test_spawn_ssh_key_injection_non_rsa(self): # Test spawning with key_data on an instance. Should use # agent file injection. - self.flags(xenapi_use_agent_default=True) + self.flags(use_agent_default=True, + group='xenserver') actual_injected_files = [] def fake_inject_file(self, method, args): @@ -1082,7 +1091,8 @@ class XenAPIVMTestCase(stubs.XenAPITestBase): def test_spawn_injected_files(self): # Test spawning with injected_files. - self.flags(xenapi_use_agent_default=True) + self.flags(use_agent_default=True, + group='xenserver') actual_injected_files = [] def fake_inject_file(self, method, args): @@ -1101,7 +1111,8 @@ class XenAPIVMTestCase(stubs.XenAPITestBase): self.assertEqual(actual_injected_files, injected_files) def test_spawn_agent_upgrade(self): - self.flags(xenapi_use_agent_default=True) + self.flags(use_agent_default=True, + group='xenserver') actual_injected_files = [] def fake_agent_build(_self, *args): @@ -1116,7 +1127,8 @@ class XenAPIVMTestCase(stubs.XenAPITestBase): os_type="linux", architecture="x86-64") def test_spawn_agent_upgrade_fails_silently(self): - self.flags(xenapi_use_agent_default=True) + self.flags(use_agent_default=True, + group='xenserver') actual_injected_files = [] def fake_agent_build(_self, *args): @@ -1137,7 +1149,8 @@ class XenAPIVMTestCase(stubs.XenAPITestBase): os_type="linux", architecture="x86-64") def test_spawn_with_resetnetwork_alternative_returncode(self): - self.flags(xenapi_use_agent_default=True) + self.flags(use_agent_default=True, + group='xenserver') def fake_resetnetwork(self, method, args): fake_resetnetwork.called = True @@ -1153,8 +1166,9 @@ class XenAPIVMTestCase(stubs.XenAPITestBase): self.assertTrue(fake_resetnetwork.called) def _test_spawn_fails_silently_with(self, trigger, expected_exception): - self.flags(xenapi_use_agent_default=True) - self.flags(agent_version_timeout=0) + self.flags(use_agent_default=True, + agent_version_timeout=0, + group='xenserver') actual_injected_files = [] def fake_agent_version(self, method, args): @@ -1185,8 +1199,9 @@ class XenAPIVMTestCase(stubs.XenAPITestBase): exception.AgentError) def test_spawn_fails_with_agent_bad_return(self): - self.flags(xenapi_use_agent_default=True) - self.flags(agent_version_timeout=0) + self.flags(use_agent_default=True, + agent_version_timeout=0, + group='xenserver') actual_injected_files = [] def fake_agent_version(self, method, args): @@ -1200,8 +1215,9 @@ class XenAPIVMTestCase(stubs.XenAPITestBase): def test_spawn_fails_agent_not_implemented(self): # Test spawning with injected_files. - self.flags(xenapi_use_agent_default=True) - self.flags(agent_version_timeout=0) + self.flags(use_agent_default=True, + agent_version_timeout=0, + group='xenserver') actual_injected_files = [] def fake_agent_version(self, method, args): @@ -1572,9 +1588,10 @@ class XenAPIMigrateInstance(stubs.XenAPITestBase): def setUp(self): super(XenAPIMigrateInstance, self).setUp() - self.flags(xenapi_connection_url='test_url', - xenapi_connection_password='test_pass', - firewall_driver='nova.virt.xenapi.firewall.' + self.flags(connection_url='test_url', + connection_password='test_pass', + group='xenserver') + self.flags(firewall_driver='nova.virt.xenapi.firewall.' 'Dom0IptablesFirewallDriver') stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) db_fakes.stub_out_db_instance_api(self.stubs) @@ -2028,8 +2045,9 @@ class XenAPIHostTestCase(stubs.XenAPITestBase): def setUp(self): super(XenAPIHostTestCase, self).setUp() - self.flags(xenapi_connection_url='test_url', - xenapi_connection_password='test_pass') + self.flags(connection_url='test_url', + connection_password='test_pass', + group='xenserver') stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) self.context = context.get_admin_context() self.flags(use_local=True, group='conductor') @@ -2168,9 +2186,10 @@ class ToSupportedInstancesTestCase(test.NoDBTestCase): class XenAPIAutoDiskConfigTestCase(stubs.XenAPITestBase): def setUp(self): super(XenAPIAutoDiskConfigTestCase, self).setUp() - self.flags(xenapi_connection_url='test_url', - xenapi_connection_password='test_pass', - firewall_driver='nova.virt.xenapi.firewall.' + self.flags(connection_url='test_url', + connection_password='test_pass', + group='xenserver') + self.flags(firewall_driver='nova.virt.xenapi.firewall.' 'Dom0IptablesFirewallDriver') stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False) @@ -2264,9 +2283,10 @@ class XenAPIGenerateLocal(stubs.XenAPITestBase): """Test generating of local disks, like swap and ephemeral.""" def setUp(self): super(XenAPIGenerateLocal, self).setUp() - self.flags(xenapi_connection_url='test_url', - xenapi_connection_password='test_pass', - firewall_driver='nova.virt.xenapi.firewall.' + self.flags(connection_url='test_url', + connection_password='test_pass', + group='xenserver') + self.flags(firewall_driver='nova.virt.xenapi.firewall.' 'Dom0IptablesFirewallDriver') stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) db_fakes.stub_out_db_instance_api(self.stubs) @@ -2378,9 +2398,10 @@ class XenAPIBWCountersTestCase(stubs.XenAPITestBaseNoDB): super(XenAPIBWCountersTestCase, self).setUp() self.stubs.Set(vm_utils, 'list_vms', XenAPIBWCountersTestCase._fake_list_vms) - self.flags(xenapi_connection_url='test_url', - xenapi_connection_password='test_pass', - firewall_driver='nova.virt.xenapi.firewall.' + self.flags(connection_url='test_url', + connection_password='test_pass', + group='xenserver') + self.flags(firewall_driver='nova.virt.xenapi.firewall.' 'Dom0IptablesFirewallDriver') stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False) @@ -2510,9 +2531,10 @@ class XenAPIDom0IptablesFirewallTestCase(stubs.XenAPITestBase): def setUp(self): super(XenAPIDom0IptablesFirewallTestCase, self).setUp() - self.flags(xenapi_connection_url='test_url', - xenapi_connection_password='test_pass', - instance_name_template='%d', + self.flags(connection_url='test_url', + connection_password='test_pass', + group='xenserver') + self.flags(instance_name_template='%d', firewall_driver='nova.virt.xenapi.firewall.' 'Dom0IptablesFirewallDriver') self.user_id = 'mappin' @@ -2775,7 +2797,7 @@ class XenAPISRSelectionTestCase(stubs.XenAPITestBaseNoDB): """Unit tests for testing we find the right SR.""" def test_safe_find_sr_raise_exception(self): # Ensure StorageRepositoryNotFound is raise when wrong filter. - self.flags(sr_matching_filter='yadayadayada') + self.flags(sr_matching_filter='yadayadayada', group='xenserver') stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass', fake.FakeVirtAPI()) @@ -2784,7 +2806,8 @@ class XenAPISRSelectionTestCase(stubs.XenAPITestBaseNoDB): def test_safe_find_sr_local_storage(self): # Ensure the default local-storage is found. - self.flags(sr_matching_filter='other-config:i18n-key=local-storage') + self.flags(sr_matching_filter='other-config:i18n-key=local-storage', + group='xenserver') stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass', fake.FakeVirtAPI()) @@ -2804,7 +2827,8 @@ class XenAPISRSelectionTestCase(stubs.XenAPITestBaseNoDB): def test_safe_find_sr_by_other_criteria(self): # Ensure the SR is found when using a different filter. - self.flags(sr_matching_filter='other-config:my_fake_sr=true') + self.flags(sr_matching_filter='other-config:my_fake_sr=true', + group='xenserver') stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass', fake.FakeVirtAPI()) @@ -2818,7 +2842,8 @@ class XenAPISRSelectionTestCase(stubs.XenAPITestBaseNoDB): def test_safe_find_sr_default(self): # Ensure the default SR is found regardless of other-config. - self.flags(sr_matching_filter='default-sr:true') + self.flags(sr_matching_filter='default-sr:true', + group='xenserver') stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass', fake.FakeVirtAPI()) @@ -2846,10 +2871,11 @@ class XenAPIAggregateTestCase(stubs.XenAPITestBase): """Unit tests for aggregate operations.""" def setUp(self): super(XenAPIAggregateTestCase, self).setUp() - self.flags(xenapi_connection_url='http://test_url', - xenapi_connection_username='test_user', - xenapi_connection_password='test_pass', - instance_name_template='%d', + self.flags(connection_url='http://test_url', + connection_username='test_user', + connection_password='test_pass', + group='xenserver') + self.flags(instance_name_template='%d', firewall_driver='nova.virt.xenapi.firewall.' 'Dom0IptablesFirewallDriver', host='host', @@ -3219,9 +3245,10 @@ class XenAPILiveMigrateTestCase(stubs.XenAPITestBaseNoDB): """Unit tests for live_migration.""" def setUp(self): super(XenAPILiveMigrateTestCase, self).setUp() - self.flags(xenapi_connection_url='test_url', - xenapi_connection_password='test_pass', - firewall_driver='nova.virt.xenapi.firewall.' + self.flags(connection_url='test_url', + connection_password='test_pass', + group='xenserver') + self.flags(firewall_driver='nova.virt.xenapi.firewall.' 'Dom0IptablesFirewallDriver', host='host') db_fakes.stub_out_db_instance_api(self.stubs) @@ -3679,9 +3706,10 @@ class XenAPILiveMigrateTestCase(stubs.XenAPITestBaseNoDB): class XenAPIInjectMetadataTestCase(stubs.XenAPITestBaseNoDB): def setUp(self): super(XenAPIInjectMetadataTestCase, self).setUp() - self.flags(xenapi_connection_url='test_url', - xenapi_connection_password='test_pass', - firewall_driver='nova.virt.xenapi.firewall.' + self.flags(connection_url='test_url', + connection_password='test_pass', + group='xenserver') + self.flags(firewall_driver='nova.virt.xenapi.firewall.' 'Dom0IptablesFirewallDriver') stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False) diff --git a/nova/virt/xenapi/agent.py b/nova/virt/xenapi/agent.py index 43e57b540636..08fdee4de44c 100644 --- a/nova/virt/xenapi/agent.py +++ b/nova/virt/xenapi/agent.py @@ -51,39 +51,51 @@ LOG = logging.getLogger(__name__) xenapi_agent_opts = [ cfg.IntOpt('agent_timeout', default=30, + deprecated_name='agent_timeout', + deprecated_group='DEFAULT', help='number of seconds to wait for agent reply'), cfg.IntOpt('agent_version_timeout', default=300, + deprecated_name='agent_version_timeout', + deprecated_group='DEFAULT', help='number of seconds to wait for agent ' 'to be fully operational'), cfg.IntOpt('agent_resetnetwork_timeout', + deprecated_name='agent_resetnetwork_timeout', + deprecated_group='DEFAULT', default=60, help='number of seconds to wait for agent reply ' 'to resetnetwork request'), - cfg.StrOpt('xenapi_agent_path', + cfg.StrOpt('agent_path', default='usr/sbin/xe-update-networking', + deprecated_name='xenapi_agent_path', + deprecated_group='DEFAULT', help='Specifies the path in which the xenapi guest agent ' 'should be located. If the agent is present, network ' 'configuration is not injected into the image. ' 'Used if compute_driver=xenapi.XenAPIDriver and ' ' flat_injected=True'), - cfg.BoolOpt('xenapi_disable_agent', - default=False, - help='Disables the use of the XenAPI agent in any image ' - 'regardless of what image properties are present.'), - cfg.BoolOpt('xenapi_use_agent_default', - default=False, - help='Determines if the xenapi agent should be used when ' - 'the image used does not contain a hint to declare if ' - 'the agent is present or not. ' - 'The hint is a glance property "' + USE_AGENT_KEY + '" ' - 'that has the value "true" or "false". ' - 'Note that waiting for the agent when it is not present ' - 'will significantly increase server boot times.'), + cfg.BoolOpt('disable_agent', + default=False, + deprecated_name='xenapi_disable_agent', + deprecated_group='DEFAULT', + help='Disables the use of the XenAPI agent in any image ' + 'regardless of what image properties are present.'), + cfg.BoolOpt('use_agent_default', + default=False, + deprecated_name='xenapi_use_agent_default', + deprecated_group='DEFAULT', + help='Determines if the xenapi agent should be used when ' + 'the image used does not contain a hint to declare if ' + 'the agent is present or not. ' + 'The hint is a glance property "' + USE_AGENT_KEY + '" ' + 'that has the value "true" or "false". ' + 'Note that waiting for the agent when it is not present ' + 'will significantly increase server boot times.'), ] CONF = cfg.CONF -CONF.register_opts(xenapi_agent_opts) +CONF.register_opts(xenapi_agent_opts, 'xenserver') def _call_agent(session, instance, vm_ref, method, addl_args=None, @@ -92,7 +104,7 @@ def _call_agent(session, instance, vm_ref, method, addl_args=None, if addl_args is None: addl_args = {} if timeout is None: - timeout = CONF.agent_timeout + timeout = CONF.xenserver.agent_timeout if success_codes is None: success_codes = ['0'] @@ -198,7 +210,7 @@ class XenAPIBasedAgent(object): # it will generally perform a setup process on first boot that can # take a couple of minutes and then reboot. On Linux, the system can # also take a while to boot. - expiration = time.time() + CONF.agent_version_timeout + expiration = time.time() + CONF.xenserver.agent_version_timeout while True: try: # NOTE(johngarbutt): we can't use the xapi plugin @@ -334,8 +346,8 @@ class XenAPIBasedAgent(object): #NOTE(johngarbutt) old FreeBSD and Gentoo agents return 500 on success return self._call_agent('resetnetwork', - timeout=CONF.agent_resetnetwork_timeout, - success_codes=['0', '500']) + timeout=CONF.xenserver.agent_resetnetwork_timeout, + success_codes=['0', '500']) def _skip_ssh_key_inject(self): return self._get_sys_meta_key(SKIP_SSH_SM_KEY) @@ -354,10 +366,10 @@ def find_guest_agent(base_dir): tries to locate a guest agent at the path specified by agent_rel_path """ - if CONF.xenapi_disable_agent: + if CONF.xenserver.disable_agent: return False - agent_rel_path = CONF.xenapi_agent_path + agent_rel_path = CONF.xenserver.agent_path agent_path = os.path.join(base_dir, agent_rel_path) if os.path.isfile(agent_path): # The presence of the guest agent @@ -385,7 +397,7 @@ def find_guest_agent(base_dir): def should_use_agent(instance): sys_meta = utils.instance_sys_meta(instance) if USE_AGENT_SM_KEY not in sys_meta: - return CONF.xenapi_use_agent_default + return CONF.xenserver.use_agent_default else: use_agent_raw = sys_meta[USE_AGENT_SM_KEY] try: @@ -394,7 +406,7 @@ def should_use_agent(instance): LOG.warn(_("Invalid 'agent_present' value. " "Falling back to the default."), instance=instance) - return CONF.xenapi_use_agent_default + return CONF.xenserver.use_agent_default class SimpleDH(object): diff --git a/nova/virt/xenapi/driver.py b/nova/virt/xenapi/driver.py index abfdc6100461..d459b57635dc 100644 --- a/nova/virt/xenapi/driver.py +++ b/nova/virt/xenapi/driver.py @@ -19,11 +19,11 @@ A driver for XenServer or Xen Cloud Platform. **Related Flags** -:xenapi_connection_url: URL for connection to XenServer/Xen Cloud Platform. -:xenapi_connection_username: Username for connection to XenServer/Xen Cloud - Platform (default: root). -:xenapi_connection_password: Password for connection to XenServer/Xen Cloud - Platform. +:connection_url: URL for connection to XenServer/Xen Cloud Platform. +:connection_username: Username for connection to XenServer/Xen Cloud + Platform (default: root). +:connection_password: Password for connection to XenServer/Xen Cloud + Platform. :target_host: the iSCSI Target Host IP address, i.e. the IP address for the nova-volume host :target_port: iSCSI Target Port, 3260 Default @@ -67,63 +67,91 @@ from nova.virt.xenapi import volumeops LOG = logging.getLogger(__name__) xenapi_opts = [ - cfg.StrOpt('xenapi_connection_url', + cfg.StrOpt('connection_url', + deprecated_name='xenapi_connection_url', + deprecated_group='DEFAULT', help='URL for connection to XenServer/Xen Cloud Platform. ' 'A special value of unix://local can be used to connect ' 'to the local unix socket. ' 'Required if compute_driver=xenapi.XenAPIDriver'), - cfg.StrOpt('xenapi_connection_username', + cfg.StrOpt('connection_username', default='root', + deprecated_name='xenapi_connection_username', + deprecated_group='DEFAULT', help='Username for connection to XenServer/Xen Cloud Platform. ' 'Used only if compute_driver=xenapi.XenAPIDriver'), - cfg.StrOpt('xenapi_connection_password', + cfg.StrOpt('connection_password', + deprecated_name='xenapi_connection_password', + deprecated_group='DEFAULT', help='Password for connection to XenServer/Xen Cloud Platform. ' 'Used only if compute_driver=xenapi.XenAPIDriver', secret=True), - cfg.IntOpt('xenapi_connection_concurrent', + cfg.IntOpt('connection_concurrent', default=5, + deprecated_name='xenapi_connection_concurrent', + deprecated_group='DEFAULT', help='Maximum number of concurrent XenAPI connections. ' 'Used only if compute_driver=xenapi.XenAPIDriver'), - cfg.FloatOpt('xenapi_vhd_coalesce_poll_interval', + cfg.FloatOpt('vhd_coalesce_poll_interval', default=5.0, + deprecated_name='xenapi_vhd_coalesce_poll_interval', + deprecated_group='DEFAULT', help='The interval used for polling of coalescing vhds. ' 'Used only if compute_driver=xenapi.XenAPIDriver'), - cfg.BoolOpt('xenapi_check_host', + cfg.BoolOpt('check_host', default=True, + deprecated_name='xenapi_check_host', + deprecated_group='DEFAULT', help='Ensure compute service is running on host XenAPI ' 'connects to.'), - cfg.IntOpt('xenapi_vhd_coalesce_max_attempts', + cfg.IntOpt('vhd_coalesce_max_attempts', default=5, + deprecated_name='xenapi_vhd_coalesce_max_attempts', + deprecated_group='DEFAULT', help='Max number of times to poll for VHD to coalesce. ' 'Used only if compute_driver=xenapi.XenAPIDriver'), - cfg.StrOpt('xenapi_sr_base_path', + cfg.StrOpt('sr_base_path', default='/var/run/sr-mount', + deprecated_name='xenapi_sr_base_path', + deprecated_group='DEFAULT', help='Base path to the storage repository'), cfg.StrOpt('target_host', + deprecated_name='target_host', + deprecated_group='DEFAULT', help='iSCSI Target Host'), cfg.StrOpt('target_port', default='3260', + deprecated_name='target_port', + deprecated_group='DEFAULT', help='iSCSI Target Port, 3260 Default'), cfg.StrOpt('iqn_prefix', default='iqn.2010-10.org.openstack', + deprecated_name='iqn_prefix', + deprecated_group='DEFAULT', help='IQN Prefix'), # NOTE(sirp): This is a work-around for a bug in Ubuntu Maverick, # when we pull support for it, we should remove this - cfg.BoolOpt('xenapi_remap_vbd_dev', + cfg.BoolOpt('remap_vbd_dev', default=False, + deprecated_name='xenapi_remap_vbd_dev', + deprecated_group='DEFAULT', help='Used to enable the remapping of VBD dev ' '(Works around an issue in Ubuntu Maverick)'), - cfg.StrOpt('xenapi_remap_vbd_dev_prefix', + cfg.StrOpt('remap_vbd_dev_prefix', default='sd', + deprecated_name='xenapi_remap_vbd_dev_prefix', + deprecated_group='DEFAULT', help='Specify prefix to remap VBD dev to ' '(ex. /dev/xvdb -> /dev/sdb)'), - cfg.IntOpt('xenapi_login_timeout', + cfg.IntOpt('login_timeout', default=10, + deprecated_name='xenapi_login_timeout', + deprecated_group='DEFAULT', help='Timeout in seconds for XenAPI login.'), ] CONF = cfg.CONF -CONF.register_opts(xenapi_opts) +CONF.register_opts(xenapi_opts, 'xenserver') CONF.import_opt('host', 'nova.netconf') @@ -133,13 +161,13 @@ class XenAPIDriver(driver.ComputeDriver): def __init__(self, virtapi, read_only=False): super(XenAPIDriver, self).__init__(virtapi) - url = CONF.xenapi_connection_url - username = CONF.xenapi_connection_username - password = CONF.xenapi_connection_password + url = CONF.xenserver.connection_url + username = CONF.xenserver.connection_username + password = CONF.xenserver.connection_password if not url or password is None: - raise Exception(_('Must specify xenapi_connection_url, ' - 'xenapi_connection_username (optionally), and ' - 'xenapi_connection_password to use ' + raise Exception(_('Must specify connection_url, ' + 'connection_username (optionally), and ' + 'connection_password to use ' 'compute_driver=xenapi.XenAPIDriver')) self._session = XenAPISession(url, username, password, self.virtapi) @@ -158,7 +186,7 @@ class XenAPIDriver(driver.ComputeDriver): return self._host_state def init_host(self, host): - if CONF.xenapi_check_host: + if CONF.xenserver.check_host: vm_utils.ensure_correct_host(self._session) try: @@ -399,7 +427,7 @@ class XenAPIDriver(driver.ComputeDriver): @staticmethod def get_host_ip_addr(): - xs_url = urlparse.urlparse(CONF.xenapi_connection_url) + xs_url = urlparse.urlparse(CONF.xenserver.connection_url) return xs_url.netloc def attach_volume(self, context, connection_info, instance, mountpoint, @@ -417,10 +445,10 @@ class XenAPIDriver(driver.ComputeDriver): mountpoint) def get_console_pool_info(self, console_type): - xs_url = urlparse.urlparse(CONF.xenapi_connection_url) + xs_url = urlparse.urlparse(CONF.xenserver.connection_url) return {'address': xs_url.netloc, - 'username': CONF.xenapi_connection_username, - 'password': CONF.xenapi_connection_password} + 'username': CONF.xenserver.connection_username, + 'password': CONF.xenserver.connection_password} def get_available_resource(self, nodename): """Retrieve resource information. @@ -692,7 +720,7 @@ class XenAPISession(object): def _create_first_session(self, url, user, pw, exception): try: session = self._create_session(url) - with timeout.Timeout(CONF.xenapi_login_timeout, exception): + with timeout.Timeout(CONF.xenserver.login_timeout, exception): session.login_with_password(user, pw) except self.XenAPI.Failure as e: # if user and pw of the master are different, we're doomed! @@ -708,9 +736,9 @@ class XenAPISession(object): return url def _populate_session_pool(self, url, user, pw, exception): - for i in xrange(CONF.xenapi_connection_concurrent - 1): + for i in xrange(CONF.xenserver.connection_concurrent - 1): session = self._create_session(url) - with timeout.Timeout(CONF.xenapi_login_timeout, exception): + with timeout.Timeout(CONF.xenserver.login_timeout, exception): session.login_with_password(user, pw) self._sessions.put(session) diff --git a/nova/virt/xenapi/image/bittorrent.py b/nova/virt/xenapi/image/bittorrent.py index a2edaa96f0f6..4c2a6fb60eb6 100644 --- a/nova/virt/xenapi/image/bittorrent.py +++ b/nova/virt/xenapi/image/bittorrent.py @@ -25,38 +25,54 @@ from nova.virt.xenapi import vm_utils LOG = logging.getLogger(__name__) xenapi_torrent_opts = [ - cfg.StrOpt('xenapi_torrent_base_url', + cfg.StrOpt('torrent_base_url', + deprecated_name='xenapi_torrent_base_url', + deprecated_group='DEFAULT', help='Base URL for torrent files.'), - cfg.FloatOpt('xenapi_torrent_seed_chance', + cfg.FloatOpt('torrent_seed_chance', default=1.0, + deprecated_name='xenapi_torrent_seed_chance', + deprecated_group='DEFAULT', help='Probability that peer will become a seeder.' ' (1.0 = 100%)'), - cfg.IntOpt('xenapi_torrent_seed_duration', + cfg.IntOpt('torrent_seed_duration', default=3600, + deprecated_name='xenapi_torrent_seed_duration', + deprecated_group='DEFAULT', help='Number of seconds after downloading an image via' ' BitTorrent that it should be seeded for other peers.'), - cfg.IntOpt('xenapi_torrent_max_last_accessed', + cfg.IntOpt('torrent_max_last_accessed', default=86400, + deprecated_name='xenapi_torrent_max_last_accessed', + deprecated_group='DEFAULT', help='Cached torrent files not accessed within this number of' ' seconds can be reaped'), - cfg.IntOpt('xenapi_torrent_listen_port_start', + cfg.IntOpt('torrent_listen_port_start', default=6881, + deprecated_name='xenapi_torrent_listen_port_start', + deprecated_group='DEFAULT', help='Beginning of port range to listen on'), - cfg.IntOpt('xenapi_torrent_listen_port_end', + cfg.IntOpt('torrent_listen_port_end', default=6891, + deprecated_name='xenapi_torrent_listen_port_end', + deprecated_group='DEFAULT', help='End of port range to listen on'), - cfg.IntOpt('xenapi_torrent_download_stall_cutoff', + cfg.IntOpt('torrent_download_stall_cutoff', default=600, + deprecated_name='xenapi_torrent_download_stall_cutoff', + deprecated_group='DEFAULT', help='Number of seconds a download can remain at the same' ' progress percentage w/o being considered a stall'), - cfg.IntOpt('xenapi_torrent_max_seeder_processes_per_host', + cfg.IntOpt('torrent_max_seeder_processes_per_host', default=1, + deprecated_name='xenapi_torrent_max_seeder_processes_per_host', + deprecated_group='DEFAULT', help='Maximum number of seeder processes to run concurrently' ' within a given dom0. (-1 = no limit)') ] CONF = cfg.CONF -CONF.register_opts(xenapi_torrent_opts) +CONF.register_opts(xenapi_torrent_opts, 'xenserver') class BittorrentStore(object): @@ -73,12 +89,12 @@ class BittorrentStore(object): LOG.debug(_("No torrent URL fetcher extension found, using" " default.")) - if not CONF.xenapi_torrent_base_url: + if not CONF.xenserver.torrent_base_url: raise RuntimeError(_('Cannot create default bittorrent URL' - ' without xenapi_torrent_base_url set')) + ' without torrent_base_url set')) def _default_torrent_url_fn(instance, image_id): - return urlparse.urljoin(CONF.xenapi_torrent_base_url, + return urlparse.urljoin(CONF.xenserver.torrent_base_url, "%s.torrent" % image_id) fn = _default_torrent_url_fn @@ -98,17 +114,18 @@ class BittorrentStore(object): params['image_id'] = image_id params['uuid_stack'] = vm_utils._make_uuid_stack() params['sr_path'] = vm_utils.get_sr_path(session) - params['torrent_seed_duration'] = CONF.xenapi_torrent_seed_duration - params['torrent_seed_chance'] = CONF.xenapi_torrent_seed_chance + params['torrent_seed_duration'] = CONF.xenserver.torrent_seed_duration + params['torrent_seed_chance'] = CONF.xenserver.torrent_seed_chance params['torrent_max_last_accessed'] = \ - CONF.xenapi_torrent_max_last_accessed + CONF.xenserver.torrent_max_last_accessed params['torrent_listen_port_start'] = \ - CONF.xenapi_torrent_listen_port_start - params['torrent_listen_port_end'] = CONF.xenapi_torrent_listen_port_end + CONF.xenserver.torrent_listen_port_start + params['torrent_listen_port_end'] = \ + CONF.xenserver.torrent_listen_port_end params['torrent_download_stall_cutoff'] = \ - CONF.xenapi_torrent_download_stall_cutoff + CONF.xenserver.torrent_download_stall_cutoff params['torrent_max_seeder_processes_per_host'] = \ - CONF.xenapi_torrent_max_seeder_processes_per_host + CONF.xenserver.torrent_max_seeder_processes_per_host lookup_fn = self._lookup_torrent_url_fn() params['torrent_url'] = lookup_fn(instance, image_id) diff --git a/nova/virt/xenapi/pool.py b/nova/virt/xenapi/pool.py index 3e2ef77ec50e..f0f9ba480727 100644 --- a/nova/virt/xenapi/pool.py +++ b/nova/virt/xenapi/pool.py @@ -35,12 +35,14 @@ LOG = logging.getLogger(__name__) xenapi_pool_opts = [ cfg.BoolOpt('use_join_force', + deprecated_name='use_join_force', + deprecated_group='DEFAULT', default=True, help='To use for hosts with different CPUs'), ] CONF = cfg.CONF -CONF.register_opts(xenapi_pool_opts) +CONF.register_opts(xenapi_pool_opts, 'xenserver') CONF.import_opt('host', 'nova.netconf') @@ -176,10 +178,10 @@ class ResourcePool(object): 'url': url, 'user': user, 'password': passwd, - 'force': jsonutils.dumps(CONF.use_join_force), + 'force': jsonutils.dumps(CONF.xenserver.use_join_force), 'master_addr': self._host_addr, - 'master_user': CONF.xenapi_connection_username, - 'master_pass': CONF.xenapi_connection_password, } + 'master_user': CONF.xenserver.connection_username, + 'master_pass': CONF.xenserver.connection_password, } self._session.call_plugin('xenhost', 'host_join', args) except self._session.XenAPI.Failure as e: LOG.error(_("Pool-Join failed: %s"), e) @@ -235,12 +237,12 @@ class ResourcePool(object): # because this might be 169.254.0.1, i.e. xenapi # NOTE: password in clear is not great, but it'll do for now sender_url = swap_xapi_host( - CONF.xenapi_connection_url, self._host_addr) + CONF.xenserver.connection_url, self._host_addr) return { "url": sender_url, - "user": CONF.xenapi_connection_username, - "passwd": CONF.xenapi_connection_password, + "user": CONF.xenserver.connection_username, + "passwd": CONF.xenserver.connection_password, "compute_uuid": vm_utils.get_this_vm_uuid(None), "xenhost_uuid": self._host_uuid, } diff --git a/nova/virt/xenapi/vif.py b/nova/virt/xenapi/vif.py index 89f2c69d7cff..d5db98fcd7a5 100644 --- a/nova/virt/xenapi/vif.py +++ b/nova/virt/xenapi/vif.py @@ -26,12 +26,14 @@ from nova.virt.xenapi import network_utils from nova.virt.xenapi import vm_utils -xenapi_ovs_integration_bridge_opt = cfg.StrOpt('xenapi_ovs_integration_bridge', - default='xapi1', - help='Name of Integration Bridge used by Open vSwitch') +xenapi_ovs_integration_bridge_opt = cfg.StrOpt('ovs_integration_bridge', + default='xapi1', + deprecated_name='xenapi_ovs_integration_bridge', + deprecated_group='DEFAULT', + help='Name of Integration Bridge used by Open vSwitch') CONF = cfg.CONF -CONF.register_opt(xenapi_ovs_integration_bridge_opt) +CONF.register_opt(xenapi_ovs_integration_bridge_opt, 'xenserver') class XenVIFDriver(object): @@ -145,7 +147,7 @@ class XenAPIOpenVswitchDriver(XenVIFDriver): # with OVS model, always plug into an OVS integration bridge # that is already created network_ref = network_utils.find_network_with_bridge( - self._session, CONF.xenapi_ovs_integration_bridge) + self._session, CONF.xenserver.ovs_integration_bridge) vif_rec = {} vif_rec['device'] = str(device) vif_rec['network'] = network_ref diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py index 33688b40a08b..a260e8aa9d8e 100644 --- a/nova/virt/xenapi/vm_utils.py +++ b/nova/virt/xenapi/vm_utils.py @@ -62,26 +62,38 @@ LOG = logging.getLogger(__name__) xenapi_vm_utils_opts = [ cfg.StrOpt('cache_images', - default='all', - help='Cache glance images locally. `all` will cache all' - ' images, `some` will only cache images that have the' - ' image_property `cache_in_nova=True`, and `none` turns' - ' off caching entirely'), - cfg.IntOpt('xenapi_image_compression_level', + default='all', + deprecated_name='cache_images', + deprecated_group='DEFAULT', + help='Cache glance images locally. `all` will cache all' + ' images, `some` will only cache images that have the' + ' image_property `cache_in_nova=True`, and `none` turns' + ' off caching entirely'), + cfg.IntOpt('image_compression_level', + deprecated_name='xenapi_image_compression_level', + deprecated_group='DEFAULT', help='Compression level for images, e.g., 9 for gzip -9.' ' Range is 1-9, 9 being most compressed but most CPU' ' intensive on dom0.'), cfg.StrOpt('default_os_type', default='linux', + deprecated_name='default_os_type', + deprecated_group='DEFAULT', help='Default OS type'), cfg.IntOpt('block_device_creation_timeout', default=10, + deprecated_name='block_device_creation_timeout', + deprecated_group='DEFAULT', help='Time to wait for a block device to be created'), cfg.IntOpt('max_kernel_ramdisk_size', default=16 * unit.Mi, + deprecated_name='max_kernel_ramdisk_size', + deprecated_group='DEFAULT', help='Maximum size in bytes of kernel or ramdisk images'), cfg.StrOpt('sr_matching_filter', default='default-sr:true', + deprecated_name='sr_matching_filter', + deprecated_group='DEFAULT', help='Filter for finding the SR to be used to install guest ' 'instances on. To use the Local Storage in default ' 'XenServer/XCP installations set this flag to ' @@ -90,31 +102,43 @@ xenapi_vm_utils_opts = [ 'other-config:my_favorite_sr=true. On the other hand, to ' 'fall back on the Default SR, as displayed by XenCenter, ' 'set this flag to: default-sr:true'), - cfg.BoolOpt('xenapi_sparse_copy', + cfg.BoolOpt('sparse_copy', default=True, + deprecated_name='xenapi_sparse_copy', + deprecated_group='DEFAULT', help='Whether to use sparse_copy for copying data on a ' 'resize down (False will use standard dd). This speeds ' 'up resizes down considerably since large runs of zeros ' 'won\'t have to be rsynced'), - cfg.IntOpt('xenapi_num_vbd_unplug_retries', + cfg.IntOpt('num_vbd_unplug_retries', default=10, + deprecated_name='xenapi_num_vbd_unplug_retries', + deprecated_group='DEFAULT', help='Maximum number of retries to unplug VBD'), - cfg.StrOpt('xenapi_torrent_images', + cfg.StrOpt('torrent_images', default='none', + deprecated_name='xenapi_torrent_images', + deprecated_group='DEFAULT', help='Whether or not to download images via Bit Torrent ' '(all|some|none).'), - cfg.StrOpt('xenapi_ipxe_network_name', + cfg.StrOpt('ipxe_network_name', + deprecated_name='xenapi_ipxe_network_name', + deprecated_group='DEFAULT', help='Name of network to use for booting iPXE ISOs'), - cfg.StrOpt('xenapi_ipxe_boot_menu_url', + cfg.StrOpt('ipxe_boot_menu_url', + deprecated_name='xenapi_ipxe_boot_menu_url', + deprecated_group='DEFAULT', help='URL to the iPXE boot menu'), - cfg.StrOpt('xenapi_ipxe_mkisofs_cmd', + cfg.StrOpt('ipxe_mkisofs_cmd', default='mkisofs', + deprecated_name='xenapi_ipxe_mkisofs_cmd', + deprecated_group='DEFAULT', help='Name and optionally path of the tool used for ' 'ISO image creation'), ] CONF = cfg.CONF -CONF.register_opts(xenapi_vm_utils_opts) +CONF.register_opts(xenapi_vm_utils_opts, 'xenserver') CONF.import_opt('default_ephemeral_format', 'nova.virt.driver') CONF.import_opt('use_cow_images', 'nova.virt.driver') CONF.import_opt('glance_num_retries', 'nova.image.glance') @@ -361,7 +385,7 @@ def _should_retry_unplug_vbd(err): def unplug_vbd(session, vbd_ref): - max_attempts = CONF.xenapi_num_vbd_unplug_retries + 1 + max_attempts = CONF.xenserver.num_vbd_unplug_retries + 1 for num_attempt in xrange(1, max_attempts + 1): try: if num_attempt > 1: @@ -769,7 +793,7 @@ def get_sr_path(session, sr_ref=None): " SR %(uuid)s is of type %(type)s") % {"uuid": sr_uuid, "type": sr_rec["type"]}) - return os.path.join(CONF.xenapi_sr_base_path, sr_uuid) + return os.path.join(CONF.xenserver.sr_base_path, sr_uuid) def destroy_cached_images(session, sr_ref, all_cached=False, dry_run=False): @@ -1102,7 +1126,7 @@ def _create_kernel_image(context, session, instance, name_label, image_id, Returns: A list of dictionaries that describe VDIs """ filename = "" - if CONF.cache_images: + if CONF.xenserver.cache_images: args = {} args['cached-image'] = image_id args['new-image-uuid'] = str(uuid.uuid4()) @@ -1211,7 +1235,7 @@ def _create_image(context, session, instance, name_label, image_id, Returns: A list of dictionaries that describe VDIs """ - cache_images = CONF.cache_images.lower() + cache_images = CONF.xenserver.cache_images.lower() # Determine if the image is cacheable if image_type == ImageType.DISK_ISO: @@ -1228,7 +1252,7 @@ def _create_image(context, session, instance, name_label, image_id, cache = False else: LOG.warning(_("Unrecognized cache_images value '%s', defaulting to" - " True"), CONF.cache_images) + " True"), CONF.xenserver.cache_images) cache = True # Fetch (and cache) the image @@ -1279,22 +1303,22 @@ def _make_uuid_stack(): def _image_uses_bittorrent(context, instance): bittorrent = False - xenapi_torrent_images = CONF.xenapi_torrent_images.lower() + torrent_images = CONF.xenserver.torrent_images.lower() - if xenapi_torrent_images == 'all': + if torrent_images == 'all': bittorrent = True - elif xenapi_torrent_images == 'some': + elif torrent_images == 'some': sys_meta = utils.instance_sys_meta(instance) try: bittorrent = strutils.bool_from_string( sys_meta['image_bittorrent']) except KeyError: pass - elif xenapi_torrent_images == 'none': + elif torrent_images == 'none': pass else: - LOG.warning(_("Invalid value '%s' for xenapi_torrent_images"), - xenapi_torrent_images) + LOG.warning(_("Invalid value '%s' for torrent_images"), + torrent_images) return bittorrent @@ -1314,9 +1338,9 @@ def _choose_download_handler(context, instance): def get_compression_level(): - level = CONF.xenapi_image_compression_level + level = CONF.xenserver.image_compression_level if level is not None and (level < 1 or level > 9): - LOG.warn(_("Invalid value '%d' for xenapi_image_compression_level"), + LOG.warn(_("Invalid value '%d' for image_compression_level"), level) return None return level @@ -1445,8 +1469,8 @@ def _fetch_disk_image(context, session, instance, name_label, image_id, # Make room for MBR. vdi_size += MBR_SIZE_BYTES elif (image_type in (ImageType.KERNEL, ImageType.RAMDISK) and - vdi_size > CONF.max_kernel_ramdisk_size): - max_size = CONF.max_kernel_ramdisk_size + vdi_size > CONF.xenserver.max_kernel_ramdisk_size): + max_size = CONF.xenserver.max_kernel_ramdisk_size raise exception.NovaException( _("Kernel/Ramdisk image is too large: %(vdi_size)d bytes, " "max %(max_size)d bytes") % @@ -1475,7 +1499,7 @@ def _fetch_disk_image(context, session, instance, name_label, image_id, # Let the plugin copy the correct number of bytes. args['image-size'] = str(vdi_size) - if CONF.cache_images: + if CONF.xenserver.cache_images: args['cached-image'] = image_id filename = session.call_plugin('kernel', 'copy_vdi', args) @@ -1746,13 +1770,14 @@ def _find_sr(session): """Return the storage repository to hold VM images.""" host = session.get_xenapi_host() try: - tokens = CONF.sr_matching_filter.split(':') + tokens = CONF.xenserver.sr_matching_filter.split(':') filter_criteria = tokens[0] filter_pattern = tokens[1] except IndexError: # oops, flag is invalid LOG.warning(_("Flag sr_matching_filter '%s' does not respect " - "formatting convention"), CONF.sr_matching_filter) + "formatting convention"), + CONF.xenserver.sr_matching_filter) return None if filter_criteria == 'other-config': @@ -1822,7 +1847,7 @@ def _find_iso_sr(session): def _get_rrd_server(): """Return server's scheme and address to use for retrieving RRD XMLs.""" - xs_url = urlparse.urlparse(CONF.xenapi_connection_url) + xs_url = urlparse.urlparse(CONF.xenserver.connection_url) return [xs_url.scheme, xs_url.netloc] @@ -1831,8 +1856,8 @@ def _get_rrd(server, vm_uuid): try: xml = urllib.urlopen("%s://%s:%s@%s/vm_rrd?uuid=%s" % ( server[0], - CONF.xenapi_connection_username, - CONF.xenapi_connection_password, + CONF.xenserver.connection_username, + CONF.xenserver.connection_password, server[1], vm_uuid)) return xml.read() @@ -1952,7 +1977,7 @@ def _wait_for_vhd_coalesce(session, instance, sr_ref, vdi_ref, base_uuid = _get_vhd_parent_uuid(session, parent_ref) return parent_uuid, base_uuid - max_attempts = CONF.xenapi_vhd_coalesce_max_attempts + max_attempts = CONF.xenserver.vhd_coalesce_max_attempts for i in xrange(max_attempts): # NOTE(sirp): This rescan is necessary to ensure the VM's `sm_config` # matches the underlying VHDs. @@ -1969,7 +1994,7 @@ def _wait_for_vhd_coalesce(session, instance, sr_ref, vdi_ref, base_uuid = _get_vhd_parent_uuid(session, parent_ref) return parent_uuid, base_uuid - greenthread.sleep(CONF.xenapi_vhd_coalesce_poll_interval) + greenthread.sleep(CONF.xenserver.vhd_coalesce_poll_interval) msg = (_("VHD coalesce attempts exceeded (%d)" ", giving up...") % max_attempts) @@ -1986,12 +2011,12 @@ def _remap_vbd_dev(dev): For now, we work around it by just doing a string replace. """ # NOTE(sirp): This hack can go away when we pull support for Maverick - should_remap = CONF.xenapi_remap_vbd_dev + should_remap = CONF.xenserver.remap_vbd_dev if not should_remap: return dev old_prefix = 'xvd' - new_prefix = CONF.xenapi_remap_vbd_dev_prefix + new_prefix = CONF.xenserver.remap_vbd_dev_prefix remapped_dev = dev.replace(old_prefix, new_prefix) return remapped_dev @@ -1999,7 +2024,7 @@ def _remap_vbd_dev(dev): def _wait_for_device(dev): """Wait for device node to appear.""" - for i in xrange(0, CONF.block_device_creation_timeout): + for i in xrange(0, CONF.xenserver.block_device_creation_timeout): dev_path = utils.make_dev_path(dev) if os.path.exists(dev_path): return @@ -2274,7 +2299,7 @@ def _copy_partition(session, src_ref, dst_ref, partition, virtual_size): _write_partition(session, virtual_size, dst) - if CONF.xenapi_sparse_copy: + if CONF.xenserver.sparse_copy: _sparse_copy(src_path, dst_path, virtual_size) else: num_blocks = virtual_size / SECTOR_SIZE @@ -2432,7 +2457,7 @@ def ensure_correct_host(session): if exc.details[0] != 'UUID_INVALID': raise raise Exception(_('This domU must be running on the host ' - 'specified by xenapi_connection_url')) + 'specified by connection_url')) def import_all_migrated_disks(session, instance): @@ -2524,15 +2549,15 @@ def handle_ipxe_iso(session, instance, cd_vdi, network_info): provider can either add that package manually to Dom0 or include the `mkisofs` binary in the image itself. """ - boot_menu_url = CONF.xenapi_ipxe_boot_menu_url + boot_menu_url = CONF.xenserver.ipxe_boot_menu_url if not boot_menu_url: - LOG.warn(_('xenapi_ipxe_boot_menu_url not set, user will have to' + LOG.warn(_('ipxe_boot_menu_url not set, user will have to' ' enter URL manually...'), instance=instance) return - network_name = CONF.xenapi_ipxe_network_name + network_name = CONF.xenserver.ipxe_network_name if not network_name: - LOG.warn(_('xenapi_ipxe_network_name not set, user will have to' + LOG.warn(_('ipxe_network_name not set, user will have to' ' enter IP manually...'), instance=instance) return @@ -2563,11 +2588,11 @@ def handle_ipxe_iso(session, instance, cd_vdi, network_info): try: session.call_plugin_serialized("ipxe", "inject", sr_path, cd_vdi['uuid'], boot_menu_url, ip_address, netmask, - gateway, dns, CONF.xenapi_ipxe_mkisofs_cmd) + gateway, dns, CONF.xenserver.ipxe_mkisofs_cmd) except session.XenAPI.Failure as exc: _type, _method, error = exc.details[:3] if error == 'CommandNotFound': LOG.warn(_("ISO creation tool '%s' does not exist.") % - CONF.xenapi_ipxe_mkisofs_cmd, instance=instance) + CONF.xenserver.ipxe_mkisofs_cmd, instance=instance) else: raise diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py index a559fa262554..7c1889772011 100644 --- a/nova/virt/xenapi/vmops.py +++ b/nova/virt/xenapi/vmops.py @@ -60,20 +60,26 @@ from nova.virt.xenapi import volumeops LOG = logging.getLogger(__name__) xenapi_vmops_opts = [ - cfg.IntOpt('xenapi_running_timeout', + cfg.IntOpt('running_timeout', default=60, + deprecated_name='xenapi_running_timeout', + deprecated_group='DEFAULT', help='number of seconds to wait for instance ' 'to go to running state'), - cfg.StrOpt('xenapi_vif_driver', + cfg.StrOpt('vif_driver', default='nova.virt.xenapi.vif.XenAPIBridgeDriver', + deprecated_name='xenapi_vif_driver', + deprecated_group='DEFAULT', help='The XenAPI VIF driver using XenServer Network APIs.'), - cfg.StrOpt('xenapi_image_upload_handler', + cfg.StrOpt('image_upload_handler', default='nova.virt.xenapi.image.glance.GlanceStore', - help='Dom0 plugin driver used to handle image uploads.'), + deprecated_name='xenapi_image_upload_handler', + deprecated_group='DEFAULT', + help='Dom0 plugin driver used to handle image uploads.'), ] CONF = cfg.CONF -CONF.register_opts(xenapi_vmops_opts) +CONF.register_opts(xenapi_vmops_opts, 'xenserver') CONF.import_opt('host', 'nova.netconf') CONF.import_opt('vncserver_proxyclient_address', 'nova.vnc') @@ -158,17 +164,17 @@ class VMOps(object): DEFAULT_FIREWALL_DRIVER, self._virtapi, xenapi_session=self._session) - vif_impl = importutils.import_class(CONF.xenapi_vif_driver) + vif_impl = importutils.import_class(CONF.xenserver.vif_driver) self.vif_driver = vif_impl(xenapi_session=self._session) self.default_root_dev = '/dev/sda' LOG.debug(_("Importing image upload handler: %s"), - CONF.xenapi_image_upload_handler) + CONF.xenserver.image_upload_handler) self.image_upload_handler = importutils.import_object( - CONF.xenapi_image_upload_handler) + CONF.xenserver.image_upload_handler) def agent_enabled(self, instance): - if CONF.xenapi_disable_agent: + if CONF.xenserver.disable_agent: return False return xapi_agent.should_use_agent(instance) @@ -614,7 +620,7 @@ class VMOps(object): def _wait_for_instance_to_start(self, instance, vm_ref): LOG.debug(_('Waiting for instance state to become running'), instance=instance) - expiration = time.time() + CONF.xenapi_running_timeout + expiration = time.time() + CONF.xenserver.running_timeout while time.time() < expiration: state = self.get_info(instance, vm_ref)['state'] if state == power_state.RUNNING: @@ -708,7 +714,7 @@ class VMOps(object): get a stable representation of the data on disk. 3. Push-to-data-store: Once coalesced, we call - 'xenapi_image_upload_handler' to upload the images. + 'image_upload_handler' to upload the images. """ vm_ref = self._get_vm_opaque_ref(instance)