Skip to content

Commit 2495c06

Browse files
Merge branch 'stable' into rbacmode
2 parents cb1d948 + adbaac5 commit 2495c06

7 files changed

Lines changed: 501 additions & 6 deletions

File tree

.secrets.baseline

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"files": "^.secrets.baseline$",
44
"lines": null
55
},
6-
"generated_at": "2026-06-19T12:37:02Z",
6+
"generated_at": "2026-07-03T11:02:31Z",
77
"plugins_used": [
88
{
99
"name": "AWSKeyDetector"
@@ -178,7 +178,7 @@
178178
"hashed_secret": "a4b48a81cdab1e1a5dd37907d6c85ca1c61ddc7c",
179179
"is_secret": false,
180180
"is_verified": false,
181-
"line_number": 241,
181+
"line_number": 247,
182182
"type": "Secret Keyword",
183183
"verified_result": null
184184
}

src/mas/devops/db2.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,10 @@ def cr_pod_v_matches(cr_k: str, cr_v: str, pod_v: str) -> bool:
189189
# db2 appends something like "/NODE0000/LOGSTREAM0000/" to the cr_v in these cases
190190
return pod_v.startswith(cr_v)
191191

192+
# special case for ENCRLIB — DB2 resolves the symlink and stores the full absolute path, so just check if the library name is present
193+
if cr_k == "ENCRLIB":
194+
return cr_v in pod_v
195+
192196
# Look for e.g. 8192 AUTOMATIC -> AUTOMATIC(8192)
193197
matches = re.search(r"(\d+)\s*AUTOMATIC", cr_v, re.IGNORECASE)
194198
if matches is not None:

src/mas/devops/mas/suite.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,16 @@ def getDefaultStorageClasses(dynClient: DynamicClient) -> SimpleNamespace:
8888
for storageClass in storageClasses:
8989
if storageClass.metadata.name in ["ibmc-block-gold", "ibmc-file-gold-gid"]:
9090
result.provider = "ibmc"
91-
result.providerName = "IBMCloud ROKS"
91+
result.providerName = "IBMCloud ROKS Classic"
9292
result.rwo = "ibmc-block-gold"
9393
result.rwx = "ibmc-file-gold-gid"
9494
break
95+
elif storageClass.metadata.name in ["ibmc-vpc-block-10iops-tier", "ibmc-vpc-file-1000-iops"]:
96+
result.provider = "ibmc-vpc"
97+
result.providerName = "IBMCloud ROKS VPC"
98+
result.rwo = "ibmc-vpc-block-10iops-tier"
99+
result.rwx = "ibmc-vpc-file-1000-iops"
100+
break
95101
elif storageClass.metadata.name in [
96102
"ocs-storagecluster-ceph-rbd",
97103
"ocs-storagecluster-cephfs",

src/mas/devops/pre_install.py

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
import logging
1212
import yaml
1313

14+
import re
15+
1416
from os import path, listdir
17+
from packaging.version import Version
1518

1619
from jinja2 import Environment
1720
from kubernetes import client as k8s_client
@@ -86,6 +89,29 @@ def _should_apply_preinstall_mas_rbac_file(fileName: str, adminMode: str) -> boo
8689
return False
8790

8891

92+
def _resolve_rbac_version(rbacDir: str, masVersion: str) -> str | None:
93+
"""Return the highest x.y version directory under rbacDir that is <= masVersion.
94+
95+
Only directories whose names match the 'x.y' pattern are considered.
96+
Returns None if no usable directory exists.
97+
"""
98+
if not path.isdir(rbacDir):
99+
return None
100+
101+
target = Version(masVersion)
102+
best: Version | None = None
103+
104+
for entry in listdir(rbacDir):
105+
if not re.fullmatch(r"\d+\.\d+", entry):
106+
continue
107+
candidate = Version(entry)
108+
if candidate <= target:
109+
if best is None or candidate > best:
110+
best = candidate
111+
112+
return str(best) if best is not None else None
113+
114+
89115
def _collect_preinstall_mas_rbac_files_from_source(
90116
sourceOperatorsRoot: str,
91117
masVersion: str,
@@ -106,11 +132,16 @@ def _collect_preinstall_mas_rbac_files_from_source(
106132
logger.debug(f"Skipping missing operator root {operatorRoot}")
107133
continue
108134

109-
versionDir = path.join(operatorRoot, "rbac", masVersion)
110-
if not path.isdir(versionDir):
111-
logger.debug(f"Skipping missing RBAC version directory {versionDir}")
135+
rbacDir = path.join(operatorRoot, "rbac")
136+
resolvedVersion = _resolve_rbac_version(rbacDir, masVersion)
137+
if resolvedVersion is None:
138+
logger.debug(f"No usable RBAC version directory for {operatorName} at {masVersion} under {rbacDir}")
112139
continue
113140

141+
if resolvedVersion != masVersion:
142+
logger.debug(f"RBAC version resolved: {operatorName} requested={masVersion} resolved={resolvedVersion}")
143+
144+
versionDir = path.join(rbacDir, resolvedVersion)
114145
for manifestName in sorted(listdir(versionDir)):
115146
manifestFile = path.join(versionDir, manifestName)
116147
if not path.isfile(manifestFile):

src/mas/devops/templates/pipelinerun-install.yml.j2

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1005,6 +1005,29 @@ spec:
10051005
value: "{{ aiservice_certificate_issuer }}"
10061006
{%- endif %}
10071007

1008+
# AI Service - Database Configuration
1009+
# -------------------------------------------------------------------------
1010+
{%- if install_db2 is defined %}
1011+
- name: install_db2
1012+
value: "{{ install_db2 }}"
1013+
{%- endif %}
1014+
{%- if aiservice_db_jdbc_url is defined and aiservice_db_jdbc_url != "" %}
1015+
- name: aiservice_db_jdbc_url
1016+
value: "{{ aiservice_db_jdbc_url }}"
1017+
{%- endif %}
1018+
{%- if aiservice_db_username is defined and aiservice_db_username != "" %}
1019+
- name: aiservice_db_username
1020+
value: "{{ aiservice_db_username }}"
1021+
{%- endif %}
1022+
{%- if aiservice_db_password is defined and aiservice_db_password != "" %}
1023+
- name: aiservice_db_password
1024+
value: "{{ aiservice_db_password }}"
1025+
{%- endif %}
1026+
{%- if aiservice_db_ca_cert is defined and aiservice_db_ca_cert != "" %}
1027+
- name: aiservice_db_ca_cert
1028+
value: "{{ aiservice_db_ca_cert }}"
1029+
{%- endif %}
1030+
10081031
{%- endif %}
10091032

10101033
workspaces:

test/src/test_db2.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@
4949
("X", "otherSTRING", "OTHERstring", False),
5050
("X", "other string", "other string", True),
5151
("X", "22", "22", True),
52+
# ENCRLIB — short filename in CR, full absolute path in pod → should pass
53+
("ENCRLIB", "libdb2compr_encr.so", "/opt/ibm/db2/V11.5.0.0/lib64/libdb2compr_encr.so.1", True),
54+
# ENCRLIB — future DB2 version path → should still pass
55+
("ENCRLIB", "libdb2compr_encr.so", "/opt/ibm/db2/V11.5.10.0/lib64/libdb2compr_encr.so.1", True),
56+
# ENCRLIB — completely wrong library → should fail
57+
("ENCRLIB", "libdb2compr_encr.so", "/opt/ibm/db2/V11.5.0.0/lib64/somewronglibrary.so", False),
5258
],
5359
)
5460
def test_cr_pod_v_matches(cr_k, cr_v, pod_v, expected):

0 commit comments

Comments
 (0)