X-Git-Url: https://code.grnet.gr/git/snf-image-creator/blobdiff_plain/b932f59d7b7567ec3f990c82522112e7da8606d5..ec8b2a7949b8cdc47b5a9c624dcc6f78aa0e53f3:/image_creator/image.py diff --git a/image_creator/image.py b/image_creator/image.py index 2ec52a6..282789d 100644 --- a/image_creator/image.py +++ b/image_creator/image.py @@ -60,6 +60,39 @@ class Image(object): self.size = 0 self.g = guestfs.GuestFS() + self.guestfs_enabled = False + + def enable(self): + """Enable a newly created Image instance""" + + self.enable_guestfs() + + self.out.output('Inspecting Operating System ...', False) + roots = self.g.inspect_os() + if len(roots) == 0: + raise FatalError("No operating system found") + if len(roots) > 1: + raise FatalError("Multiple operating systems found." + "We only support images with one OS.") + self.root = roots[0] + self.guestfs_device = self.g.part_to_dev(self.root) + self.size = self.g.blockdev_getsize64(self.guestfs_device) + self.meta['PARTITION_TABLE'] = \ + self.g.part_get_parttype(self.guestfs_device) + + self.ostype = self.g.inspect_get_type(self.root) + self.distro = self.g.inspect_get_distro(self.root) + self.out.success( + 'found a(n) %s system' % + self.ostype if self.distro == "unknown" else self.distro) + + def enable_guestfs(self): + """Enable the guestfs handler""" + + if self.guestfs_enabled: + self.out.warn("Guestfs is already enabled") + return + self.g.add_drive_opts(self.device, readonly=0, format="raw") # Before version 1.17.14 the recovery process, which is a fork of the @@ -76,11 +109,6 @@ class Image(object): #self.g.set_trace(1) #self.g.set_verbose(1) - self.guestfs_enabled = False - - def enable(self): - """Enable a newly created Image instance""" - self.out.output('Launching helper VM (may take a while) ...', False) # self.progressbar = self.out.Progress(100, "Launching helper VM", # "percent") @@ -93,24 +121,24 @@ class Image(object): # self.progressbar = None self.out.success('done') - self.out.output('Inspecting Operating System ...', False) - roots = self.g.inspect_os() - if len(roots) == 0: - raise FatalError("No operating system found") - if len(roots) > 1: - raise FatalError("Multiple operating systems found." - "We only support images with one OS.") - self.root = roots[0] - self.guestfs_device = self.g.part_to_dev(self.root) - self.size = self.g.blockdev_getsize64(self.guestfs_device) - self.meta['PARTITION_TABLE'] = \ - self.g.part_get_parttype(self.guestfs_device) + def disable_guestfs(self): + """Disable the guestfs handler""" - self.ostype = self.g.inspect_get_type(self.root) - self.distro = self.g.inspect_get_distro(self.root) - self.out.success( - 'found a(n) %s system' % - self.ostype if self.distro == "unknown" else self.distro) + if not self.guestfs_enabled: + self.out.warn("Guestfs is already disabled") + return + + self.out.output("Shutting down helper VM ...", False) + self.g.sync() + # guestfs_shutdown which is the prefered way to shutdown the backend + # process was introduced in version 1.19.16 + if check_guestfs_version(self.g, 1, 19, 16) >= 0: + self.g.shutdown() + else: + self.g.kill_subprocess() + + self.guestfs_enabled = False + self.out.success('done') def _get_os(self): """Return an OS class instance for this image"""