diff --git a/app/build_containers.py b/app/build_containers.py index abe909ac..90b0515b 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -22,7 +22,6 @@ import os import sys -import argparse from decouple import config import subprocess import click @@ -31,6 +30,7 @@ from .util import include_exclude_check # TODO: find a place for this # epilog="Config provided either in .env or settings.ini or env vars: CERC_REPO_BASE_DIR (defaults to ~/cerc)" + @click.command() @click.option('--include', help="only build these containers") @click.option('--exclude', help="don\'t build these containers") @@ -44,7 +44,7 @@ def command(ctx, include, exclude): local_stack = ctx.obj.local_stack if local_stack: - dev_root_path = default=os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] + dev_root_path = default = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] print(f'Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}') else: dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) @@ -53,7 +53,7 @@ def command(ctx, include, exclude): print(f'Dev Root is: {dev_root_path}') if not os.path.isdir(dev_root_path): - print(f'Dev root directory doesn\'t exist, creating') + print('Dev root directory doesn\'t exist, creating') with open("container-image-list.txt") as container_list_file: containers = container_list_file.read().splitlines() @@ -64,7 +64,7 @@ def command(ctx, include, exclude): def process_container(container): if not quiet: print(f"Building: {container}") - build_script_filename = os.path.join("container-build",container.replace("/","-"),"build.sh") + build_script_filename = os.path.join("container-build", container.replace("/", "-"), "build.sh") if verbose: print(f"Script: {build_script_filename}") if not os.path.exists(build_script_filename): @@ -72,7 +72,7 @@ def command(ctx, include, exclude): sys.exit(1) if not dry_run: # We need to export CERC_REPO_BASE_DIR - build_result = subprocess.run(build_script_filename, shell=True, env={'CERC_REPO_BASE_DIR':dev_root_path}) + build_result = subprocess.run(build_script_filename, shell=True, env={'CERC_REPO_BASE_DIR': dev_root_path}) # TODO: check result in build_result.returncode print(f"Result is: {build_result}") else: diff --git a/app/deploy_system.py b/app/deploy_system.py index d779bef9..ace747ca 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -16,18 +16,18 @@ # Deploys the system components using docker-compose import os -import argparse -from decouple import config from python_on_whales import DockerClient import click from .util import include_exclude_check + @click.command() -@click.option('--include', help="only start these components") -@click.option('--exclude', help="don\'t start these components") -@click.argument('command') # help: command: up|down|ps +@click.option("--include", help="only start these components") +@click.option("--exclude", help="don\'t start these components") +@click.option("--score", help="read list of components from file") +@click.argument('command') # help: command: up|down|ps @click.pass_context -def command(ctx, include, exclude, command): +def command(ctx, include, exclude, score, command): '''deploy a stack''' # TODO: implement option exclusion and command value constraint lost with the move from argparse to click diff --git a/app/setup_repositories.py b/app/setup_repositories.py index ead3631d..634fff33 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -18,22 +18,23 @@ import os import sys -import argparse from decouple import config import git from tqdm import tqdm import click + class GitProgress(git.RemoteProgress): def __init__(self): super().__init__() - self.pbar = tqdm(unit = 'B', ascii = True, unit_scale = True) + self.pbar = tqdm(unit='B', ascii=True, unit_scale=True) def update(self, op_code, cur_count, max_count=None, message=''): self.pbar.total = max_count self.pbar.n = cur_count self.pbar.refresh() + def is_git_repo(path): try: _ = git.Repo(path).git_dir @@ -42,10 +43,11 @@ def is_git_repo(path): return False # TODO: find a place for this in the context of click -#parser = argparse.ArgumentParser( +# parser = argparse.ArgumentParser( # epilog="Config provided either in .env or settings.ini or env vars: CERC_REPO_BASE_DIR (defaults to ~/cerc)" # ) + @click.command() @click.option('--check-only', is_flag=True, default=False) @click.option('--pull', is_flag=True, default=False) @@ -71,7 +73,7 @@ def command(ctx, check_only, pull, branches_file): local_stack = ctx.obj.local_stack if local_stack: - dev_root_path = default=os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] + dev_root_path = default = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] print(f'Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}') else: dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) @@ -81,14 +83,14 @@ def command(ctx, check_only, pull, branches_file): if not os.path.isdir(dev_root_path): if not quiet: - print(f'Dev root directory doesn\'t exist, creating') + print('Dev root directory doesn\'t exist, creating') os.makedirs(dev_root_path) with open("repository-list.txt") as repository_list_file: repos = repository_list_file.read().splitlines() if verbose: - print (f'Repos: {repos}') + print(f'Repos: {repos}') def process_repo(repo): full_github_repo_path = f'git@github.com:{repo}' @@ -96,7 +98,8 @@ def command(ctx, check_only, pull, branches_file): full_filesystem_repo_path = os.path.join(dev_root_path, repoName) is_present = os.path.isdir(full_filesystem_repo_path) if not quiet: - present_text = f'already exists active branch: {git.Repo(full_filesystem_repo_path).active_branch}' if is_present else 'Needs to be fetched' + present_text = f'already exists active branch: {git.Repo(full_filesystem_repo_path).active_branch}' if is_present \ + else 'Needs to be fetched' print(f'Checking: {full_filesystem_repo_path}: {present_text}') # Quick check that it's actually a repo if is_present: @@ -110,7 +113,7 @@ def command(ctx, check_only, pull, branches_file): if not check_only: git_repo = git.Repo(full_filesystem_repo_path) origin = git_repo.remotes.origin - origin.pull(progress = None if quiet else GitProgress()) + origin.pull(progress=None if quiet else GitProgress()) else: print("(git pull skipped)") if not is_present: @@ -118,8 +121,9 @@ def command(ctx, check_only, pull, branches_file): if verbose: print(f'Running git clone for {full_github_repo_path} into {full_filesystem_repo_path}') if not dry_run: - git.Repo.clone_from(full_github_repo_path, full_filesystem_repo_path, - progress = None if quiet else GitProgress()) + git.Repo.clone_from(full_github_repo_path, + full_filesystem_repo_path, + progress=None if quiet else GitProgress()) else: print("(git clone skipped)") # Checkout the requested branch, if one was specified @@ -134,8 +138,6 @@ def command(ctx, check_only, pull, branches_file): print(f"checking out branch {branch_to_checkout} in repo {repo}") git_repo = git.Repo(full_filesystem_repo_path) git_repo.git.checkout(branch_to_checkout) - - for repo in repos: process_repo(repo) diff --git a/app/util.py b/app/util.py index 48381bf0..bbf84398 100644 --- a/app/util.py +++ b/app/util.py @@ -14,11 +14,11 @@ # along with this program. If not, see . def include_exclude_check(s, include, exclude): - if include == None and exclude == None: + if include is None and exclude is None: return True - if include != None: + if include is not None: include_list = include.split(",") return s in include_list - if exclude != None: + if exclude is not None: exclude_list = exclude.split(",") return s not in exclude_list diff --git a/cli.py b/cli.py index 04cde0ce..06c4aa7e 100644 --- a/cli.py +++ b/cli.py @@ -21,6 +21,7 @@ from app import deploy_system CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) + class Options(object): def __init__(self, quiet, verbose, dry_run, local_stack): self.quiet = quiet @@ -33,13 +34,13 @@ class Options(object): @click.option('--verbose', is_flag=True, default=False) @click.option('--dry-run', is_flag=True, default=False) @click.option('--local_stack', is_flag=True, default=False) - # See: https://click.palletsprojects.com/en/8.1.x/complex/#building-a-git-clone @click.pass_context def cli(ctx, quiet, verbose, dry_run, local_stack): """Laconic Stack Orchestrator""" ctx.obj = Options(quiet, verbose, dry_run, local_stack) -cli.add_command(setup_repositories.command,"setup-repositories") -cli.add_command(build_containers.command,"build-containers") -cli.add_command(deploy_system.command,"deploy-system") + +cli.add_command(setup_repositories.command, "setup-repositories") +cli.add_command(build_containers.command, "build-containers") +cli.add_command(deploy_system.command, "deploy-system") diff --git a/setup.py b/setup.py index d302ee4f..88e10155 100644 --- a/setup.py +++ b/setup.py @@ -5,24 +5,24 @@ with open("README.md", "r", encoding="utf-8") as fh: with open("requirements.txt", "r", encoding="utf-8") as fh: requirements = fh.read() setup( - name = 'laconic-stack-orchestrator', - version = '0.0.5', - author = 'Cerc', - author_email = 'info@cerc.io', - license = 'GNU Affero General Public License', - description = 'Orchestrates deployment of the Laconic stack', - long_description = long_description, - long_description_content_type = "text/markdown", - url = 'https://github.com/cerc-io/stack-orchestrator', - py_modules = ['cli', 'app'], - packages = find_packages(), - install_requires = [requirements], + name='laconic-stack-orchestrator', + version='0.0.5', + author='Cerc', + author_email='info@cerc.io', + license='GNU Affero General Public License', + description='Orchestrates deployment of the Laconic stack', + long_description=long_description, + long_description_content_type="text/markdown", + url='https://github.com/cerc-io/stack-orchestrator', + py_modules=['cli', 'app'], + packages=find_packages(), + install_requires=[requirements], python_requires='>=3.7', classifiers=[ "Programming Language :: Python :: 3.8", "Operating System :: OS Independent", ], - entry_points = { + entry_points={ 'console_scripts': ['laconic-so=cli:cli'], } ) diff --git a/tox.ini b/tox.ini new file mode 100644 index 00000000..342e57b0 --- /dev/null +++ b/tox.ini @@ -0,0 +1,6 @@ +[flake8] +extend-ignore = E203 +exclude = .git,__pycache__,docs/source/conf.py,old,build,dist,venv +max-complexity = 10 +max-line-length = 132 +