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


版权声明:本文为benzenene原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/benzenene/article/details/120927312