赞
踩
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。