This is the first push to this repo with my dotfiles
[dotfilesold/.git] / .config / Typora / draftsRecover / 2019-5-4 cluster 163410.md
1 ---
2 title:
3 - Cluster.py
4 author:
5 - Oscar Rodriguez
6 theme:
7 -AnnArbor
8 colortheme:
9 -lily
10 font:
11 -professionalfonts
12 ---
13
14
15
16 # imports
17
18 tenemos una lista de cosas que se importan para tener nuestro `cluster.py` funcionando, esta lista de cosas que se importan son en su mayyoria partes del programa original del mininet, pero entre los mas importantes estan:
19
20 + node
21
22 + link
23
24 + net
25
26 + topo
27 + topolib
28 + util
29 + `clustercli.py`
30 + log
31 + clean
32
33 # imports *no mininet*
34
35 dentro de los imports tambien hay un conjunto de cosas que se importan que no son parte de mininet, estas cosas que se importan sin ser parte de mininet son en gran parte funciones del sistema y entre estas se incluyen las siguientes:
36
37 + signal (`signal` `SIGINT` `SIG_IGN`)
38 + subprocess (`Popen` `PIPE` `STDOUT`)
39
40 + os
41
42 + random (`randrange`)
43
44 + sys
45
46 + re
47
48 + itertools (`groupby`)
49
50 + operator (`attrgetter`)
51
52 + disutils.version (`StrictVersion`)
53
54 # findUser()
55
56 > function
57
58 Esta es una funcion que intenta encontra que usuario es el que esta corriendo cluster.py a traves de un comando de tipo *whoami* y no hace mas nada que esto, esta es la primera funcion que nos encontraremos por aca.
59
60 # ClusterCleanup( *object* )
61
62 > class
63
64 esta clase se compone de multiples metodos que sirven para limpiar el cluster. tiene muchas funciones que podrian parecer no pertenecer aca
65
66 ## add( cls, server, user='' )
67
68 > class method
69
70 esta funcion se encarga de agregar entradas a un diccionario de server:usuario
71
72 ## cleanup( cls )
73
74 > class method
75
76 esta es una funcion que se encarga de limpiar todos los servidores a traves de ssh, enviando el comando `mn -c` a todos los pares dentro del diccionario server:user
77
78 # RemoteMixin( *object* )
79
80 >  class
81
82 es una clase especial que se encarga de convertir los nodos locales en nodos remotos y en base a sus propias palabras:
83
84 > se podrian convertir mas tarde los nodos en nodos que funcionen todos como remotos modificando la clase nodo en el programa original de mininet sin ningun problema, pero con esta clase `mix-in` logramos tener mas control.
85
86 en esta clase hay un intenso uso del ssh y comienza con una base ssh que es
87
88 ```python
89 sshbase = [ 'ssh', '-q',
90                 '-o', 'BatchMode=yes',
91                 '-o', 'ForwardAgent=yes', '-tt' ]
92 ```
93
94 esta base le permite no imprimir datos innecesarios ni tener que introducir las credenciales cada vez.
95
96 ## def _ _ init _ _(self, name, server='localhost', user=None, serverIP=None,                  controlPath=False, splitInit=False, **kwargs)
97 > class initializer
98
99 en este inicializador de las classes se introduce el nombre de lnodo remoto, el servidor remoto, el usurio en el servidor remoto, la via de control y el split (estas tres ultimas cosas son opcionales).  
100
101 el argumento restante que se llama `**kwargs` son los elementos que le pertenecen a nuestro `Node()`comun de **mininet.**
102
103 ## findServerIP( cls, server )
104
105 > class method
106
107 este es simplemente un metodo que se encarga de devolver el IP de nuestro server para este nodo.
108
109 ## startShell( self, *args, **kwargs )
110
111 > class function
112
113 esta funcion se encarga de comenzar un shell para correr comandos en el remoto.
114
115 ## finishInit( self )
116
117 > class function
118
119 este se encarga de esperar a que los split initialization se completen
120
121 ## rpopen( self, *cmd, **opts )
122
123 > class function
124
125 retorna un objeto `Popen` en un servicio que se encuentra en el *namespace* de **root**
126
127 ## rcmd( self, *cmd, **opts)
128
129 > class function
130
131 corre un comando en el servidor, es decir, corre un comando no en el nodo sino en el *namespace* de **root**
132
133 ## _ignoreSignal()
134
135 > Static method
136
137 este es un metodo que se utiliza para separar el proceso de su grupo y asi ignorar todos los signals que se hagan a ese grupo
138
139 ## _popen( self, cmd, sudo=True, tt=True, **params )
140
141 > class function
142
143 abre un proceso en un nodo remoto.
144
145 tambien tenemos mas abajo el `def popen( self, *args, **kwargs)` que es solo un overrride que se encarga de ignorar el parametro tt
146
147 ## addIntf( self, *args, **kwargs )
148
149 > class function
150
151 Este es un overrride que se usa para utilizar `RemoteLink.moveIntf`
152
153 # RemoteNode( RemoteMixin, Node )
154
155 > class
156
157 esta clase es solo un nodo en un servidor remoto, tambien es sinonimo de la clase `RemoteHost()` y muy parecida a la clase `RemoteOVSSwitch( RemoteMixin, OVSSwitch)` que es una instancia remota de un open vSwitch
158
159 # RemoteOVSSwitch( RemoteMixin, OVSSwitch )
160
161 > class 
162
163 Esta es una instancia remota de Open vSwitch y cuenta con ciertas funciones a deferencia del `RemoteNode()`
164
165 ## _ _ init _ _ ( self, *args, **kwargs )
166
167 > class initializer
168
169 es un simple inicializador de la clase
170
171 ## isOldOvs( self )
172
173 > class function
174
175 esta funcion nos dice si la version de OVS es una version antigua, es decir, nos devuelve **true** si la version es menor a la version *1.10*
176
177 ## batchStartup( cls, switches, **_kwargs )
178
179 > class method
180
181 inicializa los switchs en batches por servidores, tiene una funcion contraparte que es `batchShutdown( cls, switches, **_kwargs )` que apaga los switches en batches por servidores
182
183 # RemoteLink( Link )
184
185 > class
186
187 Es un link entre nodos que podrian estar en servidores diferentes. La funcion di inicializacion es muy comun puesto a que tiene casi los mismos parametros que en un `Link()` comun por lo que se omite aca
188
189 ## stop( self )
190
191 > class function
192
193 detiene el link, no tiene nada mas
194
195 ## makeIntfPair(elf, intfname1, intfname2, addr1=None, addr2=None, node1=None, node2=None, deleteIntfs=True)
196 > class function
197
198 esta funcion crea un par de interfaces
199
200 ## moveIntf( intf, node )
201
202 > static method
203
204 mueve una interfaz remota del *namespace* **root** al *nodo*
205
206 ## makeTunnel( self, node1, node2, intfname1, intfname2, addr1=None, addr2=None ) :red_circle:
207
208 > class function
209
210 Esta es la funcion que se encarga de crear el tunnel ssh entre los switches!!!!
211
212 esto es de alta importancia! :warning:
213
214 ## status( self )
215
216 > class function
217
218 esta funcion devuelve el estado en que se encuentra un link
219
220 # RemoteSSHLink( RemoteLink )
221
222 > class :warning:
223
224 esta funcion contiene los datos especificos de los links que seran ssh
225
226 # RemoteGRELink( RemoteLink)
227
228 > class
229
230 a esta clase hay que darle especial atencion porque por alguna razon los creadores del codigo dicen que aun no es compatible, esta clase tiene metodos para: 
231
232 + inicializar
233 + detener
234 + crear pares de interfaces
235 + crear tunel
236
237 # Placing
238
239 > multiple classes
240
241 hay un conglomerado de clases que se utilizaran para la distribucion de switches y que queremos reemplazar, por eso no se dan detalles mayores, pero esas clases son:
242
243 ```python
244 class Placer( object )
245 class RandomPlacer( object )
246 class RoundRobinPlacer( object )
247 class SwitchBinPlacer( object ) #factible
248 class HostSwitchBinPlacer( object )#poco factible
249 ```
250
251 # MininetCluster ( Mininet ) :green_book:
252
253 > class
254
255 Una version nueva de la clase mininet que esta mejorada par a poder ser clusterizable
256
257 en esta ocasion no se hablaran las funciones que se encuentran aca dentro porque se deben estudiar linea por linea cuidadosamente mas adelante, ademas de que se deben leer las partes equivalentes en el mininet comun, tambien se debe intentar probar esta