コード例 #1
0
ファイル: packages.py プロジェクト: NicolasLambert/leaf
    def __extract_artifact(
            self,
            la: LeafArtifact,
            env: Environment,
            install_folder: Path,
            ipmap: dict = None,
            keep_folder_on_error: bool = False) -> InstalledPackage:
        """
        Install a leaf artifact
        @return InstalledPackage
        """
        target_folder = install_folder / str(la.identifier)
        if target_folder.is_dir():
            raise LeafException(
                "Folder already exists: {folder}".format(folder=target_folder))

        # Check already installed
        ipmap = ipmap or self.list_installed_packages()
        if la.identifier in ipmap:
            raise LeafException(
                "Package is already installed: {la.identifier}".format(la=la))

        # Check leaf min version
        min_version = check_leaf_min_version([la])
        if min_version:
            raise LeafOutOfDateException(
                "You need to upgrade leaf to v{version} to install {la.identifier}"
                .format(version=min_version, la=la))

        # Create folder
        target_folder.mkdir(parents=True)

        try:
            # Extract content
            self.logger.print_verbose("Extract {la.path} in {dest}".format(
                la=la, dest=target_folder))
            with TarFile.open(str(la.path)) as tf:
                tf.extractall(str(target_folder))
            # Execute post install steps
            out = InstalledPackage(target_folder / LeafFiles.MANIFEST)
            ipmap[out.identifier] = out
            self.__execute_steps(out.identifier,
                                 ipmap,
                                 StepExecutor.install,
                                 env=env)
            return out
        except Exception as e:
            self.logger.print_error("Error during installation:", e)
            if keep_folder_on_error:
                target_folder = mark_folder_as_ignored(target_folder)
                self.logger.print_verbose(
                    "Mark folder as ignored: {folder}".format(
                        folder=target_folder))
            else:
                self.logger.print_verbose(
                    "Remove folder: {folder}".format(folder=target_folder))
                rmtree_force(target_folder)
            raise e
コード例 #2
0
 def list_linked_packages(self) -> list:
     """
     Return a list of linked packages
     """
     out = []
     for link in self.__folder.iterdir():
         if link.is_symlink():
             try:
                 out.append(InstalledPackage(link / LeafFiles.MANIFEST))
             except Exception:
                 pass
     return out
コード例 #3
0
ファイル: test_misc.py プロジェクト: vutruong1711/leaf
    def test_variable_resolver(self):

        ip1 = InstalledPackage(TEST_REMOTE_PACKAGE_SOURCE / "version_1.0" /
                               LeafFiles.MANIFEST)
        ip2 = InstalledPackage(TEST_REMOTE_PACKAGE_SOURCE / "version_1.1" /
                               LeafFiles.MANIFEST)
        ip3 = InstalledPackage(TEST_REMOTE_PACKAGE_SOURCE / "version_2.0" /
                               LeafFiles.MANIFEST)

        vr = VariableResolver(ip1, [ip1, ip2, ip3])

        self.assertEqual("version", vr.resolve("@{NAME}"))
        self.assertEqual("1.0", vr.resolve("@{VERSION}"))
        self.assertEqual(str(TEST_REMOTE_PACKAGE_SOURCE / "version_1.0"),
                         vr.resolve("@{DIR}"))

        self.assertEqual("version", vr.resolve("@{NAME:version_1.0}"))
        self.assertEqual("1.0", vr.resolve("@{VERSION:version_1.0}"))
        self.assertEqual(str(TEST_REMOTE_PACKAGE_SOURCE / "version_1.0"),
                         vr.resolve("@{DIR:version_1.0}"))

        self.assertEqual("version", vr.resolve("@{NAME:version_2.0}"))
        self.assertEqual("2.0", vr.resolve("@{VERSION:version_2.0}"))
        self.assertEqual(str(TEST_REMOTE_PACKAGE_SOURCE / "version_2.0"),
                         vr.resolve("@{DIR:version_2.0}"))

        self.assertEqual("version", vr.resolve("@{NAME:version_latest}"))
        self.assertEqual("2.0", vr.resolve("@{VERSION:version_latest}"))
        self.assertEqual(str(TEST_REMOTE_PACKAGE_SOURCE / "version_2.0"),
                         vr.resolve("@{DIR:version_latest}"))

        self.assertEqual(
            "version 1.1 " + str(TEST_REMOTE_PACKAGE_SOURCE / "version_2.0"),
            vr.resolve("@{NAME} @{VERSION:version_1.1} @{DIR:version_latest}"))

        with self.assertRaises(LeafException):
            vr.resolve("@{NAME} @{VERSION:version_1.2} @{DIR:version_latest}")
コード例 #4
0
 def _list_installed_packages(self, root_folder: Path, read_only: bool) -> dict:
     """
     Return all installed packages in given folder
     @return: PackageIdentifier/InstalledPackage dict
     """
     out = {}
     if root_folder is not None and root_folder.is_dir():
         for folder in root_folder.iterdir():
             # iterate over non ignored sub folders
             if folder.is_dir() and not is_folder_ignored(folder):
                 # test if a manifest exists
                 mffile = folder / LeafFiles.MANIFEST
                 if mffile.is_file():
                     try:
                         ip = InstalledPackage(mffile, read_only=read_only)
                         out[ip.identifier] = ip
                     except BaseException:
                         print_trace("Invalid manifest found: {mf}".format(mf=mffile))
     return out
コード例 #5
0
    def setUpClass(cls):
        LeafTestCase.setUpClass()

        for f in sorted(TEST_REMOTE_PACKAGE_SOURCE.iterdir(),
                        key=operator.attrgetter("name")):
            if "failure" in f.name:
                # Skip these packages for tests
                continue
            mffile = f / LeafFiles.MANIFEST
            if mffile.exists():
                try:
                    mf = Manifest.parse(mffile)
                    ip = InstalledPackage(mffile)
                    ap = AvailablePackage({"info": mf.info_node},
                                          "https://fake.tld/foo")
                    APMAP[mf.identifier] = ap
                    IPMAP[mf.identifier] = ip
                except Exception:
                    pass
        print("Found", len(APMAP), LeafFiles.MANIFEST)