阅读trove代码
2021-8-9
下载完trove代码(内部叫ktrove),好开始读代码啦,希望可以加深理解trove业务,以及可以学习python这双重功效!加油!
代码结构这样子:

4个文件夹,以及一堆特殊文件,先上层特殊文件是干啥的
一堆特殊文件
setup.py
最重要的2个setup.cfg,setup.py打包用的
setup.py怎么写,好了,参考如下
https://zhuanlan.zhihu.com/p/261579357
https://zhuanlan.zhihu.com/p/276461821?utm_oi=948852089393336320
例如下面的代码
是用pbr打包神奇,把setup.cfg中的参数过滤出来,作为参数传入到setup.py的setup()函数中
import setuptools
import sys
# In python < 2.7.4, a lazy loading of package `pbr` will break
# setuptools if some other modules registered functions in `atexit`.
# solution from: http://bugs.python.org/issue15881#msg170215
try:
import multiprocessing # noqa
except ImportError:
pass
data_files = []
if sys.platform == 'linux2':
from glob import glob
data_files = [("/etc/init.d", glob("etc/trove/init.d/*")),
("/etc/logrotate.d", glob("etc/trove/logrotate.d/*"))]
setuptools.setup(
setup_requires=['pbr>=2.0.0'],
pbr=True,
data_files=data_files,
)
setup.cfg
好了,那么看看setup.cfg是怎么写的 ,主要是name和entry_points参数
[metadata]
name = trove 包名称
summary = OpenStack DBaaS
description-file =
README.rst
author = OpenStack 程序作者
author-email = openstack-dev@lists.openstack.org 程序作者邮箱
home-page = https://wiki.openstack.org/wiki/Trove
classifier =
Environment :: OpenStack
Intended Audience :: Information Technology
Intended Audience :: System Administrators
License :: OSI Approved :: Apache Software License
Operating System :: POSIX :: Linux
Programming Language :: Python
Programming Language :: Python :: 2
Programming Language :: Python :: 2.7
Programming Language :: Python :: 3
Programming Language :: Python :: 3.5
[files]
packages =
trove
[entry_points] 关键参数,动态发现配置和插件
console_scripts =
ktrove-api = trove.cmd.api:main
ktrove-taskmanager = trove.cmd.taskmanager:main
monitor-taskmanager = trove.cmd.taskmanager:main
trove-mgmt-taskmanager = trove.cmd.taskmanager:mgmt_main
trove-conductor = trove.cmd.conductor:main
ktrove-manage = trove.cmd.manage:main
trove-guestagent = trove.cmd.guest:main
trove-fake-mode = trove.cmd.fakemode:main
monitor-api = trove.cmd.monapi:main
ktrove-minister = trove.cmd.minister:main
trove.api.extensions =
account = trove.extensions.routes.account:Account
mgmt = trove.extensions.routes.mgmt:Mgmt
mysql = trove.extensions.routes.mysql:Mysql
security_group = trove.extensions.routes.security_group:Security_group
trove.guestagent.module.drivers =
ping = trove.guestagent.module.drivers.ping_driver:PingDriver
new_relic_license = trove.guestagent.module.drivers.new_relic_license_driver:NewRelicLicenseDriver
# These are for backwards compatibility with Havana notification_driver configuration values
oslo.messaging.notify.drivers =
trove.openstack.common.notifier.log_notifier = oslo_messaging.notify._impl_log:LogDriver
trove.openstack.common.notifier.no_op_notifier = oslo_messaging.notify._impl_noop:NoOpDriver
trove.openstack.common.notifier.rpc_notifier2 = oslo_messaging.notify.messaging:MessagingV2Driver
trove.openstack.common.notifier.rpc_notifier = oslo_messaging.notify.messaging:MessagingDriver
trove.openstack.common.notifier.test_notifier = oslo_messaging.notify._impl_test:TestDriver
tempest.test_plugins =
trove_tests = trove.tests.tempest.plugin:TroveTempestPlugin
[global]
setup-hooks =
pbr.hooks.setup_hook
[build_sphinx]
all_files = 1
build-dir = doc/build
source-dir = doc/source
warning-is-error = 1
[compile_catalog]
directory = trove/locale
domain = trove
[update_catalog]
domain = trove
output_dir = trove/locale
input_file = trove/locale/trove.pot
[extract_messages]
keywords = _ gettext ngettext l_ lazy_gettext
mapping_file = babel.cfg
output_file = trove/locale/trove.pot
[wheel]
universal = 1
trove命令行与代码
[entry_points] 关键参数,动态发现配置和插件
console_scripts =
ktrove-api = trove.cmd.api:main
ktrove-taskmanager = trove.cmd.taskmanager:main
monitor-taskmanager = trove.cmd.taskmanager:main
trove-mgmt-taskmanager = trove.cmd.taskmanager:mgmt_main
trove-conductor = trove.cmd.conductor:main
ktrove-manage = trove.cmd.manage:main
trove-guestagent = trove.cmd.guest:main
trove-fake-mode = trove.cmd.fakemode:main
monitor-api = trove.cmd.monapi:main
ktrove-minister = trove.cmd.minister:main
看到这里恍然大悟,打包后的模块名是ktrove-manage,在执行 ktrove-manage param_xxx时候,其实等于调用了 trove.cmd.manage:main param_xxx
那么我们来具体看看,平时使用的命令,是怎么执行的吧:
例如1, ktrove-manage flow-list $instance_id
例如2, trove命令创建实例:
trove create liurong_0421_pm15 HA --flavor RDSOpenAPI_76f7d523d28b9f66 --datastore_type ebs_sqlserver --datastore_version 2014 --admin_user admin --admin_password LIUrong123@
4个文件夹
etc-
init-
tools-
trove-