handle backends in init_client

merge-requests/14/merge
Michael Jerger 1 year ago
parent f399d1e637
commit 4a2fa628f1

@ -2,7 +2,7 @@ from pathlib import Path
from dda_python_terraform import Terraform, IsFlagged from dda_python_terraform import Terraform, IsFlagged
from packaging import version from packaging import version
from ..domain import Devops, BuildType from ..domain import Devops, TerraformDomain, BuildType
from ..infrastructure import FileApi, ResourceApi, TerraformApi from ..infrastructure import FileApi, ResourceApi, TerraformApi
@ -58,7 +58,9 @@ class TerraformService:
def rescue_local_state(self, devops: Devops): def rescue_local_state(self, devops: Devops):
terraform_domain = devops.specialized_builds[BuildType.TERRAFORM] terraform_domain = devops.specialized_builds[BuildType.TERRAFORM]
if terraform_domain.is_local_state(): if terraform_domain.is_local_state():
self.file_api.cp(f"{devops.build_path()}/terraform.tfstate", ".", check=False) self.file_api.cp(
f"{devops.build_path()}/terraform.tfstate", ".", check=False
)
def initialize_build_dir(self, devops: Devops): def initialize_build_dir(self, devops: Devops):
terraform = devops.specialized_builds[BuildType.TERRAFORM] terraform = devops.specialized_builds[BuildType.TERRAFORM]
@ -74,12 +76,17 @@ class TerraformService:
# TODO: internal? # TODO: internal?
def init_client(self, devops: Devops): def init_client(self, devops: Devops):
terraform_domain = devops.specialized_builds[BuildType.TERRAFORM] terraform_domain: TerraformDomain = devops.specialized_builds[
BuildType.TERRAFORM
]
terraform = Terraform( terraform = Terraform(
working_dir=devops.build_path(), working_dir=devops.build_path(),
terraform_semantic_version=terraform_domain.tf_terraform_semantic_version, terraform_semantic_version=terraform_domain.tf_terraform_semantic_version,
) )
terraform.init() if terraform_domain.is_local_state():
terraform.init()
else:
terraform.init(backend_config=terraform_domain.backend_config())
self.__print_terraform_command__(terraform, devops) self.__print_terraform_command__(terraform, devops)
if terraform_domain.tf_use_workspace: if terraform_domain.tf_use_workspace:
try: try:

@ -19,19 +19,3 @@ class DigitaloceanBackendPropertiesMixin():
ret.update({"key": self.key}) ret.update({"key": self.key})
ret.update({"region": self.region}) ret.update({"region": self.region})
return ret return ret
def init_client(self):
terraform = Terraform(
working_dir=self.build_path(),
terraform_semantic_version=self.terraform_semantic_version,
)
terraform.init(backend_config=self.backend_config)
self.print_terraform_command(terraform)
if self.use_workspace:
try:
terraform.workspace("select", self.stage)
self.print_terraform_command(terraform)
except:
terraform.workspace("new", self.stage)
self.print_terraform_command(terraform)
return terraform

@ -37,7 +37,9 @@ class Digitalocean(Validateable, CredentialMappingDefault):
def resources_from_package(self) -> Set[str]: def resources_from_package(self) -> Set[str]:
result = {"provider_registry.tf", "do_provider.tf", "do_mixin_vars.tf"} result = {"provider_registry.tf", "do_provider.tf", "do_mixin_vars.tf"}
if self.do_as_backend: if self.do_as_backend:
result.update({"do_backend_properties_vars.tf", "do_backend_with_properties.tf"}) result.update(
{"do_backend_properties_vars.tf", "do_backend_with_properties.tf"}
)
return result return result
def project_vars(self): def project_vars(self):
@ -63,7 +65,7 @@ class Digitalocean(Validateable, CredentialMappingDefault):
"region": self.do_region, "region": self.do_region,
} }
return result return result
def is_local_state(self): def is_local_state(self):
return not self.do_as_backend return not self.do_as_backend

@ -83,10 +83,14 @@ class TerraformDomain(Validateable):
result = result and provider.is_local_state() result = result and provider.is_local_state()
return result return result
def backend_config(self) -> map:
result = {}
for provider in self.providers.values():
result.update(provider.backend_config())
return result
@classmethod @classmethod
def parse_provider_types( def parse_provider_types(cls, tf_provider_types: List[str]) -> List[ProviderType]:
cls, tf_provider_types: List[str]
) -> List[ProviderType]:
result = [] result = []
for provider_type in tf_provider_types: for provider_type in tf_provider_types:
result.append(ProviderType[provider_type]) result.append(ProviderType[provider_type])

@ -100,10 +100,14 @@ def test_should_calculate_resources_from_package():
"do_mixin_vars.tf", "do_mixin_vars.tf",
} == sut.resources_from_package() } == sut.resources_from_package()
sut = TerraformDomain(devops_config({ sut = TerraformDomain(
"tf_provider_types": ["DIGITALOCEAN"], devops_config(
"do_as_backend": True, {
})) "tf_provider_types": ["DIGITALOCEAN"],
"do_as_backend": True,
}
)
)
assert { assert {
"versions.tf", "versions.tf",
"terraform_build_vars.tf", "terraform_build_vars.tf",
@ -143,14 +147,23 @@ def test_should_calculate_resources_from_package():
"my.file", "my.file",
} == sut.resources_from_package() } == sut.resources_from_package()
def test_should_calculate_local_state_handling(): def test_should_calculate_local_state_handling():
sut = TerraformDomain(devops_config({ sut = TerraformDomain(
"tf_provider_types": [], devops_config(
})) {
"tf_provider_types": [],
}
)
)
assert sut.is_local_state() assert sut.is_local_state()
sut = TerraformDomain(devops_config({ sut = TerraformDomain(
"tf_provider_types": ["DIGITALOCEAN"], devops_config(
"do_as_backend": True, {
})) "tf_provider_types": ["DIGITALOCEAN"],
"do_as_backend": True,
}
)
)
assert not sut.is_local_state() assert not sut.is_local_state()

Loading…
Cancel
Save