Esempio n. 1
0
    def update_topology(self,data):
        #likely adding new inter-domain links
        update_handler = TopologyHandler()
        topology = update_handler.import_topology_data(data)
        self.topology_list[topology.id] = topology

        ##nodes
        nodes = topology.get_nodes()
        for node in nodes:
            self.topology.remove_node(node.id)
        ##links
        links = topology.get_links()
        for link in links:
            if link.nni != True:
                #print(link.id+";......."+str(link.nni))
                self.topology.remove_link(link.id)
                for port in link.ports:
                    self.port_list.pop(port['id'])

        ##check the inter-domain links first.
        num_interdomain_link=self.inter_domain_check(topology)
        if num_interdomain_link==0:
            print("Warning: no interdomain links detected!")

        ##nodes
        nodes = topology.get_nodes()
        self.topology.add_nodes(nodes)
        ##links
        links = topology.get_links()
        self.topology.add_links(links)

        self.update_version(True)
        self.update_timestamp()
Esempio n. 2
0
class TopologyManager():

    """"
    Manager for topology operations: merge multiple topologies, convert to grenml (XML).  
    """

    def __init__(self):
        super().__init__()

        self.handler = TopologyHandler()

        self.topology=None
        self.topology_list={}
        self.port_list={} #{port, link}

        self.num_interdomain_link=0

    def get_handler(self):
        return self.handler

    def topology_id(self, id):  
        self.topology._id(id)
    
    def set_topology(self, topology):  
        self.topology = topology
    
    def get_topology(self):
        return self.topology
    
    def clear_topology(self):
        self.topology=None
        self.topology_list={}
        self.port_list={}

    def add_topology(self, data):

        topology = self.handler.import_topology_data(data)
        self.topology_list[topology.id] = topology

        if self.topology is None:
            self.topology = copy.deepcopy(topology)
            ##generate a new topology id
            self.generate_id()
            #Addding to the port list
            links = topology.get_links()
            for link in links:
                for port in link.ports:
                    self.port_list[port['id']] = link
        else:
            ##check the inter-domain links first.
            self.num_interdomain_link+=self.inter_domain_check(topology)
            if self.num_interdomain_link==0:
                print("Warning: no interdomain links detected!")
            ##nodes
            nodes = topology.get_nodes()
            self.topology.add_nodes(nodes)
            ##links
            links = topology.get_links()
            self.topology.add_links(links)
            #version
            self.update_version(False)

        self.update_timestamp()

    def get_domain_name(self,node_id):
        domain_id=None
        #print("len of topology_list:"+str(len(self.topology_list)))
        for id, topology in self.topology_list.items():
            if topology.has_node_by_id(node_id):
                domain_id = id
                break    
        return domain_id

    def generate_id(self):
        self.topology.set_id(SDX_TOPOLOGY_ID_prefix)
        self.topology.version=TOPOLOGY_INITIAL_VERSION
        return id
    
    def remove_topology(self, topology_id):
        self.topology_list.pop(topology_id, None)
        self.update_version(False)
        self.update_timestamp()

    def update_topology(self,data):
        #likely adding new inter-domain links
        update_handler = TopologyHandler()
        topology = update_handler.import_topology_data(data)
        self.topology_list[topology.id] = topology

        ##nodes
        nodes = topology.get_nodes()
        for node in nodes:
            self.topology.remove_node(node.id)
        ##links
        links = topology.get_links()
        for link in links:
            if link.nni != True:
                #print(link.id+";......."+str(link.nni))
                self.topology.remove_link(link.id)
                for port in link.ports:
                    self.port_list.pop(port['id'])

        ##check the inter-domain links first.
        num_interdomain_link=self.inter_domain_check(topology)
        if num_interdomain_link==0:
            print("Warning: no interdomain links detected!")

        ##nodes
        nodes = topology.get_nodes()
        self.topology.add_nodes(nodes)
        ##links
        links = topology.get_links()
        self.topology.add_links(links)

        self.update_version(True)
        self.update_timestamp()

    def update_version(self,sub:bool):
        try:
            [ver, sub_ver] = self.topology.version.split('.')
        except ValueError:
            ver=self.topology.version
            sub_ver='0'

        self.topology.version=self.new_version(ver, sub_ver,sub)

        return self.topology.version
    
    def new_version(self,ver, sub_ver,sub:bool):
        if not sub:
            ver=str(int(ver)+1)
            sub_ver='0'
        else:
            sub_ver=str(int(sub_ver)+1)

        return ver+"."+sub_ver

    def update_timestamp(self):
        ct = datetime.datetime.now().isoformat()
        self.topology.time_stamp=ct

        return ct

    def inter_domain_check(self,topology):
        interdomain_port_dict={}
        num_interdomain_link=0
        links = topology.get_links()
        link_dict ={}
        for link in links:
            link_dict[link.id] = link
            for port in link.ports:
                interdomain_port_dict[port['id']]=link

        #ToDo: raise an warning or exception
        if len(interdomain_port_dict)==0:
            print("interdomain_port_dict==0")
            return False

        #match any ports in the existing topology
        for port_id in  interdomain_port_dict:
            #print("interdomain_port:")
            #print(port_id)
            for existing_port, existing_link in self.port_list.items():
                #print(existing_port)
                if port_id == existing_port:
                    #print("Interdomain port:" + port_id)
                    #remove redundant link between two domains
                    self.topology.remove_link(existing_link.id)   
                    num_interdomain_link=+1
            self.port_list[port_id] = interdomain_port_dict[port_id]

        return num_interdomain_link

    #adjacent matrix of the graph, in jason?    
    def generate_graph(self):
        G = nx.Graph()
        links = self.topology.links
        for link in links:
            inter_domain_link = False
            ports=link.ports
            end_nodes=[]
            for port in ports:
                node=self.topology.get_node_by_port(port['id'])
                if node is None:
                    print("This port doesn't belong to any node in the topology, likely a Non-SDX port!" + port['id'])
                    inter_domain_link = True
                    break
                else:
                    end_nodes.append(node)
                    #print("graph node:"+node.id)
            if not inter_domain_link:
                G.add_edge(end_nodes[0].id,end_nodes[1].id)
                edge = G.edges[end_nodes[0].id,end_nodes[1].id]
                edge['id'] = link.id
                edge['latency'] = link.latency
                edge['bandwidth'] = link.bandwidth
                edge['residual_bandwidth'] = link.residual_bandwidth
                edge['weight'] = 1000.0*(1.0/link.residual_bandwidth)
                edge['packet_loss'] = link.packet_loss
                edge['availability'] = link.availability

        return G

    def generate_grenml(self):
        self.converter = GrenmlConverter(self.topology)

        return self.converter.read_topology()    

    def add_domain_service(self):
        pass

    #may need to read from a configuration file.    
    def update_private_properties(self):
        pass

    # on performance properties for now
    def update_link_property(self,link_id,property,value):
        #1. update the individual topology
        for id, topology in self.topology_list.items():
            links = topology.get_links()
            for link in links:
                print(link.id + ";" + id)
                if link.id == link_id:
                    setattr(link,property,value)
                    print("updated the link.")
                    #1.2 need to change the sub_ver of the topology?

        #2. check on the inter-domain link?
        #3. update the interodamin topology
        links = self.topology.get_links()
        for link in links:
            if link.id == link_id:
                setattr(link,property,value)
                print("updated the link.")
                #2.2 need to change the sub_ver of the topology?

        self.update_version(True)
        self.update_timestamp()
        #4. Signal update the (networkx) graph

        # 5. signal Reoptimization of TE? 

    def update_element_property_json(self,data,element, element_id,property,value):
        elements=data[element]
        for element in elements:
            if element['id'] == element_id:
                element[property] = value

        try:
            [ver, sub_ver] = data['version'].split('.')
        except ValueError:
            ver='0'
            sub_ver='0'

        data['version'] = self.new_version(ver,sub_ver,True)
        data['time_stamp'] = datetime.datetime.now().isoformat()

        
    def update_node_property(self):
        pass

    def update_port_property(self):
        pass
Esempio n. 3
0
class TopologyManager():

    """"
    Manager for topology operations: merge multiple topologies, convert to grenml (XML).  
    """

    def __init__(self):
        super().__init__()

        self.handler = TopologyHandler()

        self.topology=None
        self.topology_list={}
        self.port_list={} #{port, link}

        self.num_interdomain_link=0

    def get_handler(self):
        return self.handler

    def topology_id(self, id):  
        self.topology._id(id)
    
    def set_topology(self, topology):  
        self.topology = topology
    
    def clear_topology(self):
        self.topology=None
        self.topology_list={}
        self.port_list={}

    def add_topology(self, data):

        topology = self.handler.import_topology_data(data)
        self.topology_list[topology.id] = topology

        if self.topology is None:
            self.topology = copy.deepcopy(topology)
            ##generate a new topology id
            self.generate_id()
            #Addding to the port list
            links = topology.get_links()
            for link in links:
                for port in link.ports:
                    self.port_list[port] = link
        else:
        ## update the version and timestamp to be the latest
            self.update_version(False)
            self.update_timestamp()

            ##check the inter-domain links first.
            self.num_interdomain_link+=self.inter_domain_check(topology)
            if self.num_interdomain_link==0:
                print("Warning: no interdomain links detected!")
            ##nodes
            nodes = topology.get_nodes()
            self.topology.add_nodes(nodes)
            ##links
            links = topology.get_links()
            self.topology.add_links(links)

            self.update_version(False)

    def generate_id(self):
        self.topology.set_id(SDX_TOPOLOGY_ID_prefix)
        self.topology.set_version(TOPOLOGY_INITIAL_VERSION)
        return id
    
    def remove_topology(self, topology_id):
        self.topology_list.pop(topology_id, None)
        self.update_version(False)
        self.update_timestamp()

    def update_topology(self,data):
        #likely adding new inter-domain links
        topology = self.handler.import_topology_data(data)
        self.topology_list[topology.id] = topology

        ##nodes
        nodes = topology.get_nodes()
        for node in nodes:
            self.topology.remove_node(node.id)
        ##links
        links = topology.get_links()
        for link in links:
            self.topology.remove_links(link.id)

        ##check the inter-domain links first.
        num_interdomain_link=self.inter_domain_check(topology)
        if num_interdomain_link==0:
            print("Warning: no interdomain links detected!")

        ##nodes
        nodes = topology.get_nodes()
        self.topology.add_nodes(nodes)
        ##links
        links = topology.get_links()
        self.topology.add_links(links)

        self.update_version(True)
        self.update_timestamp()

    def get_topology(self):
        return self.topology

    def update_version(self,sub:bool):
        [ver, sub_ver] = self.topology.version.split('.')
        if not sub:
            ver=str(int(ver)+1)
        else:
            sub_ver=str(int(sub_ver)+1)

    def inter_domain_check(self,topology):
        interdomain_port_dict={}
        num_interdomain_link=0
        links = topology.get_links()
        link_dict ={}
        for link in links:
            link_dict[link.id] = link
            for port in link.ports:
                interdomain_port_dict[port]=link

        #ToDo: raise an warning or exception
        if len(interdomain_port_dict)==0:
            return False

        #match any ports in the existing topology
        for port_id in  interdomain_port_dict:
            for existing_port, existing_link in self.port_list.items():
                if port_id == existing_port:
                    print("Interdomain port:" + port_id)
                    #remove redundant link between two domains
                    self.topology.remove_link(existing_link.id)   
                    num_interdomain_link=+1
            self.port_list[port_id] = interdomain_port_dict[port_id]

        return num_interdomain_link

    def update_timestamp(self):
        pass

    def add_domain_service(self):
        pass

    #may need to read from a configuration file.    
    def update_private_properties(self):
        pass

    #adjacent matrix of the graph, in jason?    
    def generate_graph(self):
        G = nx.Graph()
        links = self.topology.links
        for link in links:
            inter_domain_link = False
            ports=link.ports
            end_nodes=[]
            for port in ports:
                node=self.topology.get_node_by_port(port)
                if node is None:
                    print("This port doesn't belong to any node in the topology, likely an Interdomain port!" + port)
                    inter_domain_link = True
                    break
                else:
                    end_nodes.append(node)
                    print("graph node:"+node.id)
            if not inter_domain_link:
                G.add_edge(end_nodes[0].name,end_nodes[1].name)
                edge = G.edges[end_nodes[0].name,end_nodes[1].name]
                edge['id'] = link.id
                edge['latency'] = link.latency
                edge['total_bandwidth'] = link.total_bandwidth
                edge['available_bandwidth'] = link.available_bandwidth
                edge['latency'] = link.latency
                edge['packet_loss'] = link.packet_loss
                edge['availability'] = link.availability

        return G



    def generate_grenml(self):
        self.converter = GrenmlConverter(self.topology)

        return self.converter.read_topology()