1 from flask_restful
import Resource
2 from flask
import request
, Response
3 from emuvim
.api
.openstack
.openstack_dummies
.base_openstack_dummy
import BaseOpenstackDummy
8 class KeystoneDummyApi(BaseOpenstackDummy
):
9 def __init__(self
, in_ip
, in_port
):
10 super(KeystoneDummyApi
, self
).__init
__(in_ip
, in_port
)
12 self
.api
.add_resource(KeystoneListVersions
, "/", resource_class_kwargs
={'api': self
})
13 self
.api
.add_resource(Shutdown
, "/shutdown")
14 self
.api
.add_resource(KeystoneShowAPIv2
, "/v2.0", resource_class_kwargs
={'api': self
})
15 self
.api
.add_resource(KeystoneGetToken
, "/v2.0/tokens", resource_class_kwargs
={'api': self
})
17 def _start_flask(self
):
18 logging
.info("Starting %s endpoint @ http://%s:%d" % (__name__
, self
.ip
, self
.port
))
19 if self
.app
is not None:
20 self
.app
.before_request(self
.dump_playbook
)
21 self
.app
.run(self
.ip
, self
.port
, debug
=True, use_reloader
=False)
24 class Shutdown(Resource
):
26 A get request to /shutdown will shut down this endpoint.
30 logging
.debug(("%s is beeing shut down") % (__name__
))
31 func
= request
.environ
.get('werkzeug.server.shutdown')
33 raise RuntimeError('Not running with the Werkzeug Server')
37 class KeystoneListVersions(Resource
):
39 List all known keystone versions.
40 Hardcoded for our version!
43 def __init__(self
, api
):
50 :return: Returns the api versions.
51 :rtype: :class:`flask.response` containing a static json encoded dict.
53 logging
.debug("API CALL: %s GET" % str(self
.__class
__.__name
__))
55 resp
['versions'] = dict()
61 "href": "http://%s:%d/v2.0" % (self
.api
.ip
, self
.api
.port
),
67 "base": "application/json",
68 "type": "application/vnd.openstack.identity-v2.0+json"
72 "updated": "2014-04-17T00:00:00Z"
74 resp
['versions']['values'] = version
76 return Response(json
.dumps(resp
), status
=200, mimetype
='application/json')
79 class KeystoneShowAPIv2(Resource
):
81 Entrypoint for all openstack clients.
82 This returns all current entrypoints running on son-emu.
85 def __init__(self
, api
):
92 :return: Returns an openstack style response for all entrypoints.
93 :rtype: :class:`flask.response`
95 logging
.debug("API CALL: %s GET" % str(self
.__class
__.__name
__))
97 neutron_port
= self
.api
.port
+ 4696
98 heat_port
= self
.api
.port
+ 3004
105 "base": "application/json",
106 "type": "application/vnd.openstack.identity-v2.0+json"
112 "href": "http://%s:%d/v2.0" % (self
.api
.ip
, self
.api
.port
),
116 "href": "http://%s:%d/v2.0/tokens" % (self
.api
.ip
, self
.api
.port
),
120 "href": "http://%s:%d/v2.0/networks" % (self
.api
.ip
, neutron_port
),
124 "href": "http://%s:%d/v2.0/subnets" % (self
.api
.ip
, neutron_port
),
128 "href": "http://%s:%d/v2.0/ports" % (self
.api
.ip
, neutron_port
),
132 "href": "http://%s:%d/v1/<tenant_id>/stacks" % (self
.api
.ip
, heat_port
),
138 return Response(json
.dumps(resp
), status
=200, mimetype
='application/json')
141 class KeystoneGetToken(Resource
):
143 Returns a static keystone token.
144 We don't do any validation so we don't care.
147 def __init__(self
, api
):
152 List API entrypoints.
154 This is hardcoded. For a working "authentication" use these ENVVARS:
156 * OS_AUTH_URL=http://<ip>:<port>/v2.0
157 * OS_IDENTITY_API_VERSION=2.0
158 * OS_TENANT_ID=fc394f2ab2df4114bde39905f800dc57
159 * OS_REGION_NAME=RegionOne
163 :return: Returns an openstack style response for all entrypoints.
164 :rtype: :class:`flask.response`
167 logging
.debug("API CALL: %s POST" % str(self
.__class
__.__name
__))
170 req
= json
.loads(request
.data
)
171 ret
['access'] = dict()
172 ret
['access']['token'] = dict()
173 token
= ret
['access']['token']
175 token
['issued_at'] = "2014-01-30T15:30:58.819Z"
176 token
['expires'] = "2999-01-30T15:30:58.819Z"
177 token
['id'] = req
['auth'].get('token', {'id': 'fc394f2ab2df4114bde39905f800dc57'}).get('id')
178 token
['tenant'] = dict()
179 token
['tenant']['description'] = None
180 token
['tenant']['enabled'] = True
181 token
['tenant']['id'] = req
['auth'].get('tenantId', 'fc394f2ab2df4114bde39905f800dc57')
182 token
['tenant']['name'] = "tenantName"
184 ret
['access']['user'] = dict()
185 user
= ret
['access']['user']
186 user
['username'] = req
.get('username', "username")
187 user
['name'] = "tenantName"
188 user
['roles_links'] = list()
189 user
['id'] = token
['tenant'].get('id', "fc394f2ab2df4114bde39905f800dc57")
190 user
['roles'] = [{'name': 'Member'}]
192 ret
['access']['region_name'] = "RegionOne"
194 ret
['access']['serviceCatalog'] = [{
197 "adminURL": "http://%s:%s/v2.1/%s" % (self
.api
.ip
, self
.api
.port
+ 3774, user
['id']),
198 "region": "RegionOne",
199 "internalURL": "http://%s:%s/v2.1/%s" % (self
.api
.ip
, self
.api
.port
+ 3774, user
['id']),
200 "id": "2dad48f09e2a447a9bf852bcd93548ef",
201 "publicURL": "http://%s:%s/v2.1/%s" % (self
.api
.ip
, self
.api
.port
+ 3774, user
['id'])
204 "endpoints_links": [],
211 "adminURL": "http://%s:%s/v2.0" % (self
.api
.ip
, self
.api
.port
),
212 "region": "RegionOne",
213 "internalURL": "http://%s:%s/v2.0" % (self
.api
.ip
, self
.api
.port
),
214 "id": "2dad48f09e2a447a9bf852bcd93543fc",
215 "publicURL": "http://%s:%s/v2" % (self
.api
.ip
, self
.api
.port
)
218 "endpoints_links": [],
225 "adminURL": "http://%s:%s" % (self
.api
.ip
, self
.api
.port
+ 4696),
226 "region": "RegionOne",
227 "internalURL": "http://%s:%s" % (self
.api
.ip
, self
.api
.port
+ 4696),
228 "id": "2dad48f09e2a447a9bf852bcd93548cf",
229 "publicURL": "http://%s:%s" % (self
.api
.ip
, self
.api
.port
+ 4696)
232 "endpoints_links": [],
239 "adminURL": "http://%s:%s" % (self
.api
.ip
, self
.api
.port
+ 4242),
240 "region": "RegionOne",
241 "internalURL": "http://%s:%s" % (self
.api
.ip
, self
.api
.port
+ 4242),
242 "id": "2dad48f09e2a447a9bf852bcd93548cf",
243 "publicURL": "http://%s:%s" % (self
.api
.ip
, self
.api
.port
+ 4242)
246 "endpoints_links": [],
253 "adminURL": "http://%s:%s/v1/%s" % (self
.api
.ip
, self
.api
.port
+ 3004, user
['id']),
254 "region": "RegionOne",
255 "internalURL": "http://%s:%s/v1/%s" % (self
.api
.ip
, self
.api
.port
+ 3004, user
['id']),
256 "id": "2dad48f09e2a447a9bf852bcd93548bf",
257 "publicURL": "http://%s:%s/v1/%s" % (self
.api
.ip
, self
.api
.port
+ 3004, user
['id'])
260 "endpoints_links": [],
261 "type": "orchestration",
266 ret
['access']["metadata"] = {
269 "7598ac3c634d4c3da4b9126a5f67ca2b"
272 ret
['access']['trust'] = {
273 "id": "394998fa61f14736b1f0c1f322882949",
274 "trustee_user_id": "269348fdd9374b8885da1418e0730af1",
275 "trustor_user_id": "3ec3164f750146be97f21559ee4d9c51",
276 "impersonation": False
278 return Response(json
.dumps(ret
), status
=200, mimetype
='application/json')
280 except Exception as ex
:
281 logging
.exception("Keystone: Get token failed.")
282 return ex
.message
, 500