glusterfs.py文件

cinder/volume/drivers/glusterfs.py就是cinder调用glusterfs的驱动了

glusterfs.py只有一个GlusterfsDriver class,如下图所示

cinder glusterfs driver代码结构_第1张图片


from os_brick.remotefs import remotefs as remotefs_brick # client端操作
from oslo_concurrency import processutils
from oslo_config import cfg
from oslo_log import log as logging
from oslo_utils import fileutils
from oslo_utils import units

from cinder import exception
from cinder.i18n import _, _LE, _LI, _LW
from cinder.p_w_picpath import p_w_picpath_utils
from cinder import utils
from cinder.volume import driver   # 很多定义的方法还没具体实现
from cinder.volume.drivers import remotefs as remotefs_drv  # 基类

class GlusterfsDriver(remotefs_drv.RemoteFSSnapDriver, driver.CloneableVD,
                      driver.ExtendVD):
    """Gluster based cinder driver.
    Creates file on Gluster share for using it as block device on hypervisor.
    Operations such as create/delete/extend volume/snapshot use locking on a
    per-process basis to prevent multiple threads from modifying qcow2 chains
    or the snapshot .info file simultaneously.
    """

class GlusterfsDriver的父类remotefs_drv.RemoteFSSnapDriver(主要看这个)


cinder/volume/drivers/remotefs.py有两个class,类RemoteFSSnapDriver从类RemoteFSDriver继承

wKiom1YRSxLAGSJYAAAqbeKufEQ015.jpg

class RemoteFSSnapDriver(RemoteFSDriver, driver.SnapshotVD):
    """Base class for remotefs drivers implementing qcow2 snapshots.
       Driver must implement:
         _local_volume_dir(self, volume)
    """


cinder glusterfs driver代码结构_第2张图片

类RemoteFSSnapDriver主要是针对volume snapshot的一系列操作。

类RemoteFSDriver可以认为是一个base class,里面定义了很多基本方法

上面提到的class都是关于server端的封装。


client端的封装已经独立为一个项目:os-brick

os_brick/remotefs/remotefs.py,只有一个class RemoteFsClient,右边是类中定义的方法。

cinder glusterfs driver代码结构_第3张图片


cinder后端是glusterfs作为openstack的附加盘来使用,glusterfs本身没有快照机制,云硬盘快照是通过qemu来实现的,代码位置:


cinder做快照的时候,分为两种:

1、volume available的时候,cinder使用qemu-img直接做快照

2、volume in-use的时候,cinder会call nova来完成


cinder/volume/drivers/remotefs.py

cinder glusterfs driver代码结构_第4张图片


cinder glusterfs driver代码结构_第5张图片

qemu-img rebase的作用见这里:http://linux.die.net/man/1/qemu-img

-u是非安全模式,适用于backing-file重命名和移动

简而言之,就是对比backing_filename和旧的backing_filename的差异部分写入new_snap_path


cinder glusterfs driver代码结构_第6张图片


关于Cinder QuiescedSnapshot介绍:

https://specs.openstack.org/openstack/nova-specs/specs/kilo/implemented/quiesced-p_w_picpath-snapshots-with-qemu-guest-agent.html

https://wiki.openstack.org/wiki/Cinder/QuiescedSnapshotWithQemuGuestAgent

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Virtualization_Deployment_and_Administration_Guide/sect-QEMU_Guest_Agent-Using_the_QEMU_guest_virtual_machine_agent_protocol_CLI.html



cinder删除快照的时候,分为两种:

1、volume available的时候,cinder使用qemu-img直接删除快照

2、volume in-use的时候,cinder会先计算快照链如何整合( 需要Libvirt版本'1.2.7'以上),最终call nova来完成

cinder glusterfs driver代码结构_第7张图片


cinder glusterfs driver代码结构_第8张图片


大致流程:

cinder/volume/drivers/remotefs.py ->> cinder/volume/drivers/glusterfs.py ->> cinder/compute/nova.py ->> novaclient/v1_1/contrib/assisted_volume_snapshots.py ->> novaclient/base.py ->> nova/virt/libvirt/driver.py


nova/virt/libvirt/driver.py:

cinder glusterfs driver代码结构_第9张图片


cinder glusterfs driver代码结构_第10张图片

这里可以看到Cinder QuiescedSnapshot,第一次会先尝试做Quiesce快照,如果抛异常了,就执行下面不带Quiesce的快照。


cinder run unit test http://docs.openstack.org/developer/cinder/devref/unit_tests.html