From 4a2fa628f1d0d877c13b74d8f5610ead00b30c0b Mon Sep 17 00:00:00 2001 From: Michael Jerger Date: Fri, 26 May 2023 14:53:59 +0200 Subject: [PATCH] handle backends in init_client --- .../application/terraform_service.py | 15 +++++--- .../digitalocean_backend_properties_mixin.py | 16 --------- .../ddadevops/domain/provider_digitalocean.py | 6 ++-- src/main/python/ddadevops/domain/terraform.py | 10 ++++-- src/test/python/domain/test_terraform.py | 35 +++++++++++++------ 5 files changed, 46 insertions(+), 36 deletions(-) diff --git a/src/main/python/ddadevops/application/terraform_service.py b/src/main/python/ddadevops/application/terraform_service.py index e500735..5dc3c74 100644 --- a/src/main/python/ddadevops/application/terraform_service.py +++ b/src/main/python/ddadevops/application/terraform_service.py @@ -2,7 +2,7 @@ from pathlib import Path from dda_python_terraform import Terraform, IsFlagged from packaging import version -from ..domain import Devops, BuildType +from ..domain import Devops, TerraformDomain, BuildType from ..infrastructure import FileApi, ResourceApi, TerraformApi @@ -58,7 +58,9 @@ class TerraformService: def rescue_local_state(self, devops: Devops): terraform_domain = devops.specialized_builds[BuildType.TERRAFORM] 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): terraform = devops.specialized_builds[BuildType.TERRAFORM] @@ -74,12 +76,17 @@ class TerraformService: # TODO: internal? def init_client(self, devops: Devops): - terraform_domain = devops.specialized_builds[BuildType.TERRAFORM] + terraform_domain: TerraformDomain = devops.specialized_builds[ + BuildType.TERRAFORM + ] terraform = Terraform( working_dir=devops.build_path(), 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) if terraform_domain.tf_use_workspace: try: diff --git a/src/main/python/ddadevops/digitalocean_backend_properties_mixin.py b/src/main/python/ddadevops/digitalocean_backend_properties_mixin.py index de8128f..61a99a9 100644 --- a/src/main/python/ddadevops/digitalocean_backend_properties_mixin.py +++ b/src/main/python/ddadevops/digitalocean_backend_properties_mixin.py @@ -19,19 +19,3 @@ class DigitaloceanBackendPropertiesMixin(): ret.update({"key": self.key}) ret.update({"region": self.region}) 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 diff --git a/src/main/python/ddadevops/domain/provider_digitalocean.py b/src/main/python/ddadevops/domain/provider_digitalocean.py index 6f3f633..e8cf494 100644 --- a/src/main/python/ddadevops/domain/provider_digitalocean.py +++ b/src/main/python/ddadevops/domain/provider_digitalocean.py @@ -37,7 +37,9 @@ class Digitalocean(Validateable, CredentialMappingDefault): def resources_from_package(self) -> Set[str]: result = {"provider_registry.tf", "do_provider.tf", "do_mixin_vars.tf"} 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 def project_vars(self): @@ -63,7 +65,7 @@ class Digitalocean(Validateable, CredentialMappingDefault): "region": self.do_region, } return result - + def is_local_state(self): return not self.do_as_backend diff --git a/src/main/python/ddadevops/domain/terraform.py b/src/main/python/ddadevops/domain/terraform.py index f373a9e..6c4b8ea 100644 --- a/src/main/python/ddadevops/domain/terraform.py +++ b/src/main/python/ddadevops/domain/terraform.py @@ -83,10 +83,14 @@ class TerraformDomain(Validateable): result = result and provider.is_local_state() return result + def backend_config(self) -> map: + result = {} + for provider in self.providers.values(): + result.update(provider.backend_config()) + return result + @classmethod - def parse_provider_types( - cls, tf_provider_types: List[str] - ) -> List[ProviderType]: + def parse_provider_types(cls, tf_provider_types: List[str]) -> List[ProviderType]: result = [] for provider_type in tf_provider_types: result.append(ProviderType[provider_type]) diff --git a/src/test/python/domain/test_terraform.py b/src/test/python/domain/test_terraform.py index 54b4655..49fd176 100644 --- a/src/test/python/domain/test_terraform.py +++ b/src/test/python/domain/test_terraform.py @@ -100,10 +100,14 @@ def test_should_calculate_resources_from_package(): "do_mixin_vars.tf", } == sut.resources_from_package() - sut = TerraformDomain(devops_config({ - "tf_provider_types": ["DIGITALOCEAN"], - "do_as_backend": True, - })) + sut = TerraformDomain( + devops_config( + { + "tf_provider_types": ["DIGITALOCEAN"], + "do_as_backend": True, + } + ) + ) assert { "versions.tf", "terraform_build_vars.tf", @@ -143,14 +147,23 @@ def test_should_calculate_resources_from_package(): "my.file", } == sut.resources_from_package() + def test_should_calculate_local_state_handling(): - sut = TerraformDomain(devops_config({ - "tf_provider_types": [], - })) + sut = TerraformDomain( + devops_config( + { + "tf_provider_types": [], + } + ) + ) assert sut.is_local_state() - sut = TerraformDomain(devops_config({ - "tf_provider_types": ["DIGITALOCEAN"], - "do_as_backend": True, - })) + sut = TerraformDomain( + devops_config( + { + "tf_provider_types": ["DIGITALOCEAN"], + "do_as_backend": True, + } + ) + ) assert not sut.is_local_state()