def get_kickstart_data(remote): """ Get Kickstart data from remote. """ kickstart = {} namespaces = [".treeinfo", "treeinfo"] for namespace in namespaces: downloader = remote.get_downloader(url=urljoin(remote.url, namespace)) try: result = downloader.fetch() except ClientResponseError as exc: if 404 == exc.status: continue raise kickstart = TreeInfo() kickstart.load(f=result.path) parser = SortedConfigParser() kickstart.serialize(parser) kickstart_parsed = parser._sections sha256 = result.artifact_attributes["sha256"] kickstart = KickstartData(kickstart_parsed).to_dict(hash=sha256) break return kickstart
def parsed_sections(self): """ Treeinfo parsed data. """ parser = SortedConfigParser() self.serialize(parser) general = self.original_parser._sections.get("general") build_timestamp = "" if general: if "general" not in parser._sections: parser._sections["general"] = general if "." in str(general.get("timestamp")): build_timestamp = float(general["timestamp"]) tree = self.original_parser._sections.get("tree", {}) if "." in str(tree.get("build_timestamp")): build_timestamp = float(tree.get["build_timestamp"]) if build_timestamp and parser._sections.get("general", {}).get("timestamp"): parser._sections["general"]["timestamp"] = build_timestamp if build_timestamp and parser._sections.get("tree", {}).get("build_timestamp"): parser._sections["tree"]["build_timestamp"] = build_timestamp return parser._sections
def parsed_sections(self): """ Treeinfo parsed data. """ parser = SortedConfigParser() self.serialize(parser) general = self.original_parser._sections.get("general") build_timestamp = "" if general: if "general" not in parser._sections: parser._sections["general"] = general if general.get("timestamp"): build_timestamp = float(general["timestamp"]) tree = self.original_parser._sections.get("tree", {}) if tree.get("build_timestamp"): build_timestamp = float(tree.get("build_timestamp")) if build_timestamp and parser._sections.get("general", {}).get("timestamp"): parser._sections["general"]["timestamp"] = build_timestamp if build_timestamp and parser._sections.get("tree", {}).get("build_timestamp"): parser._sections["tree"]["build_timestamp"] = build_timestamp release = self.original_parser._sections.get("release", {}) if "is_layered" in release: parser._sections["release"]["is_layered"] = json.loads(release["is_layered"]) return parser._sections
def get_kickstart_data(remote): """ Get Kickstart data from remote. """ kickstart = {} remote_url = remote.url if remote.url[-1] == "/" else f"{remote.url}/" namespaces = [".treeinfo", "treeinfo"] for namespace in namespaces: downloader = remote.get_downloader(url=urljoin(remote_url, namespace)) try: result = downloader.fetch() except ClientResponseError as exc: if 404 == exc.status: continue raise parser = SortedConfigParser() with open(result.path, "r") as treeinfo: parser.read_file(treeinfo) treeinfo_parsed = parser._sections sha256 = result.artifact_attributes["sha256"] kickstart = KickstartData(treeinfo_parsed).to_dict(hash=sha256) break return kickstart
def parsed_sections(self): """ Treeinfo parsed data. """ parser = SortedConfigParser() self.serialize(parser) if "general" in self.original_parser._sections: if "general" not in parser._sections: parser._sections["general"] = self.original_parser._sections[ "general"] return parser._sections
def create_treeinfo(distribution_tree): """ Create treeinfo file. Args: distirbution_tree(app.models.DistributionTree): a distirbution_tree object Returns: f(File): treeinfo file. """ parser = SortedConfigParser() treeinfo = {} treeinfo["header"] = { "type": "productmd.treeinfo", "version": distribution_tree.header_version, } treeinfo["release"] = { "name": distribution_tree.release_name, "short": distribution_tree.release_short, "version": distribution_tree.release_version, "is_layered": distribution_tree.release_is_layered, } if distribution_tree.base_product_name: treeinfo["base_product"] = { "name": distribution_tree.base_product_name, "short": distribution_tree.base_product_short, "version": distribution_tree.base_product_version, } treeinfo["tree"] = { "arch": distribution_tree.arch, "build_timestamp": distribution_tree.build_timestamp, } stage2 = {} media = {} if distribution_tree.instimage: stage2.update({"instimage": distribution_tree.instimage}) if distribution_tree.mainimage: stage2.update({"mainimage": distribution_tree.mainimage}) if stage2: treeinfo["stage2"] = stage2 if distribution_tree.discnum: media.update({"discnum": distribution_tree.discnum}) if distribution_tree.totaldiscs: media.update({"totaldiscs": distribution_tree.totaldiscs}) if media: treeinfo["media"] = media checksums = {} for checksum in distribution_tree.checksums.all(): checksums.update({checksum.path: checksum.checksum}) if checksums: treeinfo["checksums"] = checksums tree_platforms = set() for image in distribution_tree.images.all(): platforms = image.platforms.split(",") tree_platforms.update(platforms) for platform in platforms: current = treeinfo.get(f"images-{platform}", {}) current.update({image.name: image.path}) treeinfo[f"images-{platform}"] = current treeinfo["tree"].update({"platforms": ",".join(tree_platforms)}) for addon in distribution_tree.addons.all(): treeinfo[f"addon-{addon.uid}"] = { "id": addon.addon_id, "uid": addon.uid, "name": addon.name, "type": addon.type, "packages": addon.packages, "repository": addon.addon_id, } variants = [] nullables = [ "source_packages", "source_repository", "debug_packages", "debug_repository", "identity" ] for variant in distribution_tree.variants.all(): variants.append(variant.uid) treeinfo[f"variant-{variant.uid}"] = { "id": variant.variant_id, "uid": variant.uid, "name": variant.name, "type": variant.type, "packages": variant.packages, "repository": variant.variant_id, } for nullable in nullables: if getattr(variant, nullable): treeinfo[f"variant-{variant.uid}"].update( {nullable: getattr(variant, nullable)}) treeinfo["tree"].update({"variants": ", ".join(variants)}) variants = sorted(variants) first_variant = treeinfo[f"variant-{variants[0]}"] if variants else { "packages": ".", "uid": "" } first_variant["repository"] = "." treeinfo["general"] = { "family": treeinfo["release"]["name"], "version": treeinfo["release"]["version"], "name": f"{treeinfo['release']['name']} {treeinfo['release']['version']}", "arch": treeinfo["tree"]["arch"], "platforms": treeinfo["tree"]["platforms"], "packagedir": first_variant["packages"], "repository": first_variant["repository"], "timestamp": treeinfo["tree"]["build_timestamp"], "variant": first_variant["uid"], } parser.read_dict(treeinfo) with open(".treeinfo", "w") as f: parser.write(f) return f