services/migration_service/api/admin.py (54 lines of code) (raw):

import os import json from aiohttp import web from subprocess import Popen from multidict import MultiDict from .utils import ApiUtils from . import make_goose_migration_template from services.migration_service.migration_config import db_conf class AdminApi(object): def __init__(self, app): app.router.add_route("GET", "/version", self.version) app.router.add_route("GET", "/ping", self.ping) app.router.add_route("GET", "/db_schema_status", self.db_schema_status) endpoints_enabled = int(os.environ.get("MF_MIGRATION_ENDPOINTS_ENABLED", 1)) if endpoints_enabled: app.router.add_route("PATCH", "/upgrade", self.upgrade) async def ping(self, request): """ --- description: This end-point allow to test that service is up. tags: - Admin produces: - 'text/plain' responses: "202": description: successful operation. Return "pong" text "405": description: invalid HTTP Method """ return web.Response(text="pong") async def version(self, request): """ --- description: This end-point returns the latest compatible version of the metadata service tags: - Admin produces: - 'application/json' responses: "200": description: successful operation. Return version text "405": description: invalid HTTP Method """ version = await ApiUtils.get_latest_compatible_version() return web.Response(text=version) async def upgrade(self, request): """ --- description: This end-point upgrades to the latest available version of of the schema tags: - Admin produces: - 'text/plain' responses: "200": description: successful operation. Return text "500": description: could not upgrade """ goose_version_cmd = make_goose_migration_template( db_conf.connection_string_url(), "up" ) p = Popen(goose_version_cmd, shell=True, close_fds=True) p.wait() if p.returncode == 0: return web.Response(text="upgrade success") else: return web.Response(text="upgrade failed", status=500) async def db_schema_status(self, request): """ --- description: This end-point returns varius stats around tags: - Admin produces: - 'application/json' responses: "200": description: successful operation. returns status of db schema and migrations "500": description: could not upgrade """ try: version = await ApiUtils.get_goose_version() migration_in_progress = await ApiUtils.is_migration_in_progress() unapplied_migrations = ApiUtils.get_unapplied_migrations(version) body = { "is_up_to_date": len(unapplied_migrations) == 0, "current_version": version, "migration_in_progress": migration_in_progress, "db_schema_versions": ApiUtils.list_migrations(), "unapplied_migrations": unapplied_migrations } return web.Response(body=json.dumps(body), headers=MultiDict({"Content-Type": "application/json"})) except Exception as e: body = { "detail": repr(e) } return web.Response(status=500, body=json.dumps(body), headers=MultiDict({"Content-Type": "application/json"}))