bugfixes, no_defaults feature
This commit is contained in:
parent
009fb3304b
commit
4a2f50adfe
12 changed files with 56 additions and 17 deletions
|
@ -3,6 +3,7 @@
|
|||
|
||||
from __future__ import annotations
|
||||
|
||||
import contextlib
|
||||
import copy
|
||||
from dataclasses import replace
|
||||
from pathlib import Path
|
||||
|
@ -24,13 +25,22 @@ def recursive_update(
|
|||
for k, v in update.items():
|
||||
if isinstance(v, dict):
|
||||
v = cast(dict[str, Any], v)
|
||||
default[k] = recursive_update(default.get(k, {}), v)
|
||||
if v.get("_ezd_no_defaults"):
|
||||
v.pop("_ezd_no_defaults")
|
||||
default[k] = v
|
||||
else:
|
||||
default[k] = recursive_update(default.get(k, {}), v)
|
||||
|
||||
elif isinstance(v, list):
|
||||
v = cast(list[Any], v)
|
||||
new = cast(list[Any], (default.get(k, [])))
|
||||
new.extend(v)
|
||||
default[k] = new
|
||||
old = cast(list[Any], (default.get(k, [])))
|
||||
if "_ezd_no_defaults" in old:
|
||||
with contextlib.suppress(ValueError):
|
||||
old.remove("_ezd_no_defaults")
|
||||
default[k] = v
|
||||
else:
|
||||
old.extend(v)
|
||||
default[k] = old
|
||||
|
||||
else:
|
||||
default[k] = v
|
||||
|
@ -40,12 +50,10 @@ def recursive_update(
|
|||
|
||||
def get_state(module: AnsibleModule) -> State:
|
||||
"""Create a new state object, loading the compose file into "before" if it exists."""
|
||||
# def clean_params[T](obj: T) -> T:
|
||||
T = TypeVar("T")
|
||||
|
||||
# def clean_params[T](obj: T) -> T:
|
||||
def clean_params(obj: T) -> T:
|
||||
# NOTE: ansible sets None as default for arguments, which is a pain in
|
||||
# the ass for the purposes of this module
|
||||
obj = copy.deepcopy(obj)
|
||||
|
||||
if isinstance(obj, dict):
|
||||
|
|
|
@ -12,12 +12,14 @@ EXTRA_ARGS = {
|
|||
"proxy_type": {"type": "str", "default": "http"},
|
||||
"name": {"type": "str"},
|
||||
"port": {"type": "int"},
|
||||
"protocol_version": {"type": "int"},
|
||||
}
|
||||
|
||||
|
||||
def helper(state: State, service_name: str, params: dict[str, Any]) -> dict[str, Any]:
|
||||
project_name: str = state.params["name"]
|
||||
port: int | None = params.get("port")
|
||||
protocol_version: int | None = params.get("protocol_version")
|
||||
proxy_type: str = params["proxy_type"]
|
||||
name: str = params.get("name", f"{project_name}_{service_name}_{proxy_type}")
|
||||
|
||||
|
@ -28,6 +30,9 @@ def helper(state: State, service_name: str, params: dict[str, Any]) -> dict[str,
|
|||
if port:
|
||||
labels[f"{prefix}.loadbalancer.server.port"] = str(port)
|
||||
|
||||
if protocol_version:
|
||||
labels[f"{prefix}.loadbalancer.proxyProtocol.version"] = str(protocol_version)
|
||||
|
||||
return {
|
||||
"labels": labels,
|
||||
}
|
||||
|
|
|
@ -14,4 +14,7 @@ EXTRA_ARGS = {}
|
|||
def helper(_state: State, _params: dict[str, Any]) -> dict[str, Any]:
|
||||
return {
|
||||
"privileged": True,
|
||||
"networks": {
|
||||
"internal": {}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ if TYPE_CHECKING:
|
|||
from ansible_collections.snailed.ez_docker.plugins.module_utils.models import State
|
||||
|
||||
EXTRA_ARGS = {
|
||||
"read_only": {"type": "bool", "default": True},
|
||||
"read_only": {"type": "bool", "required": True},
|
||||
}
|
||||
|
||||
|
||||
|
@ -27,4 +27,7 @@ def helper(_state: State, params: dict[str, Any]) -> dict[str, Any]:
|
|||
|
||||
return {
|
||||
"volumes": volumes,
|
||||
"networks": {
|
||||
"internal": {}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ if TYPE_CHECKING:
|
|||
EXTRA_ARGS = {
|
||||
"archive": {"type": "path"},
|
||||
"backup_volumes": {"type": "list", "elements": "str", "required": True},
|
||||
"docker_socket_proxy": {"type": "str"}
|
||||
}
|
||||
|
||||
|
||||
|
@ -18,7 +19,7 @@ def helper(state: State, params: dict[str, Any]) -> dict[str, Any]:
|
|||
project_name: str = state.params["name"]
|
||||
archive: str | None = params.get("archive")
|
||||
backup_volumes: list[str] | None = params["backup_volumes"]
|
||||
service_name = params["name"]
|
||||
socket_proxy: str | None = params.get("docker_socket_proxy")
|
||||
|
||||
volumes: list[dict[str, Any]] = [
|
||||
{
|
||||
|
@ -35,9 +36,12 @@ def helper(state: State, params: dict[str, Any]) -> dict[str, Any]:
|
|||
"BACKUP_LATEST_SYMLINK": f"{project_name}-latest",
|
||||
"BACKUP_PRUNING_PREFIX": f"{project_name}-",
|
||||
"BACKUP_STOP_DURING_BACKUP_LABEL": project_name,
|
||||
"DOCKER_HOST": f"tcp://{project_name}_{service_name}_socket_proxy:2375",
|
||||
# "DOCKER_HOST": f"tcp://{project_name}_{service_name}_socket_proxy:2375",
|
||||
}
|
||||
|
||||
if socket_proxy:
|
||||
environment["DOCKER_HOST"] = f"tcp://{socket_proxy}:2375"
|
||||
|
||||
if archive:
|
||||
environment["BACKUP_ARCHIVE"] = "/archive"
|
||||
volumes.append(
|
||||
|
@ -52,4 +56,7 @@ def helper(state: State, params: dict[str, Any]) -> dict[str, Any]:
|
|||
return {
|
||||
"environment": environment,
|
||||
"volumes": volumes,
|
||||
"networks": {
|
||||
"internal": {}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -76,4 +76,7 @@ def helper(state: State, params: dict[str, Any]) -> dict[str, Any]:
|
|||
"environment": environment,
|
||||
"volumes": volumes,
|
||||
"labels": labels,
|
||||
"networks": {
|
||||
"internal": {}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -67,4 +67,7 @@ def helper(state: State, params: dict[str, Any]) -> dict[str, Any]:
|
|||
"environment": environment,
|
||||
"volumes": volumes,
|
||||
"labels": labels,
|
||||
"networks": {
|
||||
"internal": {}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,4 +12,4 @@ EXTRA_ARGS = {}
|
|||
|
||||
|
||||
def helper(_state: State, _params: dict[str, Any]) -> dict[str, Any]:
|
||||
return {}
|
||||
return {"networks": {"internal": {}}}
|
||||
|
|
|
@ -50,7 +50,8 @@ def label_argument_spec() -> dict[str, Any]:
|
|||
label_args["options"][module_name] = {
|
||||
"type": "list",
|
||||
"elements": "dict",
|
||||
"options": get_module_options(module, label.common.BASE_ARGS),
|
||||
"options": get_module_options(module, label.common.BASE_ARGS)
|
||||
| {"_ezd_no_defaults": {"type": bool}},
|
||||
}
|
||||
|
||||
return label_args
|
||||
|
@ -67,7 +68,8 @@ def service_argument_spec() -> dict[str, Any]:
|
|||
service_args["options"][module_name] = {
|
||||
"type": "list",
|
||||
"elements": "dict",
|
||||
"options": get_module_options(module, service.common.BASE_ARGS),
|
||||
"options": get_module_options(module, service.common.BASE_ARGS)
|
||||
| {"_ezd_no_defaults": {"type": bool}},
|
||||
}
|
||||
|
||||
return service_args
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
from __future__ import annotations
|
||||
|
||||
# WARN: This documentation is out of date
|
||||
# TODO: break this down per module
|
||||
# TODO: generate this by reassembling
|
||||
# TODO: add note about not setting container_name or host_name in defaults
|
||||
|
@ -508,8 +509,6 @@ def main() -> None:
|
|||
module.fail_json(f"Error while writing new compose file: {e}") # pyright: ignore[reportUnknownMemberType]
|
||||
|
||||
ret = asdict(state.result)
|
||||
if not module._diff: # noqa: SLF001
|
||||
del ret["diff"]
|
||||
|
||||
module.exit_json(**ret) # pyright: ignore[reportUnknownMemberType]
|
||||
|
||||
|
|
|
@ -19,15 +19,20 @@
|
|||
services: "{{ project_definition.value }}"
|
||||
settings: "{{ ez_docker_settings }}"
|
||||
project_dir: "{{ project_dir }}"
|
||||
# no_log: true
|
||||
no_log: true
|
||||
register: compose
|
||||
|
||||
- name: "project | Start project: {{ project_name }}"
|
||||
community.docker.docker_compose_v2:
|
||||
pull: missing
|
||||
project_src: "{{ project_dir }}"
|
||||
remove_orphans: true
|
||||
state: "present"
|
||||
|
||||
- name: "project | Reset file changes: {{ project_name }}"
|
||||
ansible.builtin.set_fact:
|
||||
services_changed: []
|
||||
|
||||
- name: "project | Import per-service tasks: {{ project_name }}"
|
||||
ansible.builtin.include_tasks: service.yml
|
||||
loop: "{{ compose.diff.after.services | dict2items }}"
|
||||
|
@ -37,7 +42,7 @@
|
|||
|
||||
- name: "project | Restart docker projects: {{ project_name }}"
|
||||
community.docker.docker_compose_v2:
|
||||
services: services_changed
|
||||
services: "{{ services_changed }}"
|
||||
project_src: "{{ project_dir }}"
|
||||
state: "restarted"
|
||||
when: services_changed
|
||||
|
|
|
@ -32,3 +32,4 @@
|
|||
- name: "service | Register file changes: {{ service.value.container_name }}"
|
||||
ansible.builtin.set_fact:
|
||||
services_changed: "{{ services_changed | default([]) + [service.key] }}"
|
||||
when: copy.changed or template.changed
|
||||
|
|
Loading…
Add table
Reference in a new issue