C.2. Red Hat Virtualization User Interface Plugin Lifecycle The basic life cycle of a User Interface Plug-in divides into three stages: Plug-in discovery. Plug-in loading. Plug-in bootstrapping. C.2.1. Red Hat Virtualization User Interface Plug-in Discovery Creating plug-in descriptors is the first step in the plug-in discovery process. Plug-in descriptors contain important plug-in metadata and optional default plug-in-specific configurations. As part of handling administration portal HTML page requests ( HTTP GET ), User Interface plug-in infrastructure attempts to discover and load plug-in descriptors from your local file system. For each plug-in descriptor, the infrastructure also attempts to load corresponding plug-in user configurations used to override default plug-in-specific configurations (if any exist) and tweak plug-in runtime behavior. Plug-in user configuration is optional. After loading descriptors and corresponding user configuration files, oVirt Engine aggregates User Interface plug-in data and embeds it into the administration portal HTML page for runtime evaluation. By default, plug-in descriptors reside in USDENGINE_USR/ui-plug-ins , with a default mapping of ENGINE_USR=/usr/share/ovirt-engine as defined by oVirt Engine local configuration. Plug-in descriptors are expected to comply with JSON format specifications, but plug-in descriptors allow Java/C++ style comments (of both /* and // varieties) in addition to the JSON format specifications. By default, plug-in user configuration files reside in USDENGINE_ETC/ui-plug-ins , with a default mapping of ENGINE_ETC=/etc/ovirt-engine as defined by oVirt Engine local configuration. Plug-in user configuration files are expected to comply with same content format rules as plug-in descriptors. Note Plug-in user configuration files generally follow the <descriptorFileName>-config.json naming convention. C.2.2. Red Hat Virtualization User Interface Plug-in Loading After a plug-in has been discovered and its data is embedded into the administration portal HTML page, administration portal tries to load the plug-in as part of application startup (unless you have configured it not to load as part of application startup). For each plug-in that has been discovered, the administration portal creates an HTML iframe element that is used to load its host page. The plug-in host page is necessary to begin the plug-in bootstrap process, which (the bootstrap process) is used to evaluate the plug-in code in the context of the plug-in's iframe element. User interface plug-in infrastructure supports serving plug-in resource files (such as the plug-in host page) from the local file system. The plug-in host page is loaded into the iframe element and the plug-in code is evaluated. After the plug-in code is evaluated, the plug-in communicates with the administration portal by means of the plug-in API. C.2.3. Red Hat Virtualization User Interface Plug-in Bootstrapping A typical plug-in bootstrap sequence consists of following steps: Plug-in Bootstrap Sequence Obtain pluginApi instance for the given plug-in Obtain runtime plug-in configuration object (optional) Register relevant event handler functions Notify UI plug-in infrastructure to proceed with plug-in initialization The following code snippet illustrates the above mentioned steps in practice: // 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();

Commands:
// 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();