Skip to content

Commit 8100401

Browse files
committed
Add destroy and validate tasks.
1 parent 62f219d commit 8100401

File tree

7 files changed

+750
-102
lines changed

7 files changed

+750
-102
lines changed

src/infrablocks/invoke_terraform/collection.py

Lines changed: 112 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
ApplyConfiguration,
1010
Configuration,
1111
ConfigureFunction,
12+
DestroyConfiguration,
1213
OutputConfiguration,
1314
PlanConfiguration,
15+
ValidateConfiguration,
1416
)
1517
from .factory import TerraformTaskFactory
1618

@@ -22,19 +24,24 @@ class TerraformTaskCollectionParameters(TypedDict, total=False):
2224
task_extra_parameters: dict[str, ParameterList]
2325
task_override_parameters: dict[str, ParameterList]
2426
task_extra_configure_function: dict[str, ConfigureFunction[Any]]
25-
task_override_configure_function: dict[str, ConfigureFunction[Configuration]]
27+
task_override_configure_function: dict[
28+
str, ConfigureFunction[Configuration]
29+
]
2630

2731

2832
class TerraformTaskCollection:
2933
def __init__(
3034
self,
3135
configuration_name: str | None = None,
3236
global_parameters: ParameterList | None = None,
33-
global_configure_function: ConfigureFunction[Configuration] | None = None,
37+
global_configure_function: ConfigureFunction[Configuration]
38+
| None = None,
3439
task_extra_parameters: dict[str, ParameterList] | None = None,
3540
task_override_parameters: dict[str, ParameterList] | None = None,
36-
task_extra_configure_function: dict[str, ConfigureFunction[Any]] | None = None,
37-
task_override_configure_function: dict[str, ConfigureFunction[Any]] | None = None,
41+
task_extra_configure_function: dict[str, ConfigureFunction[Any]]
42+
| None = None,
43+
task_override_configure_function: dict[str, ConfigureFunction[Any]]
44+
| None = None,
3845
task_factory: TerraformTaskFactory = TerraformTaskFactory(),
3946
):
4047
self.configuration_name = configuration_name
@@ -54,12 +61,16 @@ def __init__(
5461
if task_override_parameters is not None
5562
else {}
5663
)
57-
self.task_extra_configure_function: dict[str, ConfigureFunction[Any]] = (
64+
self.task_extra_configure_function: dict[
65+
str, ConfigureFunction[Any]
66+
] = (
5867
task_extra_configure_function
5968
if task_extra_configure_function is not None
6069
else {}
6170
)
62-
self.task_override_configure_function: dict[str, ConfigureFunction[Any]] = (
71+
self.task_override_configure_function: dict[
72+
str, ConfigureFunction[Any]
73+
] = (
6374
task_override_configure_function
6475
if task_override_configure_function is not None
6576
else {}
@@ -108,88 +119,94 @@ def with_global_configure_function(
108119
return self._clone(global_configure_function=global_configure_function)
109120

110121
def with_extra_task_parameters(
111-
self, task_name: str, *parameters: Parameter
122+
self, task_name: str, *parameters: Parameter
112123
) -> Self:
113-
return self._clone(task_extra_parameters={
114-
**self.task_extra_parameters,
115-
task_name: parameters
116-
})
124+
return self._clone(
125+
task_extra_parameters={
126+
**self.task_extra_parameters,
127+
task_name: parameters,
128+
}
129+
)
117130

118131
def with_overridden_task_parameters(
119-
self, task_name: str, *parameters: Parameter
132+
self, task_name: str, *parameters: Parameter
120133
) -> Self:
121-
return self._clone(task_override_parameters={
122-
**self.task_override_parameters,
123-
task_name: parameters
124-
})
134+
return self._clone(
135+
task_override_parameters={
136+
**self.task_override_parameters,
137+
task_name: parameters,
138+
}
139+
)
125140

126141
@overload
127142
def with_extra_task_configure_function(
128-
self,
129-
task_name: Literal["plan"],
130-
task_configure_function: ConfigureFunction[PlanConfiguration]
143+
self,
144+
task_name: Literal["validate"],
145+
task_configure_function: ConfigureFunction[ValidateConfiguration],
131146
) -> Self: ...
132147

133148
@overload
134149
def with_extra_task_configure_function(
135-
self,
136-
task_name: Literal["apply"],
137-
task_configure_function: ConfigureFunction[ApplyConfiguration]
150+
self,
151+
task_name: Literal["plan"],
152+
task_configure_function: ConfigureFunction[PlanConfiguration],
138153
) -> Self: ...
139154

140155
@overload
141156
def with_extra_task_configure_function(
142-
self,
143-
task_name: Literal["output"],
144-
task_configure_function: ConfigureFunction[OutputConfiguration]
157+
self,
158+
task_name: Literal["apply"],
159+
task_configure_function: ConfigureFunction[ApplyConfiguration],
145160
) -> Self: ...
146161

162+
@overload
147163
def with_extra_task_configure_function(
148-
self,
149-
task_name: str,
150-
task_configure_function: ConfigureFunction[Any]
164+
self,
165+
task_name: Literal["destroy"],
166+
task_configure_function: ConfigureFunction[DestroyConfiguration],
167+
) -> Self: ...
168+
169+
@overload
170+
def with_extra_task_configure_function(
171+
self,
172+
task_name: Literal["output"],
173+
task_configure_function: ConfigureFunction[OutputConfiguration],
174+
) -> Self: ...
175+
176+
def with_extra_task_configure_function(
177+
self, task_name: str, task_configure_function: ConfigureFunction[Any]
151178
) -> Self:
152-
return self._clone(task_extra_configure_function={
153-
**self.task_extra_configure_function,
154-
task_name: task_configure_function
155-
})
179+
return self._clone(
180+
task_extra_configure_function={
181+
**self.task_extra_configure_function,
182+
task_name: task_configure_function,
183+
}
184+
)
156185

157186
def with_overridden_task_configure_function(
158-
self,
159-
task_name: str,
160-
task_configure_function: ConfigureFunction[Configuration]
187+
self,
188+
task_name: str,
189+
task_configure_function: ConfigureFunction[Configuration],
161190
) -> Self:
162-
return self._clone(task_override_configure_function={
163-
**self.task_override_configure_function,
164-
task_name: task_configure_function
165-
})
191+
return self._clone(
192+
task_override_configure_function={
193+
**self.task_override_configure_function,
194+
task_name: task_configure_function,
195+
}
196+
)
166197

167198
def _resolve_parameters(self, task_name: str) -> ParameterList:
168199
if task_name in self.task_override_parameters:
169200
return self.task_override_parameters[task_name]
170201

171202
return [
172203
*self.global_parameters,
173-
*self.task_extra_parameters.get(task_name, [])
204+
*self.task_extra_parameters.get(task_name, []),
174205
]
175206

176-
@overload
177-
def _resolve_configure_function(
178-
self, task_name: Literal["plan"]
179-
) -> ConfigureFunction[Configuration]: ...
180-
181-
@overload
182207
def _resolve_configure_function(
183-
self, task_name: Literal["apply"]
184-
) -> ConfigureFunction[Configuration]: ...
185-
186-
@overload
187-
def _resolve_configure_function(
188-
self, task_name: Literal["output"]
189-
) -> ConfigureFunction[Configuration]: ...
190-
191-
def _resolve_configure_function(
192-
self, task_name: str
208+
self,
209+
task_name: Literal["validate", "plan", "apply", "destroy", "output"],
193210
) -> ConfigureFunction[Configuration]:
194211
if task_name in self.task_override_configure_function:
195212
return self.task_override_configure_function[task_name]
@@ -200,28 +217,37 @@ def _resolve_configure_function(
200217
)
201218

202219
specific_configuration_type: (
203-
type[PlanConfiguration] |
204-
type[ApplyConfiguration] |
205-
type[OutputConfiguration]
220+
type[ValidateConfiguration]
221+
| type[PlanConfiguration]
222+
| type[ApplyConfiguration]
223+
| type[DestroyConfiguration]
224+
| type[OutputConfiguration]
206225
)
207-
if task_name == "plan":
208-
specific_configuration_type = PlanConfiguration
209-
elif task_name == "apply":
210-
specific_configuration_type = ApplyConfiguration
211-
elif task_name == "output":
212-
specific_configuration_type = OutputConfiguration
213-
else:
214-
raise ValueError("Unsupported task name: " + task_name)
226+
match task_name:
227+
case "validate":
228+
specific_configuration_type = PlanConfiguration
229+
case "plan":
230+
specific_configuration_type = PlanConfiguration
231+
case "apply":
232+
specific_configuration_type = ApplyConfiguration
233+
case "destroy":
234+
specific_configuration_type = ApplyConfiguration
235+
case "output":
236+
specific_configuration_type = OutputConfiguration
237+
case _:
238+
raise ValueError("Unsupported task name: " + task_name)
215239

216240
def combined_configure_function(
217241
context: Context,
218242
arguments: Arguments,
219-
configuration: Configuration
243+
configuration: Configuration,
220244
):
221245
global_configure_function(context, arguments, configuration)
222246

223247
specific_configuration = specific_configuration_type(configuration)
224-
extra_configure_function(context, arguments, specific_configuration)
248+
extra_configure_function(
249+
context, arguments, specific_configuration
250+
)
225251

226252
configuration.apply_overrides(specific_configuration)
227253

@@ -230,25 +256,39 @@ def combined_configure_function(
230256
def create(self) -> Collection:
231257
collection = Collection(self.configuration_name)
232258

259+
validate_task = self._task_factory.create_validate_task(
260+
self._resolve_configure_function("validate"),
261+
self._resolve_parameters("validate"),
262+
)
233263
plan_task = self._task_factory.create_plan_task(
234264
self._resolve_configure_function("plan"),
235-
self._resolve_parameters("plan")
265+
self._resolve_parameters("plan"),
236266
)
237267
apply_task = self._task_factory.create_apply_task(
238268
self._resolve_configure_function("apply"),
239-
self._resolve_parameters("apply")
269+
self._resolve_parameters("apply"),
270+
)
271+
destroy_task = self._task_factory.create_destroy_task(
272+
self._resolve_configure_function("destroy"),
273+
self._resolve_parameters("destroy"),
240274
)
241275
output_task = self._task_factory.create_output_task(
242276
self._resolve_configure_function("output"),
243-
self._resolve_parameters("output")
277+
self._resolve_parameters("output"),
244278
)
245279

280+
collection.add_task( # pyright: ignore[reportUnknownMemberType]
281+
validate_task
282+
)
246283
collection.add_task( # pyright: ignore[reportUnknownMemberType]
247284
plan_task
248285
)
249286
collection.add_task( # pyright: ignore[reportUnknownMemberType]
250287
apply_task
251288
)
289+
collection.add_task( # pyright: ignore[reportUnknownMemberType]
290+
destroy_task
291+
)
252292
collection.add_task( # pyright: ignore[reportUnknownMemberType]
253293
output_task
254294
)

0 commit comments

Comments
 (0)