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 @@
|
|||||||
========================
|
This project is no longer maintained.
|
||||||
Team and repository tags
|
|
||||||
========================
|
|
||||||
|
|
||||||
.. image:: http://governance.openstack.org/badges/solum-dashboard.svg
|
The contents of this repository are still available in the Git
|
||||||
:target: http://governance.openstack.org/reference/tags/index.html
|
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
|
For any further questions, please email
|
||||||
|
openstack-discuss@lists.openstack.org or join #openstack-dev on
|
||||||
solum-dashboard
|
OFTC.
|
||||||
===============
|
|
||||||
|
|
||||||
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
|
|
||||||
|
@ -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…
Reference in New Issue
Block a user