2021SC@SDUSC
关于nova-api:
nova-api中有3个独立的py文件(__ init __是空的,不算),它们都充当“中间件”角色:
- auth.py用于创建一个nova到keystone的request上下文。
- compute_req_id.py中定义了一个ComputeReqIdMiddleware类,继承自RequestId,但我觉得它没什么用,nova中唯一一次使用这个类是test_compute_req_id.py中。
- wsgi.py中定义了几个非常fundamental的类(无论从重要性还是类关系的角度都很fundamental):
- Loader:用于从给定路径的配置文件加载给定名称的WSGI应用
- Router:根据给定映射表mapper建立进来的请求建立Controller(which is a WSGI app to call)之间的映射——以一个定义了访问路径和对应的controller的routes.Mapper()作为初始化参数,当来了请求时,将根据请求给出的环境返回???-> 我还没弄明白)
- Request:继承自webov.Request,根据给出的environ和一些参数创建Request实例(具体做法见“补充说明”)
- Application:定义了一个WSGI应用的接口,规定所有WSGI应用都应实现__ call __方法
- Middleware:继承自Application,说明它是一个WSGI应用,也是一个接口,只是给出了一个处理request的流程框架,未给出实质做法。
补充说明:
Environment默认值:
env = {
'REQUEST_METHOD': 'GET',
'SCRIPT_NAME': '',
'PATH_INFO': path_info or '',
'QUERY_STRING': query_string,
'SERVER_NAME': netloc.split(':')[0],
'SERVER_PORT': netloc.split(':')[1],
'HTTP_HOST': netloc,
'SERVER_PROTOCOL': 'HTTP/1.0',
'wsgi.version': (1, 0),
'wsgi.url_scheme': scheme,
'wsgi.input': io.BytesIO(),
'wsgi.errors': sys.stderr,
'wsgi.multithread': False,
'wsgi.multiprocess': False,
'wsgi.run_once': False,
#'webob.is_body_seekable': True,
}
env以key-value描述的静态“文件”存在,用于产生webob/Request的属性值。Request对象具有一些依赖于key描述的属性的“派生属性”(我自己取的名字,不必在意),比如host_url属性没有出现在Environment默认的key-value中,但BaseRequest具有该属性,其值依赖于Environment中HTTP_HOST、SERVER_NAME、SERVER_PORT的值。这些属性值的生成和修饰工作在需要获取属性值时在environ_getter中完成。例如:
@property
def path_url(self):
"""
The URL including SCRIPT_NAME and PATH_INFO, but not QUERY_STRING
"""
bpath_info = bytes_(self.path_info, self.url_encoding)
return self.application_url + url_quote(bpath_info, PATH_SAFE)
当用户给出了env后,Request可以被自动实例化好,有点像Spring Boot的@autowired自动注入。
api/wsgi/Request继承自webob.Request,可以根据CONF.wsgi.secure_proxy_ssl_header对environment的wsgi.url_scheme的值进行一些调整。openstack/wsgi/Request继承自api/wsgi/Request,为environment增加了很多Nova相关的key-value,例如nova.bet_content_type等。(官方描述:Add some OpenStack API-specific logic to the base webob.Request.)
ResponseHeaders其实就是个允许key-values(一对多)的字典,这个类中实现了getall、__ getitem __ 、__ setitem __等基本行为
Example:JSON request with headers
POST /v2.1/servers HTTP/1.1
Host: servers.api.openstack.org
X-Auth-Token: eaaafd18-0fed-4b3a-81b4-663c99ec1cbb
{
"server": {
"name": "server-test-1",
"imageRef": "b5660a6e-4b46-4be3-9707-6b47221b454f",
"flavorRef": "2",
"max_count": 1,
"min_count": 1,
"networks": [
{
"uuid": "d32019d3-bc6e-4319-9c1d-6722fc136a22"
}
],
"security_groups": [
{
"name": "default"
},
{
"name": "another-secgroup-name"
}
]
}
}
A sample response for a GET /servers request that includes one result each from an unreachable and a healthy part of the infrastructure is shown below:
{
"servers": [
{
"status": "UNKNOWN",
"id": "bcc6c6dd-3d0a-4633-9586-60878fd68edb",
"links": [
{
"rel": "self",
"href": "http://openstack.example.com/v2/6f70656e737461636b20342065766572/servers/bcc6c6dd-3d0a-4633-9586-60878fd68edb"
},
{
"rel": "bookmark",
"href": "http://openstack.example.com/6f70656e737461636b20342065766572/servers/bcc6c6dd-3d0a-4633-9586-60878fd68edb"
}
]
},
{
"id": "22c91117-08de-4894-9aa9-6ef382400985",
"name": "test_server",
"links": [
{
"rel": "self",
"href": "http://openstack.example.com/v2/6f70656e737461636b20342065766572/servers/22c91117-08de-4894-9aa9-6ef382400985"
},
{
"rel": "bookmark",
"href": "http://openstack.example.com/6f70656e737461636b20342065766572/servers/22c91117-08de-4894-9aa9-6ef382400985"
}
]
}
]
}
这些Request和Response的demo可以在源代码中找到:doc/api_samples