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
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
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}")
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
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)