日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

openstack nova 源码分析3-nova目录下的service.py

發布時間:2025/5/22 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 openstack nova 源码分析3-nova目录下的service.py 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

nova下的service.py的源碼,今天閱讀之后 直接就把我理解的以注釋的形式添加到了源碼中,有些地方不好或者是錯了,希望大家幫我指出!

  • ?
  • import?inspect ?
  • import?os ?
  • ?
  • import?eventlet ?
  • import?greenlet ?
  • ?
  • from?nova?import?context ?
  • from?nova?import?db ?
  • from?nova?import?exception ?
  • from?nova?import?flags ?
  • from?nova?import?log?as?logging ?
  • from?nova?import?rpc ?
  • from?nova?import?utils ?
  • from?nova?import?version ?
  • from?nova?import?wsgi ?
  • ?
  • ?
  • LOG?=?logging.getLogger('nova.service') ?
  • ?
  • FLAGS?=?flags.FLAGS#flags.py中有一句?FLAGS?=?FlagValues(),那么直接查看FlagValues()這個類,會發現這個類是繼承于gflags.FlagValues. ?
  • ?
  • flags.DEFINE_integer('report_interval',?10, ?
  • ?????????????????????'seconds?between?nodes?reporting?state?to?datastore', ?
  • ?????????????????????lower_bound=1)#參數名稱,默認值和簡短說明 ?
  • flags.DEFINE_integer('periodic_interval',?60, ?
  • ?????????????????????'seconds?between?running?periodic?tasks', ?
  • ?????????????????????lower_bound=1) ?
  • flags.DEFINE_string('ec2_listen',?"0.0.0.0", ?
  • ????????????????????'IP?address?for?EC2?API?to?listen') ?
  • flags.DEFINE_integer('ec2_listen_port',?8773,?'port?for?ec2?api?to?listen') ?
  • flags.DEFINE_string('osapi_listen',?"0.0.0.0", ?
  • ????????????????????'IP?address?for?OpenStack?API?to?listen') ?
  • flags.DEFINE_integer('osapi_listen_port',?8774,?'port?for?os?api?to?listen') ?
  • flags.DEFINE_string('api_paste_config',?"api-paste.ini", ?
  • ????????????????????'File?name?for?the?paste.deploy?config?for?nova-api') ?
  • ?
  • #Launcher?類?包含run_server?,launch_server,stop,wait?4個函數,其實功能非常簡單,首先初始化Launcher將self_services弄成一個空列表 ?
  • #run_server就是開始和等待一個server的完成,launcher_server就是將該server加入到該類初始化的列表中, ?
  • #stop?就是for循環遍歷self_services列表中的服務然后一個一個的kill掉 ?
  • #wait?函數就是?Waits?until?all?services?have?been?stopped ?
  • class?Launcher(object): ?
  • ????"""Launch?one?or?more?services?and?wait?for?them?to?complete."""?
  • ?
  • ????def?__init__(self): ?
  • ????????"""Initialize?the?service?launcher. ?
  • ?
  • ????????:returns:?None ?
  • ?
  • ????????"""?
  • ????????self._services?=?[] ?
  • ?
  • ????@staticmethod?
  • ????def?run_server(server): ?
  • ????????"""Start?and?wait?for?a?server?to?finish. ?
  • ?
  • ????????:param?service:?Server?to?run?and?wait?for. ?
  • ????????:returns:?None ?
  • ?
  • ????????"""?
  • ????????server.start() ?
  • ????????server.wait() ?
  • ?
  • ????def?launch_server(self,?server):#在360行被調用 ?
  • ????????"""Load?and?start?the?given?server. ?
  • ?
  • ????????:param?server:?The?server?you?would?like?to?start. ?
  • ????????:returns:?None ?
  • ?
  • ????????"""?
  • ????????gt?=?eventlet.spawn(self.run_server,?server) ?
  • ????????self._services.append(gt) ?
  • ?
  • ????def?stop(self): ?
  • ????????"""Stop?all?services?which?are?currently?running. ?
  • ?
  • ????????:returns:?None ?
  • ?
  • ????????"""?
  • ????????for?service?in?self._services: ?
  • ????????????service.kill() ?
  • ?
  • ????def?wait(self): ?
  • ????????"""Waits?until?all?services?have?been?stopped,?and?then?returns. ?
  • ?
  • ????????:returns:?None ?
  • ?
  • ????????"""?
  • ????????for?service?in?self._services: ?
  • ????????????try: ?
  • ????????????????service.wait() ?
  • ????????????except?greenlet.GreenletExit: ?
  • ????????????????pass?
  • ?
  • ?
  • class?Service(object): ?
  • ????"""Service?object?for?binaries?running?on?hosts. ?
  • ?
  • ????A?service?takes?a?manager?and?enables?rpc?by?listening?to?queues?based ?
  • ????on?topic.?It?also?periodically?runs?tasks?on?the?manager?and?reports ?
  • ????it?state?to?the?database?services?table."""?
  • ?
  • ????def?__init__(self,?host,?binary,?topic,?manager,?report_interval=None, ?
  • ?????????????????periodic_interval=None,?*args,?**kwargs): ?
  • ????????self.host?=?host ?
  • ????????self.binary?=?binary ?
  • ????????self.topic?=?topic ?
  • ????????#動態的生成manager類,并動態生成實例 ?
  • ????????self.manager_class_name?=?manager#在create函數中指定 ?
  • ????????manager_class?=?utils.import_class(self.manager_class_name)#動態的import該類 ?
  • ????????self.manager?=?manager_class(host=self.host,?*args,?**kwargs)#動態的生成實例 ?
  • ????????#??設置參數:應該是服務間隔時間之類的。 ?
  • ????????self.report_interval?=?report_interval ?
  • ????????self.periodic_interval?=?periodic_interval ?
  • ????????#設置多出來的一些參數。 ?
  • ????????super(Service,?self).__init__(*args,?**kwargs) ?
  • ????????self.saved_args,?self.saved_kwargs?=?args,?kwargs ?
  • ????????#設置一個列表?不知道是不是后面有需要用的地方?果然在185行?發現了 ?
  • ????????self.timers?=?[] ?
  • ?
  • ????def?start(self): ?
  • ????????#設置版本 ?
  • ????????vcs_string?=?version.version_string_with_vcs() ?
  • ????????logging.audit(_('Starting?%(topic)s?node?(version?%(vcs_string)s)'), ?
  • ??????????????????????{'topic':?self.topic,?'vcs_string':?vcs_string}) ?
  • ????????#初始化host ?
  • ????????self.manager.init_host() ?
  • ???????? ?
  • ????????self.model_disconnected?=?False?
  • ????????ctxt?=?context.get_admin_context() ?
  • ????????try: ?
  • ????????????service_ref?=?db.service_get_by_args(ctxt, ?
  • ?????????????????????????????????????????????????self.host, ?
  • ?????????????????????????????????????????????????self.binary) ?
  • ????????????self.service_id?=?service_ref['id'] ?
  • ????????except?exception.NotFound: ?
  • ????????????self._create_service_ref(ctxt)#該函數位于187行 ?
  • ?
  • ????????if?'nova-compute'?==?self.binary: ?
  • ????????????self.manager.update_available_resource(ctxt) ?
  • ?
  • ????????self.conn?=?rpc.create_connection(new=True) ?
  • ????????logging.debug("Creating?Consumer?connection?for?Service?%s"?% ?
  • ??????????????????????self.topic) ?
  • ?
  • ????????#?Share?this?same?connection?for?these?Consumers ?
  • ????????self.conn.create_consumer(self.topic,?self,?fanout=False) ?
  • ?
  • ????????node_topic?=?'%s.%s'?%?(self.topic,?self.host)#節點的topic?包括了topic?和?host ?
  • ????????self.conn.create_consumer(node_topic,?self,?fanout=False) ?
  • ?
  • ????????self.conn.create_consumer(self.topic,?self,?fanout=True) ?
  • ?
  • ????????#?Consume?from?all?consumers?in?a?thread ?
  • ????????self.conn.consume_in_thread() ?
  • ?
  • ????????if?self.report_interval: ?
  • ????????????pulse?=?utils.LoopingCall(self.report_state)#在265中可以找到report_state?他的作用是在存儲中更新服務的狀態 ?
  • ????????????pulse.start(interval=self.report_interval,?now=False) ?
  • ????????????self.timers.append(pulse) ?
  • ?
  • ????????if?self.periodic_interval: ?
  • ????????????periodic?=?utils.LoopingCall(self.periodic_tasks)#在260行發現?Periodic_tasks任務在一個周期性間隔跑 ?
  • ????????????periodic.start(interval=self.periodic_interval,?now=False) ?
  • ????????????self.timers.append(periodic) ?
  • ?
  • ????def?_create_service_ref(self,?context): ?
  • ????????zone?=?FLAGS.node_availability_zone ?
  • ????????service_ref?=?db.service_create(context, ?
  • ????????????????????????????????????????{'host':?self.host, ?
  • ?????????????????????????????????????????'binary':?self.binary, ?
  • ?????????????????????????????????????????'topic':?self.topic, ?
  • ?????????????????????????????????????????'report_count':?0, ?
  • ?????????????????????????????????????????'availability_zone':?zone}) ?
  • ????????self.service_id?=?service_ref['id']#猜測應該是獲取當前服務的id ?
  • ?
  • ????def?__getattr__(self,?key): ?
  • ????????manager?=?self.__dict__.get('manager',?None) ?
  • ????????return?getattr(manager,?key) ?
  • ?
  • ????@classmethod?
  • ????def?create(cls,?host=None,?binary=None,?topic=None,?manager=None, ?
  • ???????????????report_interval=None,?periodic_interval=None): ?
  • ????????"""Instantiates?class?and?passes?back?application?object. ?
  • ?
  • ????????:param?host:?defaults?to?FLAGS.host ?
  • ????????:param?binary:?defaults?to?basename?of?executable ?
  • ????????:param?topic:?defaults?to?bin_name?-?'nova-'?part ?
  • ????????:param?manager:?defaults?to?FLAGS.<topic>_manager ?
  • ????????:param?report_interval:?defaults?to?FLAGS.report_interval ?
  • ????????:param?periodic_interval:?defaults?to?FLAGS.periodic_interval ?
  • ?
  • ????????"""?
  • ????????if?not?host: ?
  • ????????????host?=?FLAGS.host ?
  • ????????if?not?binary: ?
  • ????????????binary?=?os.path.basename(inspect.stack()[-1][1]) ?
  • ????????if?not?topic: ?
  • ????????????topic?=?binary.rpartition('nova-')[2] ?
  • ????????if?not?manager: ?
  • ????????????manager?=?FLAGS.get('%s_manager'?%?topic,?None) ?
  • ????????if?not?report_interval: ?
  • ????????????report_interval?=?FLAGS.report_interval ?
  • ????????if?not?periodic_interval: ?
  • ????????????periodic_interval?=?FLAGS.periodic_interval ?
  • ????????service_obj?=?cls(host,?binary,?topic,?manager, ?
  • ??????????????????????????report_interval,?periodic_interval)#此處?調用的是該類的init的默認函數????? ?
  • ?
  • ????????return?service_obj ?
  • ?
  • ????def?kill(self): ?
  • ????????"""Destroy?the?service?object?in?the?datastore."""?
  • ????????self.stop() ?
  • ????????try: ?
  • ????????????db.service_destroy(context.get_admin_context(),?self.service_id) ?
  • ????????except?exception.NotFound: ?
  • ????????????logging.warn(_('Service?killed?that?has?no?database?entry')) ?
  • ?
  • ????def?stop(self): ?
  • ????????#?Try?to?shut?the?connection?down,?but?if?we?get?any?sort?of ?
  • ????????#?errors,?go?ahead?and?ignore?them..?as?we're?shutting?down?anyway ?
  • ????????try: ?
  • ????????????self.conn.close() ?
  • ????????except?Exception: ?
  • ????????????pass?
  • ????????for?x?in?self.timers:???#遍歷曾經添加到self.timers中的每一個“間隔”(不是很清楚)?然后將其stop ?
  • ????????????try: ?
  • ????????????????x.stop() ?
  • ????????????except?Exception: ?
  • ????????????????pass?
  • ????????self.timers?=?[]?#重新將self.timers置空 ?
  • ?
  • ????def?wait(self): ?
  • ????????for?x?in?self.timers: ?
  • ????????????try: ?
  • ????????????????x.wait() ?
  • ????????????except?Exception: ?
  • ????????????????pass?
  • ?
  • ????def?periodic_tasks(self): ?
  • ????????"""Tasks?to?be?run?at?a?periodic?interval."""?
  • ????????#任務在一個周期性間隔跑 ?
  • ????????self.manager.periodic_tasks(context.get_admin_context()) ?
  • ?
  • ????def?report_state(self): ?
  • ????????"""Update?the?state?of?this?service?in?the?datastore."""?
  • ????????#在數據存儲更新服務的狀態。 ?
  • ????????ctxt?=?context.get_admin_context() ?
  • ????????try: ?
  • ????????????try: ?
  • ????????????????service_ref?=?db.service_get(ctxt,?self.service_id) ?
  • ????????????except?exception.NotFound: ?
  • ????????????????logging.debug(_('The?service?database?object?disappeared,?'?
  • ????????????????????????????????'Recreating?it.')) ?
  • ????????????????self._create_service_ref(ctxt) ?
  • ????????????????service_ref?=?db.service_get(ctxt,?self.service_id) ?
  • ?
  • ????????????db.service_update(ctxt, ?
  • ?????????????????????????????self.service_id, ?
  • ?????????????????????????????{'report_count':?service_ref['report_count']?+?1}) ?
  • ?
  • ????????????#?TODO(termie):?make?this?pattern?be?more?elegant. ?
  • ????????????if?getattr(self,?'model_disconnected',?False): ?
  • ????????????????self.model_disconnected?=?False?
  • ????????????????logging.error(_('Recovered?model?server?connection!')) ?
  • ?
  • ????????#?TODO(vish):?this?should?probably?only?catch?connection?errors ?
  • ????????except?Exception:??#?pylint:?disable=W0702 ?
  • ????????????if?not?getattr(self,?'model_disconnected',?False): ?
  • ????????????????self.model_disconnected?=?True?
  • ????????????????logging.exception(_('model?server?went?away')) ?
  • ?
  • ?
  • class?WSGIService(object): ?
  • ????"""Provides?ability?to?launch?API?from?a?'paste'?configuration."""?
  • ????#提供能夠從一個‘paste’配置啟動api的服務 ?
  • ?
  • ????def?__init__(self,?name,?loader=None): ?
  • ????????"""Initialize,?but?do?not?start?the?WSGI?server. ?
  • ?
  • ????????:param?name:?The?name?of?the?WSGI?server?given?to?the?loader. ?
  • ????????:param?loader:?Loads?the?WSGI?application?using?the?given?name. ?
  • ????????:returns:?None ?
  • ?
  • ????????"""?
  • ????????#初始化?但是并沒有開是wsgi的服務。 ?
  • ????????self.name?=?name ?
  • ????????self.loader?=?loader?or?wsgi.Loader() ?
  • ????????self.app?=?self.loader.load_app(name)#將wsgi服務的名字給到self.loader,然后用那名字將其?裝載到wsgi?application ?
  • ????????self.host?=?getattr(FLAGS,?'%s_listen'?%?name,?"0.0.0.0")?#返回主機host?getattr?Found?at:?__builtin__ ?
  • ????????#getattr(object,?name[,?default])?->?value得知返回的是value ?
  • ?
  • ?
  • ????????self.port?=?getattr(FLAGS,?'%s_listen_port'?%?name,?0)#端口?port ?
  • ????????self.server?=?wsgi.Server(name, ?
  • ??????????????????????????????????self.app, ?
  • ??????????????????????????????????host=self.host, ?
  • ??????????????????????????????????port=self.port) ?
  • ?
  • ????def?start(self): ?
  • ????????"""Start?serving?this?service?using?loaded?configuration. ?
  • ?
  • ????????Also,?retrieve?updated?port?number?in?case?'0'?was?passed?in,?which ?
  • ????????indicates?a?random?port?should?be?used. ?
  • ?
  • ????????:returns:?None ?
  • ?
  • ????????"""?
  • ????????self.server.start() ?
  • ????????self.port?=?self.server.port ?
  • ?
  • ????def?stop(self): ?
  • ????????"""Stop?serving?this?API. ?
  • ?
  • ????????:returns:?None ?
  • ?
  • ????????"""?
  • ????????self.server.stop() ?
  • ?
  • ????def?wait(self): ?
  • ????????"""Wait?for?the?service?to?stop?serving?this?API. ?
  • ?
  • ????????:returns:?None ?
  • ?
  • ????????"""?
  • ????????self.server.wait() ?
  • ?
  • ?
  • #?NOTE(vish):?the?global?launcher?is?to?maintain?the?existing ?
  • #?????????????functionality?of?calling?service.serve?+ ?
  • #?????????????service.wait ?
  • _launcher?=?None?
  • ?
  • ?
  • def?serve(*servers): ?
  • ????global?_launcher ?
  • ????if?not?_launcher: ?
  • ????????_launcher?=?Launcher()?#s實例化Launcher ?
  • ????for?server?in?servers: ?
  • ????????_launcher.launch_server(server) ?
  • ?
  • ?
  • def?wait(): ?
  • ????#?After?we've?loaded?up?all?our?dynamic?bits,?check ?
  • ????#?whether?we?should?print?help ?
  • ???? ?
  • ?
  • ????#flags.py中?有一句 ?
  • ????#FLAGS?=?FlagValues(),那么直接查看FlagValues()這個類,這個類是繼承于gflags.FlagValues. ?
  • ?
  • ?
  • ????flags.DEFINE_flag(flags.HelpFlag()) ?
  • ????flags.DEFINE_flag(flags.HelpshortFlag()) ?
  • ????flags.DEFINE_flag(flags.HelpXMLFlag()) ?
  • ????FLAGS.ParseNewFlags() ?
  • ????logging.debug(_('Full?set?of?FLAGS:')) ?
  • ????for?flag?in?FLAGS: ?
  • ????????flag_get?=?FLAGS.get(flag,?None) ?
  • ????????logging.debug('%(flag)s?:?%(flag_get)s'?%?locals()) ?
  • ????try: ?
  • ????????_launcher.wait() ?
  • ????except?KeyboardInterrupt: ?
  • ????????_launcher.stop() ?
  • ?

    轉載于:https://blog.51cto.com/brucemars/965124

    總結

    以上是生活随笔為你收集整理的openstack nova 源码分析3-nova目录下的service.py的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。