Openstack Keystone 认证流程(三)

1. Web服务创建

在上一章中, 可以看在keystone-all中,, 使用create_server创建了两个服务器, 先看看这个函数

from keystone.common import environmentfrom paste import deploy…:app = deploy.loadapp(‘config:%s’ % conf, name=name)server = environment.Server(app, host=host, port=port)if CONF.ssl.enable:server.set_ssl(CONF.ssl.certfile, CONF.ssl.keyfile,CONF.ssl.ca_certs, CONF.ssl.cert_required)return server

首先调用deploy.loadapp(‘config:%s’ % conf, name=name)来装载一个APP。conf是一个配置文件的文件名称, name是配置文件conf中对应的APP的名字。从之前的传入参数看, 两个服务对应的APP名称分别是admin和public. admin用来作为后台的管理API, 而public作为普通用户的认证服务。

返回到创建服务前的代码, 在keystone/config.py中, 在函数find_paste_config中,conf为CONF.paste_deploy.config_file, 然后在整个keystone的configuration文件(keystone.conf)中,可以找到对应获取这个conf文件名:keystone-paste.ini

同样的方法, 我们可以找出对应的admin_port = 35357, public_port = 5000 , 并且 bind_host = 0.0.0.0

在服务器确认下代码执行的结果

$ netstat -tlpnProto Recv-Q Send-Q Local AddressForeign AddressStatePID/Program nametcp::*LISTEN10796/python tcp::*LISTEN10796/python

可以看到, 服务中确实创建了这两个port的服务。

2. Paste Deployment

Paster Deployment中用来查找和配置WSGI服务的系统。它使用loadapp从配置文件中来装载一个APP, 然后使用一些规则把不同的URL分到不同的应用中。它支持中间件, 符合PYTHON WSGI接口标准(PEP333). 在这里, 使用的配置文件是keystone-paste.ini。

在keystone-paste.ini, 可以看到两个APP:

[composite:main]use = egg:Paste#urlmap/v2.0 = public_api/v3 = api_v3/ = public_version_api[composite:admin]use = egg:Paste#urlmap/v2.0 = admin_api/v3 = api_v3/ = admin_version_api

然后再看admin_api

[pipeline:admin_api]pipeline = access_log sizelimit url_normalize token_auth admin_token_auth xml_body json_body ec2_extension s3_extension crud_extension admin_service

可以看出, 在admin中,接收三种类型的URL, v2.0, v3及根目录 ,v2.0 对应为2.0版本的接口v3是v3.0的接口,而根目录只是用来返回版本信息。 admin_api是一个pipeline, 中间有很多的处理流程。

3. Keystone environment

在创建服务器时,使用environment.Server来创建WEB服务器,可是在这个目录下, 我们找不到Server这个文件, 那它的Server肯定就会被定义在 __init__.py中,打开文件, 可以看到以下内容:

import functoolsimport osfrom keystone.common import configfrom keystone.openstack.common import log as loggingCONF = config.CONFLOG = logging.getLogger(__name__)__all__ = [‘Server’, ‘httplib’, ‘subprocess’]_configured = FalseServer = Nonehttplib = Nonesubprocess = :”””Ensure that environment configuration is only run once.If environment is reconfigured in the same way then it is ignored.It is an error to attempt to reconfigure environment in a different way.”””::global _configuredif _configured:if _configured == name:returnelse:raise SystemError(“Environment has already been “”configured as %s” % _configured)LOG.info(_(“Environment configured as: %s”), name)_configured = namereturn func(*args, **kwargs)return wrapperreturn decorator:global httplib, subprocess, Serveros.environ[‘EVENTLET_NO_GREENDNS’] = ‘yes’import eventletfrom eventlet.green import httplib as _httplibfrom eventlet.green import subprocess as _subprocessfrom keystone.common.environment import eventlet_serverif monkeypatch_thread is None:monkeypatch_thread = not os.getenv(‘STANDARD_THREADS’)# Raise the default from 8192 to accommodate large tokenseventlet.wsgi.MAX_HEADER_LINE = eventlet.patcher.monkey_patch(os=False, select=True, socket=True,thread=monkeypatch_thread, time=True,psycopg=False, MySQLdb=False)Server = eventlet_server.Serverhttplib = _httplibsubprocess = _subprocess:global httplib, subprocessimport httplib as _httplibimport subprocess as _subprocesshttplib = _httplibsubprocess = _subprocess

从文件中可以看出,确实定义了Server, 但是没有初始化, 很明显, 这个初始化需要在调用之前被执行。回到keystone-all中,可以找到environment.use_eventlet(monkeypatch_thread), 所以这里使用了协程库来处理WEB请求, 这也是当前最流行的WEB服务器模式。

勇于接受自己的不完美,认清自己不足的地方,

Openstack Keystone 认证流程(三)

相关文章:

你感兴趣的文章:

标签云: