[one-users] another vnc port discussion

Claude Noshpitz cnoshpitz at attinteractive.com
Wed Feb 24 18:17:53 PST 2010


Hmm.  I should probably s/libvirt/kvm/ for most of this posting.  Sorry if
this causes any confusion, all corrections gracefully accepted :-)

--Claude


On 2/24/10 6:09 PM, "Claude Noshpitz" <cnoshpitz at attinteractive.com> wrote:

> Hi,
> 
> I've been thinking about how to manage vnc ports using libvirt.  Turns out
> (perhaps I'm the last to discover this) that libvirt will accept -1 as a port
> value and then assign a free port automatically.  So that helps a bit with the
> problem of the port namespace itself (presumably one can run fewer VMs on a
> given host than there are ports available).
> 
> But what about getting the assigned port back out to the UI?  Rogier has
> provided a handy solution for OneMC (the reading of which nudged me to compose
> this  message :-).
> 
> I'm using the OCCI interface quite a bit, partly because it has at least an
> aroma of standardization, partly because it's easy to hack the templates and
> get interesting results.  It wasn't obvious how folks in the community were
> addressing this problem, so here are some ideas...
> 
> In OCCIServer::post_compute, we say
> 
>     vm_info['VNC_PORT'] = -1
> 
> and then add a stanza like this to e.g. etc/occi_templates/small.erb:
> 
> GRAPHICS = [
>     keymap = "en-us",
>     type = "vnc",
>     listen = "0.0.0.0",
>     port = "<%= vm_info['VNC_PORT'] %>"
> ]
> 
> so the template does the right thing by asking for port -1.  Note that it
> would be easy to override this value by providing an explicit one, perhaps
> relevant to another VM provider.
> 
> To get the port that's eventually assigned by kvm, the VM driver has to poke
> at libvirt.  Turns out that virsh seems to report it only in an xmldump, so
> here's one way (not claiming nokogiri is the most efficient approach, but it's
> concise):
> 
> --- a/src/vmm_mad/kvm/one_vmm_kvm.rb
> +++ b/src/vmm_mad/kvm/one_vmm_kvm.rb
> @@ -38,6 +38,7 @@ end
>  $: << RUBY_LIB_LOCATION
> 
>  require 'pp'
> +require 'rubygems'; require 'nokogiri'
>  require "VirtualMachineDriver"
> 
>  # ---------------------------------------------------------------------- #
> @@ -182,6 +183,15 @@ class LibVirtDriver < VirtualMachineDriver
>              end
>          }
> 
> +        # get assigned vnc console port
> +        xml_cmd = "virsh --connect #{LIBVIRT_URI} dumpxml"
> +        exe  = SSHCommand.run("#{xml_cmd} #{deploy_id}", host,
> log_method(id))
> +        if exe.code == 0
> +            doc = Nokogiri::XML(exe.stdout)
> +            port = doc.xpath("//domain//graphics/@port").first.value
> +            info << " VNC_PORT=#{port}"
> +        end
> +
>          send_message(ACTION[:poll], RESULT[:success], id, info)
>      end
>  end
> 
> Now the poll result (as seen in onevm.log) will also contain VNC_PORT.  This
> can get picked up in the OCCI xml output by adding something like
> 
>              <GRAPHICS port="<%=template['VNC_PORT']%>" />
> 
> to the little erb template in VirtualMachineOCCI.rb.
> 
> Not clear how to extend these ideas beyond libvirt btw - probably there's a
> cleaner approach for the more general problem but this approach met my use
> case nicely :)
> 
> Does this all make sense?
> 
> Thanks!
> 
> --Claude
> _______________________________________________
> Users mailing list
> Users at lists.opennebula.org
> http://lists.opennebula.org/listinfo.cgi/users-opennebula.org




More information about the Users mailing list