* make executabel-name configurable
* mv infra code from app to infra
This commit is contained in:
parent
c23c5287bd
commit
ce2e2635f5
6 changed files with 137 additions and 62 deletions
|
@ -1,11 +1,5 @@
|
|||
from .domain import Build, DockerBuild, C4kBuild
|
||||
from .infrastructure import FileApi, ResourceApi, DockerApi
|
||||
from os import chmod
|
||||
import yaml
|
||||
from .python_util import execute
|
||||
from .credential import gopass_field_from_path, gopass_password_from_path
|
||||
|
||||
|
||||
from .infrastructure import FileApi, ResourceApi, DockerApi, ExecutionApi
|
||||
|
||||
|
||||
class BuildService:
|
||||
|
@ -26,7 +20,7 @@ class DockerBuildService:
|
|||
data = self.resource_api.read_resource(
|
||||
"src/main/resources/docker/" + build.name
|
||||
)
|
||||
self.file_api.write_to_file(build.build_path() + "/" + build.name, data)
|
||||
self.file_api.write_data_to_file(build.build_path() + "/" + build.name, data)
|
||||
|
||||
def __copy_build_resources_from_package__(self, build: DockerBuild):
|
||||
self.__copy_build_resource_file_from_package__(
|
||||
|
@ -62,32 +56,19 @@ class DockerBuildService:
|
|||
def test(self, build: DockerBuild):
|
||||
self.docker_api.test(build.name(), build.build_path())
|
||||
|
||||
# TODO: move infrastructure fktns to infra apis
|
||||
|
||||
class C4kBuildService:
|
||||
def __init__(self):
|
||||
self.file_api = FileApi()
|
||||
self.execution_api = ExecutionApi()
|
||||
|
||||
def write_c4k_config(self, c4k_build: C4kBuild):
|
||||
with open(
|
||||
c4k_build.build.build_path() + "/out_c4k_config.yaml", "w", encoding="utf-8"
|
||||
) as output_file:
|
||||
yaml.dump(c4k_build.config(), output_file)
|
||||
path = c4k_build.build.build_path() + "/out_c4k_config.yaml"
|
||||
self.file_api.write_yaml_to_file(path, c4k_build.config())
|
||||
|
||||
def write_c4k_auth(self, c4k_build: C4kBuild):
|
||||
with open(
|
||||
c4k_build.build.build_path() + "/out_c4k_auth.yaml", "w", encoding="utf-8"
|
||||
) as output_file:
|
||||
yaml.dump(c4k_build.c4k_mixin_auth, output_file)
|
||||
chmod(c4k_build.build.build_path() + "/out_c4k_auth.yaml", 0o600)
|
||||
path = c4k_build.build.build_path() + "/out_c4k_auth.yaml"
|
||||
self.file_api.write_yaml_to_file(path, c4k_build.c4k_mixin_auth)
|
||||
|
||||
def c4k_apply(self, c4k_build: C4kBuild, ry_run=False):
|
||||
module = c4k_build.build.module
|
||||
build_path = c4k_build.build.build_path()
|
||||
cmd = f"c4k-{module}-standalone.jar {build_path}/out_c4k_config.yaml {build_path}/out_c4k_auth.yaml > {build_path}/out_{module}.yaml"
|
||||
output = ""
|
||||
if dry_run:
|
||||
print(cmd)
|
||||
else:
|
||||
output = execute(cmd, True)
|
||||
print(output)
|
||||
return output
|
||||
def c4k_apply(self, c4k_build: C4kBuild, dry_run=False):
|
||||
return self.execution_api.execute(c4k_build.command(), dry_run)
|
||||
|
|
|
@ -3,27 +3,42 @@ from .application import C4kBuildService
|
|||
from .devops_build import DevopsBuild
|
||||
from .credential import gopass_field_from_path, gopass_password_from_path
|
||||
|
||||
def add_c4k_mixin_config(config,
|
||||
c4k_config_dict,
|
||||
c4k_auth_dict,
|
||||
grafana_cloud_user=None,
|
||||
grafana_cloud_password=None,
|
||||
grafana_cloud_url='https://prometheus-prod-01-eu-west-0.grafana.net/api/prom/push'):
|
||||
|
||||
def add_c4k_mixin_config(
|
||||
config,
|
||||
c4k_config_dict,
|
||||
c4k_auth_dict,
|
||||
executabel_name=None,
|
||||
grafana_cloud_user=None,
|
||||
grafana_cloud_password=None,
|
||||
grafana_cloud_url="https://prometheus-prod-01-eu-west-0.grafana.net/api/prom/push",
|
||||
):
|
||||
if not grafana_cloud_user:
|
||||
grafana_cloud_user = gopass_field_from_path(
|
||||
'server/meissa/grafana-cloud', 'grafana-cloud-user')
|
||||
"server/meissa/grafana-cloud", "grafana-cloud-user"
|
||||
)
|
||||
if not grafana_cloud_password:
|
||||
grafana_cloud_password = gopass_password_from_path(
|
||||
'server/meissa/grafana-cloud')
|
||||
c4k_auth_dict.update({'mon-auth': {
|
||||
'grafana-cloud-user': grafana_cloud_user,
|
||||
'grafana-cloud-password': grafana_cloud_password
|
||||
}})
|
||||
c4k_config_dict.update({'mon-cfg': {
|
||||
'grafana-cloud-url': grafana_cloud_url
|
||||
}})
|
||||
config.update({'C4kMixin': {'Config': c4k_config_dict,
|
||||
'Auth': c4k_auth_dict}})
|
||||
"server/meissa/grafana-cloud"
|
||||
)
|
||||
c4k_auth_dict.update(
|
||||
{
|
||||
"mon-auth": {
|
||||
"grafana-cloud-user": grafana_cloud_user,
|
||||
"grafana-cloud-password": grafana_cloud_password,
|
||||
}
|
||||
}
|
||||
)
|
||||
c4k_config_dict.update({"mon-cfg": {"grafana-cloud-url": grafana_cloud_url}})
|
||||
config.update(
|
||||
{
|
||||
"C4kMixin": {
|
||||
"executabel_name": executabel_name,
|
||||
"config": c4k_config_dict,
|
||||
"auth": c4k_auth_dict,
|
||||
}
|
||||
}
|
||||
)
|
||||
return config
|
||||
|
||||
|
||||
|
|
|
@ -71,8 +71,12 @@ class DockerBuild(Validateable):
|
|||
class C4kBuild(Validateable):
|
||||
def __init__(self, build: Build, project, config):
|
||||
self.build = build
|
||||
self.c4k_mixin_config = config["C4kMixin"]["Config"]
|
||||
self.c4k_mixin_auth = config["C4kMixin"]["Auth"]
|
||||
tmp_executabel_name = config["C4kMixin"]["executabel_name"]
|
||||
if not tmp_executabel_name:
|
||||
tmp_executabel_name = self.build.module
|
||||
self.executabel_name = tmp_executabel_name
|
||||
self.c4k_mixin_config = config["C4kMixin"]["config"]
|
||||
self.c4k_mixin_auth = config["C4kMixin"]["auth"]
|
||||
tmp = self.c4k_mixin_config["mon-cfg"]
|
||||
tmp.update({"cluster-name": self.build.module, "cluster-stage": self.build.stage})
|
||||
self.c4k_mixin_config.update({"mon-cfg": tmp})
|
||||
|
@ -85,3 +89,10 @@ class C4kBuild(Validateable):
|
|||
self.c4k_mixin_config.update({'fqdn': fqdn})
|
||||
return self.c4k_mixin_config
|
||||
|
||||
def command(self):
|
||||
module = self.build.module
|
||||
build_path = self.build.build_path()
|
||||
config_path = f"{build_path}/out_c4k_config.yaml"
|
||||
auth_path = f"{build_path}/out_c4k_auth.yaml"
|
||||
output_path = f"{build_path}/out_{module}.yaml"
|
||||
return f"c4k-{self.executabel_name}-standalone.jar {config_path} {auth_path} > {output_path}"
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
from pathlib import Path
|
||||
from sys import stdout
|
||||
from pkg_resources import resource_string
|
||||
from os import chmod
|
||||
import yaml
|
||||
from .python_util import execute
|
||||
|
||||
class ResourceApi():
|
||||
|
@ -18,10 +20,15 @@ class FileApi():
|
|||
def cp_recursive(self, src: str, target_dir: str):
|
||||
execute('cp -r ' + src + ' ' + target_dir, shell=True)
|
||||
|
||||
def write_to_file(self, path: Path, data: bytes):
|
||||
with open(path, "w", encoding=stdout.encoding) as output_file:
|
||||
def write_data_to_file(self, path: Path, data: bytes):
|
||||
with open(path, "w", encoding="utf-8") as output_file:
|
||||
output_file.write(data.decode(stdout.encoding))
|
||||
|
||||
def write_yaml_to_file(self, path: Path, data: map):
|
||||
with open(path, "w", encoding="utf-8") as output_file:
|
||||
yaml.dump(data, output_file)
|
||||
chmod(path, 0o600)
|
||||
|
||||
class DockerApi():
|
||||
def image(self, name: str, path: Path):
|
||||
execute('docker build -t ' + name +
|
||||
|
@ -51,3 +58,13 @@ class DockerApi():
|
|||
execute('docker build -t ' + name + '-test ' +
|
||||
'--file ' + path + '/test/Dockerfile '
|
||||
+ path + '/test', shell=True)
|
||||
|
||||
class ExecutionApi():
|
||||
def execute(command: str, dry_run=False):
|
||||
output = ""
|
||||
if dry_run:
|
||||
print(command)
|
||||
else:
|
||||
output = execute(command, True)
|
||||
print(output)
|
||||
return output
|
|
@ -27,9 +27,7 @@ def test_c4k_mixin(tmp_path):
|
|||
add_c4k_mixin_config(project_config, config, auth, grafana_cloud_user='user', grafana_cloud_password='password')
|
||||
|
||||
assert project_config.get('C4kMixin') is not None
|
||||
assert project_config.get('C4kMixin').get('Config') is config
|
||||
assert project_config.get('C4kMixin').get('Auth') is auth
|
||||
|
||||
|
||||
mixin = MyC4kMixin(project, project_config)
|
||||
mixin.initialize_build_dir()
|
||||
assert mixin.build_path() == f'{tmp_path_str}/{build_dir}/{project_name}/{module_name}'
|
||||
|
|
|
@ -42,11 +42,11 @@ def test_validate_with_reason():
|
|||
|
||||
|
||||
def test_c4k_build_should_update_fqdn(tmp_path):
|
||||
project = Project(str(tmp_path), name='test-project')
|
||||
project = Project(str(tmp_path), name="test-project")
|
||||
project_config = {
|
||||
"stage": "test",
|
||||
"project_root_path": str(tmp_path),
|
||||
"module": 'module',
|
||||
"module": "module",
|
||||
"build_dir_name": "target",
|
||||
}
|
||||
config = {"issuer": "staging"}
|
||||
|
@ -63,21 +63,74 @@ def test_c4k_build_should_update_fqdn(tmp_path):
|
|||
grafana_cloud_password="password",
|
||||
)
|
||||
sut = C4kBuild(Build(project, project_config), project, project_config)
|
||||
sut.update_runtime_config('test.de', None, None)
|
||||
sut.update_runtime_config("test.de", None, None)
|
||||
|
||||
assert {
|
||||
"issuer": "staging",
|
||||
'fqdn': 'test.de',
|
||||
"fqdn": "test.de",
|
||||
"mon-cfg": {
|
||||
"cluster-name": "module",
|
||||
"cluster-stage": "test",
|
||||
"grafana-cloud-url": "https://prometheus-prod-01-eu-west-0.grafana.net/api/prom/push",
|
||||
},
|
||||
} == sut.config()
|
||||
assert {'jicofo-auth-password': 'pw2',
|
||||
'jicofo-component-secret': 'pw3',
|
||||
'jvb-auth-password': 'pw1',
|
||||
'mon-auth': {'grafana-cloud-password': 'password',
|
||||
'grafana-cloud-user': 'user'}} == sut.c4k_mixin_auth
|
||||
assert {
|
||||
"jicofo-auth-password": "pw2",
|
||||
"jicofo-component-secret": "pw3",
|
||||
"jvb-auth-password": "pw1",
|
||||
"mon-auth": {
|
||||
"grafana-cloud-password": "password",
|
||||
"grafana-cloud-user": "user",
|
||||
},
|
||||
} == sut.c4k_mixin_auth
|
||||
|
||||
sut.update_runtime_config
|
||||
|
||||
|
||||
def test_c4k_build_should_calculate_command(tmp_path):
|
||||
project = Project(str(tmp_path), name="test-project")
|
||||
project_config = {
|
||||
"stage": "test",
|
||||
"project_root_path": "",
|
||||
"module": "module",
|
||||
"build_dir_name": "target",
|
||||
}
|
||||
add_c4k_mixin_config(
|
||||
project_config,
|
||||
{},
|
||||
{},
|
||||
grafana_cloud_user="user",
|
||||
grafana_cloud_password="password",
|
||||
)
|
||||
sut = C4kBuild(Build(project, project_config), project, project_config)
|
||||
assert (
|
||||
"c4k-module-standalone.jar "
|
||||
+ "/target/test-project/module/out_c4k_config.yaml "
|
||||
+ "/target/test-project/module/out_c4k_auth.yaml > "
|
||||
+ "/target/test-project/module/out_module.yaml"
|
||||
== sut.command()
|
||||
)
|
||||
|
||||
project_config = {
|
||||
"stage": "test",
|
||||
"project_root_path": "",
|
||||
"module": "module",
|
||||
"build_dir_name": "target",
|
||||
}
|
||||
add_c4k_mixin_config(
|
||||
project_config,
|
||||
{},
|
||||
{},
|
||||
executabel_name = "executabel_name",
|
||||
grafana_cloud_user="user",
|
||||
grafana_cloud_password="password",
|
||||
)
|
||||
sut = C4kBuild(Build(project, project_config), project, project_config)
|
||||
assert (
|
||||
"c4k-executabel_name-standalone.jar "
|
||||
+ "/target/test-project/module/out_c4k_config.yaml "
|
||||
+ "/target/test-project/module/out_c4k_auth.yaml > "
|
||||
+ "/target/test-project/module/out_module.yaml"
|
||||
== sut.command()
|
||||
)
|
||||
|
||||
|
|
Loading…
Reference in a new issue