-
Notifications
You must be signed in to change notification settings - Fork 2
/
manage.py
145 lines (100 loc) · 4.22 KB
/
manage.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/usr/bin/env python
# -*- coding: $utf-8 -*-
import json
import os
import subprocess
from pathlib import Path
import click
import yaml
from commons.aws.ssm_helper import get_parameters_by_path
def _print_block(string):
click.echo(click.style("\n" + "*" * (len(string) + 4), fg="yellow"))
click.echo(click.style("* " + string + " *", fg="yellow"))
click.echo(click.style("*" * (len(string) + 4) + "\n", fg="yellow"))
def _get_all_parameters(current_stage):
# Get all the params for posifi
parameters = get_parameters_by_path('/posifi/')
stages = ['prod', 'test', 'dev']
# Default stage to 'dev'
if current_stage not in stages:
current_stage = 'dev'
# Move all the stage-specific settings to the root
if current_stage in parameters:
for key in parameters[current_stage]:
if key in parameters:
parameters[key].update(parameters[current_stage][key])
else:
parameters[key] = parameters[current_stage][key]
# Delete the settings under any stage
for stage in stages:
if stage in parameters:
del parameters[stage]
return parameters
def _download_settings_from_ssm(stage, file_name='settings.json', include_commit_hash=False):
_print_block(f'Downloading setting params from SSM Parameter Store for stage "{stage}"')
# get parameters and secrets from SSM
parameters = _get_all_parameters(stage)
# get commit hash and add it to the params
if include_commit_hash:
commit_hash = os.popen('git rev-parse HEAD').read().strip()
parameters.update({'commit_hash': commit_hash})
# save settings and secrets into a settings JSON file
settings_json = {
'parameters': parameters
}
file_path = Path('./commons') / file_name
with file_path.open("w", encoding="utf-8") as file:
json.dump(settings_json, file, indent=4)
@click.group()
def manage():
pass
@manage.group()
def posifi():
pass
@manage.command()
@click.option("-s", "--stage")
def download_params(stage):
_download_settings_from_ssm(stage, include_commit_hash=True)
click.echo(click.style(f"\nOK - '{stage}' params were succesfully downloaded\n", fg="green"))
@posifi.command(name="deploy")
@click.option("-f", "--function-name", help="function name")
@click.option("-s", "--stage", default="dev", help="Stage ['dev'(def), 'prod']")
def deploy_api(function_name, stage):
_download_settings_from_ssm(stage, include_commit_hash=True)
_check_requirements()
if function_name is None:
_print_block(f"Deploying stage {stage}")
os.system(f"sls deploy -s {stage}")
elif function_name == 'all':
_print_block(f"Deploying all functions to stage {stage}")
with open("serverless.yml") as serverles_yml:
serverless_data = yaml.load(serverles_yml)
defined_functions = serverless_data.get("functions", {}).keys()
processes = [
subprocess.Popen(f"sls deploy -s {stage} -f {function_name}".split(' '))
for function_name in defined_functions
]
for process in processes:
process.wait()
else:
_print_block(f"Deploying function {function_name} to stage {stage}")
os.system(f"sls deploy -s {stage} -f {function_name}")
_print_block(f"Deploy process completed")
def _check_requirements():
new_requirements = os.popen("pipenv lock --requirements").read()
old_requirements = []
try:
with open('.requirements.lock', 'r') as requirements:
old_requirements = requirements.read()
except Exception:
pass
if new_requirements != old_requirements:
_print_block("Requirements differ, packaging new requirements...")
with open('.requirements.lock', 'w') as requirements:
requirements.write(new_requirements)
os.system(f"rm -r .requirements")
os.system("docker run -v \"$PWD\":/var/task -it lambci/lambda:build-python3.7 "
"pip install v -r .requirements.lock -t .requirements")
os.system('find .requirements -name "*.py[c|o]" -delete -empty -or -name "*.dist-info*" -exec rm -r "{}" \; -or -name "*__pycache__*" -delete')
if __name__ == "__main__":
manage()