OpenStack之Horizon源码架构浅析(二)之启动流程分析(简约版)

horizon启动过程

主要的文件是:

openstack_dashborad.urls.py(OpenStack Dashboard的URL patterns)、

openstack_dashborad.settings.py(配置文件)、

horizon.base.py(基础库)

base.py实现了一套dashboard/panel注册、动态加载机制,使得Horizon面板上所有的dashboard都是”可插拔”的,所有的panel都是”动态加载”的


-3、加载horizon项目,获取urls的值,Horizon.__init__.py的urls = Horizon._lazy_urls值,调用horizon.base.Site._lazy_urls(self)方法。


-2、horizon.base.Site._lazy_urls(self)这个是一个延迟方法,URL模式的延迟加载(需要时加载),避免了试图评估的问题设置模块之前的URLconf已经被加载。


-1、horizon.base.Site._lazy_urls(self)返回一个函数LazyURLPattern(url_patterns),参数为horizon.base.Site._lazy_urls.url_patterns()方法。


0、开始请求horizon


1、根据Django内部规则,先获取URL,从openstack_dashboard.urls.py中的patterns容器中取到url(r'', include(horizon.urls))。



2、URL认证,设置openstack_auth.urls,include(openstack_auth.urls)时会执行horizon.base.Site._lazy_urls.url_patterns()方法。



3、horizon.base.Site._lazy_urls.url_patterns()方法返回horizon.Site._urls()



4、horizon.base.Site._urls()获取urlpatterns值,使用 horizon.base.HorizonComponent._get_default_urlpatterns(self)方法



5、horizon.base.Site._autodiscover()遍历settings.INSTALLED_APPS发现dashboard和panel,执行每个APP下的dashboard.py和panel.py。


6、horizon.base.Site._autodiscover()把所有获取到的dashboard都注册,存放到_registry中。
注册是openstack_dashboard.dashboards.project.dashboards.py中的horizon.register(Project)注册。


7、dashboard注册过程:horizon.base.Site.register(self, dashboard)使用horizon.base.Registry._register(self, cls)注册一个dashboard类,返回一个类对象并实例化一个dashboard类。



8、horizon.base.Site._autodiscover()根据注册表self._register取出dashboards,注册每个dashboards中的panel


9、horizon.base.Dashborad._autodiscover()迭代panel,转化成PanelGroups并实例化PanelGroups。
加载PanelGroups中的panel,然后注册。


10、panel注册过程:
horizon.base.Dashborad.register(cls, panel)
调用horizon.base.Site.register_panel(self,dashborad,panel),然后加载panel相关的templates,
horizon.base.Site.register_panel(self,dashborad,panel)-->
horizon.base.Site.registered(self,dashborad)-->
horizon.base.Registery._registerd(self,cls)返回一个dashboard对象
panel注册结束.


11、加载基于插件的panel配置,horizon.base.Site._load_panel_customization()以插件为基础的panel配置,支持添加、删除和设置默认面板仪表板。
它还支持注册一个面板组。
它调用horizon.base.Site._conf(self)获取配置,返回里实例化了的horizon.conf.__init__.LazySettings()设置类。


12、根据注册的值,编译动态URLconf配置。
返回urlpatterns, self.namespace, self.slug这三个值,分别是URL、名字、slug。



总结:
开始请求horizon之前先把URL传入,准备好。
请求后,获取urlpatterns值(URL),
根据urlpatterns值获取配置文件中的INSTALLED_APPS容器,
根据容器中的配置注册dashborad,再根据dashborad注册该dashborad下的panel(最复杂的部分)。
最后载入panel的插件和配置。


你可能感兴趣的:(OpenStack,OpenStack,horizon,源码)