cinder/cinder/interface/util.py

82 lines
2.5 KiB
Python

# Copyright 2016 Dell Inc.
# 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.
#
import fnmatch
import inspect
import os
from cinder import interface
def _ensure_loaded(start_path):
"""Loads everything in a given path.
This will make sure all classes have been loaded and therefore all
decorators have registered class.
:param start_path: The starting path to load.
"""
for root, folder, files in os.walk(start_path):
for phile in fnmatch.filter(files, '*.py'):
path = os.path.join(root, phile)
try:
__import__(
path.replace('/', '.')[:-3], globals(), locals())
except Exception:
# Really don't care here
pass
def get_volume_drivers():
"""Get a list of all volume drivers."""
_ensure_loaded('cinder/volume/drivers')
return [DriverInfo(x) for x in interface._volume_register]
def get_backup_drivers():
"""Get a list of all backup drivers."""
_ensure_loaded('cinder/backup/drivers')
return [DriverInfo(x) for x in interface._backup_register]
def get_fczm_drivers():
"""Get a list of all fczm drivers."""
_ensure_loaded('cinder/zonemanager/drivers')
return [DriverInfo(x) for x in interface._fczm_register]
class DriverInfo(object):
"""Information about driver implementations."""
def __init__(self, cls):
self.cls = cls
self.desc = cls.__doc__
self.class_name = cls.__name__
self.class_fqn = '{}.{}'.format(inspect.getmodule(cls).__name__,
self.class_name)
self.version = getattr(cls, 'VERSION', None)
self.ci_wiki_name = getattr(cls, 'CI_WIKI_NAME', None)
self.supported = getattr(cls, 'SUPPORTED', True)
self.driver_options = cls.get_driver_options()
def __str__(self):
return self.class_name
def __repr__(self):
return self.class_fqn
def __hash__(self):
return hash(self.class_fqn)