mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-16 18:22:17 -05:00
Changes generate manifest script to parse variables file as YAML and only add variables to the manifest if they're already listed in the `env` section. This allows us to use a single variables file for all applications and avoid duplicating secrets across multiple files while adding only the relevant secrets to the application manifest.
66 lines
1.6 KiB
Python
Executable File
66 lines
1.6 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import os
|
|
import sys
|
|
|
|
import json
|
|
import yaml
|
|
|
|
|
|
def merge_dicts(a, b):
|
|
if not (isinstance(a, dict) and isinstance(b, dict)):
|
|
raise ValueError("Error merging variables: '{}' and '{}'".format(
|
|
type(a).__name__, type(b).__name__
|
|
))
|
|
|
|
result = a.copy()
|
|
for key, val in b.items():
|
|
if isinstance(result.get(key), dict):
|
|
result[key] = merge_dicts(a[key], b[key])
|
|
else:
|
|
result[key] = val
|
|
|
|
return result
|
|
|
|
|
|
def load_manifest(manifest_file):
|
|
with open(manifest_file) as f:
|
|
manifest = yaml.load(f)
|
|
|
|
if 'inherit' in manifest:
|
|
inherit_file = os.path.join(os.path.dirname(manifest_file), manifest.pop('inherit'))
|
|
manifest = merge_dicts(load_manifest(inherit_file), manifest)
|
|
|
|
return manifest
|
|
|
|
|
|
def load_variables(vars_files):
|
|
variables = {}
|
|
for vars_file in vars_files:
|
|
with open(vars_file) as f:
|
|
variables = merge_dicts(variables, yaml.load(f))
|
|
|
|
return {
|
|
k.upper(): json.dumps(v) if isinstance(v, (dict, list)) else v
|
|
for k, v in variables.items()
|
|
}
|
|
|
|
|
|
def paas_manifest(manifest_file, *vars_files):
|
|
"""Generate a PaaS manifest file from a Jinja2 template"""
|
|
|
|
manifest = load_manifest(manifest_file)
|
|
variables = load_variables(vars_files)
|
|
|
|
for key in manifest.get('env', {}):
|
|
if key in variables:
|
|
manifest['env'][key] = variables[key]
|
|
|
|
return yaml.dump(manifest, default_flow_style=False, allow_unicode=True)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print('---')
|
|
print(paas_manifest(*sys.argv[1:]))
|