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=58f56d81f21be3d83f0530652c0fd981a51d94de;hp=834b961f8b48078774f839192060b7241328e814;hb=0db5a38cb6d153abf58afbf6599763daa2578833;hpb=ae58801332baaa66ea71c9e233e23f0f68a0afe2 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..58f56d8 100755 --- a/src/emuvim/api/openstack/openstack_dummies/keystone_dummy_api.py +++ b/src/emuvim/api/openstack/openstack_dummies/keystone_dummy_api.py @@ -1,9 +1,12 @@ 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): @@ -13,9 +16,11 @@ class KeystoneDummyApi(BaseOpenstackDummy): 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}) + self.api.add_resource(KeystoneShowAPIv3, "/v3", resource_class_kwargs={'api': self}) + self.api.add_resource(KeystoneGetTokenv3, "/v3/auth/tokens", resource_class_kwargs={'api': self}) def _start_flask(self): - logging.info("Starting %s endpoint @ http://%s:%d" % (__name__, self.ip, self.port)) + LOG.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) @@ -27,7 +32,7 @@ class Shutdown(Resource): """ def get(self): - logging.debug(("%s is beeing shut down") % (__name__)) + LOG.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') @@ -50,7 +55,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 +63,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 +97,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 +114,49 @@ class KeystoneShowAPIv2(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" - }, - { - "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), - "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-v2.0+json" + } + ], + "id": "v2.0", + "links": [ { - "href": "http://%s:%d/v1//stacks" % (self.api.ip, heat_port), + "href": "http://%s:%d/v2.0" % (get_host(request), self.api.port), "rel": "self" } ] @@ -164,7 +191,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 +221,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 +235,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 +249,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 +263,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 +277,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 +307,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