how openstack console works

来源:互联网 发布:月球发现二战飞机知乎 编辑:程序博客网 时间:2024/06/17 03:53

看nova中instance的console,有noVNC, serial,spice, rdp,平时配置使用libvirt管理虚机,配置virttype为kvm或者qemu,一般用配noVNC的最常见,之前做VDI的时候

知道RH的spice,据说性能也不错,包括USB的pass thru等,没研究过。从页面点击到后台,console一共经历几个部分:

第一部分,horizon点击,返回连接,显示

在horizon中配置console type是auto时,

CONSOLES = SortedDict([('VNC', api.nova.server_vnc_console),
                       ('SPICE', api.nova.server_spice_console),
                       ('RDP', api.nova.server_rdp_console),
                       ('SERIAL', api.nova.server_serial_console)])

会依次调用api_call,根据返回结果,知道查到当前instance支持的console类型时停止,例如是否支持vnc连接,是的话

返回vnc连接的信息,否则check是否支持spice连接,依次执行

for con_type, api_call in check_consoles.iteritems():
        try:
            console = api_call(request, instance.id)

对于vnc来说,api.nova.server_vnc_console, 进入nova client调用novaclient(request).servers.get_vnc_console.


第二部分,nova client 查询

def do_get_vnc_console(cs, args):#前面已经说过do_xx的格式是如何解析的
    """Get a vnc console to a server."""
    server = _find_server(cs, args.server)

#这里cs为nova client,调用utils.find_resource(cs.servers, server, **find_args), 其中cs.servers对应

novaclient/v2/client.py中self.servers = servers.ServerManager(self)

调用servers.ServerManager(self)的get方法,return self._get("/servers/%s" % base.getid(server), "server")

方法,返回Server(novaclient/v2/servers.py中的Server)对象。

需要指出的是,返回的Servre对应调用self.manager.get_vnc_console,这里的manager就是ServerManager。

    data = server.get_vnc_console(args.console_type)

#调用ServerManager中的get_vnc_console方法:

return self._action('os-getVNCConsole', server,{'type': console_type})[1]

继续trace的话发现会调用servers/xxxx/os-getVNCConsole,通过HttpClient发送post请求到nova-api。


第三部分,nova计算

nova-api接收到请求:

    @wsgi.action('os-getVNCConsole')
    def get_vnc_console(self, req, id, body):

主要的任务为:

self.compute_api.get_vnc_console(context,  instance, console_type)

OK, 这里就是熟悉的nova 操作,前面记录过很多遍了,nova-api到:

        connect_info = self.compute_rpcapi.get_vnc_console(context,
                instance=instance, console_type=console_type)
#compute rpc发送消息,compute manager接收到进行处理,调用virt driver得到vncserver_proxyclient_address和port,

在创建instance时,生成xml的过程中(libvirt根据conf xml创建虚机),trace _get_guest_config方法:

if ((CONF.vnc_enabled and
             virt_type not in ('lxc', 'uml'))):

            graphics = vconfig.LibvirtConfigGuestGraphics()
            graphics.type = "vnc"
            graphics.keymap = CONF.vnc_keymap
            graphics.listen = CONF.vncserver_listen
            guest.add_device(graphics)
            add_video_driver = True

这也是配置文件中vnc_enabled的来源,当然,还有对spice,serial的相应配置,至于为什么要这样,是通过kvm-qemu生成

vnc或者spice的server,在mark link中可以看到。
        self.consoleauth_rpcapi.authorize_console

对console进行auth时也是一样通过rpc.call,经过nova/consoleauth下的rpc,发送请求给其中的manager接收处理,可以深入trace一把。


mark link

http://www.cnblogs.com/cpy-devops/p/4463104.html

http://www.admin-magazine.com/Archive/2013/13/Controlling-virtual-machines-with-VNC-and-Spice


0 0