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