docker-stack 2.0.5__tar.gz → 2.0.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {docker_stack-2.0.5 → docker_stack-2.0.6}/PKG-INFO +1 -1
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack/cli.py +9 -3
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack.egg-info/PKG-INFO +1 -1
- {docker_stack-2.0.5 → docker_stack-2.0.6}/setup.py +1 -1
- {docker_stack-2.0.5 → docker_stack-2.0.6}/tests/test_docker_stack.py +27 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/README.md +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack/__init__.py +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack/command_runner.py +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack/compose.py +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack/docker_objects.py +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack/envsubst.py +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack/envsubst_merge.py +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack/helpers.py +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack/login.py +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack/manager_api.py +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack/markers.py +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack/merge_conf.py +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack/registry.py +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack/url_parser.py +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack.egg-info/SOURCES.txt +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack.egg-info/dependency_links.txt +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack.egg-info/entry_points.txt +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack.egg-info/requires.txt +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/docker_stack.egg-info/top_level.txt +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/pyproject.toml +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/setup.cfg +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/tests/test_docker_objects.py +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/tests/test_load_env.py +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/tests/test_login.py +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/tests/test_manager_api.py +0 -0
- {docker_stack-2.0.5 → docker_stack-2.0.6}/tests/test_node_ls.py +0 -0
|
@@ -433,6 +433,12 @@ class DockerStack:
|
|
|
433
433
|
@staticmethod
|
|
434
434
|
def _version_sort_key(raw: str):
|
|
435
435
|
return int(raw) if raw.isdigit() else raw
|
|
436
|
+
@staticmethod
|
|
437
|
+
def _display_stack_name(raw: str) -> str:
|
|
438
|
+
value = raw.strip()
|
|
439
|
+
if value.startswith("default--"):
|
|
440
|
+
return value[len("default--"):]
|
|
441
|
+
return value
|
|
436
442
|
|
|
437
443
|
def _print_stack_listing(self, stack_versions: Dict[str, List[str]]) -> None:
|
|
438
444
|
max_stack_name_length = max(len(stack) for stack in stack_versions) if stack_versions else 10
|
|
@@ -462,7 +468,7 @@ class DockerStack:
|
|
|
462
468
|
try:
|
|
463
469
|
payload = client.list_stacks()
|
|
464
470
|
stack_versions = {
|
|
465
|
-
str(item.get("stack")): [
|
|
471
|
+
self._display_stack_name(str(item.get("stack"))): [
|
|
466
472
|
str(version)
|
|
467
473
|
for version in (
|
|
468
474
|
item.get("versions")
|
|
@@ -488,7 +494,7 @@ class DockerStack:
|
|
|
488
494
|
parts = line.split("\t")
|
|
489
495
|
if len(parts) == 3 and "mesudip.stack.name" in parts[2]:
|
|
490
496
|
labels = {k: v for k, v in (label.split("=") for label in parts[2].split(",") if "=" in label)}
|
|
491
|
-
stack_name = labels.get("mesudip.stack.name")
|
|
497
|
+
stack_name = self._display_stack_name(labels.get("mesudip.stack.name", "")) or None
|
|
492
498
|
version = labels.get("mesudip.object.version", "unknown")
|
|
493
499
|
|
|
494
500
|
if stack_name:
|
|
@@ -559,7 +565,7 @@ class DockerStack:
|
|
|
559
565
|
parts = line.split("\t")
|
|
560
566
|
if len(parts) == 2 and "mesudip.stack.name" in parts[1]:
|
|
561
567
|
labels = {k: v for k, v in (label.split("=") for label in parts[1].split(",") if "=" in label)}
|
|
562
|
-
stack = labels.get("mesudip.stack.name")
|
|
568
|
+
stack = self._display_stack_name(labels.get("mesudip.stack.name", "")) or None
|
|
563
569
|
version = labels.get("mesudip.object.version", "unknown")
|
|
564
570
|
tag = labels.get("mesudip.stack.tag", "")
|
|
565
571
|
|
|
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
|
|
|
2
2
|
|
|
3
3
|
setup(
|
|
4
4
|
name="docker-stack",
|
|
5
|
-
version="2.0.
|
|
5
|
+
version="2.0.6",
|
|
6
6
|
description="CLI for deploying and managing Docker stacks.",
|
|
7
7
|
long_description=open("README.md").read(), # You can include a README file to describe your package
|
|
8
8
|
long_description_content_type="text/markdown",
|
|
@@ -295,6 +295,33 @@ def test_rm_enqueues_stack_remove_command():
|
|
|
295
295
|
assert docker.stack.commands[-1].command == ["docker", "stack", "rm", "govtool"]
|
|
296
296
|
|
|
297
297
|
|
|
298
|
+
def test_default_namespace_stack_names_are_normalized_in_output(monkeypatch, capsys):
|
|
299
|
+
inspect_payloads = {
|
|
300
|
+
("docker", "config", "ls", "--format", "{{.ID}} {{.Name}} {{.Labels}}"):
|
|
301
|
+
"cfg1 default--team-a mesudip.stack.name=default--team-a,mesudip.object.version=1",
|
|
302
|
+
("docker", "config", "ls", "--format", "{{.Name}} {{.Labels}}"):
|
|
303
|
+
"default--team-a mesudip.stack.name=default--team-a,mesudip.object.version=1,mesudip.stack.tag=stable",
|
|
304
|
+
("docker", "config", "inspect", "team-a"):
|
|
305
|
+
json.dumps([{"Spec": {"Data": base64.b64encode(b"services:\n api:\n image: busybox\n").decode("utf-8")}}]),
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
def fake_run_cli_command(command, **kwargs):
|
|
309
|
+
key = tuple(command)
|
|
310
|
+
if key not in inspect_payloads:
|
|
311
|
+
raise AssertionError(f"Unexpected command: {command}")
|
|
312
|
+
return inspect_payloads[key]
|
|
313
|
+
|
|
314
|
+
monkeypatch.setattr("docker_stack.cli.run_cli_command", fake_run_cli_command)
|
|
315
|
+
monkeypatch.setattr("docker_stack.cli.discover_manager_client", lambda *_args, **_kwargs: None)
|
|
316
|
+
|
|
317
|
+
docker = Docker()
|
|
318
|
+
assert docker.stack.ls() == {"team-a": ["1"]}
|
|
319
|
+
assert docker.stack.versions("team-a") == [("1", "stable")]
|
|
320
|
+
output = capsys.readouterr().out
|
|
321
|
+
assert "default--team-a" not in output
|
|
322
|
+
assert "team-a" in output
|
|
323
|
+
|
|
324
|
+
|
|
298
325
|
def test_filtered_agent_outputs_still_render(monkeypatch, capsys):
|
|
299
326
|
inspect_payloads = {
|
|
300
327
|
("docker", "config", "ls", "--format", "{{.ID}}\t{{.Name}}\t{{.Labels}}"): "\n".join(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|