From 6c6336362efa3fb6260eaa67e26a126bc4d54961 Mon Sep 17 00:00:00 2001
From: ismaeel <mohammad.ismaael@cnit.it>
Date: Wed, 24 Apr 2024 14:37:35 +0000
Subject: [PATCH] reading from context

---
 .context.log.swp                              | Bin 16384 -> 16384 bytes
 .../database/models/OpticalLinkModel.py       |   3 +-
 src/opticalcontroller/OpticalController.py    |  33 ++++++++++++++---
 .../service/ServiceServiceServicerImpl.py     |   4 +--
 .../service/task_scheduler/TaskExecutor.py    |  11 +++---
 src/service/service/tools/OpticalTools.py     |  14 +++++---
 src/service/service/tools/object_uuid.py      |  34 ++++++++++++++++++
 .../templates/opticalconfig/details.html      |  26 +++++++-------
 8 files changed, 95 insertions(+), 30 deletions(-)
 create mode 100644 src/service/service/tools/object_uuid.py

diff --git a/.context.log.swp b/.context.log.swp
index 1d5d6b23da8cf9d7348152649f7e75767b1dbe64..6a5328d3f841c922f1450e5517e2e576a481c914 100644
GIT binary patch
literal 16384
zcmeI3ZHya79mcm!`bG$?5(;W1U@#JQXKr8Zy|ax<6q36TxL&J^)1(|%YrQ)@Z*FgQ
zyE}GriAbdgg$g8)s0vkuD&B-tN}(uxKtK>LqN>_Z5CRJ2P2vMDLMpT+*HCETnf1D7
zyU^^m`2f=F-B0$;|Jj+@=RZ5X87EEcroGpbiegAOu9Bo5zJ8)5@2^P5ezZkmt(cdd
z_kd3BuAWyW9fwfmVw**tY6m`}N0{OT%jdsTD1-yTfmiInR;gs@8n5Opg*TJ!+xEZW
z8bt-d0pWmfKsX>A5Do|jgag6>;lTfo11#Jo-G=U7oObz}>FY%!um4Jq^|bu-Nc{Pc
z_^Gslem&2n@xP?k-J3SpkN-1`OKHJfn|i{2{2yt2b3eX$IR5NN`=7jIIR5vM_{T0C
zj-MNe-+tL}{FyX<wpT12zkE2pp2mNY#^Wo7<7d<Oxir4#Rm1VWjkLdG%W(YZk@n43
z567Pxi5IsH$Dd5&PxOkVH@#*!{?|0VDfM^jmBaBg9ej%@Ij&0I^z)Mzix=U5a6mX9
z91so&2ZRH{0pWmfKsX>A_#bt^awLf_MPJ7kcv#c**Z&V;{dYgO8ED`Q;CEOv9s>u#
zI@Xsz1xG*?{2J@guYqO2*QRH%e!UMI1Uh&cjeHoq9ZZ00z!l(0tdoBMegM7=PJu6j
z&w@L_?cf982si|mz|G)#umc!C0R`|{a2ePHp27P3PvBSJ=im(Z7WfLdAAB0z0ZxJw
zpbOey5gY*T0oMTyOacP7flI(e;4JnB{s?{v9s`en)8GN{Mer$b2RI2%fG%*s`@lgk
z2X+7hD4+nY2A6});2icR{tSKt9tV$t?|`p@2f*jRC%}imNpKXbfLp+O!93Uj44{Al
z*bXiQ7lU=|kNg2V4t@q62HyZ*0$%|4fRBO`;5dkY4Q>JpU=~b+B6usf7Hk2}V_)W3
z@C5iR_%V1Cd>5Pop9h}-9|s=<M?n`H0*hcCyc@g&sGtDe2)2PuU>)Q1De!yn7<d>w
z2)+*P1NVTt!AHPtAOb#Uf_-2Xyc0};F>o#5WB+QfaS-x;iQwp3UWe9*o}8@EwHhht
zhE~9-*NDA<#pD>?|97ok&7rO2&`#&jPUX;=Ike>*+ENa!kwdHJ(B{aSmLqRkj=X6(
z@}}j;o0cPQT8_MFIr66E$eWfuZ%HQXEKggKhfK;O3z?Kj4l*f|3}jL!{%2Aq?q^c=
zCZ%jr{>Wrf_GYha((LBz+1=N(+plN$U(cQZJ$nZ9WcX(@D;fRSq{*a}O*)#_h^_{V
zHbP3HMi@j4A6~sFC9o}TsJPd6CuT#sII{caxVIo=F2By9%yK>c!57h1MB{d&7vcY$
zGYUM9Mx-zGTz@5QIIhhIIW{&_I#wf#zO{<a*201z*9`@h=$fJ{x@IcVRU+eO(I~4s
z!$>tWqfGR2&8XJQ$`UE;o|&7e&k*&7UXSXt`_$dkn{$`jEVNi#)zv!cQF*1Ru4&|5
z_4<t}N(#ipnJn#OEOMJ2MrWcZh-zePKJaOMEu>>4Xda^IZQF{89}ufABx6pq(ei@B
z@mTVgfZHPctl>Ju^+^<4N<XgPkA!%9q6XQl>rqlryH=z!8d>}THT7V_tNu;wdci#<
zTq{fxSVwWs+9Yqlp&n&4X&Hux<T|oSS$n)_Ma%IdDHc}_^LG;)ZFb^F^>~(5&uyyV
z8fyoBNvW!_%cvY$_KLMkW3}a3@k#?Vve4_qD&7R0$fg4wD3^QfyD^Nl+tA+HfjsRA
z>qI_@sn=4R5y6G&n%Z^g;dr1sm1@!*UOZ?<zvCCC)eS?e&>d*JWSB|oha)QtY4jow
zc&{3*j&CzJ@Z-g(<57kBP8hg8TN*DG;hmCbUVg4rv^>xwy;_=jiTrdiPX2RtUfxJ~
zQR`-JbhbJkW`&UvAk`zwrcDerGQJwbj6~F?J|h^D9>KU{ctjTYgDq=idEoJ$G^^$k
znORu4VS$f)+;EM|9I+`L^}r|i?LRQ*ed-r`)5MZQie#bV`>wytuWvIJ)>KtflAjvp
zhbc`Z<2Pau#bj4~VeW0a2n)!q9hbqTBH2xwon^8bIGCz}R*R>7e@ux*!YFV$NwUd-
zeS7x8>Zpsk&-G(QEl1(P13MSy_s;LBk$T&W34Sd+%3bOO;VSo{cZEWB2bgRa>7ZJd
zC3ihoxkE!QSmPI<&LWxdyKWTt{Jb_G<Dq@%0l&*x{#<kGNFkjfH)fXt8TYKCYs3pI
z2iggVum2BWJ^vu!>;L}uyN_VK|2=RT+zYxO1Rl5r%z<mbc5o$l4%eRn52bZ|pVuc2
z;ec>JI3OGl4hRQ?1Hu8}fN(%KARG`5Tu=x2H*mdg;W{1H!KR{PTNW+Rl3X@yQ#Q4x
zDL1WFQ+7&Pb=onfrk&nbJpCP-2ET6L%e-D?grwEkttq`i^@?n3mM)tWyDV2L#<W~5
zmn_59Orzu^TdRaG@Lij3RF|H=WaZOSddWmzjj~mdO<FbNYLhy$U9zissai6tcCx!p
zurUz^`0w&-8`bx3d*k(mK9@@sy@Z>V^{Po_)3K&xt7T|%vxIv$3_7h_*opr)t%epe

literal 16384
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

diff --git a/src/context/service/database/models/OpticalLinkModel.py b/src/context/service/database/models/OpticalLinkModel.py
index 3015f445b..3a300d46b 100644
--- a/src/context/service/database/models/OpticalLinkModel.py
+++ b/src/context/service/database/models/OpticalLinkModel.py
@@ -36,12 +36,13 @@ class SlotType(TypeDecorator):
             slot={}
             for k,v in value.items():
                 slot[k]=v
-            logging.info(f"dict from slotType {slot}")    
+           
             value = json.dumps(slot)
 
         return value
 
     def process_result_value(self, value, dialect):
+        logging.info(f"dict from slotType {value}")    
         if value is not None:
             value = json.loads(value)
         return value
diff --git a/src/opticalcontroller/OpticalController.py b/src/opticalcontroller/OpticalController.py
index 262cf115e..3b8573744 100644
--- a/src/opticalcontroller/OpticalController.py
+++ b/src/opticalcontroller/OpticalController.py
@@ -208,16 +208,39 @@ class GetFlows(Resource):
         except:
             return "Error", 404
         
-@optical.route('/GetTopology/<path:topology_id>',methods=(['GET']))
+@optical.route('/GetTopology/<path:context_id>/<path:topology_id>',methods=['GET'])
 @optical.response(200, 'Success')
 @optical.response(404, 'Error, not found')
 class GetTopology(Resource):
     @staticmethod
-    def get(topology_id:TopologyId):
+    def get(context_id:str,topology_id:str):
         
+        topog_id = TopologyId()
+        topog_id.topology_uuid.uuid=topology_id
+        topog_id.context_id.context_uuid.uuid=context_id
+       
         try:
-            nodes , links = readTopologyDataFromContext(topology_id)
-            print(f"nodes {nodes} and links {links}")
+            links_dict={"optical_links":[]}
+            node_dict = {}
+            i=0
+            nodes , topo = readTopologyDataFromContext(topog_id)
+          
+            for node in nodes : 
+                links_dict["optical_links"].append(node)
+            for device in topo :
+                    dic = {}
+                    dic= {
+                                        "id":device.device_id.device_uuid.uuid,
+                                       "ip":f"10.30.2.{207+i}",
+                                       "port":"50001",
+                                       "type":"OC-ROADM" if device.device_type =="optical-roadm" else "OC-ROADM",
+                                       "driver": "OpticalOC"
+                                }
+                    node_dict[device.name]=dic
+                    i+=1
+            print(f"refresh_opticacontroller optical_links_dict  {links_dict}")    
+            print(f"refresh_opticacontroller node_dict  {node_dict}") 
+            rsa = RSA(node_dict, links_dict)   
             return "Done"
         except Exception as e:
             print(f"err {e}")
@@ -232,7 +255,7 @@ if __name__ == '__main__':
     nodes_dict, links_dict = readTopologyData(nodes_json, topology_json)
 
    
-    rsa = RSA(nodes_dict, links_dict)
+    #rsa = RSA(nodes_dict, links_dict)
     #print(rsa.init_link_slots2(testing))
 
     app.run(host='0.0.0.0', port=10060)
diff --git a/src/service/service/ServiceServiceServicerImpl.py b/src/service/service/ServiceServiceServicerImpl.py
index 880c0525c..f2edc2e20 100644
--- a/src/service/service/ServiceServiceServicerImpl.py
+++ b/src/service/service/ServiceServiceServicerImpl.py
@@ -254,8 +254,8 @@ class ServiceServiceServicerImpl(ServiceServiceServicer):
                 DEFAULT_TOPOLOGY_NAME, context_id_x)
             topology_details = context_client.GetTopologyDetails(
                 TopologyId(**topology_id_x))
-            
-            #refresh_opticalcontroller(TopologyId(**topology_id_x))
+        
+            refresh_opticalcontroller(topology_id_x)
             # devices = get_devices_in_topology(context_client, TopologyId(**topology_id_x), ContextId(**context_id_x))
             devices = topology_details.devices
             context_uuid_x = topology_details.topology_id.context_id.context_uuid.uuid
diff --git a/src/service/service/task_scheduler/TaskExecutor.py b/src/service/service/task_scheduler/TaskExecutor.py
index 5c5747970..d39119689 100644
--- a/src/service/service/task_scheduler/TaskExecutor.py
+++ b/src/service/service/task_scheduler/TaskExecutor.py
@@ -32,7 +32,7 @@ from service.service.service_handler_api.Exceptions import (
 )
 from service.service.service_handler_api.ServiceHandlerFactory import ServiceHandlerFactory, get_service_handler_class
 from service.service.tools.ObjectKeys import get_connection_key, get_device_key, get_service_key
-
+from service.service.tools.object_uuid import opticalconfig_get_uuid
 if TYPE_CHECKING:
     from service.service.service_handler_api._ServiceHandler import _ServiceHandler
 
@@ -120,24 +120,27 @@ class TaskExecutor:
     def configure_optical_device(self, device : Device, settings : str, flows : list, is_opticalband : bool):
         device_key = get_device_key(device.device_id)
         optical_config_id = OpticalConfigId()
-        optical_config_id.opticalconfig_uuid = device.device_id.device_uuid.uuid
+        optical_config_id.opticalconfig_uuid = opticalconfig_get_uuid(device.device_id)
+        
         optical_config = OpticalConfig()
+  
         setting = settings.value if settings else ""
 
         new_config = {}
         try:
             result = self._context_client.SelectOpticalConfig(optical_config_id)
+            LOGGER.info(f"configure_optical_device {result}")
             new_config = json.loads(result.config)
             if result is not None :
                 new_config["new_config"] = setting
                 new_config["is_opticalband"] = is_opticalband
                 new_config["flow"] = flows
-                result.config = str(new_config)
+                result.config = json.dumps(new_config)
                 optical_config.CopyFrom(result)
                 self._device_client.ConfigureOpticalDevice(optical_config)
             self._store_grpc_object(CacheableObjectType.DEVICE, device_key, device)
         except Exception as e:
-            LOGGER.info("error in config my config %s",e)
+            LOGGER.info("error in configure_optical_device  %s",e)
 
     def get_device_controller(self, device : Device) -> Optional[Device]:
         #json_controller = None
diff --git a/src/service/service/tools/OpticalTools.py b/src/service/service/tools/OpticalTools.py
index 31bcb7bcf..02d1c5c41 100644
--- a/src/service/service/tools/OpticalTools.py
+++ b/src/service/service/tools/OpticalTools.py
@@ -77,11 +77,15 @@ def get_device_name_from_uuid(devices: List[Device], device_uuid: str):
             return device_name
     return ""
 
-def refresh_opticalcontroller (topology_id:TopologyId):
-     headers = {"Content-Type": "application/json"}
-     urlx = "http://{}:{}/GetTopology/{}".format(OPTICAL_IP, OPTICAL_PORT,topology_id)
-     res = requests.get(urlx, headers=headers)
-     logging.info(f"Refresh opticalcontroller {res}")
+def refresh_opticalcontroller (topology_id:dict):
+    logging.info(f"t_id {topology_id}")
+    topo_id_str= topology_id["topology_uuid"]["uuid"]
+    cxt_id_str=topology_id["context_id"]["context_uuid"]["uuid"]
+    headers = {"Content-Type": "application/json"}
+    urlx = f"http://{OPTICAL_IP}:{OPTICAL_PORT}/OpticalTFS/GetTopology/{cxt_id_str}/{topo_id_str}"
+    
+    res = requests.get(urlx, headers=headers)
+    logging.info(f"Refresh opticalcontroller {res}")
 
 def add_lightpath(src, dst, bitrate, bidir, ob_band) -> str:
     if not testing:
diff --git a/src/service/service/tools/object_uuid.py b/src/service/service/tools/object_uuid.py
new file mode 100644
index 000000000..a5d905d10
--- /dev/null
+++ b/src/service/service/tools/object_uuid.py
@@ -0,0 +1,34 @@
+
+from common.method_wrappers.ServiceExceptions import InvalidArgumentsException
+from typing import Optional, Union
+from uuid import UUID, uuid4, uuid5
+from common.proto.context_pb2 import DeviceId
+
+
+NAMESPACE_TFS = UUID('200e3a1f-2223-534f-a100-758e29c37f40')
+
+def get_uuid_from_string(str_uuid_or_name : Union[str, UUID], prefix_for_name : Optional[str] = None) -> str:
+    # if UUID given, assume it is already a valid UUID
+    if isinstance(str_uuid_or_name, UUID): return str_uuid_or_name
+    if not isinstance(str_uuid_or_name, str):
+        MSG = 'Parameter({:s}) cannot be used to produce a UUID'
+        raise Exception(MSG.format(str(repr(str_uuid_or_name))))
+    try:
+        # try to parse as UUID
+        return str(UUID(str_uuid_or_name))
+    except: # pylint: disable=bare-except
+        # produce a UUID within TFS namespace from parameter
+        if prefix_for_name is not None:
+            str_uuid_or_name = '{:s}/{:s}'.format(prefix_for_name, str_uuid_or_name)
+        return str(uuid5(NAMESPACE_TFS, str_uuid_or_name))
+
+
+def opticalconfig_get_uuid ( device_id: DeviceId) -> str : 
+    device_uuid = device_id.device_uuid.uuid
+    if (len(device_uuid)>0):
+        return get_uuid_from_string(f"{device_uuid}_opticalconfig")
+
+    raise InvalidArgumentsException([
+        ('DeviceId ', device_id),
+       
+    ], extra_details=['device_id is required to produce a OpticalConfig UUID'])
\ No newline at end of file
diff --git a/src/webui/service/templates/opticalconfig/details.html b/src/webui/service/templates/opticalconfig/details.html
index 85aafb3a4..4d39ef62b 100644
--- a/src/webui/service/templates/opticalconfig/details.html
+++ b/src/webui/service/templates/opticalconfig/details.html
@@ -33,21 +33,21 @@
   </div>
   <div class="col-sm-12">
   <div class="col-sm-12">
-    <div class="row">
+    <div class="row mb-3 ">
 
-      <div class="col-sm-3">
-        <button type="button" class="btn btn-success" onclick="window.location.href='{{ url_for('opticalconfig.home') }}'">
-            <i class="bi bi-box-arrow-in-left"></i>
-            Back to device list
-        </button>
+        <div class="col-sm-3">
+          <button type="button" class="btn btn-success" onclick="window.location.href='{{ url_for('opticalconfig.home') }}'">
+              <i class="bi bi-box-arrow-in-left"></i>
+              Back to device list
+          </button>
+        </div>
+        <div class="col-sm-3">
+          <!-- <button type="button" class="btn btn-danger"><i class="bi bi-x-square"></i>Delete device</button> -->
+          <button type="button" class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#deleteModal">
+              <i class="bi bi-x-square"></i>
+              Delete Optical Config
+          </button>
       </div>
-      <div class="col-sm-3">
-        <!-- <button type="button" class="btn btn-danger"><i class="bi bi-x-square"></i>Delete device</button> -->
-        <button type="button" class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#deleteModal">
-            <i class="bi bi-x-square"></i>
-            Delete Optical Config
-        </button>
-    </div>
     </div>
   </div>
   <div class="col-sm-12">
-- 
GitLab