MG-KI_Flaechenanalyse/api/openapi_server/controllers/drohne_controller.py

113 lines
2.8 KiB
Python

import logging
from uuid import uuid4
import connexion
import six
from openapi_server import util
from pymongo import MongoClient
from flask import Response
from kubernetes import client, config
logging.basicConfig(format='[%(asctime)s] [%(levelname)s] [%(name)s] %(message)s')
logger = logging.getLogger("API")
logger.setLevel(logging.INFO)
logger.info("Hello there")
config.load_incluster_config() # or config.load_kube_config()
collection = MongoClient("mongo").get_database("stadtmg").get_collection("predictions")
with client.ApiClient() as api_client:
app_api_instance = client.AppsV1Api(api_client)
core_api_instance = client.CoreV1Api(api_client)
def detect_post(body=None): # noqa: E501
"""detect_post
# noqa: E501
:param body:
:type body: str
:rtype: str
"""
image_id = str(uuid4())
logger.debug(f"Processing image '{image_id}'")
while collection.find_one({"id": image_id}) is not None:
image_id = str(uuid4())
collection.insert_one({
"id": image_id,
"input": body,
})
job_name = f"bodenerkennung-{image_id}"
metadata = client.V1ObjectMeta(
name=job_name,
labels={
"io.kompose.service": job_name,
},
namespace="stadtmg",
)
spec = client.V1JobSpec(
backoff_limit=0,
ttl_seconds_after_finished=500,
template=dict(
spec=dict(
containers=[
dict(
name="bodenerkennung",
image="masasana.azurecr.io/stadt_mg_bodenerkennung:1.1.1",
imagePullPolicy="Always",
command=["python", "predict.py"],
args=[
"--source", "mongo://mongo",
"--image_id", image_id,
"--category_json", "",
]
)
],
imagePullSecrets=[{"name": "acr-secret"}],
restartPolicy="Never",
)
),
)
logger.debug(metadata)
logger.debug(spec)
job = client.V1Job(
api_version="batch/v1",
kind="Job",
metadata=metadata,
spec=spec,
)
logger.debug(job)
batch_api = client.BatchV1Api()
batch_api.create_namespaced_job("stadtmg", job)
return Response(image_id, status=200)
def image_image_id_get(image_id): # noqa: E501
"""image_image_id_get
# noqa: E501
:param image_id:
:type image_id:
:rtype: file
"""
db_object = collection.find_one({"id": image_id})
if db_object is None:
return Response(f"Image with id '{image_id}' not found", status=404)
image = db_object.get("output")
if image is None:
return Response(status=204)
return Response(image, status=200, mimetype="image/png")