Commit 3c100ed4 authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

Optical Controller component:

- Fixed computation of methods reverse_link(), reverse_links(), get_links_from_node(), and get_links_to_node()
- Forced NETWORK (remote network) device type to operate as an emulated transponder for multi-domain path computations
- Multiple log enhancements
- Added typehints
parent 832b180a
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -434,13 +434,14 @@ class GetTopology(Resource):
            topo , nodes = readTopologyDataFromContext(topog_id)

            OPTICAL_ROADM_TYPES = {
                DeviceTypeEnum.OPTICAL_ROADM.value, DeviceTypeEnum.EMULATED_OPTICAL_ROADM.value
                DeviceTypeEnum.OPTICAL_ROADM.value, DeviceTypeEnum.EMULATED_OPTICAL_ROADM.value,
            }
            OPTICAL_OPENROADM_TYPES = {
                DeviceTypeEnum.OPEN_ROADM.value, DeviceTypeEnum.EMULATED_OPEN_ROADM.value
                DeviceTypeEnum.OPEN_ROADM.value, DeviceTypeEnum.EMULATED_OPEN_ROADM.value,
            }
            OPTICAL_TRANSPONDER_TYPES = {
                DeviceTypeEnum.OPTICAL_TRANSPONDER.value, DeviceTypeEnum.EMULATED_OPTICAL_TRANSPONDER.value
                DeviceTypeEnum.OPTICAL_TRANSPONDER.value, DeviceTypeEnum.EMULATED_OPTICAL_TRANSPONDER.value,
                DeviceTypeEnum.NETWORK.value,
            }
            added_device_uuids = set()
            for device in nodes:
+26 −21
Original line number Diff line number Diff line
@@ -428,9 +428,10 @@ class RSA():
            #self.restore_optical_band_2(o_b_id, slots, band,links)
        if bidir:
            for l in links:
                r_l = reverse_link(l)
                if debug:
                    print(f"reverse_link {r_l}")
                r_l = reverse_link(l, self.link_key__to__src_dst_node_names)
                MSG = '[RSA:del_flow] reverse link: {:s}'
                LOGGER.debug(MSG.format(str(r_l)))

                rlink = self.get_link_by_name(r_l)
                fib = rlink["optical_details"]
                #fib = self.get_link_by_name(r_l)["optical_details"]
@@ -513,7 +514,7 @@ class RSA():
            #self.restore_optical_band_2(o_b_id, slots, band,links)
            if bidir:
                for l in links:
                    r_l = reverse_link(l)
                    r_l = reverse_link(l, self.link_key__to__src_dst_node_names)
                    if debug:
                        print(r_l)
                    rlink = self.get_link_by_name(r_l)
@@ -599,9 +600,11 @@ class RSA():
        return None

    def get_fibers_backward(self, links, slots, band):
        LOGGER.info('[RSA:get_fibers_backward] Starting path backward computation')

        fiber_list = {}
        #r_drop = reverse_link(links[0])
        #r_add = reverse_link(links[-1])
        #r_drop = reverse_link(links[0], self.link_key__to__src_dst_node_names)
        #r_add = reverse_link(links[-1], self.link_key__to__src_dst_node_names)
        for l in links:
            fib = self.get_link_by_name(l)["optical_details"]
            '''
@@ -613,13 +616,14 @@ class RSA():
            s_port = fib["src_port"]
            d_port = fib["dst_port"]

            if debug:
                print(l, s_port, d_port)
            MSG = '[RSA:get_fibers_backward] processing link: {:s}, src_port: {:s}, dst_port: {:s}'
            LOGGER.debug(MSG.format(str(l), str(s_port), str(d_port)))

            r_l = reverse_link(l)
            r_l = reverse_link(l, self.link_key__to__src_dst_node_names)
            r_link = self.get_link_by_name(r_l)
            #if debug:
            #    print(r_l)

            MSG = '[RSA:get_fibers_backward] reverse link: {:s}'
            LOGGER.debug(MSG.format(str(r_l)))

            #for f in r_link["fibers"].keys():
            r_fib = r_link["optical_details"]
@@ -627,7 +631,8 @@ class RSA():
                if list_in_list(slots, str_list_to_int(r_fib[band].keys())):
                    #fiber_list[r_l] = r_fib["ID"]
                    self.update_link(r_fib, slots, band)
        print("INFO: Path backward computation completed")
        
        LOGGER.info('[RSA:get_fibers_backward] Path backward computation completed')
        return fiber_list

    #function invoked for lightpaths and OB
@@ -666,7 +671,7 @@ class RSA():
            
            fibx = self.get_fiber_details(lx, f)
            '''
            src, dst = llx.split("-")
            src, dst = self.link_key__to__src_dst_node_names[llx]
            #outport = self.links_dict[lx]['fibers'][f]["src_port"]
            lx = self.get_link_by_name(llx)["optical_details"]
            outport = lx["src_port"]
@@ -735,7 +740,7 @@ class RSA():
        t_flows = {}

        #flows_add_side
        src, dst = add.split("-")
        src, dst = self.link_key__to__src_dst_node_names[add]
        lx = self.get_link_by_name(add)["optical_details"]
        #outport = self.links_dict[add]['fibers'][f]["src_port"]
        outport = lx["src_port"]
@@ -772,7 +777,7 @@ class RSA():
        #flows_drop_side
        # R2 rules
        ly = self.get_link_by_name(drop)["optical_details"]
        src, dst = drop.split("-")
        src, dst = self.link_key__to__src_dst_node_names[drop]
        #outport = self.links_dict[drop]['fibers'][f]["src_port"]
        outport = ly["src_port"]

@@ -824,7 +829,7 @@ class RSA():

        '''
        #flows_add_side
        src, dst = add.split("-")
        src, dst = self.link_key__to__src_dst_node_names[add]
        lx = self.get_link_by_name(add)["optical_details"]
        #outport = self.links_dict[add]['fibers'][f]["src_port"]
        outport = lx["src_port"]
@@ -1275,8 +1280,8 @@ class RSA():
                temp_links2.append(list(dst_links.keys())[0])

            if len(temp_links2) == 2:
                [t_src, roadm_src] = temp_links2[0].split('-')
                [roadm_dst, t_dst] = temp_links2[1].split('-')
                t_src, roadm_src = self.link_key__to__src_dst_node_names[temp_links2[0]]
                roadm_dst, t_dst = self.link_key__to__src_dst_node_names[temp_links2[1]]
                temp_path.append(t_src)
                temp_path.append(roadm_src)
                temp_path.append(roadm_dst)
@@ -1591,7 +1596,7 @@ class RSA():
            #self.restore_optical_band_2(o_b_id, slots, band,links)
        if bidir:
            for l in links:
                r_l = reverse_link(l)
                r_l = reverse_link(l, self.link_key__to__src_dst_node_names)
                if debug:
                    print(r_l)
                rlink = self.get_link_by_name(r_l)
@@ -1633,8 +1638,8 @@ class RSA():
        r1 = ""
        r2 = ""
        if len(links) == 2:
            [t1, r1] = links[0].split("-")                    
            [r2, t2] = links[1].split("-")
            t1, r1 = self.link_key__to__src_dst_node_names[links[0]]
            r2, t2 = self.link_key__to__src_dst_node_names[links[1]]
        else:
            return 0, 0
        existing_ob = self.get_optical_bands(r1, r2)
+17 −16
Original line number Diff line number Diff line
@@ -12,9 +12,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.

import numpy as np
import json, logging, numpy as np
from typing import Dict, List, Tuple
from opticalcontroller.variables import  *
import json , logging
from context.client.ContextClient import ContextClient
from common.proto.context_pb2 import TopologyId , LinkId , OpticalLink , OpticalLinkDetails
from common.tools.object_factory.OpticalLink import correct_slot
@@ -131,10 +131,10 @@ def list_in_list(a, b):
    return False


def reverse_link(link):
    s, d = link.split('-')
    r_link = "{}-{}".format(d, s)
    return r_link
def reverse_link(link, link_key__to__src_dst_node_names : Dict[str, Tuple[str, str]]) -> str:
    src_name, dst_name = link_key__to__src_dst_node_names[link]
    rev_link_name = '{:s}-{:s}'.format(dst_name, src_name)
    return rev_link_name


def get_slot_frequency(b, n):
@@ -225,28 +225,29 @@ def readTopologyDataFromContext(topology_id:TopologyId):
    return topo , nodes


def reverse_links(links):
    temp_links = links.copy()
    temp_links.reverse()
    result = []
    for link in temp_links:
        [a, b] = link.split("-")
        result.append("{}-{}".format(b, a))
    return result
def reverse_links(
    links : List[str], link_key__to__src_dst_node_names : Dict[str, Tuple[str, str]]
) -> List[str]:
    return [
        reverse_link(link, link_key__to__src_dst_node_names)
        for link in reversed(links)
    ]


def get_links_from_node(topology, node):
    link_prefix = "{}-".format(node)
    result = {}
    for link in topology["optical_links"]:
        if "{}-".format(node) in link["name"]:
        if str(link["name"]).startswith(link_prefix):
            result[link["name"]] = link
    return result


def get_links_to_node(topology, node):
    link_suffix = "-{}".format(node)
    result = {}
    for link in topology["optical_links"]:
        if "-{}".format(node) in link["name"]:
        if str(link["name"]).endswith(link_suffix):
            result[link["name"]] = link
    return result