@@ -164,6 +164,13 @@ def get_mylogin_cnf(self, node: remote.RemoteConnection) -> bytes:
164164
165165 def start_mysql_servers (self ) -> None :
166166 for node in self .mysql_nodes :
167+ _ , stdout , _ = node .ssh_client .exec_command (
168+ "docker inspect --format='{{.State.Health.Status}}'"
169+ " mysql 2>/dev/null"
170+ )
171+ if stdout .read ().decode ().strip () == "healthy" :
172+ continue
173+ node .ssh_client .exec_command ("docker rm -f mysql 2>/dev/null" )
167174 node .upload_directory (
168175 local_directory_path = "./services/mysql-server" ,
169176 remote_directory_path = "/opt/superset-cluster/mysql-server"
@@ -195,6 +202,13 @@ def start_mysql_servers(self) -> None:
195202 )
196203
197204 def start_mysql_mgmt (self , node : remote .RemoteConnection , state : str , priority : int ) -> None :
205+ _ , stdout , _ = node .ssh_client .exec_command (
206+ "docker inspect --format='{{.State.Health.Status}}'"
207+ " mysql-mgmt 2>/dev/null"
208+ )
209+ if stdout .read ().decode ().strip () == "healthy" :
210+ return
211+ node .ssh_client .exec_command ("docker rm -f mysql-mgmt 2>/dev/null" )
198212 node .upload_directory (
199213 local_directory_path = "./services/mysql-mgmt" ,
200214 remote_directory_path = "/opt/superset-cluster/mysql-mgmt"
@@ -251,6 +265,23 @@ def start_mysql_mgmt(self, node: remote.RemoteConnection, state: str, priority:
251265
252266 def start_superset (self ) -> None :
253267 for node in self .mgmt_nodes :
268+ _ , redis_out , _ = node .ssh_client .exec_command (
269+ "docker inspect --format='{{.State.Health.Status}}'"
270+ " redis 2>/dev/null"
271+ )
272+ _ , svc_out , _ = node .ssh_client .exec_command (
273+ "docker service ps superset"
274+ " --format='{{.CurrentState}}'"
275+ " --filter desired-state=running 2>/dev/null"
276+ )
277+ redis_healthy = redis_out .read ().decode ().strip () == "healthy"
278+ superset_running = "Running" in svc_out .read ().decode ()
279+ if redis_healthy and superset_running :
280+ continue
281+ node .ssh_client .exec_command (
282+ "docker service rm superset 2>/dev/null;"
283+ " docker rm -f redis 2>/dev/null"
284+ )
254285 node .upload_directory (
255286 local_directory_path = "./services/superset" ,
256287 remote_directory_path = '/opt/superset-cluster/superset'
@@ -283,27 +314,6 @@ def start_superset(self) -> None:
283314 mysql_superset_password = self .mysql_superset_password )
284315 )
285316
286- def _close_connections (self ) -> None :
287- for node in list (itertools .chain (self .mysql_nodes , self .mgmt_nodes )):
288- node .ssh_client .close ()
289- node .sftp_client .close ()
290-
291- def _run_ssh_command (self , node : remote .RemoteConnection , command : str ) -> None :
292- _ , stdout , stderr = node .ssh_client .exec_command (command )
293- exit_status = stdout .channel .recv_exit_status ()
294- if exit_status != 0 :
295- raise RuntimeError (
296- f"Command failed on { node .node } (exit { exit_status } ): "
297- f"{ command } \n { stderr .read ().decode ().strip ()} "
298- )
299-
300- def _prepare_nodes (self ) -> None :
301- for node in itertools .chain (self .mysql_nodes , self .mgmt_nodes ):
302- try :
303- node .sftp_client .mkdir ('/opt/superset-cluster' )
304- except IOError :
305- pass
306-
307317 def teardown_node (self , node : remote .RemoteConnection , is_mgmt : bool = False ) -> None :
308318 commands = [
309319 "if docker info --format '{{.Swarm.LocalNodeState}}' 2>/dev/null"
@@ -316,7 +326,6 @@ def teardown_node(self, node: remote.RemoteConnection, is_mgmt: bool = False) ->
316326 " | xargs -r docker network rm" ,
317327 "if [ -d /opt/superset-cluster ]; then"
318328 " rm -rf /opt/superset-cluster; fi" ,
319- "find /opt -maxdepth 1 -name '*.pyc' -delete" ,
320329 ]
321330 if is_mgmt :
322331 commands .extend ([
@@ -330,34 +339,35 @@ def teardown_node(self, node: remote.RemoteConnection, is_mgmt: bool = False) ->
330339 " ip route del {vip}; fi" .format (
331340 vip = self .virtual_ip_address ),
332341 ])
333- for cmd in commands :
334- self ._run_ssh_command (node , cmd )
335-
336- def teardown_cluster (self ) -> None :
337- for node in self .mgmt_nodes :
338- self .teardown_node (node , is_mgmt = True )
339- for node in self .mysql_nodes :
340- self .teardown_node (node , is_mgmt = False )
342+ _ , stdout , stderr = node .ssh_client .exec_command (" && " .join (commands ))
343+ exit_status = stdout .channel .recv_exit_status ()
344+ if exit_status != 0 :
345+ raise RuntimeError (
346+ f"Teardown failed on { node .node } (exit { exit_status } ): "
347+ f"{ stderr .read ().decode ().strip ()} "
348+ )
341349
342350 def start_cluster (self ) -> None :
343- self .start_mysql_servers ()
344- self .start_mysql_mgmt (node = self .mgmt_nodes [0 ], state = "MASTER" , priority = 100 )
345- self .start_mysql_mgmt (node = self .mgmt_nodes [1 ], state = "BACKUP" , priority = 90 )
346- self .start_superset ()
347-
348- def deploy (self ) -> None :
349351 try :
350- self .teardown_cluster ()
351- self ._prepare_nodes ()
352- self .start_cluster ()
352+ self .start_mysql_servers ()
353+ self .start_mysql_mgmt (node = self .mgmt_nodes [0 ], state = "MASTER" , priority = 100 )
354+ self .start_mysql_mgmt (node = self .mgmt_nodes [1 ], state = "BACKUP" , priority = 90 )
355+ self .start_superset ()
353356 finally :
354- self ._close_connections ()
357+ for node in list (itertools .chain (self .mysql_nodes , self .mgmt_nodes )):
358+ node .ssh_client .close ()
359+ node .sftp_client .close ()
355360
356361 def cleanup (self ) -> None :
357362 try :
358- self .teardown_cluster ()
363+ for node in self .mgmt_nodes :
364+ self .teardown_node (node , is_mgmt = True )
365+ for node in self .mysql_nodes :
366+ self .teardown_node (node , is_mgmt = False )
359367 finally :
360- self ._close_connections ()
368+ for node in list (itertools .chain (self .mysql_nodes , self .mgmt_nodes )):
369+ node .ssh_client .close ()
370+ node .sftp_client .close ()
361371
362372
363373if __name__ == "__main__" :
@@ -371,4 +381,4 @@ def cleanup(self) -> None:
371381 if action == "cleanup" :
372382 controller .cleanup ()
373383 else :
374- controller .deploy ()
384+ controller .start_cluster ()
0 commit comments