------=_Part_2529172_1797931071.1348259851826
Content-Type: multipart/alternative;
boundary="----=_Part_2529173_585113360.1348259851826"
------=_Part_2529173_585113360.1348259851826
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 7bit
Hi guys,
it's been a while but here comes the latest revision of UI Plugins proof-of-concept
patch (please find it attached).
This revision was originally meant to focus solely on server-side components of the plugin
infrastructure. However, I ended up implementing all the major concepts and ideas as
discussed on engine-devel mailing list, impacting both client-side and server-side parts
of the plugin infrastructure. As a result, UI plugin infrastructure should be pretty much
complete now, so we can focus on specific plugin API features in upcoming PoC revisions.
There's a whole bunch of changes and improvements in this revision, so I'll try to
cover all the relevant parts step by step. If you have any comments, questions or ideas,
please let me know!
So here we go... (or if you just want to get the patch, find the link at the end of this
message)
0. Added new Engine configuration values
UI plugin data path is represented by ConfigValues.UIPluginDataPath enum option
("UIPluginDataPath" in vdc_options table), and resolved relative to
ConfigValues.DataDir if possible. Following (default) values:
* UIPluginDataPath = ui-plugins
* DataDir = /usr/share/ovirt-engine
result in UI plugin data path: /usr/share/ovirt-engine/ui-plugins
UI plugin config path is represented by ConfigValues.UIPluginConfigPath enum option
("UIPluginConfigPath" in vdc_options table), and resolved relative to
ConfigValues.ConfigDir if possible. Following (default) values:
* UIPluginConfigPath = ui-plugins
* ConfigDir = /etc/ovirt-engine
result in UI plugin config path: /etc/ovirt-engine/ ui-plugins
1. Processing UI plugin data on the server
PluginDataManager is the class responsible for reading, validating and caching UI plugin
descriptor/configuration data on the server (Engine). It has two main responsibilities:
* return a snapshot of currently valid plugin data ( getCurrentData method )
* reload plugin data from local file system if necessary ( reloadData method)
The reloadData method doesn't modify "live" plugin data directly. Instead,
it creates a local working copy of current plugin data, updates this copy as it
reads/validates plugin descriptor and configuration files, and attempts to update
"live" plugin data through conditional reference re-assignment (using
java.util.concurrent.atomic.AtomicReference.compareAndSet method).
In other words, reloadData method makes no attempts with regard to Java lock-based
synchronization, in favor of dealing with "live" data through AtomicReference
(reference that involves atomic volatile reads and writes):
* In the best case, a thread will succeed in updating "live" data (
AtomicReference.compareAndSet == true), which means that "live" data remained
unchanged since this thread acquired a reference of current plugin data.
* In the worst case, a thread will NOT succeed in updating "live" data (
AtomicReference.compareAndSet == false), which means that "live" data was
already changed by another thread since this thread acquired a reference of current plugin
data.
In my opinion, when dealing with external resources like the local file system, this is a
good compromise between performance and up-to-date data. While we might not get
"completely-up-to-date" data at the given point in time ( reloadData +
getCurrentData ), we are guaranteed to get "recently-up-to-date" and consistent
data. In other words, the requirement of "completely-up-to-date" data would
involve synchronized statements that would hurt performance. In my (very humble) opinion,
the benefit of having "completely-up-to-date" data , at the cost of reduced
performance, is not really worth it, especially in our case when the user can just hit
refresh (F5) to reload WebAdmin and its plugin data.
Plugin descriptor files are expected to be placed in UI plugin data path , for example:
/usr/share/ovirt-engine/ui-plugins/foo.json
Following descriptor file attributes are implemented and recognized by the plugin
infrastructure:
* name : A name that uniquely identifies the plugin (required attribute).
* url : URL of plugin host page that invokes the plugin code (required attribute).
* config : Default configuration object associated with the plugin (optional
attribute).
* resourcePath : Path to plugin static resources, relative to UI plugin data path
(optional attribute). This is used when serving plugin files through Engine
PluginResourceServlet (more on this below).
Plugin configuration files are expected to be placed in UI plugin config path, for
example: /etc/engine/ui-plugins/foo-config.json
Note that plugin configuration files follow the
"<descriptorFileName>-config.json" convention.
Following configuration file attributes are implemented and recognized by the plugin
infrastructure:
* config : Custom configuration object associated with the plugin (optional
attribute). This overrides the default plugin descriptor configuration, if any.
* enabled : Indicates whether the plugin should be loaded on WebAdmin startup
(optional attribute). Default value is 'true'.
* order : Defines the relative order in which the plugin will be loaded on WebAdmin
startup (optional attribute). Default value is Integer.MAX_VALUE (lowest order).
The concept of merging custom configuration ( config attribute in foo-config.json ), if
any, on top of default configuration ( config attribute in foo.json ), if any, remains
unchanged. This makes the plugin configuration quite flexible - in my opinion, the added
complexity of handling/merging such configuration is definitely worth the effort.
The enabled attribute is straight-forward, allowing users to turn the given plugin off, if
necessary. In future, users should still be able to load such plugins through WebAdmin
GUI.
The order attribute controls the order in which plugins are loaded on WebAdmin startup.
Since plugin resources are fetched asynchronously by the browser, this is basically a way
of imposing some degree of determinism in the "generally-non-deterministic"
plugin environment, which is helpful when troubleshooting problems with multiple plugins.
This attribute is also helpful due to file listing methods in java.io.File giving no
guarantees that files would be listed in any particular order (otherwise we could just go
for the "NN-<descriptorFileName>.json" convention, with NN being the order
number).
2. Modified behavior of WebadminDynamicHostingServlet
WebadminDynamicHostingServlet is the servlet used to serve WebAdmin application host page
(HTML page that bootstraps WebAdmin JavaScript code).
In addition to its former behavior, as part of handling the given request,
WebadminDynamicHostingServlet :
* reloads descriptor/configuration data from local file system if necessary, and
obtains a snapshot of currently valid plugin data (
PluginDataManager.reloadAndGetCurrentData )
* embeds all plugin meta-data, suitable for use in client-side plugin infrastructure ,
into WebAdmin host page as "pluginDefinitions" JavaScript a rray (
PluginDefinitions )
As a result, reloading UI plugin descriptor/configuration data is as simple as refreshing
(F5) WebAdmin application in the browser (no need to restart Engine).
3. Added servlet for serving plugin static resources
PluginResourceServlet is the servlet used to serve UI plugin static files (plugin host
page, 3rd party JavaScript, etc.) from the local file system.
For example, requesting URL:
*
http://<EngineManagerHost>:8700/webadmin/webadmin/plugin/foo/content/start.html
will send the content of:
* /usr/share/ovirt-engine/ui-plugins/<resourcePath>/ content/start.html
to the client.
As shown in the above example:
* /webadmin/webadmin/plugin/ is the servlet root path for PluginResourceServlet
* in the extra path beyond the servlet root path ( /foo/content/start.html ):
* /foo represents the name of the plugin
* /content/start.html represents the path to requested resource, relative to
" UIPluginDataPath / < resourcePath >"
Note that each plugin using PluginResourceServlet to serve its static files must declare
non-empty resourcePath attribute in within the plugin descriptor.
Also note that PluginResourceServlet , unlike WebadminDynamicHostingServlet , does NOT
reload descriptor/configuration data from local file system as part of handling the given
request. In other words, it's assumed that plugin data has already been (re)loaded
when serving WebAdmin application host page, with subsequent requests to
PluginResourceServlet reading the current plugin information.
Until we solve the cross-origin issue in a clean way, PluginResourceServlet should be used
to serve all plugin resources from local file system.
4. Plugin lifecycle improved to deal with misbehaving plugins
PluginState enum has been modified to deal with plugins that allow uncaught exceptions to
escape from plugin event handler functions (e.g. "UiInit"):
* removed state INITIALIZED
* added state INITIALIZING : The plugin is (currently) being initialized by calling
UiInit event handler function.
* added state IN_USE : Plugin's UiInit event handler function has completed
successfully, we can now call other event handler functions as necessary. The plugin is in
use now.
* added state FAILED : An uncaught exception escaped while calling an event handler
function, which indicates internal error within the plugin code. The plugin is removed
from service.
I've attached a simple state diagram that illustrates different states and transitions
between them (green color is initial state, red color is end state).
Uncaught exceptions in plugin event handler functions will be caught and handled by the
plugin infrastructure. This prevents a misbehaving plugin from breaking WebAdmin
application, since WebAdmin is the caller (initiator) of the function call. In such case,
the plugin will be removed from service.
Update on cross-origin issue (consequence of same-origin policy)
In order for the plugin to access WebAdmin plugin API, plugin host page (e.g. start.html )
must be served from URL on same origin as Engine origin. Otherwise, plugin code running in
the context of an iframe'd host page will fail to evaluate
"parent.pluginApi" expression, with "parent" being top-level
(WebAdmin) window, and "pluginApi" being the global plugin API object exposed by
WebAdmin.
This is why PluginResourceServlet , available on Engine origin, should be used to serve
all plugin resources from local file system.
There's only one issue that remains to be solved: cross-origin "plugin vs. remote
service" communication, with "remote service" being anything other than
Engine (REST API). In future, we'll address this with Apache reverse proxy
configuration, so that users can configure Apache server (placed in front of Engine JBoss
AS) to put arbitrary (local or remote non-Engine) services on same origin. However, this
requires a change in current Apache configuration. Until then, users can manually edit the
Engine Apache configuration file ( /etc/httpd/conf.d/ovirt-engine.conf ).
I've attached some sample plugin files for you to experiment with. Instead of
attaching actual patch file (92 kB) to this email, I've submitted the patch to oVirt
Gerrit:
http://gerrit.ovirt.org/8120
Let me know what you think!
Cheers,
Vojtech
------=_Part_2529173_585113360.1348259851826
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
<html><head><style type=3D'text/css'>p { margin: 0;
}</style></head><body><=
div style=3D'font-family: times new roman,new york,times,serif; font-size: =
12pt; color: #000000'>Hi guys,<br><br>it's been a while but here
comes the=
latest revision of UI Plugins proof-of-concept patch (please find it attac=
hed).<br><br>This revision was originally meant to focus solely on server-s=
ide components of the plugin infrastructure. However, I ended up implementi=
ng all the major concepts and ideas as discussed on engine-devel mailing li=
st, impacting both client-side and server-side parts of the plugin infrastr=
ucture. As a result, UI plugin infrastructure should be pretty much complet=
e now, so we can focus on specific plugin API features in upcoming PoC rev=
isions.<br><br>There's a whole bunch of changes and improvements in this
re=
vision, so I'll try to cover all the relevant parts step by step. If you ha=
ve any comments, questions or ideas, please let me know!<br><br>So here we =
go... (or if you just want to get the patch, find the link at the end of th=
is message)<br><br><hr style=3D"width: 100%; height:
2px;"><br><strong>0. A=
dded new Engine configuration values</strong><br style=3D"font-weight:
bold=
;"><br><u>UI plugin data path</u> is represented by
<em>ConfigValues.UIPlug=
inDataPath</em> enum option ("UIPluginDataPath" in <span
style=3D"font-styl=
e: italic;">vdc_options</span> table), and resolved relative to <span
style=
=3D"font-style: italic;">ConfigValues.DataDir</span> if possible.
Following=
(default) values:<br><ul><li><span style=3D"font-style:
italic;">UIPluginD=
ataPath =3D ui-plugins</span></li><li><span style=3D"font-style:
italic;">D=
ataDir =3D /usr/share/ovirt-engine<br></span></li></ul>result in
UI plugin =
data path: <span style=3D"font-style:
italic;">/usr/share/ovirt-engine/ui-p=
lugins</span><br><br><span style=3D"text-decoration:
underline;">UI plugin =
config path</span> is represented by <span style=3D"font-style:
italic;">Co=
nfigValues.UIPluginConfigPath</span> enum option ("UIPluginConfigPath" in
<=
span style=3D"font-style: italic;">vdc_options</span> table), and
resolved =
relative to <span style=3D"font-style:
italic;">ConfigValues.ConfigDir</spa=
n> if possible. Following (default) values:<br><ul><li><span
style=3D"font-=
style: italic;">UIPluginConfigPath =3D
ui-plugins</span></li><li><span styl=
e=3D"font-style: italic;">ConfigDir =3D
/etc/ovirt-engine</span></li></ul><=
p>result in UI plugin config path: <span style=3D"font-style:
italic;">/etc=
/ovirt-engine/</span><span style=3D"font-style:
italic;">ui-plugins</span><=
/p><br><span style=3D"font-weight: bold;">1. Processing UI plugin
data on t=
he server</span><br style=3D"font-weight: bold;"><br><span
style=3D"font-st=
yle: italic;">PluginDataManager</span> is the class responsible for
reading=
, validating and caching UI plugin descriptor/configuration data on the ser=
ver (Engine). It has two main responsibilities:<br><ul><li>return a
snapsho=
t of currently valid plugin data (<span style=3D"font-style:
italic;">getCu=
rrentData</span> method)<br></li><li>reload plugin data from local
file sys=
tem if necessary (<span style=3D"font-style:
italic;">reloadData</span> met=
hod)</li></ul><p></p><p>The <span
style=3D"font-style: italic;">reloadData<=
/span> method doesn't modify "live" plugin data directly. Instead, it
creat=
es a local working copy of current plugin data, updates this copy as it rea=
ds/validates plugin descriptor and configuration files, and attempts to upd=
ate "live" plugin data through conditional reference re-assignment (using <=
span style=3D"font-style: italic;">java.util.concurrent.atomic.AtomicRefere=
nce.compareAndSet</span> method).</p><p><br></p><p>In
other words, <span st=
yle=3D"font-style: italic;">reloadData</span> method makes no attempts
with=
regard to Java lock-based synchronization, in favor of dealing with "live"=
data through <span style=3D"font-style:
italic;">AtomicReference</span> (r=
eference that involves atomic <span style=3D"font-style:
italic;">volatile<=
/span> reads and writes):</p><ul><li> In the best case, a thread will
succe=
ed in updating "live" data (<span style=3D"font-style:
italic;">AtomicRefer=
ence.compareAndSet</span> =3D=3D true), which means that "live" data
remain=
ed unchanged since this thread acquired a reference of current plugin data.=
</li><li>In the worst case, a thread will NOT succeed in updating
"live" da=
ta (<span style=3D"font-style:
italic;">AtomicReference.compareAndSet</span=
=3D=3D false), which means that "live" data was already
changed by anothe=
r thread since this thread acquired a reference of current plugin
data.</li=
</ul><p>In my opinion, when dealing with external
resources like the local=
file system, this is a good compromise between
performance and up-to-date =
data. While we might not get "completely-up-to-date" data at the given poin=
t in time (<span style=3D"font-style: italic;">reloadData +
</span><span st=
yle=3D"font-style: italic;">getCurrentData</span>), we are guaranteed
to ge=
t "recently-up-to-date" and consistent data. In other words, the requiremen=
t of "completely-up-to-date" data would involve <span
style=3D"font-style: =
italic;">synchronized</span> statements that would hurt performance. In my
=
(very humble) opinion, the benefit of having "completely-up-to-date" data,=
at the cost of reduced performance, is not really worth it, especially in =
our case when the user can just hit refresh (F5) to reload WebAdmin and its=
plugin data.<br></p><p><br></p><p><span
style=3D"text-decoration: underlin=
e;">Plugin descriptor files</span> are expected to be placed in UI plugin
d=
ata path, for example: <span style=3D"font-style:
italic;">/usr/share/ovirt=
-engine/ui-plugins/foo.json</span></p><p><br></p><p>Following
descriptor fi=
le attributes are implemented and recognized by the plugin infrastructure:<=
/p><ul><li><span style=3D"font-style:
italic;">name</span>: A name that uni=
quely identifies the plugin (required attribute).</li><li><span
style=3D"fo=
nt-style: italic;">url</span>: URL of plugin host page that invokes the
plu=
gin code (required attribute).</li><li><span style=3D"font-style:
italic;">=
config</span>: Default configuration object associated with the plugin (opt=
ional attribute).</li><li><span style=3D"font-style:
italic;">resourcePath<=
/span>: Path to plugin static resources, relative to UI plugin data path (o=
ptional attribute). This is used when serving plugin files through Engine <=
span style=3D"font-style: italic;">PluginResourceServlet</span> (more
on th=
is below).<br></li></ul><p></p><p><span
style=3D"text-decoration: underline=
;">Plugin configuration files</span> are expected to be placed in UI
plugin=
config path, for example: <span style=3D"font-style:
italic;">/etc/engine/=
ui-plugins/foo-config.json</span><br></p><p><br></p><p>Note
that plugin con=
figuration files follow the "<descriptorFileName>-config.json"
conven=
tion.</p><p><br></p><p>Following configuration file
attributes are implemen=
ted and recognized by the plugin infrastructure:</p><ul><li><span
style=3D"=
font-style: italic;">config</span>: Custom configuration object associated
=
with the plugin (optional attribute). This overrides the default plugin des=
criptor configuration, if any.</li><li><span style=3D"font-style:
italic;">=
enabled</span>: Indicates whether the plugin should be loaded on WebAdmin s=
tartup (optional attribute). Default value is 'true'.</li><li><span
style=
=3D"font-style: italic;">order</span>: Defines the relative order in
which =
the plugin will be loaded on WebAdmin startup (optional attribute). Default=
value is <span style=3D"font-style:
italic;">Integer.MAX_VALUE</span> (low=
est order).</li></ul><p>The concept of merging custom configuration
(<span =
style=3D"font-style: italic;">config</span> attribute in <span
style=3D"fon=
t-style: italic;">foo-config.json</span>), if any, on top of default
config=
uration (<span style=3D"font-style: italic;">config</span> attribute
in <sp=
an style=3D"font-style: italic;">foo.json</span>), if any, remains
unchange=
d. This makes the plugin configuration quite flexible - in my opinion, the =
added complexity of handling/merging such configuration is definitely worth=
the effort.<br></p><p><br></p><p>The <span
style=3D"font-style: italic;">e=
nabled</span> attribute is straight-forward, allowing users to turn the giv=
en plugin off, if necessary. In future, users should still be able to load =
such plugins through WebAdmin
GUI.<br></p><p><br></p><p>The <span
style=3D"=
font-style: italic;">order</span> attribute controls the order in which
plu=
gins are loaded on WebAdmin startup. Since plugin resources are fetched asy=
nchronously by the browser, this is basically a way of imposing some degree=
of determinism in the "generally-non-deterministic" plugin environment, wh=
ich is helpful when troubleshooting problems with multiple plugins. This at=
tribute is also helpful due to file listing methods in <span style=3D"font-=
style: italic;">java.io.File</span> giving no guarantees that files would
b=
e listed in any particular order (otherwise we could just go for the "NN-&l=
t;descriptorFileName>.json" convention, with NN being the order number).=
<br></p><br><span style=3D"font-weight: bold;">2.
Modified behavior of Weba=
dminDynamicHostingServlet</span><br style=3D"font-weight:
bold;"><br><span =
style=3D"font-style: italic;">WebadminDynamicHostingServlet</span> is
the s=
ervlet used to serve WebAdmin application host page (HTML page that bootstr=
aps WebAdmin JavaScript code).<br><br>In addition to its former behavior, a=
s part of handling the given request, <span style=3D"font-style:
italic;">W=
ebadminDynamicHostingServlet</span>:<br><ul><li><span
style=3D"font-style: =
italic;"></span>reloads descriptor/configuration data from local file
syste=
m if necessary, and obtains a snapshot of currently valid plugin data (<spa=
n style=3D"font-style:
italic;">PluginDataManager.reloadAndGetCurrentData</=
span>)</li><li>embeds all plugin meta-data, suitable for use in
client-side=
plugin infrastructure, into WebAdmin host page as "pluginDefinitions" Java=
Script array (<span style=3D"font-style:
italic;">PluginDefinitions</span>)=
<br></li></ul>As a result, reloading UI plugin descriptor/configuration
dat=
a is as simple as refreshing (F5) WebAdmin application in the browser (no n=
eed to restart Engine).<br><br><span style=3D"font-weight:
bold;">3. Added =
servlet for serving plugin static resources</span><br
style=3D"font-weight:=
bold;"><br><span style=3D"font-style:
italic;">PluginResourceServlet</span=
is the servlet used to serve UI plugin static files (plugin host
page, 3r=
d party JavaScript, etc.) from the local file
system.<br><br>For example, r=
equesting URL:<br><ul><li><span style=3D"font-style:
italic;">http://<En=
gineManagerHost>:8700/webadmin/webadmin/plugin/foo/content/start.html</s=
pan></li></ul><p>will send the content
of:</p><ul><li><span style=3D"font-s=
tyle:
italic;">/usr/share/ovirt-engine/ui-plugins/<resourcePath>/</sp=
an><span style=3D"font-style:
italic;">content/start.html</span></li></ul><=
p>to the client.</p><p><br></p><p>As shown in the above
example:</p><ul><li=
<span style=3D"font-style:
italic;">/webadmin/webadmin/plugin/</span> is t=
he servlet root path
for <span style=3D"font-style: italic;">PluginResource=
Servlet</span><br></li><li>in the extra path beyond the servlet
root path (=
<span style=3D"font-style:
italic;">/foo/content/start.html</span>):<span s=
tyle=3D"white-space:pre"></span></li><ul><li><span
style=3D"font-style: ita=
lic;">/foo</span> represents the name of the
plugin</li><li><span style=3D"=
font-style: italic;">/content/start.html</span> represents the path to
requ=
ested resource, relative to "UIPluginDataPath /
<resourcePath>"<br></=
li></ul></ul>Note that each plugin using <span style=3D"font-style:
italic;=
">PluginResourceServlet</span> to serve its static files must declare
non-e=
mpty <span style=3D"font-style: italic;">resourcePath</span>
attribute in w=
ithin the plugin descriptor.<br><br>Also note that <span
style=3D"font-styl=
e: italic;">PluginResourceServlet</span>, unlike <span
style=3D"font-style:=
italic;">WebadminDynamicHostingServlet</span>, does NOT reload
descriptor/=
configuration data from local file system as part of handling the given req=
uest. In other words, it's assumed that plugin data has already been (re)lo=
aded when serving WebAdmin application host page, with subsequent requests =
to <span style=3D"font-style: italic;">PluginResourceServlet</span>
reading=
the current plugin information.<br><br>Until we solve the cross-origin iss=
ue in a clean way, <span style=3D"font-style:
italic;">PluginResourceServle=
t</span> should be used to serve all plugin resources from local file syste=
m.<br><br><span style=3D"font-weight: bold;">4. Plugin
lifecycle improved t=
o deal with misbehaving plugins</span><br><br><span
style=3D"font-style: it=
alic;">PluginState</span> enum has been modified to deal with plugins that
=
allow uncaught exceptions to escape from plugin event handler functions (e.=
g. "UiInit"):<br><ul><li>removed state <span
style=3D"font-style: italic;">=
INITIALIZED</span></li><li>added state <span
style=3D"font-style: italic;">=
INITIALIZING</span>: The plugin is (currently) being initialized by calling=
UiInit event handler function.</li><li>added state <span
style=3D"font-sty=
le: italic;">IN_USE</span>: Plugin's UiInit event handler function has
comp=
leted successfully, we can now call other event handler functions as necess=
ary. The plugin is in use now.</li><li>added state <span
style=3D"font-styl=
e: italic;">FAILED</span>: An uncaught exception escaped while calling an
e=
vent handler function, which indicates internal error within the plugin cod=
e. The plugin is removed from service.<br></li></ul>I've attached a
simple =
state diagram that illustrates different states and transitions between the=
m (green color is initial state, red color is end state).<br><br>Uncaught e=
xceptions in plugin event handler functions will be caught and handled by t=
he plugin infrastructure. This prevents a misbehaving plugin from breaking =
WebAdmin application, since WebAdmin is the caller (initiator) of the funct=
ion call. In such case, the plugin will be removed from
service.<br><br><sp=
an style=3D"font-weight: bold;">Update on cross-origin issue (consequence o=
f same-origin policy)</span><br><br>In order for the plugin to access
WebAd=
min plugin API, plugin host page (e.g. <span style=3D"font-style:
italic;">=
start.html</span>) must be served from URL on same origin as Engine origin.=
Otherwise, plugin code running in the context of an iframe'd host page wil=
l fail to evaluate "parent.pluginApi" expression, with "parent" being
top-l=
evel (WebAdmin) window, and "pluginApi" being the global plugin API object =
exposed by WebAdmin.<br><br>This is why <span style=3D"font-style:
italic;"=
PluginResourceServlet</span>, available on Engine origin, should
be used t=
o serve all plugin resources from local file
system.<br><br>There's only on=
e issue that remains to be solved: cross-origin "plugin vs. remote service"=
communication, with "remote service" being anything other than Engine (RES=
T API). In future, we'll address this with Apache reverse proxy configurati=
on, so that users can configure Apache server (placed in front of Engine JB=
oss AS) to put arbitrary (local or remote non-Engine) services on same orig=
in. However, this requires a change in current Apache configuration. Until =
then, users can manually edit the Engine Apache configuration file (<span s=
tyle=3D"font-style:
italic;">/etc/httpd/conf.d/ovirt-engine.conf</span>).<b=
r><br><span style=3D"font-weight: bold;"></span><hr
style=3D"width: 100%; h=
eight: 2px;"><br>I've attached some sample plugin files for you to
experime=
nt with. Instead of attaching actual patch file (92 kB) to this email, I've=
submitted the patch to oVirt Gerrit:
http://gerrit.ovirt.org/8120<br><br>L=
et me know what you
think!<br><br>Cheers,<br>Vojtech<br><br></div></body></=
html>
------=_Part_2529173_585113360.1348259851826--
------=_Part_2529172_1797931071.1348259851826
Content-Type: application/x-compressed-tar;
name=ui-plugin-sample-files.tar.gz
Content-Disposition: attachment; filename=ui-plugin-sample-files.tar.gz
Content-Transfer-Encoding: base64
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
------=_Part_2529172_1797931071.1348259851826
Content-Type: image/png; name=ui-plugin-lifecycle.png
Content-Disposition: attachment; filename=ui-plugin-lifecycle.png
Content-Transfer-Encoding: base64
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
hNBWMKGVGApNRM+5wMXNkx6Bi5GyhcLsZC4urk5HrV69Oj8/f8OGDampqWgr+q+VsLKyGgpNRM+5
ICQsnBTmi32CHUT7eY4cObL7tiIrK8vQ0NDT01NQUJDN24qTJ07oaWlxcHBQBghJScnQ0FDKgCIk
KGhiYvL48eNP3To9XOfD917ArOmOh+7mDJeWxzuThXJSo39yNb9w4cKiRT3fgNPf39/V1fX9+/fj
x48/fvy4oaEhW63L27y8xbNmhSclSQsKLtLRMZeTs1ZS4uXkxFbuQyU1NUHZ2U/y8m5mZtLq6pY4
O3teuNBnuUAIkZCSptFoOy/FSytpotyssnGSsPgwsby8vN4/xdXV1cvLi06nb9q0iX2+B+V/6dL8
lStrGxpOOTq6jB2LLcsEq/z8ziYkCAoK3rx1y9bWtm9yITw83MraWlxG6cDtlygxS3hssEuOeHD/
/v1ebtRWGRkZS5cujYuLExEROXfuXPdXGWGCx5cv2yxdKiMkdNvJSV9aGluWecdoFRV6p07R6utj
Y2P19PT6IBcIIalpGbo6Y5R1zda6+/ELiqLKzOS5beazkDtubm67d+/+zP+i/2krTE1N3d3dWdZW
0GjCUlLD+PhyN2zAZmVB+evqpH/5RUJKKu/Nmx4n7tX3F7THaK5bt+51atQWWymfP7ajxMyR9tR/
i83wuLB733777WeHAiHEwcGhsLBw9erVMTExJiYmW7duZcHK0OlOtrZVDQ1/Tp2KLcsSory83l99
lV9QMGPGjL45Xvgn7mnTZ3719HG4uLScntUcRa3xaoaWgqLiqHhfvn2amjJjH77PSoy+d+Ft3qth
w4bdvHlz4sSJffLirW2FmJjYmTNnmNlW5AUHK9nbz9XSujZnDrYyC20MCvrt2bO0tDRNTc2+yYW/
D2s9PX/66ac3b/JraqopFFy2vF9QqVQpKanZs2f//vvvff7i/v7+ixcvLisrGzt2rIeHB3PaCmdz
c/+EhNJt27BxWU7wyJGp06bduHGjL3MBBoetW7f++uuvVCp1+/bt+/fv7+8mQkJY2EZJ6crs2ag8
y824eTOqqKi4uPhLzy/A4HP06NGoqChNTU03NzcpKSl///78tntp6Yfq6mmqqig7Oxg7YkQ3N8tB
Lgx1hoaGSUlJt27dqq+vnzZtmpGRUUZGRj/1RYSQcd1+WROYZv6YMT1vMZRpiJs1a1ZZWdl3332X
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
YKD5P2BJEIkFxk/7AAAAAElFTkSuQmCC
------=_Part_2529172_1797931071.1348259851826--