def forwarding_graphs(self, source):
        forwarding_graphs = source
        try:
            for key in forwarding_graphs.keys():
                if key == 'forwarding_graphs':
                    forwarding_graphs_data = forwarding_graphs[key]
                    for data in forwarding_graphs_data:
                        for k in data.keys():
                            # to check if the key matches with "network_forwarding_paths "
                            if k == "network_forwarding_paths":
                                # extract and save all data present in "network_forwarding_paths"
                                network_forwarding_paths = data[k]
                                for network_forwarding_paths_data in network_forwarding_paths:
                                    for j in network_forwarding_paths_data.keys(
                                    ):
                                        # check if key matches with "connection_points"
                                        if j == "connection_points":
                                            # extract and save all data present in "connection points"
                                            network_forwarding_paths_data1 = network_forwarding_paths_data[
                                                j]
                                            for connection_points_data in network_forwarding_paths_data1:
                                                connection_point_ref = connection_points_data[
                                                    'connection_point_ref']
                                                position = connection_points_data[
                                                    'position']
                                                connection_points_instance = SonataSchema.ConnectionPointsGraph(
                                                    connection_point_ref,
                                                    position)
                                                self.list_connection_points_graph.append(
                                                    connection_points_instance)

                                    fp_id = network_forwarding_paths_data[
                                        'fp_id']
                                    policy = network_forwarding_paths_data[
                                        'policy']
                                    network_forwarding_paths_instance = SonataSchema.NetworkForwardingPaths(
                                        fp_id, policy,
                                        self.list_connection_points_graph)
                                    self.list_network_forwarding_paths.append(
                                        network_forwarding_paths_instance)

                            fg_id = data['fg_id']
                            number_of_endpoints = data['number_of_endpoints']
                            number_of_virtual_links = data[
                                'number_of_virtual_links']
                            constituent_virtual_links = []
                            if data.get(
                                    'constituent_virtual_links') is not None:
                                constituent_virtual_links = data[
                                    'constituent_virtual_links']
                            constituent_vnfs = data['constituent_vnfs']
                            forwarding_graphs_instance = SonataSchema.ForwardingGraphs(
                                fg_id, number_of_endpoints,
                                number_of_virtual_links, constituent_vnfs,
                                constituent_virtual_links,
                                self.list_network_forwarding_paths)
                        self.list_forwarding_graphs.append(
                            forwarding_graphs_instance)
        except KeyError:
            print("One or many keys not found!")
 def split_network_function(self):
     for network_function_set in self.network_function_sets:
         sub_nsd = SonataSchema.NSD("", "", "", "", "", "", [], [], [], [])
         network_function_list = []
         for network_function in network_function_set:
             network_function_list.append(
                 self.get_network_function_object(network_function))
             sub_nsd.networkFunctions = network_function_list
         self.NSDs.append(sub_nsd)
 def normal_case(self, path, nsd_fg):
     path_inner = SonataSchema.NetworkForwardingPaths(
         path.fp_id, path.policy, [])
     x = 1
     for cp in path.connection_points:
         if cp.connection_point_ref in self.get_connection_point_refs(
                 nsd_fg.networkFunctions):
             point = SonataSchema.ConnectionPointsGraph(
                 cp.connection_point_ref, x)
             path_inner.connection_points.append(point)
             x = x + 1
         else:
             for connection_point in nsd_fg.connectionPoints:
                 if cp.connection_point_ref == connection_point._id:
                     point = SonataSchema.ConnectionPointsGraph(
                         cp.connection_point_ref, x)
                     path_inner.connection_points.append(point)
                     x = x + 1
     return path_inner
 def handle_elan_links(self, virtual_link_elan, nsd_vl):
     virtual_link_inner = SonataSchema.VirtualLink(
         virtual_link_elan._id, virtual_link_elan.connectivity_type, [])
     for nf in nsd_vl.networkFunctions:
         for connection_point_ref in virtual_link_elan.connection_points_reference:
             if connection_point_ref in nf.connection_point_refs:
                 virtual_link_inner.connection_points_reference.append(
                     str(connection_point_ref))
             else:
                 if connection_point_ref not in virtual_link_inner.connection_points_reference:
                     for connection_point in nsd_vl.connectionPoints:
                         if connection_point_ref == connection_point._id:
                             virtual_link_inner.connection_points_reference.append(
                                 str(connection_point_ref))
     return virtual_link_inner
 def sonata_connection_points(self, source):
     connection_points = source
     try:
         for key in connection_points.keys():
             if key == 'connection_points':
                 connection_points_data = connection_points[key]
                 for data in connection_points_data:
                     _id = data['id']
                     interface = data['interface']
                     _type = data['type']
                     connection_points_instance = SonataSchema.ConnectionPoint(
                         _id, interface, _type)
                     self.list_connection_points.append(
                         connection_points_instance)
     except KeyError:
         print("One or many keys not found!")
 def sonata_network_function(self, source):
     network_functions = source
     try:
         for key in network_functions.keys():
             if key == 'network_functions':
                 network_functions_data = network_functions[key]
                 for data in network_functions_data:
                     vnf_id = data['vnf_id']
                     vnf_vendor = data['vnf_vendor']
                     vnf_name = data['vnf_name']
                     vnf_version = data['vnf_version']
                     nsd = SonataSchema.NetworkFunction(
                         vnf_id, vnf_vendor, vnf_name, vnf_version, [])
                     self.list_nf.append(nsd)
     except KeyError:
         print("One or many keys not found!")
 def virtual_links(self, source):
     virtual_links = source
     try:
         for key in virtual_links.keys():
             if key == 'virtual_links':
                 virtual_links_data = virtual_links[key]
                 for data in virtual_links_data:
                     _id = data['id']
                     connectivity_type = data['connectivity_type']
                     connection_points_reference = data[
                         'connection_points_reference']
                     virtual_links_instance = SonataSchema.VirtualLink(
                         _id, connectivity_type,
                         connection_points_reference)
                     self.list_virtual_links.append(virtual_links_instance)
     except KeyError:
         print("One or many keys not found!")
    def split_forwarding_path(self):
        for i in range(len(self.NSDs)):
            nsd_fg = self.NSDs[i]
            del self.processed_connection_point_path[:]
            for fg in self.utilityFunctions.list_forwarding_graphs:

                fg_inner = SonataSchema.ForwardingGraphs(
                    fg.fg_id, fg.number_of_endpoints,
                    len(self.set_constituent_virtual_links(nsd_fg, fg)),
                    self.network_function_sets[i],
                    self.set_constituent_virtual_links(nsd_fg, fg), [])
                for path in fg.network_forwarding_path:
                    if self.number_of_connection_paths(
                            self.set_constituent_virtual_links(nsd_fg,
                                                               fg)) > 1:
                        for j in range(
                                self.number_of_connection_paths(
                                    self.set_constituent_virtual_links(
                                        nsd_fg, fg))):
                            path_inner = SonataSchema.NetworkForwardingPaths(
                                path.fp_id + "_" + str(j), path.policy, [])
                            x = 0
                            for cp in path.connection_points:
                                if self.connection_point_already_processed(
                                        cp.connection_point_ref) is False:
                                    found = 0
                                    if cp.connection_point_ref in self.get_connection_point_refs(
                                            nsd_fg.networkFunctions):
                                        x = x + 1
                                        point = SonataSchema.ConnectionPointsGraph(
                                            cp.connection_point_ref, x)
                                        path_inner.connection_points.append(
                                            point)
                                        found = 1
                                        self.processed_connection_point_path.append(
                                            [cp.connection_point_ref, 1])
                                    else:
                                        for connection_point in nsd_fg.connectionPoints:
                                            if cp.connection_point_ref == connection_point._id:
                                                x = x + 1
                                                point = SonataSchema.ConnectionPointsGraph(
                                                    cp.connection_point_ref, x)
                                                path_inner.connection_points.append(
                                                    point)
                                                found = 1
                                                self.processed_connection_point_path.append(
                                                    [
                                                        cp.
                                                        connection_point_ref, 1
                                                    ])
                                    if found == 0:
                                        string = cp.connection_point_ref.split(
                                            ":")
                                        if string[1] == "input":
                                            x = x + 1
                                            point = SonataSchema.ConnectionPointsGraph(
                                                "output", x)
                                            path_inner.connection_points.append(
                                                point)
                                            self.processed_connection_point_path.append(
                                                [cp.connection_point_ref, 1])
                                            break
                                        if string[1] == "output":
                                            x = 1
                                            point = SonataSchema.ConnectionPointsGraph(
                                                "input", x)
                                            path_inner.connection_points.append(
                                                point)
                                            self.processed_connection_point_path.append(
                                                [cp.connection_point_ref, 1])
                            fg_inner.network_forwarding_path.append(path_inner)
                    else:
                        fg_inner.network_forwarding_path.append(
                            self.normal_case(path, nsd_fg))
                nsd_fg.forwardingGraphs.append(fg_inner)
            self.NSDs[i] = nsd_fg
    def split_virtual_links(self):

        for i in range(len(self.NSDs)):
            nsd_vl = self.NSDs[i]
            for virtual_link in self.utilityFunctions.list_virtual_links:
                if virtual_link.connectivity_type == "E-LAN":
                    virtual_link_inner = self.handle_elan_links(
                        virtual_link, nsd_vl)
                    nsd_vl.virtualLinks.append(virtual_link_inner)
                if virtual_link.connectivity_type == "E-Line":
                    virtual_link_inner = SonataSchema.VirtualLink(
                        virtual_link._id, virtual_link.connectivity_type, [])
                    cp_0 = virtual_link.connection_points_reference[0]
                    cp_1 = virtual_link.connection_points_reference[1]
                    found_0 = 0
                    found_1 = 0
                    if cp_0 in self.get_connection_point_refs(
                            nsd_vl.networkFunctions):
                        virtual_link_inner.connection_points_reference.append(
                            str(cp_0))
                        found_0 = 1
                    else:
                        for connection_point in nsd_vl.connectionPoints:
                            if cp_0 == connection_point._id:
                                virtual_link_inner.connection_points_reference.append(
                                    str(cp_0))
                                found_0 = 1
                    if found_0 == 0:
                        if self.get_connection_point_type(cp_1) != "external":
                            virtual_link_inner.connection_points_reference.append(
                                str("input"))
                            found_0 = 1
                    if cp_1 in self.get_connection_point_refs(
                            nsd_vl.networkFunctions):
                        virtual_link_inner.connection_points_reference.append(
                            str(cp_1))
                        found_1 = 1
                    else:
                        for connection_point in self.NSDs[i].connectionPoints:
                            if cp_1 == connection_point._id:
                                virtual_link_inner.connection_points_reference.append(
                                    str(cp_1))
                                found_1 = 1
                    if found_1 == 0:
                        if self.get_connection_point_type(cp_0) != "external":
                            virtual_link_inner.connection_points_reference.append(
                                str("output"))
                            found_1 = 1
                    if len(virtual_link_inner.connection_points_reference
                           ) == 2:
                        str1 = virtual_link_inner.connection_points_reference[
                            0].split(":")
                        str2 = virtual_link_inner.connection_points_reference[
                            1].split(":")
                        if len(str1) == 2:
                            str1[0] = str1[0].replace("vnf_", "")
                        if len(str2) == 2:
                            str2[0] = str2[0].replace("vnf_", "")
                        virtual_link_inner._id = str1[0] + "-2-" + str2[0]
                        self.old_new_link_mapping.append(
                            [virtual_link._id, virtual_link_inner._id])
                    if found_0 == 1 and found_1 == 1:
                        _connection_point_type_0 = self.get_connection_point_type(
                            virtual_link_inner.connection_points_reference[0])
                        _connection_point_type_1 = self.get_connection_point_type(
                            virtual_link_inner.connection_points_reference[1])
                        if (_connection_point_type_0 == "external"
                                and _connection_point_type_1
                                == "external") == False:
                            nsd_vl.virtualLinks.append(virtual_link_inner)
            self.NSDs[i] = nsd_vl