Skip to content

Commit 0b84b93

Browse files
authored
Release 2026-09-28 (#918)
1 parent bec1490 commit 0b84b93

6 files changed

Lines changed: 144 additions & 0 deletions

File tree

‎README.md‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,16 @@ Selection based on name `hana` and tags `["hana", "database", "relational"]`.
273273
],
274274
```
275275

276+
#### SAP HANA Client
277+
278+
To include the SAP HANA client JAR (`ngdbc.jar`) in your app's classpath at staging time, set the following environment variable:
279+
280+
```shell
281+
cf set-env <YOUR_APP> MXRUNTIME_IncludeSAPHanaClient true
282+
```
283+
284+
When enabled, the buildpack fetches the latest `ngdbc.jar` from the Mendix CDN and places it in `model/lib/userlib/`, making it available to the Mendix runtime. If the download fails, staging continues without the JAR and a warning is logged.
285+
276286
### Connect an External File Store
277287

278288
The Mendix Runtime supports multiple external file stores: AWS S3, Azure Storage and Swift (Bluemix Object Storage).

‎buildpack/core/runtime.py‎

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import time
1010

1111
import backoff
12+
import glob
13+
import requests
1214
from buildpack import util
1315
from lib.m2ee import M2EE as m2ee_class
1416
from lib.m2ee.version import MXVersion
@@ -56,6 +58,42 @@ def is_version_maintained(version):
5658
return True
5759
return False
5860

61+
def _stage_hana_client(build_dir):
62+
enabled = os.environ.get("MXRUNTIME_IncludeSAPHanaClient", "").strip().lower() == "true"
63+
if not enabled:
64+
return
65+
66+
model_lib = os.path.join(build_dir, "model", "lib")
67+
for lib_dir in ("userlib", "vendorlib"):
68+
existing = glob.glob(os.path.join(model_lib, lib_dir, "ngdbc-*.jar"))
69+
if existing:
70+
logging.info(
71+
"SAP HANA client JAR [%s] already present, skipping download",
72+
existing[0],
73+
)
74+
return
75+
76+
cdn_prefix = util.BLOBSTORE_BUILDPACK_DEFAULT_PREFIX + "sap-hana-client"
77+
try:
78+
dest = os.path.join(model_lib, "userlib")
79+
util.mkdir_p(dest)
80+
version_url = util.get_blobstore_url(f"{cdn_prefix}/version.txt")
81+
resp = requests.get(version_url, timeout=10)
82+
resp.raise_for_status()
83+
jar_name = f"ngdbc-{resp.text.strip()}.jar"
84+
jar_url = util.get_blobstore_url(f"{cdn_prefix}/{jar_name}")
85+
util.download(jar_url, os.path.join(dest, jar_name))
86+
logging.info(
87+
"SAP HANA client JAR [%s] staged to [%s]",
88+
jar_name,
89+
dest,
90+
)
91+
except Exception:
92+
logging.warning(
93+
"Failed to stage SAP HANA client JAR, continuing deployment...",
94+
exc_info=True,
95+
)
96+
5997

6098
def stage(buildpack_dir, build_path, cache_path):
6199
logging.debug("Creating directory structure for Mendix runtime...")
@@ -85,6 +123,7 @@ def stage(buildpack_dir, build_path, cache_path):
85123
util.set_executable(file_path)
86124

87125
resolve_runtime_dependency(buildpack_dir, build_path, cache_path)
126+
_stage_hana_client(build_path)
88127

89128

90129
FORCED_MXRUNTIME_URL_KEY = "FORCED_MXRUNTIME_URL"

‎buildpack/infrastructure/database.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ def init(self):
263263
"ap-south-2": "ap-south-2-bundle.pem",
264264
"ap-southeast-3": "ap-southeast-3-bundle.pem",
265265
"ap-southeast-4": "ap-southeast-4-bundle.pem",
266+
"ap-southeast-7": "ap-southeast-7-bundle.pem",
266267
"ap-south-1": "ap-south-1-bundle.pem",
267268
"ap-northeast-3": "ap-northeast-3-bundle.pem",
268269
"ap-northeast-1": "ap-northeast-1-bundle.pem",
@@ -542,6 +543,7 @@ def stage(buildpack_dir, build_dir):
542543
"ap-south-2": "ap-south-2-bundle.pem",
543544
"ap-southeast-3": "ap-southeast-3-bundle.pem",
544545
"ap-southeast-4": "ap-southeast-4-bundle.pem",
546+
"ap-southeast-7": "ap-southeast-7-bundle.pem",
545547
"ap-south-1": "ap-south-1-bundle.pem",
546548
"ap-northeast-3": "ap-northeast-3-bundle.pem",
547549
"ap-northeast-1": "ap-northeast-1-bundle.pem",
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICtzCCAj2gAwIBAgIQc48r2iRBCPPCj3oRSgZxujAKBggqhkjOPQQDAzCBmzEL
3+
MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x
4+
EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6
5+
b24gUkRTIGFwLXNvdXRoZWFzdC03IFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH
6+
DAdTZWF0dGxlMCAXDTI0MDkxMjE1NTQ0MFoYDzIxMjQwOTEyMTY1NDQwWjCBmzEL
7+
MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x
8+
EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6
9+
b24gUkRTIGFwLXNvdXRoZWFzdC03IFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH
10+
DAdTZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEVSBo1+i/T9w0C7C1qdnl
11+
DfUXpFa+x4QYZvwLtt6m9L96k5irB7Wlw5168uTBW/ssRbv067PBnQEdZfI3iLKK
12+
xWSpDFZN11tRneyDXag/fj1MCzBQ25WG+BitQdbzzuYuo0IwQDAPBgNVHRMBAf8E
13+
BTADAQH/MB0GA1UdDgQWBBTiqTOsp/NisMSxMzARIGIKFcol4TAOBgNVHQ8BAf8E
14+
BAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIxAJlFgjECsVieUHNKE2Cmbj1wujERebHM
15+
YNqCdnO//DeQ6Rh4SJkNaWB9LRmrmsdvIwIwf2iyQNetoO2JWNt7gzdRjO+7dF2+
16+
/LdagQCVp4R2N1Q6xzttRqZEK0lyAd0t7wlX
17+
-----END CERTIFICATE-----
18+
-----BEGIN CERTIFICATE-----
19+
MIIGCTCCA/GgAwIBAgIRAIgSQsm7XtddDiXpo3j09qYwDQYJKoZIhvcNAQEMBQAw
20+
gZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ
21+
bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws
22+
QW1hem9uIFJEUyBhcC1zb3V0aGVhc3QtNyBSb290IENBIFJTQTQwOTYgRzExEDAO
23+
BgNVBAcMB1NlYXR0bGUwIBcNMjQwOTEyMTU1NDM2WhgPMjEyNDA5MTIxNjU0MzZa
24+
MIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg
25+
SW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM
26+
LEFtYXpvbiBSRFMgYXAtc291dGhlYXN0LTcgUm9vdCBDQSBSU0E0MDk2IEcxMRAw
27+
DgYDVQQHDAdTZWF0dGxlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
28+
jLfyuFmUeGd3WSDotJVQ+XjY20Yt75KWDFjXNLNZ7+/97RshOjZ0M3dZ+CcKmIQz
29+
37vjb80kk0p+jeuaLxprWjc5kLJjaFZNPA8mxM/UmARvMvBRrO4uRRRQvYFyXqi+
30+
Frsl46t/+nyarL09ICx/1reZIzsOsI9BcDM0CK1hqQSwrIjOK2mXuHVfrufXjLnR
31+
wZA2rOonQJJAXgOo1RvD11xmOUUIglP2ljAZZskxL+zU8d5k9Ed4HkGsOY3ywbP0
32+
/E+Fd33Gli3EF01wAbIaZL0vuW2rW4oxjh8QW7O7Sfnsr9fdNU2Tye1jSCxle5e3
33+
2Sfq+0Iw5TiT0KYTmcpcKzvljd1wwHdiNKeo7ZCVIer/lGl62PoAb2NWeLepk0IO
34+
IwTZ+Dq76hs9XZJbYxWhXpVcT31b9e3++jROMPz7Mzi/wMg+RBWXgjDuuj1Z16sF
35+
MFfK6QEmD8SOKL3GAKn7PBQxZea+j6iF7G1nGz1/Wfvzz7I8DocnAmQZabKzEnpR
36+
LTEU2LZ86pkeLkM3uI9jm/VWeV4xLv/dC7trDkTUSHpJ4J5/ItMecdAlhCEJ2qM2
37+
x46OUbGYsf9gvacLkqQoS/XFL8R4bxR01URlHU+98yfODBCehulmnKOz3dQOth2c
38+
sF9v2spYG2gmY3jg7N8suvPbzYKWmL7pVCQtqVOZPkkCAwEAAaNCMEAwDwYDVR0T
39+
AQH/BAUwAwEB/zAdBgNVHQ4EFgQUy2Eg468T4F9w7gg9AxeZBj+gjKYwDgYDVR0P
40+
AQH/BAQDAgGGMA0GCSqGSIb3DQEBDAUAA4ICAQCGLMyGrhwhqoDRtJ6gGx1SkJd4
41+
uxG3R4VFKS23JhDJKoDISjcCrVQu5Z3xSj157HmDnc/TEHgW/t1y472QOagzN2RD
42+
9xgFBGfU1sHxKX79WBSf93L3alM+oE1tS+drDlBPV4gzxvCc+zvUYQKWjz/W6q9f
43+
bdrk16J2/yOyli3XpEqf1o4c9FVnAbi9c3zdugfARskwypo2LHDuo8z+u/Ab7j1y
44+
NZ8HtLg/hwVjfSoPLD8guYSZHXYn6ed7AmOUUJjlauWUfCCvU/F+Dk51JMLlVVK+
45+
y9ZgHXa8YDsGsCmpdgfC3MLSEVkx87mxj1rkFLI03q9i6L2BOWQtgd6NmvYd7pJx
46+
cqx6bmSh43CscGDEngIB50XWqXd4QlVKmPPgDnd55szfnNQzzG9q8I9KTEv+B/Ck
47+
apl2XxVAEUdb26Wi7RH+9Wms6HQeU4i7cDuWpm+EfZZmdjwvA4bs3Ox07SkenHqu
48+
Ti6RJf1PiHoE9SHiFUiBnd++YsNByjGqn4Vxla1MlVdkaUMlvvc3/9oky4KfcRdQ
49+
AK7L9cQqf7g6G4Ne5PNvosG3KaS009xSN1AAalTqS9eqrDYR2yZSixmUYqP57Jm5
50+
5ERI+pZi2aKpl0ONC7vKIyH+gxjsRPct4DKoxZnt4/KJYhINOlQz8i/j0jfqftmg
51+
G1bYpbRRbfWoGHjGJA==
52+
-----END CERTIFICATE-----
53+
-----BEGIN CERTIFICATE-----
54+
MIIECDCCAvCgAwIBAgIQTcWg4evi5wHEIHLNrHCqQjANBgkqhkiG9w0BAQsFADCB
55+
nDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu
56+
Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTUwMwYDVQQDDCxB
57+
bWF6b24gUkRTIGFwLXNvdXRoZWFzdC03IFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4G
58+
A1UEBwwHU2VhdHRsZTAgFw0yNDA5MTIxNTU0MzFaGA8yMDY0MDkxMjE2NTQzMVow
59+
gZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ
60+
bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws
61+
QW1hem9uIFJEUyBhcC1zb3V0aGVhc3QtNyBSb290IENBIFJTQTIwNDggRzExEDAO
62+
BgNVBAcMB1NlYXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCS
63+
X21nYtSipOhpdF6QfLE4BTwbtrXCR3EBhOHB1MfwwjNh25uex3X/gHW/sUTgC/oe
64+
Oboi+3I/HN6a5MneTcVVps8AL8rJGym0ShSIYza/3MyT+PtfqDNmYfmF8VRIhNSR
65+
CoYW93F/BoZF7bFk4ljOrBSrRbfb1qmEtkTPNGBRnJ0jh05Fwq5a5XnkGcOGNDyH
66+
kGt9ZaUm+cJmzAa1omHspCjgg6854CNs4k5ovT2vaZ/0yAogdSpkB9INLM0ZMqJ+
67+
QoKAyN6hdISjwEEZrl+0OKymc2jR+NpQcd3378bDIfg3iYvuvTp84kKpZ4gRaukm
68+
mSUg/PQqmGdBlAivOiknAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
69+
BBYEFDsAilCg2DzFiZheGlKVb74AubP2MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
70+
9w0BAQsFAAOCAQEACUGKd2GVv87xnVnPajqbi7GkMd+XGwyG1P8Nkon9rfUgwgHR
71+
dHDsO6jIKf3ZEzNcMgMyV5sXs2944WRhGkYxQ62wbkEaqtjNExmlmUiS3vvrGOfg
72+
BmRhJvAOM5HbNMqmi5BC4GlhHWQKhRbStwhvbVYnARBVfR/Wz4Qb4fizaXbuNWAo
73+
V0XBQc+67lto2eBQ84KQXTp60FdwSBzltbM7sZmp6dMNgnfPNUrdxurVboF+VsxS
74+
3aUJnmEi6TJAGL2SXLermB6HiTgxtxOJUiefu4Ipv0JEg41OzbKWsJXTaSH0QDb1
75+
nSeMyoXqF3ixcAhQbw/7NrzMMlf3NmMaVlohVA==
76+
-----END CERTIFICATE-----

‎etc/telegraf/telegraf.toml.j2‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
numbackends AS connections,
105105
pg_database_size(datname) AS database_size
106106
FROM pg_stat_database
107+
WHERE datname = '{{ db_config["DatabaseName"] }}'
107108
"""
108109
version = 901
109110
withdbname = false
@@ -116,6 +117,7 @@
116117
datname,
117118
deadlocks
118119
FROM pg_stat_database
120+
WHERE datname = '{{ db_config["DatabaseName"] }}'
119121
"""
120122
version = 920
121123
withdbname = false
@@ -128,6 +130,7 @@
128130
datname,
129131
2^31 - age(datfrozenxid) AS before_xid_wraparound
130132
FROM pg_database
133+
WHERE datname = '{{ db_config["DatabaseName"] }}'
131134
"""
132135
version = 901
133136
withdbname = false
@@ -175,6 +178,7 @@
175178
MAX(setting) AS max_connections,
176179
SUM(numbackends)/MAX(setting) AS percent_usage_connections
177180
FROM pg_stat_database, max_con
181+
WHERE datname = '{{ db_config["DatabaseName"] }}'
178182
"""
179183
version = 901
180184
withdbname = false
@@ -216,6 +220,7 @@
216220
tup_returned AS rows_returned_rate,
217221
tup_updated AS rows_updated_rate
218222
FROM pg_stat_database
223+
WHERE datname = '{{ db_config["DatabaseName"] }}'
219224
"""
220225
version = 901
221226
withdbname = false
@@ -228,6 +233,7 @@
228233
datname,
229234
temp_files AS temp_files_rate
230235
FROM pg_stat_database
236+
WHERE datname = '{{ db_config["DatabaseName"] }}'
231237
"""
232238
version = 920
233239
withdbname = false

‎tests/unit/test_db_rds.py‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,14 @@ def test_rds_testfree_postgres_urlencoded(self):
9999
assert config["DatabaseJdbcUrl"].find("sslmode") >= 0
100100
assert config["DatabaseUserName"] == "ua98s7?ananla"
101101
assert config["DatabasePassword"] == "na8na+nlay&aona0--anbs"
102+
103+
def test_rds_ap_southeast_7_uses_regional_certificate(self):
104+
os.environ["VCAP_SERVICES"] = self.rds_vcap_example.replace(
105+
"eu-west-1", "ap-southeast-7"
106+
)
107+
108+
factory = DatabaseConfigurationFactory()
109+
110+
config = factory.get_instance().get_m2ee_configuration()
111+
112+
assert "ap-southeast-7-bundle.pem" in config["DatabaseJdbcUrl"]

0 commit comments

Comments
 (0)