topologygenerator 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/CODE_OF_CONDUCT.md +49 -0
  6. data/Gemfile +10 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +35 -0
  9. data/Rakefile +6 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/lib/behaviors/serialize_behavior.rb +14 -0
  13. data/lib/builders_examples/pdm_builders/PhaseI/Flow_concrete_builder.rb +82 -0
  14. data/lib/builders_examples/pdm_builders/PhaseI/Host_concrete_builder.rb +24 -0
  15. data/lib/builders_examples/pdm_builders/PhaseI/Link_concrete_builder.rb +150 -0
  16. data/lib/builders_examples/pdm_builders/PhaseI/Router_concrete_builder.rb +24 -0
  17. data/lib/builders_examples/pdm_builders/PhaseI/output_concrete_builder.rb +86 -0
  18. data/lib/builders_examples/pdm_builders/PhaseI/pdm_constants.rb +111 -0
  19. data/lib/builders_examples/pdm_builders/PhaseIWithPriorityQueues/Flow_concrete_builder.rb +82 -0
  20. data/lib/builders_examples/pdm_builders/PhaseIWithPriorityQueues/Host_concrete_builder.rb +335 -0
  21. data/lib/builders_examples/pdm_builders/PhaseIWithPriorityQueues/Link_concrete_builder.rb +25 -0
  22. data/lib/builders_examples/pdm_builders/PhaseIWithPriorityQueues/Router_concrete_builder.rb +449 -0
  23. data/lib/builders_examples/pdm_builders/PhaseIWithPriorityQueues/output_concrete_builder.rb +229 -0
  24. data/lib/builders_examples/ruby_builders/Flow_concrete_builder.rb +5 -0
  25. data/lib/builders_examples/ruby_builders/Host_concrete_builder.rb +5 -0
  26. data/lib/builders_examples/ruby_builders/Link_concrete_builder.rb +5 -0
  27. data/lib/builders_examples/ruby_builders/Router_concrete_builder.rb +5 -0
  28. data/lib/builders_examples/ruby_builders/output_concrete_builder.rb +78 -0
  29. data/lib/command_line/command_line_arguments.rb +59 -0
  30. data/lib/createTopology.rb +10 -0
  31. data/lib/flows_distributions/constant_distribution.rb +7 -0
  32. data/lib/flows_distributions/exponential_distribution.rb +7 -0
  33. data/lib/flows_distributions/normal_distribution.rb +8 -0
  34. data/lib/flows_distributions/pareto_distribution.rb +9 -0
  35. data/lib/flows_distributions/split_distribution.rb +8 -0
  36. data/lib/network_entities/abstracts/flow.rb +27 -0
  37. data/lib/network_entities/abstracts/network_element.rb +19 -0
  38. data/lib/network_entities/abstracts/path.rb +16 -0
  39. data/lib/network_entities/physical/host.rb +10 -0
  40. data/lib/network_entities/physical/link.rb +36 -0
  41. data/lib/network_entities/physical/router.rb +12 -0
  42. data/lib/network_entities/topology.rb +69 -0
  43. data/lib/network_topologies_examples/PhaseI_onlyLAr_1FelixTo1SWROD.rb +93 -0
  44. data/lib/network_topologies_examples/octopus_topology.rb +66 -0
  45. data/lib/network_topologies_examples/phase1_topology_mininet/tdaq +4 -0
  46. data/lib/network_topologies_examples/phase1_topology_mininet/tdaq.py +99 -0
  47. data/lib/network_topologies_examples/sofisticated_octopus_topology.rb +121 -0
  48. data/lib/network_topologies_examples/tdaq_network_topology.rb +76 -0
  49. data/lib/network_topologies_examples/tdaq_topology_example.rb +119 -0
  50. data/lib/network_topologies_examples/tree_topology.rb +102 -0
  51. data/lib/output/FlowDefinitions.cpp +109 -0
  52. data/lib/output/copy_files.sh +8 -0
  53. data/lib/output/flows_definition.scilabParams +30 -0
  54. data/lib/output/hosts_definition.scilabParams +5 -0
  55. data/lib/output/links_definition.scilabParams +48 -0
  56. data/lib/output/routers_definition.scilabParams +24 -0
  57. data/lib/output/ruby_network_topology.rb +76 -0
  58. data/lib/output/topology.pdm +5321 -0
  59. data/lib/output_builder.rb +39 -0
  60. data/lib/providers/apis/onos_topology_provider.rb +146 -0
  61. data/lib/providers/customs/custom_topology_provider.rb +14 -0
  62. data/lib/providers/interface_topology_provider.rb +11 -0
  63. data/lib/topologygenerator/version.rb +3 -0
  64. data/lib/topologygenerator.rb +34 -0
  65. data/lib/utils/custom_files_utils.rb +16 -0
  66. data/topologygenerator.gemspec +45 -0
  67. metadata +188 -0
@@ -0,0 +1,5 @@
1
+ module LinkConcreteBuilder
2
+ def build_output_representation
3
+ "@topology.add_link \"#{id}\", #{src_element.id}, #{src_port}, #{dst_element.id}, #{dst_port}, #{bandwith}"
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module RouterConcreteBuilder
2
+ def build_output_representation
3
+ "routers.push @topology.add_router \"#{id}\", #{priority_weights}"
4
+ end
5
+ end
@@ -0,0 +1,78 @@
1
+ module OutputConcreteBuilder
2
+ OUTPUT_RUBY_FILE_NAME = 'ruby_network_topology.rb'
3
+
4
+ def initialize_concrete_builder(topology_provider, directory_concrete_builders, output_directory)
5
+ @topology_provider = topology_provider
6
+ @directory_concrete_builders = directory_concrete_builders # make's sense?
7
+ @output_directory = output_directory
8
+ end
9
+
10
+ def build_output_content
11
+ graph_elements = topology_provider.get_topology
12
+
13
+ graph_elements = graph_elements.select { |elem| [Host,Link,Router].include? elem.class }
14
+
15
+ ruby_network_topology = "module NetworkTopology \n"
16
+
17
+ get_topology_function_def =" def get_topology \n "
18
+ get_topology_function_def +=" return @topology.topology_elements if @topology.topology_elements.size != 0 \n"
19
+ get_topology_function_def +=" hosts = [] \n "
20
+ get_topology_function_def +=" routers = [] \n"
21
+ get_topology_function_def +=" links = [] \n"
22
+ get_topology_function_def +="\n"
23
+
24
+ get_topology_function_def += add_elements_of_type graph_elements, Host
25
+ get_topology_function_def += add_elements_of_type graph_elements, Router
26
+ get_topology_function_def += add_elements_of_type graph_elements, Link
27
+
28
+ get_topology_function_def +=" @topology.topology_elements \n "
29
+ get_topology_function_def +=" end \n"
30
+
31
+ get_path_definition_function_def = " def get_path_between(source, destination) \n"
32
+ get_path_definition_function_def += " raise NotImplementedError, \"NetworkTopology: This method is not implemented (¿does it ever get called?)\" \n"
33
+ get_path_definition_function_def += " end \n"
34
+
35
+ ruby_network_topology += get_topology_function_def
36
+ ruby_network_topology += "\n"
37
+ ruby_network_topology += get_path_definition_function_def
38
+ ruby_network_topology += 'end'
39
+
40
+
41
+ write_file "#{@output_directory}/#{OUTPUT_RUBY_FILE_NAME}",
42
+ ruby_network_topology
43
+ end
44
+
45
+ def add_elements_of_type(graph_elements, type)
46
+ elements_to_add = graph_elements.select { |elem| elem.is_a? type }
47
+
48
+ elements_def = ''
49
+
50
+ elements_to_add.each do |element|
51
+ elements_def += " #{element.transform_to_output_representation @directory_concrete_builders} \n"
52
+ end
53
+
54
+ elements_def = replace_ids_host_router_for_index graph_elements, elements_def if type == Link
55
+
56
+ elements_def += "\n"
57
+ elements_def
58
+ end
59
+
60
+ def replace_ids_host_router_for_index(graph_elements, links_definition)
61
+ # Links have a dst and a src. These elements are in one of either hosts or routers array,
62
+ # however the index is unkown for the Link!, Instead of serializing the src/dst, the link
63
+ # prints it's element id. We now have to find this id (which is a string), and replace it by the
64
+ # corresponding element of the array.
65
+ hosts = graph_elements.select { |elem| elem.is_a? Host }
66
+ routers = graph_elements.select { |elem| elem.is_a? Router }
67
+
68
+ hosts.each_with_index do |host,index|
69
+ links_definition.gsub! host.id, "hosts[#{index}]"
70
+ end
71
+
72
+ routers.each_with_index do |router,index|
73
+ links_definition.gsub! router.id, "routers[#{index}]"
74
+ end
75
+
76
+ links_definition
77
+ end
78
+ end
@@ -0,0 +1,59 @@
1
+ require 'commander'
2
+ require 'uri'
3
+ require 'byebug'
4
+
5
+ class CommandLineArguments
6
+ include Commander::Methods
7
+
8
+ attr_reader :source, :uri_resource, :output_directory, :directory_concrete_builders
9
+
10
+ def run
11
+ program :name, 'Create PowerDevs topology'
12
+ program :version, '0.0.1'
13
+ program :description, 'Script for creating PowerDevs topology. The output will be a .pdm file'
14
+ program :help, 'Author', 'Andrés Laurito && Matias Bonaventura'
15
+
16
+ my_command_line_argument = self
17
+
18
+ my_command = command :source do |c|
19
+ c.syntax = 'createTopology source [OPTIONS]'
20
+ c.summary = 'Specify data source for retrieving the topology'
21
+ c.description = 'Specify the data source from where the topology should be retrieved
22
+ An example of use: createTopology source ONOS
23
+ By default, the option is set in CUSTOM.
24
+ You can also set the output file with the -f option. For example, createTopology source ONOS -f topology
25
+ By default, the output will be written in a file called my_topology'
26
+ c.example 'Set ONOS as source', 'createTopology source -n ONOS'
27
+ c.example 'Set CUSTOM as source', 'createTopology source -n CUSTOM'
28
+ c.example 'Set CUSTOM as source and called the output file my_file', 'createTopology source -n MOCK -f my_file'
29
+ c.option '-n', '--name NAME', String, 'Specify the source name'
30
+ c.option '-o', '--outDir NAME', String, 'Specify the output directory path'
31
+ c.option '-u', '--uri NAME', String, 'Specify the uri for the source'
32
+ c.option '-d', '--dirBuilders NAME', String, 'Specify the directory where the builders are located'
33
+ c.action do |args, options|
34
+ options.default :file => 'my_topology'
35
+ options.default :outDir => 'output'
36
+ options.default :dirBuilders => 'builders_examples/pdm_builders/PhaseI'
37
+ new_source = options.name
38
+ raise ArgumentError, "The source '#{new_source}' is not one of the expected. Please type source --help to more information." unless ['ONOS','CUSTOM'].include? new_source
39
+
40
+ if new_source == 'ONOS'
41
+ new_uri_resource = options.uri
42
+ new_uri_resource = ask 'http source for ONOS?:(example http://127.0.0.1:8181/onos/v1/)' unless new_uri_resource
43
+ raise ArgumentError, "You must specify a valid http source when the option ONOS is selected. #{new_uri_resource} is not a valid one" unless new_uri_resource =~ /\A#{URI::regexp(['http', 'https'])}\z/
44
+ elsif new_source == 'CUSTOM'
45
+ new_uri_resource = options.uri
46
+ new_uri_resource = ask 'uri source for CUSTOM?:(example network_topologies_examples/tree_topology.rb)' unless new_uri_resource
47
+ raise ArgumentError, "You must specify a valid uri source when the option CUSTOM is selected. #{new_uri_resource} is not a valid one" unless File.exists? new_uri_resource
48
+ end
49
+
50
+ @source = new_source
51
+ @uri_resource = new_uri_resource
52
+ @output_directory = options.outDir
53
+ @directory_concrete_builders = options.dirBuilders
54
+ end
55
+ end
56
+
57
+ run!
58
+ end
59
+ end
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative 'command_line/command_line_arguments.rb'
4
+ require_relative "./topology_generator.rb"
5
+
6
+ my_command_line_arguments = CommandLineArguments.new
7
+ my_command_line_arguments.run
8
+
9
+ topo_gen = topologygenerator.new my_command_line_arguments
10
+ topo_gen.generate
@@ -0,0 +1,7 @@
1
+ class ConstantDistribution
2
+ attr_reader :value
3
+
4
+ def initialize(value)
5
+ @value = value
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ class ExponentialDistribution
2
+ attr_reader :mu
3
+
4
+ def initialize(mu)
5
+ @mu = mu
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ class NormalDistribution
2
+ attr_reader :mu, :var
3
+
4
+ def initialize(mu, var)
5
+ @mu = mu
6
+ @var = var
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ class ParetoDistribution
2
+ attr_reader :val_1, :val_2, :mean
3
+
4
+ def initialize(val_1, val_2, mean)
5
+ @val_1 = val_1
6
+ @val_2 = val_2
7
+ @mean = mean
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ class SplitDistribution
2
+ attr_reader :shape, :scale
3
+
4
+ def initialize(shape, scale)
5
+ @shape = shape
6
+ @scale = scale
7
+ end
8
+ end
@@ -0,0 +1,27 @@
1
+ require_relative '../../behaviors/serialize_behavior.rb'
2
+ require_relative '../../flows_distributions/constant_distribution.rb'
3
+ require_relative '../../flows_distributions/exponential_distribution.rb'
4
+ require_relative '../../flows_distributions/normal_distribution.rb'
5
+ require_relative '../../flows_distributions/pareto_distribution.rb'
6
+ require_relative '../../flows_distributions/split_distribution.rb'
7
+
8
+ class Flow
9
+ include SerializeBehavior
10
+
11
+ attr_accessor :id, :priority, :paths, :distribution_rate, :distribution_size
12
+
13
+ def initialize(id, priority, paths, distribution_rate, distribution_size)
14
+ raise "Invalid 'priority' argument received. Priority must be a number, #{priority} was received" unless priority.is_a? Integer
15
+ raise "Invalid 'paths' argument received. 'paths' must be an instance of Arry class, however the path received has class #{paths.class}" unless paths.is_a? Array
16
+ raise "Invalid 'distribution_rate' received. Distribution rate cannot be nil" unless distribution_rate
17
+ raise "Invalid 'distribution_size' received. Distribution size cannot be nil" unless distribution_size
18
+ raise "Invalid 'distribution_rate' #{distribution_rate}. It is expected that the rate is an instance of a distribution" unless [ConstantDistribution, ExponentialDistribution, NormalDistribution, ParetoDistribution, SplitDistribution].include? distribution_rate.class
19
+ raise "Invalid 'distribution_size' #{distribution_size}. It is expected that the size is an instance of a distribution" unless [ConstantDistribution, ExponentialDistribution, NormalDistribution, ParetoDistribution, SplitDistribution].include? distribution_size.class
20
+
21
+ @id = id
22
+ @priority = priority
23
+ @paths = paths
24
+ @distribution_rate = distribution_rate
25
+ @distribution_size = distribution_size
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ require_relative '../../behaviors/serialize_behavior.rb'
2
+
3
+ class NetworkElement
4
+ include SerializeBehavior
5
+
6
+ attr_reader :id, :my_number, :out_elements, :in_elements
7
+
8
+ def initialize(id)
9
+ @my_number = self.increase_quantity_in_one
10
+ @id = id
11
+ @out_elements = []
12
+ @in_elements = []
13
+ end
14
+
15
+ def increase_quantity_in_one
16
+ @@quantity ||= 0
17
+ @@quantity += 1
18
+ end
19
+ end
@@ -0,0 +1,16 @@
1
+ class Path
2
+ attr_reader :links, :source, :destination
3
+
4
+ def initialize(source, destination)
5
+ raise "Invalid 'source' argument received. Path must contain a source" unless source
6
+ raise "Invalid 'destination' argument received. Path must contain a destination" unless destination
7
+
8
+ @source = source
9
+ @destination = destination
10
+ @links = []
11
+ end
12
+
13
+ def add_link(link)
14
+ @links.push link
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ require_relative '../abstracts/network_element.rb'
2
+
3
+ class Host < NetworkElement
4
+ attr_accessor :gateway_id, :gateway_port, :queue_capacity
5
+
6
+ def initialize(id, queue_capacity=-1)
7
+ @queue_capacity = queue_capacity
8
+ super id
9
+ end
10
+ end
@@ -0,0 +1,36 @@
1
+ require_relative '../abstracts/network_element.rb'
2
+
3
+ class Link < NetworkElement
4
+
5
+ attr_reader :src_element, :src_port, :dst_element, :dst_port, :bandwith, :delay
6
+
7
+ "port numbers are 0-based (like in the c++ of powerdevs)"
8
+ def initialize(id, src_element, src_port, dst_element, dst_port, bandwith = 500*1000*1000, delay = 0)
9
+
10
+ bandwith ||= 500*1000*1000 # 500 Mb/s
11
+ delay ||= 0
12
+
13
+ raise "Attempted to create an invalid Link. Invalid source #{src_element}" if (!src_element.is_a? Router) && (!src_element.is_a? Host)
14
+ raise "Attempted to create an invalid Link. Invalid destination '#{dst_element}'" if (!dst_element.is_a? Router) && (!dst_element.is_a? Host)
15
+ raise "Attempted to create an invalid Link. Invalid source port '#{src_port}' must be an integer" if (!src_port.is_a? Integer)
16
+ raise "Attempted to create an invalid Link. Invalid destination port '#{dst_port}' must be an integer" if (!dst_port.is_a? Integer)
17
+ raise "Invalid Source port. Port '#{src_port}' already in use for '#{src_element}'" if src_element.out_elements[src_port]
18
+ raise "Invalid Destination port. Port '#{dst_port}' already in use for '#{dst_element}'" if dst_element.in_elements[dst_port]
19
+ raise "#{src} was not found as an element of the topology" if src_element.nil?
20
+ raise "#{dst} was not found as an element of the topology" if dst_element.nil?
21
+ raise "Bandwith must be a number, #{bandwith} was recieved" unless bandwith.is_a? Integer
22
+
23
+ @src_element = src_element
24
+ @src_port = src_port
25
+ @dst_element = dst_element
26
+ @dst_port = dst_port
27
+ @bandwith = bandwith # Expressed in bits per second (bit/s)
28
+ @delay = delay
29
+
30
+ # add each other
31
+ @src_element.out_elements[src_port] = @dst_element
32
+ @dst_element.in_elements[dst_port] = @src_element
33
+
34
+ super id
35
+ end
36
+ end
@@ -0,0 +1,12 @@
1
+ require_relative '../abstracts/network_element.rb'
2
+
3
+ class Router < NetworkElement
4
+
5
+ attr_reader :priority_weights, :buffer
6
+
7
+ def initialize(id, priority_weights=[1], buffer=-1)
8
+ @priority_weights = priority_weights
9
+ @buffer = buffer
10
+ super id
11
+ end
12
+ end
@@ -0,0 +1,69 @@
1
+ require_relative "abstracts/network_element.rb"
2
+ require_relative "abstracts/flow.rb"
3
+ require_relative "physical/host.rb"
4
+ require_relative "physical/link.rb"
5
+ require_relative "physical/router.rb"
6
+
7
+ "A helper class to build consistent topologies"
8
+ class Topology
9
+ attr_reader :topology_elements
10
+
11
+ def initialize
12
+ @topology_elements = []
13
+ end
14
+
15
+ def get_element_by_id(element_id)
16
+ @topology_elements.find{|x| x.id == element_id }
17
+ end
18
+
19
+ def elements_of_type(type)
20
+ @topology_elements.select { |elem| elem.is_a? type }
21
+ end
22
+
23
+ def links
24
+ elements_of_type Link
25
+ end
26
+
27
+ def add_host(id)
28
+ raise "ID '#{id}' already exists in topology" if get_element_by_id id
29
+
30
+ new_host = Host.new id
31
+ @topology_elements.push new_host
32
+ new_host
33
+ end
34
+
35
+ def add_router(id, priority_weights=[1], buffer=-1)
36
+ raise "ID '#{id}' already exists in topology" if get_element_by_id id
37
+
38
+ new_router = Router.new id, priority_weights, buffer
39
+ @topology_elements.push new_router
40
+ new_router
41
+ end
42
+
43
+ def add_link(id, src, src_port, dst, dst_port, bandwith = nil)
44
+ raise "ID '#{id}' already exists in topology" if get_element_by_id id
45
+
46
+ # if they sent the id of the src or dst => search the object
47
+ src_node = (src.is_a? NetworkElement) ? src : (get_element_by_id src)
48
+ dst_node = (dst.is_a? NetworkElement) ? dst : (get_element_by_id dst)
49
+
50
+ new_link = Link.new id, src_node, src_port, dst_node, dst_port, bandwith
51
+ @topology_elements.push new_link
52
+ new_link
53
+ end
54
+
55
+ def add_full_duplex_link(id, src, src_port, dst, dst_port, bandwith = nil)
56
+ add_link("#{id}_up", src, src_port, dst, dst_port, bandwith) # up
57
+ add_link("#{id}_down", dst, dst_port, src, src_port, bandwith) # down
58
+ end
59
+
60
+ def add_flow(id, priority, path, distribution_rate, distribution_size)
61
+ raise "ID '#{id}' already exists in topology" if get_element_by_id id
62
+
63
+ distribution_rate ||= ConstantDistribution.new 0
64
+ distribution_size ||= ConstantDistribution.new 0
65
+ new_flow = Flow.new id, priority, path, distribution_rate, distribution_size
66
+ @topology_elements.push new_flow
67
+ new_flow
68
+ end
69
+ end
@@ -0,0 +1,93 @@
1
+ module NetworkTopology
2
+ # constants
3
+ K = 1000 # Kilo=10³
4
+ M = 1000 * K # Megas=10⁶
5
+ G = 1000 * M # Megas=10⁶
6
+
7
+ # parameters
8
+ NUMBER_OF_FELIX_SERVERS = 2 # this generates 1:1 connections with sw_rod, so NUMBER_OF_FELIX_SERVERS=numberOfSWRODServers
9
+ LINK_BW_BITS_S = 40 * G # 40 Gbps
10
+ FELIX_GENERATION_PERIOD = ExponentialDistribution.new 1/10.0 # distribution period in seconds
11
+ FELIX_GENERATION_SIZE = ConstantDistribution.new 1.0*K #distribution size in bits
12
+ FELIX_MONITORING_GENERATION_PERIOD = ExponentialDistribution.new 1/20.0 # distribution period in seconds
13
+ FELIX_MONITORING_GENERATION_SIZE = ConstantDistribution.new 500 #distribution size in bits
14
+ FELIX_CONTROL_GENERATION_PERIOD = ExponentialDistribution.new 1/15.0 # distribution period in seconds
15
+ FELIX_CONTROL_GENERATION_SIZE = ConstantDistribution.new 100 #distribution size in bits
16
+ FELIX_FLOW_PRIORITY = 0
17
+
18
+
19
+ def get_topology
20
+ return @topology.topology_elements if @topology.topology_elements.size != 0
21
+
22
+ @felix_servers = []
23
+ @sw_rod_servers = []
24
+ @routers = []
25
+ @links = []
26
+
27
+
28
+ # switches & routers
29
+ @routers.push @topology.add_router "lar_switch_01", [1]
30
+ @routers.push @topology.add_router "lar_switch_02", [1]
31
+ @routers.push @topology.add_router "felix_core_01", [1] # core_01 router in the felix network (connection out of USA15)
32
+ @routers.push @topology.add_router "felix_core_02", [1] # core_01 router in the felix network (connection out of USA15)
33
+
34
+ # Felix servers
35
+ for i in 0..NUMBER_OF_FELIX_SERVERS-1
36
+ @felix_servers.push @topology.add_host "lar_felix_#{i}"
37
+
38
+ # connected to both switches
39
+ @links.push @topology.add_link "link_felix#{i}_switch1", @felix_servers[i], 0, @routers[0], i+2, LINK_BW_BITS_S # lar_felix_{i} --> lar_switch_01
40
+ @links.push @topology.add_link "link_felix#{i}_switch2", @felix_servers[i], 1, @routers[1], i+2, LINK_BW_BITS_S # lar_felix_{i} --> lar_switch_02
41
+ end
42
+
43
+ # SWROD servers
44
+ for i in 0..NUMBER_OF_FELIX_SERVERS-1
45
+ @sw_rod_servers.push @topology.add_host "lar_swrod_#{i}"
46
+
47
+ # connected to both switches
48
+ @links.push @topology.add_link "link_switch1_swrod#{i}", @routers[0], i+2, @sw_rod_servers[i], 0, LINK_BW_BITS_S # lar_switch_01 --> lar_swrod_{i}
49
+ @links.push @topology.add_link "link_switch2_swrod#{i}", @routers[1], i+2, @sw_rod_servers[i], 1, LINK_BW_BITS_S # lar_switch_02 --> lar_swrod_{i}
50
+ end
51
+
52
+ # links between the switches and routers
53
+ @links.push @topology.add_full_duplex_link "core_link#{@links.size}", @routers[0], 0, @routers[2], 0, LINK_BW_BITS_S # lar_switch_1 --> core_1
54
+ @links.push @topology.add_full_duplex_link "core_link#{@links.size}", @routers[0], 1, @routers[3], 0, LINK_BW_BITS_S # lar_switch_1 --> core_2
55
+ @links.push @topology.add_full_duplex_link "core_link#{@links.size}", @routers[1], 0, @routers[2], 1, LINK_BW_BITS_S # lar_switch_2 --> core_1
56
+ @links.push @topology.add_full_duplex_link "core_link#{@links.size}", @routers[1], 1, @routers[3], 1, LINK_BW_BITS_S # lar_switch_2 --> core_2
57
+
58
+ # flow 1Felix:1ROD
59
+ add_flows_oneFelix_to_oneSWROD
60
+
61
+ @topology.topology_elements
62
+ end
63
+
64
+ def add_flows_oneFelix_to_oneSWROD
65
+ # Felix flow
66
+ @felix_servers.each_with_index do |felix,index|
67
+ paths = []
68
+
69
+ # path using switch 1
70
+ path1 = Path.new felix, @sw_rod_servers[index]
71
+ path1.add_link @topology.get_element_by_id "link_felix#{index}_switch1" # felix{i} -> switch_1
72
+ path1.add_link @topology.get_element_by_id "link_switch1_swrod#{index}" # switch_1 --> lar_swrod{i}
73
+
74
+ paths.push path1
75
+
76
+ # path using switch 2
77
+ path2 = Path.new felix, @sw_rod_servers[index]
78
+ path2.add_link @topology.get_element_by_id "link_felix#{index}_switch2" # felix{i} -> switch_2
79
+ path2.add_link @topology.get_element_by_id "link_switch2_swrod#{index}" # switch_2 --> lar_swrod{i}
80
+
81
+ paths.push path2
82
+
83
+ @topology.add_flow "Flow#{index}_1", FELIX_FLOW_PRIORITY, paths, FELIX_GENERATION_PERIOD, FELIX_GENERATION_SIZE
84
+ @topology.add_flow "Flow_Monitoring#{index}_1", FELIX_FLOW_PRIORITY, [path1], FELIX_MONITORING_GENERATION_PERIOD, FELIX_MONITORING_GENERATION_SIZE
85
+ @topology.add_flow "Flow_Control#{index}_1", FELIX_FLOW_PRIORITY, [path2], FELIX_CONTROL_GENERATION_PERIOD, FELIX_CONTROL_GENERATION_SIZE
86
+ end
87
+
88
+ end
89
+
90
+ def get_path_between(source, destination)
91
+ raise NotImplementedError, "NetworkTopology: This method is not implemented (¿does it ever get called?)"
92
+ end
93
+ end
@@ -0,0 +1,66 @@
1
+ #PhaseITopology
2
+ =begin
3
+ http://asciiflow.com
4
+
5
+ +-------+
6
+ | | +--------+
7
+ |Host2 | | |
8
+ | | | |
9
+ +----+--+ |Host1 |
10
+ +-------+ | | |
11
+ | | | +--------+
12
+ | Host3 +------+---+-------+----+
13
+ | | | |
14
+ +-------+ ++ Router1 | +---------+
15
+ || +------------+ |
16
+ +----+-------+ | |
17
+ +---------+ | |Router2 |
18
+ | | | | |
19
+ | | | +---------+
20
+ | Host4 | |
21
+ +---------+ |
22
+ +---------+
23
+ | |
24
+ |Host5 |
25
+ | |
26
+ +---------+
27
+
28
+ =end
29
+ module NetworkTopology
30
+ def get_topology
31
+ return @topology.topology_elements if @topology.topology_elements.size != 0
32
+
33
+ # Routers
34
+ router1 = @topology.add_router 'MyRouter1'
35
+ router2 = @topology.add_router 'MyRouter2'
36
+
37
+ # Hosts
38
+ link_count = 0
39
+ for i in 1..5
40
+ host = @topology.add_host "Host#{i}"
41
+ link_count += 1
42
+ @topology.add_link "Link#{link_count}", host, 0, router1, i
43
+ link_count += 1
44
+ @topology.add_link "Link#{link_count}", router1, i, host, 0
45
+
46
+ end
47
+
48
+ #Links
49
+ @topology.add_link 'Link0', router1, 0, router2, 0
50
+
51
+ @topology.topology_elements
52
+ end
53
+
54
+ def get_path_between(source, destination)
55
+ raise Exception, "Source must be either from class Router or class Host to ask for a path" unless [Host, Router].include? source.class
56
+ raise Exception, "Destination must be either from class Router or class Host to ask for a path" unless [Host, Router].include? destination.class
57
+
58
+ first_link = @topology.topology_elements.select { |elem| (elem.is_a? Link) && (elem.src_element == source) }.first
59
+ second_link = @topology.topology_elements.select { |elem| (elem.is_a? Link) && (elem.dst_element == destination) }.first
60
+
61
+ path = Path.new(source,destination)
62
+ path.add_link first_link
63
+ path.add_link second_link
64
+ path
65
+ end
66
+ end
@@ -0,0 +1,4 @@
1
+ sudo mn --custom /home/onos/Projects/tdaq.py --topo tdaq --controller remote,192.168.56.1 --mac --switch ovsk,protocols=OpenFlow13
2
+
3
+ #Para correrla en mi maquina
4
+ sudo mn --custom /home/alaurito/Desktop/repos/cern/topologyGenerator/lib/network_topologies_examples/phase1_topology_mininet/tdaq.py --topo tdaq --controller remote,127.0.0.1 --mac --switch ovsk,protocols=OpenFlow13