topologygenerator 0.0.14 → 0.0.15
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.
- checksums.yaml +4 -4
- data/README.md +10 -0
- data/install_topologygenerator.sh +19 -0
- data/lib/{createTopology.rb → Topologygenerator} +5 -5
- data/lib/builders_examples/pdm_builders/PhaseIWithPriorityQueues/Flow_concrete_builder.rb +36 -5
- data/lib/builders_examples/pdm_builders/PhaseIWithPriorityQueues/output_concrete_builder.rb +4 -4
- data/lib/command_line/command_line_arguments.rb +10 -10
- data/lib/flows_distributions/felix_distribution.rb +17 -0
- data/lib/network_entities/abstracts/flow.rb +3 -2
- data/lib/network_topologies_examples/PhaseI_LAr_MonitoringHLT.rb +138 -0
- data/lib/network_topologies_examples/PhaseI_onlyLAr_1FelixTo1SWROD.rb +1 -1
- data/lib/network_topologies_examples/paper_example.rb +25 -0
- data/lib/network_topologies_examples/tree_topology.rb +1 -1
- data/lib/providers/apis/opendaylight_topology_provider.rb +2 -1
- data/lib/topologygenerator/version.rb +1 -1
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f6079c6feadcbc819158e4425af26a579aa82f7b
|
4
|
+
data.tar.gz: e80790da8c02b2916641529e03a418da66215b24
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0587b090cec4763a4a1bb032e0140d20e3c08f96cee444575fdf8c44a2660e55e3371c5ea8fad19ad253cb0d9c589a3f750abe2b30649ea1e3bfb48ae230cb77
|
7
|
+
data.tar.gz: 54ea307fe7cdd2913c63d2546c22d7119421ed8d790001e0856def12146a9735021d6a18ac0b85b33dc406e28b42fc8b04d0743176fbb8fe983bd9088ff45e06
|
data/README.md
CHANGED
@@ -30,6 +30,8 @@ https://github.com/andyLaurito92/haikunet
|
|
30
30
|
|
31
31
|
## Installation
|
32
32
|
|
33
|
+
### As a gem
|
34
|
+
|
33
35
|
Add this line to your application's Gemfile:
|
34
36
|
|
35
37
|
```ruby
|
@@ -44,6 +46,14 @@ Or install it yourself as:
|
|
44
46
|
|
45
47
|
$ gem install topologygenerator
|
46
48
|
|
49
|
+
### As a binary
|
50
|
+
|
51
|
+
Run the following command in your command line
|
52
|
+
|
53
|
+
```bash
|
54
|
+
\curl -sSL https://raw.githubusercontent.com/andyLaurito92/topologygenerator/master/install_topologygenerator.sh | bash
|
55
|
+
```
|
56
|
+
|
47
57
|
## Usage
|
48
58
|
|
49
59
|
For using the topologygenerator gem, you will need to write your output builder, and specify the uri from where the initial topology information will be get.
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/bin/bah
|
2
|
+
|
3
|
+
WGET_INSTALLED=$(which wget)
|
4
|
+
if [ -z "${WGET_INSTALLED// }" ]
|
5
|
+
then
|
6
|
+
apt-get install wget
|
7
|
+
fi
|
8
|
+
|
9
|
+
wget -L https://github.com/andyLaurito92/topologygenerator/archive/master.tar.gz ; mkdir -p topologygenerator && tar xf master.tar.gz -C topologygenerator --strip-components=1
|
10
|
+
rm master.tar.gz
|
11
|
+
rm master.tar.gz.1
|
12
|
+
|
13
|
+
cd topologygenerator
|
14
|
+
|
15
|
+
#Add directory to $PATH
|
16
|
+
TOPOLOGYGENERATOR_DIRECTORY=$(pwd)
|
17
|
+
echo "export PATH=\"$PATH:$TOPOLOGYGENERATOR_DIRECTORY/lib\" # Adding Topologygenerator's directory to your PATH variable" >> ~/.bashrc
|
18
|
+
|
19
|
+
source ~/.bashrc
|
@@ -4,7 +4,7 @@ require_relative 'command_line/command_line_arguments.rb'
|
|
4
4
|
require_relative "topologygenerator.rb"
|
5
5
|
require 'colorize'
|
6
6
|
|
7
|
-
|
7
|
+
begin
|
8
8
|
my_command_line_arguments = CommandLineArguments.new
|
9
9
|
my_command_line_arguments.run
|
10
10
|
|
@@ -15,7 +15,7 @@ require 'colorize'
|
|
15
15
|
"uri_resource" => my_command_line_arguments.uri_resource
|
16
16
|
})
|
17
17
|
topo_gen.generate
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
rescue Exception => ex
|
19
|
+
puts "#{ex.class}".red
|
20
|
+
puts "#{ex.message}".blue
|
21
|
+
end
|
@@ -8,8 +8,8 @@ module FlowConcreteBuilder
|
|
8
8
|
def build_scilab_definition
|
9
9
|
scilab_flows_definition = ''
|
10
10
|
scilab_flows_definition += "\n"
|
11
|
-
scilab_flows_definition += build_parameter_flow_distribution '
|
12
|
-
scilab_flows_definition += build_parameter_flow_distribution '
|
11
|
+
scilab_flows_definition += build_parameter_flow_distribution 'period', distribution_rate
|
12
|
+
scilab_flows_definition += build_parameter_flow_distribution 'packetSize', distribution_size
|
13
13
|
scilab_flows_definition
|
14
14
|
end
|
15
15
|
|
@@ -35,20 +35,51 @@ module FlowConcreteBuilder
|
|
35
35
|
scilab_flow_parameter_distribution = "flow#{@id}.#{distribution_name} = DISTRIBUTION_SPLIT;\n"
|
36
36
|
scilab_flow_parameter_distribution += "flow#{@id}.#{distribution_name}_shape = #{distribution_variable.shape}; \n"
|
37
37
|
scilab_flow_parameter_distribution += "flow#{@id}.#{distribution_name}_scale = #{distribution_variable.scale}; \n"
|
38
|
+
when FelixDistribution
|
39
|
+
scilab_flow_parameter_distribution = "flow#{@id}.#{distribution_name} = DISTRIBUTION_FELIX;\n"
|
40
|
+
scilab_flow_parameter_distribution += get_string_parameters_from (build_parameter_flow_distribution '', distribution_variable.period), "flow#{@id}.#{distribution_name}_period"
|
41
|
+
scilab_flow_parameter_distribution += "flow#{@id}.#{distribution_name}_mode = #{distribution_variable.mode}; \n"
|
42
|
+
if distribution_variable.mode == FelixDistribution::FELIX_MODE_HIGH_THROUGHOUT
|
43
|
+
scilab_flow_parameter_distribution += get_string_parameters_from (build_parameter_flow_distribution '', distribution_variable.size_bytes), "flow#{@id}.#{distribution_name}_size_bytes"
|
44
|
+
scilab_flow_parameter_distribution += "flow#{@id}.#{distribution_name}_buffer_bytes = #{distribution_variable.buffer_bytes}; \n"
|
45
|
+
scilab_flow_parameter_distribution += "flow#{@id}.#{distribution_name}_timeout = #{distribution_variable.timeout}; \n"
|
46
|
+
scilab_flow_parameter_distribution += "flow#{@id}.#{distribution_name}_out_size_bytes = #{distribution_variable.out_size_bytes}; \n"
|
47
|
+
end
|
38
48
|
else
|
39
49
|
raise "Distribution provided has a class which was unexpected. Class was: #{distribution_variable.class}"
|
40
50
|
end
|
41
51
|
scilab_flow_parameter_distribution
|
42
52
|
end
|
43
53
|
|
54
|
+
def get_string_parameters_from(flow_definition_string, name_of_flow)
|
55
|
+
output = ''
|
56
|
+
flow_definition_lines = flow_definition_string.split "\n"
|
57
|
+
distribution_line = flow_definition_lines.shift
|
58
|
+
distribution_name = (distribution_line.split "=").last.gsub /\s+/, ""
|
59
|
+
distribution_name.gsub! ';', ''
|
60
|
+
output += "#{name_of_flow} = #{distribution_name};\n"
|
61
|
+
flow_definition_lines.each do |flow_definition_line|
|
62
|
+
flow_definition_line.gsub( /\s+/, "" )
|
63
|
+
flow_definition_line.gsub! 'flow.', ''
|
64
|
+
flow_definition_line.gsub! '\n', ''
|
65
|
+
flow_definition_line.gsub! '_', ''
|
66
|
+
flow_definition_line.gsub! ';', ''
|
67
|
+
flow_definition_line.gsub! /\/\/.*/,'' #Remove comment from line
|
68
|
+
key_and_value = flow_definition_line.split '='
|
69
|
+
key_and_value.first.gsub! /.*\./, ''
|
70
|
+
output += "#{name_of_flow}_#{key_and_value.first} = #{key_and_value.last};\n"
|
71
|
+
end
|
72
|
+
output
|
73
|
+
end
|
74
|
+
|
44
75
|
def build_cplusplus_definition
|
45
76
|
start_time_of_flow = 0
|
46
77
|
# flow
|
47
78
|
cplusplus_flows_definition = "\n"
|
48
79
|
cplusplus_flows_definition += "\t ///// definition of flow #{@id} \n"
|
49
|
-
cplusplus_flows_definition += "\t auto flow#{@id}
|
50
|
-
cplusplus_flows_definition += "\t auto flow#{@id}
|
51
|
-
cplusplus_flows_definition += "\t auto flow#{@id} = std::make_shared<Flow>(\"#{@id}\", #{start_time_of_flow} /*startTime*/, #{priority} /*typeOfService*/, flow#{@id}
|
80
|
+
cplusplus_flows_definition += "\t auto flow#{@id}Period = readDistributionParameter(\"flow#{@id}.period\"); \n"
|
81
|
+
cplusplus_flows_definition += "\t auto flow#{@id}PacketSize = readDistributionParameter(\"flow#{@id}.packetSize\"); \n"
|
82
|
+
cplusplus_flows_definition += "\t auto flow#{@id} = std::make_shared<Flow>(\"#{@id}\", #{start_time_of_flow} /*startTime*/, #{priority} /*typeOfService*/, flow#{@id}Period, flow#{@id}PacketSize); \n"
|
52
83
|
|
53
84
|
#routes
|
54
85
|
cplusplus_flows_definition += "\t // routes for flow #{@id} \n"
|
@@ -148,7 +148,7 @@ module OutputConcreteBuilder
|
|
148
148
|
}
|
149
149
|
Parameters
|
150
150
|
{
|
151
|
-
Run at Init = Str; exec('
|
151
|
+
Run at Init = Str; exec('../examples/PhaseI_topologies/lar_with_hlt/model.scilabParams', 0) ; Scilab Job at Init
|
152
152
|
Run at External = Str; ; Scilab Job when receive event
|
153
153
|
Run at Exit = Str; ; Scilab Job at Exit
|
154
154
|
}
|
@@ -216,9 +216,9 @@ module OutputConcreteBuilder
|
|
216
216
|
}
|
217
217
|
Parameters
|
218
218
|
{
|
219
|
-
initSimulationCommandName = Str;
|
220
|
-
eachSimulationCommandName = Str;
|
221
|
-
lastSimulationCommandName = Str;
|
219
|
+
initSimulationCommandName = Str; ../examples/PhaseI_topologies/lar_with_hlt/firstSimulation.sce ;
|
220
|
+
eachSimulationCommandName = Str; ../examples/PhaseI_topologies/lar_with_hlt/eachSimulation.sce ;
|
221
|
+
lastSimulationCommandName = Str; ../examples/PhaseI_topologies/lar_with_hlt/lastSimulation.sce ;
|
222
222
|
}
|
223
223
|
}
|
224
224
|
}
|
@@ -10,22 +10,22 @@ class CommandLineArguments
|
|
10
10
|
def run
|
11
11
|
program :name, 'Create PowerDevs topology'
|
12
12
|
program :version, '0.0.1'
|
13
|
-
program :description, '
|
13
|
+
program :description, 'Tool for retrieving topologies from a specific target and serialize it into a specific output format'
|
14
14
|
program :help, 'Author', 'Andrés Laurito && Matias Bonaventura'
|
15
15
|
|
16
16
|
my_command_line_argument = self
|
17
17
|
|
18
18
|
my_command = command :source do |c|
|
19
|
-
c.syntax = '
|
20
|
-
c.summary = 'Specify
|
19
|
+
c.syntax = 'Topologygenerator source [OPTIONS]'
|
20
|
+
c.summary = 'Specify the name of the source from where to retrieve the topology, the output directory,
|
21
|
+
the URI used to get the topology and the directory of where the builders are located.'
|
21
22
|
c.description = 'Specify the data source from where the topology should be retrieved
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
c.example 'Set
|
27
|
-
c.example 'Set CUSTOM as source', '
|
28
|
-
c.example 'Set CUSTOM as source and called the output file my_file', 'createTopology source -n MOCK -f my_file'
|
23
|
+
An example of use: Topologygenerator source -n ONOS -o output -u http://127.0.0.1:8181/onos/v1/ -d builders_examples/ruby_builders
|
24
|
+
By default, the option is set in CUSTOM.
|
25
|
+
By default, the output will be written in a file called my_topology'
|
26
|
+
c.example 'Set ONOS as source', 'Topologygenerator source -n ONOS'
|
27
|
+
c.example 'Set CUSTOM as source', 'Topologygenerator source -n CUSTOM'
|
28
|
+
c.example 'Set CUSTOM as source and called the output file my_file', 'Topologygenerator source -n MOCK -o my_file.txt'
|
29
29
|
c.option '-n', '--name NAME', String, 'Specify the source name'
|
30
30
|
c.option '-o', '--outDir NAME', String, 'Specify the output directory path'
|
31
31
|
c.option '-u', '--uri NAME', String, 'Specify the uri for the source'
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative 'normal_distribution.rb'
|
2
|
+
|
3
|
+
class FelixDistribution
|
4
|
+
FELIX_MODE_HIGH_THROUGHOUT = "FELIX_MODE_HIGH_THROUGHOUT"
|
5
|
+
FELIX_MODE_LOW_LATENCY = "FELIX_MODE_LOW_LATENCY"
|
6
|
+
|
7
|
+
attr_reader :period, :mode, :size_bytes, :buffer_bytes, :timeout, :out_size_bytes
|
8
|
+
|
9
|
+
def initialize(period, mode, size_bytes = nil, buffer_bytes = nil, timeout = nil, out_size_bytes = nil)
|
10
|
+
@period = period #its the distribution of the message period arriving at the GBT link
|
11
|
+
@mode = mode #Its either FELIX_MODE_LOW_LATENCY or FELIX_MODE_HIGH_THROUGHPUT
|
12
|
+
@size_bytes = size_bytes || (NormalDistribution.new "4*k", "1*k") #Its a distribution of the message size arriving at the GBT link
|
13
|
+
@buffer_bytes = buffer_bytes || "1 * M"
|
14
|
+
@timeout = timeout || 1
|
15
|
+
@out_size_bytes = out_size_bytes || "TCP_MTU_bytes"
|
16
|
+
end
|
17
|
+
end
|
@@ -4,6 +4,7 @@ require_relative '../../flows_distributions/exponential_distribution.rb'
|
|
4
4
|
require_relative '../../flows_distributions/normal_distribution.rb'
|
5
5
|
require_relative '../../flows_distributions/pareto_distribution.rb'
|
6
6
|
require_relative '../../flows_distributions/split_distribution.rb'
|
7
|
+
require_relative '../../flows_distributions/felix_distribution.rb'
|
7
8
|
|
8
9
|
class Flow
|
9
10
|
include SerializeBehavior
|
@@ -15,8 +16,8 @@ class Flow
|
|
15
16
|
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
17
|
raise "Invalid 'distribution_rate' received. Distribution rate cannot be nil" unless distribution_rate
|
17
18
|
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
|
19
|
+
raise "Invalid 'distribution_rate' #{distribution_rate}. It is expected that the rate is an instance of a distribution" unless [ConstantDistribution, ExponentialDistribution, NormalDistribution, ParetoDistribution, SplitDistribution, FelixDistribution].include? distribution_rate.class
|
20
|
+
raise "Invalid 'distribution_size' #{distribution_size}. It is expected that the size is an instance of a distribution" unless [ConstantDistribution, ExponentialDistribution, NormalDistribution, ParetoDistribution, SplitDistribution, FelixDistribution].include? distribution_size.class
|
20
21
|
|
21
22
|
@id = id
|
22
23
|
@priority = priority
|
@@ -0,0 +1,138 @@
|
|
1
|
+
# topology plotted here: https://docs.google.com/presentation/d/1N5GnG82JvsASUJ6sl-gmuMBRjMWG6OWtybIjOMikb-M/edit#slide=id.p
|
2
|
+
|
3
|
+
module NetworkTopology
|
4
|
+
# constants
|
5
|
+
K = 1000 # Kilo=10³
|
6
|
+
M = 1000 * K # Megas=10⁶
|
7
|
+
G = 1000 * M # Megas=10⁶
|
8
|
+
|
9
|
+
TCP_MTU_bytes = 1500 # (in bytes)
|
10
|
+
|
11
|
+
# parameters
|
12
|
+
NUMBER_OF_FELIX_SERVERS = 13 # this generates 1:1 connections with sw_rod, so NUMBER_OF_FELIX_SERVERS=numberOfSWRODServers
|
13
|
+
#NUMBER_OF_FELIX_SERVERS = 3 # this generates 1:1 connections with sw_rod, so NUMBER_OF_FELIX_SERVERS=numberOfSWRODServers
|
14
|
+
NUMBER_OF_MONITORING_SERVERS = 5
|
15
|
+
LINK_BW_40G_BITS_S = 40 * G # 40 Gbps
|
16
|
+
LINK_BW_10G_BITS_S = 1 * G # 10 Gbps
|
17
|
+
FELIX_FLOW_PRIORITY = 0
|
18
|
+
FELIX_GBT_ELINKS = 10 # #GBT e-links in each felix server. There will be one flow created per e-link (because there will be 1 thread, one connection per e-link)
|
19
|
+
|
20
|
+
# felix data-flow distributions (one per GBT)
|
21
|
+
FELIX_GBT_PERIOD_sec = ExponentialDistribution.new 1.0 / (100*K) # distribution period in seconds
|
22
|
+
#FELIX_GBT_PERIOD_sec = ExponentialDistribution.new 1.0 / (100) #TODO: this is just for testing quick simulations. Normal rate should be 100*k
|
23
|
+
FELIX_GBT_SIZE_bytes = NormalDistribution.new 4.0*K, 1.0*K # (in bytes)
|
24
|
+
FELIX_GBT_BUFFER_bytes = 1*M # (in bytes)
|
25
|
+
FELIX_GBT_TIME_OUT_sec = 2 # (in seconds)
|
26
|
+
FELIX_GBT_OUT_SIZE_bytes = TCP_MTU_bytes # (in bytes)
|
27
|
+
|
28
|
+
#FELIX_GENERATION_PERIOD = ExponentialDistribution.new (1.0 * FELIX_GBT_ELINKS) / (70*M) # distribution period in seconds
|
29
|
+
#FELIX_GENERATION_PERIOD = ExponentialDistribution.new (1.0 * FELIX_GBT_ELINKS) / (1*M) # distribution period in seconds
|
30
|
+
#FELIX_GENERATION_SIZE = ConstantDistribution.new 1.0*K #distribution size in bits
|
31
|
+
FELIX_GENERATION_PERIOD = FelixDistribution.new FELIX_GBT_PERIOD_sec,
|
32
|
+
FelixDistribution::FELIX_MODE_HIGH_THROUGHOUT,
|
33
|
+
FELIX_GBT_SIZE_bytes,
|
34
|
+
FELIX_GBT_BUFFER_bytes,
|
35
|
+
FELIX_GBT_TIME_OUT_sec,
|
36
|
+
FELIX_GBT_OUT_SIZE_bytes
|
37
|
+
FELIX_GENERATION_SIZE = ConstantDistribution.new TCP_MTU_bytes*8 #distribution size in bits
|
38
|
+
|
39
|
+
# monitoring flows (one per GBT)
|
40
|
+
FELIX_MONITORING_PRIORITY = 0
|
41
|
+
MONITORING_SIZE_bits = (TCP_MTU_bytes - 300)*8
|
42
|
+
TOTAL_MONITORING_PER_SERVER_bits = 0.8 * G
|
43
|
+
MONITORING_GENERATION_PERIOD = ExponentialDistribution.new 1.0 / (TOTAL_MONITORING_PER_SERVER_bits / (MONITORING_SIZE_bits * FELIX_GBT_ELINKS))
|
44
|
+
MONITORING_GENERATION_SIZE = NormalDistribution.new MONITORING_SIZE_bits, 300*8 #distribution size in bits
|
45
|
+
|
46
|
+
def get_topology
|
47
|
+
return @topology.topology_elements if @topology.topology_elements.size != 0
|
48
|
+
|
49
|
+
@felix_servers = []
|
50
|
+
@sw_rod_servers = []
|
51
|
+
@routers = []
|
52
|
+
@links = []
|
53
|
+
@monitoring_servers = []
|
54
|
+
|
55
|
+
|
56
|
+
# switches & routers
|
57
|
+
@routers.push @topology.add_router "lar_switch_01", [1]
|
58
|
+
@routers.push @topology.add_router "lar_switch_02", [1]
|
59
|
+
@routers.push @topology.add_router "felix_core_01", [1] # core_01 router in the felix network (connection out of USA15)
|
60
|
+
@routers.push @topology.add_router "felix_core_02", [1] # core_01 router in the felix network (connection out of USA15)
|
61
|
+
@routers.push @topology.add_router "hlt_core_01", [1] # core_01 router in the HLT network (connection into of SDX1)
|
62
|
+
@routers.push @topology.add_router "hlt_core_02", [1] # core_02 router in the HLT network (connection into of SDX1)
|
63
|
+
|
64
|
+
# Felix servers
|
65
|
+
for i in 0..NUMBER_OF_FELIX_SERVERS-1
|
66
|
+
@felix_servers.push @topology.add_host "lar_felix_#{i}"
|
67
|
+
|
68
|
+
# connected to both switches
|
69
|
+
@links.push @topology.add_link "link_felix#{i}_switch1", @felix_servers[i], 0, @routers[0], i+1, LINK_BW_40G_BITS_S # lar_felix_{i} --> lar_switch_01
|
70
|
+
@links.push @topology.add_link "link_felix#{i}_switch2", @felix_servers[i], 1, @routers[1], i+1, LINK_BW_40G_BITS_S # lar_felix_{i} --> lar_switch_02
|
71
|
+
end
|
72
|
+
|
73
|
+
# SWROD servers
|
74
|
+
for i in 0..NUMBER_OF_FELIX_SERVERS-1
|
75
|
+
@sw_rod_servers.push @topology.add_host "lar_swrod_#{i}"
|
76
|
+
|
77
|
+
# connected to both switches
|
78
|
+
@links.push @topology.add_link "link_switch1_swrod#{i}", @routers[0], i+1, @sw_rod_servers[i], 0, LINK_BW_40G_BITS_S # lar_switch_01 --> lar_swrod_{i}
|
79
|
+
@links.push @topology.add_link "link_switch2_swrod#{i}", @routers[1], i+1, @sw_rod_servers[i], 1, LINK_BW_40G_BITS_S # lar_switch_02 --> lar_swrod_{i}
|
80
|
+
end
|
81
|
+
|
82
|
+
# links between the switches and routers (only 1 link as they will be active-backup: there will be physically 2 links but only one active)
|
83
|
+
@links.push @topology.add_link "link_sw1_core1", @routers[0], 0, @routers[2], 0, LINK_BW_40G_BITS_S # lar_switch_1 --> lar_core_1
|
84
|
+
@links.push @topology.add_link "link_sw2_core2", @routers[1], 0, @routers[3], 0, LINK_BW_40G_BITS_S # lar_switch_2 --> lar_core_2
|
85
|
+
@links.push @topology.add_link "link_core1_hltcore1", @routers[2], 0, @routers[4], 0, LINK_BW_40G_BITS_S # lar_core_1 --> hlt_core_1
|
86
|
+
@links.push @topology.add_link "link_core2_hltcore2", @routers[3], 0, @routers[5], 0, LINK_BW_40G_BITS_S # lar_core_2 --> hlt_core_2
|
87
|
+
|
88
|
+
# Monitoring servers
|
89
|
+
for i in 0..NUMBER_OF_MONITORING_SERVERS-1
|
90
|
+
@monitoring_servers.push @topology.add_host "lar_mon_#{i}"
|
91
|
+
|
92
|
+
# connected to 1 hlt_core (the other link will be backup (inactive) )
|
93
|
+
#if i % 2 == 0 then hlt_core_index = 1 else hlt_core_index = 2 end # half the monitoring servers will be connected to one core (hltcore_1), the others will be connected to the other (hltcore_2)
|
94
|
+
#TODO: we add both links, but only 1 will be used (see flow definitions)
|
95
|
+
@links.push @topology.add_link "link_htlcore1_mon#{i}", @routers[4], i, @monitoring_servers[i], 0, LINK_BW_10G_BITS_S # hlt_core1 --> mon_{i}
|
96
|
+
@links.push @topology.add_link "link_htlcore2_mon#{i}", @routers[5], i, @monitoring_servers[i], 1, LINK_BW_10G_BITS_S # hlt_core2 --> mon_{i}
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
# flow 1Felix:1ROD
|
101
|
+
add_flows_oneFelix_to_oneSWROD
|
102
|
+
|
103
|
+
print ("finished the topology specification \n")
|
104
|
+
@topology.topology_elements
|
105
|
+
end
|
106
|
+
|
107
|
+
def add_flows_oneFelix_to_oneSWROD
|
108
|
+
# data-flow Flows for each felix server
|
109
|
+
@felix_servers.each_with_index do |felix,index|
|
110
|
+
# NFelix:1mon: A group of N felix servers will always talk with the same mon server. N=#felix/#mon
|
111
|
+
monServer_index = index % NUMBER_OF_MONITORING_SERVERS # first N will all go to different mon. Then, with n+1, it starts again.
|
112
|
+
|
113
|
+
# each felix will have 1 data-flow and 1 monitoring-flow per e-link
|
114
|
+
for eLinkIndex in 0..FELIX_GBT_ELINKS-1
|
115
|
+
# Data-Flow path
|
116
|
+
path = Path.new felix, @sw_rod_servers[index]
|
117
|
+
if eLinkIndex % 2 == 0 then switchIndex = 1 else switchIndex = 2 end # half the flows with go one path (switch_1), the other will go the other path (switch_2)
|
118
|
+
path.add_link @topology.get_element_by_id "link_felix#{index}_switch#{switchIndex}" # felix{i} -> switch_{1/2}
|
119
|
+
path.add_link @topology.get_element_by_id "link_switch#{switchIndex}_swrod#{index}" # switch_1 --> lar_swrod{i}
|
120
|
+
|
121
|
+
@topology.add_flow "Flow#{index}_#{eLinkIndex}", FELIX_FLOW_PRIORITY, [path], FELIX_GENERATION_PERIOD, FELIX_GENERATION_SIZE
|
122
|
+
|
123
|
+
# Monitoring-flow path will go always to same monServer, but half by switch_1 and half by switch_2
|
124
|
+
path = Path.new felix, @sw_rod_servers[index]
|
125
|
+
path.add_link @topology.get_element_by_id "link_felix#{index}_switch#{switchIndex}" # felix{i} -> switch_{1/2}
|
126
|
+
path.add_link @topology.get_element_by_id "link_sw#{switchIndex}_core#{switchIndex}" # switch_{1/2} --> lar_core{1/2}
|
127
|
+
path.add_link @topology.get_element_by_id "link_core#{switchIndex}_hltcore#{switchIndex}" # lar_core{1/2} --> hlt_core{1/2}
|
128
|
+
path.add_link @topology.get_element_by_id "link_htlcore#{switchIndex}_mon#{monServer_index}" # hlt_core{1/2} --> mon{monServer_index}
|
129
|
+
|
130
|
+
@topology.add_flow "FlowMon#{index}_#{eLinkIndex}", FELIX_MONITORING_PRIORITY, [path], MONITORING_GENERATION_PERIOD, MONITORING_GENERATION_SIZE
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def get_path_between(source, destination)
|
136
|
+
raise NotImplementedError, "NetworkTopology: This method is not implemented (¿does it ever get called?)"
|
137
|
+
end
|
138
|
+
end
|
@@ -5,7 +5,7 @@ module NetworkTopology
|
|
5
5
|
G = 1000 * M # Megas=10⁶
|
6
6
|
|
7
7
|
# parameters
|
8
|
-
NUMBER_OF_FELIX_SERVERS =
|
8
|
+
NUMBER_OF_FELIX_SERVERS = 13 # this generates 1:1 connections with sw_rod, so NUMBER_OF_FELIX_SERVERS=numberOfSWRODServers
|
9
9
|
LINK_BW_BITS_S = 40 * G # 40 Gbps
|
10
10
|
FELIX_GENERATION_PERIOD = ExponentialDistribution.new 1/10.0 # distribution period in seconds
|
11
11
|
FELIX_GENERATION_SIZE = ConstantDistribution.new 1.0*K #distribution size in bits
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module NetworkTopology
|
2
|
+
def get_topology
|
3
|
+
return @topology.topology_elements unless @topology.topology_elements.size == 0
|
4
|
+
hosts = []
|
5
|
+
router = @topology.add_router "Router1"
|
6
|
+
for i in 0..2
|
7
|
+
host = @topology.add_host "Host#{i}"
|
8
|
+
hosts.push host
|
9
|
+
end
|
10
|
+
bwith = 500*1000*1000
|
11
|
+
@topology.add_full_duplex_link "Link1", hosts[0], 0, router, 0, bwith
|
12
|
+
@topology.add_full_duplex_link "Link2", hosts[1], 0, router, 1, bwith
|
13
|
+
@topology.add_full_duplex_link "Link3", hosts[2], 0, router, 2, bwith
|
14
|
+
link1 = @topology.get_element_by_id "Link1_up"
|
15
|
+
link2 = @topology.get_element_by_id "Link3_down"
|
16
|
+
flow_1_path = Path.new hosts[0], hosts[2]
|
17
|
+
flow_1_path.add_link link1
|
18
|
+
flow_1_path.add_link link2
|
19
|
+
@topology.add_flow "Flow1", 10,
|
20
|
+
[flow_1_path],
|
21
|
+
(ExponentialDistribution.new 1.0/6875),
|
22
|
+
(ConstantDistribution.new 1000*8)
|
23
|
+
@topology.topology_elements
|
24
|
+
end
|
25
|
+
end
|
@@ -88,7 +88,8 @@ This is who it looks like the xml received by the opendaylight api
|
|
88
88
|
if node['node-id'].include? 'openflow'
|
89
89
|
@topology.add_router node['node-id']
|
90
90
|
else
|
91
|
-
|
91
|
+
node_info = node["host-tracker-service:addresses"].first
|
92
|
+
@topology.add_host node['node-id'], [node_info['ip']], node_info['mac']
|
92
93
|
end
|
93
94
|
end
|
94
95
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: topologygenerator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrés Laurito
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-10-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -108,6 +108,8 @@ files:
|
|
108
108
|
- bin/console
|
109
109
|
- bin/setup
|
110
110
|
- images/topologygenerator.png
|
111
|
+
- install_topologygenerator.sh
|
112
|
+
- lib/Topologygenerator
|
111
113
|
- lib/behaviors/serialize_behavior.rb
|
112
114
|
- lib/builders_examples/pdm_builders/PhaseI/Flow_concrete_builder.rb
|
113
115
|
- lib/builders_examples/pdm_builders/PhaseI/Host_concrete_builder.rb
|
@@ -126,9 +128,9 @@ files:
|
|
126
128
|
- lib/builders_examples/ruby_builders/Router_concrete_builder.rb
|
127
129
|
- lib/builders_examples/ruby_builders/output_concrete_builder.rb
|
128
130
|
- lib/command_line/command_line_arguments.rb
|
129
|
-
- lib/createTopology.rb
|
130
131
|
- lib/flows_distributions/constant_distribution.rb
|
131
132
|
- lib/flows_distributions/exponential_distribution.rb
|
133
|
+
- lib/flows_distributions/felix_distribution.rb
|
132
134
|
- lib/flows_distributions/normal_distribution.rb
|
133
135
|
- lib/flows_distributions/pareto_distribution.rb
|
134
136
|
- lib/flows_distributions/split_distribution.rb
|
@@ -139,8 +141,10 @@ files:
|
|
139
141
|
- lib/network_entities/physical/link.rb
|
140
142
|
- lib/network_entities/physical/router.rb
|
141
143
|
- lib/network_entities/topology.rb
|
144
|
+
- lib/network_topologies_examples/PhaseI_LAr_MonitoringHLT.rb
|
142
145
|
- lib/network_topologies_examples/PhaseI_onlyLAr_1FelixTo1SWROD.rb
|
143
146
|
- lib/network_topologies_examples/octopus_topology.rb
|
147
|
+
- lib/network_topologies_examples/paper_example.rb
|
144
148
|
- lib/network_topologies_examples/phase1_topology_mininet/tdaq
|
145
149
|
- lib/network_topologies_examples/phase1_topology_mininet/tdaq.py
|
146
150
|
- lib/network_topologies_examples/sofisticated_octopus_topology.rb
|