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:
33 # imports *no mininet*
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:
37 + signal (`signal` `SIGINT` `SIG_IGN`)
38 + subprocess (`Popen` `PIPE` `STDOUT`)
42 + random (`randrange`)
48 + itertools (`groupby`)
50 + operator (`attrgetter`)
52 + disutils.version (`StrictVersion`)
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.
60 # ClusterCleanup( *object* )
64 esta clase se compone de multiples metodos que sirven para limpiar el cluster. tiene muchas funciones que podrian parecer no pertenecer aca
66 ## add( cls, server, user='' )
70 esta funcion se encarga de agregar entradas a un diccionario de server:usuario
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
78 # RemoteMixin( *object* )
82 es una clase especial que se encarga de convertir los nodos locales en nodos remotos y en base a sus propias palabras:
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.
86 en esta clase hay un intenso uso del ssh y comienza con una base ssh que es
89 sshbase = [ 'ssh', '-q',
90 '-o', 'BatchMode=yes',
91 '-o', 'ForwardAgent=yes', '-tt' ]
94 esta base le permite no imprimir datos innecesarios ni tener que introducir las credenciales cada vez.
96 ## def _ _ init _ _(self, name, server='localhost', user=None, serverIP=None, controlPath=False, splitInit=False, **kwargs)
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).
101 el argumento restante que se llama `**kwargs` son los elementos que le pertenecen a nuestro `Node()`comun de **mininet.**
103 ## findServerIP( cls, server )
107 este es simplemente un metodo que se encarga de devolver el IP de nuestro server para este nodo.
109 ## startShell( self, *args, **kwargs )
113 esta funcion se encarga de comenzar un shell para correr comandos en el remoto.
115 ## finishInit( self )
119 este se encarga de esperar a que los split initialization se completen
121 ## rpopen( self, *cmd, **opts )
125 retorna un objeto `Popen` en un servicio que se encuentra en el *namespace* de **root**
127 ## rcmd( self, *cmd, **opts)
131 corre un comando en el servidor, es decir, corre un comando no en el nodo sino en el *namespace* de **root**
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
139 ## _popen( self, cmd, sudo=True, tt=True, **params )
143 abre un proceso en un nodo remoto.
145 tambien tenemos mas abajo el `def popen( self, *args, **kwargs)` que es solo un overrride que se encarga de ignorar el parametro tt
147 ## addIntf( self, *args, **kwargs )
151 Este es un overrride que se usa para utilizar `RemoteLink.moveIntf`
153 # RemoteNode( RemoteMixin, Node )
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
159 # RemoteOVSSwitch( RemoteMixin, OVSSwitch )
163 Esta es una instancia remota de Open vSwitch y cuenta con ciertas funciones a deferencia del `RemoteNode()`
165 ## _ _ init _ _ ( self, *args, **kwargs )
169 es un simple inicializador de la clase
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*
177 ## batchStartup( cls, switches, **_kwargs )
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
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
193 detiene el link, no tiene nada mas
195 ## makeIntfPair(elf, intfname1, intfname2, addr1=None, addr2=None, node1=None, node2=None, deleteIntfs=True)
198 esta funcion crea un par de interfaces
200 ## moveIntf( intf, node )
204 mueve una interfaz remota del *namespace* **root** al *nodo*
206 ## makeTunnel( self, node1, node2, intfname1, intfname2, addr1=None, addr2=None ) :red_circle:
210 Esta es la funcion que se encarga de crear el tunnel ssh entre los switches!!!!
212 esto es de alta importancia! :warning:
218 esta funcion devuelve el estado en que se encuentra un link
220 # RemoteSSHLink( RemoteLink )
224 esta funcion contiene los datos especificos de los links que seran ssh
226 # RemoteGRELink( RemoteLink)
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:
234 + crear pares de interfaces
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:
244 class Placer( object )
245 class RandomPlacer( object )
246 class RoundRobinPlacer( object )
247 class SwitchBinPlacer( object ) #factible
248 class HostSwitchBinPlacer( object )#poco factible
251 # MininetCluster ( Mininet ) :green_book:
255 Una version nueva de la clase mininet que esta mejorada par a poder ser clusterizable
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