Commit f5192526 authored by Dom Sekotill's avatar Dom Sekotill
Browse files

Inspect Docker networks by SHA identitiy

parent a88f7010
Loading
Loading
Loading
Loading
+22 −6
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ from typing import TypeVar
from typing import Union
from typing import overload

from .json import JSONArray
from .json import JSONObject
from .proc import Argument
from .proc import Arguments
@@ -375,6 +376,7 @@ class Network(Item):

	def __init__(self, name: str|None = None) -> None:
		self._name = name or f"br{token_hex(6)}"
		self._nid: str|None = None

	def __str__(self) -> str:
		return self._name
@@ -409,7 +411,10 @@ class Network(Item):
		"""
		Return an identifier for the Docker Network
		"""
		return self._name
		if self._nid is None:
			self.create()
		assert self._nid is not None
		return self._nid

	def create(self) -> None:
		"""
@@ -417,16 +422,27 @@ class Network(Item):
		"""
		subnet = self.get_free_subnet()
		gateway = next(subnet.hosts())
		docker_quiet(
		try:
			self._nid = docker_output(
				"network", "create", self._name,
				f"--subnet={subnet}", f"--gateway={gateway}",
			)
		except CalledProcessError:
			data = exec_io(
				[DOCKER, "network", "inspect", self._name],
				deserialiser=JSONArray.from_string,
			)
			if len(data) == 0:
				raise
			self._nid = data.path("$[0].Id", str)
		assert self._nid is not None

	def destroy(self) -> None:
		"""
		Remove the network
		"""
		docker_quiet("network", "rm", self._name)
		if self._nid:
			docker_quiet("network", "rm", self._nid)

	@classmethod
	def get_free_subnet(cls) -> ipaddress.IPv4Network: