生活随笔
收集整理的這篇文章主要介紹了
openstack nova 源码分析3-nova目录下的service.py
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
nova下的service.py的源碼,今天閱讀之后 直接就把我理解的以注釋的形式添加到了源碼中,有些地方不好或者是錯了,希望大家?guī)臀抑赋?#xff01;
?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.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') ??????class?Launcher(object): ???????????def?__init__(self): ??????????????????????self._services?=?[] ??????@staticmethod?????def?run_server(server): ???????????????????????server.start() ?????????server.wait() ??????def?launch_server(self,?server):???????????????????????gt?=?eventlet.spawn(self.run_server,?server) ?????????self._services.append(gt) ??????def?stop(self): ??????????????????????for?service?in?self._services: ?????????????service.kill() ??????def?wait(self): ??????????????????????for?service?in?self._services: ?????????????try: ?????????????????service.wait() ?????????????except?greenlet.GreenletExit: ?????????????????pass???class?Service(object): ???????????????def?__init__(self,?host,?binary,?topic,?manager,?report_interval=None, ??????????????????periodic_interval=None,?*args,?**kwargs): ?????????self.host?=?host ?????????self.binary?=?binary ?????????self.topic?=?topic ??????????????????self.manager_class_name?=?manager?????????manager_class?=?utils.import_class(self.manager_class_name)?????????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 ??????????????????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}) ??????????????????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)??????????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) ???????????????????self.conn.create_consumer(self.topic,?self,?fanout=False) ??????????node_topic?=?'%s.%s'?%?(self.topic,?self.host)?????????self.conn.create_consumer(node_topic,?self,?fanout=False) ??????????self.conn.create_consumer(self.topic,?self,?fanout=True) ???????????????????self.conn.consume_in_thread() ??????????if?self.report_interval: ?????????????pulse?=?utils.LoopingCall(self.report_state)?????????????pulse.start(interval=self.report_interval,?now=False) ?????????????self.timers.append(pulse) ??????????if?self.periodic_interval: ?????????????periodic?=?utils.LoopingCall(self.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']??????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): ???????????????????????????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)??????????return?service_obj ??????def?kill(self): ??????????????????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: ?????????????self.conn.close() ?????????except?Exception: ?????????????pass?????????for?x?in?self.timers:????????????????try: ?????????????????x.stop() ?????????????except?Exception: ?????????????????pass?????????self.timers?=?[]???????def?wait(self): ?????????for?x?in?self.timers: ?????????????try: ?????????????????x.wait() ?????????????except?Exception: ?????????????????pass??????def?periodic_tasks(self): ???????????????????????????self.manager.periodic_tasks(context.get_admin_context()) ??????def?report_state(self): ???????????????????????????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}) ???????????????????????????if?getattr(self,?'model_disconnected',?False): ?????????????????self.model_disconnected?=?False?????????????????logging.error(_('Recovered?model?server?connection!')) ???????????????????except?Exception:???????????????if?not?getattr(self,?'model_disconnected',?False): ?????????????????self.model_disconnected?=?True?????????????????logging.exception(_('model?server?went?away')) ???class?WSGIService(object): ????????????????def?__init__(self,?name,?loader=None): ?????????????????????????????????self.name?=?name ?????????self.loader?=?loader?or?wsgi.Loader() ?????????self.app?=?self.loader.load_app(name)?????????self.host?=?getattr(FLAGS,?'%s_listen'?%?name,?"0.0.0.0")?????????????????????self.port?=?getattr(FLAGS,?'%s_listen_port'?%?name,?0)?????????self.server?=?wsgi.Server(name, ???????????????????????????????????self.app, ???????????????????????????????????host=self.host, ???????????????????????????????????port=self.port) ??????def?start(self): ?????????????????????????self.server.start() ?????????self.port?=?self.server.port ??????def?stop(self): ??????????????????????self.server.stop() ??????def?wait(self): ??????????????????????self.server.wait() ??????_launcher?=?None???def?serve(*servers): ?????global?_launcher ?????if?not?_launcher: ?????????_launcher?=?Launcher()??????for?server?in?servers: ?????????_launcher.launch_server(server) ???def?wait(): ??????????????? ??????????????????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() ? ?
轉(zhuǎn)載于:https://blog.51cto.com/brucemars/965124
總結(jié)
以上是生活随笔為你收集整理的openstack nova 源码分析3-nova目录下的service.py的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。