8000 Introduce a mixin class for Java dependent packages · localstack/localstack@06e75df · GitHub
[go: up one dir, main page]

Skip to content

Commit 06e75df

Browse files
Introduce a mixin class for Java dependent packages
1 parent 07e9675 commit 06e75df

File tree

8 files changed

+51
-37
lines changed

8 files changed

+51
-37
lines changed

localstack-core/localstack/packages/java.py

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,41 @@
2525
}
2626

2727

28+
class JavaInstallerMixin:
29+
"""
30+
Mixin class for packages that depend on Java. It introduces methods that install Java and help build environment.
31+
"""
32+
33+
def _prepare_installation(self, target: InstallTarget) -> None:
34+
java_package.install(target=target)
35+
36+
def get_java_home(self) -> str | None:
37+
"""
38+
Returns path to JRE installation.
39+
"""
40+
return java_package.get_installer().get_java_home()
41+
42+
def get_java_env_vars(self, path: str = None) -> dict[str, str]:
43+
"""
44+
Returns environment variables pointing to the Java installation. This is useful to build the environment where
45+
the application will run.
46+
47+
:param path: If not specified, the value of PATH will be obtained from the environment
48+
:return: dict consisting of two items:
49+
- JAVA_HOME: path to JRE installation
50+
- PATH: the env path variable updated with JRE bin path
51+
"""
52+
java_home = self.get_java_home()
53+
java_bin = f"{java_home}/bin"
54+
55+
path = path or os.environ["PATH"]
56+
57+
return {
58+
"JAVA_HOME": java_home,
59+
"PATH": f"{java_bin}:{path}",
60+
}
61+
62+
2863
class JavaPackageInstaller(ArchiveDownloadAndExtractInstaller):
2964
def __init__(self, version: str):
3065
super().__init__("java", version, extract_single_directory=True)
@@ -81,7 +116,7 @@ def _post_process(self, target: InstallTarget) -> None:
81116
rm_rf(target_directory)
82117
os.rename(minimal_jre_path, target_directory)
83118

84-
def get_java_home(self) -> str:
119+
def get_java_home(self) -> str | None:
85120
"""
86121
Get JAVA_HOME for this installation of Java.
87122
"""

localstack-core/localstack/services/dynamodb/packages.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from localstack import config
55
from localstack.constants import ARTIFACTS_REPO, MAVEN_REPO_URL
66
from localstack.packages import InstallTarget, Package, PackageInstaller
7-
from localstack.packages.java import java_package
7+
from localstack.packages.java import JavaInstallerMixin
88
from localstack.utils.archives import (
99
download_and_extract_with_retry,
1010
update_jar_manifest,
@@ -38,13 +38,10 @@ def get_versions(self) -> List[str]:
3838
return ["latest"]
3939

4040

41-
class DynamoDBLocalPackageInstaller(PackageInstaller):
41+
class DynamoDBLocalPackageInstaller(JavaInstallerMixin, PackageInstaller):
4242
def __init__(self):
4343
super().__init__("dynamodb-local", "latest")
4444

45-
def _prepare_installation(self, target: InstallTarget) -> None:
46-
java_package.install(target=target)
47-
4845
def _install(self, target: InstallTarget):
4946
# download and extract archive
5047
tmp_archive = os.path.join(config.dirs.cache, "localstack.ddb.zip")

localstack-core/localstack/services/dynamodb/server.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from localstack.aws.forwarder import AwsRequestProxy
88
from localstack.config import is_env_true
99
from localstack.constants import DEFAULT_AWS_ACCOUNT_ID
10-
from localstack.packages.java import java_package
1110
from localstack.services.dynamodb.packages import dynamodblocal_package
1211
from localstack.utils.common import TMP_THREADS, ShellCommandThread, get_free_tcp_port, mkdir
1312
from localstack.utils.functions import run_safe
@@ -151,17 +150,13 @@ def _create_shell_command(self) -> list[str]:
151150
return cmd + parameters
152151

153152
def do_start_thread(self) -> FuncThread:
154-
dynamodblocal_package.install()
155-
156-
java_home = java_package.get_installer().get_java_home()
157-
158-
path = f"{java_home}/bin:{os.getenv('PATH')}"
153+
dynamodblocal_installer = dynamodblocal_package.get_installer()
154+
dynamodblocal_installer.install()
159155

160156
cmd = self._create_shell_command()
161157
env_vars = {
162158
"DDB_LOCAL_TELEMETRY": "0",
163-
"JAVA_HOME": java_home,
164-
"PATH": path,
159+
**dynamodblocal_installer.get_java_env_vars(),
165160
}
166161

167162
LOG.debug("Starting DynamoDB Local: %s", cmd)

localstack-core/localstack/services/events/event_ruler.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from pathlib import Path
55
from typing import Tuple
66

7-
from localstack.packages.java import java_package
87
from localstack.services.events.models import InvalidEventPatternException
98
from localstack.services.events.packages import event_ruler_package
109
from localstack.utils.objects import singleton_factory
@@ -44,7 +43,7 @@ def get_jpype_lib_paths() -> Tuple[Path, Path]:
4443
installer = event_ruler_package.get_installer()
4544
installer.install()
4645

47-
java_home = java_package.get_installer(installer.java_version).get_java_home()
46+
java_home = installer.get_java_home()
4847
jvm_lib = Path(java_home) / "lib" / "server" / "libjvm.so"
4948

5049
return jvm_lib, Path(installer.get_installed_dir())

localstack-core/localstack/services/events/packages.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
from localstack.packages import InstallTarget, Package, PackageInstaller
1+
from localstack.packages import Package, PackageInstaller
22
from localstack.packages.core import MavenPackageInstaller
3-
from localstack.packages.java import java_package
3+
from localstack.packages.java import JavaInstallerMixin
44

55
# Map of Event Ruler version to Jackson version
66
# https://central.sonatype.com/artifact/software.amazon.event.ruler/event-ruler
@@ -23,18 +23,16 @@ def _get_installer(self, version: str) -> PackageInstaller:
2323
return EventRulerPackageInstaller(version)
2424

2525

26-
class EventRulerPackageInstaller(MavenPackageInstaller):
26+
class EventRulerPackageInstaller(JavaInstallerMixin, MavenPackageInstaller):
2727
def __init__(self, version: str):
2828
jackson_version = EVENT_RULER_VERSIONS[version]
29+
2930
super().__init__(
3031
f"pkg:maven/software.amazon.event.ruler/event-ruler@{version}",
3132
f"pkg:maven/com.fasterxml.jackson.core/jackson-annotations@{jackson_version}",
3233
f"pkg:maven/com.fasterxml.jackson.core/jackson-core@{jackson_version}",
3334
f"pkg:maven/com.fasterxml.jackson.core/jackson-databind@{jackson_version}",
3435
)
3536

36-
def _prepare_installation(self, target: InstallTarget) -> None:
37-
java_package.install(target=target)
38-
3937

4038
event_ruler_package = EventRulerPackage()

localstack-core/localstack/services/stepfunctions/legacy/stepfunctions_starter.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import logging
2-
import os
32
import threading
43
from typing import Any, Dict
54

65
from localstack import config
7-
from localstack.packages.java import java_package
86
from localstack.services.stepfunctions.packages import stepfunctions_local_package
97
from localstack.utils.aws import aws_stack
108
from localstack.utils.net import get_free_tcp_port, port_can_be_bound
@@ -44,17 +42,14 @@ def do_start_thread(self) -> FuncThread:
4442
return t
4543

4644
def generate_env_vars(self) -> Dict[str, Any]:
47-
java_home = java_package.get_installer().get_java_home()
48-
49-
path = f"{java_home}/bin:{os.getenv('PATH')}"
45+
sfn_local_installer = stepfunctions_local_package.get_installer()
5046

5147
return {
48+
**sfn_local_installer.get_java_env_vars(),
5249
"EDGE_PORT": config.GATEWAY_LISTEN[0].port,
5350
"EDGE_PORT_HTTP": config.GATEWAY_LISTEN[0].port,
5451
"DATA_DIR": config.dirs.data,
55-
"JAVA_HOME": java_home,
5652
"PORT": self._port,
57-
"PATH": path,
5853
}
5954

6055
def generate_shell_command(self) -> str:

localstack-core/localstack/services/stepfunctions/packages.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from localstack.constants import ARTIFACTS_REPO, MAVEN_REPO_URL
1010
from localstack.packages import InstallTarget, Package, PackageInstaller
1111
from localstack.packages.core import ExecutableInstaller
12-
from localstack.packages.java import java_package
12+
from localstack.packages.java import JavaInstallerMixin
1313
from localstack.utils.archives import add_file_to_jar, untar, update_jar_manifest
1414
from localstack.utils.files import file_exists_not_empty, mkdir, new_tmp_file, rm_rf
1515
from localstack.utils.http import download
@@ -74,13 +74,10 @@ def _get_installer(self, version: str) -> PackageInstaller:
7474
return StepFunctionsLocalPackageInstaller("stepfunctions-local", version)
7575

7676

77-
class StepFunctionsLocalPackageInstaller(ExecutableInstaller):
77+
class StepFunctionsLocalPackageInstaller(JavaInstallerMixin, ExecutableInstaller):
7878
def _get_install_marker_path(self, install_dir: str) -> str:
7979
return os.path.join(install_dir, "StepFunctionsLocal.jar")
8080

81-
def _prepare_installation(self, target: InstallTarget) -> None:
82-
java_package.install(target=target)
83-
8481
def _install(self, target: InstallTarget) -> None:
8582
"""
8683
The StepFunctionsLocal JAR files are downloaded using the artifacts in DockerHub (because AWS only provides an

localstack-core/localstack/utils/kinesis/kinesis_connector.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
CHECKPOINT_SLEEP_SECS = 5
4040
CHECKPOINT_FREQ_SECS = 60
4141

42-
4342
ListenerFunction = Callable[[list], Any]
4443

4544

@@ -247,7 +246,6 @@ def _start_kcl_client_process(
247246
java_installer = java_package.get_installer()
248247
java_installer.install()
249248
java_home = java_installer.get_java_home()
250-
path = f"{java_home}/bin:{os.getenv('PATH')}"
251249

252250
# disable CBOR protocol, enforce use of plain JSON
253251
# TODO evaluate why?
@@ -256,7 +254,7 @@ def _start_kcl_client_process(
256254
"AWS_ACCESS_KEY_ID": account_id,
257255
"AWS_SECRET_ACCESS_KEY": account_id,
258256
"JAVA_HOME": java_home,
259-
"PATH": path,
257+
"PATH": f"{java_home}/bin:{os.getenv('PATH')}",
260258
}
261259

262260
events_file = os.path.join(tempfile.gettempdir(), f"kclipy.{short_uid()}.fifo")

0 commit comments

Comments
 (0)
0