def test_p_median(self):
        """
        Test topology:

        A ---- B ---- C ----[HIGH DIST] --- D --- E --- F

        Expected facilities: 1, 4
        """
        t = fnss.Topology()
        nx.add_path(t, "ABCDEF")
        fnss.set_weights_constant(t, 1)
        fnss.set_weights_constant(t, 2, [("C", "D")])
        distances = dict(nx.all_pairs_dijkstra_path_length(t, weight='weight'))
        allocation, facilities, cost = algorithms.compute_p_median(
            distances, 2)
        self.assertDictEqual(
            {
                "A": "B",
                "B": "B",
                "C": "B",
                "D": "E",
                "E": "E",
                "F": "E",
            }, allocation)
        self.assertSetEqual(set("BE"), facilities)
        self.assertEqual(4, cost)
Esempio n. 2
0
 def setUp(self):
     #
     #       -- s1 --
     #     /     |    \
     #   c1-----c2----c3
     #  /  \   / | \    \
     # r1  r2 r3 r4 r5  r6
     #
     topo = fnss.Topology()
     icr_candidates = ["c1", "c2", "c3"]
     topo.add_path(icr_candidates)
     topo.add_edge("c1", "s1")
     topo.add_edge("c2", "s1")
     topo.add_edge("c3", "s1")
     topo.add_edge("c1", "r1")
     topo.add_edge("c1", "r2")
     topo.add_edge("c2", "r3")
     topo.add_edge("c2", "r4")
     topo.add_edge("c2", "r5")
     topo.add_edge("c3", "r6")
     topo.graph['icr_candidates'] = set(icr_candidates)
     for router in icr_candidates:
         fnss.add_stack(topo, router, 'router')
     for src in ['s1']:
         fnss.add_stack(topo, src, 'source')
     for rcv in ['r1', 'r2', 'r3', 'r4', 'r5', 'r6']:
         fnss.add_stack(topo, rcv, 'receiver')
     self.topo = cacheplacement.IcnTopology(topo)
Esempio n. 3
0
 def test_to_mininet(self):
     t = fnss.Topology()
     t.add_path([1, 2, 3, 4])
     for n in (1, 4):
         t.node[n]['type'] = 'host'
     for n in (2, 3):
         t.node[n]['type'] = 'switch'
     fnss.set_capacities_constant(t, 10, 'Mbps')
     fnss.set_delays_constant(t, 10, 'ms')
     mn_topo = fnss.to_mininet(t, relabel_nodes=False)
     self.assertIsNotNone(mn_topo)
     hosts = mn_topo.hosts()
     switches = mn_topo.switches()
     for h in '1', '4':
         self.assertIn(h, hosts)
     for s in '2', '3':
         self.assertIn(s, switches)
     mn_topo = fnss.to_mininet(t, relabel_nodes=True)
     # Relabeling should be:
     # 1 -> h1
     # 2 -> s1
     # 3 -> s2
     # 4 -> h2
     self.assertIsNotNone(mn_topo)
     hosts = mn_topo.hosts()
     switches = mn_topo.switches()
     for h in 'h1', 'h2':
         self.assertIn(h, hosts)
     for s in 's1', 's2':
         self.assertIn(s, switches)
Esempio n. 4
0
 def test_to_omnetpp_undirected(self):
     t = fnss.Topology()
     t.add_path([1, 2, 3, 4])
     fnss.set_capacities_constant(t, 10, 'Gbps')
     fnss.set_delays_constant(t, 2, 'us')
     fnss.set_buffer_sizes_constant(t, 20, 'packets')
     fnss.to_omnetpp(t, path.join(TMP_DIR, 'omnetpp-undir.ned'))
Esempio n. 5
0
 def setup_method(self):
     #
     #   s1    s2
     #    |     |
     #   c1-----c2----c3
     #  /  \   / | \    \
     # r1  r2 r3 r4 r5  r6
     #
     topo = fnss.Topology()
     icr_candidates = ["c1", "c2", "c3"]
     nx.add_path(topo, icr_candidates)
     topo.add_edge("c2", "s1")
     topo.add_edge("c2", "s2")
     topo.add_edge("c1", "r1")
     topo.add_edge("c1", "r2")
     topo.add_edge("c2", "r3")
     topo.add_edge("c2", "r4")
     topo.add_edge("c2", "r5")
     topo.add_edge("c3", "r6")
     topo.graph["icr_candidates"] = set(icr_candidates)
     for router in icr_candidates:
         fnss.add_stack(topo, router, "router")
     for src in ["s1"]:
         fnss.add_stack(topo, src, "source")
     for rcv in ["r1", "r2", "r3", "r4", "r5", "r6"]:
         fnss.add_stack(topo, rcv, "receiver")
     self.topo = cacheplacement.IcnTopology(topo)
Esempio n. 6
0
 def nrr_topology(cls):
     """Return topology for testing NRR caching strategies
     """
     # Topology sketch
     #
     # 0 ---- 2----- 4
     #        |       \
     #        |        s
     #        |       /
     # 1 ---- 3 ---- 5
     #
     topology = IcnTopology(fnss.Topology())
     nx.add_path(topology, [0, 2, 4, "s", 5, 3, 1])
     topology.add_edge(2, 3)
     receivers = (0, 1)
     source = "s"
     caches = (2, 3, 4, 5)
     contents = (1, 2, 3, 4)
     fnss.add_stack(topology, source, 'source', {'contents': contents})
     for v in caches:
         fnss.add_stack(topology, v, 'router', {'cache_size': 1})
     for v in receivers:
         fnss.add_stack(topology, v, 'receiver', {})
     fnss.set_delays_constant(topology, 1, 'ms')
     return topology
Esempio n. 7
0
 def partition_topology(cls):
     #
     #      +-- s1 --+
     #     /     |    \
     #   c1-----[]----c2
     #         /  \
     #        r1  r2
     #
     topo = fnss.Topology()
     icr_candidates = ["c1", "router", "c2"]
     nx.add_path(topo, icr_candidates)
     topo.add_edge("r1", "router")
     topo.add_edge("r2", "router")
     topo.add_edge("c1", "s1")
     topo.add_edge("c2", "s1")
     topo.graph['icr_candidates'] = set(icr_candidates)
     contents = (1, 2, 3, 4)
     for router in icr_candidates:
         if router in ("c1", "c2"):
             props = {'cache_size': 1}
         fnss.add_stack(topo, router, 'router', **props)
     for src in ['s1']:
         fnss.add_stack(topo, src, 'source', {'contents': contents})
     for rcv in ['r1', 'r2']:
         fnss.add_stack(topo, rcv, 'receiver')
     topo.graph['cache_assignment'] = {"r1": "c1", "r2": "c2"}
     return IcnTopology(topo)
Esempio n. 8
0
def parse_ashiip(path):
    """
    Parse a topology from an output file generated by the aShiip topology
    generator

    Parameters
    ----------
    path : str
        The path to the aShiip output file

    Returns
    -------
    topology : Topology
    """
    topology = fnss.Topology(type='ashiip')

    for line in open(path, "r").readlines():
        # There is no documented aShiip format but we assume that if the line
        # does not start with a number it is not part of the topology
        if line[0].isdigit():
            node_ids = re.findall("\d+", line)
            if len(node_ids) < 2:
                raise ValueError('Invalid input file. Parsing failed while ' \
                                 'trying to parse a line')
            node = int(node_ids[0])
            # level = int(node_ids[1])
            topology.add_node(node)
            for i in range(1, len(node_ids)):
                topology.add_edge(node, int(node_ids[i]))
    paths = dict(nx.all_pairs_dijkstra_path(topology))
    for u in paths:
        for v in paths[u]:
            paths[u][v] = len(paths[u][v])
    return paths
Esempio n. 9
0
 def test_to_ns2_undirected(self):
     t = fnss.Topology()
     t.add_path([1, 2, 3, 4])
     fnss.set_capacities_constant(t, 10, 'Gbps')
     fnss.set_delays_constant(t, 2, 'us')
     fnss.set_buffer_sizes_constant(t, 20, 'packets')
     fnss.to_ns2(t, path.join(TMP_DIR, 'ns2-undir.tcl'), stacks=False)
Esempio n. 10
0
    def test_p_median_unsorted(self):
        """

        Test topology:

        A ---- C ---- B ----[HIGH DIST] --- E --- D --- F

        Expected facilities: 1, 4
        """
        t = fnss.Topology()
        nx.add_path(t, "ACBEDF")
        fnss.set_weights_constant(t, 1)
        fnss.set_weights_constant(t, 2, [("B", "E")])
        distances = dict(nx.all_pairs_dijkstra_path_length(t, weight='weight'))
        allocation, facilities, cost = algorithms.compute_p_median(
            distances, 2)
        assert {
            "A": "C",
            "B": "C",
            "C": "C",
            "D": "D",
            "E": "D",
            "F": "D",
        } == allocation
        assert set("CD") == facilities
        assert 4 == cost
Esempio n. 11
0
 def test_symmetric_paths(self):
     topology = fnss.Topology()
     topology.add_path([1, 2, 4, 5, 3, 6, 1])
     path = nx.all_pairs_shortest_path(topology)
     self.assertNotEqual(list(path[1][5]), list(reversed(path[5][1])))
     network.symmetrify_paths(path)
     self.assertEqual(list(path[1][5]), list(reversed(path[5][1])))
Esempio n. 12
0
def topology_ds2os(**kwargs):
    # pass edge list to create topology (alternatively pass NetworkX object)

    agents = ['agent' + str(id)
              for id in range(1, 7)]  # [agent1, agent2, ..., agent6]

    edges = [
        # main edges between KAs/rooms
        ('agent1', 'agent2'),  # BedroomChildren, BedroomParents
        ('agent2', 'agent6'),  # BedroomParents, Bathroom
        ('agent2', 'agent4'),  # BedroomParents, Kitchen
        # ('agent3', 'agent6'), # Dinningroom, Bathroom
        ('agent4', 'agent5'),  # Kitchen, Garage
        ('agent4', 'agent3'),  # Kitchen, Dinningroom
    ]

    rooms = [
        ['movement1', 'questioningservice1', 'tempin1',
         'lightcontrol1'],  # ka1, BedroomChildren
        ['movement2', 'questioningservice2', 'tempin2',
         'lightcontrol2'],  # ka2, BedroomParents
        [
            'heatingcontrol1', 'doorlock1', 'questioningservice3', 'movement3',
            'tempin3', 'lightcontrol3'
        ],  # ka3, Dinningroom
        ['tempin4', 'lightcontrol4', 'movement4', 'battery3'],  # ka4, Kitchen
        ['tempin5', 'battery1', 'movement5', 'lightcontrol5',
         'battery2'],  # ka5, Garage
        ['tempin6', 'washingmachine1', 'lightcontrol6',
         'movement6'],  # ka6, Bathroom
    ]

    for i, agent in enumerate(agents):
        connectedServices = rooms[i]
        # print(agent, 'is connected to', connectedServices)
        for service in connectedServices:
            edges.append((agent, service))  # e.g. ('agent1', 'movement1')
            if not service.startswith('questioningservice'
                                      ):  # questioningservices only read data
                edges.append(
                    (service, service +
                     '/source'))  # e.g. ('movement1', 'movement1/source')
            edges.append(
                (service, service +
                 '/receiver'))  # e.g. ('movement1', 'movement1/receiver')

    topology = fnss.Topology(data=edges)

    for node in topology.nodes():
        stack = 'source' if node.endswith('source') else (
            'receiver' if node.endswith('receiver') else 'router')
        fnss.add_stack(topology, node, stack)

    topology.graph['icr_candidates'] = set(agents)  # only cache at agents

    fnss.set_weights_constant(topology, 1.0)
    fnss.set_delays_constant(topology, INTERNAL_LINK_DELAY, 'ms')

    return IcnTopology(topology)
Esempio n. 13
0
 def test_topology_class(self):
     topology = fnss.Topology()
     topology.add_edge(1, 2)
     self.assertEqual(1, topology.number_of_edges())
     topology.add_edge(2, 1)
     self.assertEqual(1, topology.number_of_edges())
     topology.add_edge('1', '2')
     topology.add_edge('2', '1')
     self.assertEqual(2, topology.number_of_edges())
Esempio n. 14
0
 def test_delays_geo_distance_conversions(self):
     topology = fnss.Topology(distance_unit='m')
     topology.add_edge(1, 2, length=2000)
     specific_delay = 1.2
     fnss.set_delays_geo_distance(topology, specific_delay, None, 'us')
     self.assertAlmostEqual(topology.edge[1][2]['delay'], 2400)
     fnss.clear_delays(topology)
     fnss.set_delays_geo_distance(topology, specific_delay, None, 's')
     self.assertAlmostEqual(topology.edge[1][2]['delay'], 0.0024)
Esempio n. 15
0
 def test_buffer_sizes_bw_delay_prod_unused_links(self):
     topo = fnss.Topology()
     topo.add_edge(1, 2, weight=100)
     topo.add_edge(2, 3, weight=1)
     topo.add_edge(3, 1, weight=1)
     fnss.set_capacities_constant(topo, 10)
     fnss.set_delays_constant(topo, 2)
     fnss.set_buffer_sizes_bw_delay_prod(topo)
     self.assertTrue(all((topo.adj[u][v]['buffer'] is not None
                      for (u, v) in topo.edges())))
Esempio n. 16
0
 def test_to_from(self):
     f = path.join(TMP_DIR, 'jfed-tofrom.rspec')
     t_in = fnss.Topology()
     t_in.add_path([1, 2, 3, 4])
     fnss.to_jfed(t_in, f)
     t_out = fnss.from_jfed(f)
     self.assertEqual(t_in.number_of_nodes(), t_out.number_of_nodes())
     self.assertEqual(t_in.number_of_edges(), t_out.number_of_edges())
     self.assertEqual(set(t_in.degree().values()),
                      set(t_out.degree().values()))
Esempio n. 17
0
 def test_delays_geo_distance_conversions_defaults(self):
     topology = fnss.Topology(distance_unit='m')
     topology.add_edge(1, 2, length=2000)
     topology.add_edge(2, 3, length=3000)
     topology.add_edge(3, 4)
     specific_delay = 1.2
     fnss.set_delays_geo_distance(topology, specific_delay, 3, 's', None)
     self.assertEquals(topology.graph['distance_unit'], 'm')
     self.assertEquals(topology.graph['delay_unit'], 's')
     self.assertAlmostEqual(topology.edge[1][2]['delay'], 0.0024)
     self.assertAlmostEqual(topology.edge[2][3]['delay'], 0.0036)
     self.assertAlmostEqual(topology.edge[3][4]['delay'], 3)
Esempio n. 18
0
 def test_p_median_3(self):
     # Test topology:
     #
     # A ---- C ---- B ----[HIGH DIST] --- E --- D --- F
     #
     # Expected facilities: 1, 4
     t = fnss.Topology()
     nx.add_path(t, "ACBEDF")
     fnss.set_weights_constant(t, 1)
     fnss.set_weights_constant(t, 2, [("B", "E")])
     distances = dict(nx.all_pairs_dijkstra_path_length(t, weight='weight'))
     allocation, facilities, cost = algorithms.compute_p_median(
         distances, 3)
     assert cost == 3
Esempio n. 19
0
    def to_fnss_topology(self):
        """ Creates a FNSS topology from object.

            Returns:
                topo (fnss.Topology): Representation of network in FNSS.
        """
        topo = fnss.Topology()
        topo.graph = self.todict()

        for node in self.nodes.itervalues():
            topo.add_node(node.label, node.todict())
        for edge in self.edges.itervalues():
            topo.add_edge(edge.node_one_id, edge.node_two_id, edge.todict())
        return topo
Esempio n. 20
0
    def test_p_median_4(self):
        """
        Test topology:

        A ---- C ---- B ----[HIGH DIST] --- E --- D --- F

        Expected facilities: 1, 4
        """
        t = fnss.Topology()
        t.add_path("ACBEDF")
        fnss.set_weights_constant(t, 1)
        fnss.set_weights_constant(t, 2, [("B", "E")])
        distances = dict(nx.all_pairs_dijkstra_path_length(t, weight='weight'))
        allocation, facilities, cost = algorithms.compute_p_median(distances, 4)
        self.assertEqual(2, cost)
Esempio n. 21
0
 def test_delays_geo_distance_conversions_partial_assignments(self):
     topology = fnss.Topology(distance_unit='m')
     topology.add_edge(1, 2, length=2000)
     topology.add_edge(2, 3, length=3000)
     topology.add_edge(3, 4)
     specific_delay=1.2
     fnss.set_delays_geo_distance(topology, specific_delay,
                                  None, 'us', links=[(1, 2)])
     fnss.set_delays_geo_distance(topology, specific_delay,
                                  3, 's', links=[(2, 3), (3, 4)])
     self.assertEquals(topology.graph['distance_unit'], 'm')
     self.assertEquals(topology.graph['delay_unit'], 'us')
     self.assertAlmostEqual(topology.edge[1][2]['delay'], 2400)
     self.assertAlmostEqual(topology.edge[2][3]['delay'], 3600)
     self.assertAlmostEqual(topology.edge[3][4]['delay'], 3000000)
Esempio n. 22
0
    def test_p_median_6(self):
        """
        Test topology:

        A ---- C ---- B ----[HIGH DIST] --- E --- D --- F

        Expected facilities: 1, 4
        """
        t = fnss.Topology()
        t.add_path("ACBEDF")
        fnss.set_weights_constant(t, 1)
        fnss.set_weights_constant(t, 2, [("B", "E")])
        distances = nx.all_pairs_dijkstra_path_length(t, weight='weight')
        allocation, facilities, cost = algorithms.compute_p_median(
            distances, 6)
        self.assertDictEqual({i: i for i in "ABCDEF"}, allocation)
        self.assertSetEqual(set("ABCDEF"), facilities)
        self.assertEqual(0, cost)
Esempio n. 23
0
    def test_p_median_6(self):
        """
        Test topology:

        A ---- C ---- B ----[HIGH DIST] --- E --- D --- F

        Expected facilities: 1, 4
        """
        t = fnss.Topology()
        nx.add_path(t, "ACBEDF")
        fnss.set_weights_constant(t, 1)
        fnss.set_weights_constant(t, 2, [("B", "E")])
        distances = dict(nx.all_pairs_dijkstra_path_length(t, weight='weight'))
        allocation, facilities, cost = algorithms.compute_p_median(
            distances, 6)
        assert {i: i for i in "ABCDEF"} == allocation
        assert set("ABCDEF") == facilities
        assert 0 == cost
Esempio n. 24
0
 def test_base_topology_class(self):
     weight = 2
     capacity = 3
     delay = 4
     buffer_size = 5
     topology = fnss.Topology()
     topology.add_path([1, 2, 3])
     fnss.set_weights_constant(topology, weight)
     fnss.set_capacities_constant(topology, capacity)
     fnss.set_delays_constant(topology, delay)
     fnss.set_buffer_sizes_constant(topology, buffer_size)
     weights = topology.weights()
     capacities = topology.capacities()
     delays = topology.delays()
     buffer_sizes = topology.buffers()
     for e in topology.edges():
         self.assertEqual(weight, weights[e])
         self.assertEqual(capacity, capacities[e])
         self.assertEqual(delay, delays[e])
         self.assertEqual(buffer_size, buffer_sizes[e])
Esempio n. 25
0
def extract_cluster_level_topology(topology):
    """Build a cluster-level topology.

    Each node in the topology must be have the 'cluster' attribute

    Parameters
    ----------
    topology : Topology
        The router-level topology

    Returns
    -------
    topology : Topology
        The cluster-level topology

    Notes
    -----
     * Each router must have a cache deployed
     * All sources and receiver must have one single attachment point with a
       cache
     * Each node must be labelled with cluster
    """
    cluster_map = nx.get_node_attributes(topology, 'cluster')
    if len(cluster_map) < topology.number_of_nodes():
        raise ValueError(
            'There are nodes not labelled with cluster information')
    if nx.number_connected_components(topology) > 1:
        raise ValueError('There is more than one connected component')
    cluster_topology = fnss.Topology()
    cluster_set = set(cluster_map.values())
    if len(cluster_set) == 1:
        # There is only one huge cluster
        cluster_topology.add_node(cluster_set.pop())
        return cluster_topology
    for u, v in topology.edges():
        cluster_u = cluster_map[u]
        cluster_v = cluster_map[v]
        if cluster_u != cluster_v:
            cluster_topology.add_edge(cluster_u, cluster_v)
    return cluster_topology
Esempio n. 26
0
 def test_p_median(self):
     # Test topology:
     #
     # A ---- B ---- C ----[HIGH DIST] --- D --- E --- F
     #
     # Expected facilities: 1, 4
     t = fnss.Topology()
     nx.add_path(t, "ABCDEF")
     fnss.set_weights_constant(t, 1)
     fnss.set_weights_constant(t, 2, [("C", "D")])
     distances = dict(nx.all_pairs_dijkstra_path_length(t, weight='weight'))
     allocation, facilities, cost = algorithms.compute_p_median(
         distances, 2)
     assert allocation == {
         "A": "B",
         "B": "B",
         "C": "B",
         "D": "E",
         "E": "E",
         "F": "E",
     }
     assert facilities == set("BE")
     assert cost == 4
Esempio n. 27
0
def nrr_topology():
    """Return topology for testing NRR caching strategies
    """
    # Topology sketch
    #
    # 0 ---- 2----- 4
    #        |       \
    #        |        6
    #        |       /
    # 1 ---- 3 ---- 5
    #
    topology = fnss.Topology()
    topology.add_path([0, 2, 4, 6, 5, 3, 1])
    topology.add_edge(2, 3)
    receivers = (0, 1)
    source = (6)
    caches = (2, 3, 4, 5)
    contents = (1, 2, 3, 4)
    fnss.add_stack(topology, source, 'source', {'contents': contents})
    for v in caches:
        fnss.add_stack(topology, v, 'router', {'cache_size': 1})
    for v in receivers:
        fnss.add_stack(topology, v, 'receiver', {})
    return topology
Esempio n. 28
0
 def test_multicast_tree(self):
     topo = fnss.Topology()
     nx.add_path(topo, [2, 1, 3, 4])
     sp = dict(nx.all_pairs_shortest_path(topo))
     tree = util.multicast_tree(sp, 1, [2, 3])
     assert set(tree) == {(1, 2), (1, 3)}
Esempio n. 29
0
 def test_multicast_tree(self):
     topo = fnss.Topology()
     topo.add_path([2, 1, 3, 4])
     sp = nx.all_pairs_shortest_path(topo)
     tree = util.multicast_tree(sp, 1, [2, 3])
     self.assertSetEqual(set(tree), set([(1, 2), (1, 3)]))
Esempio n. 30
0
 def test_to_jfed(self):
     t = fnss.Topology()
     t.add_path([1, 2, 3, 4])
     fnss.to_jfed(t, path.join(TMP_DIR, 'jfed-to.rspec'))
     pass