Retire Solum: remove repo content

Solum project is retiring
- https://review.opendev.org/c/openstack/governance/+/919211

this commit remove the content of this project repo

Change-Id: I0a4082aefb5d577af16503ea662a5e64f235ff15
This commit is contained in:
Ghanshyam Mann 2024-05-10 12:32:53 -07:00 committed by Ghanshyam
parent cf30defab9
commit 80e7ef7b99
72 changed files with 8 additions and 3445 deletions

31
.gitignore vendored
View File

@ -1,31 +0,0 @@
*.pyc
*.swp
*.sqlite3
.environment_version
.selenium_log
.coverage*
.noseids
.DS_STORE
*.egg/
*.egg-info/
coverage.xml
nosetests.xml
pep8.txt
pylint.txt
reports
horizon.egg-info
.secret_key_store
doc/build/
doc/source/sourcecode
/static/
.venv
.tox
.idea
build
dist
AUTHORS
ChangeLog
tags
openstack_dashboard/dummydb.sqlite
.stestr/
test

View File

@ -1,3 +0,0 @@
[DEFAULT]
test_path=./solumdashboard/tests
top_dir=./

View File

@ -1,6 +0,0 @@
- project:
templates:
- check-requirements
- horizon-non-primary-django-jobs
- openstack-python3-jobs-horizon
- openstack-python3-jobs

View File

@ -1,4 +0,0 @@
Solum Style Commandments
========================
Read the OpenStack Style Commandments https://docs.openstack.org/hacking/latest/

175
LICENSE
View File

@ -1,175 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.

View File

@ -1,25 +1,10 @@
========================
Team and repository tags
========================
This project is no longer maintained.
.. image:: http://governance.openstack.org/badges/solum-dashboard.svg
:target: http://governance.openstack.org/reference/tags/index.html
The contents of this repository are still available in the Git
source code management system. To see the contents of this
repository before it reached its end of life, please check out the
previous commit with "git checkout HEAD^1".
.. Change things from this point on
solum-dashboard
===============
Horizon plugin for Solum
Purpose of this plugin is to add Solum capabilities to the openstack dashboard.
This plugin requires a working openstack install including solum and horizon.
How to install solum-dashboard into Horizon.
--------------------------------------------
Enter these commands in your terminal:
sudo pip install -e /opt/stack/solum-dashboard
cd /opt/stack/horizon/openstack_dashboard/local/enabled
ln -s /opt/stack/solum-dashboard/solumdashboard/local/enabled/_50_solum.py _50_solum.py
sudo service apache2 restart
For any further questions, please email
openstack-discuss@lists.openstack.org or join #openstack-dev on
OFTC.

View File

@ -1,2 +0,0 @@
[python: **.py]
[django: **/templates/**.html]

View File

@ -1,2 +0,0 @@
[javascript: **.js]
[angular: **/static/**.html]

View File

@ -1,2 +0,0 @@
sphinx>=2.0.0,!=2.1.0 # BSD
openstackdocstheme>=2.2.1 # Apache-2.0

View File

@ -1,78 +0,0 @@
# -*- coding: utf-8 -*-
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import sys
sys.path.insert(0, os.path.abspath('../..'))
# -- General configuration ----------------------------------------------------
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = [
'sphinx.ext.autodoc',
'openstackdocstheme',
]
# autodoc generation is a bit aggressive and a nuisance when doing heavy
# text edit cycles.
# execute "export SPHINX_DEBUG=1" in your terminal to disable
# The suffix of source filenames.
source_suffix = '.rst'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'solum-dashboard'
copyright = u'2013, OpenStack Foundation'
# If true, '()' will be appended to :func: etc. cross-reference text.
add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
add_module_names = True
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'native'
# -- Options for HTML output --------------------------------------------------
# The theme to use for HTML and HTML Help pages. Major themes that come with
# Sphinx are currently 'default' and 'sphinxdoc'.
# html_theme_path = ["."]
# html_theme = '_theme'
# html_static_path = []
html_theme = 'openstackdocs'
# openstackdocstheme options
openstackdocs_repo_name = 'openstack/solum-dashboard'
openstackdocs_auto_name = False
openstackdocs_bug_project = 'solum'
openstackdocs_bug_tag = ''
# Output file base name for HTML help builder.
htmlhelp_basename = '%sdoc' % project
# -- Options for manual page output -------------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = []
# If true, show URL addresses after external links.
man_show_urls = True

View File

@ -1 +0,0 @@
.. include:: ../../README.rst

View File

@ -1,6 +0,0 @@
---
upgrade:
- |
Python 2.7 support has been dropped. Last release of solum-dashboard
to support python 2.7 is OpenStack Train. The minimum version of Python now
supported by solum-dashboard is Python 3.6.

View File

@ -1,18 +0,0 @@
# Requirements lower bounds listed here are our best effort to keep them up to
# date but we do not test them so no guarantee of having them all correct. If
# you find any incorrect lower bounds, let us know or propose a fix.
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
pbr!=2.1.0,>=3.1.1 # Apache-2.0
# Horizon Core Requirements
django-compressor>=2.2 # MIT
oslo.log>=3.37.0 # Apache-2.0
python-keystoneclient>=3.22.0 # Apache-2.0
python-solumclient>=2.6.1 # Apache-2.0
PyYAML>=5.3 # MIT
oslo.utils>=3.36.0 # Apache-2.0
horizon>=17.1.0 # Apache-2.0

View File

@ -1,26 +0,0 @@
[metadata]
name = solum-dashboard
summary = Solum Dashboard
description-file = README.rst
license = Apache Software License
python-requires = >=3.6
classifier =
Programming Language :: Python
Programming Language :: Python :: Implementation :: CPython
Programming Language :: Python :: 3 :: Only
Programming Language :: Python :: 3
Programming Language :: Python :: 3.6
Programming Language :: Python :: 3.7
Programming Language :: Python :: 3.8
Environment :: OpenStack
Intended Audience :: Information Technology
Intended Audience :: System Administrators
License :: OSI Approved :: Apache Software License
Operating System :: POSIX :: Linux
author = OpenStack
author-email = openstack-discuss@lists.openstack.org
home-page = https://docs.openstack.org/solum/latest/
[files]
packages =
solumdashboard

View File

@ -1,20 +0,0 @@
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import setuptools
setuptools.setup(
setup_requires=['pbr>=2.0.0'],
pbr=True)

View File

@ -1,44 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.conf import settings
from horizon import exceptions
from solumclient import client as api_client
from openstack_dashboard.api import base
from oslo_log import log as logging
LOG = logging.getLogger(__name__)
def get_solum_url(request):
endpoint = getattr(settings, 'SOLUM_URL', None)
if not endpoint:
try:
endpoint = base.url_for(request, 'application_deployment')
except exceptions.ServiceCatalogException:
endpoint = 'http://localhost:9777'
LOG.warning('Solum API location could not be found in Service '
'Catalog, using default: {0}'.format(endpoint))
return endpoint
def client(request):
auth_url = getattr(settings, 'OPENSTACK_KEYSTONE_URL')
return api_client.Client(1, endpoint=get_solum_url(request),
token=request.user.token.id,
auth_url=auth_url)

View File

@ -1,197 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import messages
from oslo_log import log as logging
from solumclient.v1 import workflow as cli_wf
import yaml
from solumdashboard.api.client import client as solumclient
LOG = logging.getLogger(__name__)
class ScaleForm(forms.SelfHandlingForm):
target = forms.IntegerField(label=_("Target"))
def handle(self, request, data):
app_id = self.initial.get('application_id')
LOG.info('ScaleApplication %s' % data)
if data["target"] <= 0:
exceptions.handle(self.request,
_("Scale target must be greater than zero"))
solum = solumclient(request)
actions = ['scale']
cli_wf.WorkflowManager(solum, app_id=app_id).create(
actions=actions)
return True
class CreateForm(forms.SelfHandlingForm):
source = forms.ChoiceField(
label=_('Source'),
choices=[
('app_file', _('App File')),
('input', _('Input'))
],
widget=forms.Select(attrs={
'class': 'switchable',
'data-slug': 'source'
})
)
app_file = forms.FileField(
label=_("Local app file location"),
required=False,
widget=forms.FileInput(attrs={
'class': 'switched',
'data-switch-on': 'source',
'data-source-app_file': _('Local app file location')
})
)
name = forms.CharField(label=_("Application Name"), required=False,
max_length=100)
languagepack = forms.CharField(label=_("Languagepack"), required=False)
git_url = forms.URLField(label=_("Source repository"), required=False)
run_cmd = forms.CharField(label=_("Application entry point"),
required=False)
unittest_cmd = forms.CharField(label=_(
"Command to execute unit tests"), required=False)
port = forms.IntegerField(label=_("The port your application listens on"),
min_value=0,
required=False)
param_file = forms.FileField(label=_(
"A yaml file containing custom parameters"), required=False)
def clean(self):
cleaned_data = super(CreateForm, self).clean()
import_type = cleaned_data.get('source')
if import_type == 'app_file' and not cleaned_data.get('app_file'):
msg = _('Please supply an app file')
raise forms.ValidationError(msg)
elif import_type == 'input':
if not (cleaned_data.get('name')):
msg = _('Please supply a name')
raise forms.ValidationError(msg)
elif not cleaned_data.get('languagepack'):
msg = _('Please supply a languagepack')
raise forms.ValidationError(msg)
elif not cleaned_data.get('git_url'):
msg = _('Please supply a github url')
raise forms.ValidationError(msg)
elif not cleaned_data.get('run_cmd'):
msg = _('Please supply a run command')
raise forms.ValidationError(msg)
return cleaned_data
def handle(self, request, data):
LOG.info('CreateApplication %s' % data)
solum = solumclient(request)
app_data = None
if data['source'] == 'app_file':
inf = data['app_file'].read()
app_data = yaml.load(inf)
if 'repo_token' not in app_data:
app_data['repo_token'] = ''
else:
app_data = {
'version': 1,
'description': 'default app description',
'source': {
'repository': '',
'revision': 'master',
'repo_token': ''
},
'workflow_config': {
'test_cmd': '',
'run_cmd': ''
}
}
if data['name']:
app_data['name'] = data['name']
if data['languagepack']:
app_data['languagepack'] = data['languagepack']
if data['git_url']:
app_data['source'] = dict()
app_data['source']['repository'] = data['git_url']
app_data['source']['revision'] = 'master'
if data['run_cmd']:
if app_data.get('workflow_config') is None:
app_data['workflow_config'] = dict()
if not app_data['workflow_config']['run_cmd']:
app_data['workflow_config']['run_cmd'] = data['run_cmd']
if data['unittest_cmd']:
if app_data.get('workflow_config') is None:
app_data['workflow_config'] = dict()
if not app_data['workflow_config']['test_cmd']:
app_data['workflow_config']['test_cmd'] = data['unittest_cmd']
if not app_data.get('ports'):
app_data['ports'] = []
if data['port']:
app_data['ports'].append(data['port'])
else:
app_data['ports'].append(80)
if data['param_file']:
param_def = data['param_file'].read()
app_data['parameters'] = yaml.load(param_def)
try:
solum.apps.create(**app_data)
messages.success(request,
_('Application was successfully created.'))
return True
except Exception:
msg = _('Unable to create application.')
redirect = reverse("horizon:solum:applications:index")
exceptions.handle(request, msg, redirect=redirect)
return False
class LaunchForm(forms.SelfHandlingForm):
du_id = forms.CharField(label=_("ID of the DU image"), required=False)
def handle(self, request, data):
app_id = self.initial.get('application_id')
LOG.info('LaunchApplication %s' % data)
solum = solumclient(request)
if data["du_id"]:
actions = ['deploy']
cli_wf.WorkflowManager(
solum, app_id=app_id).create(
actions=actions, du_id=data["du_id"])
else:
actions = ['unittest', 'build', 'deploy']
cli_wf.WorkflowManager(
solum, app_id=app_id).create(
actions=actions)
return True

View File

@ -1,28 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.utils.translation import ugettext_lazy as _
import horizon
import solumdashboard.dashboard
class ApplicationsPanel(horizon.Panel):
name = _("Applications")
slug = 'applications'
solumdashboard.dashboard.SolumPlugin.register(ApplicationsPanel)

View File

@ -1,117 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ungettext_lazy
from horizon import tables
from horizon.utils import filters
from solumclient.v1 import app as cli_app
from solumdashboard.api.client import client as solumclient
from solumdashboard.applications import tabs
class CreateApplication(tables.LinkAction):
name = "create"
verbose_name = _("New Application")
url = "horizon:solum:applications:create"
classes = ("btn-launch", "ajax-modal")
class ScaleApplication(tables.LinkAction):
name = "scale"
verbose_name = _("Scale Application")
url = "horizon:solum:applications:scale"
classes = ("btn-launch", "ajax-modal")
class UpdateApplication(tables.LinkAction):
name = "update"
verbose_name = _("Update Application")
url = "horizon:solum:applications:update"
classes = ("btn-launch", "ajax-modal")
class LaunchApplication(tables.LinkAction):
name = "build-and-deploy"
verbose_name = _("Build and Deploy Application")
url = "horizon:solum:applications:launch"
classes = ("btn-launch", "ajax-modal")
def allowed(self, request, package):
return True
class DeleteApplication(tables.DeleteAction):
name = "delete"
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Application",
u"Delete Applications",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Deleted Application",
u"Deleted Applications",
count
)
def allowed(self, request, template):
return True
def delete(self, request, application_id):
solum = solumclient(request)
cli_app.AppManager(solum).delete(app_id=application_id)
class ViewApplicationLogs(tables.LinkAction):
name = "view"
verbose_name = _("View Application Logs")
url = "horizon:solum:applications:detail"
classes = ("btn-edit",)
def get_link_url(self, datum):
base_url = super(ViewApplicationLogs, self).get_link_url(datum)
tab_query_string = tabs.LogTab(
tabs.AppDetailsTabs).get_query_string()
return "?".join([base_url, tab_query_string])
class ApplicationsTable(tables.DataTable):
name = tables.Column('name', verbose_name=_('Name'))
id = tables.Column('id', verbose_name=_('ID'),
link=("horizon:solum:applications:detail"))
created_at = tables.Column('created_at', verbose_name=_('Created at'),
filters=(filters.parse_isotime,))
description = tables.Column('description', verbose_name=_('Description'))
languagepack = tables.Column('languagepack',
verbose_name=_('Languagepack'))
def get_object_id(self, app):
return app.id
class Meta(object):
name = "applications"
verbose_name = _("Applications")
table_actions = (CreateApplication, DeleteApplication)
row_actions = (LaunchApplication, ViewApplicationLogs,
DeleteApplication, ScaleApplication, UpdateApplication)

View File

@ -1,81 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.utils.translation import ugettext_lazy as _
import json
from horizon import tabs
from solumclient.v1 import workflow as cli_wf
from solumdashboard.api.client import client as solumclient
class GeneralTab(tabs.Tab):
name = _("General Info")
slug = "application_details_tab"
template_name = ("applications/_detail.html")
def get_context_data(self, request):
app_id = self.tab_group.kwargs['application_id']
solum = solumclient(request)
app = solum.apps.find(name_or_id=app_id)
app.trigger = app.trigger_actions
app.workflow = app.workflow_config
if app.scale_config:
app.target_instances = app.scale_config[app.name].get('target', '')
workflowman = cli_wf.WorkflowManager(solum, app_id=app_id)
workflows = workflowman.list()
return {"application": app, "workflows": workflows}
class LogTab(tabs.Tab):
name = _("Logs")
slug = "application_logs_tab"
template_name = ("applications/_log.html")
def get_context_data(self, request):
app_id = self.tab_group.kwargs['application_id']
solum = solumclient(request)
app = solum.apps.find(name_or_id=app_id)
workflowman = cli_wf.WorkflowManager(solum, app_id=app_id)
workflows = workflowman.list()
logs_list = []
for workflow in workflows:
revision = workflow.wf_id
loglist = workflowman.logs(revision_or_id=revision)
for log in loglist:
logs_list.append(log)
strategy_info = json.loads(log.strategy_info)
if log.strategy == 'local':
log.local_storage = log.location
elif log.strategy == 'swift':
log.swift_container = strategy_info['container']
log.swift_path = log.location
return {"logs": logs_list, "application": app}
class AppDetailsTabs(tabs.TabGroup):
slug = "application_details"
tabs = (GeneralTab, LogTab)
sticky = True

View File

@ -1,33 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.urls import re_path
import solumdashboard.applications.views as views
urlpatterns = [
re_path(r'^$', views.IndexView.as_view(), name='index'),
re_path(r'^$', views.IndexView.as_view(), name='applications'),
re_path(r'^create$', views.CreateView.as_view(), name='create'),
re_path(r'^launch/(?P<application_id>[^/]+)$', views.LaunchView.as_view(),
name='launch'),
re_path(r'^detail/(?P<application_id>[^/]+)$',
views.DetailView.as_view(), name='detail'),
re_path(r'^scale/(?P<application_id>[^/]+)$', views.ScaleView.as_view(),
name='scale'),
re_path(r'^update/(?P<application_id>[^/]+)$', views.UpdateView.as_view(),
name='update')
]

View File

@ -1,138 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.urls import reverse
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import tables
from horizon import tabs
from horizon import workflows
from solumdashboard.api.client import client as solumclient
from solumdashboard.applications import forms as app_forms
from solumdashboard.applications import tables as app_tables
import solumdashboard.applications.tabs as _tabs
from solumdashboard.applications import workflows as update_flow
class IndexView(tables.DataTableView):
table_class = app_tables.ApplicationsTable
template_name = 'applications/index.html'
page_title = _("Applications")
def get_data(self):
try:
solum = solumclient(self.request)
apps = solum.apps.list()
except Exception:
apps = []
exceptions.handle(
self.request,
_('Unable to retrieve apps.'))
return apps
class CreateView(forms.ModalFormView):
form_class = app_forms.CreateForm
template_name = 'applications/create.html'
modal_header = _("Create Application")
page_title = _("Create Application")
submit_url = reverse_lazy('horizon:solum:applications:create')
success_url = reverse_lazy("horizon:solum:applications:index")
class ScaleView(forms.ModalFormView):
form_class = app_forms.ScaleForm
template_name = "applications/scale.html"
modal_header = _("Scale Application")
page_title = _("Scale Application")
submit_url = reverse_lazy('horizon:solum:applications:scale')
success_url = reverse_lazy("horizon:solum:applications:index")
failure_url = reverse_lazy("horizon:solum:applications:index")
def get_context_data(self, **kwargs):
context = super(ScaleView, self).get_context_data(**kwargs)
context["application_id"] = self.kwargs["application_id"]
return context
def get_initial(self):
application_id = self.kwargs['application_id']
return {'application_id': application_id}
class UpdateView(workflows.WorkflowView):
workflow_class = update_flow.UpdateApplicationClass
success_url = "horizon:solum:applications:index"
classes = ("ajax-modal")
def get_context_data(self, **kwargs):
context = super(UpdateView, self).get_context_data(**kwargs)
context["application_id"] = self.kwargs["application_id"]
return context
def _get_object(self, *args, **kwargs):
application_id = self.kwargs['application_id']
solum = solumclient(self.request)
app = solum.apps.find(name_or_id=application_id)
return app
def get_initial(self):
app = self._get_object()
return {'application_id': app.id}
class DetailView(tabs.TabView):
template_name = 'applications/detail.html'
tab_group_class = _tabs.AppDetailsTabs
page_title = "{{ app.name|default:app.id }}"
def get_context_data(self, **kwargs):
context = super(DetailView, self).get_context_data(**kwargs)
application_id = self.kwargs['application_id']
app = None
try:
solum = solumclient(self.request)
app = solum.apps.find(name_or_id=application_id)
except Exception:
INDEX_URL = 'horizon:solum:applications:index'
exceptions.handle(
self.request,
_('Unable to retrieve application details.'),
redirect=reverse(INDEX_URL))
context["app"] = app
table = app_tables.ApplicationsTable(self.request)
context["actions"] = table.render_row_actions(app)
return context
class LaunchView(forms.ModalFormView):
form_class = app_forms.LaunchForm
template_name = "applications/launch.html"
modal_header = _("Launch Application")
page_title = _("Launch Application")
success_url = reverse_lazy("horizon:solum:applications:index")
failure_url = reverse_lazy("horizon:solum:applications:index")
def get_context_data(self, **kwargs):
context = super(LaunchView, self).get_context_data(**kwargs)
context["application_id"] = self.kwargs["application_id"]
return context
def get_initial(self):
application_id = self.kwargs['application_id']
return {'application_id': application_id}

View File

@ -1,3 +0,0 @@
# Importing non-modules that are not used explicitly
from .update import UpdateApplicationClass # noqa

View File

@ -1,70 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.utils.translation import ugettext_lazy as _
from horizon import forms
from horizon import workflows
from solumdashboard.api.client import client as solumclient
class UpdateApplicationAction(workflows.Action):
name = forms.CharField(label=_("Application Name"), required=False)
description = forms.CharField(label=_("Description"), required=False)
languagepack = forms.CharField(label=_("Languagepack"), required=False)
ports = forms.IntegerField(label=_("Ports"), required=False)
source = {}
source["repository"] = forms.CharField(label=_("Source Repository"),
required=False)
source["revision"] = forms.CharField(label=_("Source Revision"),
required=False)
workflow_config = {}
workflow_config["test_cmd"] = forms.CharField(
label=_("Workflow Test Command"), required=False)
workflow_config["run_cmd"] = forms.CharField(
label=_("Workflow Run Command"), required=False)
class UpdateApplication(workflows.Step):
action_class = UpdateApplicationAction
depends_on = ("application_id",)
contributes = ("name", "description", "languagepack", "ports", "source",
"workflow_config")
class UpdateApplicationClass(workflows.Workflow):
slug = "update_app"
name = _("Update App")
finalize_button_name = _("Update")
success_message = _("App updated")
failure_message = _("Could not update app")
success_url = "horizon:solum:applications:index"
default_steps = (UpdateApplication,)
depends_on = ("application_id",)
contributions = ("name", "description", "languagepack", "ports", "source",
"workflow_config")
def handle(self, request, data):
to_update = {}
for field in data:
if data[field] and field != 'application_id':
to_update[field] = data[field]
solum = solumclient(request)
solum.apps.patch(data["application_id"], data=to_update)
return True

View File

@ -1,28 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.utils.translation import ugettext_lazy as _
import horizon
import solumdashboard.dashboard
class AssembliesPanel(horizon.Panel):
name = _("Assemblies")
slug = 'assemblies'
solumdashboard.dashboard.SolumPlugin.register(AssembliesPanel)

View File

@ -1,79 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ungettext_lazy
from horizon import tables
from solumdashboard.api.client import client as solumclient
class CreateAssembly(tables.LinkAction):
name = "create"
verbose_name = _("New Assembly")
url = "horizon:solum:assemblies:create"
classes = ("btn-launch", "ajax-modal")
class DeleteAssembly(tables.DeleteAction):
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Assembly",
u"Delete Assemblies",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Scheduled deletion of Assembly",
u"Scheduled deletion of Assemblies",
count
)
def allowed(self, request, template):
return True
def action(self, request, assembly_id):
solum = solumclient(request)
solum.assemblies.delete(assembly_id=assembly_id)
class ViewAssembly(tables.LinkAction):
name = "view"
verbose_name = _("View")
url = "horizon:solum:assemblies:detail"
classes = ("btn-edit",)
class AssembliesTable(tables.DataTable):
uuid = tables.Column('uuid', verbose_name=_('UUID'),
link=("horizon:solum:assemblies:detail"))
name = tables.Column('name', verbose_name=_('Name'))
application = tables.Column('application', verbose_name=_('Application'),
link=("horizon:solum:applications:detail"))
description = tables.Column('description', verbose_name=_('Description'))
def get_object_id(self, app):
return app.uuid
class Meta(object):
name = "assemblies"
verbose_name = _("Assemblies")
table_actions = (DeleteAssembly,)
row_actions = (ViewAssembly, DeleteAssembly)

View File

@ -1,37 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.utils.translation import ugettext_lazy as _
from horizon import tabs
from solumdashboard.api.client import client as solumclient
class GeneralTab(tabs.Tab):
name = _("General Info")
slug = "assembly_details_tab"
template_name = ("assemblies/_detail.html")
def get_context_data(self, request):
assem_id = self.tab_group.kwargs['assembly_id']
solum = solumclient(request)
assem = solum.assemblies.get(assembly_id=assem_id)
return {"assembly": assem}
class AssemDetailsTabs(tabs.TabGroup):
slug = "assembly_details"
tabs = (GeneralTab,)
sticky = True

View File

@ -1,26 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.urls import re_path
import solumdashboard.assemblies.views as views
urlpatterns = [
re_path(r'^$', views.IndexView.as_view(), name='index'),
re_path(r'^$', views.IndexView.as_view(), name='assemblies'),
re_path(r'^(?P<assembly_id>[^/]+)$', views.DetailView.as_view(),
name='detail')
]

View File

@ -1,58 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import tables
from horizon import tabs
from solumdashboard.api.client import client as solumclient
from solumdashboard.assemblies import tables as assem_tables
import solumdashboard.assemblies.tabs as _tabs
class IndexView(tables.DataTableView):
table_class = assem_tables.AssembliesTable
template_name = 'assemblies/index.html'
page_title = _("Assemblies")
def get_data(self):
try:
solum = solumclient(self.request)
assemblies = solum.assemblies.list()
except Exception:
assemblies = []
exceptions.handle(
self.request,
_('Unable to retrieve assemblies.'))
return assemblies
class DetailView(tabs.TabView):
template_name = 'assemblies/detail.html'
tab_group_class = _tabs.AssemDetailsTabs
page_title = "{{ assem.name|default:assem.uuid }}"
def get_context_data(self, **kwargs):
context = super(DetailView, self).get_context_data(**kwargs)
assem_id = kwargs['assembly_id']
solum = solumclient(self.request)
assem = solum.assemblies.get(assembly_id=assem_id)
context["assem"] = assem
return context
def get_data(self):
pass

View File

@ -1,166 +0,0 @@
# Copyright 2014 - Rackspace
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
Mistral DSL and Heat Template parsing and representation routines.
This code does not import the original YAML representations of the Mistral DSL
and Heat Templates as the data may be in memory instead of file. PyYAML is a
good library to load the YAML and translate into a Python dictionary with code
like:
import yaml
with open("mistral_dsl.yaml", "r") as fptr
data = yaml.safe_load(fptr)
Important note:
This code expects that the loading code performs some basic YAML validation
* Mistral DSLs must include a "Workflow" section with a "tasks" subsection
* Mistral DSLs must have one task with no on-success (last task)
* Heat Templates must include a "requirements" section
"""
def get_mistral_tasks(data, start_task_name=None):
"""Returns an ordered Mistral task list from a DSL."""
task_list = []
task_dict = data["Workflow"]["tasks"]
for key, task in task_dict.items():
on_success = task.get("on-finish", task.get("on-success"))
on_error = task.get("on-finish", task.get("on-error"))
task_list.append([key, on_success, on_error])
curr_task_name = None
sorted_task_list = []
no_suc_list = ([[name, on_suc, on_err] for (name, on_suc, on_err) in
task_list if on_suc is None])
sorted_task_list.insert(0, no_suc_list[0])
curr_task_name = no_suc_list[0][0]
for count in range(len(task_list) - 1):
for task in task_list:
task_name, on_success, on_error = task
if on_success == curr_task_name:
curr_task_name = task_name
sorted_task_list.insert(0, task)
break
if start_task_name:
if start_task_name == task_name:
break
return sorted_task_list
def create_svg_mistral_tasks(task_list, radius=45):
"""Create an SVG UI diagram of Mistral task flow.
This takes the output of get_mistral_tasks() and generates an SVG-based
graphical diagram of the ordered Mistral tasks. The code automatically
scales the SVG based on the circle radius value. Note that SVG circles
don't scale radius by percentages very well which is why this is still
pixel math. The circle radius is the diagonal length of the viewport
which is not very useful in this case.
"""
indent = radius * 1.1
diameter = radius * 2
num_tasks = len(task_list)
if num_tasks < 1:
return "[No Tasks Found]"
svg_output = ("<svg height=\"%d\" width=\"%d\">\n" %
((diameter * 1.10), ((num_tasks-1) * diameter * 1.3) +
indent * 2))
svg_output += (" <line x1=\"%d\" y1=\"50%%\" x2=\"%d\" y2=\"50%%\" style="
"\"stroke:rgb(0,0,0);stroke-width:3\"/>\n" %
(indent, ((num_tasks-1) * diameter * 1.2) + indent))
svg_output += (" <g stroke=\"black\" stroke-width=\"3\" fill="
"\"lightgrey\">\n")
for counter in range(num_tasks):
svg_output += (" <circle cx=\"%d\" cy=\"50%%\" r=\"%d\"/>\n" %
((counter * diameter * 1.2 + indent), radius))
svg_output += " </g>\n"
svg_output += " <g style=\"text-anchor: middle; font-size: 13px\">\n"
for counter in range(num_tasks):
svg_output += (" <text x=\"%d\" y=\"55%%\">%s</text>\n" %
((counter * diameter * 1.2 + indent),
task_list[counter][0]))
svg_output += " </g>\n"
svg_output += "</svg>\n"
return svg_output
def get_mistral_required_input(data, start_task_name=None):
"""Returns required Mistral DSL user input field information.
Note that this code ignores Mistral DSL values that are enumerated in the
ignore_list list below which are under the "parameters:" label. The
recommendation is to not nest sections under a "parameters:" label and
just list name/value pairs in the parameters section.
"""
input_dict = {}
task_list = get_mistral_tasks(data, start_task_name)
task_key_list = [item[0] for item in task_list]
task_dict = data["Workflow"]["tasks"]
ignore_list = ["params", "settings", "arguments"]
publish_list = []
for task in task_key_list:
param_list = task_dict[task].get("parameters", [])
publish_list.extend(task_dict[task].get("publish", []))
for param in param_list:
if param not in ignore_list and param not in publish_list:
if param not in input_dict:
input_dict[param] = [task]
else:
input_dict[param].append(task)
return input_dict
def get_heat_required_input(data):
"""Returns Heat required user input fields."""
heat_params = []
heat_param_dict = data["parameters"]
for key, heat_param in heat_param_dict.items():
heat_params.append([key,
heat_param.get("type"),
heat_param.get("default"),
heat_param.get("description")])
return sorted(heat_params)
if __name__ == "__main__":
# This code is left for example and basic testing purposes; it is not
# intended for production use.
import yaml
with open("dsl.yaml", "r") as FPTR:
DATA = yaml.safe_load(FPTR)
print("\nMistral Task workflow:")
RET_DICT = get_mistral_tasks(DATA)
for VAL in RET_DICT:
print("%s - success: %s, error: %s" % (VAL[0], VAL[1], VAL[2]))
SVG_TEXT = create_svg_mistral_tasks(RET_DICT, 45)
print("\nSVG task output:\n" + SVG_TEXT)
# Mistral required input
print("\nMistral required inputs:")
RET_DICT = get_mistral_required_input(DATA)
for KEY, VAL in RET_DICT.items():
print(KEY, "", VAL)
# Heat required input
print("\nHeat required inputs:")
with open("hot.yaml", "r") as FPTR:
DATA = yaml.safe_load(FPTR)
RET_DICT = get_heat_required_input(DATA)
for VAL in RET_DICT:
print("%s - %s, %s, %s" % (VAL[0], VAL[1], VAL[2], VAL[3]))

View File

@ -1,30 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.utils.translation import ugettext_lazy as _
import horizon
class SolumPlugin(horizon.Dashboard):
name = _("Solum")
slug = "solum"
panels = ('applications', 'assemblies', 'languagepacks')
default_panel = 'applications'
nav = True
supports_tenants = True
horizon.register(SolumPlugin)

View File

@ -1,22 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from openstack_dashboard import exceptions
# from solumclient.openstack.common.apiclient import exceptions as solumclient
NOT_FOUND = exceptions.NOT_FOUND
RECOVERABLE = exceptions.RECOVERABLE
# + (solumclient.ClientException,)
UNAUTHORIZED = exceptions.UNAUTHORIZED

View File

@ -1,73 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import json
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import messages
from oslo_log import log as logging
import yaml
from solumdashboard.api.client import client as solumclient
LOG = logging.getLogger(__name__)
class CreateForm(forms.SelfHandlingForm):
source_uri = forms.CharField(label=_("Source URI"))
name = forms.CharField(label=_("Languagepack Name"), max_length=100)
description = forms.CharField(label=_("Description"), required=False,
max_length=255)
param_file = forms.FileField(label=_("Parameter File"),
required=False)
lp_metadata = forms.FileField(label=_("Languagepack Metadata File"),
required=False)
def handle(self, request, data):
LOG.info('CreateLanguagepack %s' % data)
solum = solumclient(request)
param_data = {}
if data['param_file']:
inf = data['param_file'].read()
param_data = yaml.load(inf)
lp_metadata = None
if data['lp_metadata']:
lp_metadata = json.dumps(json.load(data['lp_metadata']))
try:
solum.languagepacks.create(
name=data['name'], source_uri=data['source_uri'],
lp_metadata=lp_metadata, lp_params=param_data,
description=data['description'])
message = _(
'Languagepack %s was successfully created.') % data['name']
messages.success(request, message)
except Exception:
redirect = reverse('horizon:solum:languagepacks:index')
exceptions.handle(
self.request,
_('Unable to create languagepack.'),
redirect=redirect)
return True

View File

@ -1,28 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.utils.translation import ugettext_lazy as _
import horizon
import solumdashboard.dashboard
class LanguagepacksPanel(horizon.Panel):
name = _("Languagepacks")
slug = 'languagepacks'
solumdashboard.dashboard.SolumPlugin.register(LanguagepacksPanel)

View File

@ -1,91 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ungettext_lazy
from horizon import tables
from solumdashboard.api.client import client as solumclient
class DeleteLanguagepack(tables.DeleteAction):
name = "delete"
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Languagepack",
u"Delete Languagepacks",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Deleted Languagepack",
u"Deleted Languagepacks",
count
)
def allowed(self, request, template):
return True
def delete(self, request, languagepack_id):
solum = solumclient(request)
solum.languagepacks.delete(lp_id=languagepack_id)
class UpdateRow(tables.Row):
ajax = True
def get_data(self, request, languagepack_id):
solum = solumclient(request)
return solum.languagepacks.find(name_or_id=languagepack_id)
class CreateLanguagepack(tables.LinkAction):
name = "create"
verbose_name = _("New Languagepack")
url = "horizon:solum:languagepacks:create"
classes = ("btn-launch", "ajax-modal")
class LanguagepacksTable(tables.DataTable):
STATUS_CHOICES = (
("QUEUED", None),
("BUILDING", None),
("ERROR", False),
("READY", True),
)
uuid = tables.Column("uuid", verbose_name=_("UUID"),
link=("horizon:solum:languagepacks:detail"))
name = tables.Column("name", verbose_name=_("Name"))
description = tables.Column("description", verbose_name=_("Description"))
status = tables.Column("status", verbose_name=_("Status"),
status=True,
status_choices=STATUS_CHOICES)
source_uri = tables.Column("source_uri", verbose_name=_("Source Uri"))
def get_object_id(self, lp):
return lp.uuid
class Meta(object):
name = "languagepacks"
verbose_name = _("Languagepacks")
row_class = UpdateRow
status_columns = ["status"]
table_actions = (CreateLanguagepack, DeleteLanguagepack)
row_actions = (DeleteLanguagepack,)

View File

@ -1,26 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.urls import re_path
from solumdashboard.languagepacks import views
urlpatterns = [
re_path(r'^$', views.IndexView.as_view(), name='index'),
re_path(r'^$', views.IndexView.as_view(), name='languagepacks'),
re_path(r'^detail/(?P<languagepack_id>[^/]+)$',
views.DetailView.as_view(), name='detail'),
re_path(r'^create$', views.CreateView.as_view(), name='create')
]

View File

@ -1,98 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.urls import reverse
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
import json
from horizon import exceptions
from horizon import forms
from horizon import tables
from horizon import views
from solumclient.v1 import languagepack as cli_lp
from solumdashboard.api.client import client as solumclient
from solumdashboard.languagepacks import forms as lp_forms
from solumdashboard.languagepacks import tables as lp_tables
class IndexView(tables.DataTableView):
table_class = lp_tables.LanguagepacksTable
template_name = 'languagepacks/index.html'
page_title = _("Languagepacks")
def get_data(self):
try:
solum = solumclient(self.request)
languagepacks = solum.languagepacks.list()
except Exception:
languagepacks = []
exceptions.handle(
self.request,
_('Unable to retrieve languagepacks.'))
return languagepacks
class DetailView(views.HorizonTemplateView):
template_name = 'languagepacks/detail.html'
page_title = "{{ languagepack.name }}"
def get_context_data(self, **kwargs):
context = super(DetailView, self).get_context_data(**kwargs)
languagepack, loglist = self.get_data()
context["languagepack"] = languagepack
context["loglist"] = loglist
table = lp_tables.LanguagepacksTable(self.request)
context["actions"] = table.render_row_actions(languagepack)
return context
def get_data(self):
lp_id = self.kwargs['languagepack_id']
solum = solumclient(self.request)
languagepack = None
loglist = []
try:
languagepack = solum.languagepacks.find(name_or_id=lp_id)
loglist = cli_lp.LanguagePackManager(solum).logs(
lp_id=lp_id)
except Exception:
INDEX_URL = 'horizon:solum:languagepacks:index'
exceptions.handle(
self.request,
_('Unable to retrieve languagepack details.'),
redirect=reverse(INDEX_URL))
for log in loglist:
strategy_info = json.loads(log.strategy_info)
if log.strategy == 'local':
log.local_storage = log.location
elif log.strategy == 'swift':
log.swift_container = strategy_info['container']
log.swift_path = log.location
return languagepack, loglist
class CreateView(forms.ModalFormView):
form_class = lp_forms.CreateForm
template_name = 'languagepacks/create.html'
modal_header = _("Create Languagepack")
page_title = _("Create Languagepack")
submit_url = reverse_lazy("horizon:solum:languagepacks:create")
success_url = reverse_lazy("horizon:solum:languagepacks:index")

View File

@ -1,4 +0,0 @@
DASHBOARD = 'solum'
ADD_INSTALLED_APPS = ['solumdashboard']
DEFAULT = True
ADD_EXCEPTIONS = {}

View File

@ -1,339 +0,0 @@
# Frank Kloeker <eumel@arcor.de>, 2018. #zanata
# Andreas Jaeger <jaegerandi@gmail.com>, 2020. #zanata
msgid ""
msgstr ""
"Project-Id-Version: solum-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2020-09-25 06:08+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2020-10-05 06:38+0000\n"
"Last-Translator: Andreas Jaeger <jaegerandi@gmail.com>\n"
"Language-Team: German\n"
"Language: de\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
msgid "A yaml file containing custom parameters"
msgstr "Eine Yaml-Datei mit benutzerdefinierten Parametern"
msgid "App File"
msgstr "Anwendungsdatei"
msgid "App URL"
msgstr "App-URL"
msgid "App updated"
msgstr "App aktualisiert"
msgid "Application"
msgstr "Anwendung"
msgid "Application Details"
msgstr "Anwendungsdetails"
msgid "Application Name"
msgstr "Anwendungsname"
msgid "Application entry point"
msgstr "Anwendungseinstiegspunkt"
msgid "Application was successfully created."
msgstr "Die Anwendung wurde erfolgreich erstellt."
msgid "Applications"
msgstr "Anwendungen"
msgid "Assemblies"
msgstr "Baugruppen"
msgid "Assembly Details"
msgstr "Details zur Baugruppe"
msgid "Build and Deploy Application"
msgstr "Erstellen und Bereitstellen von Anwendungen"
msgid "Command to execute unit tests"
msgstr "Befehl zum Ausführen von Komponententests"
msgid "Could not update app"
msgstr "Die App konnte nicht aktualisiert werden"
msgid "Create Application"
msgstr "Anwendung erstellen"
msgid "Create Languagepack"
msgstr "Sprachpaket erstellen"
msgid "Created at"
msgstr "Hergestellt in"
msgid "Delete Application"
msgid_plural "Delete Applications"
msgstr[0] "Lösche Anwendung"
msgstr[1] "Lösche Anwendungen"
msgid "Delete Assembly"
msgid_plural "Delete Assemblies"
msgstr[0] "Gelöschte Baugruppe"
msgstr[1] "Gelöschte Baugruppen"
msgid "Delete Languagepack"
msgid_plural "Delete Languagepacks"
msgstr[0] "Lösche Sprachpaket"
msgstr[1] "Lösche Sprachpakete"
msgid "Deleted Application"
msgid_plural "Deleted Applications"
msgstr[0] "Gelöschte Anwendung"
msgstr[1] "Gelöschte Anwendungen"
msgid "Deleted Languagepack"
msgid_plural "Deleted Languagepacks"
msgstr[0] "Gelöschtes Sprachpaket"
msgstr[1] "Gelöschte Sprachpakete"
msgid "Deploy Application"
msgstr "Stellen Sie die Anwendung bereit"
msgid "Description"
msgstr "Beschreibung"
msgid "Description:"
msgstr "Beschreibung:"
msgid "Enter the details for the application."
msgstr "Geben Sie die Details für die Anwendung ein."
msgid "Enter the details for the languagepack."
msgstr "Geben Sie die Details für das Sprachpaket ein."
msgid "Entry points"
msgstr "Einstiegspunkte"
msgid "General Info"
msgstr "Allgemeine Information"
msgid "ID"
msgstr "ID"
msgid "ID of the DU image"
msgstr "ID des DU-Abbildes"
msgid "Input"
msgstr "Eingang"
msgid "Languagepack"
msgstr "Sprachpaket"
#, python-format
msgid "Languagepack %s was successfully created."
msgstr "Sprachpaket %s wurde erfolgreich erstellt."
msgid "Languagepack Details"
msgstr "Sprachpaket Details"
msgid "Languagepack Metadata File"
msgstr "Sprachpaket-Metadaten-Datei"
msgid "Languagepack Name"
msgstr "Sprachpaketname"
msgid "Languagepacks"
msgstr "Sprachpakete"
msgid "Launch Application"
msgstr "Programm starten"
msgid "Local Storage"
msgstr "Lokaler Speicher"
msgid "Local app file location"
msgstr "Speicherort der lokalen Anwendungsdatei"
msgid "Location"
msgstr "Ort"
msgid "Log details"
msgstr "Protokolldetails"
msgid "Log details for "
msgstr "Protokolldetails für"
msgid "Logs"
msgstr "Protokolle"
msgid "Name"
msgstr "Name"
msgid "New Application"
msgstr "Neue Anwendung"
msgid "New Assembly"
msgstr "Neue Baugruppen"
msgid "New Languagepack"
msgstr "Neues Sprachpaket"
msgid "No Log details."
msgstr "Keine Protokolldetails."
msgid "No Workflow details."
msgstr "Keine Workflowdetails."
msgid "Parameter File"
msgstr "Parameterdatei"
msgid "Please supply a github url"
msgstr "Bitte gib eine Github-URL an"
msgid "Please supply a languagepack"
msgstr "Bitte liefern Sie ein Sprachpaket"
msgid "Please supply a name"
msgstr "Bitte geben Sie einen Namen an"
msgid "Please supply a run command"
msgstr "Bitte geben Sie einen Laufbefehl ein"
msgid "Please supply an app file"
msgstr "Bitte geben Sie eine App-Datei an"
msgid "Ports"
msgstr "Ports"
msgid "Resource UUID"
msgstr "Ressourcen-UUID"
msgid "Scale Application"
msgstr "Anwendung skalieren"
msgid "Scale target must be greater than zero"
msgstr "Maßstabsziel muss größer als Null sein"
msgid "Scheduled deletion of Assembly"
msgid_plural "Scheduled deletion of Assemblies"
msgstr[0] "Geplante Baugruppenlöschung"
msgstr[1] "Geplante Baugruppenlöschungen"
msgid "Solum"
msgstr "Solum"
msgid "Solum - Applications"
msgstr "Solum - Anwendungen"
msgid "Solum - Assemblies"
msgstr "Solum - Baugruppen"
msgid "Solum - Languagepacks"
msgstr "Solum - Sprachpakete"
msgid "Source"
msgstr "Quelle"
msgid "Source Repository"
msgstr "Quell-Repository"
msgid "Source Revision"
msgstr "Quellversion"
msgid "Source URI"
msgstr "Quell-URI"
msgid "Source Uri"
msgstr "Quelle Uri"
msgid "Source repository"
msgstr "Quell-Repository"
msgid "Status"
msgstr "Status"
msgid "Swift Container"
msgstr "Schneller Behälter"
msgid "Swift Path"
msgstr "Schneller Pfad"
msgid "Target"
msgstr "Ziel"
msgid "Target Instances"
msgstr "Zielinstanzen"
msgid ""
"The ID of the DU image is optional, You can deploy the applications without "
"this."
msgstr ""
"Die ID des DU-Abbildes ist optional. Sie können die Anwendungen ohne dieses "
"bereitstellen."
msgid "The port your application listens on"
msgstr "Der Port, auf den Ihre Anwendung zugreift"
msgid "Trigger"
msgstr "Auslösen"
msgid "Trigger URI"
msgstr "Auslöser-URI"
msgid "Trigger UUID"
msgstr "Auslöser UUID"
msgid "URI"
msgstr "URI"
msgid "UUID"
msgstr "UUID"
msgid "Unable to create application."
msgstr "Die Anwendung konnte nicht erstellt werden."
msgid "Unable to create languagepack."
msgstr "Kann Sprachpaket nicht erstellen."
msgid "Unable to retrieve application details."
msgstr "Die Anwendungsdetails konnten nicht abgerufen werden."
msgid "Unable to retrieve apps."
msgstr "Apps konnten nicht abgerufen werden."
msgid "Unable to retrieve assemblies."
msgstr "Kann Baugruppen nicht abrufen."
msgid "Unable to retrieve languagepack details."
msgstr "Die Sprachpaketdetails konnten nicht abgerufen werden."
msgid "Unable to retrieve languagepacks."
msgstr "Sprachpakete konnten nicht abgerufen werden."
msgid "Update"
msgstr "Aktualisieren"
msgid "Update App"
msgstr "App aktualisieren"
msgid "Update Application"
msgstr "Anwendung aktualisieren"
msgid "Updated at"
msgstr "Aktualisiert am"
msgid "View"
msgstr "Ansicht"
msgid "View Application Logs"
msgstr "Anwendungsprotokolle anzeigen"
msgid "Workflow ID"
msgstr "Arbeitsablauf-ID"
msgid "Workflow Run Command"
msgstr "Workflow-Ausführungsbefehl"
msgid "Workflow Test Command"
msgstr "Workflow Testbefehl"
msgid "Workflow details for"
msgstr "Workflowdetails für"

View File

@ -1,339 +0,0 @@
# Andi Chandler <andi@gowling.com>, 2017. #zanata
# Andi Chandler <andi@gowling.com>, 2020. #zanata
msgid ""
msgstr ""
"Project-Id-Version: solum-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2020-09-25 06:08+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2020-10-03 10:35+0000\n"
"Last-Translator: Andi Chandler <andi@gowling.com>\n"
"Language-Team: English (United Kingdom)\n"
"Language: en_GB\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
msgid "A yaml file containing custom parameters"
msgstr "A yaml file containing custom parameters"
msgid "App File"
msgstr "App File"
msgid "App URL"
msgstr "App URL"
msgid "App updated"
msgstr "App updated"
msgid "Application"
msgstr "Application"
msgid "Application Details"
msgstr "Application Details"
msgid "Application Name"
msgstr "Application Name"
msgid "Application entry point"
msgstr "Application entry point"
msgid "Application was successfully created."
msgstr "Application was successfully created."
msgid "Applications"
msgstr "Applications"
msgid "Assemblies"
msgstr "Assemblies"
msgid "Assembly Details"
msgstr "Assembly Details"
msgid "Build and Deploy Application"
msgstr "Build and Deploy Application"
msgid "Command to execute unit tests"
msgstr "Command to execute unit tests"
msgid "Could not update app"
msgstr "Could not update app"
msgid "Create Application"
msgstr "Create Application"
msgid "Create Languagepack"
msgstr "Create Language pack"
msgid "Created at"
msgstr "Created at"
msgid "Delete Application"
msgid_plural "Delete Applications"
msgstr[0] "Delete Application"
msgstr[1] "Delete Applications"
msgid "Delete Assembly"
msgid_plural "Delete Assemblies"
msgstr[0] "Delete Assembly"
msgstr[1] "Delete Assemblies"
msgid "Delete Languagepack"
msgid_plural "Delete Languagepacks"
msgstr[0] "Delete Language pack"
msgstr[1] "Delete Language packs"
msgid "Deleted Application"
msgid_plural "Deleted Applications"
msgstr[0] "Deleted Application"
msgstr[1] "Deleted Applications"
msgid "Deleted Languagepack"
msgid_plural "Deleted Languagepacks"
msgstr[0] "Deleted Language pack"
msgstr[1] "Deleted Language packs"
msgid "Deploy Application"
msgstr "Deploy Application"
msgid "Description"
msgstr "Description"
msgid "Description:"
msgstr "Description:"
msgid "Enter the details for the application."
msgstr "Enter the details for the application."
msgid "Enter the details for the languagepack."
msgstr "Enter the details for the language pack."
msgid "Entry points"
msgstr "Entry points"
msgid "General Info"
msgstr "General Info"
msgid "ID"
msgstr "ID"
msgid "ID of the DU image"
msgstr "ID of the DU image"
msgid "Input"
msgstr "Input"
msgid "Languagepack"
msgstr "Languagepack"
#, python-format
msgid "Languagepack %s was successfully created."
msgstr "Language pack %s was successfully created."
msgid "Languagepack Details"
msgstr "Languagepack Details"
msgid "Languagepack Metadata File"
msgstr "Language pack Metadata File"
msgid "Languagepack Name"
msgstr "Language pack Name"
msgid "Languagepacks"
msgstr "Language packs"
msgid "Launch Application"
msgstr "Launch Application"
msgid "Local Storage"
msgstr "Local Storage"
msgid "Local app file location"
msgstr "Local app file location"
msgid "Location"
msgstr "Location"
msgid "Log details"
msgstr "Log details"
msgid "Log details for "
msgstr "Log details for "
msgid "Logs"
msgstr "Logs"
msgid "Name"
msgstr "Name"
msgid "New Application"
msgstr "New Application"
msgid "New Assembly"
msgstr "New Assembly"
msgid "New Languagepack"
msgstr "New Language pack"
msgid "No Log details."
msgstr "No Log details."
msgid "No Workflow details."
msgstr "No Workflow details."
msgid "Parameter File"
msgstr "Parameter File"
msgid "Please supply a github url"
msgstr "Please supply a github url"
msgid "Please supply a languagepack"
msgstr "Please supply a languagepack"
msgid "Please supply a name"
msgstr "Please supply a name"
msgid "Please supply a run command"
msgstr "Please supply a run command"
msgid "Please supply an app file"
msgstr "Please supply an app file"
msgid "Ports"
msgstr "Ports"
msgid "Resource UUID"
msgstr "Resource UUID"
msgid "Scale Application"
msgstr "Scale Application"
msgid "Scale target must be greater than zero"
msgstr "Scale target must be greater than zero"
msgid "Scheduled deletion of Assembly"
msgid_plural "Scheduled deletion of Assemblies"
msgstr[0] "Scheduled deletion of Assembly"
msgstr[1] "Scheduled deletion of Assemblies"
msgid "Solum"
msgstr "Solum"
msgid "Solum - Applications"
msgstr "Solum - Applications"
msgid "Solum - Assemblies"
msgstr "Solum - Assemblies"
msgid "Solum - Languagepacks"
msgstr "Solum - Languagepacks"
msgid "Source"
msgstr "Source"
msgid "Source Repository"
msgstr "Source Repository"
msgid "Source Revision"
msgstr "Source Revision"
msgid "Source URI"
msgstr "Source URI"
msgid "Source Uri"
msgstr "Source URI"
msgid "Source repository"
msgstr "Source repository"
msgid "Status"
msgstr "Status"
msgid "Swift Container"
msgstr "Swift Container"
msgid "Swift Path"
msgstr "Swift Path"
msgid "Target"
msgstr "Target"
msgid "Target Instances"
msgstr "Target Instances"
msgid ""
"The ID of the DU image is optional, You can deploy the applications without "
"this."
msgstr ""
"The ID of the DU image is optional, You can deploy the applications without "
"this."
msgid "The port your application listens on"
msgstr "The port your application listens on"
msgid "Trigger"
msgstr "Trigger"
msgid "Trigger URI"
msgstr "Trigger URI"
msgid "Trigger UUID"
msgstr "Trigger UUID"
msgid "URI"
msgstr "URI"
msgid "UUID"
msgstr "UUID"
msgid "Unable to create application."
msgstr "Unable to create application."
msgid "Unable to create languagepack."
msgstr "Unable to create language pack."
msgid "Unable to retrieve application details."
msgstr "Unable to retrieve application details."
msgid "Unable to retrieve apps."
msgstr "Unable to retrieve apps."
msgid "Unable to retrieve assemblies."
msgstr "Unable to retrieve assemblies."
msgid "Unable to retrieve languagepack details."
msgstr "Unable to retrieve language pack details."
msgid "Unable to retrieve languagepacks."
msgstr "Unable to retrieve language packs."
msgid "Update"
msgstr "Update"
msgid "Update App"
msgstr "Update App"
msgid "Update Application"
msgstr "Update Application"
msgid "Updated at"
msgstr "Updated at"
msgid "View"
msgstr "View"
msgid "View Application Logs"
msgstr "View Application Logs"
msgid "Workflow ID"
msgstr "Workflow ID"
msgid "Workflow Run Command"
msgstr "Workflow Run Command"
msgid "Workflow Test Command"
msgstr "Workflow Test Command"
msgid "Workflow details for"
msgstr "Workflow details for"

View File

@ -1,325 +0,0 @@
# suhartono <cloudsuhartono@gmail.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: solum-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2020-09-08 06:04+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2018-05-13 03:53+0000\n"
"Last-Translator: suhartono <cloudsuhartono@gmail.com>\n"
"Language-Team: Indonesian\n"
"Language: id\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=1; plural=0\n"
msgid "A yaml file containing custom parameters"
msgstr "File yaml yang berisi parameter khusus"
msgid "App File"
msgstr "App File"
msgid "App URL"
msgstr "App URL"
msgid "App updated"
msgstr "Aplikasi diperbarui"
msgid "Application"
msgstr "Aplikasi"
msgid "Application Details"
msgstr "Detail aplikasi"
msgid "Application Name"
msgstr "Application Name"
msgid "Application entry point"
msgstr "Titik masuk aplikasi"
msgid "Application was successfully created."
msgstr "Aplikasi berhasil dibuat."
msgid "Applications"
msgstr "Aplikasi"
msgid "Assemblies"
msgstr "Assemblies (perakitan)"
msgid "Assembly Details"
msgstr "Rincian Perakitan"
msgid "Build and Deploy Application"
msgstr "Bangun dan Terapkan Aplikasi"
msgid "Command to execute unit tests"
msgstr "Perintah untuk mengeksekusi tes unit"
msgid "Could not update app"
msgstr "Tidak dapat memperbarui aplikasi"
msgid "Create Application"
msgstr "Buat Aplikasi"
msgid "Create Languagepack"
msgstr "Buat Languagepack"
msgid "Created at"
msgstr "Created at (dibuat di)"
msgid "Delete Application"
msgid_plural "Delete Applications"
msgstr[0] "Delete Application"
msgid "Delete Assembly"
msgid_plural "Delete Assemblies"
msgstr[0] "Delete Assembly"
msgid "Delete Languagepack"
msgid_plural "Delete Languagepacks"
msgstr[0] "Delete Languagepack"
msgid "Deleted Application"
msgid_plural "Deleted Applications"
msgstr[0] "Deleted Application"
msgid "Deleted Languagepack"
msgid_plural "Deleted Languagepacks"
msgstr[0] "Deleted Languagepack"
msgid "Deploy Application"
msgstr "Terapkan Aplikasi"
msgid "Description"
msgstr "Deskripsi"
msgid "Description:"
msgstr "Deskripsi:"
msgid "Enter the details for the application."
msgstr "Masukkan detail untuk aplikasi."
msgid "Enter the details for the languagepack."
msgstr "Masukkan detail untuk languagepack."
msgid "Entry points"
msgstr "Titik masuk"
msgid "General Info"
msgstr "Informasi Umum"
msgid "ID"
msgstr "ID"
msgid "ID of the DU image"
msgstr "ID image DU"
msgid "Input"
msgstr "Input"
msgid "Languagepack"
msgstr "Languagepack"
#, python-format
msgid "Languagepack %s was successfully created."
msgstr "Languagepack %s berhasil dibuat."
msgid "Languagepack Details"
msgstr "Detail Languagepack"
msgid "Languagepack Metadata File"
msgstr "File Metadata Languagepack"
msgid "Languagepack Name"
msgstr "Nama Languagepack"
msgid "Languagepacks"
msgstr "Languagepack"
msgid "Launch Application"
msgstr "Launch Application"
msgid "Local Storage"
msgstr "Penyimpanan lokal"
msgid "Local app file location"
msgstr "Lokasi file aplikasi lokal"
msgid "Location"
msgstr "Lokasi"
msgid "Log details"
msgstr "Detail log"
msgid "Log details for "
msgstr "Detail log untuk"
msgid "Logs"
msgstr "Log"
msgid "Name"
msgstr "Name"
msgid "New Application"
msgstr "Aplikasi baru"
msgid "New Assembly"
msgstr "New Assembly (perakitan baru)"
msgid "New Languagepack"
msgstr "Languagepack baru"
msgid "No Log details."
msgstr "Tidak ada rincian Log."
msgid "No Workflow details."
msgstr "Tidak ada detail Alur Kerja."
msgid "Parameter File"
msgstr "File Parameter"
msgid "Please supply a github url"
msgstr "Harap berikan url github"
msgid "Please supply a languagepack"
msgstr "Harap berikan languagepack"
msgid "Please supply a name"
msgstr "Harap berikan nama"
msgid "Please supply a run command"
msgstr "Harap berikan perintah run"
msgid "Please supply an app file"
msgstr "Harap berikan file aplikasi"
msgid "Ports"
msgstr "Port"
msgid "Resource UUID"
msgstr "Sumber UUID"
msgid "Scale Application"
msgstr "Aplikasi Skala"
msgid "Scale target must be greater than zero"
msgstr "Target skala harus lebih besar dari nol"
msgid "Scheduled deletion of Assembly"
msgid_plural "Scheduled deletion of Assemblies"
msgstr[0] "Scheduled deletion of Assembly"
msgid "Solum"
msgstr "Solum"
msgid "Solum - Applications"
msgstr "Solum - Aplikasi"
msgid "Solum - Assemblies"
msgstr "Solum - Rakitan"
msgid "Solum - Languagepacks"
msgstr "Solum - Languagepack"
msgid "Source"
msgstr "Source"
msgid "Source Repository"
msgstr "Source Repository"
msgid "Source Revision"
msgstr "Source Revision"
msgid "Source URI"
msgstr "Source URI"
msgid "Source Uri"
msgstr "Source Uri"
msgid "Source repository"
msgstr "Sumber repositori"
msgid "Status"
msgstr "Status"
msgid "Swift Container"
msgstr "Kontainer Swift"
msgid "Swift Path"
msgstr "Jalur Swift"
msgid "Target"
msgstr "Target"
msgid "Target Instances"
msgstr "Instance sasaran"
msgid ""
"The ID of the DU image is optional, You can deploy the applications without "
"this."
msgstr ""
"ID dari image DU adalah opsional, Anda dapat menerapkan aplikasi tanpa ini."
msgid "The port your application listens on"
msgstr "Port aplikasi Anda mendengarkan"
msgid "Trigger"
msgstr "Trigger (pemicu)"
msgid "Trigger URI"
msgstr "Pemicu URI"
msgid "Trigger UUID"
msgstr "Memicu UUID"
msgid "URI"
msgstr "URI"
msgid "UUID"
msgstr "UUID"
msgid "Unable to create languagepack."
msgstr "Tidak dapat membuat languagepack."
msgid "Unable to retrieve application details."
msgstr "Tidak dapat mengambil detail aplikasi."
msgid "Unable to retrieve apps."
msgstr "Tidak dapat mengambil aplikasi."
msgid "Unable to retrieve languagepack details."
msgstr "Tidak dapat mengambil detail languagepack."
msgid "Unable to retrieve languagepacks."
msgstr "Tidak dapat mengambil languagepack."
msgid "Update"
msgstr "Memperbarui"
msgid "Update App"
msgstr "Perbarui Aplikasi"
msgid "Update Application"
msgstr "Perbarui Aplikasi"
msgid "Updated at"
msgstr "Updated at (diperbarui pada)"
msgid "View"
msgstr "View"
msgid "View Application Logs"
msgstr "Lihat Log Aplikasi"
msgid "Workflow ID"
msgstr "Workflow ID"
msgid "Workflow Run Command"
msgstr "Perintah Jalankan Alur Kerja"
msgid "Workflow Test Command"
msgstr "Perintah Tes Alur Kerja"
msgid "Workflow details for"
msgstr "Detail alur kerja untuk"

View File

@ -1,12 +0,0 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% block form_attrs %}enctype="multipart/form-data"{% endblock %}
{% block modal-body-right %}
<h3>{% trans "Description:" %}</h3>
<p>
{% trans "Enter the details for the application." %}
</p>
{% endblock %}

View File

@ -1,52 +0,0 @@
{% load i18n %}
<div class="detail">
<dl class="dl-horizontal">
<dt>{% trans "Name" %}</dt>
<dd>{{ application.name }}</dd>
<dt>{% trans "ID" %}</dt>
<dd>{{ application.id }}</dd>
<dt>{% trans "Created at" %}</dt>
<dd>{{ application.created_at|parse_isotime }}</dd>
<dt>{% trans "Updated at" %}</dt>
<dd>{{ application.updated_at|parse_isotime }}</dd>
<dt>{% trans "Description" %}</dt>
<dd>{{ application.description|default:"None" }}</dd>
<dt>{% trans "Languagepack" %}</dt>
<dd>{{ application.languagepack }}</dd>
<dt>{% trans "Entry points" %}</dt>
<dd>{{ application.entry_points }}</dd>
<dt>{% trans "Ports" %}</dt>
<dd>{{ application.ports }}</dd>
<dt>{% trans "Source" %}</dt>
<dd>{{ application.source }}</dd>
<dt>{% trans "Trigger UUID" %}</dt>
<dd>{{ application.trigger_uuid }}</dd>
<dt>{% trans "Trigger" %}</dt>
<dd>{{ application.trigger }}</dd>
<dt>{% trans "App URL" %}</dt>
<dd>{{ application.app_url }}</dd>
{% if application.target_instances %}
<dt>{% trans "Target Instances" %}</dt>
<dd>{{ application.target_instances }}</dd>
{% endif %}
</dl>
<h4>{% trans "Workflow details for" %}: {{ application.name }}</h4>
<hr class="header_rule">
<dl class="dl-horizontal">
{% for workflow in workflows %}
<dt>{% trans "Workflow ID" %}</dt>
<dd>{{ workflow.wf_id }}</dd>
<dt>{% trans "ID" %}</dt>
<dd>{{ workflow.id }}</dd>
<dt>{% trans "Status" %}</dt>
<dd>{{ workflow.status }}</dd>
{% empty %}
<dd><em>{% trans "No Workflow details." %}</em></dd>
{% endfor %}
</dl>
</div>

View File

@ -1,15 +0,0 @@
{% extends 'horizon/common/_modal_form.html' %}
{% load i18n %}
{% block form_id %}{% endblock %}
{% block form_action %}{% url 'horizon:solum:applications:launch' application_id %}{% endblock %}
{% block modal-header %}{% trans "Deploy Application" %}{% endblock %}
{% block modal_id %}launch_application_modal{% endblock %}
{% block modal-body-right %}
<h3>{% trans "Description:" %}</h3>
<p>
{% trans "The ID of the DU image is optional, You can deploy the applications without this." %}
</p>
{% endblock %}

View File

@ -1,37 +0,0 @@
{% load i18n %}
<h3>{% trans "Application" %}</h3>
<div class="status detail">
<dl class="dl-horizontal">
<h4>{% trans "Log details for " %}: {{ application.name }}</h4>
{% for log in loglist %}
<dl class="well">
<dt>{% trans "Resource UUID" %}</dt>
<dd>{{ log.resource_uuid }}</dd>
<dt>{% trans "Created at" %}</dt>
<dd>{{ log.created_at|parse_isotime }}</dd>
{% if log.local_storage %}
<dt>{% trans "Local Storage" %}</dt>
<dd>{{ log.local_storage }}</dd>
{% elif log.swift_container %}
<dt>{% trans "Swift Container" %}</dt>
<dd>{{ log.swift_container }}</dd>
<dt>{% trans "Swift Path" %}</dt>
<dd>{{ log.swift_path }}</dd>
{% else %}
<dt>{% trans "Location" %}</dt>
<dd>{{ log.location }}</dd>
{% endif %}
</dl>
{% empty %}
<dd>None</dd>
{% endfor %}
</dl>
</div>

View File

@ -1,8 +0,0 @@
{% extends 'horizon/common/_modal_form.html' %}
{% load i18n %}
{% block form_id %}{% endblock %}
{% block form_action %}{% url 'horizon:solum:applications:scale' application_id %}{% endblock %}
{% block modal-header %}{% trans "Scale Application" %}{% endblock %}
{% block modal_id %}scale_application_modal{% endblock %}

View File

@ -1,7 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Create Application" %}{% endblock %}
{% block main %}
{% include 'applications/_create.html' %}
{% endblock %}

View File

@ -1,15 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Application Details" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_detail_header.html" with title=_("Application Details") %}
{% endblock page_header %}
{% block main %}
<div class="row">
<div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
{% endblock %}

View File

@ -1,11 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Solum" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Solum - Applications") %}
{% endblock page_header %}
{% block main %}
{{ table.render }}
{% endblock %}

View File

@ -1,11 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Deploy Application" %}{% endblock %}
{% block page_header %}
{% include 'horizon/common/_page_header.html' with title=_('Deploy Application') %}
{% endblock page_header %}
{% block main %}
{% include 'applications/_launch.html' %}
{% endblock %}

View File

@ -1,11 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Scale Application" %}{% endblock %}
{% block page_header %}
{% include 'horizon/common/_page_header.html' with title=_('Scale Application') %}
{% endblock page_header %}
{% block main %}
{% include 'applications/_scale.html' %}
{% endblock %}

View File

@ -1,18 +0,0 @@
{% load i18n sizeformat %}
<h3>{% trans "Application" %}</h3>
<div class="status row-fluid detail">
<dl>
<dt>{% trans "Name" %}</dt>
<dd>{{ assembly.name }}</dd>
<dt>{% trans "ID" %}</dt>
<dd>{{ assembly.uuid }}</dd>
<dt>{% trans "Description" %}</dt>
<dd>{{ assembly.description|default:"None" }}</dd>
<dt>{% trans "Status" %}</dt>
<dd>{{ assembly.status|default:"None" }}</dd>
<dt>{% trans "URI" %}</dt>
<dd>{{ assembly.application_uri|default:"None" }}</dd>
<dt>{% trans "Trigger URI" %}</dt>
<dd>{{ assembly.trigger_uri|default:"None" }}</dd>
</dl>
</div>

View File

@ -1,15 +0,0 @@
{% extends 'base.html' %}
{% load i18n sizeformat %}
{% block title %}{% trans "Assembly Details" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Assembly Details") %}
{% endblock page_header %}
{% block main %}
<div class="row-fluid">
<div class="span12">
{{ tab_group.render }}
</div>
</div>
{% endblock %}

View File

@ -1,11 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Solum" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Solum - Assemblies") %}
{% endblock page_header %}
{% block main %}
{{ table.render }}
{% endblock %}

View File

@ -1,12 +0,0 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% block form_attrs %}enctype="multipart/form-data"{% endblock %}
{% block modal-body-right %}
<h3>{% trans "Description:" %}</h3>
<p>
{% trans "Enter the details for the languagepack." %}
</p>
{% endblock %}

View File

@ -1,42 +0,0 @@
{% load i18n %}
<div class="detail">
<dl class="dl-horizontal">
<dt>{% trans "Name" %}</dt>
<dd>{{ languagepack.name }}</dd>
<dt>{% trans "ID" %}</dt>
<dd>{{ languagepack.uuid }}</dd>
<dt>{% trans "Description" %}</dt>
<dd>{{ languagepack.description|default:"None" }}</dd>
<dt>{% trans "Status" %}</dt>
<dd>{{ languagepack.status }}</dd>
<dt>{% trans "Source Uri" %}</dt>
<dd>{{ languagepack.source_uri }}</dd>
</dl>
<h4>{% trans "Log details" %}</h4>
<hr class="header_rule">
<dl class="dl-horizontal">
{% for log in loglist %}
<dt>{% trans "Resource UUID" %}</dt>
<dd>{{ log.resource_uuid }}</dd>
<dt>{% trans "Created at" %}</dt>
<dd>{{ log.created_at|parse_isotime }}</dd>
{% if log.local_storage %}
<dt>{% trans "Local Storage" %}</dt>
<dd>{{ log.local_storage }}</dd>
{% elif log.swift_container %}
<dt>{% trans "Swift Container" %}</dt>
<dd>{{ log.swift_container }}</dd>
<dt>{% trans "Swift Path" %}</dt>
<dd>{{ log.swift_path }}</dd>
{% else %}
<dt>{% trans "Location" %}</dt>
<dd>{{ log.location }}</dd>
{% endif %}
{% empty %}
<dd><em>{% trans "No Log details." %}</em></dd>
{% endfor %}
</dl>
</div>

View File

@ -1,7 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Create Languagepack" %}{% endblock %}
{% block main %}
{% include 'languagepacks/_create.html' %}
{% endblock %}

View File

@ -1,15 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Languagepack Details" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_detail_header.html" with title=_("Languagepack Details") %}
{% endblock page_header %}
{% block main %}
<div class="row">
<div class="col-sm-12">
{% include "languagepacks/_detail.html" %}
</div>
</div>
{% endblock %}

View File

@ -1,11 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Solum" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Solum - Languagepacks") %}
{% endblock page_header %}
{% block main %}
{{ table.render }}
{% endblock %}

View File

@ -1,145 +0,0 @@
# Copyright 2014 - Rackspace
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import unittest
from solumdashboard.common import workflow_parsers
MISTRAL_DSL = {
"Namespaces": {
"Nova": {
"actions": "random data"
}
},
"Workflow": {
"tasks": {
"createVM": {
"action": "Nova.createVM",
"parameters": {
"nova_url": "$.nova_url",
"auth_token": "$.auth_token"
},
"publish": {
"vm_id": "vm_id"
},
"on-success": "waitForIP"
},
"waitForIP": {
"action": "Nova.getIP",
"publish": {
"vm_ip": "vm_ip"
},
"parameters": {
"nova_url": "$.nova_url",
"project_id": "$.project_id",
"auth_token": "$.auth_token"
},
"on-error": "errorTask"
}
}
}
}
HEAT_TEMPLATE = {
"heat_template_version": "2013-05-23",
"description": "Basic app deploy.",
"parameters": {
"app_name": {
"type": "string",
"default": "solum-app",
"description": "app name desc"
},
"key_name": {
"type": "string",
"default": "mykey"
}
},
"randomstuff": "blah blah blah"
}
class TestWorkflowParsers(unittest.TestCase):
"""Test routines for workflow parsing code."""
def test_get_mistral_tasks(self):
"""Test get Mistral Tasks functionality."""
# Correct operation test case
task_list = workflow_parsers.get_mistral_tasks(MISTRAL_DSL)
self.assertEqual(task_list,
[["createVM", "waitForIP", None],
["waitForIP", None, "errorTask"]])
# Missing "tasks" section from Workflow
dsl_copy = MISTRAL_DSL.copy()
dsl_copy["Workflow"] = {"garbage": "here", "nothing": "useful"}
self.assertRaises(KeyError, workflow_parsers.get_mistral_tasks,
dsl_copy)
# All tasks have an on-success condition (invalid DSL)
dsl_copy = MISTRAL_DSL.copy()
dsl_copy["Workflow"]["tasks"]["waitForIP"]["on-success"] = "noTask"
self.assertRaises(IndexError, workflow_parsers.get_mistral_tasks,
dsl_copy)
# None data test case
self.assertRaises(TypeError, workflow_parsers.get_mistral_tasks, None)
def test_get_mistral_required_input(self):
"""Test get Mistral required user input functionality."""
# Handle None data
self.assertRaises(TypeError, workflow_parsers.get_mistral_tasks, None)
# Correct operation test case
input_dict = workflow_parsers.get_mistral_required_input(MISTRAL_DSL)
self.assertEqual(input_dict,
{"nova_url": ["createVM", "waitForIP"],
"auth_token": ["createVM", "waitForIP"],
"project_id": ["waitForIP"]})
# Remove the "tasks" section from Workflow
dsl_copy = MISTRAL_DSL.copy()
dsl_copy["Workflow"] = {"garbage": "here", "nothing": "useful"}
self.assertRaises(KeyError,
workflow_parsers.get_mistral_required_input,
dsl_copy)
# Verify that a publish removes the input from the next task
dsl_copy = MISTRAL_DSL.copy()
dsl_copy["Workflow"]["tasks"]["createVM"]["publish"] = (
{"project_id": "test project"})
input_dict = workflow_parsers.get_mistral_required_input(dsl_copy)
self.assertEqual(input_dict,
{"nova_url": ["createVM", "waitForIP"],
"auth_token": ["createVM", "waitForIP"]})
# Test ignoring of odd tags like "arguments"
dsl_copy["Workflow"]["tasks"]["createVM"]["parameters"] = (
{"key": "value", "arguments": {"random arguments"}})
input_dict = workflow_parsers.get_mistral_required_input(dsl_copy)
self.assertEqual(input_dict,
{"key": ["createVM"], "nova_url": ["waitForIP"],
"auth_token": ["waitForIP"]})
def test_get_heat_required_input(self):
"""Test get Heat required user input functionality."""
# Handle None data
self.assertRaises(TypeError, workflow_parsers.get_heat_required_input,
None)
# Remove the "parameters" section from the HoT
hot_copy = {"nothing_here": "error time"}
self.assertRaises(KeyError,
workflow_parsers.get_heat_required_input,
hot_copy)
# Correct operation test case
heat_list = workflow_parsers.get_heat_required_input(HEAT_TEMPLATE)
self.assertEqual(heat_list,
[["app_name", "string", "solum-app", "app name desc"],
["key_name", "string", "mykey", None]])
if __name__ == "__main__":
unittest.main()

View File

@ -1,18 +0,0 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from horizon.test.settings import * # noqa
from openstack_dashboard.test.settings import * # noqa
DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'test'}}

View File

@ -1,19 +0,0 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from django import test as django_test
class TestSolum(django_test.TestCase):
def test_add_here(self):
pass

View File

@ -1,18 +0,0 @@
# Copyright (c) 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from pbr import version
version_info = version.VersionInfo('solum-dashboard')

View File

@ -1,13 +0,0 @@
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
hacking>=3.0.1,<3.1.0 # Apache-2.0
coverage>=4.5.1 # Apache-2.0
oslo.config>=5.2.0 # Apache-2.0
pylint==1.4.5 # GPLv2
selenium>=3.11.0 # Apache-2.0
stestr>=2.0.0 # Apache-2.0
testtools>=2.3.0 # MIT
unittest2>=1.1.0 # BSD

45
tox.ini
View File

@ -1,45 +0,0 @@
[tox]
minversion = 3.2.0
envlist = py3,pep8
[testenv]
usedevelop = True
setenv =
VIRTUAL_ENV={envdir}
DJANGO_SETTINGS_MODULE=solumdashboard.tests.settings
deps =
-c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
-r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
commands =
stestr run --concurrency 1 {posargs}
stestr slowest
[testenv:cover]
setenv =
{[testenv]setenv}
PYTHON=coverage run --source solumdashboard --parallel-mode
commands =
stestr run --concurrency 1 {posargs}
coverage combine
coverage html -d cover
coverage xml -o cover/coverage.xml
[testenv:pep8]
commands = flake8
[testenv:venv]
commands = {posargs}
[flake8]
show-source = true
builtins = _
exclude=.git,.tox,dist,doc,*lib/python*,*egg,tools,horizon,node_modules
[testenv:docs]
deps = -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
-r{toxinidir}/doc/requirements.txt
commands = sphinx-build -W -b html doc/source doc/build/html
allowlist_externals =
sphinx-build