Ejemplo n.º 1
0
 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)
Ejemplo n.º 2
0
    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)")
Ejemplo n.º 3
0
    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