openstack glance 上传镜像

来源:互联网 发布:vb的picturebox属性 编辑:程序博客网 时间:2024/04/29 18:46

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/openstackimport sysfrom openstackclient.shell import mainif __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
0 0
原创粉丝点击