Skip to content

Commit dc39e49

Browse files
committed
feat: add check flag to control when image update checks are run
1 parent 3de015e commit dc39e49

12 files changed

+80
-17
lines changed

src/algokit/cli/localnet.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@
2424

2525
logger = logging.getLogger(__name__)
2626

27+
check_option = click.option(
28+
"check",
29+
"--check",
30+
is_flag=True,
31+
default=False,
32+
help="Force check the Docker registry for new LocalNet image versions, ignoring the version check cache.",
33+
)
34+
2735

2836
@click.group("localnet", short_help="Manage the AlgoKit LocalNet.")
2937
@click.pass_context
@@ -157,7 +165,10 @@ def config_command(*, engine: str | None, force: bool) -> None:
157165
default=False,
158166
help="Ignore the prompt to stop the LocalNet if it's already running.",
159167
)
160-
def start_localnet(*, name: str | None, config_path: Path | None, algod_dev_mode: bool, force: bool) -> None:
168+
@check_option
169+
def start_localnet(
170+
*, name: str | None, config_path: Path | None, algod_dev_mode: bool, force: bool, check: bool
171+
) -> None:
161172
sandbox = ComposeSandbox.from_environment()
162173
full_name = f"{SANDBOX_BASE_NAME}_{name}" if name is not None else SANDBOX_BASE_NAME
163174
if sandbox is not None and full_name != sandbox.name:
@@ -168,7 +179,7 @@ def start_localnet(*, name: str | None, config_path: Path | None, algod_dev_mode
168179
raise click.ClickException("LocalNet is already running. Please stop it first")
169180
sandbox = ComposeSandbox(SANDBOX_BASE_NAME, config_path) if name is None else ComposeSandbox(name, config_path)
170181
compose_file_status = sandbox.compose_file_status()
171-
sandbox.check_docker_compose_for_new_image_versions()
182+
sandbox.check_docker_compose_for_new_image_versions(force=check)
172183
if compose_file_status is ComposeFileStatus.MISSING:
173184
logger.debug("LocalNet compose file does not exist yet; writing it out for the first time")
174185
sandbox.write_compose_file()
@@ -227,7 +238,8 @@ def stop_localnet() -> None:
227238
required=False,
228239
help="Specify the custom localnet configuration directory.",
229240
)
230-
def reset_localnet(*, update: bool, config_path: Path | None) -> None:
241+
@check_option
242+
def reset_localnet(*, update: bool, config_path: Path | None, check: bool) -> None:
231243
sandbox = ComposeSandbox.from_environment()
232244
if sandbox is None:
233245
sandbox = ComposeSandbox(config_path=config_path)
@@ -243,7 +255,7 @@ def reset_localnet(*, update: bool, config_path: Path | None) -> None:
243255
if update:
244256
sandbox.pull()
245257
else:
246-
sandbox.check_docker_compose_for_new_image_versions()
258+
sandbox.check_docker_compose_for_new_image_versions(force=check)
247259
elif update:
248260
if click.confirm(
249261
f"A named LocalNet is running, are you sure you want to reset the LocalNet configuration "
@@ -265,11 +277,14 @@ def reset_localnet(*, update: bool, config_path: Path | None) -> None:
265277

266278

267279
@localnet_group.command("status", short_help="Check the status of the AlgoKit LocalNet.")
268-
def localnet_status() -> None:
280+
@check_option
281+
def localnet_status(*, check: bool) -> None:
269282
sandbox = ComposeSandbox.from_environment()
270283
if sandbox is None:
271284
sandbox = ComposeSandbox()
272285

286+
sandbox.check_docker_compose_for_new_image_versions(force=check)
287+
273288
logger.info("# container engine")
274289
logger.info(
275290
"Name: " + click.style(get_container_engine(), bold=True) + " (change with `algokit config container-engine`)"

src/algokit/core/sandbox.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,8 +285,8 @@ def is_image_up_to_date(self, image_name: str) -> bool:
285285
latest_version = self._get_latest_image_version(image_name)
286286
return latest_version is None or latest_version in local_versions
287287

288-
def check_docker_compose_for_new_image_versions(self) -> None:
289-
if not _should_check_image_versions():
288+
def check_docker_compose_for_new_image_versions(self, *, force: bool = False) -> None:
289+
if not force and not _should_check_image_versions():
290290
return
291291

292292
is_indexer_up_to_date = self.is_image_up_to_date(INDEXER_IMAGE)

tests/localnet/test_localnet_status.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from tests.utils.proc_mock import ProcMock
1313

1414

15-
@pytest.mark.usefixtures("_mock_proc_with_running_localnet")
15+
@pytest.mark.usefixtures("_mock_proc_with_running_localnet", "_localnet_up_to_date")
1616
def test_localnet_status_successful(app_dir_mock: AppDirs, proc_mock: ProcMock, httpx_mock: HTTPXMock) -> None:
1717
(app_dir_mock.app_config_dir / "sandbox").mkdir()
1818
(app_dir_mock.app_config_dir / "sandbox" / "docker-compose.yml").write_text("existing")
@@ -44,7 +44,7 @@ def test_localnet_status_successful(app_dir_mock: AppDirs, proc_mock: ProcMock,
4444
)
4545

4646

47-
@pytest.mark.usefixtures("_mock_proc_with_running_localnet")
47+
@pytest.mark.usefixtures("_mock_proc_with_running_localnet", "_localnet_up_to_date")
4848
def test_localnet_status_http_error(app_dir_mock: AppDirs, proc_mock: ProcMock, httpx_mock: HTTPXMock) -> None:
4949
(app_dir_mock.app_config_dir / "sandbox").mkdir()
5050
(app_dir_mock.app_config_dir / "sandbox" / "docker-compose.yml").write_text("existing")
@@ -74,7 +74,7 @@ def test_localnet_status_http_error(app_dir_mock: AppDirs, proc_mock: ProcMock,
7474
)
7575

7676

77-
@pytest.mark.usefixtures("_mock_proc_with_running_localnet")
77+
@pytest.mark.usefixtures("_mock_proc_with_running_localnet", "_localnet_up_to_date")
7878
def test_localnet_status_unexpected_port(app_dir_mock: AppDirs, proc_mock: ProcMock, httpx_mock: HTTPXMock) -> None:
7979
(app_dir_mock.app_config_dir / "sandbox").mkdir()
8080
(app_dir_mock.app_config_dir / "sandbox" / "docker-compose.yml").write_text("existing")
@@ -109,7 +109,7 @@ def test_localnet_status_unexpected_port(app_dir_mock: AppDirs, proc_mock: ProcM
109109
)
110110

111111

112-
@pytest.mark.usefixtures("_mock_proc_with_running_localnet")
112+
@pytest.mark.usefixtures("_mock_proc_with_running_localnet", "_localnet_up_to_date")
113113
def test_localnet_status_service_not_started(app_dir_mock: AppDirs, proc_mock: ProcMock, httpx_mock: HTTPXMock) -> None:
114114
(app_dir_mock.app_config_dir / "sandbox").mkdir()
115115
(app_dir_mock.app_config_dir / "sandbox" / "docker-compose.yml").write_text("existing")
@@ -134,7 +134,7 @@ def test_localnet_status_service_not_started(app_dir_mock: AppDirs, proc_mock: P
134134
)
135135

136136

137-
@pytest.mark.usefixtures("_mock_proc_with_running_localnet")
137+
@pytest.mark.usefixtures("_mock_proc_with_running_localnet", "_localnet_up_to_date")
138138
def test_localnet_status_docker_error(app_dir_mock: AppDirs, proc_mock: ProcMock, httpx_mock: HTTPXMock) -> None:
139139
(app_dir_mock.app_config_dir / "sandbox").mkdir()
140140
(app_dir_mock.app_config_dir / "sandbox" / "docker-compose.yml").write_text("existing")
@@ -167,8 +167,8 @@ def test_localnet_status_docker_error(app_dir_mock: AppDirs, proc_mock: ProcMock
167167
)
168168

169169

170-
@pytest.mark.usefixtures("_mock_proc_with_running_localnet")
171-
def test_localnet_status_missing_service(app_dir_mock: AppDirs, proc_mock: ProcMock, httpx_mock: HTTPXMock) -> None:
170+
@pytest.mark.usefixtures("_mock_proc_with_running_localnet", "_localnet_up_to_date")
171+
def test_localnet_status_missing_service(app_dir_mock: AppDirs, proc_mock: ProcMock) -> None:
172172
(app_dir_mock.app_config_dir / "sandbox").mkdir()
173173
(app_dir_mock.app_config_dir / "sandbox" / "docker-compose.yml").write_text("existing")
174174

@@ -182,13 +182,12 @@ def test_localnet_status_missing_service(app_dir_mock: AppDirs, proc_mock: ProcM
182182
result = invoke("localnet status")
183183

184184
assert result.exit_code == 1
185-
assert not httpx_mock.get_request()
186185
verify(
187186
result.output.replace("\\\\", "\\").replace(str(app_dir_mock.app_config_dir), "{app_config}").replace("\\", "/")
188187
)
189188

190189

191-
@pytest.mark.usefixtures("_mock_proc_with_running_localnet")
190+
@pytest.mark.usefixtures("_mock_proc_with_running_localnet", "_localnet_up_to_date")
192191
def test_localnet_status_failure(app_dir_mock: AppDirs, proc_mock: ProcMock) -> None:
193192
(app_dir_mock.app_config_dir / "sandbox").mkdir()
194193
(app_dir_mock.app_config_dir / "sandbox" / "docker-compose.yml").write_text("existing")
@@ -202,7 +201,7 @@ def test_localnet_status_failure(app_dir_mock: AppDirs, proc_mock: ProcMock) ->
202201
)
203202

204203

205-
@pytest.mark.usefixtures("proc_mock", "_mock_proc_with_running_localnet")
204+
@pytest.mark.usefixtures("proc_mock", "_mock_proc_with_running_localnet", "_localnet_up_to_date")
206205
def test_localnet_status_no_existing_definition(app_dir_mock: AppDirs) -> None:
207206
result = invoke("localnet status")
208207

tests/localnet/test_localnet_status.test_localnet_status_docker_error.approved.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ DEBUG: docker: STDOUT
55
DEBUG: docker: STDERR
66
DEBUG: Running 'docker compose ls --format json --filter name=algokit_sandbox*' in '{current_working_directory}'
77
DEBUG: docker: [{"Name": "algokit_sandbox", "Status": "running", "ConfigFiles": "{app_config}/sandbox/docker-compose.yml"}]
8+
DEBUG: Running 'docker image inspect algorand/indexer:latest --format {{range .RepoDigests}}{{println .}}{{end}}' in '{current_working_directory}'
9+
DEBUG: docker: tag@sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
10+
HTTP Request: GET https://registry.hub.docker.com/v2/repositories/algorand/indexer/tags/latest "HTTP/1.1 200 OK"
11+
DEBUG: Running 'docker image inspect algorand/algod:latest --format {{range .RepoDigests}}{{println .}}{{end}}' in '{current_working_directory}'
12+
DEBUG: docker: tag@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
13+
HTTP Request: GET https://registry.hub.docker.com/v2/repositories/algorand/algod/tags/latest "HTTP/1.1 200 OK"
814
# container engine
915
Name: docker (change with `algokit config container-engine`)
1016
DEBUG: Running 'docker compose ps --format json' in '{app_config}/sandbox'

tests/localnet/test_localnet_status.test_localnet_status_failure.approved.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ DEBUG: docker: STDOUT
55
DEBUG: docker: STDERR
66
DEBUG: Running 'docker compose ls --format json --filter name=algokit_sandbox*' in '{current_working_directory}'
77
DEBUG: docker: [{"Name": "algokit_sandbox", "Status": "running", "ConfigFiles": "{app_config}/sandbox/docker-compose.yml"}]
8+
DEBUG: Running 'docker image inspect algorand/indexer:latest --format {{range .RepoDigests}}{{println .}}{{end}}' in '{current_working_directory}'
9+
DEBUG: docker: tag@sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
10+
HTTP Request: GET https://registry.hub.docker.com/v2/repositories/algorand/indexer/tags/latest "HTTP/1.1 200 OK"
11+
DEBUG: Running 'docker image inspect algorand/algod:latest --format {{range .RepoDigests}}{{println .}}{{end}}' in '{current_working_directory}'
12+
DEBUG: docker: tag@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
13+
HTTP Request: GET https://registry.hub.docker.com/v2/repositories/algorand/algod/tags/latest "HTTP/1.1 200 OK"
814
# container engine
915
Name: docker (change with `algokit config container-engine`)
1016
DEBUG: Running 'docker compose ps --format json' in '{app_config}/sandbox'

tests/localnet/test_localnet_status.test_localnet_status_http_error.approved.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ DEBUG: docker: STDOUT
55
DEBUG: docker: STDERR
66
DEBUG: Running 'docker compose ls --format json --filter name=algokit_sandbox*' in '{current_working_directory}'
77
DEBUG: docker: [{"Name": "algokit_sandbox", "Status": "running", "ConfigFiles": "{app_config}/sandbox/docker-compose.yml"}]
8+
DEBUG: Running 'docker image inspect algorand/indexer:latest --format {{range .RepoDigests}}{{println .}}{{end}}' in '{current_working_directory}'
9+
DEBUG: docker: tag@sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
10+
HTTP Request: GET https://registry.hub.docker.com/v2/repositories/algorand/indexer/tags/latest "HTTP/1.1 200 OK"
11+
DEBUG: Running 'docker image inspect algorand/algod:latest --format {{range .RepoDigests}}{{println .}}{{end}}' in '{current_working_directory}'
12+
DEBUG: docker: tag@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
13+
HTTP Request: GET https://registry.hub.docker.com/v2/repositories/algorand/algod/tags/latest "HTTP/1.1 200 OK"
814
# container engine
915
Name: docker (change with `algokit config container-engine`)
1016
DEBUG: Running 'docker compose ps --format json' in '{app_config}/sandbox'

tests/localnet/test_localnet_status.test_localnet_status_missing_service.approved.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ DEBUG: docker: STDOUT
55
DEBUG: docker: STDERR
66
DEBUG: Running 'docker compose ls --format json --filter name=algokit_sandbox*' in '{current_working_directory}'
77
DEBUG: docker: [{"Name": "algokit_sandbox", "Status": "running", "ConfigFiles": "{app_config}/sandbox/docker-compose.yml"}]
8+
DEBUG: Running 'docker image inspect algorand/indexer:latest --format {{range .RepoDigests}}{{println .}}{{end}}' in '{current_working_directory}'
9+
DEBUG: docker: tag@sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
10+
HTTP Request: GET https://registry.hub.docker.com/v2/repositories/algorand/indexer/tags/latest "HTTP/1.1 200 OK"
11+
DEBUG: Running 'docker image inspect algorand/algod:latest --format {{range .RepoDigests}}{{println .}}{{end}}' in '{current_working_directory}'
12+
DEBUG: docker: tag@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
13+
HTTP Request: GET https://registry.hub.docker.com/v2/repositories/algorand/algod/tags/latest "HTTP/1.1 200 OK"
814
# container engine
915
Name: docker (change with `algokit config container-engine`)
1016
DEBUG: Running 'docker compose ps --format json' in '{app_config}/sandbox'

tests/localnet/test_localnet_status.test_localnet_status_no_existing_definition.approved.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ DEBUG: docker: STDERR
66
DEBUG: Running 'docker compose ls --format json --filter name=algokit_sandbox*' in '{current_working_directory}'
77
DEBUG: docker: [{"Name": "algokit_sandbox", "Status": "running", "ConfigFiles": "{app_config}/sandbox/docker-compose.yml"}]
88
DEBUG: The sandbox directory does not exist yet; creating it
9+
DEBUG: Running 'docker image inspect algorand/indexer:latest --format {{range .RepoDigests}}{{println .}}{{end}}' in '{current_working_directory}'
10+
DEBUG: docker: tag@sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
11+
HTTP Request: GET https://registry.hub.docker.com/v2/repositories/algorand/indexer/tags/latest "HTTP/1.1 200 OK"
12+
DEBUG: Running 'docker image inspect algorand/algod:latest --format {{range .RepoDigests}}{{println .}}{{end}}' in '{current_working_directory}'
13+
DEBUG: docker: tag@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
14+
HTTP Request: GET https://registry.hub.docker.com/v2/repositories/algorand/algod/tags/latest "HTTP/1.1 200 OK"
915
# container engine
1016
Name: docker (change with `algokit config container-engine`)
1117
DEBUG: Running 'docker compose ps --format json' in '{app_config}/sandbox'

tests/localnet/test_localnet_status.test_localnet_status_service_not_started.approved.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ DEBUG: docker: STDOUT
55
DEBUG: docker: STDERR
66
DEBUG: Running 'docker compose ls --format json --filter name=algokit_sandbox*' in '{current_working_directory}'
77
DEBUG: docker: [{"Name": "algokit_sandbox", "Status": "running", "ConfigFiles": "{app_config}/sandbox/docker-compose.yml"}]
8+
DEBUG: Running 'docker image inspect algorand/indexer:latest --format {{range .RepoDigests}}{{println .}}{{end}}' in '{current_working_directory}'
9+
DEBUG: docker: tag@sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
10+
HTTP Request: GET https://registry.hub.docker.com/v2/repositories/algorand/indexer/tags/latest "HTTP/1.1 200 OK"
11+
DEBUG: Running 'docker image inspect algorand/algod:latest --format {{range .RepoDigests}}{{println .}}{{end}}' in '{current_working_directory}'
12+
DEBUG: docker: tag@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
13+
HTTP Request: GET https://registry.hub.docker.com/v2/repositories/algorand/algod/tags/latest "HTTP/1.1 200 OK"
814
# container engine
915
Name: docker (change with `algokit config container-engine`)
1016
DEBUG: Running 'docker compose ps --format json' in '{app_config}/sandbox'

tests/localnet/test_localnet_status.test_localnet_status_successful.approved.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ DEBUG: docker: STDOUT
55
DEBUG: docker: STDERR
66
DEBUG: Running 'docker compose ls --format json --filter name=algokit_sandbox*' in '{current_working_directory}'
77
DEBUG: docker: [{"Name": "algokit_sandbox", "Status": "running", "ConfigFiles": "{app_config}/sandbox/docker-compose.yml"}]
8+
DEBUG: Running 'docker image inspect algorand/indexer:latest --format {{range .RepoDigests}}{{println .}}{{end}}' in '{current_working_directory}'
9+
DEBUG: docker: tag@sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
10+
HTTP Request: GET https://registry.hub.docker.com/v2/repositories/algorand/indexer/tags/latest "HTTP/1.1 200 OK"
11+
DEBUG: Running 'docker image inspect algorand/algod:latest --format {{range .RepoDigests}}{{println .}}{{end}}' in '{current_working_directory}'
12+
DEBUG: docker: tag@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
13+
HTTP Request: GET https://registry.hub.docker.com/v2/repositories/algorand/algod/tags/latest "HTTP/1.1 200 OK"
814
# container engine
915
Name: docker (change with `algokit config container-engine`)
1016
DEBUG: Running 'docker compose ps --format json' in '{app_config}/sandbox'

0 commit comments

Comments
 (0)