在接触ceph的过程中,用到了ceph-volume这个部署OSD的社区工具,就想着利用闲暇时间看下源码实现,一方面自己很久没有写过东西了,利用看源码的过程熟悉下python语言,同时学习下社区大佬的编程思路和风格。
废话不多说,先上官方介绍文档地址:[官方链接地址](https://docs.ceph.com/en/latest/man/8/ceph-volume/)
通过官方介绍文档我们可以看到ceph-volume是社区用来替代ceph-disk的OSD部署和检查工具,用于将逻辑卷部署为 OSD,尝试维护与ceph-disk类似的 API,包括准备、激活和创建 OSD 等。
本文的思路是通过分析ceph-volume的中部分业务流程(如ceph-volume lvm list /dev/sdc、ceph-volume lvm zap /dev/sdc等)的代码实现,在了解其思路和实现方式的基础上提升自己阅读开源代码的能力。
首先,我们先看下ceph-volume的源码组织结构,如下图所示:
│ ├── api
│ ├── __init__.py
│ ├── lvm.py
├── configuration.py
├── decorators.py
├── devices
│ ├── __init__.py
│ ├── lvm
│ │ ├── activate.py
│ │ ├── batch.py
│ │ ├── common.py
│ │ ├── create.py
│ │ ├── deactivate.py
│ │ ├── __init__.py
│ │ ├── listing.py
│ │ ├── main.py
│ │ ├── prepare.py
│ │ ├── trigger.py
│ │ └── zap.py
│ ├── raw
│ │ ├── activate.py
│ │ ├── common.py
│ │ ├── __init__.py
│ │ ├── list.py
│ │ ├── main.py
│ │ ├── prepare.py
│ └── simple
│ ├── activate.py
│ ├── __init__.py
│ ├── main.py
│ ├── scan.py
│ └── trigger.py
├── exceptions.py
├── __init__.py
├── inventory
│ ├── __init__.py
│ ├── main.py
├── log.py
├── main.py
├── process.py
├── systemd
│ ├── __init__.py
│ ├── main.py
│ └── systemctl.py
├── terminal.py
├── tests
│ ├── conftest.py
│ ├── devices
│ │ ├── __init__.py
│ │ ├── lvm
│ │ │ ├── __init__.py
│ │ │ ├── test_activate.py
│ │ │ ├── test_batch.py
│ │ │ ├── test_common.py
│ │ │ ├── test_create.py
│ │ │ ├── test_deactivate.py
│ │ │ ├── test_listing.py
│ │ │ ├── test_prepare.py
│ │ │ ├── test_trigger.py
│ │ │ └── test_zap.py
│ │ ├── raw
│ │ │ ├── __init__.py
│ │ │ └── test_prepare.py
│ │ └── test_zap.py
│ ├── __init__.py
│ ├── test_configuration.py
│ ├── test_decorators.py
│ ├── test_inventory.py
│ ├── test_main.py
│ ├── test_process.py
│ └── test_terminal.py
└── util
├── arg_validators.py
├── constants.py
├── device.py
├── disk.py
├── encryption.py
├── __init__.py
├── prepare.py
├── system.py
└── templates.py
configuration.py:加载及读取ceph配置文件的相关函数 decorators.py:实现了2个装饰器,主要是用于异常处理和权限判断的使用场景 devices目录:定义了处理各种类型OSD设备的实现,如lvm目录下定义了通过lvm子命令存储、重发现、查询与 OSD 关联设备的各种操作实现,以便它们可以激活使用 api模块下的lvm.py文件主要定义了lvm tag处理的相关操作 exceptions.py:自定义的异常类 inventory目录:定义了ceph-volume inventory子模块的实现,提供有关主机物理磁盘清单的信息并报告有关这些磁盘的元数据。在这些元数据中,可以找到特定磁盘的数据项(例如型号、大小、旋转或固态)以及特定于使用设备的 ceph 数据项,例如是否可用于 ceph 或是否存在逻辑卷。 log.py:ceph-volume日志处理相关实现 main.py:主程序,接收终端参数并调用相应子命令进行处理 process.py:进程相关处理实现,主要是对subprocess一些接口和返回值进行了封装 systemd目录:主要是关于将ceph-volume作为systemd服务实现的相关代码 terminal.py:主要是终端输出的一些处理,如格式化,上色等 util目录:一些公用函数 tests目录:相关模块测试函数
|