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
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
|
\documentclass[11pt]{article}
% Packages
\usepackage{fullpage}
\usepackage{minted}
\usepackage{booktabs}
\usepackage{xspace}
\usepackage{graphicx}
\usepackage{makecell}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{svg}
\usepackage[most]{tcolorbox}
\usepackage{adjustbox}
% Packages setups
\graphicspath{{./assets}}
% Commands
\newcommand{\version}{\InputIfFileExists{version}{}{version}}
\newcommand*{\addsource}[2]{\vspace{0.3cm}\begin{tcolorbox}[breakable,enhanced,arc=1.4mm,arc is angular,title=\textbf{\small#1}]\inputminted[breaklines,fontsize=\scriptsize]{#2}{#1}\end{tcolorbox}}
\newenvironment{tabminted}[1]
{\VerbatimEnvironment\begin{minipage}{2.65in}\begin{tcolorbox}[frame empty]\begin{minted}{#1}}
{\end{minted}\end{tcolorbox}\end{minipage}}
% Document
\begin{document}
% Title page
\makeatletter
\begin{titlepage}
\begin{center}
\Huge
\textbf{\fontsize{90}{60}\selectfont User Manual\\}
\vspace{0.6cm}
\textbf{\LARGE --- ESDS v\version --- \\}
{\Large \today}
\vspace{2cm}
{\includesvg[scale=0.8]{../icon.svg}}
\vspace{1.5cm}
\LARGE
\textbf{ESDS an Extensible Simulator for Distributed Systems\\}
\vspace{1cm}
\textit{Written by Loic Guegan and Issam Raïs}
\end{center}
\end{titlepage}
\pagebreak
\tableofcontents
\pagebreak
\section{Architecture of ESDS}
\begin{figure}[!h]
\centering
\includegraphics[scale=0.5]{components.pdf}
\caption{Simulation architecture used by ESDS}
\label{architecture}
\end{figure}
ESDS simulator comprises two major components: 1) The Simulation Orchestrator (SO) 2) The Simulated
Nodes (SN). This architecture is depicted in Figure \ref{architecture}. The SO is the main process
in charge of implementing the simulation main loop. It instantiates the network (e.g bandwidths and
latencies), collects and processes the events (e.g communications,turn on/off). On the other hand,
nodes are threads that implement the node behaviors.
\section{Getting started}
To run a simulation, at least 2 files are required: 1) a platform file 2) a node implementation
source code. The platform file defines the simulated network platform (network links and
performances etc.) and sets various simulation parameters. The node implementation source code
provides the logic of the simulated nodes.
\subsection{Platform file}
\label{sec:firstsimulation:platform}
Platform files are written in YAML and contains 3 sections namely: 1) \textit{general} 2)
\textit{nodes} 3) \textit{interfaces}. The \textit{general} section is optional but all the other
sections must be present. Here is an example of a simple platform file to simulate 2 wireless nodes:
\addsource{assets/platform.yaml}{yaml}
\subsection{Node implementation file}
Nodes implementations are written using python. Here is the implementation of the node mentioned in
the last \verb|platform.yaml| file:
\addsource{assets/node.py}{python}
\subsection{Execution}
\label{sec:firstsimulation:execution}
To run our first simulation, the following command can be run:
that contains \verb|platform.yaml| and \verb|node.py|:
\begin{verbatim}
> esds run platform.yaml
\end{verbatim}
Here is the output of the simulation:
\verbatiminput{assets/output.txt}
In this case, simulation tooks $0.002s$ and $10$ bytes were sent on the wlan0 interface from node 0
(src=n0) to node 1 (src=n1).
\subsection{Custom orchestrator instantiation}
Instead of using a \verb|platform.yaml| file, it is possible to instantiate manually the esds
orchestrator. To do so, you need to implement that procedure in a python file. Here is and example
that performs the exact same simulation presented in Section \ref{sec:firstsimulation:execution} but
with a custom instantiation of the orchestrator:
\addsource{assets/orchestrator.py}{python}
Next we can run the simulation:
\begin{verbatim}
> ./orchestrator.py
\end{verbatim}
\section{Platform file}
As explain in Section \ref{sec:firstsimulation:platform}, esds platform files comprise 3 sections:
\begin{enumerate}
\item \textbf{general:} to settings up esds
\item \textbf{nodes:} to configure the simulated nodes
\item \textbf{interfaces:} to create network the interfaces available for each nodes
\end{enumerate}
Lets see in details the format of each section.
\subsection{The general section}
This section is used to settings up the overall parameters of esds. Table \ref{keywords:general} reference all the keywords for this section of the platform file.
\begin{table}
\centering
\begin{adjustbox}{width=0.7\textwidth}
\begin{tabular}{m{0.25\textwidth}m{0.3\textwidth}p{0.4\textwidth}}
\toprule
\textbf{Keyword} & \textbf{Description} & \textbf{Example} \\ \midrule
\textbf{interferences} & Turn on/off interferences detection during wireless communications &
\begin{tabminted}{yaml}
interferences: on
\end{tabminted}
\\ \cmidrule{1-3}
\textbf{debug} & Turn on/off esds debugging mode (generate a debug file) &
\begin{tabminted}{yaml}
debug: on
\end{tabminted}
\\ \cmidrule{1-3}
\textbf{debug\_file} & Specify the file to use as output for the debugging &
\begin{tabminted}{yaml}
debug_file: "./myfile.txt"
\end{tabminted}
\\ \cmidrule{1-3}
\textbf{breakpoints} & Specify a list of simulated time (in seconds) at which esds must interrupt and call the specified callback &
\begin{tabminted}{yaml}
breakpoints: [5, 6, 7]
\end{tabminted}
\\ \cmidrule{1-3}
\textbf{breakpoints\_every} & Specify an interval of time (in seconds) at which esds will interrupt and call the specified callback &
\begin{tabminted}{yaml}
breakpoints_every: 5
\end{tabminted}
\\ \cmidrule{1-3}
\textbf{breakpoints\_callback} & Tell esds where how to reach the callback used during breakpoints &
\begin{tabminted}{yaml}
breakpoints_callback:
file: "platform_callback.py"
callback: "callback"
\end{tabminted}
\\ \bottomrule
\end{tabular}
\end{adjustbox}
\caption{Usable keywords in the general section of a esds platform file.}
\label{keywords:general}
\end{table}
\subsection{The node section}
The node section is used configure the simulated node of esds. Table \ref{keywords:nodes} references
all the keywords used in the nodes section.
\begin{table}
\centering
\begin{adjustbox}{width=0.7\textwidth}
\begin{tabular}{m{0.25\textwidth}m{0.3\textwidth}p{0.4\textwidth}}
\toprule
\textbf{Keyword} & \textbf{Description} & \textbf{Example} \\ \midrule
\textbf{count} & Number of simulated nodes &
\begin{tabminted}{yaml}
nodes: 5
\end{tabminted}
\\ \cmidrule{1-3}
\textbf{implementations} & Bind each node to their respective implementation (uses \textbf{the range syntax}) &
\begin{tabminted}{yaml}
implementations:
- 0 sender.py
- 1-@ receiver.py
\end{tabminted}
\\ \cmidrule{1-3}
\textbf{arguments} & Define the arguments that will be passed to each node implementation (keys of each element uses \textbf{the range syntax}) &
\begin{tabminted}{yaml}
arguments: {
"all": 2
}
\end{tabminted}
\\ \bottomrule
\end{tabular}
\end{adjustbox}
\caption{Usable keywords in the nodes section of a esds platform file.}
\label{keywords:nodes}
\end{table}
Several entries in the platform file use a \textbf{range syntax} to map informations (node
implementations, links etc.) to node $ids$. Indeed, when running a simulation with $p$ nodes, each
node will have an allocated $id$ such that $id \in [0,1,...,p-1]$. Here are examples of valid range
syntax for a simulation that uses 5 nodes:
\begin{itemize}
\item \makebox[2cm]{\textbf{0,1,2,3}\hfill} Node 0,1,2 and 3
\item \makebox[2cm]{\textbf{0-2}\hfill} Node 0,1 and 2
\item \makebox[2cm]{\textbf{all}\hfill} Node 0,1,2,3 and 4
\item \makebox[2cm]{\textbf{2-@}\hfill} Node 2,3 and 4
\item \makebox[2cm]{\textbf{0-@}\hfill} Node 0,1,2,3 and 4 (same as \textbf{all})
\end{itemize}
\end{document}
|