Skip to content

Commit b76ce0f

Browse files
authored
Merge pull request #167 from shanejbrown/convert-to-python-on-whales-part2
Convert to python on whales part2
2 parents dcea3f9 + 4eed3d8 commit b76ce0f

File tree

10 files changed

+111
-47
lines changed

10 files changed

+111
-47
lines changed

buildrunner/__init__.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import types
2222
from typing import List, Optional
2323

24+
import python_on_whales
2425
import requests
2526

2627
from retry import retry
@@ -518,11 +519,16 @@ def run(self): # pylint: disable=too-many-statements,too-many-branches,too-many
518519
if self._source_image:
519520
self.log.write(f"Destroying source image {self._source_image}\n")
520521
try:
521-
_docker_client.remove_image(
522-
self._source_image,
523-
noprune=False,
524-
force=True,
525-
)
522+
if self.buildrunner_config.run_config.use_legacy_builder:
523+
_docker_client.remove_image(
524+
self._source_image,
525+
noprune=False,
526+
force=True,
527+
)
528+
else:
529+
python_on_whales.docker.image.remove(
530+
self._source_image, prune=True, force=True
531+
)
526532
except ImageNotFound:
527533
self.log.warning(
528534
f"Failed to remove source image {self._source_image}\n"
@@ -534,11 +540,16 @@ def run(self): # pylint: disable=too-many-statements,too-many-branches,too-many
534540
# reverse the order of the images since child images would likely come after parent images
535541
for _image in self.generated_images[::-1]:
536542
try:
537-
_docker_client.remove_image(
538-
_image,
539-
noprune=False,
540-
force=True,
541-
)
543+
if self.buildrunner_config.run_config.use_legacy_builder:
544+
_docker_client.remove_image(
545+
_image,
546+
noprune=False,
547+
force=True,
548+
)
549+
else:
550+
python_on_whales.docker.image.remove(
551+
_image, prune=True, force=True
552+
)
542553
except Exception as _ex: # pylint: disable=broad-except
543554
self.log.write(f"Error removing image {_image}: {str(_ex)}\n")
544555
else:

buildrunner/config/models.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
DEFAULT_CACHES_ROOT = "~/.buildrunner/caches"
2626
# Marker for using the local registry instead of an upstream registry
2727
MP_LOCAL_REGISTRY = "local"
28+
DEFAULT_TO_LEGACY_BUILDER = True
2829

2930

3031
class GithubModel(BaseModel, extra="forbid"):
@@ -142,7 +143,9 @@ class Config(BaseModel, extra="forbid"):
142143
"""Top level config model"""
143144

144145
version: Optional[float] = None
145-
use_legacy_builder: Optional[bool] = Field(alias="use-legacy-builder", default=True)
146+
use_legacy_builder: Optional[bool] = Field(
147+
alias="use-legacy-builder", default=DEFAULT_TO_LEGACY_BUILDER
148+
)
146149
steps: Dict[str, Step]
147150

148151
@field_validator("steps")

buildrunner/docker/__init__.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
from typing import Tuple
1313
import urllib.parse
1414
import docker
15+
import python_on_whales
1516

1617
from buildrunner.errors import BuildRunnerError, BuildRunnerConfigurationError
1718

19+
1820
try:
1921
# Newer API
2022
Client = docker.client.Client # pylint: disable=no-member
@@ -94,17 +96,21 @@ def new_client(
9496
)
9597

9698

97-
def force_remove_container(docker_client, container):
99+
def force_remove_container(docker_client, container, use_legacy_builder: bool):
98100
"""
99101
Force removes a container from the given docker client.
100102
:param docker_client: the docker client
101103
:param container: the container
104+
:param use_legacy_builder: whether to use the legacy builder
102105
"""
103-
docker_client.remove_container(
104-
container,
105-
force=True,
106-
v=True,
107-
)
106+
if use_legacy_builder:
107+
docker_client.remove_container(
108+
container,
109+
force=True,
110+
v=True,
111+
)
112+
else:
113+
python_on_whales.docker.remove(container, force=True, volumes=True)
108114

109115

110116
def get_dockerfile(dockerfile: str, temp_dir: str = None) -> Tuple[str, bool]:

buildrunner/docker/builder.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,9 @@ def cleanup(self):
277277
# iterate through and destroy intermediate containers
278278
for container in self.intermediate_containers:
279279
try:
280-
force_remove_container(self.docker_client, container)
280+
force_remove_container(
281+
self.docker_client, container, use_legacy_builder=True
282+
)
281283
except docker.errors.APIError as err:
282284
logger.debug(
283285
f"Error removing intermediate container {container}: {err}"

buildrunner/docker/daemon.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
import os
1010

11+
import python_on_whales
12+
13+
from buildrunner.config import BuildRunnerConfig
1114
from buildrunner.docker import DOCKER_DEFAULT_DOCKERD_URL
1215

1316
DAEMON_IMAGE_NAME = "busybox:latest"
@@ -96,8 +99,13 @@ def stop(self):
9699
f"Destroying Docker daemon container {self._daemon_container:.10}\n"
97100
)
98101
if self._daemon_container:
99-
self.docker_client.remove_container(
100-
self._daemon_container,
101-
force=True,
102-
v=True,
103-
)
102+
if BuildRunnerConfig.get_instance().run_config.use_legacy_builder:
103+
self.docker_client.remove_container(
104+
self._daemon_container,
105+
force=True,
106+
v=True,
107+
)
108+
else:
109+
python_on_whales.docker.remove(
110+
self._daemon_container, force=True, volumes=True
111+
)

buildrunner/docker/importer.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66
with the terms of the Adobe license agreement accompanying it.
77
"""
88

9+
import python_on_whales
910
import yaml
1011

1112
import docker
1213
import docker.errors
1314

15+
from buildrunner.config import BuildRunnerConfig
1416
from buildrunner.docker import new_client
1517
from buildrunner.errors import BuildRunnerProcessingError
1618
from buildrunner.utils import is_dict
@@ -41,7 +43,11 @@ def import_image(self):
4143
"""
4244

4345
try:
44-
import_return = self.docker_client.import_image(self.src)
46+
import_return = None
47+
if BuildRunnerConfig.get_instance().run_config.use_legacy_builder:
48+
import_return = self.docker_client.import_image(self.src)
49+
else:
50+
import_return = python_on_whales.docker.import_(self.src)
4551
except docker.errors.APIError as apie:
4652
raise BuildRunnerProcessingError(
4753
f"Error importing image from archive file {self.src}: {apie}"

buildrunner/docker/runner.py

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -276,21 +276,31 @@ def cleanup(self):
276276
Cleanup the backing Docker container, stopping it if necessary.
277277
"""
278278
if self.container:
279+
use_docker_py = (
280+
BuildRunnerConfig.get_instance().run_config.use_legacy_builder
281+
)
279282
for container in self.containers:
280283
try:
281-
force_remove_container(self.docker_client, container)
284+
force_remove_container(
285+
self.docker_client, container, use_legacy_builder=use_docker_py
286+
)
282287
except docker.errors.NotFound:
283288
try:
284289
container_ids = self.docker_client.containers(
285290
filters={"label": container}, quiet=True
286291
)
287292
if container_ids:
288293
for container_id in container_ids:
289-
self.docker_client.remove_container(
290-
container_id["Id"],
291-
force=True,
292-
v=True,
293-
)
294+
if use_docker_py:
295+
self.docker_client.remove_container(
296+
container_id["Id"],
297+
force=True,
298+
v=True,
299+
)
300+
else:
301+
python_on_whales.docker.remove(
302+
container_id["Id"], force=True, volumes=True
303+
)
294304
else:
295305
print(
296306
f'Unable to find docker container with name or label "{container}"'
@@ -299,12 +309,16 @@ def cleanup(self):
299309
print(
300310
f'Unable to find docker container with name or label "{container}"'
301311
)
302-
303-
self.docker_client.remove_container(
304-
self.container["Id"],
305-
force=True,
306-
v=True,
307-
)
312+
if use_docker_py:
313+
self.docker_client.remove_container(
314+
self.container["Id"],
315+
force=True,
316+
v=True,
317+
)
318+
else:
319+
python_on_whales.docker.remove(
320+
self.container["Id"], force=True, volumes=True
321+
)
308322

309323
self.container = None
310324

buildrunner/sshagent/__init__.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
from paramiko.common import io_sleep
2828
from paramiko.util import asbytes
2929
from paramiko.message import Message
30+
import python_on_whales
3031

3132
import buildrunner.config
3233
import buildrunner.docker.builder as legacy_builder
@@ -244,11 +245,16 @@ def stop(self):
244245
self.log.write(
245246
f"Destroying ssh-agent container {self._ssh_agent_container:.10}\n"
246247
)
247-
self.docker_client.remove_container(
248-
self._ssh_agent_container,
249-
force=True,
250-
v=True,
251-
)
248+
if buildrunner.config.BuildRunnerConfig.get_instance().run_config.use_legacy_builder:
249+
self.docker_client.remove_container(
250+
self._ssh_agent_container,
251+
force=True,
252+
v=True,
253+
)
254+
else:
255+
python_on_whales.docker.remove(
256+
self._ssh_agent_container, force=True, volumes=True
257+
)
252258

253259
def get_ssh_agent_image(self):
254260
"""

buildrunner/steprunner/tasks/run.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,11 +1134,18 @@ def cleanup(self, context): # pylint: disable=unused-argument
11341134
self.step_runner.log.write(
11351135
f"Destroying source container {self._source_container:.10}\n"
11361136
)
1137-
self._docker_client.remove_container(
1138-
self._source_container,
1139-
force=True,
1140-
v=True,
1141-
)
1137+
if BuildRunnerConfig.get_instance().run_config.use_legacy_builder:
1138+
self._docker_client.remove_container(
1139+
self._source_container,
1140+
force=True,
1141+
v=True,
1142+
)
1143+
else:
1144+
python_on_whales.docker.container.remove(
1145+
self._source_container,
1146+
force=True,
1147+
volumes=True,
1148+
)
11421149

11431150
for image in self.images_to_remove:
11441151
python_on_whales.docker.image.remove(image, force=True)

tests/test_builders.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import yaml
88

9+
from buildrunner.config.models import DEFAULT_TO_LEGACY_BUILDER
910
from buildrunner.docker.image_info import BuiltImageInfo, BuiltTaggedImage
1011
from tests import test_runner
1112

@@ -139,7 +140,7 @@ def fixture_set_env():
139140
),
140141
(
141142
"Default builder",
142-
True,
143+
DEFAULT_TO_LEGACY_BUILDER,
143144
"""
144145
steps:
145146
build-container-single-platform:

0 commit comments

Comments
 (0)