这里都是通过pdb调试的,pdb教程见这里:http://iceyao.blog.51cto.com/9426658/1599320
# 先从nova-manage这个程序开始 [root@ceph01 ~]# which nova-manage /usr/bin/nova-manage [root@ceph01 ~]# [root@ceph01 ~]# vim /usr/bin/nova-manage #!/usr/bin/python # PBR Generated from u‘console_scripts‘ import sys from nova.cmd.manage import main if __name__ == "__main__": sys.exit(main()) [root@ceph01 ~]# nova-manage service list > /usr/lib/python2.7/site-packages/nova/cmd/manage.py(1402)main() -> ret = fn(*fn_args, **fn_kwargs) (Pdb) l 1397 CONF.print_help() 1398 print(e) 1399 return(1) 1400 try: 1401 import pdb;pdb.set_trace() # 断点设在这里,前面是一些cfg、rpc的过程,这里不介绍 1402 -> ret = fn(*fn_args, **fn_kwargs) 1403 rpc.cleanup() 1404 return(ret) 1405 except Exception: 1406 print(_("Command failed, please check log for more info")) 1407 raise
(Pdb) s # 进入函数内部 --Call-- > /usr/lib/python2.7/site-packages/nova/cmd/manage.py(696)list() -> @args(‘--host‘, metavar=‘<host>‘, help=‘Host‘) (Pdb) l 691 692 693 class ServiceCommands(object): # ServiceCommands类 694 """Enable and disable running services.""" 695 696 -> @args(‘--host‘, metavar=‘<host>‘, help=‘Host‘) 697 @args(‘--service‘, metavar=‘<service>‘, help=‘Nova service‘) 698 def list(self, host=None, service=None): 699 """Show a list of all running services. Filter by host & service 700 name 701 """ (Pdb) 702 servicegroup_api = servicegroup.API() # s进入函数内部,提供三种servicegroup driver(可配置),这里返回db 703 ctxt = context.get_admin_context() 704 services = db.service_get_all(ctxt) # 获得nova service表所有数据 705 services = availability_zones.set_availability_zones(ctxt, services) # 获得的service,按availablity_zone划分 706 if host: 707 services = [s for s in services if s[‘host‘] == host] 708 if service: 709 services = [s for s in services if s[‘binary‘] == service] 710 print_format = "%-16s %-36s %-16s %-10s %-5s %-10s" 711 print(print_format % ( 712 _(‘Binary‘),
713 _(‘Host‘), (Pdb) 714 _(‘Zone‘), 715 _(‘Status‘), 716 _(‘State‘), 717 _(‘Updated_At‘))) 718 for svc in services: 719 alive = servicegroup_api.service_is_up(svc) # 这里有判断服务是否是up的 720 art = (alive and ":-)") or "XXX" 721 active = ‘enabled‘ 722 if svc[‘disabled‘]: 723 active = ‘disabled‘ 724 print(print_format % (svc[‘binary‘], svc[‘host‘], (Pdb) l 725 svc[‘availability_zone‘], active, art, 726 svc[‘updated_at‘]))
-> alive = servicegroup_api.service_is_up(svc) (Pdb) l 714 _(‘Zone‘), 715 _(‘Status‘), 716 _(‘State‘), 717 _(‘Updated_At‘))) 718 for svc in services: 719 -> alive = servicegroup_api.service_is_up(svc) # s,进入service_ip_up函数内部 720 art = (alive and ":-)") or "XXX" 721 active = ‘enabled‘ 722 if svc[‘disabled‘]: 723 active = ‘disabled‘ 724 print(print_format % (svc[‘binary‘], svc[‘host‘], (Pdb) s --Call-- > /usr/lib/python2.7/site-packages/nova/servicegroup/api.py(112)service_is_up() -> def service_is_up(self, member): (Pdb) l 107 ‘%(group_id)s group, service = %(service)s‘) 108 LOG.debug(msg, {‘member_id‘: member_id, ‘group_id‘: group_id, 109 ‘service‘: service}) 110 return self._driver.join(member_id, group_id, service) 111 112 -> def service_is_up(self, member): 113 """Check if the given member is up.""" 114 # NOTE(johngarbutt) no logging in this method, 115 # so this doesn‘t slow down the scheduler 116 return self._driver.is_up(member) # s, 进入is_up函数 117
-> return self._driver.is_up(member) (Pdb) l 111 112 def service_is_up(self, member): 113 """Check if the given member is up.""" 114 # NOTE(johngarbutt) no logging in this method, 115 # so this doesn‘t slow down the scheduler 116 -> return self._driver.is_up(member) 117 118 def leave(self, member_id, group_id): 119 """Explicitly remove the given member from the ServiceGroup 120 monitoring. 121 """ (Pdb) s --Call-- > /usr/lib/python2.7/site-packages/nova/servicegroup/drivers/db.py(55)is_up() -> def is_up(self, service_ref): (Pdb) l 50 report_interval = service.report_interval 51 if report_interval: 52 service.tg.add_timer(report_interval, self._report_state, 53 api.INITIAL_REPORTING_DELAY, service) 54 55 -> def is_up(self, service_ref): 56 """Moved from nova.utils 57 Check whether a service is up based on last heartbeat. 58 """ 59 last_heartbeat = service_ref[‘updated_at‘] or service_ref[‘created_at‘] # 获得服务最后一次更新时间或是第一次创建的时间 60 if isinstance(last_heartbeat, six.string_types): 61 # NOTE(russellb) If this service_ref came in over rpc via 62 # conductor, then the timestamp will be a string and needs to be 63 # converted back to a datetime. 64 last_heartbeat = timeutils.parse_strtime(last_heartbeat) (Pdb) l 65 else: 66 # Objects have proper UTC timezones, but the timeutils comparison 67 # below does not (and will fail) 68 last_heartbeat = last_heartbeat.replace(tzinfo=None) 69 # Timestamps in DB are UTC. 70 elapsed = timeutils.delta_seconds(last_heartbeat, timeutils.utcnow()) # 与当前时间的差值 71 is_up = abs(elapsed) <= self.service_down_time # 如果这个差值小于service_down_time,就认为这个服务是up的,service_down_time是可配置的 72 if not is_up: 73 msg = _(‘Seems service is down. Last heartbeat was %(lhb)s. ‘ 74 ‘Elapsed time is %(el)s‘) 75 LOG.debug(msg, {‘lhb‘: str(last_heartbeat), ‘el‘: str(elapsed)}) (Pdb) 76 return is_up
本文出自 “the-way-to-cloud” 博客,请务必保留此出处http://iceyao.blog.51cto.com/9426658/1727154
nova-manage service list函数调用过程
原文地址:http://iceyao.blog.51cto.com/9426658/1727154