diff --git a/Pipfile b/Pipfile index c6987e4..47b6025 100644 --- a/Pipfile +++ b/Pipfile @@ -5,6 +5,7 @@ name = "pypi" [packages] "delegator.py" = "*" +semver = "*" [dev-packages] black = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 8735ad5..2729509 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "adac48e8ce62bb17d66188bf9b13b819a7bbadec269cafc96dba2e40c682a792" + "sha256": "ddb51aaa9e29c91e0a3a5328aa86a591e428bd035c358c32b78bda0ab5117293" }, "pipfile-spec": 6, "requires": { @@ -37,6 +37,14 @@ "sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f" ], "version": "==0.6.0" + }, + "semver": { + "hashes": [ + "sha256:41c9aa26c67dc16c54be13074c352ab666bce1fa219c7110e8f03374cd4206b0", + "sha256:5b09010a66d9a3837211bb7ae5a20d10ba88f8cb49e92cb139a69ef90d5060d8" + ], + "index": "pypi", + "version": "==2.8.1" } }, "develop": { diff --git a/terrapyn/terraform.py b/terrapyn/terraform.py index f7e3269..9b2487a 100644 --- a/terrapyn/terraform.py +++ b/terrapyn/terraform.py @@ -1,7 +1,9 @@ import os import tempfile +import pathlib import delegator +import semver from . import environment from .exceptions import DependencyNotFound @@ -31,13 +33,17 @@ class BaseCommand: class TerraformInstance(BaseCommand): - def __init__(self, *, environ=None): + def __init__(self, *, working_dir=None, environ=None): self.environ = environment.evaluate(environ=environ) - self.version = None - self.temp_dir = None + self._version = None + self._temp_dir = None + if working_dir: + self._working_dir = pathlib.Path(working_dir) + else: + self._working_dir = None - self._sanity_check() self.setup() + self._sanity_check() def __repr__(self): return f"" @@ -50,16 +56,40 @@ class TerraformInstance(BaseCommand): self.cleanup() def setup(self): - self.temp_dir = tempfile.mkdtemp(suffix="-terraform-plan", prefix="terrapyn-") + if not self.temp_dir and self.temp_dir is not False: + self.temp_dir def cleanup(self): if self.temp_dir: os.rmdir(self.temp_dir) - self.temp_dir = None + self._temp_dir = False + + @property + def version(self): + return f"{self._version['major']}.{self._version['minor']}.{self._version['patch']}" + + @property + def temp_dir(self): + if not self._temp_dir: + self._temp_dir = pathlib.Path(tempfile.mkdtemp(suffix="-terraform-plan", prefix="terrapyn-")) + + return self._temp_dir + + @property + def working_dir(self): + # Make the working directory, if it doesn't already exist. + if self._working_dir: + os.makedirs(self._working_dir, exist_okay=True) + return self._working_dir + else: + return self.temp_dir + + def tf(self, *args, output=True): + # Change to working directory. + os.chdir(self.temp_dir) - def _tf(self, *args, output=True): cmd = [self.environ["TERRAFORM_PATH"]] + list(args) - c = delegator.run(cmd, timeout=self.environ["TERRAPYN_TIMEOUT"]) + c = delegator.run(cmd, timeout=self.environ["TERRAPYN_TIMEOUT"], cwd=self.working_dir) if not output: return c else: @@ -67,4 +97,4 @@ class TerraformInstance(BaseCommand): return c.out.strip() def _sanity_check(self): - self.version = self._tf("--version").split()[1][1:] + self._version = semver.parse(self.tf("--version").split()[1][1:])