This commit is contained in:
commit
7a3cb2afd8
25
.drone.yml
Normal file
25
.drone.yml
Normal file
@ -0,0 +1,25 @@
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: default
|
||||
steps:
|
||||
-
|
||||
- name: code-analysis
|
||||
image: aosapps/drone-sonar-plugin
|
||||
settings:
|
||||
sonar_host:
|
||||
from_secret: SONAR_HOST
|
||||
sonar_token:
|
||||
from_secret: SONAR_CODE
|
||||
|
||||
- name: kaniko
|
||||
image: banzaicloud/drone-kaniko
|
||||
settings:
|
||||
registry: registry.kmlabz.com
|
||||
repo: universalrobots/${DRONE_REPO_NAME}
|
||||
username:
|
||||
from_secret: DOCKER_USERNAME
|
||||
password:
|
||||
from_secret: DOCKER_PASSWORD
|
||||
tags:
|
||||
- latest
|
||||
- ${DRONE_BUILD_NUMBER}
|
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
*.swp
|
||||
venv
|
||||
*.pyc
|
||||
__pycache__/*
|
||||
__pycache__
|
||||
*.wpr
|
||||
*.log
|
||||
.idea
|
10
Dockerfile
Normal file
10
Dockerfile
Normal file
@ -0,0 +1,10 @@
|
||||
FROM python:3.9
|
||||
|
||||
ADD program_service requirements.txt /program_service/
|
||||
WORKDIR /program_service/
|
||||
|
||||
RUN pip3 install -r requirements.txt && pip3 install gunicorn
|
||||
|
||||
EXPOSE 8000
|
||||
CMD ["gunicorn", "-b", "0.0.0.0:8000", "app:app"]
|
||||
|
35
program_service/app.py
Normal file
35
program_service/app.py
Normal file
@ -0,0 +1,35 @@
|
||||
#!/usr/bin/env python3
|
||||
from config import Config
|
||||
import sentry_sdk
|
||||
from sentry_sdk.integrations.flask import FlaskIntegration
|
||||
from flask import Flask
|
||||
|
||||
from utils import register_all_error_handlers
|
||||
|
||||
# import views
|
||||
from views import ProgramView
|
||||
|
||||
# Setup sentry
|
||||
|
||||
if Config.SENTRY_DSN:
|
||||
sentry_sdk.init(
|
||||
dsn=Config.SENTRY_DSN,
|
||||
integrations=[FlaskIntegration()],
|
||||
send_default_pii=True,
|
||||
release=Config.RELEASE_ID,
|
||||
environment=Config.RELEASEMODE
|
||||
)
|
||||
|
||||
# create flask app
|
||||
app = Flask(__name__)
|
||||
app.config.from_object(Config)
|
||||
register_all_error_handlers(app)
|
||||
|
||||
|
||||
# register views
|
||||
for view in [ProgramView]:
|
||||
view.register(app, trailing_slash=False)
|
||||
|
||||
# start debuggig if needed
|
||||
if __name__ == "__main__":
|
||||
app.run(debug=True)
|
15
program_service/config.py
Normal file
15
program_service/config.py
Normal file
@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env python3
|
||||
import os
|
||||
|
||||
"""
|
||||
Configuration
|
||||
"""
|
||||
|
||||
|
||||
class Config:
|
||||
SECRET_KEY = os.environ.get("SECRET_KEY", os.urandom(12))
|
||||
CORS_ORIGINS = os.environ.get("ALLOWED_ORIGINS", "*")
|
||||
|
||||
SENTRY_DSN = os.environ.get("SENTRY_DSN")
|
||||
RELEASE_ID = os.environ.get("RELEASE_ID", "test")
|
||||
RELEASEMODE = os.environ.get("RELEASEMODE", "dev")
|
1
program_service/schemas/__init__.py
Normal file
1
program_service/schemas/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
#!/usr/bin/env python3
|
3
program_service/utils/__init__.py
Normal file
3
program_service/utils/__init__.py
Normal file
@ -0,0 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
from .require_decorators import json_required
|
||||
from .error_handlers import register_all_error_handlers
|
18
program_service/utils/error_handlers.py
Normal file
18
program_service/utils/error_handlers.py
Normal file
@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
|
||||
def get_standard_error_handler(code: int):
|
||||
def error_handler(err):
|
||||
return {"msg": str(err)}, code
|
||||
|
||||
return error_handler
|
||||
|
||||
|
||||
# function to register all handlers
|
||||
|
||||
|
||||
def register_all_error_handlers(app):
|
||||
error_codes_to_override = [404, 403, 401, 405, 400, 409, 422]
|
||||
|
||||
for code in error_codes_to_override:
|
||||
app.register_error_handler(code, get_standard_error_handler(code))
|
16
program_service/utils/require_decorators.py
Normal file
16
program_service/utils/require_decorators.py
Normal file
@ -0,0 +1,16 @@
|
||||
#!/usr/bin/env python3
|
||||
from flask import request, current_app, abort
|
||||
|
||||
from functools import wraps
|
||||
|
||||
|
||||
def json_required(f):
|
||||
@wraps(f)
|
||||
def call(*args, **kwargs):
|
||||
|
||||
if request.is_json:
|
||||
return f(*args, **kwargs)
|
||||
else:
|
||||
abort(400, "JSON required")
|
||||
|
||||
return call
|
2
program_service/views/__init__.py
Normal file
2
program_service/views/__init__.py
Normal file
@ -0,0 +1,2 @@
|
||||
#!/usr/bin/env python3
|
||||
from .program_view import ProgramView
|
22
program_service/views/program_view.py
Normal file
22
program_service/views/program_view.py
Normal file
@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env python3
|
||||
from flask import request, jsonify, current_app, abort, Response
|
||||
from flask_classful import FlaskView, route
|
||||
|
||||
|
||||
class ProgramView(FlaskView):
|
||||
|
||||
def index(self):
|
||||
pass
|
||||
|
||||
def get(self, _id: str):
|
||||
pass
|
||||
|
||||
def post(self):
|
||||
pass
|
||||
|
||||
@route('<_id>/details')
|
||||
def get_details(self, _id: str):
|
||||
pass
|
||||
|
||||
def delete(self, _id: str):
|
||||
pass
|
9
requirements.txt
Normal file
9
requirements.txt
Normal file
@ -0,0 +1,9 @@
|
||||
pymongo~=3.11.3
|
||||
pyyaml
|
||||
|
||||
blinker
|
||||
Flask
|
||||
marshmallow
|
||||
Flask-Classful
|
||||
sentry-sdk
|
||||
|
Loading…
Reference in New Issue
Block a user