本文整理汇总了Python中ovs.lib.helpers.toolbox.Toolbox.verify_required_params方法的典型用法代码示例。如果您正苦于以下问题:Python Toolbox.verify_required_params方法的具体用法?Python Toolbox.verify_required_params怎么用?Python Toolbox.verify_required_params使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ovs.lib.helpers.toolbox.Toolbox
的用法示例。
在下文中一共展示了Toolbox.verify_required_params方法的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: get_metadata
# 需要导入模块: from ovs.lib.helpers.toolbox import Toolbox [as 别名]
# 或者: from ovs.lib.helpers.toolbox.Toolbox import verify_required_params [as 别名]
def get_metadata(storagerouter):
"""
Retrieve metadata for a Storage Router
Example return value:
{'ipaddresses': ['10.100.174.254', '172.22.1.100', '192.168.122.1'],
'partitions': {'BACKEND': [{'available': 1000202043392,
'guid': '9ec473ad-5c3f-4fdb-a4ef-c99bb4449025',
'in_use': False,
'mountpoint': u'/mnt/alba-asd/hiu8WiD7sCfVF2IKRa5U1VZLOBS3H75W',
'size': 1000202043392,
'ssd': False,
'storagerouter_guid': u'f5155bc2-b238-4a94-b6ce-b5600e65607a'}],
'DB': [{'available': 425200713728,
'guid': 'c0064548-c0be-474d-a66b-da65639831f8',
'in_use': False,
'mountpoint': '/mnt/storage',
'size': 425200713728,
'ssd': False,
'storagerouter_guid': u'f5155bc2-b238-4a94-b6ce-b5600e65607a'}],
'SCRUB': [{'available': 340160570983,
'guid': 'c0064548-c0be-474d-a66b-da65639831f8',
'in_use': False,
'mountpoint': '/mnt/storage',
'size': 425200713728,
'ssd': False,
'storagerouter_guid': u'f5155bc2-b238-4a94-b6ce-b5600e65607a'}],
'WRITE': [{'available': 60016295936,
'guid': '0d167ced-5a5f-47aa-b890-45b923b686c4',
'in_use': False,
'mountpoint': u'/mnt/ssd2',
'size': 60016295936,
'ssd': True,
'storagerouter_guid': u'f5155bc2-b238-4a94-b6ce-b5600e65607a'}]},
'scrub_available': True,
'writecache_size': 60016295936}
:param storagerouter: Storage Router to retrieve metadata for
:return: Metadata
"""
result, metadata = GeneralStorageRouter.api.execute_post_action(component='storagerouters',
guid=storagerouter.guid,
action='get_metadata',
data={},
wait=True,
timeout=300)
assert result is True, 'Retrieving metadata failed for Storage Router {0}'.format(storagerouter.name)
required_params = {'ipaddresses': (list, Toolbox.regex_ip),
'partitions': (dict, None),
'scrub_available': (bool, None),
'writecache_size': (int, {'min': 0})}
Toolbox.verify_required_params(required_params=required_params,
actual_params=metadata,
exact_match=True)
return metadata
示例2: validate_alba_backend_removal
# 需要导入模块: from ovs.lib.helpers.toolbox import Toolbox [as 别名]
# 或者: from ovs.lib.helpers.toolbox.Toolbox import verify_required_params [as 别名]
def validate_alba_backend_removal(alba_backend_info):
"""
Validate whether the backend has been deleted properly
alba_backend_info should be a dictionary containing:
- guid
- name
- maintenance_service_names
:param alba_backend_info: Information about the backend
:return: None
"""
Toolbox.verify_required_params(actual_params=alba_backend_info,
required_params={'name': (str, None),
'guid': (str, Toolbox.regex_guid),
'maintenance_service_names': (list, None)},
exact_match=True)
alba_backend_guid = alba_backend_info['guid']
alba_backend_name = alba_backend_info['name']
backend = GeneralBackend.get_by_name(alba_backend_name)
assert backend is None,\
'Still found a backend in the model with name {0}'.format(alba_backend_name)
# Validate services removed from model
for service in GeneralService.get_services_by_name(ServiceType.SERVICE_TYPES.ALBA_MGR):
assert service.name != '{0}-abm'.format(alba_backend_name),\
'An AlbaManager service has been found with name {0}'.format(alba_backend_name)
for service in GeneralService.get_services_by_name(ServiceType.SERVICE_TYPES.NS_MGR):
assert service.name.startswith('{0}-nsm_'.format(alba_backend_name)) is False,\
'An NamespaceManager service has been found with name {0}'.format(alba_backend_name)
# Validate ALBA backend configuration structure
alba_backend_key = '/ovs/alba/backends'
actual_configuration_keys = [key for key in Configuration.list(alba_backend_key)]
assert alba_backend_guid not in actual_configuration_keys,\
'Configuration still contains an entry in {0} with guid {1}'.format(alba_backend_key, alba_backend_guid)
# Validate Arakoon configuration structure
arakoon_keys = [key for key in Configuration.list('/ovs/arakoon') if key.startswith(alba_backend_name)]
assert len(arakoon_keys) == 0,\
'Configuration still contains configurations for clusters: {0}'.format(', '.join(arakoon_keys))
# Validate services
for storagerouter in GeneralStorageRouter.get_storage_routers():
root_client = SSHClient(endpoint=storagerouter, username='root')
maintenance_services = alba_backend_info['maintenance_service_names']
abm_arakoon_service_name = 'ovs-arakoon-{0}-abm'.format(alba_backend_name)
nsm_arakoon_service_name = 'ovs-arakoon-{0}-nsm_0'.format(alba_backend_name)
for service_name in [abm_arakoon_service_name, nsm_arakoon_service_name] + maintenance_services:
assert GeneralService.has_service(name=service_name, client=root_client) is False,\
'Service {0} still deployed on Storage Router {1}'.format(service_name, storagerouter.name)
示例3: validate_vpool_sanity
# 需要导入模块: from ovs.lib.helpers.toolbox import Toolbox [as 别名]
# 或者: from ovs.lib.helpers.toolbox.Toolbox import verify_required_params [as 别名]
#.........这里部分代码省略.........
'vrouter_routing_retries': 10,
'vrouter_sco_multiplier': 1024,
'vrouter_volume_read_threshold': 1024,
'vrouter_volume_write_threshold': 1024},
'volume_router_cluster': {'vrouter_cluster_id': None}}
vpool_services = {'all': ['ovs-watcher-volumedriver',
'ovs-dtl_{0}'.format(vpool.name),
'ovs-volumedriver_{0}'.format(vpool.name),
'ovs-volumerouter-consumer'],
'extra': [],
'master': ['ovs-arakoon-voldrv']}
sd_partitions = {'DB': ['MD', 'MDS', 'TLOG'],
'READ': ['None'],
'WRITE': ['FD', 'DTL', 'SCO'],
'SCRUB': ['None']}
if backend_type == 'alba':
backend_metadata = {'name': (str, None),
'preset': (str, Toolbox.regex_preset),
'backend_guid': (str, Toolbox.regex_guid),
'arakoon_config': (dict, None),
'connection': (dict, {'host': (str, Toolbox.regex_ip, False),
'port': (int, {'min': 1, 'max': 65535}),
'client_id': (str, Toolbox.regex_guid),
'client_secret': (str, None),
'local': (bool, None)}),
'backend_info': (dict, {'policies': (list, None),
'sco_size': (float, None),
'frag_size': (float, None),
'total_size': (float, None),
'nsm_partition_guids': (list, Toolbox.regex_guid)})}
required = {'backend': (dict, backend_metadata),
'backend_aa': (dict, backend_metadata, False)}
Toolbox.verify_required_params(required_params=required,
actual_params=vpool.metadata)
vpool_services['all'].append("ovs-albaproxy_{0}".format(vpool.name))
sd_partitions['WRITE'].append('FCACHE')
expected_config['backend_connection_manager'].update({'alba_connection_host': None,
'alba_connection_port': None,
'alba_connection_preset': None,
'alba_connection_timeout': 15,
'backend_type': u'{0}'.format(vpool.backend_type.code.upper())})
elif backend_type == 'distributed':
expected_config['backend_connection_manager'].update({'backend_type': u'LOCAL',
'local_connection_path': u'{0}'.format(generic_settings['distributed_mountpoint'])})
assert EtcdConfiguration.exists('/ovs/arakoon/voldrv/config', raw=True), 'Volumedriver arakoon does not exist'
# Do some verifications for all SDs
storage_ip = None
voldrv_config = GeneralArakoon.get_config('voldrv')
all_files = GeneralVPool.get_related_files(vpool=vpool)
all_directories = GeneralVPool.get_related_directories(vpool=vpool)
for storagedriver in vpool.storagedrivers:
storagerouter = storagedriver.storagerouter
root_client = SSHClient(storagerouter, username='root')
assert EtcdConfiguration.exists('/ovs/vpools/{0}/hosts/{1}/config'.format(vpool.guid, storagedriver.storagedriver_id), raw=True), 'vPool config not found in etcd'
current_config_sections = set([item for item in EtcdConfiguration.list('/ovs/vpools/{0}/hosts/{1}/config'.format(vpool.guid, storagedriver.storagedriver_id))])
assert not current_config_sections.difference(set(expected_config.keys())), 'New section appeared in the storage driver config in etcd'
assert not set(expected_config.keys()).difference(current_config_sections), 'Config section expected for storage driver, but not found in etcd'
for key, values in expected_config.iteritems():
current_config = EtcdConfiguration.get('/ovs/vpools/{0}/hosts/{1}/config/{2}'.format(vpool.guid, storagedriver.storagedriver_id, key))
assert set(current_config.keys()).union(set(values.keys())) == set(values.keys()), 'Not all expected keys match for key "{0}" on Storage Driver {1}'.format(key, storagedriver.name)
示例4: dtl_checkup
# 需要导入模块: from ovs.lib.helpers.toolbox import Toolbox [as 别名]
# 或者: from ovs.lib.helpers.toolbox.Toolbox import verify_required_params [as 别名]
def dtl_checkup(vpool_guid=None, vdisk_guid=None, storagerouters_to_exclude=None):
"""
Check DTL for all volumes
:param vpool_guid: vPool to check the DTL configuration of all its disks
:type vpool_guid: String
:param vdisk_guid: Virtual Disk to check its DTL configuration
:type vdisk_guid: String
:param storagerouters_to_exclude: Storage Routers to exclude from possible targets
:type storagerouters_to_exclude: List
:return: None
"""
if vpool_guid is not None and vdisk_guid is not None:
raise ValueError('vpool and vdisk are mutually exclusive')
if storagerouters_to_exclude is None:
storagerouters_to_exclude = []
from ovs.lib.vpool import VPoolController
logger.info('DTL checkup started')
required_params = {'dtl_mode': (str, StorageDriverClient.VPOOL_DTL_MODE_MAP.keys()),
'dtl_enabled': (bool, None)}
vdisk = VDisk(vdisk_guid) if vdisk_guid else None
vpool = VPool(vpool_guid) if vpool_guid else None
errors_found = False
root_client_map = {}
vpool_dtl_config_cache = {}
vdisks = VDiskList.get_vdisks() if vdisk is None and vpool is None else vpool.vdisks if vpool is not None else [vdisk]
for vdisk in vdisks:
logger.info(' Verifying vDisk {0} with guid {1}'.format(vdisk.name, vdisk.guid))
vdisk.invalidate_dynamics(['storagedriver_client', 'storagerouter_guid'])
if vdisk.storagedriver_client is None:
continue
vpool = vdisk.vpool
if vpool.guid not in vpool_dtl_config_cache:
vpool_config = VPoolController.get_configuration(vpool.guid) # Config on vPool is permanent for DTL settings
vpool_dtl_config_cache[vpool.guid] = vpool_config
Toolbox.verify_required_params(required_params, vpool_config)
volume_id = str(vdisk.volume_id)
vpool_config = vpool_dtl_config_cache[vpool.guid]
dtl_vpool_enabled = vpool_config['dtl_enabled']
try:
current_dtl_config = vdisk.storagedriver_client.get_dtl_config(volume_id)
current_dtl_config_mode = vdisk.storagedriver_client.get_dtl_config_mode(volume_id)
except RuntimeError as rte:
# Can occur when a volume has not been stolen yet from a dead node
logger.error('Retrieving DTL configuration from storage driver failed with error: {0}'.format(rte))
errors_found = True
continue
if dtl_vpool_enabled is False and (current_dtl_config is None or current_dtl_config.host == 'null'):
logger.info(' DTL is globally disabled for vPool {0} with guid {1}'.format(vpool.name, vpool.guid))
vdisk.storagedriver_client.set_manual_dtl_config(volume_id, None)
continue
elif current_dtl_config_mode == DTLConfigMode.MANUAL and (current_dtl_config is None or current_dtl_config.host == 'null'):
logger.info(' DTL is disabled for virtual disk {0} with guid {1}'.format(vdisk.name, vdisk.guid))
continue
storage_router = StorageRouter(vdisk.storagerouter_guid)
available_storagerouters = []
# 1. Check available storage routers in the backup failure domain
if storage_router.secondary_failure_domain is not None:
for storagerouter in storage_router.secondary_failure_domain.primary_storagerouters:
if vpool.guid not in storagerouter.vpools_guids:
continue
if storagerouter not in root_client_map:
try:
root_client = SSHClient(storagerouter, username='root')
except UnableToConnectException:
logger.warning(' Storage Router with IP {0} of vDisk {1} is not reachable'.format(storagerouter.ip, vdisk.name))
continue
root_client_map[storagerouter] = root_client
else:
root_client = root_client_map[storagerouter]
if ServiceManager.get_service_status('dtl_{0}'.format(vpool.name), client=root_client) is True:
available_storagerouters.append(storagerouter)
# 2. Check available storage routers in the same failure domain as current storage router
if len(available_storagerouters) == 0:
for storagerouter in storage_router.primary_failure_domain.primary_storagerouters:
if vpool.guid not in storagerouter.vpools_guids or storagerouter == storage_router:
continue
if storagerouter not in root_client_map:
try:
root_client = SSHClient(storagerouter, username='root')
except UnableToConnectException:
logger.warning(' Storage Router with IP {0} of vDisk {1} is not reachable'.format(storagerouter.ip, vdisk.name))
continue
root_client_map[storagerouter] = root_client
else:
root_client = root_client_map[storagerouter]
if ServiceManager.get_service_status('dtl_{0}'.format(vpool.name), client=root_client) is True:
available_storagerouters.append(storagerouter)
# Remove storage routers to exclude
for sr_guid in storagerouters_to_exclude:
sr_to_exclude = StorageRouter(sr_guid)
#.........这里部分代码省略.........
示例5: set_config_params
# 需要导入模块: from ovs.lib.helpers.toolbox import Toolbox [as 别名]
# 或者: from ovs.lib.helpers.toolbox.Toolbox import verify_required_params [as 别名]
def set_config_params(vdisk_guid, new_config_params):
"""
Sets configuration parameters for a given vdisk.
:param vdisk_guid: Guid of the virtual disk to set the configuration parameters for
:param new_config_params: New configuration parameters
"""
required_params = {'dtl_mode': (str, StorageDriverClient.VDISK_DTL_MODE_MAP.keys()),
'sco_size': (int, StorageDriverClient.TLOG_MULTIPLIER_MAP.keys()),
'dedupe_mode': (str, StorageDriverClient.VDISK_DEDUPE_MAP.keys()),
'write_buffer': (int, {'min': 128, 'max': 10 * 1024}),
'cache_strategy': (str, StorageDriverClient.VDISK_CACHE_MAP.keys()),
'readcache_limit': (int, {'min': 1, 'max': 10 * 1024}, False)}
if new_config_params.get('dtl_target') is not None:
required_params.update({'dtl_target': (str, Toolbox.regex_ip)})
Toolbox.verify_required_params(required_params, new_config_params)
if new_config_params['dtl_mode'] != 'no_sync' and new_config_params.get('dtl_target') is None:
raise Exception('If DTL mode is Asynchronous or Synchronous, a target IP should always be specified')
errors = False
vdisk = VDisk(vdisk_guid)
volume_id = str(vdisk.volume_id)
old_config_params = VDiskController.get_config_params(vdisk.guid)
# 1st update SCO size, because this impacts TLOG multiplier which on its turn impacts write buffer
new_sco_size = new_config_params['sco_size']
old_sco_size = old_config_params['sco_size']
if new_sco_size != old_sco_size:
write_buffer = float(new_config_params['write_buffer'])
tlog_multiplier = StorageDriverClient.TLOG_MULTIPLIER_MAP[new_sco_size]
sco_factor = write_buffer / tlog_multiplier / new_sco_size
try:
logger.info('Updating property sco_size on vDisk {0} to {1}'.format(vdisk_guid, new_sco_size))
vdisk.storagedriver_client.set_sco_multiplier(volume_id, new_sco_size / 4 * 1024)
vdisk.storagedriver_client.set_tlog_multiplier(volume_id, tlog_multiplier)
vdisk.storagedriver_client.set_sco_cache_max_non_disposable_factor(volume_id, sco_factor)
logger.info('Updated property sco_size')
except Exception as ex:
logger.error('Error updating "sco_size": {0}'.format(ex))
errors = True
# 2nd Check for DTL changes
new_dtl_mode = new_config_params['dtl_mode']
old_dtl_mode = old_config_params['dtl_mode']
new_dtl_target = new_config_params.get('dtl_target')
old_dtl_target = old_config_params['dtl_target']
if old_dtl_mode != new_dtl_mode or new_dtl_target != old_dtl_target:
if old_dtl_mode != new_dtl_mode and new_dtl_mode == 'no_sync':
logger.info('Disabling DTL for vDisk {0}'.format(vdisk_guid))
vdisk.storagedriver_client.set_manual_dtl_config(volume_id, None)
elif (new_dtl_target is not None and new_dtl_target != old_dtl_target or old_dtl_mode != new_dtl_mode) and new_dtl_mode != 'no_sync':
logger.info('Changing DTL to use global values for vDisk {0}'.format(vdisk_guid))
sr_target = StorageRouterList.get_by_ip(new_dtl_target)
if sr_target is None:
logger.error('Failed to retrieve Storage Router with IP {0}'.format(new_dtl_target))
errors = True
for sd in sr_target.storagedrivers:
if sd.vpool == vdisk.vpool:
dtl_config = DTLConfig(str(new_dtl_target), sd.ports[2], StorageDriverClient.VDISK_DTL_MODE_MAP[new_dtl_mode])
vdisk.storagedriver_client.set_manual_dtl_config(volume_id, dtl_config)
break
else:
logger.error('Failed to retrieve Storage Driver with IP {0}'.format(new_dtl_target))
errors = True
# 2nd update rest
for key in required_params:
try:
if key in ['sco_size', 'dtl_mode', 'dtl_target']:
continue
new_value = new_config_params[key]
old_value = old_config_params[key]
if new_value != old_value:
logger.info('Updating property {0} on vDisk {1} from to {2}'.format(key, vdisk_guid, new_value))
if key == 'dedupe_mode':
vdisk.storagedriver_client.set_readcache_mode(volume_id, StorageDriverClient.VDISK_DEDUPE_MAP[new_value])
elif key == 'write_buffer':
tlog_multiplier = vdisk.storagedriver_client.get_tlog_multiplier(volume_id) or StorageDriverClient.TLOG_MULTIPLIER_MAP[new_sco_size]
sco_factor = float(new_value) / tlog_multiplier / new_sco_size
vdisk.storagedriver_client.set_sco_cache_max_non_disposable_factor(volume_id, sco_factor)
elif key == 'cache_strategy':
vdisk.storagedriver_client.set_readcache_behaviour(volume_id, StorageDriverClient.VDISK_CACHE_MAP[new_value])
elif key == 'readcache_limit':
vol_info = vdisk.storagedriver_client.info_volume(volume_id)
block_size = vol_info.lba_size * vol_info.cluster_multiplier or 4096
limit = new_value * 1024 * 1024 * 1024 / block_size if new_value else None
vdisk.storagedriver_client.set_readcache_limit(volume_id, limit)
else:
raise KeyError('Unsupported property provided: "{0}"'.format(key))
logger.info('Updated property {0}'.format(key))
except Exception as ex:
logger.error('Error updating "{0}": {1}'.format(key, ex))
errors = True
if errors is True:
raise Exception('Failed to update the values for vDisk {0}'.format(vdisk.name))
示例6: set_config_params
# 需要导入模块: from ovs.lib.helpers.toolbox import Toolbox [as 别名]
# 或者: from ovs.lib.helpers.toolbox.Toolbox import verify_required_params [as 别名]
def set_config_params(vdisk_guid, new_config_params, old_config_params):
"""
Sets configuration parameters for a given vdisk.
"""
required_params = {
# 'dtl_mode': (str, StorageDriverClient.VDISK_DTL_MODE_MAP.keys()),
'sco_size': (int, StorageDriverClient.TLOG_MULTIPLIER_MAP.keys()),
'dedupe_mode': (str, StorageDriverClient.VDISK_DEDUPE_MAP.keys()),
'dtl_enabled': (bool, None),
# 'dtl_location': (str, None),
'write_buffer': (int, {'min': 128, 'max': 10 * 1024}),
'cache_strategy': (str, StorageDriverClient.VDISK_CACHE_MAP.keys()),
'readcache_limit': (int, {'min': 1, 'max': 10 * 1024}, False)}
Toolbox.verify_required_params(required_params, new_config_params)
Toolbox.verify_required_params(required_params, old_config_params)
errors = False
vdisk = VDisk(vdisk_guid)
volume_id = str(vdisk.volume_id)
old_sco_size = old_config_params['sco_size']
new_sco_size = new_config_params['sco_size']
# 1st update SCO size, because this impacts TLOG multiplier which on its turn impacts write buffer
if new_sco_size != old_sco_size:
write_buffer = float(new_config_params['write_buffer'])
tlog_multiplier = StorageDriverClient.TLOG_MULTIPLIER_MAP[new_sco_size]
sco_factor = write_buffer / tlog_multiplier / new_sco_size
try:
logger.info('Updating property sco_size on vDisk {0} from {1} to {2}'.format(vdisk_guid, old_sco_size, new_sco_size))
vdisk.storagedriver_client.set_sco_multiplier(volume_id, new_sco_size / 4 * 1024)
vdisk.storagedriver_client.set_tlog_multiplier(volume_id, tlog_multiplier)
vdisk.storagedriver_client.set_sco_cache_max_non_disposable_factor(volume_id, sco_factor)
logger.info('Updated property sco_size')
except Exception as ex:
logger.error('Error updating "sco_size": {0}'.format(ex))
errors = True
# 2nd update rest
for key, old_value in old_config_params.iteritems():
if key.startswith('dtl') or key == 'sco_size':
continue
new_value = new_config_params[key]
if new_value != old_value:
try:
logger.info('Updating property {0} on vDisk {1} from {2} to {3}'.format(key, vdisk_guid, old_value, new_value))
if key == 'cache_strategy':
vdisk.storagedriver_client.set_readcache_behaviour(volume_id, StorageDriverClient.VDISK_CACHE_MAP[new_value])
elif key == 'dedupe_mode':
vdisk.storagedriver_client.set_readcache_mode(volume_id, StorageDriverClient.VDISK_DEDUPE_MAP[new_value])
elif key == 'write_buffer':
tlog_multiplier = vdisk.storagedriver_client.get_tlog_multiplier(volume_id) or StorageDriverClient.TLOG_MULTIPLIER_MAP[new_sco_size]
sco_factor = float(new_value) / tlog_multiplier / new_sco_size
vdisk.storagedriver_client.set_sco_cache_max_non_disposable_factor(volume_id, sco_factor)
elif key == 'readcache_limit':
volume_info = vdisk.storagedriver_client.info_volume(volume_id)
block_size = volume_info.lba_size * volume_info.cluster_multiplier or 4096
limit = new_value * 1024 * 1024 * 1024 / block_size if new_value else None
vdisk.storagedriver_client.set_readcache_limit(volume_id, limit)
else:
raise KeyError('Unsupported property provided: "{0}"'.format(key))
logger.info('Updated property {0}'.format(key))
except Exception as ex:
logger.error('Error updating "{0}": {1}'.format(key, ex))
errors = True
if errors is True:
raise Exception('Failed to update the values for vDisk {0}'.format(vdisk.name))
示例7: execute_update
# 需要导入模块: from ovs.lib.helpers.toolbox import Toolbox [as 别名]
# 或者: from ovs.lib.helpers.toolbox.Toolbox import verify_required_params [as 别名]
def execute_update(components):
"""
Update the specified components on all StorageRouters
This is called upon by 'at'
:return: None
"""
filemutex = file_mutex('system_update', wait=2)
ssh_clients = []
services_stop_start = set()
try:
filemutex.acquire()
UpdateController._logger.debug('+++ Starting update +++')
from ovs.dal.lists.storagerouterlist import StorageRouterList
# Create SSHClients to all nodes
UpdateController._logger.debug('Generating SSH client connections for each storage router')
storage_routers = StorageRouterList.get_storagerouters()
master_ips = []
extra_ips = []
for sr in storage_routers:
try:
ssh_clients.append(SSHClient(sr.ip, username='root'))
if sr.node_type == 'MASTER':
master_ips.append(sr.ip)
elif sr.node_type == 'EXTRA':
extra_ips.append(sr.ip)
except UnableToConnectException:
raise Exception('Update is only allowed on systems where all nodes are online and fully functional')
# Create locks
for client in ssh_clients:
UpdateController._logger.debug('{0}: Creating lock files'.format(client.ip))
client.run(['touch', UpdateController._update_file]) # Prevents manual install or update individual packages
client.run(['touch', UpdateController._update_ongoing_file])
# Check requirements
packages_to_update = {}
services_post_update = set()
update_information = UpdateController.get_update_information_all()
for component, component_info in update_information.iteritems():
if component in components:
UpdateController._logger.debug('Verifying update information for component: {0}'.format(component.upper()))
Toolbox.verify_required_params(actual_params=component_info,
required_params={'downtime': (list, None),
'packages': (dict, None),
'prerequisites': (list, None),
'services_stop_start': (set, None),
'services_post_update': (set, None)})
if len(component_info['prerequisites']) > 0:
raise Exception('Update is only allowed when all prerequisites have been met')
packages_to_update.update(component_info['packages'])
services_stop_start.update(component_info['services_stop_start'])
services_post_update.update(component_info['services_post_update'])
if len(packages_to_update) > 0:
UpdateController._logger.debug('Packages to be updated: {0}'.format(', '.join(sorted(packages_to_update.keys()))))
if len(services_stop_start) > 0:
UpdateController._logger.debug('Services to stop before package update: {0}'.format(', '.join(sorted(services_stop_start))))
if len(services_post_update) > 0:
UpdateController._logger.debug('Services which will be restarted after update: {0}'.format(', '.join(sorted(services_post_update))))
# Stop services
if UpdateController.change_services_state(services=services_stop_start,
ssh_clients=ssh_clients,
action='stop') is False:
raise Exception('Stopping all services on every node failed, cannot continue')
# Install packages
# First install packages on all StorageRouters individually
if packages_to_update:
failures = False
for client in ssh_clients:
UpdateController._logger.debug('{0}: Installing packages'.format(client.ip))
for function in Toolbox.fetch_hooks('update', 'package_install_multi'):
try:
function(client=client, package_info=packages_to_update, components=components)
except Exception as ex:
UpdateController._logger.error('{0}: Package installation hook {1} failed with error: {2}'.format(client.ip, function.__name__, ex))
failures = True
if set(components).difference({'framework', 'storagedriver'}):
# Second install packages on all ALBA nodes
for function in Toolbox.fetch_hooks('update', 'package_install_single'):
try:
function(package_info=packages_to_update, components=components)
except Exception as ex:
UpdateController._logger.exception('Package installation hook {0} failed with error: {1}'.format(function.__name__, ex))
failures = True
if failures is True:
raise Exception('Installing the packages failed on 1 or more nodes')
# Remove update file
for client in ssh_clients:
client.file_delete(UpdateController._update_file)
# Migrate code
if 'framework' in components:
failures = []
#.........这里部分代码省略.........
示例8: validate_alba_backend_sanity_without_claimed_disks
# 需要导入模块: from ovs.lib.helpers.toolbox import Toolbox [as 别名]
# 或者: from ovs.lib.helpers.toolbox.Toolbox import verify_required_params [as 别名]
def validate_alba_backend_sanity_without_claimed_disks(alba_backend):
"""
Validate whether the ALBA backend is configured correctly
:param alba_backend: ALBA backend
:return: None
"""
# Attribute validation
assert alba_backend.available is True, 'ALBA backend {0} is not available'.format(alba_backend.backend.name)
assert len(alba_backend.presets) >= 1, 'No preset found for ALBA backend {0}'.format(alba_backend.backend.name)
assert len([default for default in alba_backend.presets if default['is_default'] is True]) == 1, 'Could not find default preset for backend {0}'.format(alba_backend.backend.name)
assert alba_backend.backend.backend_type.code == 'alba', 'Backend type for ALBA backend is {0}'.format(alba_backend.backend.backend_type.code)
assert alba_backend.backend.status == 'RUNNING', 'Status for ALBA backend is {0}'.format(alba_backend.backend.status)
assert isinstance(alba_backend.metadata_information, dict) is True, 'ALBA backend {0} metadata information is not a dictionary'.format(alba_backend.backend.name)
Toolbox.verify_required_params(actual_params=alba_backend.metadata_information,
required_params={'nsm_partition_guids': (list, Toolbox.regex_guid)},
exact_match=True)
# Validate ABM and NSM services
storagerouters = GeneralStorageRouter.get_storage_routers()
storagerouters_with_db_role = [sr for sr in storagerouters if GeneralStorageRouter.has_roles(storagerouter=sr, roles='DB') is True and sr.node_type == 'MASTER']
assert len(alba_backend.abm_services) == len(storagerouters_with_db_role), 'Not enough ABM services found'
assert len(alba_backend.nsm_services) == len(storagerouters_with_db_role), 'Not enough NSM services found'
# Validate ALBA backend ETCD structure
alba_backend_key = '/ovs/alba/backends'
assert EtcdConfiguration.exists(key=alba_backend_key, raw=True) is True, 'Etcd does not contain key {0}'.format(alba_backend_key)
actual_etcd_keys = [key for key in EtcdConfiguration.list(alba_backend_key)]
expected_etcd_keys = ['verification_schedule', 'global_gui_error_interval', alba_backend.guid,
'default_nsm_hosts']
optional_etcd_keys = ['verification_factor']
expected_keys_amount = 0
for optional_key in optional_etcd_keys:
if optional_key in actual_etcd_keys:
expected_keys_amount += 1
for expected_key in expected_etcd_keys:
if not re.match(Toolbox.regex_guid, expected_key):
expected_keys_amount += 1
assert expected_key in actual_etcd_keys, 'Key {0} was not found in tree {1}'.format(expected_key, alba_backend_key)
for actual_key in list(actual_etcd_keys):
if re.match(Toolbox.regex_guid, actual_key):
actual_etcd_keys.remove(actual_key) # Remove all alba backend keys
assert len(actual_etcd_keys) == expected_keys_amount, 'Another key was added to the {0} tree'.format(alba_backend_key)
this_alba_backend_key = '{0}/{1}'.format(alba_backend_key, alba_backend.guid)
actual_keys = [key for key in EtcdConfiguration.list(this_alba_backend_key)]
expected_keys = ['maintenance']
assert actual_keys == expected_keys, 'Actual keys: {0} - Expected keys: {1}'.format(actual_keys, expected_keys)
maintenance_key = '{0}/maintenance'.format(this_alba_backend_key)
actual_keys = [key for key in EtcdConfiguration.list(maintenance_key)]
expected_keys = ['nr_of_agents', 'config']
assert set(actual_keys) == set(expected_keys), 'Actual keys: {0} - Expected keys: {1}'.format(actual_keys, expected_keys)
# @TODO: Add validation for config values
# Validate ASD node ETCD structure
alba_nodes = GeneralAlba.get_alba_nodes()
assert len(alba_nodes) > 0, 'Could not find any ALBA nodes in the model'
alba_node_key = '/ovs/alba/asdnodes'
actual_keys = [key for key in EtcdConfiguration.list(alba_node_key)]
assert len(alba_nodes) == len(actual_keys), 'Amount of ALBA nodes in model does not match amount of ALBA nodes in ETCD. In model: {0} - In Etcd: {1}'.format(len(alba_nodes), len(actual_keys))
for alba_node in alba_nodes:
assert alba_node.node_id in actual_keys, 'ALBA node with ID {0} not present in ETCD'.format(alba_node.node_id)
actual_asdnode_keys = [key for key in EtcdConfiguration.list('{0}/{1}'.format(alba_node_key, alba_node.node_id))]
expected_asdnode_keys = ['config']
assert actual_asdnode_keys == expected_asdnode_keys, 'Actual keys: {0} - Expected keys: {1}'.format(actual_asdnode_keys, expected_asdnode_keys)
actual_config_keys = [key for key in EtcdConfiguration.list('{0}/{1}/config'.format(alba_node_key, alba_node.node_id))]
expected_config_keys = ['main', 'network']
assert set(actual_config_keys) == set(expected_config_keys), 'Actual keys: {0} - Expected keys: {1}'.format(actual_config_keys, expected_config_keys)
# @TODO: Add validation for main and network values
# Validate Arakoon ETCD structure
arakoon_abm_key = '/ovs/arakoon/{0}/config'.format(alba_backend.abm_services[0].service.name)
arakoon_nsm_key = '/ovs/arakoon/{0}/config'.format(alba_backend.nsm_services[0].service.name)
assert EtcdConfiguration.exists(key=arakoon_abm_key, raw=True) is True, 'Etcd key {0} does not exists'.format(arakoon_abm_key)
assert EtcdConfiguration.exists(key=arakoon_nsm_key, raw=True) is True, 'Etcd key {0} does not exists'.format(arakoon_nsm_key)
# @TODO: Add validation for config values
# Validate maintenance agents
actual_amount_agents = len([service for node_services in [alba_node.client.list_maintenance_services() for alba_node in alba_nodes] for service in node_services])
expected_amount_agents = EtcdConfiguration.get('/ovs/alba/backends/{0}/maintenance/nr_of_agents'.format(alba_backend.guid))
assert actual_amount_agents == expected_amount_agents, 'Amount of maintenance agents is incorrect. Found {0} - Expected {1}'.format(actual_amount_agents, expected_amount_agents)
# Validate arakoon services
machine_ids = [sr.machine_id for sr in storagerouters_with_db_role]
abm_service_name = alba_backend.abm_services[0].service.name
nsm_service_name = alba_backend.nsm_services[0].service.name
for storagerouter in storagerouters_with_db_role:
root_client = SSHClient(endpoint=storagerouter,
username='root')
abm_arakoon_service_name = 'ovs-arakoon-{0}'.format(abm_service_name)
nsm_arakoon_service_name = 'ovs-arakoon-{0}'.format(nsm_service_name)
for service_name in [abm_arakoon_service_name, nsm_arakoon_service_name]:
assert GeneralService.has_service(name=service_name,
#.........这里部分代码省略.........