[et-mgmt-tools] [PATCH 2 of 2] Added a --replace option to virt-image which allows it to replace an existing machine if it is current running or defined

Cole Robinson crobinso at redhat.com
Tue Jul 1 16:38:08 UTC 2008


"Bryan M. Kearney <bkearney at redhat.com>"@redhat.com wrote:
> # HG changeset patch
> # User "Bryan M. Kearney <bkearney at redhat.com>"
> # Date 1214497967 14400
> # Node ID efba908eb79ad0bf2805c27f784de92578207f1b
> # Parent  63aca2dbb3154a65505b1ccef080a8887742cef5
> Added a --replace option to virt-image which allows it to replace an existing machine if it is current running or defined
> 
> diff -r 63aca2dbb315 -r efba908eb79a virt-image
> --- a/virt-image	Tue Jun 24 12:30:24 2008 -0400
> +++ b/virt-image	Thu Jun 26 12:32:47 2008 -0400
> @@ -142,7 +142,10 @@ def parse_args():
>                        help=_("The zero-based index of the boot record to use"))
>      parser.add_option("", "--force", action="store_true", dest="force",
>                        help=_("Do not prompt for input. Answers yes where applicable, terminates for all other prompts"),
> -                      default=False)
> +                      default=False)    
> +    parser.add_option("", "--replace",action="store_true", dest="replace",
> +                      help=_("Overwrite, or destroy, an existing image with the same name"),
> +                      default=False)                      
>  
>      (options,args) = parser.parse_args()
>      if len(args) < 1:
> @@ -211,7 +214,7 @@ def main():
>          try:
>              print _("\n\nCreating guest %s...") % guest.name
>  
> -            dom = guest.start_install(None, progresscb)
> +            dom = guest.start_install(None, progresscb, options.replace)
>              if dom is None:
>                  print _("Guest creation failed")
>                  sys.exit(1)
> diff -r 63aca2dbb315 -r efba908eb79a virtinst/Guest.py
> --- a/virtinst/Guest.py	Tue Jun 24 12:30:24 2008 -0400
> +++ b/virtinst/Guest.py	Thu Jun 26 12:32:47 2008 -0400
> @@ -914,7 +914,7 @@ class Guest(object):
>          "action": action }
>  
>  
> -    def start_install(self, consolecb = None, meter = None):
> +    def start_install(self, consolecb = None, meter = None, removeOld = False):
>          """Do the startup of the guest installation."""
>          self.validate_parms()
>  
> @@ -924,7 +924,7 @@ class Guest(object):
>  
>          self._prepare_install(meter)
>          try:
> -            return self._do_install(consolecb, meter)
> +            return self._do_install(consolecb, meter, removeOld)
>          finally:
>              self._installer.cleanup()
>  
> @@ -932,10 +932,20 @@ class Guest(object):
>          self._install_disks = self.disks[:]
>          self._install_nics = self.nics[:]
>  
> -    def _do_install(self, consolecb, meter):
> +    def _do_install(self, consolecb, meter, removeOld = False):
>          try:
> -            if self.conn.lookupByName(self.name) is not None:
> -                raise RuntimeError, _("Domain named %s already exists!") %(self.name,)
> +            vm = self.conn.lookupByName(self.name)
> +            if removeOld:
> +                if vm is not None:
> +                    if vm.ID() == -1:
> +                        logging.info("Removing old definition for image %s" %(self.name))
> +                        vm.undefine()
> +                    else:
> +                        logging.info("Destroying image %s" %(self.name))           
> +                        vm.destroy()
> +            else:
> +                if vm is not None:
> +                    raise RuntimeError, _("Domain named %s already exists!") %(self.name,)
>          except libvirt.libvirtError:
>              pass
>  

Hmm, just looking at this again, and the exception handling can throw
away some important info.

You'll want to throw away the libvirtError from the lookupByName call
only: if destroy or undefine fail, the install should fail, raising
the exception and giving a nicer message such as "Couldn't destroy/undefine
existing vm 'vmname': %s" str(e)"

Also, could you combine the two patches into one? It will just make reviewing
easier :)

Thanks,
Cole




More information about the et-mgmt-tools mailing list