X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2Fvim-emu.git;a=blobdiff_plain;f=src%2Femuvim%2Fapi%2Fopenstack%2Fopenstack_dummies%2Fkeystone_dummy_api.py;h=1a258df4dae6fd305f5a812ad04d9105869d2db6;hp=834b961f8b48078774f839192060b7241328e814;hb=4e5c81ecd37e7383c52dad55079f91b90dec22fe;hpb=6dcec5542d668c188ffcf491a8abaac4c5735040 diff --git a/src/emuvim/api/openstack/openstack_dummies/keystone_dummy_api.py b/src/emuvim/api/openstack/openstack_dummies/keystone_dummy_api.py index 834b961..1a258df 100755 --- a/src/emuvim/api/openstack/openstack_dummies/keystone_dummy_api.py +++ b/src/emuvim/api/openstack/openstack_dummies/keystone_dummy_api.py @@ -1,37 +1,49 @@ +""" +Copyright (c) 2017 SONATA-NFV and Paderborn University +ALL RIGHTS RESERVED. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Neither the name of the SONATA-NFV, Paderborn University +nor the names of its contributors may be used to endorse or promote +products derived from this software without specific prior written +permission. + +This work has been performed in the framework of the SONATA project, +funded by the European Commission under Grant number 671517 through +the Horizon 2020 and 5G-PPP programmes. The authors would like to +acknowledge the contributions of their colleagues of the SONATA +partner consortium (www.sonata-nfv.eu). +""" from flask_restful import Resource from flask import request, Response from emuvim.api.openstack.openstack_dummies.base_openstack_dummy import BaseOpenstackDummy +from emuvim.api.openstack.helper import get_host import logging import json +LOG = logging.getLogger("api.openstack.keystone") + class KeystoneDummyApi(BaseOpenstackDummy): def __init__(self, in_ip, in_port): super(KeystoneDummyApi, self).__init__(in_ip, in_port) self.api.add_resource(KeystoneListVersions, "/", resource_class_kwargs={'api': self}) - self.api.add_resource(Shutdown, "/shutdown") self.api.add_resource(KeystoneShowAPIv2, "/v2.0", resource_class_kwargs={'api': self}) self.api.add_resource(KeystoneGetToken, "/v2.0/tokens", resource_class_kwargs={'api': self}) - - def _start_flask(self): - logging.info("Starting %s endpoint @ http://%s:%d" % (__name__, self.ip, self.port)) - if self.app is not None: - self.app.before_request(self.dump_playbook) - self.app.run(self.ip, self.port, debug=True, use_reloader=False) - - -class Shutdown(Resource): - """ - A get request to /shutdown will shut down this endpoint. - """ - - def get(self): - logging.debug(("%s is beeing shut down") % (__name__)) - func = request.environ.get('werkzeug.server.shutdown') - if func is None: - raise RuntimeError('Not running with the Werkzeug Server') - func() + self.api.add_resource(KeystoneShowAPIv3, "/v3.0", resource_class_kwargs={'api': self}) + self.api.add_resource(KeystoneGetTokenv3, "/v3.0/auth/tokens", resource_class_kwargs={'api': self}) class KeystoneListVersions(Resource): @@ -50,7 +62,7 @@ class KeystoneListVersions(Resource): :return: Returns the api versions. :rtype: :class:`flask.response` containing a static json encoded dict. """ - logging.debug("API CALL: %s GET" % str(self.__class__.__name__)) + LOG.debug("API CALL: %s GET" % str(self.__class__.__name__)) resp = dict() resp['versions'] = dict() @@ -58,7 +70,7 @@ class KeystoneListVersions(Resource): "id": "v2.0", "links": [ { - "href": "http://%s:%d/v2.0" % (self.api.ip, self.api.port), + "href": "http://%s:%d/v2.0" % (get_host(request), self.api.port), "rel": "self" } ], @@ -92,7 +104,7 @@ class KeystoneShowAPIv2(Resource): :return: Returns an openstack style response for all entrypoints. :rtype: :class:`flask.response` """ - logging.debug("API CALL: %s GET" % str(self.__class__.__name__)) + LOG.debug("API CALL: %s GET" % str(self.__class__.__name__)) neutron_port = self.api.port + 4696 heat_port = self.api.port + 3004 @@ -109,27 +121,49 @@ class KeystoneShowAPIv2(Resource): "id": "v2.0", "links": [ { - "href": "http://%s:%d/v2.0" % (self.api.ip, self.api.port), - "rel": "self" - }, - { - "href": "http://%s:%d/v2.0/tokens" % (self.api.ip, self.api.port), - "rel": "self" - }, - { - "href": "http://%s:%d/v2.0/networks" % (self.api.ip, neutron_port), - "rel": "self" - }, - { - "href": "http://%s:%d/v2.0/subnets" % (self.api.ip, neutron_port), + "href": "http://%s:%d/v2.0" % (get_host(request), self.api.port), "rel": "self" - }, + } + ] + } + LOG.debug(json.dumps(resp)) + return Response(json.dumps(resp), status=200, mimetype='application/json') + + +class KeystoneShowAPIv3(Resource): + """ + Entrypoint for all openstack clients. + This returns all current entrypoints running on son-emu. + """ + + def __init__(self, api): + self.api = api + + def get(self): + """ + List API entrypoints. + + :return: Returns an openstack style response for all entrypoints. + :rtype: :class:`flask.response` + """ + LOG.debug("API CALL: %s GET" % str(self.__class__.__name__)) + + neutron_port = self.api.port + 4696 + heat_port = self.api.port + 3004 + + resp = dict() + resp['version'] = { + "status": "stable", + "media-types": [ { - "href": "http://%s:%d/v2.0/ports" % (self.api.ip, neutron_port), - "rel": "self" - }, + "base": "application/json", + "type": "application/vnd.openstack.identity-v3.0+json" + } + ], + "id": "v3.0", + "links": [ { - "href": "http://%s:%d/v1//stacks" % (self.api.ip, heat_port), + "href": "http://%s:%d/v3.0" % (get_host(request), self.api.port), "rel": "self" } ] @@ -164,7 +198,7 @@ class KeystoneGetToken(Resource): :rtype: :class:`flask.response` """ - logging.debug("API CALL: %s POST" % str(self.__class__.__name__)) + LOG.debug("API CALL: %s POST" % str(self.__class__.__name__)) try: ret = dict() req = json.loads(request.data) @@ -194,11 +228,11 @@ class KeystoneGetToken(Resource): ret['access']['serviceCatalog'] = [{ "endpoints": [ { - "adminURL": "http://%s:%s/v2.1/%s" % (self.api.ip, self.api.port + 3774, user['id']), + "adminURL": "http://%s:%s/v2.1/%s" % (get_host(request), self.api.port + 3774, user['id']), "region": "RegionOne", - "internalURL": "http://%s:%s/v2.1/%s" % (self.api.ip, self.api.port + 3774, user['id']), + "internalURL": "http://%s:%s/v2.1/%s" % (get_host(request), self.api.port + 3774, user['id']), "id": "2dad48f09e2a447a9bf852bcd93548ef", - "publicURL": "http://%s:%s/v2.1/%s" % (self.api.ip, self.api.port + 3774, user['id']) + "publicURL": "http://%s:%s/v2.1/%s" % (get_host(request), self.api.port + 3774, user['id']) } ], "endpoints_links": [], @@ -208,11 +242,11 @@ class KeystoneGetToken(Resource): { "endpoints": [ { - "adminURL": "http://%s:%s/v2.0" % (self.api.ip, self.api.port), + "adminURL": "http://%s:%s/v2.0" % (get_host(request), self.api.port), "region": "RegionOne", - "internalURL": "http://%s:%s/v2.0" % (self.api.ip, self.api.port), + "internalURL": "http://%s:%s/v2.0" % (get_host(request), self.api.port), "id": "2dad48f09e2a447a9bf852bcd93543fc", - "publicURL": "http://%s:%s/v2" % (self.api.ip, self.api.port) + "publicURL": "http://%s:%s/v2" % (get_host(request), self.api.port) } ], "endpoints_links": [], @@ -222,11 +256,11 @@ class KeystoneGetToken(Resource): { "endpoints": [ { - "adminURL": "http://%s:%s" % (self.api.ip, self.api.port + 4696), + "adminURL": "http://%s:%s" % (get_host(request), self.api.port + 4696), "region": "RegionOne", - "internalURL": "http://%s:%s" % (self.api.ip, self.api.port + 4696), + "internalURL": "http://%s:%s" % (get_host(request), self.api.port + 4696), "id": "2dad48f09e2a447a9bf852bcd93548cf", - "publicURL": "http://%s:%s" % (self.api.ip, self.api.port + 4696) + "publicURL": "http://%s:%s" % (get_host(request), self.api.port + 4696) } ], "endpoints_links": [], @@ -236,11 +270,11 @@ class KeystoneGetToken(Resource): { "endpoints": [ { - "adminURL": "http://%s:%s" % (self.api.ip, self.api.port + 4242), + "adminURL": "http://%s:%s" % (get_host(request), self.api.port + 4242), "region": "RegionOne", - "internalURL": "http://%s:%s" % (self.api.ip, self.api.port + 4242), + "internalURL": "http://%s:%s" % (get_host(request), self.api.port + 4242), "id": "2dad48f09e2a447a9bf852bcd93548cf", - "publicURL": "http://%s:%s" % (self.api.ip, self.api.port + 4242) + "publicURL": "http://%s:%s" % (get_host(request), self.api.port + 4242) } ], "endpoints_links": [], @@ -250,11 +284,11 @@ class KeystoneGetToken(Resource): { "endpoints": [ { - "adminURL": "http://%s:%s/v1/%s" % (self.api.ip, self.api.port + 3004, user['id']), + "adminURL": "http://%s:%s/v1/%s" % (get_host(request), self.api.port + 3004, user['id']), "region": "RegionOne", - "internalURL": "http://%s:%s/v1/%s" % (self.api.ip, self.api.port + 3004, user['id']), + "internalURL": "http://%s:%s/v1/%s" % (get_host(request), self.api.port + 3004, user['id']), "id": "2dad48f09e2a447a9bf852bcd93548bf", - "publicURL": "http://%s:%s/v1/%s" % (self.api.ip, self.api.port + 3004, user['id']) + "publicURL": "http://%s:%s/v1/%s" % (get_host(request), self.api.port + 3004, user['id']) } ], "endpoints_links": [], @@ -280,3 +314,131 @@ class KeystoneGetToken(Resource): except Exception as ex: logging.exception("Keystone: Get token failed.") return ex.message, 500 + +class KeystoneGetTokenv3(Resource): + """ + Returns a static keystone token. + We don't do any validation so we don't care. + """ + + def __init__(self, api): + self.api = api + + def post(self): + """ + List API entrypoints. + + This is hardcoded. For a working "authentication" use these ENVVARS: + + * OS_AUTH_URL=http://:/v3 + * OS_IDENTITY_API_VERSION=2.0 + * OS_TENANT_ID=fc394f2ab2df4114bde39905f800dc57 + * OS_REGION_NAME=RegionOne + * OS_USERNAME=bla + * OS_PASSWORD=bla + + :return: Returns an openstack style response for all entrypoints. + :rtype: :class:`flask.response` + """ + + LOG.debug("API CALL: %s POST" % str(self.__class__.__name__)) + try: + ret = dict() + req = json.loads(request.data) + ret['token'] = dict() + token = ret['token'] + + token['issued_at'] = "2014-01-30T15:30:58.819Z" + token['expires_at'] = "2999-01-30T15:30:58.819Z" + token['methods'] = ["password"] + token['extras'] = dict() + token['user'] = dict() + user = token['user'] + user['id'] = req['auth'].get('token', {'id': 'fc394f2ab2df4114bde39905f800dc57'}).get('id') + user['name'] = "tenantName" + user['password_expires_at'] = None + user['domain'] = {"id": "default", "name": "Default"} + token['audit_ids'] = ["ZzZwkUflQfygX7pdYDBCQQ"] + + # project + token['project'] = { + "domain": { + "id" : "default", + "name": "Default" + }, + "id": "8538a3f13f9541b28c2620eb19065e45", + "name": "tenantName" + } + + # catalog + token['catalog'] = [{ + "endpoints": [ + { + "url": "http://%s:%s/v2.1/%s" % (get_host(request), self.api.port + 3774, user['id']), + "region": "RegionOne", + "interface": "public", + "id": "2dad48f09e2a447a9bf852bcd93548ef" + } + ], + "id": "2dad48f09e2a447a9bf852bcd93548ef", + "type": "compute", + "name": "nova" + }, + { + "endpoints": [ + { + "url": "http://%s:%s/v2.0" % (get_host(request), self.api.port), + "region": "RegionOne", + "interface": "public", + "id": "2dad48f09e2a447a9bf852bcd93543fc" + } + ], + "id": "2dad48f09e2a447a9bf852bcd93543fc", + "type": "identity", + "name": "keystone" + }, + { + "endpoints": [ + { + "url": "http://%s:%s" % (get_host(request), self.api.port + 4696), + "region": "RegionOne", + "interface": "public", + "id": "2dad48f09e2a447a9bf852bcd93548cf" + } + ], + "id": "2dad48f09e2a447a9bf852bcd93548cf", + "type": "network", + "name": "neutron" + }, + { + "endpoints": [ + { + "url": "http://%s:%s" % (get_host(request), self.api.port + 4242), + "region": "RegionOne", + "interface": "public", + "id": "2dad48f09e2a447a9bf852bcd93548cf" + } + ], + "id": "2dad48f09e2a447a9bf852bcd93548cf", + "type": "image", + "name": "glance" + }, + { + "endpoints": [ + { + "url": "http://%s:%s/v1/%s" % (get_host(request), self.api.port + 3004, user['id']), + "region": "RegionOne", + "interface": "public", + "id": "2dad48f09e2a447a9bf852bcd93548bf" + } + ], + "id": "2dad48f09e2a447a9bf852bcd93548bf", + "type": "orchestration", + "name": "heat" + } + ] + return Response(json.dumps(ret), status=201, mimetype='application/json') + + except Exception as ex: + logging.exception("Keystone: Get token failed.") + return ex.message, 500