-
Notifications
You must be signed in to change notification settings - Fork 0
/
Genesis-AEC-Readme.txt
188 lines (141 loc) · 7.29 KB
/
Genesis-AEC-Readme.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
POPL Artifact Evaluation Readme
======================================
#35 Genesis: Data Plane Synthesis in Multi-Tenant Networks
======================================
Running Genesis:
The Virtual Machine (Ubuntu 14.04) comes with all packages installed.
To run Genesis, go to the ~/Genesis folder and use the terminal to run Genesis:
python -O genesis.py -topo <topology-filename> -gpl <gpl-filename>
To run Genesis with tactic enabled:
python -O genesis.py -topo <topology-filename> -gpl <gpl-filename> -useTactic <tactic>
Our current implementation supports 4 tactics that can be supplied as arguments
(implemented in useTactic() method in GenesisSynthesiser.py):
"noEdge" : the edge-to-edge path will not contain another edge switch in the path
"valleyFree" : valley-free routing, that is paths are of the form eacae
"len7" : Length of path <= 7
"noEdgeLen7" : Length of path <= 7 and does not contain another path.
[Note: these tactics assume that each paths start and end at edge switches. New tactics
can be added to generalize these tactics]
To run Genesis using divide-and-conquer synthesis:
python -O genesis.py -topo <topology-filename> -gpl <gpl-filename> -dc
To run Genesis for <b>network repair</b>:
python -O genesis.py -topo [topology-filename] -gpl [gpl-filename] -repair
======================================
GPL syntax:
To define a packet class(pc) -
p0_0 := tcp.port = 0 : e14 >> e17
<pc-name> <network-predicate> <source-sw> >> <destination-sw>
The current implementation of Genesis simply uses the network predicate as
a string. For actual network deployments, the network predicate would
translate to SDN Match rules.
To add waypoints to a reachability policy:
e11 >> [ a29, a24; a20, a28 ] >> e2
which enforces that [a29, a24] must be traversed before [a20, a28] in the path,
and ordering in a set is irrelevant.
To define an isolation policy using the packet class names-
pc1 || pc2
To define isolation among different sets of classes -
[pc1, pc2] || [pc3, pc4]
=> pc1 || pc3 and pc1 || pc4 and pc2 || pc3 and pc2 || p4
To define a link capacity policy:
e11 -> a28 : capacity-value
To define a switch table size policy:
e11 : size
For traffic engineering, specify:
minimize-avg-te
or
minimize-max-te
======================================
Output of Genesis:
Genesis in its current form gives the paths for each packet class
(written to genesis-paths.txt) which satisfy the input policies. From these paths,
rules for a software-defined network can be trivially constructed (written
to .genesis-forwarding-rules).
If unsatisfiable, it returns that "Input policies not reasible" and exits.
Validation: In PolicyDatabase.py, the output paths of Genesis
is validated with respect to the input policies to detect violations
to the policies. This helps us verify the correctness of Genesis's output.
======================================
Topology Files:
The fat-tree topology files with varying number of switches can be found
in topologies folder:
fattree-6.topo: 45 switches
fattree-8.topo: 80 switches
======================================
Evaluation on Benchmarks:
We provide scripts pertaining to the experiments ran in the paper. We
present the synthesis time taken by the Z3 solver i.e., time taken
for Z3 for the check() method. We ignore the total time taken by
Genesis (parsing, generating constraints etc.), instead the major bottleneck
is the solve time (high complexity), thus, we report in the paper
the time taken to solve the constraints. The experiments were conducted
on a 32-core Intel-Xeon 2.40GHz CPU machine and 128GB of RAM, thus a virtual machine
may report higher synthesis times.
================
Multi-tenant Isolation Workloads - AEC/isolation.py
Execute the isolation.py (no command-line arguments) from the Genesis directory
(it uses genesis.py and GPLGenerator.py, a python program which generates GPL files
based on different parameter values). Refer to Sec8.1 in paper.
The isolation.py file can be modified to run different multi-tenant isolation workloads.
The different parameters are:
Number of packet classes = [20,40,60]
Group size = [2,5,10]
useTactic = True/False
tactic = The tactic to apply (one of noEdge, valleyFree, len7, noEdgeLen7)
useDCSynthesis = True/False
================
Isolation Workloads for varying topology sizes - AEC/linkcapacity.py
Execute the linkcapacity.py (no command-line arguments) from the Genesis directory
with linkcapacity parameter in the script set to False. This script can be
used to run the tactic reduction experiments by running
the script (linkcapacity=False) with different tactics.
================
Link Capacity Experiment - AEC/linkcapacity.py
Execute the linkcapacity.py (no command-line arguments) from the Genesis directory
with linkcapacity parameter in the script set to True.
This uses GPLGenerator5.py which generates a isolation workload with 10 additional
link capacity policies. This script can use to run the link capacity with
tactics as well [useTactic = True, tactic = noEdge/...]
================
Waypoint Experiment - AEC/waypoint.py
Execute the waypoint.py (no command-line arguments) from the Genesis directory.
NOTE: One change from other experiments is that max path length has to be SET to 15 before
running these experiments.
This is set in the Topology class (in Topology.py) variable
self.maxPathLength = 15
This experiment uses GPLGenerator6.py to generate the waypoint GPL files as
described in the paper.
================
Optimization Experiments - AEC/optimization.py
Execute the optimization.py (no command-line arguments) from the Genesis directory.
It contains three different experiments: measuring performance of TE
objectives: minimizing average link utilization and minimizing max link utilization,
and a network repair experiment.
This experiment uses GPLGenerator3.py for generating the TE workloads.
======================================
Pointers to code corresponding to the different sections of the paper:
Section 2: Genesis Policy Language - GPLInterpreter.py
Section 3: Synthesis of Forwarding Rules - GenesisSynthesiser.py
Input for synthesis:
1) Topology data - Topology.py
2) Policies - PolicyDatabase.py
Functions in GenesisSynthesiser.py for each type of policy:
Section 4.2: Reachability - addReachabilityConstraints(), addPathConstraints()
Section 4.3: Waypoints - addReachabilityConstraints(), addSinglePathConstraints()
Section 4.4: Isolation - addTrafficIsolationConstraints()
Section 5.1: Link/Switch Capacity - addLinkConstraints(), addSwitchTableConstraints()
Section 5.2: Traffic Engineering - addAverageUtilizationMinimizationConstraints(), addMaxUtilizationMinimizationConstraints()
Section 5.3.2: Network Repair - enforceChangedPolicies()
[Emulates network repair when the switch with maximum number of rules fails]
Section 6: Tactics - Tactic.py
Section 7: Divide-and-Conquer Synthesis - enforceGraphPoliciesDC() in GenesisSynthesiser.py
Solution Recovery - differentSolutionRecovery()
========================================
Installing Genesis on Ubuntu 14.04
Genesis comes with a install script intended to install
all dependencies of Genesis. The install script can be found
in the Genesis directory - install
Copy install to $HOME, and from $HOME, run on terminal:
chmod +x install
sudo ./install
Open a new terminal to run Genesis (.bash_profile updated by install)