WIP
This commit is contained in:
parent
d1dca887ad
commit
2006d16b30
|
@ -32,6 +32,21 @@ BASE_SERVICE_ARGS = {
|
||||||
"type": "dict",
|
"type": "dict",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
BASE_LABEL_ARGS = {
|
||||||
|
"project_name": {
|
||||||
|
"type": "str",
|
||||||
|
"required": True,
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"type": "str",
|
||||||
|
"required": True,
|
||||||
|
},
|
||||||
|
"state": {
|
||||||
|
"type": "str",
|
||||||
|
"default": "present",
|
||||||
|
"choices": ["present", "absent"],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
|
@ -51,7 +66,7 @@ class State:
|
||||||
result: Result
|
result: Result
|
||||||
compose_filepath: str
|
compose_filepath: str
|
||||||
before: dict[str, Any]
|
before: dict[str, Any]
|
||||||
after: dict[str, Any] = field(default_factory=dict)
|
after: dict[str, Any]
|
||||||
|
|
||||||
|
|
||||||
def _recursive_update(default: dict[Any, Any], update: dict[Any, Any]) -> dict[Any, Any]:
|
def _recursive_update(default: dict[Any, Any], update: dict[Any, Any]) -> dict[Any, Any]:
|
||||||
|
@ -85,64 +100,119 @@ def get_state(module: AnsibleModule) -> State:
|
||||||
result=Result(),
|
result=Result(),
|
||||||
compose_filepath=compose_filepath,
|
compose_filepath=compose_filepath,
|
||||||
before=before,
|
before=before,
|
||||||
|
after=before,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def apply_service_base(state: State) -> State:
|
def apply_service_base(state: State) -> State:
|
||||||
params = state.module.params
|
service_name = state.module.params["name"]
|
||||||
|
project_name = state.module.params["project_name"]
|
||||||
|
image = state.module.params["image"]
|
||||||
|
|
||||||
compose = copy.deepcopy(state.before)
|
update: dict[str, Any] = {
|
||||||
services = compose.get("services", {})
|
"service_name": f"{project_name}_{service_name}",
|
||||||
|
"hostname": f"{project_name}_{service_name}",
|
||||||
|
"image": image,
|
||||||
|
"restart": "unless-stopped",
|
||||||
|
"environment": {},
|
||||||
|
"labels": {},
|
||||||
|
"volumes": [],
|
||||||
|
"networks": {
|
||||||
|
f"{project_name}_internal": None,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
networks = compose.get("networks", {}).update(
|
return update_service(state, update)
|
||||||
{
|
|
||||||
f"{params['project_name']}_internal": None,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
service = services.get(params["name"], {}).update(
|
|
||||||
{
|
|
||||||
"container_name": f"{params['project_name']}_{params['name']}",
|
|
||||||
"hostname": f"{params['project_name']}_{params['name']}",
|
|
||||||
"image": params["image"],
|
|
||||||
"restart": "unless-stopped",
|
|
||||||
"environment": {},
|
|
||||||
"labels": {},
|
|
||||||
"volumes": [],
|
|
||||||
"networks": {
|
|
||||||
f"{params['project_name']}_internal": None,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
services.update(
|
|
||||||
{
|
|
||||||
"networks": networks,
|
|
||||||
params["name"]: service,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
return replace(state, after=compose)
|
|
||||||
|
|
||||||
|
|
||||||
def set_defaults(state: State) -> State:
|
def set_service_defaults(state: State) -> State:
|
||||||
params = state.module.params
|
container_name = state.module.params["name"]
|
||||||
compose = copy.deepcopy(state.before)
|
defaults = state.module.params["defaults"]
|
||||||
services = compose["services"]
|
project = copy.deepcopy(state.after)
|
||||||
service = services[params["name"]]
|
services = project["services"]
|
||||||
|
service = services[container_name]
|
||||||
|
|
||||||
_recursive_update(service, params["defaults"])
|
_ = _recursive_update(service, defaults)
|
||||||
|
|
||||||
services.update({params["name"]: service})
|
services.update({container_name: service})
|
||||||
|
|
||||||
return replace(state, after=compose)
|
return replace(state, after=project)
|
||||||
|
|
||||||
|
|
||||||
def update_service(state: State, update: dict[str, Any]) -> State:
|
def update_service(state: State, update: dict[str, Any]) -> State:
|
||||||
compose = copy.deepcopy(state.before)
|
project = copy.deepcopy(state.after)
|
||||||
name = state.module.params["name"]
|
service_name = state.module.params["name"]
|
||||||
_recursive_update(compose["services"][name], update)
|
|
||||||
return replace(state, after=compose)
|
_ = _recursive_update(project["services"][service_name], update)
|
||||||
|
|
||||||
|
return replace(state, after=project)
|
||||||
|
|
||||||
|
|
||||||
|
def remove_service(state: State) -> State:
|
||||||
|
project = copy.deepcopy(state.after)
|
||||||
|
service_name = state.module.params["name"]
|
||||||
|
|
||||||
|
del project["services"][service_name]
|
||||||
|
|
||||||
|
return replace(state, after=project)
|
||||||
|
|
||||||
|
|
||||||
|
def remove_labels(state: State, label_names: list[str]) -> State:
|
||||||
|
project = copy.deepcopy(state.after)
|
||||||
|
service_name = state.module.params["name"]
|
||||||
|
service = project["services"].get(service_name, {})
|
||||||
|
|
||||||
|
labels = service.get("labels", {})
|
||||||
|
|
||||||
|
if labels:
|
||||||
|
for label in labels:
|
||||||
|
if label in label_names:
|
||||||
|
try:
|
||||||
|
del service["labels"][label]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
service["labels"] = labels
|
||||||
|
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
del service["labels"]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
project["services"][service_name] = service
|
||||||
|
|
||||||
|
return replace(state, after=project)
|
||||||
|
|
||||||
|
|
||||||
|
def update_project(state: State) -> State:
|
||||||
|
project = copy.deepcopy(state.after)
|
||||||
|
|
||||||
|
project_services = project.get("services", {})
|
||||||
|
project_networks = project.get("networks", {})
|
||||||
|
project_volumes = project.get("volumes", {})
|
||||||
|
|
||||||
|
for service in project_services:
|
||||||
|
if service_volumes := service.get("volumes"):
|
||||||
|
service_volume_names = [x["source"] for x in service_volumes]
|
||||||
|
project_volumes.update(
|
||||||
|
{
|
||||||
|
service_volume_name: None
|
||||||
|
for service_volume_name in service_volume_names
|
||||||
|
if service_volume_name not in project_volumes
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if service_network_names := service.get("networks").keys():
|
||||||
|
project_networks.update(
|
||||||
|
{
|
||||||
|
service_network_name: None
|
||||||
|
for service_network_name in service_network_names
|
||||||
|
if service_network_name not in project_networks
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
return replace(state, after=project)
|
||||||
|
|
||||||
|
|
||||||
def write_compose(state: State) -> State:
|
def write_compose(state: State) -> State:
|
||||||
|
@ -156,21 +226,50 @@ def write_compose(state: State) -> State:
|
||||||
|
|
||||||
def run_service(
|
def run_service(
|
||||||
extra_args: dict[str, Any] = {},
|
extra_args: dict[str, Any] = {},
|
||||||
helper: Callable[[State], State] = lambda x: x,
|
helper: Callable[[State], State] = lambda _: _,
|
||||||
) -> None:
|
) -> None:
|
||||||
module = AnsibleModule(
|
module = AnsibleModule(
|
||||||
argument_spec=BASE_SERVICE_ARGS.update(extra_args),
|
argument_spec={**BASE_SERVICE_ARGS, **extra_args},
|
||||||
supports_check_mode=True,
|
supports_check_mode=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
state = get_state(module)
|
state = get_state(module)
|
||||||
|
|
||||||
for f in [apply_service_base, set_defaults, helper]:
|
if module.params["state"] == "absent":
|
||||||
state = f(state)
|
state = remove_service(state)
|
||||||
|
|
||||||
if module.check_mode:
|
else:
|
||||||
module.exit_json(**asdict(state.result)) # type: ignore[reportUnkownMemberType]
|
for f in [apply_service_base, set_service_defaults, helper, update_project]:
|
||||||
|
state = f(state)
|
||||||
|
|
||||||
write_compose(state)
|
exit(state)
|
||||||
|
|
||||||
module.exit_json(**asdict(state.result)) # type: ignore[reportUnkownMemberType]
|
|
||||||
|
def run_label(
|
||||||
|
extra_args: dict[str, Any], helper: Callable[[State], State], label_names: list[str]
|
||||||
|
) -> None:
|
||||||
|
module = AnsibleModule(
|
||||||
|
argument_spec={**BASE_LABEL_ARGS, **extra_args},
|
||||||
|
supports_check_mode=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
state = get_state(module)
|
||||||
|
|
||||||
|
if module.params["state"] == "absent":
|
||||||
|
state = remove_labels(state, label_names)
|
||||||
|
|
||||||
|
else:
|
||||||
|
state = helper(state)
|
||||||
|
|
||||||
|
exit(state)
|
||||||
|
|
||||||
|
|
||||||
|
def exit(state: State) -> None:
|
||||||
|
# TODO: Check diff and set changed variable
|
||||||
|
|
||||||
|
if state.module.check_mode:
|
||||||
|
state.module.exit_json(**asdict(state.result)) # type: ignore[reportUnkownMemberType]
|
||||||
|
|
||||||
|
_ = write_compose(state)
|
||||||
|
|
||||||
|
state.module.exit_json(**asdict(state.result)) # type: ignore[reportUnkownMemberType]
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Copyright: (c) 2024, Luca Bilke <luca@bil.ke>
|
||||||
|
# MIT License (see LICENSE)
|
||||||
|
|
||||||
|
# TODO: write ansible sections
|
||||||
|
|
||||||
|
DOCUMENTATION = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
EXAMPLES = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
RETURN = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations # pyright: ignore[reportGeneralTypeIssues]
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from ansible_collections.snailed.ez_compose.plugins.module_utils.common import (
|
||||||
|
State,
|
||||||
|
run_label,
|
||||||
|
update_service,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def helper(state: State) -> State:
|
||||||
|
stop = state.module.params.get("stop", True)
|
||||||
|
project_name = state.module.params["project_name"]
|
||||||
|
|
||||||
|
update: dict[str, Any] = {}
|
||||||
|
|
||||||
|
if stop:
|
||||||
|
update["labels"] = {
|
||||||
|
"docker-volume-backup.stop-during-backup": project_name,
|
||||||
|
}
|
||||||
|
|
||||||
|
return update_service(state, update)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
extra_args = {
|
||||||
|
"stop": {"type": "bool"},
|
||||||
|
}
|
||||||
|
run_label(extra_args, helper)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,60 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Copyright: (c) 2024, Luca Bilke <luca@bil.ke>
|
||||||
|
# MIT License (see LICENSE)
|
||||||
|
|
||||||
|
# TODO: write ansible sections
|
||||||
|
|
||||||
|
DOCUMENTATION = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
EXAMPLES = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
RETURN = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations # pyright: ignore[reportGeneralTypeIssues]
|
||||||
|
|
||||||
|
from ansible_collections.snailed.ez_compose.plugins.module_utils.common import (
|
||||||
|
State,
|
||||||
|
run_label,
|
||||||
|
update_service,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def helper(state: State) -> State:
|
||||||
|
service_name = state.module.params["name"]
|
||||||
|
project_name = state.module.params["project_name"]
|
||||||
|
middleware = state.module.params["middleware"]
|
||||||
|
settings = state.module.params["settings"]
|
||||||
|
proxy_type = state.module.params.get("proxy_type", "http")
|
||||||
|
middleware_name = state.module.params.get(
|
||||||
|
"middleware_name",
|
||||||
|
f"{project_name}_{service_name}_{proxy_type}_{middleware.lower()}",
|
||||||
|
)
|
||||||
|
|
||||||
|
prefix = f"traefik.{proxy_type}.middlewares.{middleware_name}"
|
||||||
|
|
||||||
|
labels = {f"{prefix}.{middleware}.{key}": var for key, var in settings.items()}
|
||||||
|
|
||||||
|
update = {
|
||||||
|
"labels": labels,
|
||||||
|
}
|
||||||
|
|
||||||
|
return update_service(state, update)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
extra_args = {
|
||||||
|
"proxy_type": {"type": "str"},
|
||||||
|
"middleware_name": {"type": "string"},
|
||||||
|
"middleware": {"type": "str", "required": True},
|
||||||
|
"settings": {"type": "list", "required": True},
|
||||||
|
}
|
||||||
|
run_label(extra_args, helper)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,83 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Copyright: (c) 2024, Luca Bilke <luca@bil.ke>
|
||||||
|
# MIT License (see LICENSE)
|
||||||
|
|
||||||
|
# TODO: write ansible sections
|
||||||
|
|
||||||
|
DOCUMENTATION = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
EXAMPLES = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
RETURN = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations # pyright: ignore[reportGeneralTypeIssues]
|
||||||
|
|
||||||
|
from ansible_collections.snailed.ez_compose.plugins.module_utils.common import (
|
||||||
|
State,
|
||||||
|
run_label,
|
||||||
|
update_service,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def helper(state: State) -> State:
|
||||||
|
service_name = state.module.params["name"]
|
||||||
|
project_name = state.module.params["project_name"]
|
||||||
|
rule = state.module.params["rule"]
|
||||||
|
service = state.module.params.get("service")
|
||||||
|
entrypoints = state.module.params.get("entrypoints")
|
||||||
|
middlewares = state.module.params.get("middlewares")
|
||||||
|
certresolver = state.module.params.get("certresolver")
|
||||||
|
proxy_type = state.module.params.get("proxy_type", "http")
|
||||||
|
router_name = state.module.params.get(
|
||||||
|
"router_name",
|
||||||
|
f"{project_name}_{service_name}_{proxy_type}",
|
||||||
|
)
|
||||||
|
|
||||||
|
prefix = f"traefik.{proxy_type}.routers.{router_name}"
|
||||||
|
|
||||||
|
labels = {
|
||||||
|
"traefik.enable": True,
|
||||||
|
f"traefik.{prefix}.rule": rule,
|
||||||
|
}
|
||||||
|
|
||||||
|
if certresolver:
|
||||||
|
labels[f"traefik.{prefix}.tls.certresolver"] = certresolver
|
||||||
|
|
||||||
|
if entrypoints:
|
||||||
|
labels[f"{prefix}.entrypoints"] = ",".join(entrypoints)
|
||||||
|
|
||||||
|
if service:
|
||||||
|
labels[f"{prefix}.service"] = service
|
||||||
|
|
||||||
|
if middlewares:
|
||||||
|
labels[f"{prefix}.middlewares"] = ",".join(middlewares)
|
||||||
|
|
||||||
|
update = {
|
||||||
|
"labels": labels,
|
||||||
|
}
|
||||||
|
|
||||||
|
return update_service(state, update)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
extra_args = {
|
||||||
|
"proxy_type": {"type": "str"},
|
||||||
|
"router_name": {
|
||||||
|
"type": "str",
|
||||||
|
},
|
||||||
|
"rule": {"type": "str", "required": True},
|
||||||
|
"service": {"type": "str"},
|
||||||
|
"certresolver": {"type": "str"},
|
||||||
|
"entrypoints": {"type": "list"},
|
||||||
|
"middlewares": {"type": "list"},
|
||||||
|
}
|
||||||
|
run_label(extra_args, helper)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,64 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Copyright: (c) 2024, Luca Bilke <luca@bil.ke>
|
||||||
|
# MIT License (see LICENSE)
|
||||||
|
|
||||||
|
# TODO: write ansible sections
|
||||||
|
|
||||||
|
DOCUMENTATION = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
EXAMPLES = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
RETURN = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations # pyright: ignore[reportGeneralTypeIssues]
|
||||||
|
|
||||||
|
from ansible_collections.snailed.ez_compose.plugins.module_utils.common import (
|
||||||
|
State,
|
||||||
|
run_label,
|
||||||
|
update_service,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
def helper(state: State) -> State:
|
||||||
|
service_name = state.module.params["name"]
|
||||||
|
project_name = state.module.params["project_name"]
|
||||||
|
port = state.module.params.get("port")
|
||||||
|
proxy_type = state.module.params.get("proxy_type", "http")
|
||||||
|
service_name = state.module.params.get(
|
||||||
|
"service_name",
|
||||||
|
f"{project_name}_{service_name}_{proxy_type}",
|
||||||
|
)
|
||||||
|
|
||||||
|
prefix = f"traefik.{proxy_type}.services.{service_name}"
|
||||||
|
|
||||||
|
labels: dict[str, Any] = {}
|
||||||
|
|
||||||
|
if port:
|
||||||
|
labels[f"{prefix}.loadbalancer.server.port"] = str(port)
|
||||||
|
|
||||||
|
update = {
|
||||||
|
"labels": labels,
|
||||||
|
}
|
||||||
|
|
||||||
|
return update_service(state, update)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
extra_args = {
|
||||||
|
"proxy_type": {"type": "str"},
|
||||||
|
"service_name": {"type": "string"},
|
||||||
|
"port": {"type": "int"},
|
||||||
|
}
|
||||||
|
run_label(extra_args, helper)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,90 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Copyright: (c) 2024, Luca Bilke <luca@bil.ke>
|
||||||
|
# MIT License (see LICENSE)
|
||||||
|
|
||||||
|
# TODO: write ansible sections
|
||||||
|
|
||||||
|
DOCUMENTATION = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
EXAMPLES = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
RETURN = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations # pyright: ignore[reportGeneralTypeIssues]
|
||||||
|
|
||||||
|
import copy
|
||||||
|
|
||||||
|
from ansible.module_utils.basic import AnsibleModule
|
||||||
|
from ansible_collections.snailed.ez_compose.plugins.module_utils.common import (
|
||||||
|
State,
|
||||||
|
exit,
|
||||||
|
get_state,
|
||||||
|
remove_service,
|
||||||
|
update_project,
|
||||||
|
update_service,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def helper(state: State) -> State:
|
||||||
|
project_name = state.module.params["project_name"]
|
||||||
|
definition = state.module.params["definition"]
|
||||||
|
internal_network = state.module.params.get("internal_network", False)
|
||||||
|
|
||||||
|
update = copy.deepcopy(definition)
|
||||||
|
|
||||||
|
networks = update.get("networks", {})
|
||||||
|
|
||||||
|
if internal_network:
|
||||||
|
networks[f"{project_name}_internal"] = None
|
||||||
|
|
||||||
|
update["networks"] = networks
|
||||||
|
|
||||||
|
return update_service(state, update)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
module = AnsibleModule(
|
||||||
|
argument_spec={
|
||||||
|
"project_name": {
|
||||||
|
"type": "str",
|
||||||
|
"required": True,
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"type": "str",
|
||||||
|
"required": True,
|
||||||
|
},
|
||||||
|
"internal_network": {
|
||||||
|
"type": "bool",
|
||||||
|
},
|
||||||
|
"state": {
|
||||||
|
"type": "str",
|
||||||
|
"default": "present",
|
||||||
|
"choices": ["present", "absent"],
|
||||||
|
},
|
||||||
|
"definition": {
|
||||||
|
"type": "dict",
|
||||||
|
"required": True,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
supports_check_mode=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
state = get_state(module)
|
||||||
|
|
||||||
|
if module.params["state"] == "absent":
|
||||||
|
state = remove_service(state)
|
||||||
|
|
||||||
|
else:
|
||||||
|
for f in [helper, update_project]:
|
||||||
|
state = f(state)
|
||||||
|
|
||||||
|
exit(state)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,48 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Copyright: (c) 2024, Luca Bilke <luca@bil.ke>
|
||||||
|
# MIT License (see LICENSE)
|
||||||
|
|
||||||
|
# TODO: write ansible sections
|
||||||
|
|
||||||
|
DOCUMENTATION = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
EXAMPLES = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
RETURN = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations # pyright: ignore[reportGeneralTypeIssues]
|
||||||
|
|
||||||
|
from ansible_collections.snailed.ez_compose.plugins.module_utils.common import (
|
||||||
|
State,
|
||||||
|
run_service,
|
||||||
|
update_service,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def helper(state: State) -> State:
|
||||||
|
command = state.module.params.get("command")
|
||||||
|
|
||||||
|
update = {
|
||||||
|
"privileged": True,
|
||||||
|
}
|
||||||
|
|
||||||
|
if command:
|
||||||
|
update["command"] = command
|
||||||
|
|
||||||
|
return update_service(state, update)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
extra_args = {
|
||||||
|
"command": {"type": "list"},
|
||||||
|
}
|
||||||
|
run_service(extra_args, helper)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,54 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Copyright: (c) 2024, Luca Bilke <luca@bil.ke>
|
||||||
|
# MIT License (see LICENSE)
|
||||||
|
|
||||||
|
# TODO: write ansible sections
|
||||||
|
|
||||||
|
DOCUMENTATION = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
EXAMPLES = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
RETURN = r"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations # pyright: ignore[reportGeneralTypeIssues]
|
||||||
|
|
||||||
|
from ansible_collections.snailed.ez_compose.plugins.module_utils.common import (
|
||||||
|
State,
|
||||||
|
run_service,
|
||||||
|
update_service,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def helper(state: State) -> State:
|
||||||
|
read_only = state.module.params.get("read_only", True)
|
||||||
|
|
||||||
|
volumes = [
|
||||||
|
{
|
||||||
|
"type": "bind",
|
||||||
|
"source": "/var/run/docker.sock",
|
||||||
|
"target": "/var/run/docker.sock",
|
||||||
|
"read_only": read_only,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
update = {
|
||||||
|
"volumes": volumes,
|
||||||
|
}
|
||||||
|
|
||||||
|
return update_service(state, update)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
extra_args = {
|
||||||
|
"read_only": {"type": "bool"},
|
||||||
|
}
|
||||||
|
run_service(extra_args, helper)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -27,7 +27,7 @@ from ansible_collections.snailed.ez_compose.plugins.module_utils.common import (
|
||||||
def helper(state: State) -> State:
|
def helper(state: State) -> State:
|
||||||
archive = state.module.params.get("archive")
|
archive = state.module.params.get("archive")
|
||||||
backup_volumes = state.module.params.get("backup_volumes", [])
|
backup_volumes = state.module.params.get("backup_volumes", [])
|
||||||
name = state.module.params["name"]
|
service_name = state.module.params["name"]
|
||||||
project_name = state.module.params["project_name"]
|
project_name = state.module.params["project_name"]
|
||||||
|
|
||||||
volumes = [
|
volumes = [
|
||||||
|
@ -46,7 +46,7 @@ def helper(state: State) -> State:
|
||||||
"BACKUP_PRUNING_PREFIX": f"{project_name}-",
|
"BACKUP_PRUNING_PREFIX": f"{project_name}-",
|
||||||
"BACKUP_STOP_DURING_BACKUP_LABEL": project_name,
|
"BACKUP_STOP_DURING_BACKUP_LABEL": project_name,
|
||||||
"BACKUP_ARCHIVE": "/archive",
|
"BACKUP_ARCHIVE": "/archive",
|
||||||
"DOCKER_HOST": f"tcp://{project_name}_{name}_socket_proxy:2375",
|
"DOCKER_HOST": f"tcp://{project_name}_{service_name}_socket_proxy:2375",
|
||||||
}
|
}
|
||||||
|
|
||||||
if archive:
|
if archive:
|
|
@ -32,12 +32,12 @@ def helper(state: State) -> State:
|
||||||
username = state.module.params["username"]
|
username = state.module.params["username"]
|
||||||
password = state.module.params["password"]
|
password = state.module.params["password"]
|
||||||
root_password = state.module.params["root_password"]
|
root_password = state.module.params["root_password"]
|
||||||
name = state.module.params["name"]
|
service_name = state.module.params["name"]
|
||||||
project_name = state.module.params["project_name"]
|
project_name = state.module.params["project_name"]
|
||||||
|
|
||||||
volumes = [
|
volumes = [
|
||||||
{
|
{
|
||||||
"source": name,
|
"source": service_name,
|
||||||
"target": "/var/lib/mysql",
|
"target": "/var/lib/mysql",
|
||||||
"type": "volume",
|
"type": "volume",
|
||||||
}
|
}
|
||||||
|
@ -75,7 +75,7 @@ def helper(state: State) -> State:
|
||||||
volumes.append(
|
volumes.append(
|
||||||
{
|
{
|
||||||
"type": "volume",
|
"type": "volume",
|
||||||
"source": f"{name}_backup",
|
"source": f"{service_name}_backup",
|
||||||
"target": "/backup",
|
"target": "/backup",
|
||||||
}
|
}
|
||||||
)
|
)
|
|
@ -31,12 +31,12 @@ def helper(state: State) -> State:
|
||||||
database = state.module.params["database"]
|
database = state.module.params["database"]
|
||||||
username = state.module.params["username"]
|
username = state.module.params["username"]
|
||||||
password = state.module.params["password"]
|
password = state.module.params["password"]
|
||||||
name = state.module.params["name"]
|
service_name = state.module.params["name"]
|
||||||
project_name = state.module.params["project_name"]
|
project_name = state.module.params["project_name"]
|
||||||
|
|
||||||
volumes = [
|
volumes = [
|
||||||
{
|
{
|
||||||
"source": name,
|
"source": service_name,
|
||||||
"target": "/var/lib/postgresql/data",
|
"target": "/var/lib/postgresql/data",
|
||||||
"type": "volume",
|
"type": "volume",
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,7 @@ def helper(state: State) -> State:
|
||||||
volumes.append(
|
volumes.append(
|
||||||
{
|
{
|
||||||
"type": "volume",
|
"type": "volume",
|
||||||
"source": f"{name}_backup",
|
"source": f"{service_name}_backup",
|
||||||
"target": "/backup",
|
"target": "/backup",
|
||||||
}
|
}
|
||||||
)
|
)
|
|
@ -4,11 +4,13 @@ line-length = 100
|
||||||
[tool.basedpyright]
|
[tool.basedpyright]
|
||||||
typeCheckingMode = "strict"
|
typeCheckingMode = "strict"
|
||||||
reportIgnoreCommentWithoutRule = true
|
reportIgnoreCommentWithoutRule = true
|
||||||
|
reportUnusedCallResult = true
|
||||||
reportMissingTypeStubs = false
|
reportMissingTypeStubs = false
|
||||||
|
|
||||||
# handled by ruff
|
# handled by ruff
|
||||||
reportUnusedVariable = false
|
reportUnusedVariable = false
|
||||||
reportUnusedImport = false
|
reportUnusedImport = false
|
||||||
|
reportUndefinedVariable = false
|
||||||
|
|
||||||
|
|
||||||
[tool.ruff.lint]
|
[tool.ruff.lint]
|
||||||
|
|
Loading…
Reference in New Issue