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))
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))
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
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
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)])
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)
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)])
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)])
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)
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'))