Skip to content

Commit 7e3c507

Browse files
committed
makes use of workspaces optional and adds reconfigure config
1 parent d7d07cb commit 7e3c507

File tree

4 files changed

+102
-38
lines changed

4 files changed

+102
-38
lines changed

src/infrablocks/invoke_terraform/task_factory.py

Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from dataclasses import dataclass
2-
from typing import Callable
2+
from typing import Callable, Optional
33

44
from invoke.collection import Collection
55
from invoke.context import Context
@@ -9,20 +9,28 @@
99
from infrablocks.invoke_terraform.terraform_factory import TerraformFactory
1010

1111

12+
@dataclass
13+
class InitConfiguration:
14+
backend_config: tf.BackendConfig
15+
reconfigure: bool
16+
17+
1218
@dataclass
1319
class Configuration:
1420
source_directory: str
15-
backend_config: tf.BackendConfig
1621
variables: tf.Variables
17-
workspace: str
22+
workspace: Optional[str]
23+
init_configuration: InitConfiguration
1824

1925
@staticmethod
2026
def create_empty():
2127
return Configuration(
2228
source_directory="",
23-
backend_config={},
2429
variables={},
25-
workspace="default",
30+
workspace=None,
31+
init_configuration=InitConfiguration(
32+
backend_config={}, reconfigure=False
33+
),
2634
)
2735

2836

@@ -59,21 +67,8 @@ def _create_plan(
5967
pre_task_function: PreTaskFunction,
6068
) -> invoke_factory.BodyCallable[None]:
6169
def plan(context: Context, arguments: invoke_factory.Arguments):
62-
configuration = Configuration.create_empty()
63-
pre_task_function(
64-
context,
65-
arguments,
66-
configuration,
67-
)
68-
terraform = self._terraformFactory.build(context)
69-
terraform.init(
70-
chdir=configuration.source_directory,
71-
backend_config=configuration.backend_config,
72-
)
73-
terraform.select_workspace(
74-
configuration.workspace,
75-
chdir=configuration.source_directory,
76-
or_create=True,
70+
(terraform, configuration) = self._pre_command_setup(
71+
pre_task_function, context, arguments
7772
)
7873
terraform.plan(
7974
chdir=configuration.source_directory,
@@ -87,25 +82,40 @@ def _create_apply(
8782
pre_task_function: PreTaskFunction,
8883
) -> invoke_factory.BodyCallable[None]:
8984
def apply(context: Context, arguments: invoke_factory.Arguments):
90-
configuration = Configuration.create_empty()
91-
pre_task_function(
92-
context,
93-
arguments,
94-
configuration,
85+
(terraform, configuration) = self._pre_command_setup(
86+
pre_task_function, context, arguments
9587
)
96-
terraform = self._terraformFactory.build(context)
97-
terraform.init(
88+
terraform.apply(
9889
chdir=configuration.source_directory,
99-
backend_config=configuration.backend_config,
90+
vars=configuration.variables,
10091
)
92+
93+
return apply
94+
95+
def _pre_command_setup(
96+
self,
97+
pre_task_function: PreTaskFunction,
98+
context: Context,
99+
arguments: invoke_factory.Arguments,
100+
) -> tuple[tf.Terraform, Configuration]:
101+
configuration = Configuration.create_empty()
102+
pre_task_function(
103+
context,
104+
arguments,
105+
configuration,
106+
)
107+
terraform = self._terraformFactory.build(context)
108+
terraform.init(
109+
chdir=configuration.source_directory,
110+
backend_config=configuration.init_configuration.backend_config,
111+
reconfigure=configuration.init_configuration.reconfigure,
112+
)
113+
114+
if configuration.workspace is not None:
101115
terraform.select_workspace(
102116
configuration.workspace,
103117
chdir=configuration.source_directory,
104118
or_create=True,
105119
)
106-
terraform.apply(
107-
chdir=configuration.source_directory,
108-
vars=configuration.variables,
109-
)
110120

111-
return apply
121+
return terraform, configuration

src/infrablocks/invoke_terraform/terraform/terraform.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,18 @@ def init(
1818
self,
1919
chdir: Optional[str] = None,
2020
backend_config: Optional[BackendConfig] = {},
21+
reconfigure: Optional[bool] = False,
2122
):
2223
base_command = self._build_base_command(chdir)
2324
command = (
2425
base_command
2526
+ ["init"]
2627
+ self._build_backend_config(backend_config)
2728
)
29+
30+
if reconfigure:
31+
command = command + ["-reconfigure"]
32+
2833
self._executor.execute(command)
2934

3035
def plan(

tests/unit/infrablocks/invoke_terraform/terraform/test_terraform.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,16 @@ def test_init_executes_with_backend_config_path(self):
5555
["terraform", "init", "-backend-config=/some/config.tfvars"]
5656
)
5757

58+
def test_init_executes_with_reconfigure(self):
59+
executor = Mock(spec=Executor)
60+
terraform = Terraform(executor)
61+
62+
terraform.init(reconfigure=True)
63+
64+
executor.execute.assert_called_once_with(
65+
["terraform", "init", "-reconfigure"]
66+
)
67+
5868
def test_plan_executes(self):
5969
executor = Mock(spec=Executor)
6070
terraform = Terraform(executor)

tests/unit/infrablocks/invoke_terraform/test_task_factory.py

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,23 @@ def test_creates_plan_task(self):
3333

3434
assert collection.tasks["plan"] is not None
3535

36-
def test_plan_uses_workspace(self):
36+
def test_plan_does_not_use_workspace_when_not_set(self):
37+
terraform = Mock(spec=tf.Terraform)
38+
task_factory = TaskFactory()
39+
task_factory._terraformFactory = TerraformFactory(terraform)
40+
41+
def pre_task_function(_context, _, configuration: Configuration):
42+
configuration.source_directory = "/some/path"
43+
configuration.workspace = None
44+
45+
collection = task_factory.create("collection", [], pre_task_function)
46+
plan: Task = cast(Task, collection.tasks["plan"])
47+
48+
plan(Context())
49+
50+
terraform.select_workspace.assert_not_called()
51+
52+
def test_plan_uses_workspace_when_set(self):
3753
terraform = Mock(spec=tf.Terraform)
3854
task_factory = TaskFactory()
3955
task_factory._terraformFactory = TerraformFactory(terraform)
@@ -53,6 +69,25 @@ def pre_task_function(_context, _, configuration: Configuration):
5369
workspace, chdir=source_directory, or_create=True
5470
)
5571

72+
def test_plan_initialises_with_reconfigure(self):
73+
terraform = Mock(spec=tf.Terraform)
74+
task_factory = TaskFactory()
75+
task_factory._terraformFactory = TerraformFactory(terraform)
76+
source_directory = "/some/path"
77+
78+
def pre_task_function(_context, _, configuration: Configuration):
79+
configuration.source_directory = source_directory
80+
configuration.init_configuration.reconfigure = True
81+
82+
collection = task_factory.create("collection", [], pre_task_function)
83+
plan: Task = cast(Task, collection.tasks["plan"])
84+
85+
plan(Context())
86+
87+
terraform.init.assert_called_once_with(
88+
chdir=source_directory, backend_config={}, reconfigure=True
89+
)
90+
5691
def test_plan_invokes_init_and_plan(self):
5792
terraform = Mock(spec=tf.Terraform)
5893
task_factory = TaskFactory()
@@ -64,15 +99,17 @@ def test_plan_invokes_init_and_plan(self):
6499
def pre_task_function(_context, _, configuration: Configuration):
65100
configuration.source_directory = source_directory
66101
configuration.variables = variables
67-
configuration.backend_config = backend_config
102+
configuration.init_configuration.backend_config = backend_config
68103

69104
collection = task_factory.create("collection", [], pre_task_function)
70105
plan: Task = cast(Task, collection.tasks["plan"])
71106

72107
plan(Context())
73108

74109
terraform.init.assert_called_once_with(
75-
chdir=source_directory, backend_config=backend_config
110+
chdir=source_directory,
111+
backend_config=backend_config,
112+
reconfigure=False,
76113
)
77114
terraform.plan.assert_called_once_with(
78115
chdir=source_directory, vars=variables
@@ -98,15 +135,17 @@ def test_apply_invokes_init_and_apply(self):
98135
def pre_task_function(_context, _, configuration: Configuration):
99136
configuration.source_directory = source_directory
100137
configuration.variables = variables
101-
configuration.backend_config = backend_config
138+
configuration.init_configuration.backend_config = backend_config
102139

103140
collection = task_factory.create("collection", [], pre_task_function)
104141
apply: Task = cast(Task, collection.tasks["apply"])
105142

106143
apply(Context())
107144

108145
terraform.init.assert_called_once_with(
109-
chdir=source_directory, backend_config=backend_config
146+
chdir=source_directory,
147+
backend_config=backend_config,
148+
reconfigure=False,
110149
)
111150
terraform.apply.assert_called_once_with(
112151
chdir=source_directory, vars=variables

0 commit comments

Comments
 (0)