@@ -983,15 +983,57 @@ def get_db():
983983 """Get database connection"""
984984 return sqlite3 .connect (DATABASE_PATH )
985985
986+ def resolve_container (docker_client , container_id , container_name = None ):
987+ try :
988+ return docker_client .containers .get (container_id ), False
989+ except docker .errors .NotFound :
990+ pass
991+ except Exception :
992+ pass
993+
994+ if not container_name :
995+ return None , False
996+
997+ try :
998+ matches = docker_client .containers .list (all = True , filters = {'name' : container_name }) or []
999+ for candidate in matches :
1000+ if candidate .name == container_name :
1001+ return candidate , True
1002+ if len (matches ) == 1 :
1003+ return matches [0 ], True
1004+ except Exception :
1005+ pass
1006+
1007+ return None , False
1008+
1009+ def update_schedule_container_id (schedule_id , container_id ):
1010+ if not schedule_id or not container_id :
1011+ return
1012+ try :
1013+ conn = get_db ()
1014+ cursor = conn .cursor ()
1015+ cursor .execute (
1016+ 'UPDATE schedules SET container_id = ? WHERE id = ?' ,
1017+ (container_id , schedule_id )
1018+ )
1019+ conn .commit ()
1020+ conn .close ()
1021+ except Exception :
1022+ pass
1023+
9861024def restart_container (container_id , container_name , schedule_id = None , host_id = 1 ):
9871025 """Restart a Docker container"""
9881026 try :
9891027 docker_client = docker_manager .get_client (host_id )
9901028 if not docker_client :
9911029 raise Exception (f"Cannot connect to Docker host { host_id } " )
9921030
993- container = docker_client .containers .get (container_id )
1031+ container , resolved_by_name = resolve_container (docker_client , container_id , container_name )
1032+ if not container :
1033+ raise docker .errors .NotFound (f"No such container: { container_id } " )
9941034 container .restart ()
1035+ if resolved_by_name :
1036+ update_schedule_container_id (schedule_id , container .id [:12 ])
9951037 message = f"Container { container_name } restarted successfully"
9961038 logger .info (message )
9971039 log_action (schedule_id , container_name , 'restart' , 'success' , message , host_id )
@@ -1025,8 +1067,12 @@ def start_container(container_id, container_name, schedule_id=None, host_id=1):
10251067 if not docker_client :
10261068 raise Exception (f"Cannot connect to Docker host { host_id } " )
10271069
1028- container = docker_client .containers .get (container_id )
1070+ container , resolved_by_name = resolve_container (docker_client , container_id , container_name )
1071+ if not container :
1072+ raise docker .errors .NotFound (f"No such container: { container_id } " )
10291073 container .start ()
1074+ if resolved_by_name :
1075+ update_schedule_container_id (schedule_id , container .id [:12 ])
10301076 message = f"Container { container_name } started successfully"
10311077 logger .info (message )
10321078 log_action (schedule_id , container_name , 'start' , 'success' , message , host_id )
@@ -1060,8 +1106,12 @@ def stop_container(container_id, container_name, schedule_id=None, host_id=1):
10601106 if not docker_client :
10611107 raise Exception (f"Cannot connect to Docker host { host_id } " )
10621108
1063- container = docker_client .containers .get (container_id )
1109+ container , resolved_by_name = resolve_container (docker_client , container_id , container_name )
1110+ if not container :
1111+ raise docker .errors .NotFound (f"No such container: { container_id } " )
10641112 container .stop ()
1113+ if resolved_by_name :
1114+ update_schedule_container_id (schedule_id , container .id [:12 ])
10651115 message = f"Container { container_name } stopped successfully"
10661116 logger .info (message )
10671117 log_action (schedule_id , container_name , 'stop' , 'success' , message , host_id )
@@ -1095,8 +1145,12 @@ def pause_container(container_id, container_name, schedule_id=None, host_id=1):
10951145 if not docker_client :
10961146 raise Exception (f"Cannot connect to Docker host { host_id } " )
10971147
1098- container = docker_client .containers .get (container_id )
1148+ container , resolved_by_name = resolve_container (docker_client , container_id , container_name )
1149+ if not container :
1150+ raise docker .errors .NotFound (f"No such container: { container_id } " )
10991151 container .pause ()
1152+ if resolved_by_name :
1153+ update_schedule_container_id (schedule_id , container .id [:12 ])
11001154 message = f"Container { container_name } paused successfully"
11011155 logger .info (message )
11021156 log_action (schedule_id , container_name , 'pause' , 'success' , message , host_id )
@@ -1130,8 +1184,12 @@ def unpause_container(container_id, container_name, schedule_id=None, host_id=1)
11301184 if not docker_client :
11311185 raise Exception (f"Cannot connect to Docker host { host_id } " )
11321186
1133- container = docker_client .containers .get (container_id )
1187+ container , resolved_by_name = resolve_container (docker_client , container_id , container_name )
1188+ if not container :
1189+ raise docker .errors .NotFound (f"No such container: { container_id } " )
11341190 container .unpause ()
1191+ if resolved_by_name :
1192+ update_schedule_container_id (schedule_id , container .id [:12 ])
11351193 message = f"Container { container_name } unpaused successfully"
11361194 logger .info (message )
11371195 log_action (schedule_id , container_name , 'unpause' , 'success' , message , host_id )
0 commit comments