OpenStack基础之stevedore

    利用python语言的特性,运行时动态载入代码变得更加容易.很多python应用程序利用这样的特性在运行时发现和载入所谓的"插件",使得自己更易于扩展.python库stevedore就是在Setuptools的entry points基础上,构造了一层抽象层,使开发者可以更容易地在运行时发现和载入插件.

    stevedore的代码库在https://github.com/openstack/stevedore,项目主页在https://launchpad.net/python-stevedore,参考文档在http://stevedore.readthedocs.org/.

    entry points的每一个命名空间里,可以包含多个entry point项.stevedore要求每一项都符合如下格式:

name = module:importable

    左边是插件的名称,右边是它的具体实现,中间用等号分隔开.插件的具体实现用"模块:可导入的对象"的形式来指定,以Ceilometer为例:

ceilometer.compute.virt = 
    libvirt = ceilometer.compute.virt.libvirt.inspector:LibvirtInspector
    hyperv = ceilometer.compute.virt.hyperv.inspector:HyperVInspector
    vsphere = ceilometer.compute.virt.vmware.inspector:VsphereInspector

ceilometer.hardware.inspectors =
    snmp = ceilometer.hardware.inspectors.snmp:SNMPInspector

    示例中显示了两个不同的entry points的命名空间,“ceilometer.compute.virt"和"ceilometer.hardware.inspectors",分别注册有3个和1个插件.每个插件都符合"名字=模块:可导入对象”的格式,在“ceilometer.compute.virt"命名空间里的libvirt插件,它的具体可载入的实现是ceilometer.compute.virt.libvirt.inspector模块中的LibvirtInspector类.

    根据每个插件在entry point中名字和具体实现的数量之间的对应关系不同,stevedore提供了多种不同的类来帮助开发者发现和载入插件,如下图所示:

插件名字: 具体实现建议选用stevedore中的类
1: 1stevedore.driver.DriverManager
1: nstevedore.hook.HookManager
n: mstevedore.extension.ExtensionManager

    使用stevedore来帮助程序动态载入插件的过程主要分为三个部分:插件的实现,插件的注册,以及插件的载入.下面我们以Ceilometer里动态载入compute agent上的inspector驱动为例来分别进行介绍.

  • 插件的实现

Ceilometer的inspector驱动,为从不同类型hypervisor中获取相关数据提供统一的接口以供compute agent调用.下面是它的基类:

#ceilometer/compute/virt/inspector.py
class Inspector(object):
    
    def inspect_instances(self):
        """List the instances on the current host."""
        raise NotImplementedError()
    
    def inspect_cpus(self, instance_name):
        """Inspect the CPU statistics for an instance.
        
        :param instance_name: the name of the target instance
        :return: the number of CPUs and cumulative CPU time
        """
        raise NotImplementedError()
    
    ...

    ceilometer/compute/virt/libvirt/inspector.py,ceilometer/compute/virt/hyperv/inspector.py和ceilometer/compute/virt/vmware/inspector.py分别为kvm,hyperv和vsphere三种不同hypervisor的具体实现,比如:

class LibvirtInspector(virt_inspector.Inspector):

    def __init__(self, conf):
        super(LibvirtInspector, self).__init__(conf)
        self._connection = None

    @property
    def connection(self):
        if not self._connection:
            self._connection = libvirt_utils.get_libvirt_connection(self.conf)
        return self._connection

    @libvirt_utils.retry_on_disconnect
    def _lookup_by_uuid(self, instance):
        instance_name = util.instance_name(instance)
        try:
            return self.connection.lookupByUUIDString(instance.id)
        except Exception as ex:
            if not libvirt or not isinstance(ex, libvirt.libvirtError):
                raise virt_inspector.InspectorException(six.text_type(ex))
            error_code = ex.get_error_code()
            if (error_code in (libvirt.VIR_ERR_SYSTEM_ERROR,
                               libvirt.VIR_ERR_INTERNAL_ERROR) and
                ex.get_error_domain() in (libvirt.VIR_FROM_REMOTE,
                                          libvirt.VIR_FROM_RPC)):
                raise
            msg = _("Error from libvirt while looking up instance "
                    "<name=%(name)s, id=%(id)s>: "
                    "[Error Code %(error_code)s] "
                    "%(ex)s") % {'name': instance_name,
                                 'id': instance.id,
                                 'error_code': error_code,
                                 'ex': ex}
            raise virt_inspector.InstanceNotFoundException(msg)

    def inspect_cpus(self, instance):
        domain = self._get_domain_not_shut_off_or_raise(instance)
        # TODO(gordc): this can probably be cached since it can be used to get
        # all data related
        stats = self.connection.domainListGetStats([domain])
        dom_stat = stats[0][1]
        return virt_inspector.CPUStats(number=dom_stat['vcpu.current'],
                                       time=dom_stat['cpu.time'])

  • 插件的注册

#setup.cfg
ceilometer.compute.virt =
    libvirt = ceilometer.compute.virt.libvirt.inspector:LibvirtInspector
    hyperv = ceilometer.compute.virt.hyperv.inspector:HyperVInspector
    vsphere = ceilometer.compute.virt.vmware.inspector:VsphereInspector
    xenapi = ceilometer.compute.virt.xenapi.inspector:XenapiInspector
    这三个插件注册在命名空间"ceilometer.compute.virt"下,分别叫做libvirt,hyper和vsphere.


  • 插件的载入
#ceilometer/compute/virt/libvirt/inspector.py
def get_hypervisor_inspector(conf):
    try:
        namespace = 'ceilometer.compute.virt'
        mgr = driver.DriverManager(namespace,
                                   conf.hypervisor_inspector,
                                   invoke_on_load=True,
                                   invoke_args=(conf, ))
        return mgr.driver
    except ImportError as e:
        LOG.error(_LE("Unable to load the hypervisor inspector: %s") % e)
        return Inspector(conf)

    Ceilometer的compute agent通过调用函数get_hypervisor_inspector来载入具体的某一个插件.此处由于插件和具体实现之间是一对一的关系,所以选用了stevedore和DriverManager类,这个类实例化时可接受的参数如下表所示:

参数 = 默认值说  明
namespace(字符串类型)命名空间
name(字符串类型)插件名
invoke_on_load = False(布尔类型)是否调用entry point所返回的插件对象.(在这个例子中,由于entry point所指向的对象是类,相当于是否实例化类对象)
invoke_args = {}(元组类型)调用插件对象时所需要的位置参数
invoke_kwds = {}(字典类型)调用插件对象时所需要的命名参数
on_load_failure_callback = None(函数类型)载入某个entry point失败时的回调函数,参数为(manager,entry point,exception)
verify_requirements = False(布尔类型)是否用setup tools来确保此插件的依赖关系都能满足

    注意这里我们使用的命名空间"ceilometer.compute.virt"需要和Setuptools中注册的命名空间一致.具体需要载入的插件名称从配置项hypervisor_inspector中读入.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenStack是一个开源的云计算平台,提供了一套完整的云计算解决方案,包括计算、存储、网络等方面的服务。基础运维是OpenStack的重要组成部分,包括安装、配置、监控、维护等方面的工作。以下是云计算OpenStack基础运维的一些常见任务和技巧: 1. 安装和配置OpenStack 安装和配置OpenStack需要了解操作系统、网络和存储等方面的知识。可以使用OpenStack官方提供的安装脚本和文档,也可以使用第三方工具如Mirantis Fuel、Red Hat OpenStack Platform等来快速安装和配置OpenStack。 2. 管理OpenStack的虚拟机 管理OpenStack的虚拟机需要了解虚拟化技术和操作系统的基础知识。可以使用OpenStack Dashboard或者命令行工具来创建、删除、启动、停止和挂载虚拟机。 3. 管理OpenStack的网络 管理OpenStack的网络需要了解网络拓扑、子网、路由、安全组等方面的知识。可以使用OpenStack Dashboard或者命令行工具来创建、删除、配置和监控网络。 4. 管理OpenStack的存储 管理OpenStack的存储需要了解存储技术和存储协议等方面的知识。可以使用OpenStack Dashboard或者命令行工具来创建、删除、配置和监控存储。 5. 监控和维护OpenStack 监控和维护OpenStack需要了解系统监控、日志分析、错误排除等方面的知识。可以使用OpenStack提供的监控工具如Ceilometer、Aodh等来监控OpenStack系统的运行情况,也可以使用第三方工具如Nagios等来监控OpenStack系统。 总之,云计算OpenStack基础运维需要掌握多方面的知识和技能,需要不断学习和实践,才能提高自己的运维能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

self-motivation

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值