From 6404fccc8fc812f5d0c12ec8f8d1cec845b28f1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torma=20Krist=C3=B3f?= Date: Sat, 5 Dec 2020 13:24:27 +0100 Subject: [PATCH] easy kubernetes stuff --- src/app.py | 26 ++------------------------ src/config.py | 9 +-------- src/kuberclient.py | 21 +++++++++++++++++++-- src/resources.py | 15 +++++++++++++-- 4 files changed, 35 insertions(+), 36 deletions(-) diff --git a/src/app.py b/src/app.py index b54ae80..4f022ae 100644 --- a/src/app.py +++ b/src/app.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -import logging from flask import Flask from flask_restful import Api import sentry_sdk @@ -8,8 +7,7 @@ from sentry_sdk.integrations.sqlalchemy import SqlalchemyIntegration from healthcheck import HealthCheck from errorhandlers import register_all_error_handlers -from config import SENTRY_DSN, RELEASE_ID, RELEASEMODE, POSTGRES_DB, PORT, POSTGRES_HOSTNAME, POSTGRES_PASSWORD, \ - POSTGRES_USERNAME, DEBUG, JWT_SECRET_KEY +from config import SENTRY_DSN, RELEASE_ID, RELEASEMODE, SQLALCHEMY_DATABASE_URI, JWT_SECRET_KEY from db import db from jwtman import jwtman from fbcrypt import bcrypt @@ -40,8 +38,7 @@ if SENTRY_DSN: ) app = Flask(__name__) -app.config['SQLALCHEMY_DATABASE_URI'] = \ - f"postgresql://{POSTGRES_USERNAME}:{POSTGRES_PASSWORD}@{POSTGRES_HOSTNAME}:5432/{POSTGRES_DB}" +app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI app.config['JWT_SECRET_KEY'] = JWT_SECRET_KEY app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False @@ -52,17 +49,6 @@ ma.init_app(app) bcrypt.init_app(app) jwtman.init_app(app) -formatter = logging.Formatter( - fmt="%(asctime)s - %(levelname)s - %(module)s - %(message)s" -) - -handler = logging.StreamHandler() -handler.setFormatter(formatter) - -logger = logging.getLogger(__name__) -logger.setLevel(logging.DEBUG) -logger.addHandler(handler) - # api.add_resource(SampleResource, "/sample") api.add_resource(SignupApi, '/api/auth/signup') api.add_resource(LoginApi, '/api/auth/login') @@ -86,11 +72,3 @@ register_all_error_handlers(app) @app.before_first_request def init_db(): db.create_all() - - -if __name__ == "__main__": - app.run( - debug=bool(DEBUG), - host="0.0.0.0", - port=int(PORT), - ) diff --git a/src/config.py b/src/config.py index 4538f78..6919034 100644 --- a/src/config.py +++ b/src/config.py @@ -13,18 +13,11 @@ __module_name__ = "config" __version__text__ = "1" -PORT = os.environ.get("VIDEON_PORT", 8080) -DEBUG = os.environ.get("VIDEON_DEBUG", True) - - SENTRY_DSN = os.environ.get("SENTRY_DSN") RELEASE_ID = os.environ.get("RELEASE_ID", "test") RELEASEMODE = os.environ.get("VIDEON_RELEASEMODE", "dev") -POSTGRES_HOSTNAME = os.getenv("VIDEON_POSTGRES_HOSTNAME", "localhost") -POSTGRES_USERNAME = os.getenv("VIDEON_POSTGRES_USERNAME", "videon") -POSTGRES_PASSWORD = os.getenv("VIDEON_POSTGRES_PASSWORD", "videon") -POSTGRES_DB = os.getenv("VIDEON_POSTGRES_DB", "videon") +SQLALCHEMY_DATABASE_URI = os.getenv("SQLALCHEMY_DATABASE_URI", "sqlite://") JWT_SECRET_KEY = os.getenv("VIDEON_POSTGRES_DB", str(uuid4())) diff --git a/src/kuberclient.py b/src/kuberclient.py index 7365503..4919f69 100644 --- a/src/kuberclient.py +++ b/src/kuberclient.py @@ -40,7 +40,19 @@ class Kubectl: data={"TYPE": self.streamtype, "STREAM_KEY": self.stream_key, "PUSH_URLS": self.push_urls, "FFMPEG_ARGS": self.ffmpeg_args, "ENCODE_PUSH_URL": self.encode_push_url}) - client.CoreV1Api().patch_namespaced_config_map(namespace="videon",name=self.name, body=configmap) + client.CoreV1Api().patch_namespaced_config_map(namespace="videon", name=self.name, body=configmap) + + def __delete_configmap(self): + client.CoreV1Api().delete_namespaced_config_map(namespace="videon", name=self.name) + + def __delete_service(self): + client.CoreV1Api().delete_namespaced_service(namespace="videon", name=self.name) + + def __delete_deployment(self): + client.ExtensionsV1beta1Api().delete_namespaced_deployment(name=self.name, namespace="videon", + body=client.V1DeleteOptions( + propagation_policy="Foreground", + grace_period_seconds=5)) def __create_deployment(self): envs = [client.V1EnvFromSource(config_map_ref=client.V1ConfigMapEnvSource(name=self.name))] @@ -87,7 +99,7 @@ class Kubectl: ) ) # Creation of the Service in specified namespace - core_v1_api.create_namespaced_service(namespace="videon", body=body) + core_v1_api.create_namespaced_service(namespace="videon", body=body, name=self.name) def create_resource(self): self.__create_configmap() @@ -97,3 +109,8 @@ class Kubectl: def update_resource(self): self.__update_configmap() self.__delete_pod() + + def delete_resource(self): + self.__delete_deployment() + self.__delete_configmap() + self.__delete_service() diff --git a/src/resources.py b/src/resources.py index 6108b2c..85d6679 100644 --- a/src/resources.py +++ b/src/resources.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -from uuid import UUID,uuid4 +from uuid import UUID, uuid4 import datetime from flask_jwt_extended import create_access_token, jwt_required, get_jwt_identity @@ -12,6 +12,7 @@ from schemas import UserSchema, UserMetadataSchema, StreamResourceSchema, Ingest RestreamInputSchema from config import REGISTER_DISABLED import listdiffer +from kuberclient import Kubectl """ Flask Restful endpoints @@ -186,6 +187,7 @@ class CreateIngestResource(Resource): ingest.stream_key = str(uuid4()) try: db.session.add(ingest) + Kubectl(name=ingest.id, resourcetype="ingest", stream_key=ingest.stream_key).create_resource() except Exception as e: current_app.logger.warning(e) abort(503, "object already exists") @@ -234,7 +236,8 @@ class CreateRestreamResource(Resource): restream.parent_id = restreamobj['inputNeighbour'] try: db.session.add(restream) - db.session.commit() + Kubectl(name=restream.id, resourcetype="restream", + stream_key=restream.stream_key, push_urls=restreamobj['outputURLs']).create_resource() except Exception as e: current_app.logger.warning(e) abort(503, "object already exists") @@ -289,6 +292,8 @@ class CreateEncodeResource(Resource): try: db.session.add(encoder) + Kubectl(name=encoder.id, resourcetype="encoder", + stream_key=encoder.stream_key).create_resource() except Exception as e: current_app.logger.warning(e) abort(503, "object already exists") @@ -341,6 +346,7 @@ class ManipulateStreamResource(Resource): try: db.session.delete(streamreousrce) + Kubectl(name=streamreousrce.id, resourcetype=streamreousrce.resource_type).delete_resource() except Exception as e: current_app.logger.exception(e) abort(503, DB_ERROR_MSG) @@ -393,6 +399,7 @@ class ModifyIngressResource(Resource): current_app.logger.warning(e) abort(503, "could not remove neighbourhood") else: + Kubectl(name=ingest.id, resourcetype="ingest", stream_key=ingest.stream_key).update_resource() if currentoutputneighbours: for currentneighbour in currentoutputneighbours: try: @@ -453,6 +460,10 @@ class ModifyRestreamResource(Resource): current_app.logger.warning(e) abort(503, "object already exists") + if currentoutputurlurls != restreamobj['outputURLs']: + Kubectl(name=restream.id, resourcetype="restream", stream_key=restream.stream_key, + push_urls=restreamobj['outputURLs']).update_resource() + db.session.commit() return self.streamresourceschema.dump(restream), 200