Skip to content

Commit 3e36826

Browse files
committed
feat(helmbroker): support raw_values in parameters
1 parent b508c73 commit 3e36826

2 files changed

Lines changed: 69 additions & 20 deletions

File tree

rootfs/helmbroker/tasks.py

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import time
33
import shutil
44
import yaml
5+
import base64
56
import logging
67

78
from openbrokerapi.service_broker import ProvisionDetails, OperationState, \
@@ -10,7 +11,7 @@
1011
from .celery import app
1112
from .utils import get_plan_path, get_chart_path, get_cred_value, \
1213
InstanceLock, dump_instance_meta, dump_binding_meta, load_instance_meta, \
13-
get_instance_file, helm
14+
get_instance_file, helm, dump_raw_values
1415

1516
logger = logging.getLogger(__name__)
1617

@@ -45,11 +46,16 @@ def provision(instance_id: str, details: ProvisionDetails):
4546
"--set",
4647
f"fullnameOverride=helmbroker-{details.context['instance_name']}"
4748
]
48-
49-
for k, v in details.parameters:
50-
args.extend(["--set", f"{k}={v}"])
5149
logger.info(f"helm install parameters :{details.parameters}")
52-
logger.info(f"helm install parameters type:{type(details.parameters)}")
50+
if details.parameters and "rawValues" in details.parameters \
51+
and details.parameters.get("rawValues", ""):
52+
values = str(base64.b64decode(details.parameters["rawValues"]), "utf-8") # noqa
53+
raw_values_file = dump_raw_values(instance_id, values)
54+
args.extend(["-f", raw_values_file])
55+
details.parameters.pop("rawValues")
56+
for k, v in details.parameters.items():
57+
args.extend(["--set", f"{k}={v}"])
58+
logger.info(f"helm install args:{args}")
5359
status, output = helm(instance_id, *args)
5460
data = load_instance_meta(instance_id)
5561
if status != 0:
@@ -92,15 +98,22 @@ def update(instance_id: str, details: UpdateDetails):
9298
"--wait",
9399
"--timeout",
94100
"25m0s",
101+
"--reuse-values",
95102
"-f",
96103
values_file,
97104
"--set",
98105
f"fullnameOverride=helmbroker-{details.context['instance_name']}"
99106
]
100-
for k, v in details.parameters:
101-
args.extend(["--set", f"{k}={v}"])
102107
logger.info(f"helm upgrade parameters: {details.parameters}")
103-
logger.info(f"helm upgrade parameters type: {type(details.parameters)}")
108+
if details.parameters and "rawValues" in details.parameters \
109+
and details.parameters.get("rawValues", ""):
110+
values = str(base64.b64decode(details.parameters["rawValues"]), "utf-8") # noqa
111+
raw_values_file = dump_raw_values(instance_id, values)
112+
args.extend(["-f", raw_values_file])
113+
details.parameters.pop("rawValues")
114+
for k, v in details.parameters.items():
115+
args.extend(["--set", f"{k}={v}"])
116+
logger.info(f"helm upgrade args:{args}")
104117
status, output = helm(instance_id, *args)
105118
if status != 0:
106119
data["last_operation"]["state"] = OperationState.FAILED.value

rootfs/helmbroker/utils.py

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import json
55
import subprocess
66
import time
7+
import base64
8+
import copy
79

810
from jsonschema import validate
911
from .config import INSTANCES_PATH, ADDONS_PATH
@@ -91,6 +93,15 @@ def dump_instance_meta(instance_id, data):
9193
f.write(json.dumps(data, sort_keys=True, indent=2))
9294

9395

96+
def dump_raw_values(instance_id, data):
97+
timestamp = time.time()
98+
instance_path = get_instance_path(instance_id)
99+
file = f"{instance_path}/raw-values-{timestamp}.yaml"
100+
with open(file, "w") as f:
101+
f.write(data)
102+
return file
103+
104+
94105
BINDING_META_SCHEMA = {
95106
"type": "object",
96107
"properties": {
@@ -217,7 +228,7 @@ def get_addon_bindable(service_id):
217228
return service.get('bindable', False)
218229

219230

220-
def get_addon_allow_parameters(service_id):
231+
def get_addon_allow_paras(service_id):
221232
service = get_addon_meta(service_id)
222233
return service.get('allow_parameters', [])
223234

@@ -282,14 +293,39 @@ def verify_parameters(allow_paras, paras):
282293
"""verify parameters allowed or not"""
283294
if not paras or not allow_paras:
284295
return ""
285-
else:
286-
not_allow_paras = []
287-
allow_para_keys = [allow_para["name"] + "." for allow_para in allow_paras] # noqa
288-
para_keys = [k + "." for k in paras]
289-
for para_key in para_keys:
290-
for allow_para_key in allow_para_keys:
291-
# sub string Inclusion relationship
292-
if not para_key.startswith(allow_para_key):
293-
not_allow_paras.append(para_key)
294-
not_allow_keys = ",".split(not_allow_paras)
295-
return not_allow_keys
296+
tmp_paras = copy.deepcopy(paras)
297+
# raw_values
298+
raw_para_keys = []
299+
if "rawValues" in tmp_paras:
300+
raw_values = yaml.safe_load(base64.b64decode(tmp_paras["rawValues"]))
301+
raw_para_keys = raw_values_format_keys(raw_values)
302+
tmp_paras.pop("rawValues")
303+
304+
para_keys = set(list(tmp_paras.keys()) + raw_para_keys)
305+
para_keys = [k + "." for k in para_keys]
306+
allow_para_keys = [allow_para["name"] + "." for allow_para in allow_paras] # noqa
307+
308+
not_allow_paras = []
309+
for para_key in para_keys:
310+
for allow_para_key in allow_para_keys:
311+
# sub string, inclusion relationship
312+
if not para_key.startswith(allow_para_key):
313+
not_allow_paras.append(para_key)
314+
not_allow_keys = ",".join(not_allow_paras)
315+
return not_allow_keys
316+
317+
318+
def raw_values_format_keys(raw_values, prefix=''):
319+
"""
320+
{'a': {'b': 1, 'c': {'d': 2, 'e': 3}}, 'f': 4}
321+
->
322+
['a.b', 'a.c.d', 'a.c.e', 'a.f']
323+
"""
324+
keys = []
325+
for key, value in raw_values.items():
326+
new_prefix = prefix + '.' + key if prefix else key
327+
if isinstance(value, dict):
328+
keys.extend(raw_values_format_keys(value, new_prefix))
329+
else:
330+
keys.append(new_prefix)
331+
return keys

0 commit comments

Comments
 (0)