diff --git a/second.py b/second.py index 6cedf84..f494bb6 100644 --- a/second.py +++ b/second.py @@ -2,12 +2,10 @@ from hashlib import md5 from json import dumps, loads -from os import environ +from os import environ, mkdir from os.path import exists from pathlib import Path -from random import choice from shlex import split -from string import ascii_lowercase from subprocess import run from typing import Dict @@ -38,11 +36,6 @@ APPS_SPEC = { DATA_DIR = Path("./data") -def get_secret(n: int) -> str: - """Generate a ASCII secret that is n chars long.""" - return "".join(choice(ascii_lowercase) for _ in range(n)) - - def clone_app_template(app_name: str) -> None: """Git clone an app template repository.""" clone_path = DATA_DIR / app_name @@ -50,6 +43,12 @@ def clone_app_template(app_name: str) -> None: run(split(f"git clone {clone_url} {clone_path}")) +def create_docker_secret(key: str, value: str) -> None: + """Load a docker secret into swarm.""" + command = f"echo {value} | docker secret create {key} -" + run(command, shell=True) + + def dump_db(db: Dict) -> None: """Dump the database.""" with open(DATA_DIR / "db.json", "w") as handle: @@ -72,18 +71,31 @@ def get_hash(value: str) -> str: return hasher.hexdigest() -def get_swarm_versions(app_name, form_data, env): +def arrange_configs_and_secrets(app_name, form_data, env): """Version secrets and configs for swarm.""" - values = [APPS_SPEC[app_name]["secrets"], APPS_SPEC[app_name]["configs"]] - for value in values: - if value in form_data: - hashed = get_hash(form_data[value]) - env_key = f"{value.upper()}_VERSION" - env[env_key] = f"{value}_{hashed}" + + def _create_versions(values, secrets=False): + """Step through listing and create an env var key/val. + + Takes "app_ini" and produces {"APP_INI_VERSION": "app_ini_laksjdklajsdkla"}. + Hash is based on the value of the input passed in from the form. + """ + for value in values: + if value in form_data: + hashed = get_hash(form_data[value]) + env_key = f"{value.upper()}_VERSION" + env_val = f"{value}_{hashed}" + env[env_key] = env_val + if secrets: + create_docker_secret(env_val, form_data[value]) + + _create_versions(APPS_SPEC[app_name]["configs"]) + _create_versions(APPS_SPEC[app_name]["secrets"], secrets=True) + return env -def stack_deploy(stack_name, app_name, env): +def stack_deploy(app_name, stack_name, env): """Depoy an application to the swarm.""" compose_yml = DATA_DIR / app_name / "compose.yml" command = f"docker stack deploy -c {compose_yml} {stack_name}" @@ -150,10 +162,17 @@ def deploy(app_name): if not form.validate(): return render_template("second/install.html", app_name=app_name, form=form) - env = get_loaded_env(app_name, form.data) - env = get_swarm_versions(app_name, form.data, env) + try: + mkdir(DATA_DIR) + except FileExistsError: + pass - dump_db({fork.data["stack_name"]: form.data}) + clone_app_template(app_name) + + env = get_loaded_env(app_name, form.data) + env = arrange_configs_and_secrets(app_name, form.data, env) + + dump_db({form.data["stack_name"]: form.data}) stack_deploy(app_name, form.data["stack_name"], env)