def _checkout_layer(self, repo, rootfs_fd, rootfs, rev): # ostree 2016.8 has a glib introspection safe API for checkout, use it # when available. if hasattr(repo, "checkout_at"): options = OSTree.RepoCheckoutAtOptions() # pylint: disable=no-member options.overwrite_mode = OSTree.RepoCheckoutOverwriteMode.UNION_FILES options.process_whiteouts = True options.disable_fsync = True if self.user: options.mode = OSTree.RepoCheckoutMode.USER repo.checkout_at(options, rootfs_fd, rootfs, rev) else: if self.user: user = ["--user-mode"] else: user = [] util.check_call(["ostree", "--repo=%s" % self.get_ostree_repo_location(), "checkout", "--union"] + user + ["--whiteouts", "--fsync=no", rev, rootfs], stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL)
def checkout_container(self, container_name, rev_number): """ This method checks out a container into its corresponding folder, to a given commit revision. Before that, it stops the container using systemd, if found. Parameters: container_name (str): the name of the container rev_number (str): the commit revision """ service = self.systemd.ListUnitsByNames([container_name + '.service']) if service[0][2] != 'not-found': self.logger.info("Stop the container {}".format(container_name)) self.stop_unit(container_name) res = True rootfs_fd = None try: options = OSTree.RepoCheckoutAtOptions() options.overwrite_mode = OSTree.RepoCheckoutOverwriteMode.UNION_IDENTICAL options.process_whiteouts = True options.bareuseronly_dirs = True options.no_copy_fallback = True options.mode = OSTree.RepoCheckoutMode.USER self.logger.info("Getting rev from repo:{}".format(container_name + ':' + container_name)) if rev_number is None: rev = self.repo_containers.resolve_rev(container_name + ':' + container_name, False)[1] else: rev = rev_number self.logger.info("Rev value:{}".format(rev)) if os.path.isdir(PATH_APPS + '/' + container_name): shutil.rmtree(PATH_APPS + '/' + container_name) os.mkdir(PATH_APPS + '/' + container_name) self.logger.info("Create directory {}/{}".format(PATH_APPS, container_name)) rootfs_fd = os.open(PATH_APPS + '/' + container_name, os.O_DIRECTORY) res = self.repo_containers.checkout_at(options, rootfs_fd, PATH_APPS + '/' + container_name, rev) open(PATH_APPS + '/' + container_name + '/' + VALIDATE_CHECKOUT, 'a').close() except GLib.Error as e: self.logger.error("Checking out {} failed ({})".format(container_name, str(e))) raise if rootfs_fd is not None: os.close(rootfs_fd) if not res: raise Exception("Checking out {} failed (returned False)")
def checkout_container(self, container_name, rev_number): res = True rootfs_fd = None try: options = OSTree.RepoCheckoutAtOptions() options.overwrite_mode = OSTree.RepoCheckoutOverwriteMode.UNION_IDENTICAL options.process_whiteouts = True options.bareuseronly_dirs = True options.no_copy_fallback = True options.mode = OSTree.RepoCheckoutMode.USER self.logger.info( "Getting rev from repo:{}".format(container_name + ':' + container_name)) if rev_number == None: rev = self.repo_containers.resolve_rev( container_name + ':' + container_name, False)[1] else: rev = rev_number self.logger.info("Rev value:{}".format(rev)) if os.path.isdir(PATH_APPS + '/' + container_name): shutil.rmtree(PATH_APPS + '/' + container_name) os.mkdir(PATH_APPS + '/' + container_name) self.logger.info("Create directory {}/{}".format( PATH_APPS, container_name)) rootfs_fd = os.open(PATH_APPS + '/' + container_name, os.O_DIRECTORY) res = self.repo_containers.checkout_at( options, rootfs_fd, PATH_APPS + '/' + container_name, rev) open(PATH_APPS + '/' + container_name + '/' + VALIDATE_CHECKOUT, 'a').close() except GLib.Error as e: self.logger.error("Checking out {} failed ({})".format( container_name, str(e))) res = False if rootfs_fd != None: os.close(rootfs_fd) return res