openstack glance 上传镜像

openstack glance 上传镜像

glance是openstack中提供镜像服务的子项目,本文主要介绍glance上传镜像的过程。
glance服务包含glance-api和glance-registry两个服务。
glance-api负责接收和处理请求,并存储镜像。
glance-registry负责保存镜像的元信息。

glance 镜像的上传操作,涉及到client端和服务端,本文将分别对其做详细的介绍:
client端:
上传镜像的命令:

openstack image create "cirros" --file cirros-0.3.4-x86_64-disk.img --disk-format qcow2 --container-format bare --public

上面的命令中openstack是一个客户端可执行程序,image是指操作的资源,create表示对资源执行的操作,即创建一个image,–file指定本地要本上传的镜像,–disk-format指定image磁盘格式,–container-format指定image容器的格式,–public表示该镜像可以本公共访问。
openstack的源码如下:

[root@console-mitaka ~]# which openstack                                                                                                            
/usr/bin/openstack
[root@console-mitaka ~]# vim /usr/bin/openstack

import sys

from openstackclient.shell import main


if __name__ == "__main__":
    sys.exit(main())

从上面的代码可以看出,client的核心代码在模块openstackclient.shell的main方法中。

class OpenStackShell:
...
    def run(self, argv):
        ret_val = 1
        #将参数赋值给属性command_options
        self.command_options = argv
        try:
        #执行父类的run() 方法
            ret_val = super(OpenStackShell, self).run(argv)
            return ret_val
        except Exception as e:
            if not logging.getLogger('').handlers:
                logging.basicConfig()
            if self.dump_stack_trace:
                self.log.error(traceback.format_exc())
            else:
                self.log.error('Exception raised: ' + str(e))

            return ret_val

        finally:
            self.log.info("END return value: %s", ret_val)
def main(argv=sys.argv[1:]):
#sys.argv[1:]中是命令行中除可执行程序外的参数部分。
    return OpenStackShell().run(argv)

有上述代码可知,调用了OpenStackShell父类的run方法:
类OpenStackShell继承与cliff.app.App类:
下面是App中run方法的主要代码:
1.解析参入的参数,配置log
2.执行子命令。

    def run(self, argv):
        try:
        #解析传入的参数,配置log
            self.options, remainder = self.parser.parse_known_args(argv)
            self.configure_logging()
            self.interactive_mode = not remainder
            ...
            #执行子命令。
            result = self.run_subcommand(remainder)
        return result

执行子命令部分代码:

    def run_subcommand(self, argv):
...
            subcommand = self.command_manager.find_command(argv)
   ...     

        cmd_factory, cmd_name, sub_argv = subcommand
...

        cmd = cmd_factory(self, self.options, **kwargs)
...
            self.prepare_to_run_command(cmd)
            full_name = (cmd_name
                         if self.interactive_mode
                         else ' '.join([self.NAME, cmd_name])
                         )
            cmd_parser = cmd.get_parser(full_name)
            parsed_args = cmd_parser.parse_args(sub_argv)
            result = cmd.run(parsed_args)
...
            return result

你可能感兴趣的:(openstack glance 上传镜像)