automation: establish an automation framework
This commit is contained in:
parent
1b53bf451c
commit
8abe5d60fa
31 changed files with 586 additions and 274 deletions
|
@ -1,6 +1,6 @@
|
|||
import json
|
||||
import subprocess
|
||||
from typing import Dict, Any, Optional
|
||||
from typing import Any, Dict, List, Optional, Tuple
|
||||
|
||||
import jinja2
|
||||
|
||||
|
@ -18,20 +18,27 @@ class TerraformAutomation(BaseAutomation):
|
|||
Default parallelism for remote API calls.
|
||||
"""
|
||||
|
||||
def automate(self):
|
||||
self.tf_prehook()
|
||||
def automate(self, full: bool = False):
|
||||
prehook_result = self.tf_prehook()
|
||||
self.tf_generate()
|
||||
self.tf_init()
|
||||
self.tf_apply(refresh=False)
|
||||
self.tf_posthook()
|
||||
returncode, logs = self.tf_apply(refresh=full)
|
||||
self.tf_posthook(prehook_result=prehook_result)
|
||||
return True if returncode == 0 else False, logs
|
||||
|
||||
def tf_apply(self, refresh: bool = True, parallelism: Optional[int] = None):
|
||||
def tf_apply(self, refresh: bool = True, parallelism: Optional[int] = None) -> Tuple[int, List[Dict[str, Any]]]:
|
||||
if not parallelism:
|
||||
parallelism = self.parallelism
|
||||
subprocess.run(
|
||||
tf = subprocess.run(
|
||||
['terraform', 'apply', f'-refresh={str(refresh).lower()}', '-auto-approve',
|
||||
f'-parallelism={str(parallelism)}'],
|
||||
cwd=self.working_directory())
|
||||
f'-parallelism={str(parallelism)}', '-json'],
|
||||
cwd=self.working_directory(),
|
||||
stdout=subprocess.PIPE)
|
||||
logs = []
|
||||
for line in tf.stdout.decode('utf-8').split('\n'):
|
||||
if line.strip():
|
||||
logs.append(json.loads(line))
|
||||
return tf.returncode, logs
|
||||
|
||||
def tf_generate(self):
|
||||
raise NotImplementedError()
|
||||
|
@ -56,7 +63,7 @@ class TerraformAutomation(BaseAutomation):
|
|||
# more like JSON-ND, task is to figure out how to yield those records
|
||||
# as plan runs, the same is probably also true for apply
|
||||
|
||||
def tf_posthook(self, prehook_result: Any = None) -> None:
|
||||
def tf_posthook(self, *, prehook_result: Any = None) -> None:
|
||||
"""
|
||||
This hook function is called as part of normal automation, after the
|
||||
completion of :func:`tf_apply`.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue