<font size=2 face="sans-serif">Kate, Serg,</font><br><br><font size=2 face="sans-serif">Thank you very much for your quick responses.</font><br><br><font size=2 face="sans-serif">I am attaching the requested yaml file.</font><br><br><font size=2 face="sans-serif">For Hot2 plugin, the only difference
with hot_package.py is that I changed the UI translation version to 2.2
and removed predefined_fields in _translate_ui_parameters method.</font><br><font size=2 face="sans-serif">The ui.yaml file is attached.</font><br><br><br><br><font size=2 face="sans-serif">The CSAR plugin is a work in progress.
For example, the workflow method is not yet implemented.</font><br><font size=2 face="sans-serif">The ui.yaml file is attached.</font><br><br><br><font size=2 face="sans-serif">I'd like to make sure the issue is not
on my side before I open a bug, as Kate suggested.</font><br><br><font size=2 face="sans-serif">If necessary, I can also send you the
plugin python code.</font><br><br><font size=2 face="sans-serif">Thanks.</font><br><font size=2 face="sans-serif"><br>Regards,</font><font size=3><br></font><font size=2 face="sans-serif">--Vahid<br></font><br><br><br><br><font size=1 color=#5f5f5f face="sans-serif">From:
</font><font size=1 face="sans-serif">Serg Melikyan <smelikyan@mirantis.com></font><br><font size=1 color=#5f5f5f face="sans-serif">To:
</font><font size=1 face="sans-serif">"OpenStack Development
Mailing List (not for usage questions)" <openstack-dev@lists.openstack.org></font><br><font size=1 color=#5f5f5f face="sans-serif">Date:
</font><font size=1 face="sans-serif">11/25/2015 03:29 AM</font><br><font size=1 color=#5f5f5f face="sans-serif">Subject:
</font><font size=1 face="sans-serif">Re: [openstack-dev]
[Murano] 'NoMatchingFunctionException: No function "#operator_."
matches supplied arguments' error when adding an application to an environment</font><br><hr noshade><br><br><br><tt><font size=2>Hi Vahid,<br><br>you can find generated UI definitions for the package here:<br>/tmp/muranodashboard-cache/apps/.../ui/ui.yaml<br><br>On Wed, Nov 25, 2015 at 12:54 PM, Ekaterina Chernova<br><efedorova@mirantis.com> wrote:<br>><br>> Hi Vahid,<br>><br>> Forms are rended after app is added to the environment in accordance
with the UI definition.<br>> UI definition contains yaql expressions and one of your expression
is incorrect.<br>> Please, share UI yaml so we can find out what's the problem.<br>> You can also create a bug that it's not obvious which expression is
failed.<br>><br>><br>> Also, make sure that you have valid YAQL version installed (should
correspond to the version in requirements.txt)<br>> And you can ask for help in #murano channel.<br>><br>> Regards,<br>> Kate.<br>><br>><br>> On Wed, Nov 25, 2015 at 4:39 AM, Vahid S Hashemian <vahidhashemian@us.ibm.com>
wrote:<br>>><br>>> Hi,<br>>><br>>> I am working on the TOSCA CSAR plugin for murano and so far am
able to successfully import an application definition archive of my CSAR
example to murano.<br>>> However, when I try to add the imported application to an environment
I get this error from Murano Dashboard:<br>>><br>>> DEBUG:muranodashboard.common.cache:Using cached value from /tmp/muranodashboard-cache/apps/91/4c2bfd5d504419a94a9affb7af809a/package_fqn.<br>>> DEBUG:muranodashboard.catalog.views:Clearing forms data for application
io.murano.apps.generated.CsarHelloWorld.<br>>> DEBUG:muranodashboard.catalog.views:Clearing any leftover wizard
step data.<br>>> DEBUG:muranodashboard.common.cache:Using cached value from /tmp/muranodashboard-cache/apps/91/4c2bfd5d504419a94a9affb7af809a/ui/ui.yaml.<br>>> DEBUG:muranodashboard.common.cache:Using cached value from /tmp/muranodashboard-cache/apps/91/4c2bfd5d504419a94a9affb7af809a/package_fqn.<br>>> DEBUG:muranodashboard.dynamic_ui.services:Using data {} for app
io.murano.apps.generated.CsarHelloWorld<br>>> DEBUG:muranodashboard.dynamic_ui.services:Using in-memory forms
for app io.murano.apps.generated.CsarHelloWorld<br>>> DEBUG:muranodashboard.common.cache:Using cached value from /tmp/muranodashboard-cache/apps/91/4c2bfd5d504419a94a9affb7af809a/ui/ui.yaml.<br>>> DEBUG:muranodashboard.common.cache:Using cached value from /tmp/muranodashboard-cache/apps/91/4c2bfd5d504419a94a9affb7af809a/package_fqn.<br>>> DEBUG:muranodashboard.dynamic_ui.services:Using data {} for app
io.murano.apps.generated.CsarHelloWorld<br>>> DEBUG:muranodashboard.dynamic_ui.services:Using in-memory forms
for app io.murano.apps.generated.CsarHelloWorld<br>>> INFO:muranodashboard.dynamic_ui.forms:Creating form workflowManagement<br>>> INFO:muranodashboard.dynamic_ui.forms:Creating form group0<br>>> DEBUG:muranodashboard.api:Murano::Client <Url: </font></tt><a href=http://localhost:8082/><tt><font size=2>http://localhost:8082/</font></tt></a><tt><font size=2>><br>>> DEBUG:muranoclient.common.http:curl -i -X GET -H 'X-Auth-Token:
324759651d234c4eaf08f6093dfd7000' -H 'Content-Type: application/json' -H
'User-Agent: python-muranoclient' </font></tt><a href=http://localhost:8082//v1/catalog/packages/914c2bfd5d504419a94a9affb7af809a><tt><font size=2>http://localhost:8082//v1/catalog/packages/914c2bfd5d504419a94a9affb7af809a</font></tt></a><tt><font size=2><br>>> DEBUG:muranoclient.common.http:<br>>> HTTP/1.1 200 OK<br>>> Date: Wed, 25 Nov 2015 01:31:12 GMT<br>>> Connection: keep-alive<br>>> Content-Type: application/json<br>>> Content-Length: 560<br>>> X-Openstack-Request-Id: req-b6759ab2-04b4-4882-ac95-3ac06f970cb5<br>>><br>>> {"updated": "2015-11-24T23:28:52", "description":
"Template for deploying a single server with predefined properties.",
"tags": ["TOSCA-CSAR-generated"], "class_definitions":
["io.murano.apps.generated.CsarHelloWorld"], "is_public":
false, "id": "914c2bfd5d504419a94a9affb7af809a", "categories":
[], "name": "csar_hello_world", "created":
"2015-11-24T23:28:52", "author": "OASIS TOSCA
TC", "enabled": true, "supplier": {}, "fully_qualified_name":
"io.murano.apps.generated.CsarHelloWorld", "type":
"Application", "owner_id": "1fee909728c54a698c96f0f7853412ae"}<br>>><br>>> DEBUG:muranoclient.common.http:curl -i -X GET -H 'X-Auth-Token:
324759651d234c4eaf08f6093dfd7000' -H 'Content-Type: application/json' -H
'User-Agent: python-muranoclient' </font></tt><a href=http://localhost:8082//v1/environments/b8d83a0b6fde465ab9de013f084518d4><tt><font size=2>http://localhost:8082//v1/environments/b8d83a0b6fde465ab9de013f084518d4</font></tt></a><tt><font size=2><br>>> DEBUG:muranoclient.common.http:<br>>> HTTP/1.1 200 OK<br>>> Date: Wed, 25 Nov 2015 01:31:12 GMT<br>>> Connection: keep-alive<br>>> Content-Type: application/json<br>>> Content-Length: 245<br>>> X-Openstack-Request-Id: req-0ccb2b46-8a58-418f-b063-63067042e3f6<br>>><br>>> {"status": "ready", "updated": "2015-11-24T23:29:11",
"created": "2015-11-24T23:29:11", "tenant_id":
"1fee909728c54a698c96f0f7853412ae", "acquired_by":
null, "version": 0, "services": [], "id":
"b8d83a0b6fde465ab9de013f084518d4", "name": "env1"}<br>>><br>>> DEBUG:muranodashboard.common.cache:Using cached value from /tmp/muranodashboard-cache/apps/91/4c2bfd5d504419a94a9affb7af809a/ui/ui.yaml.<br>>> DEBUG:muranodashboard.common.cache:Using cached value from /tmp/muranodashboard-cache/apps/91/4c2bfd5d504419a94a9affb7af809a/package_fqn.<br>>> DEBUG:muranodashboard.dynamic_ui.services:Using data {} for app
io.murano.apps.generated.CsarHelloWorld<br>>> DEBUG:muranodashboard.dynamic_ui.services:Using in-memory forms
for app io.murano.apps.generated.CsarHelloWorld<br>>> DEBUG:muranoclient.common.http:curl -i -X GET -H 'X-Auth-Token:
324759651d234c4eaf08f6093dfd7000' -H 'Content-Type: application/json' -H
'User-Agent: python-muranoclient' </font></tt><a href=http://localhost:8082//v1/catalog/packages/914c2bfd5d504419a94a9affb7af809a><tt><font size=2>http://localhost:8082//v1/catalog/packages/914c2bfd5d504419a94a9affb7af809a</font></tt></a><tt><font size=2><br>>> DEBUG:muranoclient.common.http:<br>>> HTTP/1.1 200 OK<br>>> Date: Wed, 25 Nov 2015 01:31:12 GMT<br>>> Connection: keep-alive<br>>> Content-Type: application/json<br>>> Content-Length: 560<br>>> X-Openstack-Request-Id: req-ee4545dd-6dfe-4944-90bc-48a525b099d5<br>>><br>>> {"updated": "2015-11-24T23:28:52", "description":
"Template for deploying a single server with predefined properties.",
"tags": ["TOSCA-CSAR-generated"], "class_definitions":
["io.murano.apps.generated.CsarHelloWorld"], "is_public":
false, "id": "914c2bfd5d504419a94a9affb7af809a", "categories":
[], "name": "csar_hello_world", "created":
"2015-11-24T23:28:52", "author": "OASIS TOSCA
TC", "enabled": true, "supplier": {}, "fully_qualified_name":
"io.murano.apps.generated.CsarHelloWorld", "type":
"Application", "owner_id": "1fee909728c54a698c96f0f7853412ae"}<br>>><br>>> [25/Nov/2015 01:31:12] "GET /murano/catalog/add/914c2bfd5d504419a94a9affb7af809a/b8d83a0b6fde465ab9de013f084518d4
HTTP/1.1" 200 3763<br>>> DEBUG:muranodashboard.common.cache:Using cached value from /tmp/muranodashboard-cache/apps/91/4c2bfd5d504419a94a9affb7af809a/ui/ui.yaml.<br>>> DEBUG:muranodashboard.common.cache:Using cached value from /tmp/muranodashboard-cache/apps/91/4c2bfd5d504419a94a9affb7af809a/package_fqn.<br>>> DEBUG:muranodashboard.dynamic_ui.services:Using data {} for app
io.murano.apps.generated.CsarHelloWorld<br>>> DEBUG:muranodashboard.dynamic_ui.services:Using in-memory forms
for app io.murano.apps.generated.CsarHelloWorld<br>>> DEBUG:muranodashboard.common.cache:Using cached value from /tmp/muranodashboard-cache/apps/91/4c2bfd5d504419a94a9affb7af809a/ui/ui.yaml.<br>>> DEBUG:muranodashboard.common.cache:Using cached value from /tmp/muranodashboard-cache/apps/91/4c2bfd5d504419a94a9affb7af809a/package_fqn.<br>>> DEBUG:muranodashboard.dynamic_ui.services:Using data {} for app
io.murano.apps.generated.CsarHelloWorld<br>>> DEBUG:muranodashboard.dynamic_ui.services:Using in-memory forms
for app io.murano.apps.generated.CsarHelloWorld<br>>> INFO:muranodashboard.dynamic_ui.forms:Creating form workflowManagement<br>>> INFO:muranodashboard.dynamic_ui.forms:Creating form group0<br>>> INFO:muranodashboard.dynamic_ui.forms:Creating form workflowManagement<br>>> DEBUG:muranodashboard.api:Murano::Client <Url: </font></tt><a href=http://localhost:8082/><tt><font size=2>http://localhost:8082/</font></tt></a><tt><font size=2>><br>>> DEBUG:muranoclient.common.http:curl -i -X GET -H 'X-Auth-Token:
324759651d234c4eaf08f6093dfd7000' -H 'Content-Type: application/json' -H
'User-Agent: python-muranoclient' </font></tt><a href=http://localhost:8082//v1/environments/b8d83a0b6fde465ab9de013f084518d4><tt><font size=2>http://localhost:8082//v1/environments/b8d83a0b6fde465ab9de013f084518d4</font></tt></a><tt><font size=2><br>>> DEBUG:muranoclient.common.http:<br>>> HTTP/1.1 200 OK<br>>> Date: Wed, 25 Nov 2015 01:31:15 GMT<br>>> Connection: keep-alive<br>>> Content-Type: application/json<br>>> Content-Length: 245<br>>> X-Openstack-Request-Id: req-fd260c43-75e3-41eb-bf72-d7ebd537cc9b<br>>><br>>> {"status": "ready", "updated": "2015-11-24T23:29:11",
"created": "2015-11-24T23:29:11", "tenant_id":
"1fee909728c54a698c96f0f7853412ae", "acquired_by":
null, "version": 0, "services": [], "id":
"b8d83a0b6fde465ab9de013f084518d4", "name": "env1"}<br>>><br>>> DEBUG:muranodashboard.common.cache:Using cached value from /tmp/muranodashboard-cache/apps/91/4c2bfd5d504419a94a9affb7af809a/ui/ui.yaml.<br>>> DEBUG:muranodashboard.common.cache:Using cached value from /tmp/muranodashboard-cache/apps/91/4c2bfd5d504419a94a9affb7af809a/package_fqn.<br>>> DEBUG:muranodashboard.dynamic_ui.services:Using data {} for app
io.murano.apps.generated.CsarHelloWorld<br>>> DEBUG:muranodashboard.dynamic_ui.services:Using in-memory forms
for app io.murano.apps.generated.CsarHelloWorld<br>>> [25/Nov/2015 01:31:15] "POST /murano/catalog/add/914c2bfd5d504419a94a9affb7af809a/b8d83a0b6fde465ab9de013f084518d4/False/False
HTTP/1.1" 200 4598<br>>> DEBUG:muranodashboard.common.cache:Using cached value from /tmp/muranodashboard-cache/apps/91/4c2bfd5d504419a94a9affb7af809a/ui/ui.yaml.<br>>> DEBUG:muranodashboard.common.cache:Using cached value from /tmp/muranodashboard-cache/apps/91/4c2bfd5d504419a94a9affb7af809a/package_fqn.<br>>> DEBUG:muranodashboard.dynamic_ui.services:Using data {} for app
io.murano.apps.generated.CsarHelloWorld<br>>> DEBUG:muranodashboard.dynamic_ui.services:Using in-memory forms
for app io.murano.apps.generated.CsarHelloWorld<br>>> DEBUG:muranodashboard.common.cache:Using cached value from /tmp/muranodashboard-cache/apps/91/4c2bfd5d504419a94a9affb7af809a/ui/ui.yaml.<br>>> DEBUG:muranodashboard.common.cache:Using cached value from /tmp/muranodashboard-cache/apps/91/4c2bfd5d504419a94a9affb7af809a/package_fqn.<br>>> DEBUG:muranodashboard.dynamic_ui.services:Using data {} for app
io.murano.apps.generated.CsarHelloWorld<br>>> DEBUG:muranodashboard.dynamic_ui.services:Using in-memory forms
for app io.murano.apps.generated.CsarHelloWorld<br>>> INFO:muranodashboard.dynamic_ui.forms:Creating form workflowManagement<br>>> INFO:muranodashboard.dynamic_ui.forms:Creating form workflowManagement<br>>> INFO:muranodashboard.dynamic_ui.forms:Creating form group0<br>>> INFO:muranodashboard.dynamic_ui.forms:Creating form workflowManagement<br>>> Internal Server Error: /murano/catalog/add/914c2bfd5d504419a94a9affb7af809a/b8d83a0b6fde465ab9de013f084518d4/False/False<br>>> Traceback (most recent call last):<br>>> File "/home/stack/project/horizon/.tox/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py",
line 132, in get_response<br>>> response = wrapped_callback(request, *callback_args,
**callback_kwargs)<br>>> File "/home/stack/project/horizon/horizon/decorators.py",
line 36, in dec<br>>> return view_func(request, *args, **kwargs)<br>>> File "/home/stack/project/horizon/horizon/decorators.py",
line 52, in dec<br>>> return view_func(request, *args, **kwargs)<br>>> File "/home/stack/project/horizon/horizon/decorators.py",
line 36, in dec<br>>> return view_func(request, *args, **kwargs)<br>>> File "/home/stack/project/murano-dashboard/muranodashboard/catalog/views.py",
line 173, in __inner<br>>> return func(request, **kwargs)<br>>> File "/home/stack/project/murano-dashboard/muranodashboard/catalog/views.py",
line 303, in view<br>>> return self.dispatch(request, *args, **kwargs)<br>>> File "/home/stack/project/horizon/.tox/venv/local/lib/python2.7/site-packages/formtools/wizard/views.py",
line 237, in dispatch<br>>> response = super(WizardView, self).dispatch(request,
*args, **kwargs)<br>>> File "/home/stack/project/horizon/.tox/venv/local/lib/python2.7/site-packages/django/views/generic/base.py",
line 89, in dispatch<br>>> return handler(request, *args, **kwargs)<br>>> File "/home/stack/project/horizon/.tox/venv/local/lib/python2.7/site-packages/formtools/wizard/views.py",
line 300, in post<br>>> return self.render_done(form, **kwargs)<br>>> File "/home/stack/project/horizon/.tox/venv/local/lib/python2.7/site-packages/formtools/wizard/views.py",
line 357, in render_done<br>>> **kwargs)<br>>> File "/home/stack/project/murano-dashboard/muranodashboard/catalog/views.py",
line 334, in done<br>>> attributes = service.extract_attributes()<br>>> File "/home/stack/project/murano-dashboard/muranodashboard/dynamic_ui/services.py",
line 123, in extract_attributes<br>>> attributes = helpers.evaluate(self.application,
self.context)<br>>> File "/home/stack/project/murano-dashboard/muranodashboard/dynamic_ui/helpers.py",
line 97, in evaluate<br>>> value, context)<br>>> File "/home/stack/project/murano-dashboard/muranodashboard/dynamic_ui/helpers.py",
line 90, in recursive_apply<br>>> return rec(value)<br>>> File "/home/stack/project/murano-dashboard/muranodashboard/dynamic_ui/helpers.py",
line 80, in rec<br>>> return dict((rec(k), rec(v)) for (k, v) in val.iteritems())<br>>> File "/home/stack/project/murano-dashboard/muranodashboard/dynamic_ui/helpers.py",
line 80, in <genexpr><br>>> return dict((rec(k), rec(v)) for (k, v) in val.iteritems())<br>>> File "/home/stack/project/murano-dashboard/muranodashboard/dynamic_ui/helpers.py",
line 78, in rec<br>>> return rec(transformer(val, *args))<br>>> File "/home/stack/project/murano-dashboard/muranodashboard/dynamic_ui/helpers.py",
line 96, in <lambda><br>>> lambda v, _ctx: v.evaluate(context=_ctx),<br>>> File "/home/stack/project/murano-dashboard/muranodashboard/dynamic_ui/yaql_expression.py",
line 61, in evaluate<br>>> return self._parsed_expression.evaluate(data=data,
context=context)<br>>> File "/home/stack/project/horizon/.tox/venv/local/lib/python2.7/site-packages/yaql/language/expressions.py",
line 165, in evaluate<br>>> return self(utils.NO_VALUE, context, self.engine)<br>>> File "/home/stack/project/horizon/.tox/venv/local/lib/python2.7/site-packages/yaql/language/expressions.py",
line 156, in __call__<br>>> return super(Statement, self).__call__(receiver,
context, engine)<br>>> File "/home/stack/project/horizon/.tox/venv/local/lib/python2.7/site-packages/yaql/language/expressions.py",
line 37, in __call__<br>>> return context(self.name, engine, receiver, context)(*self.args)<br>>> File "/home/stack/project/horizon/.tox/venv/local/lib/python2.7/site-packages/yaql/language/contexts.py",
line 65, in <lambda><br>>> data_context, use_convention, function_filter)<br>>> File "/home/stack/project/horizon/.tox/venv/local/lib/python2.7/site-packages/yaql/language/runner.py",
line 49, in call<br>>> name, all_overloads, engine, receiver, data_context,
args, kwargs)<br>>> File "/home/stack/project/horizon/.tox/venv/local/lib/python2.7/site-packages/yaql/language/runner.py",
line 117, in choose_overload<br>>> args = tuple(arg_evaluator(i, arg) for i, arg in
enumerate(args))<br>>> File "/home/stack/project/horizon/.tox/venv/local/lib/python2.7/site-packages/yaql/language/runner.py",
line 117, in <genexpr><br>>> args = tuple(arg_evaluator(i, arg) for i, arg in
enumerate(args))<br>>> File "/home/stack/project/horizon/.tox/venv/local/lib/python2.7/site-packages/yaql/language/runner.py",
line 113, in <lambda><br>>> and not isinstance(arg, expressions.Constant))<br>>> File "/home/stack/project/horizon/.tox/venv/local/lib/python2.7/site-packages/yaql/language/expressions.py",
line 37, in __call__<br>>> return context(self.name, engine, receiver, context)(*self.args)<br>>> File "/home/stack/project/horizon/.tox/venv/local/lib/python2.7/site-packages/yaql/language/contexts.py",
line 65, in <lambda><br>>> data_context, use_convention, function_filter)<br>>> File "/home/stack/project/horizon/.tox/venv/local/lib/python2.7/site-packages/yaql/language/runner.py",
line 49, in call<br>>> name, all_overloads, engine, receiver, data_context,
args, kwargs)<br>>> File "/home/stack/project/horizon/.tox/venv/local/lib/python2.7/site-packages/yaql/language/runner.py",
line 141, in choose_overload<br>>> raise_not_found()<br>>> File "/home/stack/project/horizon/.tox/venv/local/lib/python2.7/site-packages/yaql/language/runner.py",
line 70, in raise_not_found<br>>> raise exceptions.NoMatchingFunctionException(name)<br>>> NoMatchingFunctionException: No function "#operator_."
matches supplied arguments<br>>> [25/Nov/2015 01:31:17] "POST /murano/catalog/add/914c2bfd5d504419a94a9affb7af809a/b8d83a0b6fde465ab9de013f084518d4/False/False
HTTP/1.1" 500 119882<br>>><br>>><br>>> In order to test this further I tried to make a copy of the hot_package
and create a HOT2 plugin (by renaming Hot to Hot2) to see if the issue
is directly rooted in the CSAR plugin.<br>>> However, with the HOT2 plugin I am getting the same error as above.<br>>><br>>> Any help on how to resolve the problem is very much appreciated.<br>>><br>>> Regards,<br>>> --Vahid<br>>><br>>> __________________________________________________________________________<br>>> OpenStack Development Mailing List (not for usage questions)<br>>> Unsubscribe: OpenStack-dev-request@lists.openstack.org?subject:unsubscribe<br>>> </font></tt><a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev"><tt><font size=2>http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</font></tt></a><tt><font size=2><br>>><br>><br>><br>> __________________________________________________________________________<br>> OpenStack Development Mailing List (not for usage questions)<br>> Unsubscribe: OpenStack-dev-request@lists.openstack.org?subject:unsubscribe<br>> </font></tt><a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev"><tt><font size=2>http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</font></tt></a><tt><font size=2><br>><br><br><br><br>-- <br>Serg Melikyan, Senior Software Engineer at Mirantis, Inc.<br></font></tt><a href=http://mirantis.com/><tt><font size=2>http://mirantis.com</font></tt></a><tt><font size=2>| smelikyan@mirantis.com<br><br>+7 (495) 640-4904, 0261<br>+7 (903) 156-0836<br><br>__________________________________________________________________________<br>OpenStack Development Mailing List (not for usage questions)<br>Unsubscribe: OpenStack-dev-request@lists.openstack.org?subject:unsubscribe<br></font></tt><a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev"><tt><font size=2>http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</font></tt></a><tt><font size=2><br><br></font></tt><br><br><BR>