Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
faermanj committed Oct 18, 2023
1 parent 657742d commit cb4fbfd
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 62 deletions.
4 changes: 4 additions & 0 deletions up_cli/run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/bin/bash
set -ex

poetry run up ansible --version
16 changes: 14 additions & 2 deletions up_cli/src/up_cli/__init__.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,25 @@
import pluggy
from .containers import Containers
from dataclasses import dataclass
from typing import List

hookimpl = pluggy.HookimplMarker("up")
pm = pluggy.PluginManager("up")
containers = Containers()

def match_prompt(prompt, head, image):
if not prompt:
return None
if prompt[0] == head:
return image
return None

# https://docker-py.readthedocs.io/en/stable/containers.html
@dataclass
class RunConfig:
name: str
image: str
command: List[str]
environment: dict[str, str]
ports: dict[str, str]
auto_remove: bool = True
network_mode: str = "host"
# volumes: dict[str, str]
22 changes: 8 additions & 14 deletions up_cli/src/up_cli/containers.py
Original file line number Diff line number Diff line change
@@ -1,31 +1,25 @@
import logging as log
from dataclasses import dataclass
import docker

@dataclass
class ContainerRun:
"""Specify the parameters for a container run"""
image: str
prompt: list[str]

from up_cli import RunConfig

class DockerContainers:
def run(self, run: ContainerRun):
def run(self, run: RunConfig):
log.debug("Running container: %s", run)
client = docker.from_env()
image = run.image
prompt = run.prompt
#TODO: Catch errors, print properly
#TODO: Catch errors, print properly, pass all params
result = client.containers.run(
image=image,
command=prompt,
auto_remove=True)
image=run.image,
command=run.command,
auto_remove=run.auto_remove)
log.info("container result")
log.info("%s", result)
log.debug("Container run done")

class Containers:
delegate = DockerContainers()

def run(self, run: ContainerRun):
self.delegate.run(run)
def run(self, run: RunConfig):
self.delegate.run(run)
12 changes: 5 additions & 7 deletions up_cli/src/up_cli/hookspec.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import pluggy


hookspec = pluggy.HookspecMarker("up")

RunConfigs = List[float]
Prompt = list[str]

@hookspec(firstresult=True)
def image_for_prompt(prompt: list[str]) -> str:
"""Present the image in which the prompt will be executed"""
def to_run_configs(prompt: Prompt) -> RunConfigs:
"""Present run configurations to execute for prompt"""

@hookspec(firstresult=True)
def substitutions_for_prompt(prompt: list[str]) -> list[list[str]]:
"""Present the substitutions for the prompt"""

# TODO: Variables and Volumes
50 changes: 11 additions & 39 deletions up_cli/src/up_cli/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
from .plugins import load_plugins
from .containers import *

containers = Containers()

def print_help():
log.debug("Please please help me")

Expand Down Expand Up @@ -39,47 +41,17 @@ def main():
log.error("No prompts found")
exit_cli("NO_PROMPT_FOUND")
load_plugins(context)
prompts = lookup_substituitons_for_prompt(prompt)
for prompt in prompts:
run_prompt(prompt)

def run_prompt(prompt:list[str]):
try:
log.info("UP entrypoint reached")
start_container(prompt)
log.debug("UP done")
except Exception as ex:
print(ex)
exit_cli(333)

def lookup_substituitons_for_prompt(prompt):
log.info("Looking up substitutions")
# list[list[list[str]]]
substs = pm.hook.substitutions_for_prompt(prompt=prompt)
if not substs:
log.debug("No substitutions found")
return [prompt]
else:
log.debug("*** SUBSTS FOUND *** ")
log.debug(substs)
result = []
for subst in substs:
for prompt in substs:
result.append(prompt)
return result
run_configs = to_run_configs(prompt)
log.debug("run_configs: %s", run_configs)
for run_config in run_configs:
containers.run(run_config)

def default_image():
return "fedora:38"
def to_run_configs(prompt:list[str]) -> list[RunConfig]:
result = pm.hook.to_run_configs(prompt=prompt)
if not result:
result = []
return result

def start_container(prompt):
log.info("Starting container for prompt: %s",prompt)
image = pm.hook.image_for_prompt(prompt=prompt)
log.info(image)
if not image:
log.error("No image found for prompt: %s", prompt)
image = default_image()
containers.run(ContainerRun(image=image, prompt=prompt))
log.info("Container started")

if __name__ == '__main__':
main()

0 comments on commit cb4fbfd

Please sign in to comment.