From: peusterm Date: Wed, 14 Jun 2017 08:31:02 +0000 (+0200) Subject: Added Keystone v3 token endpoint X-Git-Tag: v3.1~21^2 X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2Fvim-emu.git;a=commitdiff_plain;h=569836b037b36326272570ee54e19536791d8a07 Added Keystone v3 token endpoint --- 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..26987f0 100755 --- a/src/emuvim/api/openstack/openstack_dummies/keystone_dummy_api.py +++ b/src/emuvim/api/openstack/openstack_dummies/keystone_dummy_api.py @@ -13,6 +13,8 @@ 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)) @@ -138,6 +140,68 @@ class KeystoneShowAPIv2(Resource): 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` + """ + logging.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": [ + { + "base": "application/json", + "type": "application/vnd.openstack.identity-v2.0+json" + } + ], + "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), + "rel": "self" + }, + { + "href": "http://%s:%d/v2.0/ports" % (self.api.ip, neutron_port), + "rel": "self" + }, + { + "href": "http://%s:%d/v1//stacks" % (self.api.ip, heat_port), + "rel": "self" + } + ] + } + + return Response(json.dumps(resp), status=200, mimetype='application/json') + + class KeystoneGetToken(Resource): """ Returns a static keystone token. @@ -280,3 +344,132 @@ 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` + """ + + logging.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" % (self.api.ip, 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" % (self.api.ip, self.api.port), + "region": "RegionOne", + "interface": "public", + "id": "2dad48f09e2a447a9bf852bcd93543fc" + } + ], + "id": "2dad48f09e2a447a9bf852bcd93543fc", + "type": "identity", + "name": "keystone" + }, + { + "endpoints": [ + { + "url": "http://%s:%s" % (self.api.ip, self.api.port + 4696), + "region": "RegionOne", + "interface": "public", + "id": "2dad48f09e2a447a9bf852bcd93548cf" + } + ], + "id": "2dad48f09e2a447a9bf852bcd93548cf", + "type": "network", + "name": "neutron" + }, + { + "endpoints": [ + { + "url": "http://%s:%s" % (self.api.ip, self.api.port + 4242), + "region": "RegionOne", + "interface": "public", + "id": "2dad48f09e2a447a9bf852bcd93548cf" + } + ], + "id": "2dad48f09e2a447a9bf852bcd93548cf", + "type": "image", + "name": "glance" + }, + { + "endpoints": [ + { + "url": "http://%s:%s/v1/%s" % (self.api.ip, 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