metadata/

agent.py

主要包括MetadataProxyHandler、UnixDomainHttpProtocol、WorkerService、UnixDomainWSGIServer、UnixDomainMetadataProxy几个类和一个main函数。
该文件的主逻辑代码为:

  1. cfg.CONF.register_opts(UnixDomainMetadataProxy.OPTS)
  2. cfg.CONF.register_opts(MetadataProxyHandler.OPTS)
  3. cache.register_oslo_configs(cfg.CONF)
  4. cfg.CONF.set_default(name='cache_url', default='memory://?default_ttl=5')
  5. agent_conf.register_agent_state_opts_helper(cfg.CONF)
  6. config.init(sys.argv[1:])
  7. config.setup_logging(cfg.CONF)
  8. utils.log_opt_values(LOG)
  9. proxy = UnixDomainMetadataProxy(cfg.CONF)
  10. proxy.run()

在读取相关配置完成后,则实例化一个UnixDomainMetadataProxy,并调用其run函数。run函数则进一步创建一个server = UnixDomainWSGIServer('neutron-metadata-agent') 对象,并调用其start()和wait()函数。

run函数会将应用绑定到MetadataProxyHandler()类,该类包括一个__call__函数,调用_proxy_request()对传入的HTTP请求进行处理。

namespace_proxy.py

定义了UnixDomainHTTPConnection、NetworkMetadataProxyHandler、ProxyDaemon三个类和主函数。主函数代码为

  1. eventlet.monkey_patch()
  2. opts = [
  3. cfg.StrOpt('network_id',
  4. help=_('Network that will have instance metadata '
  5. 'proxied.')),
  6. cfg.StrOpt('router_id',
  7. help=_('Router that will have connected instances\' '
  8. 'metadata proxied.')),
  9. cfg.StrOpt('pid_file',
  10. help=_('Location of pid file of this process.')),
  11. cfg.BoolOpt('daemonize',
  12. default=True,
  13. help=_('Run as daemon.')),
  14. cfg.IntOpt('metadata_port',
  15. default=9697,
  16. help=_("TCP Port to listen for metadata server "
  17. "requests.")),
  18. cfg.StrOpt('metadata_proxy_socket',
  19. default='$state_path/metadata_proxy',
  20. help=_('Location of Metadata Proxy UNIX domain '
  21. 'socket'))
  22. ]
  23. cfg.CONF.register_cli_opts(opts)
  24. # Don't get the default configuration file
  25. cfg.CONF(project='neutron', default_config_files=[])
  26. config.setup_logging(cfg.CONF)
  27. utils.log_opt_values(LOG)
  28. proxy = ProxyDaemon(cfg.CONF.pid_file,
  29. cfg.CONF.metadata_port,
  30. network_id=cfg.CONF.network_id,
  31. router_id=cfg.CONF.router_id)
  32. if cfg.CONF.daemonize:
  33. proxy.start()
  34. else:
  35. proxy.run()

其基本过程也是读取完成相关的配置信息,然后启动一个ProxyDaemon实例,以daemon或run方法来运行。run方法则创建一个wsgi服务器,然后运行。最终绑定的应用为NetworkMetadataProxyHandler。

  1. proxy = wsgi.Server('neutron-network-metadata-proxy')
  2. proxy.start(handler, self.port)
  3. proxy.wait()