Skip to content

Commit

Permalink
Formatted with black
Browse files Browse the repository at this point in the history
  • Loading branch information
Lucio Anderlini committed May 20, 2024
1 parent 46a9d75 commit fb8caae
Show file tree
Hide file tree
Showing 3 changed files with 165 additions and 129 deletions.
21 changes: 12 additions & 9 deletions example/create_openapi.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,36 +11,39 @@

app = FastAPI()


@app.post("/create")
async def create_pod(pods: List[interlink.Pod]) -> str:
raise NotImplementedError


@app.post("/delete")
async def delete_pod(pod: interlink.PodRequest) -> str:
raise NotImplementedError


@app.get("/status")
async def status_pod(pods: List[interlink.PodRequest]) -> List[interlink.PodStatus]:
raise NotImplementedError


@app.get("/getLogs", response_class=PlainTextResponse)
async def get_logs(req: interlink.LogRequest) -> bytes:
raise NotImplementedError


openapi_schema = os.path.join(
os.path.dirname(__file__),
*['..', 'docs', 'openapi', 'openapi.json']
os.path.dirname(__file__), *["..", "docs", "openapi", "openapi.json"]
)

with open(openapi_schema, 'w') as f:
with open(openapi_schema, "w") as f:
json.dump(
get_openapi(
title='interLink sidecar',
version=os.environ.get("VERSION", 'v0.0.0'),
openapi_version=app.openapi()['openapi'],
description='openapi spec for interLink apis <-> provider sidecar communication',
title="interLink sidecar",
version=os.environ.get("VERSION", "v0.0.0"),
openapi_version=app.openapi()["openapi"],
description="openapi spec for interLink apis <-> provider sidecar communication",
routes=app.routes,
),
f
),
f,
)
143 changes: 79 additions & 64 deletions example/provider_demo.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,13 @@


dockerCLI = docker.DockerClient()
#dockerCLI = docker.DockerClient(base_url="unix:///Users/dciangot/.docker/run/docker.sock")
# dockerCLI = docker.DockerClient(base_url="unix:///Users/dciangot/.docker/run/docker.sock")

app = FastAPI()


class MyProvider(interlink.provider.Provider):
def __init__(
self,
DOCKER
):
def __init__(self, DOCKER):
super().__init__(DOCKER)

# Recover already running containers refs
Expand All @@ -31,7 +28,9 @@ def __init__(
self.CONTAINER_POD_MAP.update({uid: [status["Id"]]})
print(self.CONTAINER_POD_MAP)

def DumpVolumes(self, pods: List[interlink.PodVolume], volumes: List[interlink.Volume]) -> List[str]:
def DumpVolumes(
self, pods: List[interlink.PodVolume], volumes: List[interlink.Volume]
) -> List[str]:

dataList = []

Expand All @@ -47,9 +46,11 @@ def DumpVolumes(self, pods: List[interlink.PodVolume], volumes: List[interlink.V
# write content to file
path = f"{dataSource.metadata.namespace}-{dataSource.metadata.name}/{filename}"
try:
os.makedirs(os.path.dirname(path), exist_ok=True)
with open(path, 'w') as f:
f.write(content)
os.makedirs(
os.path.dirname(path), exist_ok=True
)
with open(path, "w") as f:
f.write(content)
except Exception as ex:
raise HTTPException(status_code=500, detail=ex)

Expand All @@ -61,7 +62,7 @@ def DumpVolumes(self, pods: List[interlink.PodVolume], volumes: List[interlink.V

if v.emptyDirs:
pass
return dataList
return dataList

def Create(self, pod: interlink.Pod) -> None:
container = pod.pod.spec.containers[0]
Expand All @@ -73,10 +74,13 @@ def Create(self, pod: interlink.Pod) -> None:
if container.volumeMounts:
for mount in container.volumeMounts:
if mount.subPath:
volumes.append(f"{pod.pod.metadata.namespace}-{mount.name}/{mount.subPath}:{mount.mountPath}")
volumes.append(
f"{pod.pod.metadata.namespace}-{mount.name}/{mount.subPath}:{mount.mountPath}"
)
else:
volumes.append(f"{pod.pod.metadata.namespace}-{mount.name}:{mount.mountPath}")

volumes.append(
f"{pod.pod.metadata.namespace}-{mount.name}:{mount.mountPath}"
)

try:
cmds = " ".join(container.command)
Expand All @@ -86,17 +90,16 @@ def Create(self, pod: interlink.Pod) -> None:
f"{cmds} {args}",
name=f"{container.name}-{pod.pod.metadata.uid}",
detach=True,
volumes=volumes
#runtime="nvidia",
#device_requests=[
volumes=volumes,
# runtime="nvidia",
# device_requests=[
# docker.types.DeviceRequest(device_ids=["0"], capabilities=[['gpu']])]
)
print(dockerContainer)
docker_run_id = dockerContainer.id
except Exception as ex:
raise HTTPException(status_code=500, detail=ex)


self.CONTAINER_POD_MAP.update({pod.pod.metadata.uid: [docker_run_id]})
print(self.CONTAINER_POD_MAP)

Expand All @@ -105,19 +108,23 @@ def Create(self, pod: interlink.Pod) -> None:
def Delete(self, pod: interlink.PodRequest) -> None:
try:
print(f"docker rm -f {self.CONTAINER_POD_MAP[pod.metadata.uid][0]}")
container = self.DOCKER.containers.get(self.CONTAINER_POD_MAP[pod.metadata.uid][0])
container = self.DOCKER.containers.get(
self.CONTAINER_POD_MAP[pod.metadata.uid][0]
)
container.remove(force=True)
self.CONTAINER_POD_MAP.pop(pod.metadata.uid)
except:
raise HTTPException(status_code=404, detail="No containers found for UUID")
print(pod)
return

def Status(self, pod: interlink.PodRequest) -> interlink.PodStatus:
def Status(self, pod: interlink.PodRequest) -> interlink.PodStatus:
print(self.CONTAINER_POD_MAP)
print(pod.metadata.uid)
try:
container = self.DOCKER.containers.get(self.CONTAINER_POD_MAP[pod.metadata.uid][0])
container = self.DOCKER.containers.get(
self.CONTAINER_POD_MAP[pod.metadata.uid][0]
)
status = container.status
except:
raise HTTPException(status_code=404, detail="No containers found for UUID")
Expand All @@ -126,61 +133,46 @@ def Status(self, pod: interlink.PodRequest) -> interlink.PodStatus:

if status == "running":
try:
statuses = self.DOCKER.api.containers(filters={"status":"running", "id": container.id})
statuses = self.DOCKER.api.containers(
filters={"status": "running", "id": container.id}
)
print(statuses)
startedAt = statuses[0]["Created"]
except Exception as ex:
raise HTTPException(status_code=500, detail=ex)

return interlink.PodStatus(
name=pod.metadata.name,
UID=pod.metadata.uid,
namespace=pod.metadata.namespace,
containers=[
interlink.ContainerStatus(
name=pod.spec.containers[0].name,
state=interlink.ContainerStates(
running=interlink.StateRunning(startedAt=startedAt),
waiting=None,
terminated=None,
)
)
]
)
name=pod.metadata.name,
UID=pod.metadata.uid,
namespace=pod.metadata.namespace,
containers=[
interlink.ContainerStatus(
name=pod.spec.containers[0].name,
state=interlink.ContainerStates(
running=interlink.StateRunning(startedAt=startedAt),
waiting=None,
terminated=None,
),
)
],
)
elif status == "exited":

try:
statuses = self.DOCKER.api.containers(filters={"status":"exited", "id": container.id})
statuses = self.DOCKER.api.containers(
filters={"status": "exited", "id": container.id}
)
print(statuses)
reason = statuses[0]["Status"]
pattern = re.compile(r'Exited \((.*?)\)')
pattern = re.compile(r"Exited \((.*?)\)")

exitCode = -1
for match in re.findall(pattern, reason):
exitCode = int(match)
except Exception as ex:
raise HTTPException(status_code=500, detail=ex)

return interlink.PodStatus(
name=pod.metadata.name,
UID=pod.metadata.uid,
namespace=pod.metadata.namespace,
containers=[
interlink.ContainerStatus(
name=pod.spec.containers[0].name,
state=interlink.ContainerStates(
running=None,
waiting=None,
terminated=interlink.StateTerminated(
reason=reason,
exitCode=exitCode
),
)
)
]
)

return interlink.PodStatus(
name=pod.metadata.name,
UID=pod.metadata.uid,
namespace=pod.metadata.namespace,
Expand All @@ -191,43 +183,66 @@ def Status(self, pod: interlink.PodRequest) -> interlink.PodStatus:
running=None,
waiting=None,
terminated=interlink.StateTerminated(
reason="Completed",
exitCode=0
reason=reason, exitCode=exitCode
),
)
),
)
]
],
)

return interlink.PodStatus(
name=pod.metadata.name,
UID=pod.metadata.uid,
namespace=pod.metadata.namespace,
containers=[
interlink.ContainerStatus(
name=pod.spec.containers[0].name,
state=interlink.ContainerStates(
running=None,
waiting=None,
terminated=interlink.StateTerminated(
reason="Completed", exitCode=0
),
),
)
],
)

def Logs(self, req: interlink.LogRequest) -> bytes:
# TODO: manage more complicated multi container pod
# THIS IS ONLY FOR DEMONSTRATION
print(req.PodUID)
print(self.CONTAINER_POD_MAP[req.PodUID])
try:
container = self.DOCKER.containers.get(self.CONTAINER_POD_MAP[req.PodUID][0])
#log = container.logs(timestamps=req.Opts.Timestamps, tail=req.Opts.Tail)
container = self.DOCKER.containers.get(
self.CONTAINER_POD_MAP[req.PodUID][0]
)
# log = container.logs(timestamps=req.Opts.Timestamps, tail=req.Opts.Tail)
log = container.logs()
print(log)
except:
raise HTTPException(status_code=404, detail="No containers found for UUID")
return log
return log


ProviderNew = MyProvider(dockerCLI)


@app.post("/create")
async def create_pod(pods: List[interlink.Pod]) -> str:
return ProviderNew.create_pod(pods)


@app.post("/delete")
async def delete_pod(pod: interlink.PodRequest) -> str:
return ProviderNew.delete_pod(pod)


@app.get("/status")
async def status_pod(pods: List[interlink.PodRequest]) -> List[interlink.PodStatus]:
return ProviderNew.get_status(pods)


@app.get("/getLogs", response_class=PlainTextResponse)
async def get_logs(req: interlink.LogRequest) -> bytes:
return ProviderNew.get_logs(req)
Loading

0 comments on commit fb8caae

Please sign in to comment.