package.py (117 lines of code) (raw):

import argparse import configparser import glob import os import shutil import sys import tarfile import tempfile from argparse import Namespace from subprocess import check_call from typing import List, Optional SCALELIB_VERSION = "0.1.8" CYCLECLOUD_API_VERSION = "8.0.1" def build_sdist() -> str: cmd = [sys.executable, "setup.py", "sdist"] check_call(cmd, cwd=os.path.abspath("gridengine")) # see below for more: cyclecloud*gridengine so we cover cyclecloud-gridengine and cyclecloud_gridengine sdists = glob.glob("gridengine/dist/cyclecloud*gridengine-*.tar.gz") assert len(sdists) == 1, "Found %d sdist packages, expected 1" % len(sdists) path = sdists[0] # at some point setuptools changed the name of the sdist package to use underscores instead of dashes. if "/cyclecloud_gridengine-" in path: fixed_path = path.replace("/cyclecloud_gridengine-", "/cyclecloud-gridengine-") os.rename(path, fixed_path) path = fixed_path fname = os.path.basename(path) dest = os.path.join("libs", fname) if os.path.exists(dest): os.remove(dest) shutil.move(path, dest) return fname def get_cycle_libs(args: Namespace) -> List[str]: ret = [build_sdist()] scalelib_file = "cyclecloud-scalelib-{}.tar.gz".format(SCALELIB_VERSION) cyclecloud_api_file = "cyclecloud_api-{}-py2.py3-none-any.whl".format( CYCLECLOUD_API_VERSION ) scalelib_url = "https://github.com/Azure/cyclecloud-scalelib/archive/{}.tar.gz".format( SCALELIB_VERSION ) cyclecloud_api_url = "https://github.com/Azure/cyclecloud-gridengine/releases/download/2.0.0/cyclecloud_api-8.0.1-py2.py3-none-any.whl" to_download = { scalelib_file: (args.scalelib, scalelib_url), cyclecloud_api_file: (args.cyclecloud_api, cyclecloud_api_url), } for lib_file in to_download: arg_override, url = to_download[lib_file] if arg_override: if not os.path.exists(arg_override): print(arg_override, "does not exist", file=sys.stderr) sys.exit(1) fname = os.path.basename(arg_override) orig = os.path.abspath(arg_override) dest = os.path.abspath(os.path.join("libs", fname)) if orig != dest: shutil.copyfile(orig, dest) ret.append(fname) else: dest = os.path.join("libs", lib_file) check_call(["curl", "-L", "-k", "-s", "-o", dest, url]) ret.append(lib_file) print("Downloaded", lib_file, "to") return ret def execute() -> None: expected_cwd = os.path.abspath(os.path.dirname(__file__)) os.chdir(expected_cwd) if not os.path.exists("libs"): os.makedirs("libs") argument_parser = argparse.ArgumentParser( "Builds CycleCloud GridEngine project with all dependencies.\n" + "If you don't specify local copies of scalelib or cyclecloud-api they will be downloaded from github." ) argument_parser.add_argument("--scalelib", default=None) argument_parser.add_argument("--cyclecloud-api", default=None) args = argument_parser.parse_args() cycle_libs = get_cycle_libs(args) parser = configparser.ConfigParser() ini_path = os.path.abspath("project.ini") with open(ini_path) as fr: parser.read_file(fr) version = parser.get("project", "version") if not version: raise RuntimeError("Missing [project] -> version in {}".format(ini_path)) if not os.path.exists("dist"): os.makedirs("dist") tf = tarfile.TarFile.gzopen( "dist/cyclecloud-gridengine-pkg-{}.tar.gz".format(version), "w" ) build_dir = tempfile.mkdtemp("cyclecloud-gridengine") def _add(name: str, path: Optional[str] = None, mode: Optional[int] = None) -> None: path = path or name tarinfo = tarfile.TarInfo("cyclecloud-gridengine/" + name) tarinfo.size = os.path.getsize(path) tarinfo.mtime = int(os.path.getmtime(path)) if mode: tarinfo.mode = mode with open(path, "rb") as fr: tf.addfile(tarinfo, fr) packages = [] for dep in cycle_libs: dep_path = os.path.abspath(os.path.join("libs", dep)) _add("packages/" + dep, dep_path) packages.append(dep_path) check_call(["pip", "download"] + packages, cwd=build_dir) print("Using build dir", build_dir) for fil in os.listdir(build_dir): if fil.startswith("certifi-2019"): print("WARNING: Ignoring duplicate certifi {}".format(fil)) continue if "charset_normalizer" in fil: print("WARNING: removing charset_normalizer") continue path = os.path.join(build_dir, fil) _add("packages/" + fil, path) _add("install.sh", mode=os.stat("install.sh")[0]) _add("generate_autoscale_json.sh", mode=os.stat("generate_autoscale_json.sh")[0]) _add("logging.conf", "gridengine/conf/logging.conf") if __name__ == "__main__": execute()