2020-11-24 20:26:02 +01:00
|
|
|
#!/usr/bin/env python3
|
2020-12-05 13:24:27 +01:00
|
|
|
from uuid import UUID, uuid4
|
2020-11-24 20:26:02 +01:00
|
|
|
import datetime
|
|
|
|
|
2020-11-25 05:16:36 +01:00
|
|
|
from flask_jwt_extended import create_access_token, jwt_required, get_jwt_identity
|
2020-11-24 20:26:02 +01:00
|
|
|
from flask_restful import Resource
|
2020-11-24 22:39:43 +01:00
|
|
|
from flask import request, current_app, abort
|
2020-11-24 20:26:02 +01:00
|
|
|
|
|
|
|
from db import db
|
2020-11-25 05:16:36 +01:00
|
|
|
from models import VideonUser, StreamResource, StreamResourceTypeEnum, OutputUrls
|
|
|
|
from schemas import UserSchema, UserMetadataSchema, StreamResourceSchema, IngestInputSchema, EncodeInputSchema, \
|
2020-12-05 17:54:37 +01:00
|
|
|
RestreamInputSchema, CoordInputSchema
|
2020-11-24 22:39:43 +01:00
|
|
|
from config import REGISTER_DISABLED
|
2020-11-25 05:16:36 +01:00
|
|
|
import listdiffer
|
2020-12-05 13:24:27 +01:00
|
|
|
from kuberclient import Kubectl
|
2020-11-24 20:26:02 +01:00
|
|
|
|
|
|
|
"""
|
|
|
|
Flask Restful endpoints
|
|
|
|
"""
|
|
|
|
|
|
|
|
__author__ = '@tormakris'
|
|
|
|
__copyright__ = "Copyright 2020, videON Team"
|
|
|
|
__module_name__ = "resources"
|
|
|
|
__version__text__ = "1"
|
|
|
|
|
2020-11-25 05:16:36 +01:00
|
|
|
INVALID_JSON_SCHEMA_MSG = "invalid json schema"
|
|
|
|
DB_ERROR_MSG = "db session error"
|
|
|
|
|
2020-11-24 20:26:02 +01:00
|
|
|
|
|
|
|
class SignupApi(Resource):
|
|
|
|
"""
|
|
|
|
See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/createuser
|
|
|
|
"""
|
|
|
|
|
|
|
|
userschema = UserSchema(many=False)
|
|
|
|
usermetadataschema = UserMetadataSchema(many=False)
|
|
|
|
|
|
|
|
def post(self):
|
2020-11-24 22:39:43 +01:00
|
|
|
if REGISTER_DISABLED:
|
|
|
|
abort(401, "register disabled")
|
|
|
|
|
2020-11-24 20:26:02 +01:00
|
|
|
body = request.get_json()
|
|
|
|
|
|
|
|
try:
|
|
|
|
userobj = self.userschema.load(body)
|
|
|
|
except Exception as e:
|
2020-11-24 22:39:43 +01:00
|
|
|
current_app.logger.warning(e)
|
2020-11-25 05:16:36 +01:00
|
|
|
abort(417, INVALID_JSON_SCHEMA_MSG)
|
2020-11-24 20:26:02 +01:00
|
|
|
|
2020-11-25 05:16:36 +01:00
|
|
|
user = VideonUser(name=userobj['name'], password=userobj['password'])
|
2020-12-06 03:49:30 +01:00
|
|
|
user.hash_password()
|
|
|
|
db.session.add(user)
|
|
|
|
|
|
|
|
expires = datetime.timedelta(days=7)
|
|
|
|
access_token = create_access_token(identity=str(user.name), expires_delta=expires)
|
|
|
|
|
2020-11-24 20:26:02 +01:00
|
|
|
try:
|
2020-12-06 03:49:30 +01:00
|
|
|
db.session.commit()
|
2020-11-24 20:26:02 +01:00
|
|
|
except Exception as e:
|
2020-11-24 22:39:43 +01:00
|
|
|
current_app.logger.warning(e)
|
2020-12-06 02:00:09 +01:00
|
|
|
abort(409, "user already exists")
|
2020-12-06 00:12:57 +01:00
|
|
|
return {'token': access_token}, 200
|
2020-11-24 20:26:02 +01:00
|
|
|
|
|
|
|
|
|
|
|
class LoginApi(Resource):
|
|
|
|
"""
|
|
|
|
See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/logon
|
|
|
|
"""
|
|
|
|
|
|
|
|
userschema = UserSchema(many=False)
|
|
|
|
usermetadataschema = UserMetadataSchema(many=False)
|
|
|
|
|
|
|
|
def post(self):
|
|
|
|
body = request.get_json()
|
|
|
|
|
|
|
|
try:
|
|
|
|
userobj = self.userschema.load(body)
|
|
|
|
except Exception as e:
|
2020-11-24 22:39:43 +01:00
|
|
|
current_app.logger.warning(e)
|
2020-11-25 05:16:36 +01:00
|
|
|
abort(417, INVALID_JSON_SCHEMA_MSG)
|
2020-12-06 00:12:57 +01:00
|
|
|
try:
|
|
|
|
user = VideonUser.query.filter_by(name=userobj['name']).first()
|
|
|
|
authorized = user.check_password(userobj['password'])
|
|
|
|
if not authorized:
|
|
|
|
abort(401, "username or password incorrect")
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.info(e)
|
|
|
|
abort(401, "unauthorized")
|
2020-11-24 20:26:02 +01:00
|
|
|
|
2020-12-06 03:49:30 +01:00
|
|
|
user.last_logon = datetime.datetime.now()
|
2020-11-24 20:26:02 +01:00
|
|
|
|
|
|
|
expires = datetime.timedelta(days=7)
|
|
|
|
access_token = create_access_token(identity=str(user.name), expires_delta=expires)
|
2020-11-25 05:16:36 +01:00
|
|
|
db.session.commit()
|
2020-11-24 20:26:02 +01:00
|
|
|
return {'token': access_token}, 200
|
2020-11-24 22:39:43 +01:00
|
|
|
|
|
|
|
|
2020-12-06 02:44:35 +01:00
|
|
|
class MeApi(Resource):
|
|
|
|
"""
|
|
|
|
See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/logon
|
|
|
|
"""
|
|
|
|
|
|
|
|
usermetadataschema = UserMetadataSchema(many=False)
|
|
|
|
|
2020-12-06 03:49:30 +01:00
|
|
|
@jwt_required
|
2020-12-06 02:56:53 +01:00
|
|
|
def get(self):
|
2020-12-06 02:44:35 +01:00
|
|
|
username = get_jwt_identity()
|
|
|
|
# username = "jozska"
|
|
|
|
user = VideonUser.query.filter_by(name=username).first_or_404()
|
|
|
|
return self.usermetadataschema.dump(user), 200
|
|
|
|
|
|
|
|
|
2020-11-24 22:39:43 +01:00
|
|
|
class UsersApi(Resource):
|
|
|
|
"""
|
|
|
|
See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/getall
|
|
|
|
"""
|
|
|
|
usermetadataschema = UserMetadataSchema(many=True)
|
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
@jwt_required
|
2020-11-24 22:39:43 +01:00
|
|
|
def get(self):
|
2020-11-25 05:16:36 +01:00
|
|
|
users = VideonUser.query.all()
|
2020-11-24 22:39:43 +01:00
|
|
|
return self.usermetadataschema.dump(users), 200
|
|
|
|
|
|
|
|
|
|
|
|
class UserParameterApi(Resource):
|
|
|
|
userschema = UserSchema(many=False)
|
|
|
|
usermetadataschema = UserMetadataSchema(many=False)
|
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
@jwt_required
|
2020-11-24 22:39:43 +01:00
|
|
|
def get(self, username: str):
|
|
|
|
"""
|
|
|
|
See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/getauser
|
|
|
|
:param username: Username of user (url parameter)
|
|
|
|
:return:
|
|
|
|
"""
|
2020-11-25 05:16:36 +01:00
|
|
|
user = VideonUser.query.filter_by(name=username).first_or_404()
|
2020-11-24 22:39:43 +01:00
|
|
|
return self.usermetadataschema.dump(user), 200
|
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
@jwt_required
|
2020-11-24 22:39:43 +01:00
|
|
|
def delete(self, username: str):
|
|
|
|
"""
|
|
|
|
See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/deleteuser
|
|
|
|
:param username: Username of user (url parameter)
|
|
|
|
:return:
|
|
|
|
"""
|
2020-11-25 05:16:36 +01:00
|
|
|
user = VideonUser.query.filter_by(name=username).first_or_404()
|
2020-11-24 22:39:43 +01:00
|
|
|
|
2020-12-06 03:49:30 +01:00
|
|
|
db.session.delete(user)
|
|
|
|
|
2020-11-24 22:39:43 +01:00
|
|
|
try:
|
2020-12-06 03:49:30 +01:00
|
|
|
db.session.commit()
|
2020-11-24 22:39:43 +01:00
|
|
|
except Exception as e:
|
2020-12-06 03:49:30 +01:00
|
|
|
current_app.logger.warning(e)
|
|
|
|
abort(410, DB_ERROR_MSG)
|
2020-11-24 22:39:43 +01:00
|
|
|
return self.usermetadataschema.dump(user), 200
|
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
@jwt_required
|
2020-11-24 22:39:43 +01:00
|
|
|
def put(self, username: str):
|
|
|
|
"""
|
|
|
|
See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/modifyUser
|
|
|
|
:param username: Username of user (url parameter)
|
|
|
|
:return:
|
|
|
|
"""
|
|
|
|
body = request.get_json()
|
2020-12-06 03:14:30 +01:00
|
|
|
try:
|
|
|
|
user = VideonUser.query.filter_by(name=username).first_or_404()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
2020-12-06 03:18:57 +01:00
|
|
|
abort(428, "could not find user")
|
2020-11-24 22:39:43 +01:00
|
|
|
try:
|
|
|
|
userobj = self.userschema.load(body)
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
2020-11-25 05:16:36 +01:00
|
|
|
abort(417, INVALID_JSON_SCHEMA_MSG)
|
2020-11-24 22:39:43 +01:00
|
|
|
|
2020-12-06 03:49:30 +01:00
|
|
|
user.password = userobj['password']
|
|
|
|
user.hash_password()
|
|
|
|
|
2020-11-24 22:39:43 +01:00
|
|
|
try:
|
2020-12-06 03:49:30 +01:00
|
|
|
db.session.commit()
|
2020-11-24 22:39:43 +01:00
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.exception(e)
|
2020-12-06 03:49:30 +01:00
|
|
|
abort(412, DB_ERROR_MSG)
|
2020-11-24 22:39:43 +01:00
|
|
|
return self.usermetadataschema.dump(user), 200
|
2020-11-24 22:53:31 +01:00
|
|
|
|
|
|
|
|
|
|
|
class CreateIngestResource(Resource):
|
|
|
|
"""
|
|
|
|
See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/createIngest
|
|
|
|
"""
|
2020-11-25 05:16:36 +01:00
|
|
|
ingestinputschema = IngestInputSchema(many=False)
|
|
|
|
streamresourceschema = StreamResourceSchema(many=False)
|
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
@jwt_required
|
2020-11-24 22:53:31 +01:00
|
|
|
def post(self):
|
2020-11-25 05:16:36 +01:00
|
|
|
body = request.get_json()
|
|
|
|
|
|
|
|
try:
|
|
|
|
ingestobj = self.ingestinputschema.load(body)
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
|
|
|
abort(417, INVALID_JSON_SCHEMA_MSG)
|
|
|
|
|
|
|
|
ingest = StreamResource(resource_type=StreamResourceTypeEnum['INGEST'],
|
2020-12-08 21:10:27 +01:00
|
|
|
url="rtmp://zelenka.tormakristof.eu/origin", x=ingestobj['x'],
|
2020-12-05 11:45:42 +01:00
|
|
|
y=ingestobj['y'])
|
2020-11-25 05:16:36 +01:00
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
username = get_jwt_identity()
|
|
|
|
# username = "jozska"
|
2020-12-06 03:14:30 +01:00
|
|
|
try:
|
|
|
|
user = VideonUser.query.filter_by(name=username).first_or_404()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
2020-12-06 03:18:57 +01:00
|
|
|
abort(428, "could not find user")
|
2020-11-25 05:16:36 +01:00
|
|
|
ingest.owner_id = user.id
|
2020-12-05 11:45:42 +01:00
|
|
|
ingest.stream_key = str(uuid4())
|
2020-11-25 05:16:36 +01:00
|
|
|
try:
|
|
|
|
db.session.add(ingest)
|
2020-12-06 03:49:30 +01:00
|
|
|
db.session.commit()
|
2020-12-05 13:24:27 +01:00
|
|
|
Kubectl(name=ingest.id, resourcetype="ingest", stream_key=ingest.stream_key).create_resource()
|
2020-11-25 05:16:36 +01:00
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
|
|
|
abort(503, "object already exists")
|
|
|
|
|
|
|
|
if 'outputNeighbours' in ingestobj:
|
|
|
|
for neighbour in ingestobj['outputNeighbours']:
|
|
|
|
neighbourobj = StreamResource.query.filter_by(id=neighbour).first_or_404()
|
|
|
|
if neighbourobj.resource_type == StreamResourceTypeEnum.INGEST:
|
|
|
|
abort(400, "ingest cannot be a downstream component")
|
2020-12-06 03:49:30 +01:00
|
|
|
neighbourobj.parent_id = ingest.id
|
2020-11-25 05:16:36 +01:00
|
|
|
|
2020-12-06 03:49:30 +01:00
|
|
|
try:
|
|
|
|
db.session.commit()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.exception(e)
|
|
|
|
abort(412, DB_ERROR_MSG)
|
2020-11-25 05:16:36 +01:00
|
|
|
return self.streamresourceschema.dump(ingest), 200
|
2020-11-24 22:53:31 +01:00
|
|
|
|
|
|
|
|
|
|
|
class CreateRestreamResource(Resource):
|
|
|
|
"""
|
|
|
|
See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/createRestream
|
|
|
|
"""
|
2020-11-25 05:16:36 +01:00
|
|
|
restreaminputschema = RestreamInputSchema(many=False)
|
|
|
|
streamresourceschema = StreamResourceSchema(many=False)
|
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
@jwt_required
|
2020-11-24 22:53:31 +01:00
|
|
|
def post(self):
|
2020-11-25 05:16:36 +01:00
|
|
|
body = request.get_json()
|
|
|
|
|
|
|
|
try:
|
|
|
|
restreamobj = self.restreaminputschema.load(body)
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
|
|
|
abort(417, INVALID_JSON_SCHEMA_MSG)
|
|
|
|
|
|
|
|
restream = StreamResource(resource_type=StreamResourceTypeEnum['RESTREAM'],
|
2020-12-08 21:10:27 +01:00
|
|
|
url="rtmp://zelenka.tormakristof.eu/origin", x=restreamobj['x'],
|
2020-12-05 11:45:42 +01:00
|
|
|
y=restreamobj['y'])
|
2020-11-25 05:16:36 +01:00
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
username = get_jwt_identity()
|
|
|
|
# username = "jozska"
|
2020-12-06 03:14:30 +01:00
|
|
|
try:
|
|
|
|
user = VideonUser.query.filter_by(name=username).first_or_404()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
2020-12-06 03:18:57 +01:00
|
|
|
abort(428, "could not find user")
|
2020-11-25 05:16:36 +01:00
|
|
|
restream.owner_id = user.id
|
2020-12-05 11:45:42 +01:00
|
|
|
restream.stream_key = str(uuid4())
|
2020-11-25 05:16:36 +01:00
|
|
|
if 'inputNeighbour' in restreamobj:
|
|
|
|
restream.parent_id = restreamobj['inputNeighbour']
|
|
|
|
try:
|
|
|
|
db.session.add(restream)
|
2020-12-06 03:49:30 +01:00
|
|
|
db.session.commit()
|
2020-12-05 13:24:27 +01:00
|
|
|
Kubectl(name=restream.id, resourcetype="restream",
|
|
|
|
stream_key=restream.stream_key, push_urls=restreamobj['outputURLs']).create_resource()
|
2020-11-25 05:16:36 +01:00
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
2020-12-06 03:49:30 +01:00
|
|
|
abort(409, "object already exists")
|
2020-11-25 05:16:36 +01:00
|
|
|
for url in restreamobj['outputURLs']:
|
2020-12-06 03:49:30 +01:00
|
|
|
outputurl = OutputUrls(output_url=url, streamresource_id=restream.id)
|
|
|
|
db.session.add(outputurl)
|
2020-11-25 05:16:36 +01:00
|
|
|
|
2020-12-06 03:49:30 +01:00
|
|
|
try:
|
|
|
|
db.session.commit()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.exception(e)
|
|
|
|
abort(412, DB_ERROR_MSG)
|
2020-11-25 05:16:36 +01:00
|
|
|
return self.streamresourceschema.dump(restream), 200
|
2020-11-24 22:53:31 +01:00
|
|
|
|
|
|
|
|
|
|
|
class CreateEncodeResource(Resource):
|
|
|
|
"""
|
|
|
|
See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/createEncode
|
|
|
|
"""
|
2020-11-25 05:16:36 +01:00
|
|
|
encodeinputschema = EncodeInputSchema(many=False)
|
|
|
|
streamresourceschema = StreamResourceSchema(many=False)
|
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
@jwt_required
|
2020-11-24 22:53:31 +01:00
|
|
|
def post(self):
|
2020-11-25 05:16:36 +01:00
|
|
|
body = request.get_json()
|
|
|
|
|
|
|
|
try:
|
|
|
|
encoderobj = self.encodeinputschema.load(body)
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
|
|
|
abort(417, INVALID_JSON_SCHEMA_MSG)
|
|
|
|
|
|
|
|
encoder = StreamResource(resource_type=StreamResourceTypeEnum['ENCODE'],
|
2020-12-08 21:10:27 +01:00
|
|
|
url="rtmp://zelenka.tormakristof.eu/origin", x=encoderobj['x'],
|
2020-12-05 11:45:42 +01:00
|
|
|
y=encoderobj['y'])
|
2020-11-25 05:16:36 +01:00
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
username = get_jwt_identity()
|
|
|
|
# username = "jozska"
|
2020-12-06 03:14:30 +01:00
|
|
|
try:
|
|
|
|
user = VideonUser.query.filter_by(name=username).first_or_404()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
2020-12-06 03:18:57 +01:00
|
|
|
abort(428, "could not find user")
|
2020-11-25 05:16:36 +01:00
|
|
|
encoder.owner_id = user.id
|
2020-12-05 11:45:42 +01:00
|
|
|
encoder.stream_key = str(uuid4())
|
2020-11-25 05:16:36 +01:00
|
|
|
if 'inputNeighbour' in encoderobj:
|
|
|
|
encoder.parent_id = encoderobj['inputNeighbour']
|
|
|
|
|
|
|
|
if 'bitrate' in encoderobj:
|
|
|
|
encoder.bitrate = encoderobj['bitrate']
|
|
|
|
|
|
|
|
if 'width' in encoderobj:
|
|
|
|
encoder.bitrate = encoderobj['width']
|
|
|
|
|
|
|
|
if 'height' in encoderobj:
|
|
|
|
encoder.bitrate = encoderobj['height']
|
|
|
|
|
|
|
|
try:
|
|
|
|
db.session.add(encoder)
|
2020-12-06 03:49:30 +01:00
|
|
|
db.session.commit()
|
2020-12-05 13:24:27 +01:00
|
|
|
Kubectl(name=encoder.id, resourcetype="encoder",
|
|
|
|
stream_key=encoder.stream_key).create_resource()
|
2020-11-25 05:16:36 +01:00
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
2020-12-06 03:49:30 +01:00
|
|
|
abort(409, "object already exists")
|
2020-11-25 05:16:36 +01:00
|
|
|
|
|
|
|
for neighbour in encoderobj['outputNeighbours']:
|
|
|
|
neighbour = StreamResource.query.filter_by(id=neighbour).first_or_404()
|
|
|
|
if neighbour.resource_type == StreamResourceTypeEnum.INGEST:
|
|
|
|
abort(400, "ingest cannot be a downstream component")
|
2020-12-06 03:49:30 +01:00
|
|
|
neighbour.parent_id = encoder.id
|
2020-11-25 05:16:36 +01:00
|
|
|
|
2020-12-06 03:49:30 +01:00
|
|
|
try:
|
|
|
|
db.session.commit()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.exception(e)
|
|
|
|
abort(412, DB_ERROR_MSG)
|
2020-11-25 05:16:36 +01:00
|
|
|
return self.streamresourceschema.dump(encoder), 200
|
2020-11-24 22:53:31 +01:00
|
|
|
|
|
|
|
|
|
|
|
class GetAllStreamResources(Resource):
|
|
|
|
"""
|
|
|
|
See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/getResource
|
|
|
|
"""
|
2020-11-25 05:16:36 +01:00
|
|
|
|
|
|
|
streamresourceschema = StreamResourceSchema(many=True)
|
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
@jwt_required
|
2020-11-24 22:53:31 +01:00
|
|
|
def get(self):
|
2020-12-05 18:10:52 +01:00
|
|
|
username = get_jwt_identity()
|
|
|
|
# username = "jozska"
|
2020-12-06 03:14:30 +01:00
|
|
|
try:
|
|
|
|
user = VideonUser.query.filter_by(name=username).first_or_404()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
2020-12-06 03:18:57 +01:00
|
|
|
abort(428, "could not find user")
|
2020-12-06 03:14:30 +01:00
|
|
|
try:
|
|
|
|
streamreousrces = StreamResource.query.filter_by(owner_id=user.id).all()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
|
|
|
abort(422, "invalid arguments")
|
2020-11-25 05:16:36 +01:00
|
|
|
return self.streamresourceschema.dump(streamreousrces), 200
|
2020-11-24 22:53:31 +01:00
|
|
|
|
|
|
|
|
|
|
|
class ManipulateStreamResource(Resource):
|
2020-11-25 05:16:36 +01:00
|
|
|
streamresourceschema = StreamResourceSchema(many=False)
|
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
@jwt_required
|
2020-11-25 05:16:36 +01:00
|
|
|
def get(self, resourceid: str):
|
2020-11-24 22:53:31 +01:00
|
|
|
"""
|
|
|
|
See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/getAResource
|
|
|
|
:param resourceid:
|
|
|
|
:return:
|
|
|
|
"""
|
2020-12-05 18:10:52 +01:00
|
|
|
username = get_jwt_identity()
|
|
|
|
# username = "jozska"
|
2020-12-06 03:14:30 +01:00
|
|
|
try:
|
|
|
|
user = VideonUser.query.filter_by(name=username).first_or_404()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
2020-12-06 03:18:57 +01:00
|
|
|
abort(428, "could not find user")
|
2020-12-06 03:14:30 +01:00
|
|
|
try:
|
|
|
|
streamreousrce = StreamResource.query.filter_by(id=UUID(resourceid), owner_id=user.id).first_or_404()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
|
|
|
abort(422, "invalid arguments")
|
2020-11-25 05:16:36 +01:00
|
|
|
return self.streamresourceschema.dump(streamreousrce), 200
|
2020-11-24 22:53:31 +01:00
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
@jwt_required
|
2020-11-25 05:16:36 +01:00
|
|
|
def delete(self, resourceid: str):
|
2020-11-24 22:53:31 +01:00
|
|
|
"""
|
|
|
|
See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/deleteResource
|
|
|
|
:param resourceid:
|
|
|
|
:return:
|
|
|
|
"""
|
2020-12-05 18:10:52 +01:00
|
|
|
username = get_jwt_identity()
|
|
|
|
# username = "jozska"
|
2020-12-06 03:14:30 +01:00
|
|
|
try:
|
|
|
|
user = VideonUser.query.filter_by(name=username).first_or_404()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
2020-12-06 03:18:57 +01:00
|
|
|
abort(428, "could not find user")
|
2020-12-06 03:14:30 +01:00
|
|
|
try:
|
|
|
|
streamreousrce = StreamResource.query.filter_by(id=UUID(resourceid), owner_id=user.id).first_or_404()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
|
|
|
abort(422, "invalid arguments")
|
2020-11-25 05:16:36 +01:00
|
|
|
try:
|
|
|
|
db.session.delete(streamreousrce)
|
2020-12-06 03:49:30 +01:00
|
|
|
db.session.commit()
|
2020-12-06 19:54:25 +01:00
|
|
|
Kubectl(name=streamreousrce.id, resourcetype=str(streamreousrce.resource_type)).delete_resource()
|
2020-11-25 05:16:36 +01:00
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.exception(e)
|
2020-12-06 03:49:30 +01:00
|
|
|
abort(410, DB_ERROR_MSG)
|
2020-11-25 05:16:36 +01:00
|
|
|
|
|
|
|
return self.streamresourceschema.dump(streamreousrce), 200
|
2020-11-24 22:53:31 +01:00
|
|
|
|
|
|
|
|
|
|
|
class ModifyIngressResource(Resource):
|
|
|
|
"""
|
|
|
|
See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/editIngress
|
|
|
|
"""
|
2020-11-25 05:16:36 +01:00
|
|
|
ingestinputschema = IngestInputSchema(many=False)
|
|
|
|
streamresourceschema = StreamResourceSchema(many=False)
|
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
@jwt_required
|
2020-11-25 05:16:36 +01:00
|
|
|
def put(self, resourceid: str):
|
|
|
|
body = request.get_json()
|
|
|
|
|
|
|
|
try:
|
|
|
|
ingestobj = self.ingestinputschema.load(body)
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
|
|
|
abort(417, INVALID_JSON_SCHEMA_MSG)
|
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
username = get_jwt_identity()
|
|
|
|
# username = "jozska"
|
2020-12-06 03:14:30 +01:00
|
|
|
try:
|
|
|
|
user = VideonUser.query.filter_by(name=username).first_or_404()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
2020-12-06 03:18:57 +01:00
|
|
|
abort(428, "could not find user")
|
2020-12-06 03:14:30 +01:00
|
|
|
try:
|
|
|
|
ingest = StreamResource.query.filter_by(id=resourceid, owner_id=user.id).first_or_404()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
|
|
|
abort(422, "invalid arguments")
|
2020-11-25 05:16:36 +01:00
|
|
|
ingest.x = ingestobj['x']
|
|
|
|
ingest.y = ingestobj['y']
|
|
|
|
|
|
|
|
currentoutputneighbours = ingest.children
|
|
|
|
currentoutputneighboursids = [outputneighbour.id for outputneighbour in currentoutputneighbours]
|
|
|
|
|
|
|
|
if 'outputNeighbours' in ingestobj:
|
|
|
|
for removeneighbours in listdiffer.elementsinfirstlistbutnotinsecond(currentoutputneighboursids,
|
|
|
|
ingestobj['outputNeighbours']):
|
|
|
|
neighbourobj = StreamResource.query.filter_by(id=removeneighbours).first_or_404()
|
2020-12-06 03:49:30 +01:00
|
|
|
neighbourobj.parent_id = None
|
2020-11-25 05:16:36 +01:00
|
|
|
|
|
|
|
for addneighbours in listdiffer.elementsinsecondlistbutnotinfirst(currentoutputneighboursids,
|
|
|
|
ingestobj['outputNeighbours']):
|
|
|
|
neighbourobj = StreamResource.query.filter_by(id=addneighbours).first_or_404()
|
|
|
|
if neighbourobj.resource_type == StreamResourceTypeEnum.INGEST:
|
|
|
|
abort(400, "ingest cannot be a downstream component")
|
2020-12-06 03:49:30 +01:00
|
|
|
neighbourobj.parent_id = ingest.id
|
2020-11-25 05:16:36 +01:00
|
|
|
else:
|
2020-12-05 13:24:27 +01:00
|
|
|
Kubectl(name=ingest.id, resourcetype="ingest", stream_key=ingest.stream_key).update_resource()
|
2020-11-25 05:16:36 +01:00
|
|
|
if currentoutputneighbours:
|
|
|
|
for currentneighbour in currentoutputneighbours:
|
2020-12-06 03:49:30 +01:00
|
|
|
currentneighbour.parent_id = None
|
2020-11-25 05:16:36 +01:00
|
|
|
|
2020-12-06 03:49:30 +01:00
|
|
|
try:
|
|
|
|
db.session.commit()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.exception(e)
|
|
|
|
abort(412, DB_ERROR_MSG)
|
2020-11-25 05:16:36 +01:00
|
|
|
return self.streamresourceschema.dump(ingest), 200
|
2020-11-24 22:53:31 +01:00
|
|
|
|
|
|
|
|
|
|
|
class ModifyRestreamResource(Resource):
|
|
|
|
"""
|
|
|
|
See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/editRestream
|
|
|
|
"""
|
2020-11-25 05:16:36 +01:00
|
|
|
restreaminputschema = RestreamInputSchema(many=False)
|
|
|
|
streamresourceschema = StreamResourceSchema(many=False)
|
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
@jwt_required
|
2020-11-25 05:16:36 +01:00
|
|
|
def put(self, resourceid: str):
|
|
|
|
body = request.get_json()
|
|
|
|
|
|
|
|
try:
|
|
|
|
restreamobj = self.restreaminputschema.load(body)
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
|
|
|
abort(417, INVALID_JSON_SCHEMA_MSG)
|
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
username = get_jwt_identity()
|
|
|
|
# username = "jozska"
|
2020-12-06 03:14:30 +01:00
|
|
|
try:
|
|
|
|
user = VideonUser.query.filter_by(name=username).first_or_404()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
2020-12-06 03:18:57 +01:00
|
|
|
abort(428, "could not find user")
|
2020-12-06 03:14:30 +01:00
|
|
|
try:
|
|
|
|
restream = StreamResource.query.filter_by(id=resourceid, owner_id=user.id).first_or_404()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
|
|
|
abort(422, "invalid arguments")
|
2020-11-25 05:16:36 +01:00
|
|
|
restream.x = restreamobj['x']
|
|
|
|
restream.y = restreamobj['y']
|
|
|
|
|
|
|
|
if 'inputNeighbour' in restreamobj:
|
|
|
|
try:
|
|
|
|
restream.parent_id = restreamobj['inputNeighbour']
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
|
|
|
abort(503, "could not set parent id")
|
|
|
|
|
|
|
|
currentoutputurls = OutputUrls.query.filter_by(streamresource_id=restream.id).all()
|
|
|
|
currentoutputurlurls = [currentoutputurl.output_url for currentoutputurl in currentoutputurls]
|
|
|
|
|
|
|
|
for deleteoutputurl in listdiffer.elementsinfirstlistbutnotinsecond(currentoutputurlurls,
|
|
|
|
restreamobj['outputURLs']):
|
|
|
|
elementtodelete = OutputUrls.query.filter_by(output_url=deleteoutputurl,
|
|
|
|
streamresource_id=restream.id).first_or_404()
|
2020-12-06 03:49:30 +01:00
|
|
|
db.session.delete(elementtodelete)
|
2020-11-25 05:16:36 +01:00
|
|
|
for addoutputurl in listdiffer.elementsinsecondlistbutnotinfirst(currentoutputurlurls,
|
|
|
|
restreamobj['outputURLs']):
|
|
|
|
elementtoadd = OutputUrls(output_url=addoutputurl, streamresource_id=restream.id)
|
2020-12-06 03:49:30 +01:00
|
|
|
db.session.add(elementtoadd)
|
2020-11-25 05:16:36 +01:00
|
|
|
|
2020-12-05 13:24:27 +01:00
|
|
|
if currentoutputurlurls != restreamobj['outputURLs']:
|
|
|
|
Kubectl(name=restream.id, resourcetype="restream", stream_key=restream.stream_key,
|
|
|
|
push_urls=restreamobj['outputURLs']).update_resource()
|
|
|
|
|
2020-12-06 03:49:30 +01:00
|
|
|
try:
|
|
|
|
db.session.commit()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.exception(e)
|
|
|
|
abort(412, DB_ERROR_MSG)
|
2020-11-25 05:16:36 +01:00
|
|
|
return self.streamresourceschema.dump(restream), 200
|
2020-11-24 22:53:31 +01:00
|
|
|
|
|
|
|
|
|
|
|
class ModifyEncodeResource(Resource):
|
|
|
|
"""
|
|
|
|
See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/editEncode
|
|
|
|
"""
|
2020-11-25 05:16:36 +01:00
|
|
|
encodeinputschema = EncodeInputSchema(many=False)
|
|
|
|
streamresourceschema = StreamResourceSchema(many=False)
|
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
@jwt_required
|
2020-11-25 05:16:36 +01:00
|
|
|
def put(self, resourceid: str):
|
|
|
|
body = request.get_json()
|
|
|
|
|
|
|
|
try:
|
|
|
|
encodeobj = self.encodeinputschema.load(body)
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
|
|
|
abort(417, INVALID_JSON_SCHEMA_MSG)
|
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
username = get_jwt_identity()
|
|
|
|
# username = "jozska"
|
2020-12-06 03:14:30 +01:00
|
|
|
try:
|
|
|
|
user = VideonUser.query.filter_by(name=username).first_or_404()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
2020-12-06 03:18:57 +01:00
|
|
|
abort(428, "could not find user")
|
2020-12-06 03:14:30 +01:00
|
|
|
try:
|
|
|
|
encode = StreamResource.query.filter_by(id=resourceid, owner_id=user.id).first_or_404()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
|
|
|
abort(422, "invalid arguments")
|
2020-11-25 05:16:36 +01:00
|
|
|
encode.x = encodeobj['x']
|
|
|
|
encode.y = encodeobj['y']
|
|
|
|
|
|
|
|
if 'inputNeighbour' in encodeobj:
|
|
|
|
encode.parent_id = encodeobj['inputNeighbour']
|
|
|
|
|
|
|
|
if 'bitrate' in encodeobj:
|
|
|
|
encode.bitrate = encodeobj['bitrate']
|
|
|
|
|
|
|
|
if 'width' in encodeobj:
|
2020-12-08 00:12:50 +01:00
|
|
|
encode.width = encodeobj['width']
|
2020-11-25 05:16:36 +01:00
|
|
|
|
|
|
|
if 'height' in encodeobj:
|
2020-12-08 00:12:50 +01:00
|
|
|
encode.height = encodeobj['height']
|
2020-11-25 05:16:36 +01:00
|
|
|
|
|
|
|
currentoutputneighbours = encode.children
|
|
|
|
currentoutputneighboursids = []
|
|
|
|
for outputneighbour in currentoutputneighbours:
|
|
|
|
currentoutputneighboursids.append(outputneighbour.id)
|
|
|
|
|
|
|
|
if 'outputNeighbours' in encodeobj:
|
2020-12-07 13:00:26 +01:00
|
|
|
for removeneighbours in listdiffer.elementsinfirstlistbutnotinsecond(currentoutputneighboursids,
|
2020-11-25 05:16:36 +01:00
|
|
|
encodeobj['outputNeighbours']):
|
|
|
|
neighbourobj = StreamResource.query.filter_by(id=removeneighbours).first_or_404()
|
|
|
|
neighbourobj.parent_id = None
|
|
|
|
|
2020-12-07 13:00:26 +01:00
|
|
|
for addneighbours in listdiffer.elementsinsecondlistbutnotinfirst(currentoutputneighboursids,
|
2020-11-25 05:16:36 +01:00
|
|
|
encodeobj['outputNeighbours']):
|
|
|
|
neighbourobj = StreamResource.query.filter_by(id=addneighbours).first_or_404()
|
|
|
|
if neighbourobj.resource_type == StreamResourceTypeEnum.INGEST:
|
|
|
|
abort(400, "ingest cannot be a downstream component")
|
|
|
|
neighbourobj.parent_id = encode.id
|
|
|
|
else:
|
|
|
|
if currentoutputneighbours:
|
|
|
|
for currentneighbour in currentoutputneighbours:
|
2020-12-06 03:49:30 +01:00
|
|
|
currentneighbour.parent_id = None
|
2020-11-25 05:16:36 +01:00
|
|
|
|
2020-12-05 17:54:37 +01:00
|
|
|
childurls = []
|
|
|
|
for child in encode.children:
|
|
|
|
childurls.append(child.url)
|
|
|
|
|
|
|
|
Kubectl(name=encode.id, resourcetype="encoder",
|
|
|
|
stream_key=encode.stream_key, encode_push_urls=str(childurls)).update_resource()
|
|
|
|
|
2020-12-06 03:49:30 +01:00
|
|
|
try:
|
|
|
|
db.session.commit()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.exception(e)
|
|
|
|
abort(412, DB_ERROR_MSG)
|
2020-11-25 05:16:36 +01:00
|
|
|
return self.streamresourceschema.dump(encode), 200
|
2020-12-05 17:54:37 +01:00
|
|
|
|
|
|
|
|
|
|
|
class CoordModifyResource(Resource):
|
|
|
|
"""
|
|
|
|
See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/editCoords
|
|
|
|
"""
|
|
|
|
coordinputschema = CoordInputSchema(many=False)
|
|
|
|
streamresourceschema = StreamResourceSchema(many=False)
|
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
@jwt_required
|
2020-12-05 17:54:37 +01:00
|
|
|
def put(self, resourceid: str):
|
|
|
|
body = request.get_json()
|
|
|
|
|
|
|
|
try:
|
|
|
|
coordobj = self.coordinputschema.load(body)
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
|
|
|
abort(417, INVALID_JSON_SCHEMA_MSG)
|
|
|
|
|
2020-12-05 18:10:52 +01:00
|
|
|
username = get_jwt_identity()
|
|
|
|
# username = "jozska"
|
2020-12-06 03:14:30 +01:00
|
|
|
try:
|
|
|
|
user = VideonUser.query.filter_by(name=username).first_or_404()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
2020-12-06 03:18:57 +01:00
|
|
|
abort(428, "could not find user")
|
2020-12-06 03:14:30 +01:00
|
|
|
try:
|
|
|
|
resource = StreamResource.query.filter_by(id=resourceid, owner_id=user.id).first_or_404()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.warning(e)
|
|
|
|
abort(422, "invalid arguments")
|
2020-12-05 17:54:37 +01:00
|
|
|
resource.x = coordobj['x']
|
|
|
|
resource.y = coordobj['y']
|
|
|
|
|
2020-12-06 03:49:30 +01:00
|
|
|
try:
|
|
|
|
db.session.commit()
|
|
|
|
except Exception as e:
|
|
|
|
current_app.logger.exception(e)
|
|
|
|
abort(412, DB_ERROR_MSG)
|
2020-12-05 17:54:37 +01:00
|
|
|
return self.streamresourceschema.dump(resource), 200
|