diff --git a/scone/default/recipes/docker.py b/scone/default/recipes/docker.py index 60aab27..6caa9a5 100644 --- a/scone/default/recipes/docker.py +++ b/scone/default/recipes/docker.py @@ -1,7 +1,10 @@ -from scone.default.utensils.docker_utensils import DockerContainerRun +from scone.default.utensils.docker_utensils import ( + DockerContainerRun, + DockerNetworkCreate, +) from scone.head.kitchen import Kitchen from scone.head.recipe import Recipe, RecipeContext -from scone.head.utils import check_type +from scone.head.utils import check_type, check_type_opt class DockerContainer(Recipe): @@ -18,3 +21,33 @@ class DockerContainer(Recipe): await kitchen.ut1areq( DockerContainerRun(self.image, self.command), DockerContainerRun.Result ) + + +class DockerNetwork(Recipe): + _NAME = "docker-network" + + def __init__(self, recipe_context: RecipeContext, args: dict, head): + super().__init__(recipe_context, args, head) + + self.name = check_type(args.get("name"), str) + self.driver = check_type_opt(args.get("driver"), str) + self.check_duplicate = check_type_opt(args.get("check_duplicate"), bool) + self.internal = check_type_opt(args.get("internal"), bool) + self.enable_ipv6 = check_type_opt(args.get("enable_ipv6"), bool) + self.attachable = check_type_opt(args.get("attachable"), bool) + self.scope = check_type_opt(args.get("scope"), str) + self.ingress = check_type_opt(args.get("ingress"), bool) + + async def cook(self, kitchen: Kitchen) -> None: + kitchen.get_dependency_tracker() + await kitchen.ut1areq( + DockerNetworkCreate( + self.name, + self.check_duplicate, + self.internal, + self.enable_ipv6, + self.attachable, + self.ingress, + ), + DockerNetworkCreate.Result, + ) diff --git a/scone/default/utensils/docker_utensils.py b/scone/default/utensils/docker_utensils.py index 0fa6aff..4dba569 100644 --- a/scone/default/utensils/docker_utensils.py +++ b/scone/default/utensils/docker_utensils.py @@ -1,3 +1,5 @@ +from typing import Optional + import attr import docker.errors @@ -40,3 +42,35 @@ class DockerContainerRun(Utensil): return await channel.send(DockerContainerRun.Result(name=container.name)) + + +@attr.s(auto_attribs=True) +class DockerNetworkCreate(Utensil): + name: str + check_duplicate: Optional[bool] + internal: Optional[bool] + enable_ipv6: Optional[bool] + attachable: Optional[bool] + ingress: Optional[bool] + + @attr.s(auto_attribs=True) + class Result: + name: str + + async def execute(self, channel: Channel, worktop: Worktop): + try: + network = _docker_client().networks.create( + self.name, + check_duplicate=self.check_duplicate, + internal=self.internal, + enable_ipv6=self.enable_ipv6, + attachable=self.attachable, + ingress=self.ingress, + ) + + except docker.errors.APIError: + # the docker server returned an error + await channel.send(None) + return + + await channel.send(DockerContainerRun.Result(name=network.name))