fmartingr
/
jeeves
Archived
1
0
Fork 0

Added basic docker action

This commit is contained in:
Felipe Martin 2020-01-05 18:16:35 +01:00
parent 9f7cbb0b57
commit a8a889a00f
Signed by: fmartingr
GPG Key ID: 716BC147715E716F
4 changed files with 80 additions and 2 deletions

View File

@ -1 +1,4 @@
PROVIDED_ACTIONS = ["jeeves.core.actions.shell:ScriptAction"]
PROVIDED_ACTIONS = [
"jeeves.core.actions.shell:ScriptAction",
"jeeves.core.actions.docker:DockerAction",
]

View File

@ -0,0 +1,74 @@
from typing import Text
import docker
import pydantic
import requests
from jeeves.core.objects import Result
from .base import Action
class DockerAction(Action):
"""
.. automethod:: _run_container
"""
id = "contrib/docker"
verbose_name = "Execute docker container"
class Parameters(pydantic.BaseModel):
"""
+----------------+------+-----------+----------------------------------------------+
| Parameter name | Type | Mandatory | Description |
+================+======+===========+==============================================+
| ``image`` | text | no | Image to run (defaults to ``DEFAULT_IMAGE``) |
| ``command`` | text | yes | The command to be executed |
+----------------+------+-----------+----------------------------------------------+
"""
image: Text = "alpine:latest"
command: Text
remove_container: bool = True
def _run_container(self):
"""
"""
pass
def execute(self, **kwargs):
workspace = kwargs.get("workspace")
image = self.parameters.image
command = self.parameters.command
environment = {"WORKSPACE_PATH": "/workspace"}
client = docker.from_env()
self.logger.info("Pulling image...")
try:
client.images.get(image)
except docker.errors.ImageNotFound:
self.logger.error("Image does not exist")
return Result(success=False)
self.logger.info("Execute command in container...")
container = client.containers.run(
image=image,
command=command,
detach=True,
environment=environment,
volumes={"/workspace": {"bind": str(workspace.path), "mode": "rw"}},
)
try:
result = container.wait(timeout=30, condition="not-running")
logs = container.logs()
success = result["StatusCode"] == 0
except requests.exceptions.ReadTimeout:
success = False
logs = container.logs()
if self.parameters.remove_container:
self.logger.info("Removing container")
container.remove()
return Result(success=success, output=logs)

View File

@ -13,6 +13,7 @@ jinja2 = "^2.10"
pydantic = "^0.32.2"
click = "^7.0"
toml = "^0.10.0"
docker = "^4.1.0"
[tool.poetry.dev-dependencies]
black = {version = "^18.3-alpha.0", allow-prereleases = true}

View File

@ -11,6 +11,6 @@ include_trailing_comma = True
length_sort = 1
lines_between_types = 0
line_length = 88
known_third_party = click,django,factory,pydantic,pytest,toml
known_third_party = click,django,docker,factory,pydantic,pytest,requests,toml
sections = FUTURE, STDLIB, DJANGO, THIRDPARTY, FIRSTPARTY, LOCALFOLDER
no_lines_before = LOCALFOLDER