os-win/os_win/utilsfactory.py
Lucian Petrut 5c3f7cd15e Add mutex class
This will expose Windows mutexes. We usually rely on file locks
when synchronizing multiple processes, mostly for portability
reasons.

Some times, file locks may not be an option, in which case a
named mutex can be useful. We intend to use this in Glance when
ensuring that only one scrubber can run at a time.

Change-Id: I4a2a51e2164c6f5816f2af2641d41d1db7870600
2019-02-01 14:15:27 +02:00

209 lines
5.9 KiB
Python

# Copyright 2013 Cloudbase Solutions Srl
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from oslo_utils import importutils
from os_win._i18n import _ # noqa
from os_win import exceptions
from os_win.utils import hostutils
from os_win.utils.io import namedpipe
from os_win.utils import processutils
utils = hostutils.HostUtils()
DEFAULT_MIN_VERSION = 6.2
DEFAULT_MAX_VERSION = None
utils_map = {
'diskutils': [
{'path': 'os_win.utils.storage.diskutils.DiskUtils'}
],
'hostutils': [
{'max_version': 10,
'path': 'os_win.utils.hostutils.HostUtils'},
{'min_version': 10,
'path': 'os_win.utils.hostutils10.HostUtils10'},
],
'iscsi_initiator_utils': [
{'path': 'os_win.utils.storage.initiator.iscsi_utils.'
'ISCSIInitiatorUtils'},
],
'iscsi_target_utils': [
{'path': 'os_win.utils.storage.target.iscsi_target_utils.'
'ISCSITargetUtils'}],
'fc_utils': [
{'path': 'os_win.utils.storage.initiator.fc_utils.FCUtils'},
],
'livemigrationutils': [
{'path': 'os_win.utils.compute.livemigrationutils.LiveMigrationUtils'}
],
'metricsutils': [
{'path': 'os_win.utils.metrics.metricsutils.MetricsUtils'},
],
'migrationutils': [
{'path': 'os_win.utils.compute.migrationutils.MigrationUtils'},
],
'networkutils': [
{'max_version': 6.3,
'path': 'os_win.utils.network.networkutils.NetworkUtils'},
{'min_version': 6.3,
'path': 'os_win.utils.network.networkutils.NetworkUtilsR2'},
],
'nvgreutils': [
{'path': 'os_win.utils.network.nvgreutils.NvgreUtils'},
],
'pathutils': [
{'path': 'os_win.utils.pathutils.PathUtils'},
],
'rdpconsoleutils': [
{'path': 'os_win.utils.compute.rdpconsoleutils.RDPConsoleUtils'},
],
'smbutils': [
{'path': 'os_win.utils.storage.smbutils.SMBUtils'},
],
'vhdutils': [
{'path': 'os_win.utils.storage.virtdisk.vhdutils.VHDUtils'},
],
'vmutils': [
{'max_version': 6.3,
'path': 'os_win.utils.compute.vmutils.VMUtils'},
{'min_version': 6.3,
'max_version': 10,
'path': 'os_win.utils.compute.vmutils.VMUtils6_3'},
{'min_version': 10,
'path': 'os_win.utils.compute.vmutils10.VMUtils10'}],
'clusterutils': [
{'path': 'os_win.utils.compute.clusterutils.ClusterUtils'},
],
'dnsutils': [
{'path': 'os_win.utils.dns.dnsutils.DNSUtils'},
],
'processutils': [
{'path': 'os_win.utils.processutils.ProcessUtils'},
],
'ioutils': [
{'path': 'os_win.utils.io.ioutils.IOUtils'},
],
}
def _get_class(class_type, *args, **kwargs):
if class_type not in utils_map:
raise exceptions.HyperVException(_('Class type %s does '
'not exist') % class_type)
windows_version = utils.get_windows_version()
build = list(map(int, windows_version.split('.')))
windows_version = float("%i.%i" % (build[0], build[1]))
existing_classes = utils_map.get(class_type, [])
for class_variant in existing_classes:
min_version = class_variant.get('min_version', DEFAULT_MIN_VERSION)
max_version = class_variant.get('max_version', DEFAULT_MAX_VERSION)
class_path = class_variant['path']
if (min_version <= windows_version and
(max_version is None or windows_version < max_version)):
return importutils.import_object(class_path, *args, **kwargs)
raise exceptions.HyperVException(_('Could not find any %(class)s class for'
'this Windows version: %(win_version)s')
% {'class': class_type,
'win_version': windows_version})
def get_vmutils(host='.'):
return _get_class(class_type='vmutils', host=host)
def get_vhdutils():
return _get_class(class_type='vhdutils')
def get_metricsutils():
return _get_class(class_type='metricsutils')
def get_networkutils():
return _get_class(class_type='networkutils')
def get_nvgreutils():
return _get_class(class_type='nvgreutils')
def get_hostutils():
return _get_class(class_type='hostutils')
def get_pathutils():
return _get_class(class_type='pathutils')
def get_iscsi_initiator_utils():
return _get_class(class_type='iscsi_initiator_utils')
def get_livemigrationutils():
return _get_class(class_type='livemigrationutils')
def get_smbutils():
return _get_class(class_type='smbutils')
def get_rdpconsoleutils():
return _get_class(class_type='rdpconsoleutils')
def get_iscsi_target_utils():
return _get_class(class_type='iscsi_target_utils')
def get_named_pipe_handler(*args, **kwargs):
return namedpipe.NamedPipeHandler(*args, **kwargs)
def get_fc_utils():
return _get_class(class_type='fc_utils')
def get_diskutils():
return _get_class(class_type='diskutils')
def get_clusterutils():
return _get_class(class_type='clusterutils')
def get_dnsutils():
return _get_class(class_type='dnsutils')
def get_migrationutils():
return _get_class(class_type='migrationutils')
def get_processutils():
return _get_class(class_type='processutils')
def get_ioutils():
return _get_class(class_type='ioutils')
def get_mutex(*args, **kwargs):
return processutils.Mutex(*args, **kwargs)