diff --git a/src/webui/service/main/DescriptorTools.py b/src/webui/service/main/DescriptorTools.py index 31bb793d82be604a96a4d67f9fd40a6b4cbc1579..094be2f7d0cfd69ddb5cddc2238e8cec64c75daa 100644 --- a/src/webui/service/main/DescriptorTools.py +++ b/src/webui/service/main/DescriptorTools.py @@ -12,8 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import copy -from typing import Dict, List, Optional, Tuple +import copy, json +from typing import Dict, List, Optional, Tuple, Union def get_descriptors_add_contexts(contexts : List[Dict]) -> List[Dict]: contexts_add = copy.deepcopy(contexts) @@ -49,6 +49,16 @@ def get_descriptors_add_slices(slices : List[Dict]) -> List[Dict]: slices_add.append(slice_copy) return slices_add +TypeResourceValue = Union[str, int, bool, float, dict, list] +def format_custom_config_rules(config_rules : List[Dict]) -> List[Dict]: + for config_rule in config_rules: + if 'custom' not in config_rule: continue + custom_resource_value : TypeResourceValue = config_rule['custom']['resource_value'] + if isinstance(custom_resource_value, (dict, list)): + custom_resource_value = json.dumps(custom_resource_value, sort_keys=True, indent=0) + config_rule['custom']['resource_value'] = custom_resource_value + return config_rules + def split_devices_by_rules(devices : List[Dict]) -> Tuple[List[Dict], List[Dict]]: devices_add = [] devices_config = [] diff --git a/src/webui/service/main/routes.py b/src/webui/service/main/routes.py index 80dfb30c2bdd8d75937611bf0dfbd8e3426e4847..9b1b088579c5b01218316bf1c96b5208ff854609 100644 --- a/src/webui/service/main/routes.py +++ b/src/webui/service/main/routes.py @@ -21,7 +21,7 @@ from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient from slice.client.SliceClient import SliceClient from webui.service.main.DescriptorTools import ( - get_descriptors_add_contexts, get_descriptors_add_services, get_descriptors_add_slices, + format_custom_config_rules, get_descriptors_add_contexts, get_descriptors_add_services, get_descriptors_add_slices, get_descriptors_add_topologies, split_devices_by_rules) from webui.service.main.forms import ContextForm, DescriptorForm @@ -84,6 +84,23 @@ def process_descriptors(descriptors): slices = descriptors.get('slices' , []) connections = descriptors.get('connections', []) + # Format CustomConfigRules in Devices, Services and Slices provided in JSON format + for device in devices: + config_rules = device.get('device_config', {}).get('config_rules', []) + config_rules = format_custom_config_rules(config_rules) + device['device_config']['config_rules'] = config_rules + + for service in services: + config_rules = service.get('service_config', {}).get('config_rules', []) + config_rules = format_custom_config_rules(config_rules) + service['service_config']['config_rules'] = config_rules + + for slice in slices: + config_rules = slice.get('slice_config', {}).get('config_rules', []) + config_rules = format_custom_config_rules(config_rules) + slice['slice_config']['config_rules'] = config_rules + + # Context and Topology require to create the entity first, and add devices, links, services, slices, etc. in a # second stage. contexts_add = get_descriptors_add_contexts(contexts)