Exemple #1
0
 def test_ring_connectivity(n):
     G = fnss.ring_topology(n)
     self.assertEqual(n, G.number_of_nodes())
     self.assertEqual(n, G.number_of_edges())
     for i in range(n):
         self.assertTrue(G.has_edge(i, (i + 1) % n))
         self.assertTrue(G.has_edge(i, (i - 1) % n))
Exemple #2
0
 def test_ring_connectivity(n):
     G = fnss.ring_topology(n)
     self.assertEquals(n, G.number_of_nodes())
     self.assertEquals(n, G.number_of_edges())
     for i in range(n):
         self.assertTrue(G.has_edge(i, (i + 1) % n))
         self.assertTrue(G.has_edge(i, (i - 1) % n))
Exemple #3
0
def off_path_topology():
    """Return topology for testing off-path caching strategies
    """
    # Topology sketch
    #
    #     --------- 5 ----------  
    #    /                      \
    #   /                        \
    # 0 ---- 1 ---- 2 ---- 3 ---- 4 
    #               |
    #               |
    #               6
    #
    topology = fnss.ring_topology(6)
    topology.add_edge(2, 6)
    topology.add_edge(1, 7)
    source = 4
    receivers = (0, 6, 7) 
    caches = (1, 2, 3, 5)
    contents = caches
    fnss.add_stack(topology, source, 'source', {'contents': contents})
    for v in caches:
        fnss.add_stack(topology, v, 'cache', {'size': 1})
    for v in receivers:
        fnss.add_stack(topology, v, 'receiver', {})
    topology.graph['cache_policy'] = 'FIFO'
    return topology
Exemple #4
0
def off_path_topology():
    """Return topology for testing off-path caching strategies
    """
    # Topology sketch
    #
    #     --------- 5 ----------
    #    /                      \
    #   /                        \
    # 0 ---- 1 ---- 2 ---- 3 ---- 4
    #               |
    #               |
    #               6
    #
    topology = fnss.ring_topology(6)
    topology.add_edge(2, 6)
    topology.add_edge(1, 7)
    source = 4
    receivers = (0, 6, 7)
    caches = (1, 2, 3, 5)
    contents = caches
    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
Exemple #5
0
    def test_link_loads_ecmp(self):
        topo = fnss.ring_topology(5)
        topo.add_edge(1, 3)
        fnss.set_capacities_constant(topo, 100, capacity_unit='Mbps')
        tm = fnss.TrafficMatrix(volume_unit='Mbps')
        tm.add_flow(0, 1, 20)
        tm.add_flow(1, 0, 30)
        tm.add_flow(0, 2, 40)
        tm.add_flow(1, 4, 70)
        rm = {
            0: {
                0: [[0]],
                1: [[0, 1]],
                2: [[0, 1, 2]],
                3: [[0, 1, 3], [0, 4, 3]],
                4: [[0, 4]]
            },
            1: {
                0: [[1, 0]],
                1: [[1]],
                2: [[1, 2]],
                3: [[1, 3]],
                4: [[1, 3, 4], [1, 0, 4]]
            },
            2: {
                0: [[2, 1, 0]],
                1: [[2, 1]],
                2: [[2]],
                3: [[2, 3]],
                4: [[2, 3, 4]]
            },
            3: {
                0: [[3, 1, 0], [3, 4, 0]],
                1: [[3, 1]],
                2: [[3, 2]],
                3: [[3]],
                4: [[3, 4]]
            },
            4: {
                0: [[4, 0]],
                1: [[4, 0, 1], [4, 3, 1]],
                2: [[4, 3, 2]],
                3: [[4, 3]],
                4: [[4]]
            }
        }

        load = fnss.link_loads(topo, tm, routing_matrix=rm, ecmp=True)
        self.assertAlmostEqual(0.6, load[(0, 1)])
        self.assertAlmostEqual(0.65, load[(1, 0)])
        self.assertAlmostEqual(0.4, load[(1, 2)])
        self.assertAlmostEqual(0.0, load[(2, 1)])
        self.assertAlmostEqual(0.35, load[(0, 4)])
        self.assertAlmostEqual(0.35, load[(3, 4)])
        self.assertAlmostEqual(0.0, load[(4, 3)])
        self.assertAlmostEqual(0.0, load[(4, 0)])
        self.assertAlmostEqual(0.0, load[(2, 1)])
        self.assertAlmostEqual(0.0, load[(2, 3)])
Exemple #6
0
 def test_od_pairs_from_topology_undirected(self):
     topology = fnss.ring_topology(3)
     topology.add_path([7, 8, 9]) # isolated node: no flows from/to this node 
     od_pairs = fnss.od_pairs_from_topology(topology)
     expected_od_pairs = [(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1),
                          (7, 8), (7, 9), (8, 7), (8, 9), (9, 7), (9, 8)]
     self.assertEquals(len(expected_od_pairs), len(od_pairs))
     for od in expected_od_pairs:
         self.assertTrue(od in od_pairs)
Exemple #7
0
 def test_od_pairs_from_topology_undirected(self):
     topology = fnss.ring_topology(3)
     topology.add_path([7, 8, 9])  # isolated node: no flows from/to this node
     od_pairs = fnss.od_pairs_from_topology(topology)
     expected_od_pairs = [(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1),
                          (7, 8), (7, 9), (8, 7), (8, 9), (9, 7), (9, 8)]
     self.assertEquals(len(expected_od_pairs), len(od_pairs))
     for od in expected_od_pairs:
         self.assertTrue(od in od_pairs)
Exemple #8
0
    def test_link_loads_ecmp(self):
        topo = fnss.ring_topology(5)
        topo.add_edge(1, 3)
        fnss.set_capacities_constant(topo, 100, capacity_unit='Mbps')
        tm = fnss.TrafficMatrix(volume_unit='Mbps')
        tm.add_flow(0, 1, 20)
        tm.add_flow(1, 0, 30)
        tm.add_flow(0, 2, 40)
        tm.add_flow(1, 4, 70)
        rm = {0 :
                { 0: [[0]],
                  1: [[0, 1]],
                  2: [[0, 1, 2]],
                  3: [[0, 1, 3], [0, 4, 3]],
                  4: [[0, 4]]
                },
              1 :
                { 0: [[1, 0]],
                  1: [[1]],
                  2: [[1, 2]],
                  3: [[1, 3]],
                  4: [[1, 3, 4], [1, 0, 4]]
                },
              2 :
                { 0: [[2, 1, 0]],
                  1: [[2, 1]],
                  2: [[2]],
                  3: [[2, 3]],
                  4: [[2, 3, 4]]
                },
              3 :
                { 0: [[3, 1, 0], [3, 4, 0]],
                  1: [[3, 1]],
                  2: [[3, 2]],
                  3: [[3]],
                  4: [[3, 4]]
                },
              4 :
                { 0: [[4, 0]],
                  1: [[4, 0, 1], [4, 3, 1]],
                  2: [[4, 3, 2]],
                  3: [[4, 3]],
                  4: [[4]]
                }}

        load = fnss.link_loads(topo, tm, routing_matrix=rm, ecmp=True)
        self.assertAlmostEqual(0.6, load[(0, 1)])
        self.assertAlmostEqual(0.65, load[(1, 0)])
        self.assertAlmostEqual(0.4, load[(1, 2)])
        self.assertAlmostEqual(0.0, load[(2, 1)])
        self.assertAlmostEqual(0.35, load[(0, 4)])
        self.assertAlmostEqual(0.35, load[(3, 4)])
        self.assertAlmostEqual(0.0, load[(4, 3)])
        self.assertAlmostEqual(0.0, load[(4, 0)])
        self.assertAlmostEqual(0.0, load[(2, 1)])
        self.assertAlmostEqual(0.0, load[(2, 3)])
Exemple #9
0
 def test_link_loads(self):
     topo = fnss.ring_topology(5)
     fnss.set_capacities_constant(topo, 100, capacity_unit='Mbps')
     tm = fnss.TrafficMatrix(volume_unit='Mbps')
     tm.add_flow(0, 1, 20)
     tm.add_flow(1, 0, 30)
     tm.add_flow(0, 2, 40)
     tm.add_flow(1, 4, 70)
     tm.add_flow(4, 2, 50)
     load = fnss.link_loads(topo, tm)
     self.assertAlmostEqual(0.6, load[(0, 1)])
     self.assertAlmostEqual(1.0, load[(1, 0)])
     self.assertAlmostEqual(0.4, load[(1, 2)])
     self.assertAlmostEqual(0.0, load[(2, 1)])
     self.assertAlmostEqual(0.7, load[(0, 4)])
     self.assertAlmostEqual(0.5, load[(4, 3)])
Exemple #10
0
 def test_link_loads(self):
     topo = fnss.ring_topology(5)
     fnss.set_capacities_constant(topo, 100, capacity_unit='Mbps')
     tm = fnss.TrafficMatrix(volume_unit='Mbps')
     tm.add_flow(0, 1, 20)
     tm.add_flow(1, 0, 30)
     tm.add_flow(0, 2, 40)
     tm.add_flow(1, 4, 70)
     tm.add_flow(4, 2, 50)
     load = fnss.link_loads(topo, tm)
     self.assertAlmostEqual(0.6, load[(0, 1)])
     self.assertAlmostEqual(1.0, load[(1, 0)])
     self.assertAlmostEqual(0.4, load[(1, 2)])
     self.assertAlmostEqual(0.0, load[(2, 1)])
     self.assertAlmostEqual(0.7, load[(0, 4)])
     self.assertAlmostEqual(0.5, load[(4, 3)])
Exemple #11
0
def topology_ring(n, delay_int=1, delay_ext=5, **kwargs):
    """Returns a ring topology

    This topology is comprised of a ring of *n* nodes. Each of these nodes is
    attached to a receiver. In addition one router is attached to a source.
    Therefore, this topology has in fact 2n + 1 nodes.

    It models the case of a metro ring network, with many receivers and one
    only source towards the core network.

    Parameters
    ----------
    n : int
        The number of routers in the ring
    delay_int : float
        The internal link delay in milliseconds
    delay_ext : float
        The external link delay in milliseconds

    Returns
    -------
    topology : IcnTopology
        The topology object
    """
    topology = fnss.ring_topology(n)
    topology.graph['type'] = "TREE"
    routers = range(n)
    receivers = range(n, 2 * n)
    source = 2 * n
    internal_links = zip(routers, receivers)
    external_links = [(routers[0], source)]
    for u, v in internal_links:
        topology.add_edge(u, v, type='internal')
    for u, v in external_links:
        topology.add_edge(u, v, type='external')
    topology.graph['icr_candidates'] = set(routers)
    fnss.add_stack(topology, source, 'source')
    for v in receivers:
        fnss.add_stack(topology, v, 'receiver')
    for v in routers:
        fnss.add_stack(topology, v, 'router')
    # set weights and delays on all links
    fnss.set_weights_constant(topology, 1.0)
    fnss.set_delays_constant(topology, delay_int, 'ms', internal_links)
    fnss.set_delays_constant(topology, delay_ext, 'ms', external_links)
    return IcnTopology(topology)
Exemple #12
0
def scenario_simple_test():
    """
    Makes simple scenario for test puropses
    """
    def gen_event(receivers, contents):
        return {'receiver': choice(receivers), 'content': choice(contents)}
    contents = {5: [1, 2, 3, 4], 7: [5, 6, 7, 8]}
    n_caches = 4
    size = 5
    topology = fnss.ring_topology(n_caches)
    for u in range(n_caches):
        v = u + n_caches
        topology.add_edge(u, v)
        fnss.add_stack(topology, u, 'cache', {'size': size})
        if u % 2 == 0:
            fnss.add_stack(topology, v, 'receiver', {})
        else:
            fnss.add_stack(topology, v, 'source', {'contents': contents[v]})
    
    event_schedule = fnss.poisson_process_event_schedule(20, 0, 300, 'ms', 
                                                gen_event, [4, 6], range(1, 9))
    fnss.write_topology(topology, path.join(scenarios_dir, 'TOPO_TEST.xml'))
    fnss.write_event_schedule(event_schedule, path.join(scenarios_dir, 'ES_TEST.xml'))