Skip to content

Commit f74f3a5

Browse files
committed
Resolve scheduled containers by name
1 parent 549d9f8 commit f74f3a5

1 file changed

Lines changed: 63 additions & 5 deletions

File tree

app/main.py

Lines changed: 63 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
9861024
def 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

Comments
 (0)