Skip to content

Commit 9e826f8

Browse files
committed
fix containers cleanup bug
1 parent f318a95 commit 9e826f8

4 files changed

Lines changed: 58 additions & 0 deletions

File tree

node_cli/operations/base.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
compose_up,
7272
docker_cleanup,
7373
remove_dynamic_containers,
74+
rm_legacy_containers,
7475
system_prune,
7576
)
7677
from node_cli.utils.helper import cleanup_dir_content, rm_dir
@@ -123,6 +124,7 @@ def wrapper(
123124
@checked_host
124125
def update(settings: BaseNodeSettings, compose_env: dict, node_mode: NodeMode) -> bool:
125126
compose_rm(node_type=NodeType.SKALE, node_mode=node_mode, env=compose_env)
127+
rm_legacy_containers()
126128
remove_dynamic_containers()
127129

128130
sync_skale_node()
@@ -273,6 +275,7 @@ def init_passive(
273275

274276
def update_passive(settings: BaseNodeSettings, compose_env: dict) -> bool:
275277
compose_rm(env=compose_env, node_type=NodeType.SKALE, node_mode=NodeMode.PASSIVE)
278+
rm_legacy_containers()
276279
remove_dynamic_containers()
277280
cleanup_volume_artifacts(settings.block_device)
278281
download_skale_node(settings.node_version, settings.container_configs_dir or None)
@@ -326,6 +329,7 @@ def update_passive(settings: BaseNodeSettings, compose_env: dict) -> bool:
326329
def turn_off(compose_env: dict, node_type: NodeType, node_mode: NodeMode) -> None:
327330
logger.info('Turning off the node...')
328331
compose_rm(env=compose_env, node_type=node_type, node_mode=node_mode)
332+
rm_legacy_containers()
329333
remove_dynamic_containers()
330334
logger.info('Node was successfully turned off')
331335

node_cli/operations/fair.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
docker_cleanup,
6565
is_admin_running,
6666
remove_dynamic_containers,
67+
rm_legacy_containers,
6768
start_container_by_name,
6869
stop_container_by_name,
6970
system_prune,
@@ -201,6 +202,7 @@ def update_fair_boot(
201202
node_mode: NodeMode = NodeMode.ACTIVE,
202203
) -> bool:
203204
compose_rm(node_type=NodeType.FAIR, node_mode=node_mode, env=compose_env)
205+
rm_legacy_containers()
204206
remove_dynamic_containers()
205207
cleanup_volume_artifacts(settings.block_device)
206208

@@ -260,6 +262,7 @@ def update(
260262
force_skaled_start: bool,
261263
) -> bool:
262264
compose_rm(node_type=NodeType.FAIR, node_mode=node_mode, env=compose_env)
265+
rm_legacy_containers()
263266
if update_type not in (FairUpdateType.INFRA_ONLY, FairUpdateType.FROM_BOOT):
264267
remove_dynamic_containers()
265268

node_cli/utils/docker_utils.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,11 @@ def remove_telegraf() -> None:
163163
remove_containers(telegraf, timeout=TELEGRAF_REMOVE_TIMEOUT)
164164

165165

166+
def rm_legacy_containers() -> None:
167+
containers = docker_client().containers.list(all=True, filters={'name': 'skale_'})
168+
remove_containers(containers, timeout=DOCKER_DEFAULT_STOP_TIMEOUT)
169+
170+
166171
def remove_containers(containers, timeout):
167172
for container in containers:
168173
safe_rm(container, timeout=timeout)

tests/docker_utils_test.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
docker_cleanup,
1111
get_all_ima_containers,
1212
get_all_skaled_containers,
13+
rm_legacy_containers,
1314
save_container_logs,
1415
safe_rm,
1516
)
@@ -111,6 +112,27 @@ def _make_container(name: str) -> MagicMock:
111112
return c
112113

113114

115+
def test_get_all_skaled_containers_real(dclient):
116+
containers = []
117+
names = ['sk_skaled_test_chain', 'skale_schain_test_chain']
118+
try:
119+
for name in names:
120+
c = dclient.containers.run('alpine', 'true', name=name, detach=True)
121+
containers.append(c)
122+
for c in containers:
123+
c.wait()
124+
result = get_all_skaled_containers()
125+
result_names = {c.name for c in result}
126+
for name in names:
127+
assert name in result_names
128+
finally:
129+
for c in containers:
130+
try:
131+
c.remove(force=True)
132+
except Exception:
133+
pass
134+
135+
114136
def test_get_all_skaled_containers_both_prefixes():
115137
new_container = _make_container('sk_skaled_chain1')
116138
legacy_container = _make_container('skale_schain_chain2')
@@ -155,3 +177,27 @@ def fake_list(all=True, filters=None):
155177
assert len(result) == 2
156178
names = {c.name for c in result}
157179
assert names == {'sk_ima_chain1', 'skale_ima_chain2'}
180+
181+
182+
def test_rm_legacy_containers(dclient):
183+
names = ['skale_sync_admin', 'skale_api', 'skale_schain_old']
184+
containers = []
185+
try:
186+
for name in names:
187+
c = dclient.containers.run('alpine', 'true', name=name, detach=True)
188+
containers.append(c)
189+
for c in containers:
190+
c.wait()
191+
192+
rm_legacy_containers()
193+
194+
remaining = dclient.containers.list(all=True, filters={'name': 'skale_'})
195+
remaining_names = {c.name for c in remaining}
196+
for name in names:
197+
assert name not in remaining_names
198+
finally:
199+
for c in containers:
200+
try:
201+
c.remove(force=True)
202+
except Exception:
203+
pass

0 commit comments

Comments
 (0)