for name, conf in node.metadata.get('flask').items(): for dep in conf.get('apt_dependencies', []): pkg_apt[dep] = { 'needed_by': { f'svc_systemd:{name}', }, } directories[f'/opt/{name}'] = { 'owner': conf['user'], 'group': conf['group'], } directories[f'/opt/{name}/src'] = {} git_deploy[f'/opt/{name}/src'] = { 'repo': conf['git_url'], 'rev': conf.get('git_branch', 'master'), 'triggers': [ f'action:flask_{name}_pip_install_deps', *conf.get('deployment_triggers', []), ], } # CONFIG env = conf.get('env', {}) if conf.get('json_config', {}): env['APP_CONFIG'] = f'/opt/{name}/config.json' files[env['APP_CONFIG']] = { 'source': 'flask.cfg', 'context': { 'json_config': conf.get('json_config', {}), }, } if 'APP_CONFIG' in env: files[env['APP_CONFIG']].update({ 'content_type': 'mako', 'group': 'www-data', 'needed_by': [ f'svc_systemd:{name}', ], 'triggers': [ f'svc_systemd:{name}:restart', ], }) # secrets if 'secrets.json' in conf: env['APP_SECRETS'] = f'/opt/{name}/secrets.json' files[env['APP_SECRETS']] = { 'content': conf['secrets.json'], 'mode': '0600', 'owner': conf.get('user', 'www-data'), 'group': conf.get('group', 'www-data'), 'needed_by': [ f'svc_systemd:{name}', ], } # VENV actions[f'flask_{name}_create_virtualenv'] = { 'cascade_skip': False, 'command': f'python3 -m venv /opt/{name}/venv', 'unless': f'test -d /opt/{name}/venv', 'needs': [ f'directory:/opt/{name}', 'pkg_apt:python3-venv', ], 'triggers': [ f'action:flask_{name}_pip_install_deps', ], } actions[f'flask_{name}_pip_install_deps'] = { 'cascade_skip': False, 'command': f'/opt/{name}/venv/bin/pip3 install -r /opt/{name}/src/requirements-frozen.txt || /opt/{name}/venv/bin/pip3 install -r /opt/{name}/src/requirements.txt', 'triggered': True, # TODO: https://stackoverflow.com/questions/16294819/check-if-my-python-has-all-required-packages 'needs': [ f'git_deploy:/opt/{name}/src', 'pkg_apt:python3-pip', ], 'triggers': [ f'action:flask_{name}_pip_install_gunicorn', ], } actions[f'flask_{name}_pip_install_gunicorn'] = { 'command': f'/opt/{name}/venv/bin/pip3 install -U gunicorn', 'triggered': True, 'cascade_skip': False, 'needs': [ f'action:flask_{name}_create_virtualenv', ], 'triggers': [ f'action:flask_{name}_pip_install', ], } actions[f'flask_{name}_pip_install'] = { 'command': f'/opt/{name}/venv/bin/pip3 install -e /opt/{name}/src', 'triggered': True, 'cascade_skip': False, 'triggers': [ f'svc_systemd:{name}:restart', ], } # UNIT svc_systemd[name] = { 'needs': [ f'action:flask_{name}_pip_install', f'file:/usr/local/lib/systemd/system/{name}.service', ], }