Skip to content

Commit bbc5d7f

Browse files
authored
migrate terraform-package from core to terraform-init (#104)
1 parent ee3c93a commit bbc5d7f

File tree

4 files changed

+71
-25
lines changed

4 files changed

+71
-25
lines changed

terraform-init/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ LocalStack Extension for using Terraform files in [init hooks](https://docs.loca
1313
## Usage
1414

1515
* Start localstack with `EXTENSION_AUTO_INSTALL="localstack-extension-terraform-init"`
16-
* Optionally specify `TERRAFORM_VERSION=1.9.5` (currently defaults to 1.5.7)
16+
* Optionally specify `TERRAFORM_VERSION=1.13.2` (currently defaults to 1.5.7)
1717
* Mount a `main.tf` file into `/etc/localstack/init/ready.d`
1818

1919
When LocalStack starts up, it will install the extension, which in turn install `terraform` and `tflocal` into the container.

terraform-init/localstack_terraform_init/extension.py

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
import logging
22
import os
3-
from typing import List
43

54
from localstack import config
65
from localstack.extensions.api import Extension
7-
from localstack.packages import InstallTarget, Package, PackageInstaller
8-
from localstack.packages.core import PythonPackageInstaller
9-
from localstack.packages.terraform import terraform_package
6+
from localstack.packages import InstallTarget
107
from localstack.runtime.init import ScriptRunner
118
from localstack.utils.run import run
129

10+
from .packages import terraform_package, tflocal_package
11+
1312
LOG = logging.getLogger(__name__)
1413

1514

@@ -23,25 +22,6 @@ def on_extension_load(self):
2322
)
2423

2524

26-
class TflocalPackage(Package):
27-
def __init__(self, default_version: str = "0.18.2"):
28-
super().__init__(name="terraform_local", default_version=default_version)
29-
30-
def _get_installer(self, version: str) -> PackageInstaller:
31-
return TflocalPackageInstaller(version)
32-
33-
def get_versions(self) -> List[str]:
34-
return [self.default_version]
35-
36-
37-
class TflocalPackageInstaller(PythonPackageInstaller):
38-
def __init__(self, version: str):
39-
super().__init__("terraform_local", version)
40-
41-
42-
tflocal_package = TflocalPackage()
43-
44-
4525
class TflocalScriptRunner(ScriptRunner):
4626
name = "tflocal"
4727

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import os
2+
import platform
3+
4+
from localstack.packages import InstallTarget, Package, PackageInstaller
5+
from localstack.packages.core import (
6+
ArchiveDownloadAndExtractInstaller,
7+
PythonPackageInstaller,
8+
)
9+
from localstack.utils.files import chmod_r
10+
from localstack.utils.platform import get_arch
11+
12+
TERRAFORM_VERSION = os.getenv("TERRAFORM_VERSION", "1.5.7")
13+
TERRAFORM_URL_TEMPLATE = "https://releases.hashicorp.com/terraform/{version}/terraform_{version}_{os}_{arch}.zip"
14+
TERRAFORM_CHECKSUM_URL_TEMPLATE = (
15+
"https://releases.hashicorp.com/terraform/{version}/terraform_{version}_SHA256SUMS"
16+
)
17+
18+
19+
class TerraformPackage(Package["TerraformPackageInstaller"]):
20+
def __init__(self) -> None:
21+
super().__init__("Terraform", TERRAFORM_VERSION)
22+
23+
def get_versions(self) -> list[str]:
24+
return [TERRAFORM_VERSION]
25+
26+
def _get_installer(self, version: str) -> "TerraformPackageInstaller":
27+
return TerraformPackageInstaller("terraform", version)
28+
29+
30+
class TerraformPackageInstaller(ArchiveDownloadAndExtractInstaller):
31+
def _get_install_marker_path(self, install_dir: str) -> str:
32+
return os.path.join(install_dir, "terraform")
33+
34+
def _get_download_url(self) -> str:
35+
system = platform.system().lower()
36+
arch = get_arch()
37+
return TERRAFORM_URL_TEMPLATE.format(
38+
version=TERRAFORM_VERSION, os=system, arch=arch
39+
)
40+
41+
def _install(self, target: InstallTarget) -> None:
42+
super()._install(target)
43+
chmod_r(self.get_executable_path(), 0o777) # type: ignore[arg-type]
44+
45+
def _get_checksum_url(self) -> str | None:
46+
return TERRAFORM_CHECKSUM_URL_TEMPLATE.format(version=TERRAFORM_VERSION)
47+
48+
49+
class TflocalPackage(Package):
50+
def __init__(self, default_version: str = "0.24.1"):
51+
super().__init__(name="terraform_local", default_version=default_version)
52+
53+
def _get_installer(self, version: str) -> PackageInstaller:
54+
return TflocalPackageInstaller(version)
55+
56+
def get_versions(self) -> list[str]:
57+
return [self.default_version]
58+
59+
60+
class TflocalPackageInstaller(PythonPackageInstaller):
61+
def __init__(self, version: str):
62+
super().__init__("terraform_local", version)
63+
64+
65+
tflocal_package = TflocalPackage()
66+
terraform_package = TerraformPackage()

terraform-init/setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,5 @@ dev =
2222
[options.entry_points]
2323
localstack.extensions =
2424
localstack-terraform-init = localstack_terraform_init.extension:TflocalInitExtension
25-
localstack.init.runner=
25+
localstack.init.runner =
2626
tflocal = localstack_terraform_init.extension:TflocalScriptRunner

0 commit comments

Comments
 (0)