ceph-deploy的入口函数

25 篇文章 0 订阅
ceph-deploy是ceph部署集群的工具。其源码在https://github.com/ceph/ceph-deploy
script 目录下的ceph-deploy是ceph-deploy的入口函数
#!/usr/bin/env python
import os
import platform
import sys
"""
ceph-deploy - admin tool for ceph
"""

if os.path.exists('/usr/share/pyshared/ceph_deploy'):
    sys.path.insert(0,'/usr/share/pyshared/ceph_deploy')
elif os.path.exists('/usr/share/ceph-deploy'):
    sys.path.insert(0,'/usr/share/ceph-deploy')
elif os.path.exists('/usr/share/pyshared/ceph-deploy'):
    sys.path.insert(0,'/usr/share/pyshared/ceph-deploy')
elif os.path.exists('/usr/lib/python2.6/site-packages/ceph_deploy'):
    sys.path.insert(0,'/usr/lib/python2.6/site-packages/ceph_deploy')

from ceph_deploy.cli import main

if __name__ == '__main__':
    sys.exit(main())
可见这里会调用ceph-deploy-master\ceph_deploy\cli.py下的main函数
def main(args=None, namespace=None):
    try:
        _main(args=args, namespace=namespace)
    finally:
        # This block is crucial to avoid having issues with
        # Python spitting non-sense thread exceptions. We have already
        # handled what we could, so close stderr and stdout.
        if not os.environ.get('CEPH_DEPLOY_TEST'):
            try:
                sys.stdout.close()
            except:
                pass
            try:
                sys.stderr.close()
            except:
                pass
继续调用_main 函数
@catches((KeyboardInterrupt, RuntimeError, exc.DeployError,), handle_all=True)
def _main(args=None, namespace=None):
    # Set console logging first with some defaults, to prevent having exceptions
    # before hitting logging configuration. The defaults can/will get overridden
    # later.

    # Console Logger
//得到向命令行输出log的handle,然后用颜色表示不同的log level,设置默认的log级别为warning
    sh = logging.StreamHandler()
    sh.setFormatter(log.color_format())
    sh.setLevel(logging.WARNING)

    # because we're in a module already, __name__ is not the ancestor of
    # the rest of the package; use the root as the logger for everyone
//得到root_logger,然后会将前面设置的命令行hander sh添加到root_logger中,这样控制台就可以输出log了
    root_logger = logging.getLogger()

    # allow all levels at root_logger, handlers control individual levels
    root_logger.setLevel(logging.DEBUG)
    root_logger.addHandler(sh)
//得到解析cli的parser,成功得到后调用parser.parse_args解析cli
    parser = get_parser()
    if len(sys.argv) < 2:
        parser.print_help()
        sys.exit()
    else:
//args 代表解析cli后得到的结果
        args = parser.parse_args(args=args, namespace=namespace)
//根据cli中是否加quiet 来决定是否修改控制台的log level
    console_loglevel = logging.DEBUG  # start at DEBUG for now
    if args.quiet:
        console_loglevel = logging.WARNING
    if args.verbose:
        console_loglevel = logging.DEBUG

    # Console Logger
    sh.setLevel(console_loglevel)

//除了将log写到控制台,还会将log写到文件中,方法和控制台类似,最终通过root_logger.addHandler都要加到root_logger中
    # File Logger
    fh = logging.FileHandler('ceph-deploy-{cluster}.log'.format(cluster=args.cluster))
    fh.setLevel(logging.DEBUG)
    fh.setFormatter(logging.Formatter(log.FILE_FORMAT))

    root_logger.addHandler(fh)

    # Reads from the config file and sets values for the global
    # flags and the given sub-command
    # the one flag that will never work regardless of the config settings is
    # logging because we cannot set it before hand since the logging config is
    # not ready yet. This is the earliest we can do.
//加载ceph_deploy得到ceph的配置
    args = ceph_deploy.conf.cephdeploy.set_overrides(args)

    LOG.info("Invoked (%s): %s" % (
        ceph_deploy.__version__,
        ' '.join(sys.argv))
    )
    log_flags(args)

    return args.func(args)
	
	
	
	
	def get_parser():
//调用argparse 模块添加ceph-depoly提供的命令。这里的argparse是python的标准库。从这里看到看到支持的cli如下所示
    parser = argparse.ArgumentParser(
        prog='ceph-deploy',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        description='Easy Ceph deployment\n\n%s' % __header__,
        )
    verbosity = parser.add_mutually_exclusive_group(required=False)
    verbosity.add_argument(
        '-v', '--verbose',
        action='store_true', dest='verbose', default=False,
        help='be more verbose',
        )
    verbosity.add_argument(
        '-q', '--quiet',
        action='store_true', dest='quiet',
        help='be less verbose',
        )
    parser.add_argument(
        '--version',
        action='version',
        version='%s' % ceph_deploy.__version__,
        help='the current installed version of ceph-deploy',
        )
    parser.add_argument(
        '--username',
        help='the username to connect to the remote host',
        )
    parser.add_argument(
        '--overwrite-conf',
        action='store_true',
        help='overwrite an existing conf file on remote host (if present)',
        )
    parser.add_argument(
        '--ceph-conf',
        dest='ceph_conf',
        help='use (or reuse) a given ceph.conf file',
    )
    sub = parser.add_subparsers(
        title='commands',
        metavar='COMMAND',
        help='description',
        )
    sub.required = True
//得到cli的入口
    entry_points = [
        (ep.name, ep.load())
        for ep in pkg_resources.iter_entry_points('ceph_deploy.cli')
        ]
//根据priority 排序
    entry_points.sort(
        key=lambda name_fn: getattr(name_fn[1], 'priority', 100),
        )
		
    for (name, fn) in entry_points:
        p = sub.add_parser(
            name,
            description=fn.__doc__,
            help=fn.__doc__,
            )
        if not os.environ.get('CEPH_DEPLOY_TEST'):
            p.set_defaults(cd_conf=ceph_deploy.conf.cephdeploy.load())

        # flag if the default release is being used
        p.set_defaults(default_release=False)
        fn(p)
        p.required = True
    parser.set_defaults(
        cluster='ceph',
        )

    return parser

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值