• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

localstack / localstack / 20565403496

29 Dec 2025 05:11AM UTC coverage: 84.103% (-2.8%) from 86.921%
20565403496

Pull #13567

github

web-flow
Merge 4816837a5 into 2417384aa
Pull Request #13567: Update ASF APIs

67166 of 79862 relevant lines covered (84.1%)

0.84 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

66.04
/localstack-core/localstack/services/dynamodb/packages.py
1
import os
1✔
2

3
from localstack import config
1✔
4
from localstack.constants import ARTIFACTS_REPO, MAVEN_REPO_URL
1✔
5
from localstack.packages import InstallTarget, Package, PackageInstaller
1✔
6
from localstack.packages.java import java_package
1✔
7
from localstack.utils.archives import (
1✔
8
    download_and_extract_with_retry,
9
    update_jar_manifest,
10
    upgrade_jar_file,
11
)
12
from localstack.utils.files import rm_rf, save_file
1✔
13
from localstack.utils.functions import run_safe
1✔
14
from localstack.utils.http import download
1✔
15
from localstack.utils.run import run
1✔
16

17
DDB_AGENT_JAR_URL = f"{ARTIFACTS_REPO}/raw/e4e8c8e294b1fcda90c678ff6af5d5ebe1f091eb/dynamodb-local-patch/target/ddb-local-loader-0.2.jar"
1✔
18
JAVASSIST_JAR_URL = f"{MAVEN_REPO_URL}/org/javassist/javassist/3.30.2-GA/javassist-3.30.2-GA.jar"
1✔
19

20
# URL points to 2.x here - however the latest 3.x builds are available under this URL
21
DDBLOCAL_URL = "https://d1ni2b6xgvw0s0.cloudfront.net/v2.x/dynamodb_local_latest.zip"
1✔
22

23

24
class DynamoDBLocalPackage(Package):
1✔
25
    def __init__(self):
1✔
26
        super().__init__(name="DynamoDBLocal", default_version="2")
1✔
27

28
    def _get_installer(self, _) -> PackageInstaller:
1✔
29
        return DynamoDBLocalPackageInstaller()
1✔
30

31
    def get_versions(self) -> list[str]:
1✔
32
        return ["2"]
1✔
33

34

35
class DynamoDBLocalPackageInstaller(PackageInstaller):
1✔
36
    def __init__(self):
1✔
37
        super().__init__("dynamodb-local", "2")
1✔
38

39
        # DDBLocal v2 requires JRE 17+
40
        # See: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.DownloadingAndRunning.html
41
        self.java_version = "21"
1✔
42

43
    def _prepare_installation(self, target: InstallTarget) -> None:
1✔
44
        java_package.get_installer(self.java_version).install(target)
×
45

46
    def get_java_env_vars(self) -> dict[str, str]:
1✔
47
        java_home = java_package.get_installer(self.java_version).get_java_home()
1✔
48
        path = f"{java_home}/bin:{os.environ['PATH']}"
1✔
49

50
        return {
1✔
51
            "JAVA_HOME": java_home,
52
            "PATH": path,
53
        }
54

55
    def _install(self, target: InstallTarget):
1✔
56
        # download and extract archive
57
        tmp_archive = os.path.join(config.dirs.cache, f"DynamoDBLocal-{self.version}.zip")
×
58
        install_dir = self._get_install_dir(target)
×
59

60
        download_and_extract_with_retry(DDBLOCAL_URL, tmp_archive, install_dir)
×
61
        rm_rf(tmp_archive)
×
62

63
        # Use custom log formatting
64
        log4j2_config = """<?xml version="1.0" encoding="UTF-8"?>
×
65
        <Configuration status="WARN">
66
          <Appenders>
67
            <Console name="Console" target="SYSTEM_OUT">
68
              <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
69
            </Console>
70
          </Appenders>
71
          <Loggers>
72
            <Root level="WARN">
73
              <AppenderRef ref="Console"/>
74
            </Root>
75
          </Loggers>
76
        </Configuration>"""
77
        log4j2_file = os.path.join(install_dir, "log4j2.xml")
×
78
        run_safe(lambda: save_file(log4j2_file, log4j2_config))
×
79
        run_safe(lambda: run(["zip", "-u", "DynamoDBLocal.jar", "log4j2.xml"], cwd=install_dir))
×
80

81
        # Add patch that enables 20+ GSIs
82
        ddb_agent_jar_path = self.get_ddb_agent_jar_path()
×
83
        if not os.path.exists(ddb_agent_jar_path):
×
84
            download(DDB_AGENT_JAR_URL, ddb_agent_jar_path)
×
85

86
        javassit_jar_path = os.path.join(install_dir, "javassist.jar")
×
87
        if not os.path.exists(javassit_jar_path):
×
88
            download(JAVASSIST_JAR_URL, javassit_jar_path)
×
89

90
        # Add javassist in the manifest classpath
91
        update_jar_manifest(
×
92
            "DynamoDBLocal.jar", install_dir, "Class-Path: .", "Class-Path: javassist.jar ."
93
        )
94

95
        ddb_local_lib_dir = os.path.join(install_dir, "DynamoDBLocal_lib")
×
96
        upgrade_jar_file(ddb_local_lib_dir, "slf4j-ext-*.jar", "org/slf4j/slf4j-ext:2.0.13")
×
97

98
    def _get_install_marker_path(self, install_dir: str) -> str:
1✔
99
        return os.path.join(install_dir, "DynamoDBLocal.jar")
1✔
100

101
    def get_ddb_agent_jar_path(self):
1✔
102
        return os.path.join(self.get_installed_dir(), "ddb-local-loader-0.1.jar")
1✔
103

104

105
dynamodblocal_package = DynamoDBLocalPackage()
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc