From 15d73a69bdb13f83905142e352323b9f483a226c Mon Sep 17 00:00:00 2001
From: gifrerenom <lluis.gifre@cttc.es>
Date: Tue, 31 Jan 2023 12:15:14 +0000
Subject: [PATCH] WebUI component:

- improved name of drivers in AddDevice form
- removed variable name collision in add device logic
- improved logic to parse connect settings from WebUI
---
 src/webui/service/device/forms.py  |  2 +-
 src/webui/service/device/routes.py | 55 +++++++++++++++---------------
 2 files changed, 29 insertions(+), 28 deletions(-)

diff --git a/src/webui/service/device/forms.py b/src/webui/service/device/forms.py
index cfa741ab3..e0af206b2 100644
--- a/src/webui/service/device/forms.py
+++ b/src/webui/service/device/forms.py
@@ -27,7 +27,7 @@ class AddDeviceForm(FlaskForm):
                         #    choices=[(-1, 'Select...'), (0, 'Undefined'), (1, 'Disabled'), (2, 'Enabled')],
                            coerce=int,
                            validators=[NumberRange(min=0)])
-    device_drivers_undefined = BooleanField('UNDEFINED')
+    device_drivers_undefined = BooleanField('UNDEFINED / EMULATED')
     device_drivers_openconfig = BooleanField('OPENCONFIG')
     device_drivers_transport_api = BooleanField('TRANSPORT_API')
     device_drivers_p4 = BooleanField('P4')
diff --git a/src/webui/service/device/routes.py b/src/webui/service/device/routes.py
index 140efe4b0..baff30348 100644
--- a/src/webui/service/device/routes.py
+++ b/src/webui/service/device/routes.py
@@ -12,14 +12,12 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import json
 from flask import current_app, render_template, Blueprint, flash, session, redirect, url_for
 from common.proto.context_pb2 import (
-    ConfigActionEnum, ConfigRule,
-    Device, DeviceDriverEnum, DeviceId, DeviceList, DeviceOperationalStatusEnum,
-    Empty, TopologyId, ContextId)
+    ConfigActionEnum, Device, DeviceDriverEnum, DeviceId, DeviceList, DeviceOperationalStatusEnum, Empty, TopologyId)
 from common.tools.object_factory.Context import json_context_id
 from common.tools.object_factory.Topology import json_topology_id
-from common.tools.context_queries.Device import add_device_to_topology
 from context.client.ContextClient import ContextClient
 from device.client.DeviceClient import DeviceClient
 from webui.service.device.forms import AddDeviceForm
@@ -62,7 +60,7 @@ def add():
 
     # listing enum values
     form.operational_status.choices = []
-    for key, value in DeviceOperationalStatusEnum.DESCRIPTOR.values_by_name.items():
+    for key, _ in DeviceOperationalStatusEnum.DESCRIPTOR.values_by_name.items():
         form.operational_status.choices.append(
             (DeviceOperationalStatusEnum.Value(key), key.replace('DEVICEOPERATIONALSTATUS_', '')))
 
@@ -71,58 +69,61 @@ def add():
         form.device_type.choices.append((device_type.value,device_type.value))    
 
     if form.validate_on_submit():
-        device = Device()
+        device_obj = Device()
         # Device UUID: 
-        device.device_id.device_uuid.uuid = form.device_id.data
+        device_obj.device_id.device_uuid.uuid = form.device_id.data
 
         # Device type: 
-        device.device_type = str(form.device_type.data)
+        device_obj.device_type = str(form.device_type.data)
 
         # Device configurations: 
-        config_rule = device.device_config.config_rules.add()
+        config_rule = device_obj.device_config.config_rules.add()
         config_rule.action = ConfigActionEnum.CONFIGACTION_SET
         config_rule.custom.resource_key = '_connect/address'
         config_rule.custom.resource_value = form.device_config_address.data
 
-        config_rule = device.device_config.config_rules.add()
+        config_rule = device_obj.device_config.config_rules.add()
         config_rule.action = ConfigActionEnum.CONFIGACTION_SET
         config_rule.custom.resource_key = '_connect/port'
         config_rule.custom.resource_value = form.device_config_port.data
 
-        config_rule = device.device_config.config_rules.add()
+        config_rule = device_obj.device_config.config_rules.add()
         config_rule.action = ConfigActionEnum.CONFIGACTION_SET
         config_rule.custom.resource_key = '_connect/settings'
-        config_rule.custom.resource_value = form.device_config_settings.data
+
+        try:
+            device_config_settings = json.loads(form.device_config_settings.data)
+        except: # pylint: disable=bare-except
+            device_config_settings = form.device_config_settings.data
+
+        if isinstance(device_config_settings, dict):
+            config_rule.custom.resource_value = json.dumps(device_config_settings)
+        else:
+            config_rule.custom.resource_value = str(device_config_settings)
 
         # Device status: 
-        device.device_operational_status = form.operational_status.data
+        device_obj.device_operational_status = form.operational_status.data
 
         # Device drivers: 
         if form.device_drivers_undefined.data:
-            device.device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_UNDEFINED)
+            device_obj.device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_UNDEFINED)
         if form.device_drivers_openconfig.data:
-            device.device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_OPENCONFIG)
+            device_obj.device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_OPENCONFIG)
         if form.device_drivers_transport_api.data:
-            device.device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_TRANSPORT_API)
+            device_obj.device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_TRANSPORT_API)
         if form.device_drivers_p4.data:
-            device.device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_P4)
+            device_obj.device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_P4)
         if form.device_drivers_ietf_network_topology.data:
-            device.device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_IETF_NETWORK_TOPOLOGY)
+            device_obj.device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_IETF_NETWORK_TOPOLOGY)
         if form.device_drivers_onf_tr_352.data:
-            device.device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_ONF_TR_352)
+            device_obj.device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_ONF_TR_352)
         if form.device_drivers_xr.data:
-            device.device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_XR)
+            device_obj.device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_XR)
 
         try:
             device_client.connect()
-            response: DeviceId = device_client.AddDevice(device)
+            response: DeviceId = device_client.AddDevice(device_obj)
             device_client.close()
-            context_uuid = session['context_uuid']
-            topology_uuid = session['topology_uuid']
-            context_client.connect()
-            context_id = ContextId(**json_context_id(context_uuid))
-            add_device_to_topology(context_client, context_id, topology_uuid, device.device_id.device_uuid.uuid)
-            context_client.close()
             flash(f'New device was created with ID "{response.device_uuid.uuid}".', 'success')
             return redirect(url_for('device.home'))
         except Exception as e:
-- 
GitLab