Openstack novaソース分析2のnova-api,nova-compute


1、これはnova-apiのスクリプトです.ディレクトリは/binで

  
  
  
  
  1. #!/usr/bin/env python  
  2. # EC2 OpenStack api greenthreads。  
  3. # API (OpenStack API   EC2 API) , ( ),  
  4.  
  5. import eventlet  
  6. eventlet.monkey_patch()  
  7.  
  8. import os  
  9. import sys  
  10.  
  11.  
  12. possible_topdir = os.path.normpath(os.path.join(os.path.abspath(  
  13.         sys.argv[0]), os.pardir, os.pardir))  
  14. if os.path.exists(os.path.join(possible_topdir, "nova""__init__.py")):  
  15.     sys.path.insert(0, possible_topdir)  
  16.  
  17.  
  18. from nova import flags  
  19. from nova import log as logging  
  20. from nova import service  
  21. from nova import utils  
  22.  
  23. if __name__ == '__main__':  
  24.     utils.default_flagfile()  # flag .  
  25.     flags.FLAGS(sys.argv)   # flag args 。  
  26.     logging.setup()           #  
  27.  
  28.     utils.monkey_patch()  
  29.     servers = []  
  30.     for api in flags.FLAGS.enabled_apis:  
  31.         servers.append(service.WSGIService(api)) # api  
  32.     service.serve(*servers)#  
  33.     service.wait() #  
  34.  

2、これはnova-computeで、主にrpc呼び出しを内部に提供します.

  
  
  
  
  1. """Starter script for Nova Compute.""" 
  2.  
  3. import eventlet  
  4. eventlet.monkey_patch()  
  5.  
  6. import os  
  7. import sys  
  8.  
  9. # If ../nova/__init__.py exists, add ../ to Python search path, so that  
  10. # it will override what happens to be installed in /usr/(local/)lib/python...  
  11. POSSIBLE_TOPDIR = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]),  
  12.                                    os.pardir,  
  13.                                    os.pardir))  
  14. if os.path.exists(os.path.join(POSSIBLE_TOPDIR, 'nova''__init__.py')):  
  15.     sys.path.insert(0, POSSIBLE_TOPDIR)  
  16.  
  17.  
  18. from nova import flags  
  19. from nova import log as logging  
  20. from nova import service  
  21. from nova import utils  
  22. """  
  23. Service.create()  
  24.  
  25. service.py 。 Service 。  
  26. 。create 。 C++ 。  
  27. 。 python 。 cls 。  
  28. self 。  
  29. , , python , 。  
  30. , 。 。  
  31.  
  32. """ 
  33.  
  34. if __name__ == '__main__':  
  35.     utils.default_flagfile()  # flag .  
  36.     flags.FLAGS(sys.argv)   # flag args 。  
  37.     logging.setup()           #  
  38.     utils.monkey_patch()  
  39.     server = service.Service.create(binary='nova-compute')# rpc  
  40.     # binary 。  
  41.     #binary = os.path.basename(inspect.stack()[-1][1])  
  42.     # python 。 。  
  43.     # ,binary="nova-compute"  
  44.  
  45.  
  46.     service.serve(server)  
  47.     service.wait()  

3 nova/serviceを開くことができますpyサービスのCreate関数が表示されます.コードは次のとおりです.

  
  
  
  
  1. def create(cls, host=None, binary=None, topic=None, manager=None,  
  2.                report_interval=None, periodic_interval=None):  
  3.         """Instantiates class and passes back application object.  
  4.  
  5.         :param host: defaults to FLAGS.host  
  6.         :param binary: defaults to basename of executable  
  7.         :param topic: defaults to bin_name - 'nova-' part  
  8.         :param manager: defaults to FLAGS.<topic>_manager  
  9.         :param report_interval: defaults to FLAGS.report_interval  
  10.         :param periodic_interval: defaults to FLAGS.periodic_interval  
  11.  
  12.         """ 
  13.         if not host:  
  14.             host = FLAGS.host  
  15.         if not binary:  
  16.             binary = os.path.basename(inspect.stack()[-1][1])  
  17.         if not topic:  
  18.             topic = binary.rpartition('nova-')[2]  
  19.         if not manager:  
  20.             manager = FLAGS.get('%s_manager' % topic, None)  
  21.         if not report_interval:  
  22.             report_interval = FLAGS.report_interval  
  23.         if not periodic_interval:  
  24.             periodic_interval = FLAGS.periodic_interval  
  25.         service_obj = cls(host, binary, topic, manager,  
  26.                           report_interval, periodic_interval)  
  27.  
  28.         return service_obj 

Service.create()
サービスを表示します.py前にクラスの定義について説明します.サービスがクラスであることを発見しました.では、この呼び出しはクラス然呼び出しに属するはずです.createはクラスメソッドです!注意すべき場合、一般的にpythonでクラスのインスタンスの関数を呼び出す場合.初期化されていない場合は、初期化関数が自動的に実行されます.クラス関数にはこの要件はありません.
1、hostの名前を設定します.
       host = FLAGS.host
2、binaryの名前を設定します.
       binary = os.path.basename(inspect.stack()[-1][1])
これはpythonがスタックの内容を表示できるからです.スタックに押し込まれたスクリプトの名前が得られます.
このときbinary="nova-compute"
3、topicの名前を設定:つまりbinaryのnova-を削除します.
         topic = binary.rpartition('nova-')[2]
      topic="compute"
4、managerの設定
     manager = FLAGS.get('%s_manager' % topic, None)
明らかにここで得られたのはcompute_manager.
FLAGSはflagであるため.pyで定義します.だからflagでpyでは以下の定義が得られる.
    DEFINE_string('compute_manager', 'nova.compute.manager.ComputeManager',               'Manager for compute')
ここから分かるようにcompute_managerとはnovaのことですcompute.manager.ComputeManager.
5、コンストラクション関数を使用してオブジェクトを生成します.
        service_obj = cls(host, binary, topic, manager,                           report_interval, periodic_interval)