|
4 | 4 | import json |
5 | 5 | import subprocess |
6 | 6 | import time |
| 7 | +import base64 |
| 8 | +import copy |
7 | 9 |
|
8 | 10 | from jsonschema import validate |
9 | 11 | from .config import INSTANCES_PATH, ADDONS_PATH |
@@ -91,6 +93,15 @@ def dump_instance_meta(instance_id, data): |
91 | 93 | f.write(json.dumps(data, sort_keys=True, indent=2)) |
92 | 94 |
|
93 | 95 |
|
| 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 | + |
94 | 105 | BINDING_META_SCHEMA = { |
95 | 106 | "type": "object", |
96 | 107 | "properties": { |
@@ -217,7 +228,7 @@ def get_addon_bindable(service_id): |
217 | 228 | return service.get('bindable', False) |
218 | 229 |
|
219 | 230 |
|
220 | | -def get_addon_allow_parameters(service_id): |
| 231 | +def get_addon_allow_paras(service_id): |
221 | 232 | service = get_addon_meta(service_id) |
222 | 233 | return service.get('allow_parameters', []) |
223 | 234 |
|
@@ -282,14 +293,39 @@ def verify_parameters(allow_paras, paras): |
282 | 293 | """verify parameters allowed or not""" |
283 | 294 | if not paras or not allow_paras: |
284 | 295 | 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