init service now uses password resolution

merge-requests/12/head
Michael Jerger 1 year ago
parent ca6b693a9a
commit 57a43085c0

@ -32,8 +32,8 @@ class DevopsFactory:
return devops return devops
def merge(self, input, autorization, context) -> dict: def merge(self, input: dict, context: dict, authorization: dict) -> dict:
pass return {} | input | context | authorization
def __parse_build_types__(self, build_types: List[str]) -> List[BuildType]: def __parse_build_types__(self, build_types: List[str]) -> List[BuildType]:
result = [] result = []

@ -38,19 +38,20 @@ class InitService:
{ {
"gopass_path": "server/meissa/grafana-cloud", "gopass_path": "server/meissa/grafana-cloud",
"gopass_field": "grafana-cloud-user", "gopass_field": "grafana-cloud-user",
"name": "c4k_grafana_cloud_user",
}, },
{ {
"gopass_path": "server/meissa/grafana-cloud", "gopass_path": "server/meissa/grafana-cloud",
"name": "grafana_cloud_password", "name": "c4k_grafana_cloud_password",
}, },
] ]
credentials = Credentials(input, default_mappings) credentials = Credentials(input, default_mappings)
passwords = self.resolve_passwords(credentials) authorization = self.resolve_passwords(credentials)
# merge passwords & input merged = self.devops_factory.merge(input, {}, authorization)
if MixinType.RELEASE in mixin_types: if MixinType.RELEASE in mixin_types:
primary_build_file_id = input.get( primary_build_file_id = merged.get(
"release_primary_build_file", "./project.clj" "release_primary_build_file", "./project.clj"
) )
primary_build_file = self.build_file_repository.get( primary_build_file = self.build_file_repository.get(
@ -58,21 +59,21 @@ class InitService:
) )
version = primary_build_file.get_version() version = primary_build_file.get_version()
return self.devops_factory.build_devops(input, version=version) return self.devops_factory.build_devops(merged, version=version)
def resolve_passwords(self, credentials: Credentials) -> List[str]: def resolve_passwords(self, credentials: Credentials) -> List[str]:
result = {} result = {}
for name in credentials.mappings.keys(): for name in credentials.mappings.keys():
mapping = credentials.mappings[name] mapping = credentials.mappings[name]
env_value = self.environment_api.get(mapping.name_for_environment) env_value = self.environment_api.get(mapping.name_for_environment())
if env_value: if env_value:
result[name] = env_value result[name] = env_value
else: else:
if mapping.gopass_type == GopassType.FIELD: if mapping.gopass_type() == GopassType.FIELD:
result[name] = self.credentials_api.gopass_field_from_path( result[name] = self.credentials_api.gopass_field_from_path(
mapping.gopass_path, mapping.gopass_field mapping.gopass_path, mapping.gopass_field
) )
if mapping.gopass_type == GopassType.PASSWORD: if mapping.gopass_type() == GopassType.PASSWORD:
result[name] = self.credentials_api.gopass_password_from_path( result[name] = self.credentials_api.gopass_password_from_path(
mapping.gopass_path mapping.gopass_path
) )

@ -24,6 +24,12 @@ def devops_config(overrides: dict) -> dict:
"release_current_branch": "my_feature", "release_current_branch": "my_feature",
"release_primary_build_file": "./package.json", "release_primary_build_file": "./package.json",
"release_secondary_build_file": [], "release_secondary_build_file": [],
"credentials_mappings": [
{
"gopass_path": "a/path",
"gopass_field": "a-field",
},
],
} }
input = default.copy() input = default.copy()
input.update(overrides) input.update(overrides)
@ -50,15 +56,21 @@ class BuildFileRepositoryMock:
def write(self, build_file: BuildFile): def write(self, build_file: BuildFile):
pass pass
class EnvironmentApiMock():
class EnvironmentApiMock:
def __init__(self, mappings):
self.mappings = mappings
def get(self, key): def get(self, key):
pass return self.mappings.get(key, None)
class CredentialsApiMock(): class CredentialsApiMock:
def gopass_field_from_path (self, path, field): def __init__(self, mappings):
pass self.mappings = mappings
def gopass_password_from_path (elf, path): def gopass_field_from_path(self, path, field):
pass return self.mappings.get(f"{path}:{field}", None)
def gopass_password_from_path(self, path):
return self.mappings.get(path, None)

@ -30,6 +30,17 @@ def test_should_create_mapping():
assert "GRAFANA_CLOUD_PASSWORD" == sut.name_for_environment() assert "GRAFANA_CLOUD_PASSWORD" == sut.name_for_environment()
assert GopassType.PASSWORD == sut.gopass_type() assert GopassType.PASSWORD == sut.gopass_type()
sut = CredentialMapping(
{
"gopass_path": "server/meissa/grafana-cloud",
"gopass_field": "grafana-cloud-user",
"name": "gfc_user",
}
)
assert "gfc_user" == sut.name_for_input()
assert "GFC_USER" == sut.name_for_environment()
assert GopassType.FIELD == sut.gopass_type()
def test_should_validate_CredentialMapping(): def test_should_validate_CredentialMapping():
sut = CredentialMapping( sut = CredentialMapping(

@ -4,18 +4,49 @@ from src.main.python.ddadevops.domain import (
DevopsFactory, DevopsFactory,
Version, Version,
MixinType, MixinType,
BuildType,
)
from .helper import (
BuildFileRepositoryMock,
EnvironmentApiMock,
CredentialsApiMock,
devops_config,
) )
from .helper import BuildFileRepositoryMock, EnvironmentApiMock, CredentialsApiMock, devops_config
def test_sould_load_build_file(): def test_should_load_build_file():
sut = InitService( sut = InitService(
DevopsFactory(), DevopsFactory(),
BuildFileRepositoryMock(), BuildFileRepositoryMock(),
CredentialsApiMock(), CredentialsApiMock({
EnvironmentApiMock(), "server/meissa/grafana-cloud:grafana-cloud-user": "gopass-gfc-user",
"server/meissa/grafana-cloud": "gopass-gfc-password",
}),
EnvironmentApiMock({}),
) )
assert ( assert (
Version.from_str("1.1.5-SNAPSHOT") Version.from_str("1.1.5-SNAPSHOT")
== sut.initialize(devops_config({})).mixins[MixinType.RELEASE].version == sut.initialize(devops_config({})).mixins[MixinType.RELEASE].version
) )
def test_should_resolve_passwords():
sut = InitService(
DevopsFactory(),
BuildFileRepositoryMock(),
CredentialsApiMock(
{
"server/meissa/grafana-cloud:grafana-cloud-user": "gopass-gfc-user",
"server/meissa/grafana-cloud": "gopass-gfc-password",
}
),
EnvironmentApiMock({"C4K_GRAFANA_CLOUD_USER": "env-gfc-user"}),
)
devops = sut.initialize(devops_config({}))
c4k = devops.specialized_builds[BuildType.C4K]
assert {
"mon-auth": {
"grafana-cloud-password": "gopass-gfc-password",
"grafana-cloud-user": "env-gfc-user",
}
} == c4k.auth()

Loading…
Cancel
Save