C.2. Red Hat Virtualization User Interface Plugin Lifecycle

用户界面插件的基本生命周期分为三个阶段:

  • 插件发现。
  • 插件加载。
  • 插件引导.

C.2.1. Red Hat Virtualization User Interface Plug-in Discovery

创建插件描述符是插件发现过程中的第一个步骤。插件描述符包含重要的插件元数据和可选的默认插件特定配置。

作为处理管理门户 HTML 页面请求(HTTP GET)的一部分,用户界面插件基础架构会尝试从本地文件系统发现和加载插件描述符。对于每个插件描述符,基础架构还会尝试加载用于覆盖默认插件配置(若有存在)和 tweak 插件运行时行为的相应插件用户配置。插件用户配置是可选的。在载入描述符和相应的用户配置文件后,oVirt Engine 会聚合用户界面插件数据,并将其嵌入到管理门户 HTML 页面中以进行运行时评估。

默认情况下,插件描述符位于 $ENGINE_USR/ui-plug-ins 中,默认映射 ENGINE_USR=/usr/share/ovirt-engine,如 oVirt Engine 本地配置定义。插件描述符预期遵循 JSON 格式规格,但插件描述符除了 JSON 格式规格外,还允许 Java/C++ 风格注释( /*// varieties)。

默认情况下,插件用户配置文件位于 $ENGINE_ETC/ui-plug-ins 中,默认映射 ENGINE_ETC=/etc/ovirt-engine (由 oVirt Engine 本地配置定义)。插件用户配置文件应该遵循与插件描述符相同的内容格式规则。

注意

插件用户配置文件通常遵循 < descriptorFileName>-config.json 命名规则。

C.2.2. Red Hat Virtualization User Interface Plug-in Loading

在发现插件后,其数据被嵌入到管理门户 HTML 页面中,管理门户会尝试将插件加载为应用程序启动的一部分(除非您将其配置为应用启动的一部分)。

对于已发现的每个插件,管理门户会创建一个 HTML iframe 元素,用于加载其主机页面。需要插件主机页面来启动插件 bootstrap 过程,该过程( bootstrap 过程)用于在插件的 iframe 元素的上下文中评估插件代码。用户界面插件基础架构支持本地文件系统中的 serving 插件资源文件(如插件主机页面)。插件主机页面加载到 iframe 元素中,并评估插件代码。评估了插件代码后,插件通过插件 API 与管理门户通信。

C.2.3. Red Hat Virtualization User Interface Plug-in Bootstrapping

典型的插件 bootstrap 序列由以下步骤组成:

插件 Bootstrap 序列

  1. 获取给定插件的 pluginApi 实例
  2. 获取运行时插件配置对象(可选)
  3. 注册相关事件处理程序功能
  4. 通知 UI 插件基础架构以继续插件初始化

以下代码片段演示了实践中提到的步骤:

// Access plug-in API using 'parent' due to this code being evaluated within the context of an iframe element.
// As 'parent.pluginApi' is subject to Same-Origin Policy, this will only work when WebAdmin HTML page and plug-in
// host page are served from same origin. WebAdmin HTML page and plug-in host page will always be on same origin
// when using UI plug-in infrastructure support to serve plug-in resource files.
var api = parent.pluginApi('MyPlugin');

// Runtime configuration object associated with the plug-in (or an empty object).
var config = api.configObject();

// Register event handler function(s) for later invocation by UI plug-in infrastructure.
api.register({
	    // UiInit event handler function.
		UiInit: function() {
				// Handle UiInit event.
					window.alert('Favorite music band is ' + config.band);
					    }
});

// Notify UI plug-in infrastructure to proceed with plug-in initialization.
api.ready();