[Libvir] Re: virt-manager command line options

Daniel P. Berrange berrange at redhat.com
Wed Oct 25 23:20:32 UTC 2006


Hi Karel,

This looks good to me. I'll commit it to the repo shortly. I'm also going
to change the DBus stuff a little so that it doesn't use the activation
capabilities. Currently if you start virt-manager for the first time, it 
will actually ask DBus to activate it & then the initial processs will
quit. This really messes with GNOME keyring & AT-SPI bits because the 
DBus activated version is missing the GNOME session info. With your addition
of command line args, there shoul be no need for the dbus activation stuff
and gnome-applet-vm can invoke virt-manager directly.

Dan.

On Thu, Oct 26, 2006 at 12:05:25AM +0200, Karel Zak wrote:
> 
>  We need a way how call virt-manager methods without D-BUS. This patch
>  adds new --show-* command line options.
> 
>  The --show-* options need to be used together with the --connect
>  option.
> 
>  Daniel, I also added an OptionValueError exception. It's not perfect
>  solution, but I'm not sure what's your favourite way for error messages
>  in virt-manager when GTK is not initialized yet. 
> 
>         # virt-manager --help 
>         usage: virt-manager.py [options]
> 
>         options:
>           -h, --help            show this help message and exit
>           -c URI, --connect=URI
>                                 Connect to hypervisor at URI
>           --no-dbus             Disable DBus service for controlling UI
>           --show-domain-creator
>                                 Create a new virtual machine
>           --show-domain-editor=UUID
>                                 Edit a domain configuration
>           --show-domain-performance=UUID
>                                 Show a domain performance
>           --show-domain-console=UUID
>                                 Show a domain console
>           --show-host-summary   Show a host summary
> 
> 
>     Karel
> 
> 
> # HG changeset patch
> # User Karel Zak <kzak at redhat.com>
> # Node ID 3aab017160416137fe3033e13a206303287e5dd9
> # Parent  127d61c9062e0ed5662f412f5edbb6c7dbd5582f
> add command line option
> 
> diff -r 127d61c9062e -r 3aab01716041 src/virt-manager.py.in
> --- a/src/virt-manager.py.in	Thu Oct 19 13:48:03 2006 -0400
> +++ b/src/virt-manager.py.in	Wed Oct 25 23:24:24 2006 +0200
> @@ -70,7 +70,7 @@ dbus.glib.threads_init()
>  dbus.glib.threads_init()
>  import dbus.service
>  
> -from optparse import OptionParser
> +from optparse import OptionParser, OptionValueError
>  
>  appname = "::PACKAGE::"
>  appversion = "::VERSION::"
> @@ -102,21 +102,74 @@ from virtManager.remote import vmmRemote
>  
>  gtk.window_set_default_icon_from_file(icon_dir + "/" + appname + "-icon.svg")
>  
> +# maps --show-* to engine methods
> +def show_engine(engine, show, uri, uuid):
> +    if show=='creator':
> +        engine.show_create(uri)
> +    elif show=='editor':
> +        engine.show_details_config(uri, uuid)
> +    elif show=='performance':
> +        engine.show_details_performance(uri, uuid)
> +    elif show=='console':
> +        engine.show_console(uri, uuid)
> +    elif show=='summary' or uri:
> +        engine.show_manager(uri)
> +    else:
> +        engine.show_connect()
> +
> +# maps --show-* to remote manager methods
> +def show_remote(managerObj, show, uri, uuid):
> +    if show=='creator':
> +        managerObj.show_domain_creator(uri)
> +    elif show=='editor':
> +        managerObj.show_domain_editor(uri, uuid)
> +    elif show=='performance':
> +        managerObj.show_domain_performance(uri, uuid)
> +    elif show=='console':
> +        managerObj.show_domain_console(uri, uuid)
> +    elif show=='summary' or uri:
> +        managerObj.show_host_summary(uri)
> +    else:
> +        managerObj.show_connect()
> +
> +# Generic OptionParser callback for all --show-* options
> +# This routine stores UUID to options.uuid for all --show-* options 
> +# where is metavar="UUID" and also sets options.show
> +def opt_show_cb(option, opt_str, value, parser):
> +    if option.metavar=="UUID":
> +        setattr(parser.values, "uuid", value)        
> +    s = str(option)
> +    show = s[s.rindex('-')+1:]
> +    setattr(parser.values, "show", show)
> +
>  # Run me!
>  def main():
>      optParser = OptionParser()
> -    optParser.add_option("-c", "--connect", dest="uri", help="Connect to hypervisor at URI", metavar="URI")
> -    optParser.add_option("--no-dbus", action="store_true", dest="nodbus", help="Disable DBus service for controlling UI")
> +    optParser.set_defaults(uuid=None)
> +    optParser.add_option("-c", "--connect", dest="uri", 
> +        help="Connect to hypervisor at URI", metavar="URI")
> +    optParser.add_option("--no-dbus", action="store_true", dest="nodbus", 
> +        help="Disable DBus service for controlling UI")
> +    optParser.add_option("--show-domain-creator", action="callback", 
> +        callback=opt_show_cb, dest="show", help="Create a new virtual machine")
> +    optParser.add_option("--show-domain-editor",  type="string", metavar="UUID",
> +        action="callback", callback=opt_show_cb, help="Edit a domain configuration")
> +    optParser.add_option("--show-domain-performance", type="string", metavar="UUID", 
> +        action="callback", callback=opt_show_cb, help="Show a domain performance")
> +    optParser.add_option("--show-domain-console", type="string", metavar="UUID",
> +        action="callback", callback=opt_show_cb, help="Show a domain console")
> +    optParser.add_option("--show-host-summary", action="callback", 
> +       callback=opt_show_cb, help="Show a host summary")
>  
>      (options, args) = optParser.parse_args()
> +
> +    if options.show and options.uri==None:
> +        raise OptionValueError("can't use --show-* options without --connect")
>  
>      config = vmmConfig(appname, appversion, gconf_dir, glade_dir, icon_dir)
>      engine = vmmEngine(config)
>      if options.nodbus:
> -        if options.uri != None:
> -            engine.show_manager(options.uri)
> -        else:
> -            engine.show_connect()
> +        show_engine(engine, options.show, options.uri, options.uuid)
>      else:
>          bus = None
>          try:
> @@ -135,19 +188,14 @@ def main():
>                  managerProxy = bus.get_object("com.redhat.virt.manager", "/com/redhat/virt/manager")
>                  managerObj = dbus.Interface(managerProxy, "com.redhat.virt.manager")
>  
> -                if options.uri != None:
> -                    managerObj.show_host_summary(options.uri)
> -                else:
> -                    managerObj.show_connect()
> +                show_remote(managerObj, options.show, options.uri, options.uuid)
> +
>                  # yes, we exit completely now - remote service is in charge
>                  return
>          except:
>              logging.warning("Could not connection to session bus, disabling DBus service " + \
>                              str(sys.exc_info()[0]) + " " + str(sys.exc_info()[1]))
> -            if options.uri != None:
> -                engine.show_manager(options.uri)
> -            else:
> -                engine.show_connect()
> +            show_engine(engine, options.show, options.uri, options.uuid)
>      gtk.main()
>  
>  if __name__ == "__main__":

-- 
|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
|=-           Perl modules: http://search.cpan.org/~danberr/              -=|
|=-               Projects: http://freshmeat.net/~danielpb/               -=|
|=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 




More information about the libvir-list mailing list