nova、cinder是如何使用os-brick的
nova 侧挂盘流程
nova/compute/manager.py
1 |
|
nova/compute/manager.py
1 |
|
DriverVolumeBlockDevice.attach -> DriverVolumeBlockDevice._do_attach
1 |
|
DriverVolumeBlockDevice._legacy_volume_attach
1 |
|
nova.virt.libvirt.driver.LibvrirtDriver.attach_volume
1 |
|
nova.virt.libvirt.driver.LibvrirtDriver._connect_volume
1 |
|
看下 nova/virt/libvirt/volume/iscsi.py 中 LibvirtISCSIVolumeDriver 关键方法
1 |
|
os_brick/initiator/connector.py 中 InitiatorConnector.factory 方法
1 |
|
工厂方法根据不同的协议,返回不同的 connector,比如 ISCSI 协议返回的是 os_brick/initiator/connectors/iscsi.py 中的 ISCSIConnector 类。然后 LibvirtISCSIVolumeDriver 类的 connect_volume 方法调用的是 ISCSIConnector 类的 connect_volume 方法。
1 |
|
所以,当开启 use_multipath 时,会调用 _connect_multipath_volume 方法,否则调用 _connect_single_volume 方法。
先看简单的 _connect_single_volume 方法
1 |
|
LibvirtISCSIVolumeDriver 会调用父类 BaseISCSIConnector 的工具方法 _iterate_all_targets 来获取所有的 target_portal、target_iqn、target_lun。我们有必要看一下这里的代码:
1 |
|
通过上述函数获得 props 后,调用 ISCSIConnector._connect_vol 方法:
1 |
|