refactor: use f-strings in docker compute modules

This commit is contained in:
Mark Paronyan 2026-09-30 20:58:07 +03:00
parent 72fae7a1ce
commit 7f2c0c7e9c
No known key found for this signature in database
GPG Key ID: 8DC7338A87FE22F8
3 changed files with 39 additions and 117 deletions

View File

@ -178,9 +178,9 @@ class Docker(BaseManager):
else: else:
# use the Min API version supported by the daemon # use the Min API version supported by the daemon
self._api_version = docker_info["MinAPIVersion"] self._api_version = docker_info["MinAPIVersion"]
log.warning("Using Docker client with the minimum API version {}".format(self._api_version)) log.warning(f"Using Docker client with the minimum API version {self._api_version}")
log.info("Connected to Docker daemon version {} using API version {}".format(version, self._api_version)) log.info(f"Connected to Docker daemon version {version} using API version {self._api_version}")
self._check_host_readiness() self._check_host_readiness()
def _check_host_readiness(self): def _check_host_readiness(self):

View File

@ -177,11 +177,7 @@ class DockerVM(BaseNode):
self.mac_address = mac_address self.mac_address = mac_address
log.debug( log.debug(f"{self.manager.module_name}: {self.name} [{self._image}] initialized.")
"{module}: {name} [{image}] initialized.".format(
module=self.manager.module_name, name=self.name, image=self._image
)
)
def asdict(self): def asdict(self):
return { return {
@ -251,7 +247,7 @@ class DockerVM(BaseNode):
Container name in Docker Container name in Docker
""" """
return "GNS3.{}.{}".format(self.name, self._project.id) return f"GNS3.{self.name}.{self._project.id}"
@property @property
def mac_address(self): def mac_address(self):
@ -273,15 +269,11 @@ class DockerVM(BaseNode):
if not mac_address: if not mac_address:
# use the node UUID to generate a random MAC address # use the node UUID to generate a random MAC address
self._mac_address = "02:42:{}:{}:{}:00".format(self.id[2:4], self.id[4:6], self.id[6:8]) self._mac_address = f"02:42:{self.id[2:4]}:{self.id[4:6]}:{self.id[6:8]}:00"
else: else:
self._mac_address = mac_address self._mac_address = mac_address
log.debug( log.debug(f'Docker container "{self._name}" [{self._id}]: MAC address changed to {self._mac_address}')
'Docker container "{name}" [{id}]: MAC address changed to {mac_addr}'.format(
name=self._name, id=self._id, mac_addr=self._mac_address
)
)
@property @property
def start_command(self): def start_command(self):
@ -468,7 +460,7 @@ class DockerVM(BaseNode):
for volume in self._volumes: for volume in self._volumes:
source = os.path.join(self.working_dir, os.path.relpath(volume, "/")) source = os.path.join(self.working_dir, os.path.relpath(volume, "/"))
os.makedirs(source, exist_ok=True) os.makedirs(source, exist_ok=True)
binds.append({"Type": "bind", "Source": source, "Target": "/gns3volumes{}".format(volume)}) binds.append({"Type": "bind", "Source": source, "Target": f"/gns3volumes{volume}"})
# Inject extra config files: write each to the node working directory and # Inject extra config files: write each to the node working directory and
# bind-mount it read-only at its target path. Single-file binds are applied # bind-mount it read-only at its target path. Single-file binds are applied
@ -536,7 +528,7 @@ class DockerVM(BaseNode):
""") """)
for adapter in range(0, self.adapters): for adapter in range(0, self.adapters):
f.write( f.write(
""" f"""
# Static config for eth{adapter} # Static config for eth{adapter}
#auto eth{adapter} #auto eth{adapter}
#iface eth{adapter} inet static #iface eth{adapter} inet static
@ -548,8 +540,8 @@ class DockerVM(BaseNode):
# DHCP config for eth{adapter} # DHCP config for eth{adapter}
#auto eth{adapter} #auto eth{adapter}
#iface eth{adapter} inet dhcp #iface eth{adapter} inet dhcp
#\thostname {hostname} #\thostname {self._name}
""".format(adapter=adapter, hostname=self._name) """
) )
return path return path
@ -734,7 +726,7 @@ class DockerVM(BaseNode):
var_value = var.get("value", "") var_value = var.get("value", "")
formatted = self._format_env(variables, var_value) formatted = self._format_env(variables, var_value)
params["Env"].append("{}={}".format(var_name, formatted)) params["Env"].append(f"{var_name}={formatted}")
if self._environment: if self._environment:
for env in self._environment.strip().split("\n"): for env in self._environment.strip().split("\n"):
@ -898,9 +890,7 @@ class DockerVM(BaseNode):
state = await self._get_container_state() state = await self._get_container_state()
except DockerHttp404Error: except DockerHttp404Error:
raise DockerError( raise DockerError(
"Docker container '{name}' with ID {cid} does not exist or is not ready yet. Please try again in a few seconds.".format( f"Docker container '{self.name}' with ID {self._cid} does not exist or is not ready yet. Please try again in a few seconds."
name=self.name, cid=self._cid
)
) )
if state == "paused": if state == "paused":
await self.unpause() await self.unpause()
@ -961,9 +951,7 @@ class DockerVM(BaseNode):
self.status = "started" self.status = "started"
await self._start_interface_monitor() await self._start_interface_monitor()
log.debug( log.debug(
"Docker container '{name}' [{image}] started listen for {console_type} on {console}".format( f"Docker container '{self._name}' [{self._image}] started listen for {self.console_type} on {self.console}"
name=self._name, image=self._image, console=self.console, console_type=self.console_type
)
) )
async def _start_console_server(self): async def _start_console_server(self):
@ -1022,11 +1010,7 @@ class DockerVM(BaseNode):
await self.manager.query("POST", f"containers/{self._cid}/start") await self.manager.query("POST", f"containers/{self._cid}/start")
for volume in self._volumes: for volume in self._volumes:
log.debug( log.debug(f"Docker container '{self._name}' [{self._image}] fix ownership on {volume}")
"Docker container '{name}' [{image}] fix ownership on {path}".format(
name=self._name, image=self._image, path=volume
)
)
try: try:
process = await asyncio.subprocess.create_subprocess_exec( process = await asyncio.subprocess.create_subprocess_exec(
@ -1037,13 +1021,11 @@ class DockerVM(BaseNode):
"sh", "sh",
"-c", "-c",
"(" "("
'/gns3/bin/busybox find "{path}" -depth -print0' f'/gns3/bin/busybox find "{volume}" -depth -print0'
" | /gns3/bin/busybox xargs -0 /gns3/bin/busybox stat -c '%a:%u:%g:%n' > \"{path}/.gns3_perms\"" f" | /gns3/bin/busybox xargs -0 /gns3/bin/busybox stat -c '%a:%u:%g:%n' > \"{volume}/.gns3_perms\""
")" ")"
' && /gns3/bin/busybox chmod -R u+rX "{path}"' f' && /gns3/bin/busybox chmod -R u+rX "{volume}"'
' && /gns3/bin/busybox chown {uid}:{gid} -R "{path}"'.format( f' && /gns3/bin/busybox chown {os.getuid()}:{os.getgid()} -R "{volume}"',
uid=os.getuid(), gid=os.getgid(), path=volume
),
stderr=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE,
) )
except OSError as e: except OSError as e:
@ -1203,7 +1185,7 @@ class DockerVM(BaseNode):
"None", "None",
"-desktop", "-desktop",
self.name, self.name,
":{}".format(self._display), f":{self._display}",
stdout=fd, stdout=fd,
stderr=subprocess.STDOUT, stderr=subprocess.STDOUT,
) )
@ -1403,7 +1385,7 @@ class DockerVM(BaseNode):
await self._stop_interface_monitor() await self._stop_interface_monitor()
await self.manager.query("POST", f"containers/{self._cid}/restart") await self.manager.query("POST", f"containers/{self._cid}/restart")
await self._start_interface_monitor() await self._start_interface_monitor()
log.debug("Docker container '{name}' [{image}] restarted".format(name=self._name, image=self._image)) log.debug(f"Docker container '{self._name}' [{self._image}] restarted")
def _cleanup_console_resources(self): def _cleanup_console_resources(self):
""" """
@ -1557,7 +1539,7 @@ class DockerVM(BaseNode):
# Container deletion failed - log warning but don't block project close # Container deletion failed - log warning but don't block project close
# The stale container will be cleaned up when the project is opened again # The stale container will be cleaned up when the project is opened again
log.warning(f"Failed to delete Docker container '{self.docker_name}': {e}") log.warning(f"Failed to delete Docker container '{self.docker_name}': {e}")
log.debug("Docker container '{name}' [{image}] removed".format(name=self._name, image=self._image)) log.debug(f"Docker container '{self._name}' [{self._image}] removed")
if release_nio_udp_ports: if release_nio_udp_ports:
for adapter in self._ethernet_adapters: for adapter in self._ethernet_adapters:
@ -1756,17 +1738,11 @@ class DockerVM(BaseNode):
try: try:
adapter = self._ethernet_adapters[adapter_number] adapter = self._ethernet_adapters[adapter_number]
except IndexError: except IndexError:
raise DockerError( raise DockerError(f"Adapter {adapter_number} doesn't exist on Docker container '{self.name}'")
"Adapter {adapter_number} doesn't exist on Docker container '{name}'".format(
name=self.name, adapter_number=adapter_number
)
)
if port_number and adapter.interfaces == 1: if port_number and adapter.interfaces == 1:
raise DockerError( raise DockerError(
"Port {port_number} doesn't exist on adapter {adapter_number} of Docker container '{name}'".format( f"Port {port_number} doesn't exist on adapter {adapter_number} of Docker container '{self.name}'"
name=self.name, port_number=port_number, adapter_number=adapter_number
)
) )
for index in range(4096): for index in range(4096):
@ -1775,16 +1751,12 @@ class DockerVM(BaseNode):
break break
if adapter.host_ifc is None: if adapter.host_ifc is None:
raise DockerError( raise DockerError(
"Adapter {adapter_number} couldn't allocate interface on Docker container '{name}'. Too many Docker interfaces already exists".format( f"Adapter {adapter_number} couldn't allocate interface on Docker container '{self.name}'. Too many Docker interfaces already exists"
name=self.name, adapter_number=adapter_number
)
) )
bridge_name = self._bridge_name(adapter_number, port_number) bridge_name = self._bridge_name(adapter_number, port_number)
await self._ubridge_send(f"bridge create {bridge_name}") await self._ubridge_send(f"bridge create {bridge_name}")
self._bridges.add(bridge_name) self._bridges.add(bridge_name)
await self._ubridge_send( await self._ubridge_send(f"bridge add_nio_tap {bridge_name} {adapter.host_ifc} off")
"bridge add_nio_tap {bridge_name} {hostif} off".format(bridge_name=bridge_name, hostif=adapter.host_ifc)
)
mac_address = int_to_macaddress(macaddress_to_int(self._mac_address) + adapter_number) mac_address = int_to_macaddress(macaddress_to_int(self._mac_address) + adapter_number)
custom_adapter = self._get_custom_adapter_settings(adapter_number) custom_adapter = self._get_custom_adapter_settings(adapter_number)
@ -1793,7 +1765,7 @@ class DockerVM(BaseNode):
mac_address = custom_mac_address mac_address = custom_mac_address
try: try:
await self._ubridge_send("docker set_mac_addr {ifc} {mac}".format(ifc=adapter.host_ifc, mac=mac_address)) await self._ubridge_send(f"docker set_mac_addr {adapter.host_ifc} {mac_address}")
except UbridgeError: except UbridgeError:
log.warning(f"Could not set MAC address {mac_address} on interface {adapter.host_ifc}") log.warning(f"Could not set MAC address {mac_address} on interface {adapter.host_ifc}")
@ -1825,17 +1797,9 @@ class DockerVM(BaseNode):
async def _connect_nio(self, adapter_number, nio, port_number=0): async def _connect_nio(self, adapter_number, nio, port_number=0):
bridge_name = self._bridge_name(adapter_number, port_number) bridge_name = self._bridge_name(adapter_number, port_number)
await self._ubridge_send( await self._ubridge_send(f"bridge add_nio_udp {bridge_name} {nio.lport} {nio.rhost} {nio.rport}")
"bridge add_nio_udp {bridge_name} {lport} {rhost} {rport}".format(
bridge_name=bridge_name, lport=nio.lport, rhost=nio.rhost, rport=nio.rport
)
)
if nio.capturing: if nio.capturing:
await self._ubridge_send( await self._ubridge_send(f'bridge start_capture {bridge_name} "{nio.pcap_output_file}"')
'bridge start_capture {bridge_name} "{pcap_file}"'.format(
bridge_name=bridge_name, pcap_file=nio.pcap_output_file
)
)
await self._ubridge_send(f"bridge start {bridge_name}") await self._ubridge_send(f"bridge start {bridge_name}")
await self._ubridge_apply_filters(bridge_name, nio.filters) await self._ubridge_apply_filters(bridge_name, nio.filters)
await self._ubridge_apply_markers(bridge_name, nio) await self._ubridge_apply_markers(bridge_name, nio)
@ -1852,17 +1816,11 @@ class DockerVM(BaseNode):
try: try:
adapter = self._ethernet_adapters[adapter_number] adapter = self._ethernet_adapters[adapter_number]
except IndexError: except IndexError:
raise DockerError( raise DockerError(f"Adapter {adapter_number} doesn't exist on Docker container '{self.name}'")
"Adapter {adapter_number} doesn't exist on Docker container '{name}'".format(
name=self.name, adapter_number=adapter_number
)
)
if not adapter.port_exists(port_number): if not adapter.port_exists(port_number):
raise DockerError( raise DockerError(
"Port {port_number} doesn't exist on adapter {adapter_number} of Docker container '{name}'".format( f"Port {port_number} doesn't exist on adapter {adapter_number} of Docker container '{self.name}'"
name=self.name, port_number=port_number, adapter_number=adapter_number
)
) )
if self.status == "started" and self.ubridge: if self.status == "started" and self.ubridge:
@ -1870,11 +1828,7 @@ class DockerVM(BaseNode):
await self._set_adapter_carrier(adapter_number, not nio.suspend, port_number) await self._set_adapter_carrier(adapter_number, not nio.suspend, port_number)
adapter.add_nio(port_number, nio) adapter.add_nio(port_number, nio)
log.debug( log.debug(f"Docker container '{self.name}' [{self._id}]: {nio} added to adapter {adapter_number}")
"Docker container '{name}' [{id}]: {nio} added to adapter {adapter_number}".format(
name=self.name, id=self._id, nio=nio, adapter_number=adapter_number
)
)
async def adapter_update_nio_binding(self, adapter_number, nio, port_number=0): async def adapter_update_nio_binding(self, adapter_number, nio, port_number=0):
""" """
@ -1906,11 +1860,7 @@ class DockerVM(BaseNode):
try: try:
adapter = self._ethernet_adapters[adapter_number] adapter = self._ethernet_adapters[adapter_number]
except IndexError: except IndexError:
raise DockerError( raise DockerError(f"Adapter {adapter_number} doesn't exist on Docker VM '{self.name}'")
"Adapter {adapter_number} doesn't exist on Docker VM '{name}'".format(
name=self.name, adapter_number=adapter_number
)
)
await self.stop_capture(adapter_number, port_number) await self.stop_capture(adapter_number, port_number)
if self.ubridge: if self.ubridge:
@ -1919,19 +1869,11 @@ class DockerVM(BaseNode):
if self.status == "started": if self.status == "started":
await self._set_adapter_carrier(adapter_number, False, port_number) await self._set_adapter_carrier(adapter_number, False, port_number)
await self._ubridge_send(f"bridge stop {bridge_name}") await self._ubridge_send(f"bridge stop {bridge_name}")
await self._ubridge_send( await self._ubridge_send(f"bridge remove_nio_udp {bridge_name} {nio.lport} {nio.rhost} {nio.rport}")
"bridge remove_nio_udp {bridge_name} {lport} {rhost} {rport}".format(
bridge_name=bridge_name, lport=nio.lport, rhost=nio.rhost, rport=nio.rport
)
)
adapter.remove_nio(port_number) adapter.remove_nio(port_number)
log.debug( log.debug(f"Docker VM '{self.name}' [{self.id}]: {adapter.host_ifc} removed from adapter {adapter_number}")
"Docker VM '{name}' [{id}]: {nio} removed from adapter {adapter_number}".format(
name=self.name, id=self.id, nio=adapter.host_ifc, adapter_number=adapter_number
)
)
def get_nio(self, adapter_number, port_number=0): def get_nio(self, adapter_number, port_number=0):
""" """
@ -1946,11 +1888,7 @@ class DockerVM(BaseNode):
try: try:
adapter = self._ethernet_adapters[adapter_number] adapter = self._ethernet_adapters[adapter_number]
except KeyError: except KeyError:
raise DockerError( raise DockerError(f"Adapter {adapter_number} doesn't exist on Docker VM '{self.name}'")
"Adapter {adapter_number} doesn't exist on Docker VM '{name}'".format(
name=self.name, adapter_number=adapter_number
)
)
nio = adapter.get_nio(port_number) nio = adapter.get_nio(port_number)
@ -1985,11 +1923,7 @@ class DockerVM(BaseNode):
for adapter_number in range(0, adapters): for adapter_number in range(0, adapters):
self._ethernet_adapters.append(EthernetAdapter()) self._ethernet_adapters.append(EthernetAdapter())
log.debug( log.debug(f'Docker container "{self._name}" [{self._id}]: number of Ethernet adapters changed to {adapters}')
'Docker container "{name}" [{id}]: number of Ethernet adapters changed to {adapters}'.format(
name=self._name, id=self._id, adapters=adapters
)
)
async def _start_ubridge_capture(self, adapter_number, output_file, port_number=0): async def _start_ubridge_capture(self, adapter_number, output_file, port_number=0):
""" """
@ -2035,11 +1969,7 @@ class DockerVM(BaseNode):
if self.status == "started" and self.ubridge: if self.status == "started" and self.ubridge:
await self._start_ubridge_capture(adapter_number, output_file, port_number) await self._start_ubridge_capture(adapter_number, output_file, port_number)
log.debug( log.debug(f"Docker VM '{self.name}' [{self.id}]: starting packet capture on adapter {adapter_number}")
"Docker VM '{name}' [{id}]: starting packet capture on adapter {adapter_number}".format(
name=self.name, id=self.id, adapter_number=adapter_number
)
)
async def stop_capture(self, adapter_number, port_number=0): async def stop_capture(self, adapter_number, port_number=0):
""" """
@ -2056,11 +1986,7 @@ class DockerVM(BaseNode):
if self.status == "started" and self.ubridge: if self.status == "started" and self.ubridge:
await self._stop_ubridge_capture(adapter_number, port_number) await self._stop_ubridge_capture(adapter_number, port_number)
log.debug( log.debug(f"Docker VM '{self.name}' [{self.id}]: stopping packet capture on adapter {adapter_number}")
"Docker VM '{name}' [{id}]: stopping packet capture on adapter {adapter_number}".format(
name=self.name, id=self.id, adapter_number=adapter_number
)
)
async def _get_log(self): async def _get_log(self):
""" """

View File

@ -418,11 +418,7 @@ class VendorDockerVM(DockerVM):
try: try:
adapter = self._ethernet_adapters[adapter_number] adapter = self._ethernet_adapters[adapter_number]
except IndexError: except IndexError:
raise DockerError( raise DockerError(f"Adapter {adapter_number} doesn't exist on Docker container '{self.name}'")
"Adapter {adapter_number} doesn't exist on Docker container '{name}'".format(
name=self.name, adapter_number=adapter_number
)
)
interface_number = adapter_number * adapter.interfaces + port_number interface_number = adapter_number * adapter.interfaces + port_number
bridge_name = self._bridge_name(adapter_number, port_number) bridge_name = self._bridge_name(adapter_number, port_number)