From fb8caaec9ce60b273720a3f59b2aff861345f795 Mon Sep 17 00:00:00 2001 From: Lucio Anderlini Date: Mon, 20 May 2024 15:30:59 +0200 Subject: [PATCH] Formatted with black --- example/create_openapi.py | 21 +++--- example/provider_demo.py | 143 +++++++++++++++++++++----------------- example/provider_mock.py | 130 +++++++++++++++++++--------------- 3 files changed, 165 insertions(+), 129 deletions(-) diff --git a/example/create_openapi.py b/example/create_openapi.py index 6089c0f7..0c220e7a 100644 --- a/example/create_openapi.py +++ b/example/create_openapi.py @@ -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, ) diff --git a/example/provider_demo.py b/example/provider_demo.py index 91f77e39..9621f847 100644 --- a/example/provider_demo.py +++ b/example/provider_demo.py @@ -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 @@ -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 = [] @@ -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) @@ -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] @@ -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) @@ -86,9 +90,9 @@ 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) @@ -96,7 +100,6 @@ def Create(self, pod: interlink.Pod) -> None: 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) @@ -105,7 +108,9 @@ 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: @@ -113,11 +118,13 @@ def Delete(self, pod: interlink.PodRequest) -> None: 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") @@ -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, @@ -191,14 +183,30 @@ 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 @@ -206,28 +214,35 @@ def Logs(self, req: interlink.LogRequest) -> bytes: 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) diff --git a/example/provider_mock.py b/example/provider_mock.py index 84abd8b6..4f84673b 100644 --- a/example/provider_mock.py +++ b/example/provider_mock.py @@ -7,7 +7,6 @@ import os - app = FastAPI() @@ -19,7 +18,9 @@ def __init__( # Recover already running containers refs 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 = [] @@ -35,9 +36,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) @@ -49,7 +52,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] @@ -61,10 +64,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}" + ) self.CONTAINER_POD_MAP.update({pod.pod.metadata.uid: [docker_run_id]}) print(self.CONTAINER_POD_MAP) @@ -74,7 +80,9 @@ 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: @@ -82,11 +90,13 @@ def Delete(self, pod: interlink.PodRequest) -> None: 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") @@ -95,61 +105,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, @@ -160,14 +155,30 @@ 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 @@ -175,28 +186,35 @@ def Logs(self, req: interlink.LogRequest) -> bytes: 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)