From 6165fd50886164eb402e1b89d0a653ed219a4ace Mon Sep 17 00:00:00 2001 From: mprahl Date: Sep 19 2017 20:48:28 +0000 Subject: Add an API that exposes information about the MBS server --- diff --git a/README.rst b/README.rst index f7cf55b..b51eb2a 100644 --- a/README.rst +++ b/README.rst @@ -493,6 +493,26 @@ parameters:: } } + +Listing about +------------- + +This API shows information about the MBS server:: + + GET /module-build-service/1/about/ + +:: + + HTTP 200 OK + +:: + + { + "auth_method": "oidc", + "version": "1.3.26" + } + + HTTP Response Codes ------------------- diff --git a/module_build_service/__init__.py b/module_build_service/__init__.py index 24fbbd7..66921b2 100644 --- a/module_build_service/__init__.py +++ b/module_build_service/__init__.py @@ -40,6 +40,7 @@ for a number of tasks: infrastructure services can pick up the work. """ +import pkg_resources from flask import Flask, has_app_context, url_for from flask_sqlalchemy import SQLAlchemy from logging import getLogger @@ -53,6 +54,10 @@ from module_build_service.errors import ( from module_build_service.config import init_config from module_build_service.proxy import ReverseProxy +try: + version = pkg_resources.get_distribution('module-build-service').version +except pkg_resources.DistributionNotFound: + version = 'unknown' app = Flask(__name__) app.wsgi_app = ReverseProxy(app.wsgi_app) diff --git a/module_build_service/views.py b/module_build_service/views.py index f557820..123d274 100644 --- a/module_build_service/views.py +++ b/module_build_service/views.py @@ -31,14 +31,13 @@ import module_build_service.auth from flask import request, jsonify from flask.views import MethodView -from module_build_service import app, conf, log -from module_build_service import models, db +from module_build_service import app, conf, log, models, db, version from module_build_service.utils import ( pagination_metadata, filter_module_builds, filter_component_builds, submit_module_build_from_scm, submit_module_build_from_yaml, get_scm_url_re) from module_build_service.errors import ( - ValidationError, Forbidden, NotFound) + ValidationError, Forbidden, NotFound, ProgrammingError) api_v1 = { 'module_builds': { @@ -73,6 +72,12 @@ api_v1 = { 'methods': ['GET'], } }, + 'about': { + 'url': '/module-build-service/1/about/', + 'options': { + 'methods': ['GET'] + } + } } @@ -203,6 +208,20 @@ class ModuleBuildAPI(MethodView): return jsonify(module.json()), 200 +class AboutAPI(MethodView): + def get(self): + json = {'version': version} + config_items = ['auth_method'] + for item in config_items: + config_item = getattr(conf, item) + # All config items have a default, so if doesn't exist it is a programming error + if not config_item: + raise ProgrammingError( + 'An invalid config item of "{0}" was specified'.format(item)) + json[item] = config_item + return jsonify(json), 200 + + class BaseHandler(object): def __init__(self, request): self.username, self.groups = module_build_service.auth.get_user(request) @@ -291,6 +310,7 @@ def register_api_v1(): """ Registers version 1 of MBS API. """ module_view = ModuleBuildAPI.as_view('module_builds') component_view = ComponentBuildAPI.as_view('component_builds') + about_view = AboutAPI.as_view('about') for key, val in api_v1.items(): if key.startswith('component_build'): app.add_url_rule(val['url'], @@ -302,7 +322,13 @@ def register_api_v1(): endpoint=key, view_func=module_view, **val['options']) + elif key.startswith('about'): + app.add_url_rule(val['url'], + endpoint=key, + view_func=about_view, + **val['options']) else: raise NotImplementedError("Unhandled api key.") + register_api_v1() diff --git a/tests/test_views/test_views.py b/tests/test_views/test_views.py index 3e74ac6..cfb4207 100644 --- a/tests/test_views/test_views.py +++ b/tests/test_views/test_views.py @@ -37,7 +37,8 @@ import hashlib from tests import app, init_data from module_build_service.errors import UnprocessableEntity from module_build_service.models import ComponentBuild, ModuleBuild -from module_build_service import conf, db +from module_build_service import conf, db, version +import module_build_service.config as mbs_config import module_build_service.scheduler.handlers.modules @@ -928,3 +929,11 @@ class TestViews(unittest.TestCase): allow_custom_scmurls.return_value = True res2 = submit('git://some.custom.url.org/modules/testmodule.git?#68931c9') self.assertEquals(res2.status_code, 201) + + def test_about(self): + with patch.object(mbs_config.Config, 'auth_method', new_callable=PropertyMock) as auth: + auth.return_value = 'kerberos' + rv = self.client.get('/module-build-service/1/about/') + data = json.loads(rv.data) + self.assertEqual(rv.status_code, 200) + self.assertEquals(data, {'auth_method': 'kerberos', 'version': version})