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:
parent
cf30defab9
commit
80e7ef7b99
31
.gitignore
vendored
31
.gitignore
vendored
@ -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
|
@ -1,3 +0,0 @@
|
||||
[DEFAULT]
|
||||
test_path=./solumdashboard/tests
|
||||
top_dir=./
|
@ -1,6 +0,0 @@
|
||||
- project:
|
||||
templates:
|
||||
- check-requirements
|
||||
- horizon-non-primary-django-jobs
|
||||
- openstack-python3-jobs-horizon
|
||||
- openstack-python3-jobs
|
@ -1,4 +0,0 @@
|
||||
Solum Style Commandments
|
||||
========================
|
||||
|
||||
Read the OpenStack Style Commandments https://docs.openstack.org/hacking/latest/
|
175
LICENSE
175
LICENSE
@ -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.
|
31
README.rst
31
README.rst
@ -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.
|
||||
|
@ -1,2 +0,0 @@
|
||||
[python: **.py]
|
||||
[django: **/templates/**.html]
|
@ -1,2 +0,0 @@
|
||||
[javascript: **.js]
|
||||
[angular: **/static/**.html]
|
@ -1,2 +0,0 @@
|
||||
sphinx>=2.0.0,!=2.1.0 # BSD
|
||||
openstackdocstheme>=2.2.1 # Apache-2.0
|
@ -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
|
@ -1 +0,0 @@
|
||||
.. include:: ../../README.rst
|
@ -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.
|
@ -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
|
26
setup.cfg
26
setup.cfg
@ -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
|
20
setup.py
20
setup.py
@ -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)
|
@ -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)
|
@ -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
|
@ -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)
|
@ -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)
|
@ -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
|
@ -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')
|
||||
]
|
@ -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}
|
@ -1,3 +0,0 @@
|
||||
# Importing non-modules that are not used explicitly
|
||||
|
||||
from .update import UpdateApplicationClass # noqa
|
@ -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
|
@ -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)
|
@ -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)
|
@ -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
|
@ -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')
|
||||
]
|
@ -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
|
@ -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]))
|
@ -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)
|
@ -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
|
@ -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
|
@ -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)
|
@ -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,)
|
@ -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')
|
||||
]
|
@ -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")
|
@ -1,4 +0,0 @@
|
||||
DASHBOARD = 'solum'
|
||||
ADD_INSTALLED_APPS = ['solumdashboard']
|
||||
DEFAULT = True
|
||||
ADD_EXCEPTIONS = {}
|
@ -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"
|
@ -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"
|
@ -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"
|
@ -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 %}
|
@ -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>
|
@ -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 %}
|
@ -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>
|
@ -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 %}
|
@ -1,7 +0,0 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load i18n %}
|
||||
{% block title %}{% trans "Create Application" %}{% endblock %}
|
||||
|
||||
{% block main %}
|
||||
{% include 'applications/_create.html' %}
|
||||
{% endblock %}
|
@ -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 %}
|
@ -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 %}
|
@ -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 %}
|
@ -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 %}
|
@ -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>
|
@ -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 %}
|
@ -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 %}
|
@ -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 %}
|
@ -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>
|
@ -1,7 +0,0 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load i18n %}
|
||||
{% block title %}{% trans "Create Languagepack" %}{% endblock %}
|
||||
|
||||
{% block main %}
|
||||
{% include 'languagepacks/_create.html' %}
|
||||
{% endblock %}
|
@ -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 %}
|
@ -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 %}
|
@ -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()
|
@ -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'}}
|
@ -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
|
@ -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')
|
@ -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
45
tox.ini
@ -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
|
Loading…
x
Reference in New Issue
Block a user