diff --git a/.coveragerc b/.coveragerc
deleted file mode 100644
index c07286980..000000000
--- a/.coveragerc
+++ /dev/null
@@ -1,12 +0,0 @@
-[run]
-branch = True
-source = murano
-omit =
- .tox/*
- murano/tests/*
-
-[paths]
-source = murano
-
-[report]
-ignore_errors = True
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 9e25b4cb8..000000000
--- a/.gitignore
+++ /dev/null
@@ -1,61 +0,0 @@
-#swap file
-*.swp
-
-#IntelJ Idea
-.idea/
-
-#virtualenv
-.venv/
-
-#Build results
-build/
-dist/
-*.egg-info/
-*.egg
-eggs/
-.eggs/
-develop-eggs/
-.tox
-AUTHORS
-ChangeLog
-.testrepository
-.coverage
-cover
-api-ref/build/
-
-!/.stestr.conf
-.stestr/
-
-#Python
-*.pyc
-
-#Translation build
-*.mo
-
-#SQLite Database files
-*.sqlite
-
-#Autogenerated Documentation
-doc/source/api
-doc/source/_static/murano.conf.sample
-doc/source/_static/murano.policy.yaml.sample
-
-#Config file for functional tests
-murano/tests/functional/engine/config.conf
-
-#Autogenerated sample config file and policy file
-etc/murano/murano.conf.sample
-etc/murano/murano-cfapi.conf.sample
-etc/murano.policy.yaml.sample
-
-#User Config file for Murano
-etc/murano/murano.conf
-etc/murano/murano-cfapi.conf
-etc/murano/logging.conf
-
-# pylint autogenerated support files
-tools/lintstack.head.py
-tools/pylint_exceptions
-
-# Files created by releasenotes build
-releasenotes/build
diff --git a/.stestr.conf b/.stestr.conf
deleted file mode 100644
index 2e0d10ce8..000000000
--- a/.stestr.conf
+++ /dev/null
@@ -1,3 +0,0 @@
-[DEFAULT]
-test_path=${OS_TEST_PATH:-./murano/tests/unit}
-top_dir=./
diff --git a/.zuul.yaml b/.zuul.yaml
deleted file mode 100644
index 0c1e15e1d..000000000
--- a/.zuul.yaml
+++ /dev/null
@@ -1,128 +0,0 @@
-- project:
- queue: murano
- templates:
- - check-requirements
- - openstack-cover-jobs
- - openstack-python3-jobs
- - periodic-stable-jobs
- - publish-openstack-docs-pti
- - release-notes-jobs-python3
- check:
- jobs:
- - murano-rally-task
- - murano-tempest-api
- - murano-tempest-cfapi
- - murano-grenade
- - murano-tempest-api-ipv6-only
- gate:
- jobs:
- - murano-tempest-api
- - murano-tempest-api-ipv6-only
-
-- job:
- name: murano-rally-task
- voting: false
- parent: rally-task-murano
- irrelevant-files: &murano-irrelevant-files
- - ^(test-|)requirements.txt$
- - ^setup.cfg$
- - ^doc/.*$
- - ^.*\.rst$
- - ^releasenotes/.*$
- - ^murano/tests/.*$
- - ^contrib/.*$
- - ^tools/.*$
- timeout: 7800
- vars:
- devstack_plugins:
- rally-openstack: https://opendev.org/openstack/rally-openstack
- rally_task: rally-jobs/task-murano.yaml
- required-projects:
- - openstack/rally-openstack
-
-- job:
- name: murano-tempest-base
- parent: devstack-tempest
- irrelevant-files: *murano-irrelevant-files
- timeout: 7800
- required-projects: &base_required_projects
- - openstack/heat
- - openstack/murano
- - openstack/murano-dashboard
- - openstack/python-heatclient
- - openstack/python-muranoclient
- - openstack/tempest
- - openstack/murano-tempest-plugin
- vars: &base_vars
- devstack_plugins:
- murano: https://opendev.org/openstack/murano
- heat: https://opendev.org/openstack/heat
- devstack_services:
- tempest: true
- s-account: false
- s-container: false
- s-object: false
- s-proxy: false
- devstack_localrc:
- TEMPEST_PLUGINS: "/opt/stack/murano-tempest-plugin"
- KEYSTONE_ADMIN_ENDPOINT: true
- tempest_test_regex: application_catalog
- tox_envlist: all
-
-- job:
- name: murano-tempest-api
- parent: murano-tempest-base
-
-- job:
- name: murano-tempest-api-ipv6-only
- parent: devstack-tempest-ipv6
- description: |
- Murano devstack tempest tests job for IPv6-only deployment
- timeout: 7800
- irrelevant-files: *murano-irrelevant-files
- required-projects: *base_required_projects
- vars: *base_vars
-
-- job:
- name: murano-tempest-cfapi
- parent: murano-tempest-base
- voting: false
- vars:
- devstack_services:
- murano-cfapi: true
- tempest_test_regex: service_broker
-
-- job:
- name: murano-grenade
- parent: grenade
- voting: false
- irrelevant-files: *murano-irrelevant-files
- required-projects:
- - opendev.org/openstack/grenade
- - opendev.org/openstack/heat
- - opendev.org/openstack/murano
- - opendev.org/openstack/murano-dashboard
- - opendev.org/openstack/python-heatclient
- - opendev.org/openstack/python-muranoclient
- - opendev.org/openstack/murano-tempest-plugin
- - opendev.org/openstack/heat-tempest-plugin
- vars:
- grenade_localrc:
- RUN_HEAT_INTEGRATION_TESTS: False
- devstack_plugins:
- murano: https://opendev.org/openstack/murano
- heat: https://opendev.org/openstack/heat
- devstack_services:
- tempest: true
- s-account: false
- s-container: false
- s-object: false
- s-proxy: false
- h-api: true
- h-api-cfn: true
- h-eng: true
- heat: true
- tempest_plugins:
- - murano-tempest-plugin
- tempest_test_regex: ^murano_tempest_tests\.tests\.scenario\.application_catalog\.test_deployment
- tox_envlist: all
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
deleted file mode 100644
index ff79b79c6..000000000
--- a/CONTRIBUTING.rst
+++ /dev/null
@@ -1,19 +0,0 @@
-The source repository for this project can be found at:
-
- https://opendev.org/openstack/murano
-
-Pull requests submitted through GitHub are not monitored.
-
-To start contributing to OpenStack, follow the steps in the contribution guide
-to set up and use Gerrit:
-
- https://docs.openstack.org/contributors/code-and-documentation/quick-start.html
-
-Bugs should be filed on Launchpad:
-
- https://bugs.launchpad.net/murano
-
-For more specific information about contributing to this repository, see the
-murano contributor guide:
-
- https://docs.openstack.org/murano/latest/contributor/contributing.html
diff --git a/HACKING.rst b/HACKING.rst
deleted file mode 100644
index f28ff60ca..000000000
--- a/HACKING.rst
+++ /dev/null
@@ -1,15 +0,0 @@
-Style Commandments
-==================
-
-Read the OpenStack Style Commandments https://docs.openstack.org/hacking/latest/
-
-Murano Specific Commandments
-----------------------------
-
-- [M318] Change assertEqual(A, None) or assertEqual(None, A) by optimal assert
- like assertIsNone(A)
-- [M322] Method's default argument shouldn't be mutable.
-- [M323] Python 3: do not use dict.iteritems.
-- [M324] Python 3: do not use dict.iterkeys.
-- [M325] Python 3: do not use dict.itervalues.
-- [M326] Python 3: do not use basestring.
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 68c771a09..000000000
--- a/LICENSE
+++ /dev/null
@@ -1,176 +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.
-
diff --git a/README.rst b/README.rst
index 57042c436..4ee2c5f13 100644
--- a/README.rst
+++ b/README.rst
@@ -1,42 +1,10 @@
-========================
-Team and repository tags
-========================
+This project is no longer maintained.
-.. image:: https://governance.openstack.org/tc/badges/murano.svg
- :target: https://governance.openstack.org/tc/reference/tags/index.html
+The contents of this repository are still available in the Git
+source code management system. To see the contents of this
+repository before it reached its end of life, please check out the
+previous commit with "git checkout HEAD^1".
-.. Change things from this point on
-
-Murano
-======
-
-Murano Project introduces an application catalog, which allows application
-developers and cloud administrators to publish various cloud-ready
-applications in a browsable categorised catalog. Cloud users
--- including inexperienced ones -- can then use the catalog to
-compose reliable application environments with the push of a button.
-
-
-Project Resources
------------------
-
-* `Murano Official Documentation `_
-
-* Project status, bugs, and blueprints are tracked on
- `Launchpad `_
-
-* Additional resources are linked from the project
- `Wiki `_ page
-
-* `Python client `_
-
-License
--------
-
-Apache License Version 2.0 http://www.apache.org/licenses/LICENSE-2.0
-
-
-Release Notes
--------------
-
-Release Notes may be found here: https://docs.openstack.org/releasenotes/murano
+For any further questions, please email
+openstack-discuss@lists.openstack.org or join #openstack-dev on
+OFTC.
diff --git a/api-ref/source/conf.py b/api-ref/source/conf.py
deleted file mode 100644
index eaa197210..000000000
--- a/api-ref/source/conf.py
+++ /dev/null
@@ -1,208 +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.
-#
-# murano documentation build configuration file, created by
-# sphinx-quickstart on Sat May 1 15:17:47 2010.
-#
-# This file is execfile()d with the current directory set to
-# its containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-import os
-import sys
-
-extensions = [
- 'os_api_ref',
- 'openstackdocstheme'
-]
-
-
-html_theme = 'openstackdocs'
-html_theme_options = {
- "sidebar_mode": "toc",
-}
-
-# openstackdocstheme options
-openstackdocs_repo_name = 'openstack/murano'
-openstackdocs_bug_project = 'murano'
-openstackdocs_bug_tag = 'api-ref'
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-sys.path.insert(0, os.path.abspath('../../'))
-sys.path.insert(0, os.path.abspath('../'))
-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.
-
-# The suffix of source filenames.
-source_suffix = '.rst'
-
-# The encoding of source files.
-#
-# source_encoding = 'utf-8'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-copyright = u'2016-present, OpenStack Foundation'
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#
-# language = None
-
-# There are two options for replacing |today|: either, you set today to some
-# non-false value, then it is used:
-# today = ''
-# Else, today_fmt is used as the format for a strftime call.
-# today_fmt = '%B %d, %Y'
-
-# The reST default role (used for this markup: `text`) to use
-# for all documents.
-# default_role = None
-
-# 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 = False
-
-# If true, sectionauthor and moduleauthor directives will be shown in the
-# output. They are ignored by default.
-show_authors = False
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'native'
-
-# -- Options for man page output ----------------------------------------------
-
-# Grouping the document tree for man pages.
-# List of tuples 'sourcefile', 'target', u'title', u'Authors name', 'manual'
-
-
-# -- 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'
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further. For a list of options available for each theme, see the
-# documentation.
-# html_theme_options = {}
-
-# Add any paths that contain custom themes here, relative to this directory.
-# html_theme_path = []
-
-# The name for this set of Sphinx documents. If None, it defaults to
-# " v documentation".
-# html_title = None
-
-# A shorter title for the navigation bar. Default is the same as html_title.
-# html_short_title = None
-
-# The name of an image file (relative to this directory) to place at the top
-# of the sidebar.
-# html_logo = None
-
-# The name of an image file (within the static path) to use as favicon of the
-# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
-# pixels large.
-# html_favicon = None
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-# html_static_path = ['_static']
-
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-# html_use_smartypants = True
-
-# Custom sidebar templates, maps document names to template names.
-# html_sidebars = {}
-
-# Additional templates that should be rendered to pages, maps page names to
-# template names.
-# html_additional_pages = {}
-
-# If false, no module index is generated.
-# html_use_modindex = True
-
-# If false, no index is generated.
-# html_use_index = True
-
-# If true, the index is split into individual pages for each letter.
-# html_split_index = False
-
-# If true, links to the reST sources are added to the pages.
-# html_show_sourcelink = True
-
-# If true, an OpenSearch description file will be output, and all pages will
-# contain a tag referring to it. The value of this option must be the
-# base URL from which the finished HTML is served.
-# html_use_opensearch = ''
-
-# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
-# html_file_suffix = ''
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'muranodoc'
-
-
-# -- Options for LaTeX output -------------------------------------------------
-
-# The paper size ('letter' or 'a4').
-# latex_paper_size = 'letter'
-
-# The font size ('10pt', '11pt' or '12pt').
-# latex_font_size = '10pt'
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title, author, documentclass
-# [howto/manual]).
-latex_documents = [
- ('index', 'Murano.tex', u'OpenStack Application Catalog API Documentation',
- u'OpenStack Foundation', 'manual'),
-]
-
-# The name of an image file (relative to this directory) to place at the top of
-# the title page.
-# latex_logo = None
-
-# For "manual" documents, if this is true, then toplevel headings are parts,
-# not chapters.
-# latex_use_parts = False
-
-# Additional stuff for the LaTeX preamble.
-# latex_preamble = ''
-
-# Documents to append as an appendix to all manuals.
-# latex_appendices = []
-
-# If false, no module index is generated.
-# latex_use_modindex = True
diff --git a/api-ref/source/index.rst b/api-ref/source/index.rst
deleted file mode 100644
index ec1a689f6..000000000
--- a/api-ref/source/index.rst
+++ /dev/null
@@ -1,8 +0,0 @@
-==================================
-OpenStack Application Catalog APIs
-==================================
-
-.. toctree::
- :maxdepth: 1
-
- v1/index
diff --git a/api-ref/source/v1/actions.inc b/api-ref/source/v1/actions.inc
deleted file mode 100644
index f4ebd9896..000000000
--- a/api-ref/source/v1/actions.inc
+++ /dev/null
@@ -1,129 +0,0 @@
-.. -*- rst -*-
-
-==========================
-Actions and Static Actions
-==========================
-
-A Murano action is a type of MuranoPL method. The differences between a regular
-MuranoPL method are:
-
-* Action is executed on deployed objects.
-* Action execution is initiated by API request: you do not have to call the
- method manually.
-
-Thus, Murano actions allow performing any operations on objects, like:
-
-* Getting information from the VM, like a config that is generated during the
- deployment
-* VM rebooting
-* Scaling
-
-A list of available actions is formed during the environment deployment.
-Following deployment completion, you can call the action asynchronously. Murano
-engine generates a task for every action thereby allowing the action status to
-be tracked.
-
-Execute action
-==============
-
-.. rest_method:: POST /environments/{environment_id}/actions/{action_id}
-
-Execute action on deployed environment.
-
-Request Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - environment_id: env_id_url
- - action_id: action_id_url
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 403
- - 404
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - task_id: task_id
-
-Response Example
-----------------
-
-.. literalinclude:: samples/execute-action-response.json
- :language: javascript
-
-Get Action Result
-=================
-
-.. rest_method:: GET /environments/{environment_id}/actions/{task_id}
-
-Retrieve action result for action executed on deployed environment.
-
-Request Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - environment_id: env_id_url
- - task_id: task_id_url
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 403
- - 404
-
-Execute static action
-=====================
-
-.. rest_method:: POST /actions
-
-Execute static action.
-
-Static methods can be called if they are exposed by specifying Scope: Public
-in the MuranoPL object and the result of its execution will be returned.
-
-Request Example
----------------
-
-.. literalinclude:: samples/static-action-request.json
- :language: javascript
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 403
- - 404
-
-Response Example
-----------------
-
-.. literalinclude:: samples/static-action-response.json
- :language: javascript
diff --git a/api-ref/source/v1/categories.inc b/api-ref/source/v1/categories.inc
deleted file mode 100644
index 112dbf157..000000000
--- a/api-ref/source/v1/categories.inc
+++ /dev/null
@@ -1,162 +0,0 @@
-.. -*- rst -*-
-
-==========
-Categories
-==========
-
-In Murano, applications can belong to a category or multiple categories.
-Administrative users can create and delete categories as well as list
-available categories and view details for a particular category.
-
-List categories
-===============
-
-.. rest_method:: GET /catalog/categories
-
-Retrieve list of all available categories in the Application Catalog.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - categories: all_categories
- - id: category_id
- - name: category_name
- - updated: updated
- - created: created
- - package_count: package_count
-
-Response Example
-----------------
-
-.. literalinclude:: samples/category-list-response.json
- :language: javascript
-
-Show category details
-=====================
-
-.. rest_method:: GET /catalog/categories/{category_id}
-
-Show details for a category.
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - category_id: category_id_url
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 404
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - id: category_id
- - name: category_name
- - updated: updated
- - created: created
- - packages: category_packages
- - package_count: package_count
-
-Response Example
-----------------
-
-.. literalinclude:: samples/category-show-response.json
- :language: javascript
-
-Create Category
-===============
-
-.. rest_method:: POST /catalog/categories
-
-Add a new category to the Application Catalog.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 409
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - name: category_name
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - id: category_id
- - name: category_name
- - updated: updated
- - created: created
- - package_count: package_count
-
-Response Example
-----------------
-
-.. literalinclude:: samples/category-create-response.json
- :language: javascript
-
-Delete Category
-===============
-
-.. rest_method:: DELETE /catalog/categories/{category_id}
-
-Remove an existing category from the Application Catalog.
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - category_id: category_id_url
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 403
- - 404
diff --git a/api-ref/source/v1/deployments.inc b/api-ref/source/v1/deployments.inc
deleted file mode 100644
index 78e61df52..000000000
--- a/api-ref/source/v1/deployments.inc
+++ /dev/null
@@ -1,50 +0,0 @@
-.. -*- rst -*-
-
-===========
-Deployments
-===========
-
-Deployments track environments that have been deployed, either successfully
-or otherwise. Each deployment contains the following information:
-
-* A "Class: Environment" object (io.murano.Environment) with a name. Each
- "Class: Environment" object defines an environment in terms of the deployment
- process and groups all Applications and their related infrastructures together.
-* An object (or objects) referring to networks that exist.
-* A list of Applications (e.g. io.murano.apps.linux.Telnet). Each Application
- contains, or otherwise references, anything it requires. The Telnet example
- has a property called ``instance`` whose contract states it must be of type
- ``io.murano.resources.Instance``. In turn, the Instance has properties it
- requires (like a ``name``, a ``flavor``, or a keypair name, ``keyname``).
-
-List deployments
-================
-
-.. rest_method:: GET /deployments
-
-List deployments for all environments for the current tenant (project).
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - deployments: deployments
-
-Response Example
-----------------
-
-.. literalinclude:: samples/deployments-list-response.json
- :language: javascript
diff --git a/api-ref/source/v1/environments.inc b/api-ref/source/v1/environments.inc
deleted file mode 100644
index 996c24d8f..000000000
--- a/api-ref/source/v1/environments.inc
+++ /dev/null
@@ -1,403 +0,0 @@
-.. -*- rst -*-
-
-============
-Environments
-============
-
-An environment is a set of logically connected applications that are grouped
-together for easy management. By default, each environment has a single
-network for all its applications, and the deployment of the environment is
-defined in a single heat stack. Applications in different environments are
-always independent from one another.
-
-An environment is a single unit of deployment. This means that you can not only
-deploy an environment that contains a single application but an environment
-that contains multiple applications.
-
-List environments
-=================
-
-.. rest_method:: GET /environments
-
-Get a list of existing Environments
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 403
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - all_tenants: all_tenants
- - tenant: tenant
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - environments: environments
- - status: env_status
- - created: created
- - updated: updated
- - name: env_name
- - description_text: env_description
- - tenant_id: tenant_id
- - version: env_version
- - id: env_id
-
-Response Example
-----------------
-
-.. literalinclude:: samples/environments-list-response.json
- :language: javascript
-
-Create environment
-==================
-
-.. rest_method:: POST /environments
-
-Creates an environment.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 400
- - 401
- - 403
- - 409
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - name: env_name_request
-
-Request Example
----------------
-
-.. literalinclude:: samples/environment-create-request.json
- :language: javascript
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - id: env_id
- - name: env_name
- - description_text: env_description
- - created: created
- - updated: updated
- - tenant_id: tenant_id
- - version: env_version
- - services: services
- - acquired_by: acquired_by
-
-Response Example
-----------------
-
-.. literalinclude:: samples/environment-create-response.json
- :language: javascript
-
-Rename environment
-==================
-
-.. rest_method:: PUT /environments/{env_id}
-
-Renames an environment.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 400
- - 401
- - 403
- - 404
- - 409
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - env_id: env_id_url
- - name: env_name_update
-
-Request Example
----------------
-
-.. literalinclude:: samples/environment-update-request.json
- :language: javascript
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - id: env_id
- - name: env_name
- - description_text: env_description
- - created: created
- - updated: updated
- - tenant_id: tenant_id
- - version: env_version
- - services: services
- - acquired_by: acquired_by
-
-Response Example
-----------------
-
-.. literalinclude:: samples/environment-update-response.json
- :language: javascript
-
-Show environment details
-========================
-
-.. rest_method:: GET /environments/{env_id}
-
-Shows details for an environment.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 403
- - 404
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - env_id: env_id_url
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - id: env_id
- - name: env_name
- - description_text: env_description
- - created: created
- - updated: updated
- - tenant_id: tenant_id
- - version: env_version
- - services: services
- - acquired_by: acquired_by
-
-Response Example
-----------------
-
-.. literalinclude:: samples/environment-show-response.json
- :language: javascript
-
-Delete environment
-==================
-
-.. rest_method:: DELETE /environments/{env_id}
-
-Remove specified Environment.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 403
- - 404
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - env_id: env_id_url
- - abandon: abandon
-
-Response Parameters
--------------------
-
-This request does not return anything in the response body.
-
-Get environment model
-=====================
-
-.. rest_method:: GET /environments/{env_id}/model/{path}
-
-Get an Environment model.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 403
- - 404
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - env_id: env_id_url
- - path: env_model_path
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - defaultNetworks: env_default_networks
- - region: env_region
- - regions: regions
- - name: env_name
- - services: services
- - ?: env_model
-
-Response Example
-----------------
-
-.. literalinclude:: samples/environments-model-response.json
- :language: javascript
-
-Update environment model
-========================
-
-.. rest_method:: PATCH /environments/{env_id}/model/
-
-Update an environment model.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 202
-
-.. rest_status_code:: error status.yaml
-
- - 400
- - 401
- - 403
- - 404
- - 409
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - env_id: env_id_url
-
-Request Example
----------------
-
-.. literalinclude:: samples/environment-model-update-request.json
- :language: javascript
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - defaultNetworks: env_default_networks
- - region: env_region
- - regions: regions
- - name: env_name
- - services: services
- - ?: env_model
-
-Response Example
-----------------
-
-.. literalinclude:: samples/environments-model-response.json
- :language: javascript
-
-Get environment last status
-===========================
-
-.. rest_method:: GET /environments/{env_id}/lastStatus
-
-Get the last status for the environment for each service in the environment.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 400
- - 401
- - 403
- - 404
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - env_id: env_id_url
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - lastStatuses: env_last_status
-
-Response Example
-----------------
-
-.. literalinclude:: samples/environment-last-status-response.json
- :language: javascript
diff --git a/api-ref/source/v1/index.rst b/api-ref/source/v1/index.rst
deleted file mode 100644
index 0c985424a..000000000
--- a/api-ref/source/v1/index.rst
+++ /dev/null
@@ -1,15 +0,0 @@
-:tocdepth: 2
-
-####################################
-OpenStack Application Catalog API v1
-####################################
-
-.. rest_expand_all::
-
-.. include:: actions.inc
-.. include:: categories.inc
-.. include:: deployments.inc
-.. include:: environments.inc
-.. include:: packages.inc
-.. include:: sessions.inc
-.. include:: templates.inc
diff --git a/api-ref/source/v1/packages.inc b/api-ref/source/v1/packages.inc
deleted file mode 100644
index a904d56fc..000000000
--- a/api-ref/source/v1/packages.inc
+++ /dev/null
@@ -1,488 +0,0 @@
-.. -*- rst -*-
-
-========
-Packages
-========
-
-In Murano, each application, as well as the UI form for application data entry,
-is defined by packages.
-
-Package Structure
-=================
-
-The structure of the Murano application package is predefined. The application package root folder
-should contain the following:
-
-* ``manifest.yaml`` file is the application entry point.
-
- .. note::
-
- The filename is fixed, so do not use any custom names.
-
-* ``Classes`` folder contains MuranoPL class definitions.
-
-* ``Resources`` folder contaisn execution plan templates as well as the
- ``scripts`` folder with all the files required for an application
- deployment located inside it.
-
-* ``UI`` folder contains the dynamic UI YAML definitions.
-
-* ``logo.png`` file (optional) is an image file associated with your
- application. The logo appears in the Application Catalog within
- Murano Dasboard.
-
- .. note::
-
- There are no special limitations regarding an image filename.
- However, if it differs from the default ``logo.png``, specify it
- in an application manifest file.
-
-* ``images.lst`` file (optional) contains a list of images required by an
- application.
-
-.. note::
-
- A bundle is a collection of packages. In the Community App Catalog, you can
- find such bundles as ``container-based-apps``, ``app-servers``, and so on.
- The packages in the Application Catalog are sorted by usage.
-
-List Packages
-=============
-
-.. rest_method:: GET /v1/catalog/packages
-
-Get a list of packages
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 400
- - 401
- - 403
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - catalog: catalog
- - marker: marker
- - limit: limit
- - order_by: order_by
- - type: pkg_type_query
- - category: category
- - fqn: fqn
- - owned: owned
- - id: pkg_id_query
- - include_disabled: include_disabled
- - search: search
- - class_name: class_name
- - name: pkg_name_query
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - packages: packages
- - updated: updated
- - class_definitions: class_definitions
- - id: pkg_id
- - fully_qualified_name: fully_qualified_name
- - is_public: is_public
- - name: pkg_name
- - type: pkg_type
- - supplier: pkg_supplier
- - description: description
- - author: author
- - created: created
- - enabled: enabled
- - tags: tags
- - categories: package_categories
- - owner_id: owner_id
-
-Response Example
-----------------
-
-.. literalinclude:: samples/packages-list-response.json
- :language: javascript
-
-Upload package
-==============
-
-.. rest_method:: POST /v1/catalog/packages
-
-Upload a package to the application catalog.
-
-.. note::
-
- Though specifying categories is optional, it is recommended that you
- specify at least one. It helps to filter applications in the catalog.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 400
- - 401
- - 403
- - 409
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - categories: package_categories
- - is_public: is_public
- - file: pkg_file
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - updated: updated
- - class_definitions: class_definitions
- - id: pkg_id
- - fully_qualified_name: fully_qualified_name
- - is_public: is_public
- - name: pkg_name
- - type: pkg_type
- - supplier: pkg_supplier
- - description: description
- - author: author
- - created: created
- - enabled: enabled
- - tags: tags
- - categories: package_categories
- - owner_id: owner_id
-
-Response Example
-----------------
-
-.. literalinclude:: samples/package-create-response.json
- :language: javascript
-
-Download package
-================
-
-.. rest_method:: GET /v1/catalog/packages/{package_id}/download
-
-Download a package.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 400
- - 401
- - 403
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - package_id: pkg_id_url
-
-Response Parameters
--------------------
-
-This request does not return anything in the response body.
- :language: javascript
-
-Show package details
-====================
-
-.. rest_method:: GET /v1/catalog/packages/{package_id}
-
-Shows details for a package.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 400
- - 401
- - 403
- - 404
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - package_id: pkg_id_url
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - updated: updated
- - class_definitions: class_definitions
- - id: pkg_id
- - fully_qualified_name: fully_qualified_name
- - is_public: is_public
- - name: pkg_name
- - type: pkg_type
- - supplier: pkg_supplier
- - description: description
- - author: author
- - created: created
- - enabled: enabled
- - tags: tags
- - categories: package_categories
- - owner_id: owner_id
-
-Response Example
-----------------
-
-.. literalinclude:: samples/package-show-response.json
- :language: javascript
-
-Update package
-==============
-
-.. rest_method:: PATCH /v1/catalog/packages/{package_id}
-
-Update a package.
-
-List of allowed changes::
-
- { "op": "add", "path": "/tags", "value": [ "foo", "bar" ] }
- { "op": "add", "path": "/categories", "value": [ "foo", "bar" ] }
- { "op": "remove", "path": "/tags" }
- { "op": "remove", "path": "/categories" }
- { "op": "replace", "path": "/tags", "value": ["foo", "bar"] }
- { "op": "replace", "path": "/is_public", "value": true }
- { "op": "replace", "path": "/description",
- "value":"New description" }
- { "op": "replace", "path": "/name", "value": "New name" }
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 202
-
-.. rest_status_code:: error status.yaml
-
- - 400
- - 403
- - 404
- - 409
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - package_id: pkg_id_url
-
-Request Example
----------------
-
-.. literalinclude:: samples/package-update-request.json
- :language: javascript
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - updated: updated
- - class_definitions: class_definitions
- - id: pkg_id
- - fully_qualified_name: fully_qualified_name
- - is_public: is_public
- - name: pkg_name
- - type: pkg_type
- - supplier: pkg_supplier
- - description: description
- - author: author
- - created: created
- - enabled: enabled
- - tags: tags
- - categories: package_categories
- - owner_id: owner_id
-
-Response Example
-----------------
-
-.. literalinclude:: samples/package-update-response.json
-
-Delete package
-==============
-
-.. rest_method:: DELETE /v1/catalog/packages/{package_id}
-
-Remove specified Environment.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 403
- - 404
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - package_id: pkg_id_url
-
-Response Parameters
--------------------
-
-This request does not return anything in the response body.
- :language: javascript
-
-Search for packages
-===================
-
-.. rest_method:: GET /v1/catalog/packages
-
-Search for packages in application catalog. Non-admins, by default, can view
-packages that belong to their project as well as public packages: packages
-which belong to other projects but which have been tagged as public by an
-admin. Admins can search for packages across all projects.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 400
- - 401
- - 403
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - filters: pkg_filters
-
-Response Parameters
--------------------
-
-Returns the list of packages matching the search criteria.
-
-Get UI definition
-=================
-
-.. rest_method:: GET /v1/catalog/packages/{package_id}/ui
-
-Retrieve UI definition for an application.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 400
- - 401
- - 403
- - 404
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - package_id: pkg_id_url
-
-Response Parameters
--------------------
-
-Returns the entire UI definition for the package, if the logo has a
-UI definition.
-
-Below is an example of a very basic UI definition::
-
- Version: 2.2
-
- Forms:
- - appConfiguration:
- fields:
- - name: license
- type: string
- description: Apache License, Version 2.0
- hidden: false
- required: false
-
-Get logo
-========
-
-.. rest_method:: GET /v1/catalog/packages/{package_id}/logo
-
-Retrieve application logo.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 400
- - 401
- - 403
- - 404
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - package_id: pkg_id_url
-
-Response Parameters
--------------------
-
-Returns the binary logo data for the package, if the package has a logo.
diff --git a/api-ref/source/v1/parameters.yaml b/api-ref/source/v1/parameters.yaml
deleted file mode 100644
index 4c6d0f472..000000000
--- a/api-ref/source/v1/parameters.yaml
+++ /dev/null
@@ -1,660 +0,0 @@
-# variables in header
-request_id:
- description: |
- A unique ID for tracking service request. The request ID associated
- with the request by default appears in the service logs.
- in: header
- required: true
- type: UUID
-
-# variables in path
-abandon:
- description: |
- Indicates how to delete environment.
- ``True`` is used when just database must be cleaned.
- ``False`` is used if all resources used by environment must be destroyed.
- in: path
- required: false
- default: false
- type: boolean
-action_id_url:
- description: |
- The UUID of the action to be executed on the deployed environment.
- in: path
- required: true
- type: string
-category_id_url:
- description: |
- The UUID of the category.
- in: path
- required: true
- type: string
-env_id_url:
- description: |
- The UUID of the environment.
- in: path
- required: true
- type: string
-env_model_path:
- description: |
- Allows to get a specific section of the model, for example
- ``defaultNetworks``, ``region`` or ``?`` or any of the subsections.
- in: path
- required: false
- type: string
-env_name_update:
- description: |
- A name for the environment. Name must be at least
- one non-white space symbol.
- in: path
- required: true
- type: string
-pkg_id_url:
- description: |
- The UUID of the package.
- in: path
- required: true
- type: string
-service_id_url:
- description:
- The UUID of a service belonging to an environment template.
- in: path
- required: true
- type: string
-session_id_url:
- description: |
- The UUID of the session.
- in: path
- required: true
- type: string
-task_id_url:
- description: |
- The UUID of the task associated with an action executed on a deployed
- environment.
- in: path
- required: true
- type: string
-template_id_url:
- description: |
- The UUID of the environment template.
- in: path
- required: true
- type: string
-template_is_public_url:
- description: |
- Indicates whether public environment templates are listed or not. The
- following options are possible:
-
- - ``True``. Public environments templates from all projects are listed.
- - ``False``. Private environments templates from current project are
- listed.
- - ``empty``. All project templates plus public templates from all projects.
- are listed
- in: path
- required: false
- default: false
- type: boolean
-
-# variables in query
-all_tenants:
- description: |
- Indicates whether environments from all projects are listed.
- ``True`` environments from all projects are listed. Admin user required.
- ``False`` environments only from current project are listed (default like
- option unspecified).
- in: query
- required: false
- default: false
- type: boolean
-catalog:
- description: |
- If ``false`` (default) - search packages, that current user can edit
- (own for non-admin, all for admin). If ``true`` - search packages,
- that current user can deploy (i.e. his own + public).
- in: query
- required: false
- default: false
- type: boolean
-category:
- description: |
- Allows to filter by categories.
- in: query
- required: false
- type: string
-class_name:
- description: |
- Search only for packages, that use specified class.
- in: query
- required: false
- type: string
-fqn:
- description: |
- Allows to filter by fully qualified name.
- in: query
- required: false
- type: string
-include_disabled:
- description: |
- Include disabled packages in the result.
- in: query
- required: false
- default: false
- type: boolean
-limit:
- description: |
- When present the maximum number of results returned will not exceed
- the specified value. The typical pattern of limit and marker is to
- make an initial limited request and then to use the ID of the last
- package from the response as the marker parameter in a
- subsequent limited request.
- in: query
- required: false
- type: string
-marker:
- description: |
- A package identifier marker may be specified. When present only
- packages which occur after the identifier ID will be listed
- in: query
- required: false
- type: string
-order_by:
- description: |
- Allows to sort packages by ``fqn``, ``name``, ``created``.
- Created is default value.
- in: query
- required: false
- type: string
-owned:
- description: |
- Search only from packages owned by current project.
- in: query
- required: false
- default: false
- type: boolean
-pkg_filters:
- description: |
- The filters that you want to use to search for packages in the
- application catalog. If no filters query parameter is specified, the
- application catalog API returns all packages allowed by the policy
- settings. By using filters parameter, the API returns only the requested
- set of packages that meet the filters. The list of filters includes:
-
- * limit: the maximum number of packages to return
- * type: the package type
- * id: the package id
- * category: the package category
- * tag: the package tag
- * class_name: the package class name
- * fqn: the package fully qualified name
- * name: the package name
- in: query
- required: false
- type: string
-pkg_id_query:
- description: |
- Allows to filter by package id.
- in: query
- required: false
- type: string
-pkg_name_query:
- description: |
- Allows to filter by package name.
- in: query
- required: false
- type: string
-pkg_type_query:
- description: |
- Allows to filter package by type, e.g. ``application``, ``library``.
- in: query
- required: false
- type: string
-search:
- description: |
- Gives opportunity to search specified data by all the
- package parameters and order packages.
- in: query
- required: false
- type: string
-tenant:
- description: |
- Indicates environments from specified tenant are listed. Admin user required.
- in: query
- required: false
- type: string
-
-# variables in body
-acquired_by:
- description: |
- The session that is currently `deploying` the environment. Returns the
- `first` session id that is in ``DEPLOYING`` state for the environment.
- in: body
- required: true
- type: string
-all_categories:
- description: |
- All categories available in the application catalog.
- in: body
- required: true
- type: array
-author:
- description: |
- The author of the package.
- in: body
- required: true
- type: string
-category_id:
- description: |
- The UUID of the category.
- in: body
- required: true
- type: string
-category_name:
- description: |
- The name of the category.
- in: body
- required: true
- type: string
-category_packages:
- description: |
- The list of packages associated with a package. Each package returned
- includes its ``id``, ``fully_qualified_name``, and ``name``.
- in: body
- required: true
- type: array
-class_definitions:
- description: |
- The class_definitions of the package.
- in: body
- required: true
- type: array
-created:
- description: |
- The date and time when the resource was created. The date and time stamp
- format is `ISO 8601 `_:
-
- ::
-
- CCYY-MM-DDThh:mm:ss±hh:mm
-
- For example, ``2015-08-27T09:49:58-05:00``.
-
- The ``±hh:mm`` value, if included, is the time zone as an offset
- from UTC.
- in: body
- required: true
- type: string
-deployments:
- description: |
- The list of deployments for either the current environment or all
- environments for the current tenant (project).
-
- The following APIs control whether deployments by environment or by
- project are returned:
-
- * ``/deployments``: Returns all deployments for a project.
- * ``/environments/{env_id}/deployments``: Returns all deployments for an
- environment in a project.
- in: body
- required: true
- type: array
-description:
- description: |
- The description of the package.
- in: body
- required: true
- type: string
-enabled:
- description: |
- Whether the package is browsed in the Application Catalog.
- in: body
- required: true
- type: boolean
-env_default_networks:
- description: |
- The default networking information of the environment. The information
- includes the ``name`` of the network, along with the ``type`` and ``id``
- of the network, contained in the ``?`` property.
-
- An example ``defaultNetworks`` object looks like::
-
- "defaultNetworks": {
- "environment": {
- "internalNetworkName": "net_two",
- "?": {
- "type": "io.murano.resources.ExistingNeutronNetwork",
- "id": "594e94fcfe4c48ef8f9b55edb3b9f177"
- }
- },
- "flat": null
- }
- in: body
- required: true
- type: object
-env_description:
- description: |
- The description of the environment.
- in: body
- required: true
- type: string
-env_id:
- description: |
- The UUID of the environment.
- in: body
- required: true
- type: string
-env_last_status:
- description: |
- Shows the most recent status of the environment for each service in the
- environment. The response object includes detailed information
- by ``service_id``.
- in: body
- required: true
- type: object
-env_model:
- description: |
- The ``?`` section of the environment, containing information about the
- environment model, including its ``type``, ``id`` and associated
- ``metadata``.
- in: body
- required: true
- type: object
-env_name:
- description: |
- A name for the environment. Name must be at least one non-white space
- symbol and less than 256 characters long.
- in: body
- required: true
- type: string
-env_name_request:
- description: |
- A name for the environment. Name must be at least
- one non-white space symbol.
- in: body
- required: true
- type: string
-env_region:
- description: |
- Current region of the environment.
- in: body
- required: true
- type: string
-env_status:
- description: |
- Current status of the environment. The available statuses are:
-
- * **Ready to configure**. When the environment is new and contains no
- components.
- * **Ready to deploy**. When the environment contains a component or multiple
- components and is ready for deployment.
- * **Ready**. When the environment has been successfully deployed.
- * **Deploying**. When the deploying is in progress.
- * **Deploy FAILURE**. When the deployment finished with errors.
- * **Deleting**. When deleting of an environment is in progress.
- * **Delete FAILURE**. You can abandon the environment in this case.
- in: body
- required: true
- type: string
-env_version:
- description: |
- Current version.
- in: body
- required: true
- type: int
-environments:
- description: |
- A list of ``environment`` object.
- in: body
- required: true
- type: array
-fully_qualified_name:
- description: |
- The fqn of the package.
- in: body
- required: true
- type: string
-is_public:
- description: |
- Whether the package is shared for other projects.
- in: body
- required: true
- type: boolean
-networking:
- description: |
- Current network of the environment.
- in: body
- required: true
- type: string
-owner_id:
- description: |
- The owner id of the package.
- in: body
- required: true
- type: string
-package_categories:
- description: |
- The categories associated with the package.
- in: body
- required: true
- type: array
-package_count:
- description: |
- The number of packages associated with the category.
- in: body
- required: true
- type: integer
-packages:
- description: |
- A list of ``package`` object.
- in: body
- required: true
- type: array
-pkg_file:
- description: |
- The upload package file.
- in: body
- required: true
- type: object
-pkg_id:
- description: |
- The UUID of the package.
- in: body
- required: true
- type: string
-pkg_name:
- description: |
- The name of the package.
- in: body
- required: true
- type: string
-pkg_supplier:
- description: |
- The supplier info of the package.
- in: body
- required: true
- type: object
-pkg_type:
- description: |
- The type of the package.
- in: body
- required: true
- type: string
-regions:
- description: |
- Detailed region information for the cloud environment.
- in: body
- required: true
- type: object
-services:
- description: |
- A list of ``service`` objects.
- in: body
- required: true
- type: array
-session_id:
- description: |
- The UUID of the session.
- in: body
- required: true
- type: string
-session_state:
- description: |
- The current state of the environment. When a session is first
- opened for the environment the state is ``opened``.
- in: body
- required: true
- type: string
-session_user_id:
- description: |
- The UUID of the session owner.
- in: body
- required: true
- type: string
-session_version:
- description: |
- The version of the session. It is tied to the version of the environment,
- so that only sessions whose version matches that of the environment can
- be deployed.
- in: body
- required: true
- type: integer
-tags:
- description: |
- The tags of the package.
- in: body
- required: true
- type: array
-task_id:
- description: |
- The UUID of the task associated with an action executed on a deployed
- environment.
- in: body
- required: true
- type: string
-template_description:
- description: |
- The environment template description.
- in: body
- required: true
- type: string
-template_id:
- description: |
- The UUID of the environment template.
- in: body
- required: true
- type: string
-template_is_public:
- description: |
- Indicates whether an environment template is public or not.
-
- - ``True``. The environment template is public. Can be cloned.
- - ``False``. The environment template is private.
- in: body
- required: true
- type: boolean
-template_name:
- description: |
- The name of the environment template. Only alphanumeric characters are
- allowed.
- in: body
- required: true
- type: string
-template_service:
- description: |
- Detailed information about the ``service`` to be added to the environment
- template. The ``service`` includes virtual resources and application
- information. The virtual resources information is specified inside the
- ``instance`` object property. Application information is specified
- inside the body of the ``service`` object.
-
- The ``instance`` object properties include:
-
- - ``assignFloatingIp``. Whether to assign a floating IP to the VM.
- - ``keyname``. The key name of a key pair for the VM.
- - ``image``. The image to be used to provision the VM.
- - ``flavor``. The flavor to be used to provision the VM.
- - ``?``. An object which includes the ``type`` of the server.
-
- An example ``instance`` looks like::
-
- {
- "assignFloatingIp": "true",
- "keyname": "mykeyname",
- "image": "cloud-fedora-v3",
- "flavor": "m1.medium",
- "?": {
- "type": "io.murano.resources.LinuxMuranoInstance",
- "id": "ef984a74-29a4-45c0-b1dc-2ab9f075732e"
- }
- }
-
- In addition, the ``service`` should also include the following:
-
- - ``name``. The ``name`` of the application.
- - ``?``. An object that includes the ``type`` and ``id`` of the
- application. An example ``type`` is:
- "io.murano.resources.LinuxMuranoInstance".
- - ``port``: The port to be used by the application. The value must be
- greater than 0 and less than 65536 (although formatted as a string).
-
- The entire ``service`` looks like::
-
- {
- "instance": {
- "assignFloatingIp": "true",
- "keyname": "mykeyname",
- "image": "cloud-fedora-v3",
- "flavor": "m1.medium",
- "?": {
- "type": "io.murano.resources.LinuxMuranoInstance",
- "id": "ef984a74-29a4-45c0-b1dc-2ab9f075732e"
- }
- },
- "name": "orion",
- "?": {
- "type": "io.murano.apps.apache.Tomcat",
- "id": "54cea43d-5970-4c73-b9ac-fea656f3c722"
- },
- "port": "8080"
- }
- in: body
- required: true
- type: object
-template_services:
- description: |
- The list of environment template ``service`` objects.
- in: body
- required: true
- type: array
-template_version:
- description: |
- The current version of the environment template.
- in: body
- required: true
- type: integer
-templates:
- description: |
- The list of templates.
- in: body
- required: true
- type: array
-tenant_id:
- description: |
- The UUID of the tenant. A tenant is also known as a project.
- in: body
- required: true
- type: string
-updated:
- description: |
- The date and time when the object was updated. The date and time stamp
- format is `ISO 8601 `_:
-
- ::
-
- CCYY-MM-DDThh:mm:ss±hh:mm
-
- For example, ``2015-08-27T09:49:58-05:00``.
-
- The ``±hh:mm`` value, if included, is the time zone as an offset from UTC.
- in: body
- required: true
- type: string
diff --git a/api-ref/source/v1/samples/category-create-response.json b/api-ref/source/v1/samples/category-create-response.json
deleted file mode 100644
index 853e40baa..000000000
--- a/api-ref/source/v1/samples/category-create-response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "id": "ce373a477f211e187a55404a662f968",
- "name": "category_name",
- "created": "2013-11-30T03:23:42Z",
- "updated": "2013-11-30T03:23:44Z",
- "package_count": 0
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/category-list-response.json b/api-ref/source/v1/samples/category-list-response.json
deleted file mode 100644
index 5eebb8b3c..000000000
--- a/api-ref/source/v1/samples/category-list-response.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "categories": [
- {
- "id": "0420045dce7445fabae7e5e61fff9e2f",
- "updated": "2014-12-26T13:57:04",
- "name": "Web",
- "created": "2014-12-26T13:57:04",
- "package_count": 1
- },
- {
- "id": "3dd486b1e26f40ac8f35416b63f52042",
- "updated": "2014-12-26T13:57:04",
- "name": "Databases",
- "created": "2014-12-26T13:57:04",
- "package_count": 0
- }
- ]
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/category-show-response.json b/api-ref/source/v1/samples/category-show-response.json
deleted file mode 100644
index eb69273b4..000000000
--- a/api-ref/source/v1/samples/category-show-response.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "id": "b308f7fa8a2f4a5eb419970c827f4466",
- "updated": "2015-01-28T17:00:19",
- "packages": [
- {
- "fully_qualified_name": "io.murano.apps.ZabbixServer",
- "id": "4dfb566e69e6445fbd4aea5099fe95e9",
- "name": "Zabbix Server"
- }
- ],
- "name": "Web",
- "created": "2015-01-28T17:00:19",
- "package_count": 1
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/deployments-list-response.json b/api-ref/source/v1/samples/deployments-list-response.json
deleted file mode 100644
index f18f121f7..000000000
--- a/api-ref/source/v1/samples/deployments-list-response.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "deployments": [
- {
- "updated": "2014-05-15T07:24:21",
- "environment_id": "744e44812da84e858946f5d817de4f72",
- "description": {
- "services": [
- {
- "instance": {
- "flavor": "m1.medium",
- "image": "cloud-fedora-v3",
- "?": {
- "type": "io.murano.resources.Instance",
- "id": "ef729199-c71e-4a4c-a314-0340e279add8"
- },
- "name": "xkaduhv7qeg4m7"
- },
- "name": "teslnet1",
- "?": {
- "_26411a1861294160833743e45d0eaad9": {
- "name": "Telnet"
- },
- "type": "io.murano.apps.linux.Telnet",
- "id": "6e437be2-b5bc-4263-8814-6fd57d6ddbd5"
- }
- }
- ],
- "defaultNetworks": {
- "environment": {
- "name": "test2-network",
- "?": {
- "type": "io.murano.lib.networks.neutron.NewNetwork",
- "id": "b6a1d515434047d5b4678a803646d556"
- }
- },
- "flat": null
- },
- "name": "test2",
- "?": {
- "type": "io.murano.Environment",
- "id": "744e44812da84e858946f5d817de4f72"
- }
- },
- "created": "2014-05-15T07:24:21",
- "started": "2014-05-15T07:24:21",
- "finished": null,
- "state": "running",
- "id": "327c81e0e34a4c93ad9b9052ef42b752"
- }
- ]
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/environment-create-request.json b/api-ref/source/v1/samples/environment-create-request.json
deleted file mode 100644
index 77fda7b0c..000000000
--- a/api-ref/source/v1/samples/environment-create-request.json
+++ /dev/null
@@ -1 +0,0 @@
-{"name": "env_name"}
diff --git a/api-ref/source/v1/samples/environment-create-response.json b/api-ref/source/v1/samples/environment-create-response.json
deleted file mode 100644
index 1b5ba0629..000000000
--- a/api-ref/source/v1/samples/environment-create-response.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "status": "ready",
- "updated": "2017-04-27T15:36:02",
- "created": "2017-04-27T15:36:02",
- "tenant_id": "cca37eef752244d99945a4123f30ff79",
- "acquired_by": null,
- "services": [],
- "version": 0,
- "description_text": "",
- "id": "a2977db57398401aba5804ef2211a2a3",
- "name": "env_name"
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/environment-last-status-response.json b/api-ref/source/v1/samples/environment-last-status-response.json
deleted file mode 100644
index 80564f971..000000000
--- a/api-ref/source/v1/samples/environment-last-status-response.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "lastStatuses": {
- "66563e45-4d0a-451e-8138-7bc773b0607d": {
- "updated": "2017-03-09T07:31:51",
- "task_id": "1267d8dfcf2144f9a31f0f033defa0fd",
- "level": "info",
- "text": "Unable to install ApacheHttpServer on node-1 due to The murano-agent did not respond within 3600 seconds",
- "created": "2017-03-09T07:31:51",
- "entity_id": "66563e45-4d0a-451e-8138-7bc773b0607d",
- "entity": null,
- "details": null,
- "id": "4f93ae1f73294bf1a58cbc59fffe6238"
- }
- }
-}
diff --git a/api-ref/source/v1/samples/environment-model-update-request.json b/api-ref/source/v1/samples/environment-model-update-request.json
deleted file mode 100644
index 013bdf862..000000000
--- a/api-ref/source/v1/samples/environment-model-update-request.json
+++ /dev/null
@@ -1,5 +0,0 @@
-[{
- "op": "replace",
- "path": "/defaultNetworks/flat",
- "value": true
-}]
diff --git a/api-ref/source/v1/samples/environment-show-response.json b/api-ref/source/v1/samples/environment-show-response.json
deleted file mode 100644
index c6d04c178..000000000
--- a/api-ref/source/v1/samples/environment-show-response.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "status": "ready",
- "updated": "2017-04-27T15:36:02",
- "created": "2017-04-27T15:36:02",
- "tenant_id": "cca37eef752244d99945a4123f30ff79",
- "acquired_by": null,
- "services": [
- {
- "instance": {
- "flavor": "m1.medium",
- "image": "cloud-fedora-v3",
- "name": "exgchhv6nbika2",
- "ipAddresses": [
- "10.0.0.200"
- ],
- "?": {
- "type": "io.murano.resources.Instance",
- "id": "14cce9d9-aaa1-4f09-84a9-c4bb859edaff"
- }
- },
- "name": "rewt4w56",
- "?": {
- "status": "ready",
- "_26411a1861294160833743e45d0eaad9": {
- "name": "Telnet"
- },
- "type": "io.murano.apps.linux.Telnet",
- "id": "446373ef-03b5-4925-b095-6c56568fa518"
- }
- }
- ],
- "version": 0,
- "description_text": "",
- "id": "a2977db57398401aba5804ef2211a2a3",
- "name": "env_name"
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/environment-update-request.json b/api-ref/source/v1/samples/environment-update-request.json
deleted file mode 100644
index c691c9c35..000000000
--- a/api-ref/source/v1/samples/environment-update-request.json
+++ /dev/null
@@ -1 +0,0 @@
-{"name": "env_name_changed"}
diff --git a/api-ref/source/v1/samples/environment-update-response.json b/api-ref/source/v1/samples/environment-update-response.json
deleted file mode 100644
index a88132ac9..000000000
--- a/api-ref/source/v1/samples/environment-update-response.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "status": "ready",
- "updated": "2017-04-27T16:01:29",
- "created": "2017-04-27T15:33:55",
- "tenant_id": "cca37eef752244d99945a4123f30ff79",
- "acquired_by": null,
- "services": [],
- "version": 0,
- "description_text": "",
- "id": "f199275420ff4e938e0307b0cf68374d",
- "name": "env_name_changed"
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/environments-list-response.json b/api-ref/source/v1/samples/environments-list-response.json
deleted file mode 100644
index e28bc1bde..000000000
--- a/api-ref/source/v1/samples/environments-list-response.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "environments": [
- {
- "status": "ready",
- "updated": "2014-05-14T13:02:54",
- "networking": {},
- "name": "test1",
- "created": "2014-05-14T13:02:46",
- "tenant_id": "726ed856965f43cc8e565bc991fa76c3",
- "version": 0,
- "id": "2fa5ab704749444bbeafe7991b412c33"
- },
- {
- "status": "ready",
- "updated": "2014-05-14T13:02:55",
- "networking": {},
- "name": "test2",
- "created": "2014-05-14T13:02:51",
- "tenant_id": "726ed856965f43cc8e565bc991fa76c3",
- "version": 0,
- "id": "744e44812da84e858946f5d817de4f72"
- }
- ]
-}
diff --git a/api-ref/source/v1/samples/environments-model-response.json b/api-ref/source/v1/samples/environments-model-response.json
deleted file mode 100644
index 835b15e92..000000000
--- a/api-ref/source/v1/samples/environments-model-response.json
+++ /dev/null
@@ -1,94 +0,0 @@
-{
- "defaultNetworks": {
- "environment": {
- "internalNetworkName": "net_two",
- "?": {
- "type": "io.murano.resources.ExistingNeutronNetwork",
- "id": "594e94fcfe4c48ef8f9b55edb3b9f177"
- }
- },
- "flat": null
- },
- "region": "RegionTwo",
- "name": "new_env",
- "regions": {
- "": {
- "defaultNetworks": {
- "environment": {
- "autoUplink": true,
- "name": "new_env-network",
- "externalRouterId": null,
- "dnsNameservers": [],
- "autogenerateSubnet": true,
- "subnetCidr": null,
- "openstackId": null,
- "?": {
- "dependencies": {
- "onDestruction": [{
- "subscriber": "c80e33dd67a44f489b2f04818b72f404",
- "handler": null
- }]
- },
- "type": "io.murano.resources.NeutronNetwork/0.0.0@io.murano",
- "id": "e145b50623c04a68956e3e656a0568d3",
- "name": null
- },
- "regionName": "RegionOne"
- },
- "flat": null
- },
- "name": "RegionOne",
- "?": {
- "type": "io.murano.CloudRegion/0.0.0@io.murano",
- "id": "c80e33dd67a44f489b2f04818b72f404",
- "name": null
- }
- },
- "RegionOne": "c80e33dd67a44f489b2f04818b72f404",
- "RegionTwo": {
- "defaultNetworks": {
- "environment": {
- "autoUplink": true,
- "name": "new_env-network",
- "externalRouterId": "e449bdd5-228c-4747-a925-18cda80fbd6b",
- "dnsNameservers": ["8.8.8.8"],
- "autogenerateSubnet": true,
- "subnetCidr": "10.0.198.0/24",
- "openstackId": "00a695c1-60ff-42ec-acb9-b916165413da",
- "?": {
- "dependencies": {
- "onDestruction": [{
- "subscriber": "f8cb28d147914850978edb35eca156e1",
- "handler": null
- }]
- },
- "type": "io.murano.resources.NeutronNetwork/0.0.0@io.murano",
- "id": "72d2c13c600247c98e09e2e3c1cd9d70",
- "name": null
- },
- "regionName": "RegionTwo"
- },
- "flat": null
- },
- "name": "RegionTwo",
- "?": {
- "type": "io.murano.CloudRegion/0.0.0@io.murano",
- "id": "f8cb28d147914850978edb35eca156e1",
- "name": null
- }
- }
- },
- "services": [],
- "?": {
- "type": "io.murano.Environment/0.0.0@io.murano",
- "_actions": {
- "f7f22c174070455c9cafc59391402bdc_deploy": {
- "enabled": true,
- "name": "deploy",
- "title": "deploy"
- }
- },
- "id": "f7f22c174070455c9cafc59391402bdc",
- "name": null
- }
-}
diff --git a/api-ref/source/v1/samples/execute-action-response.json b/api-ref/source/v1/samples/execute-action-response.json
deleted file mode 100644
index e351286e1..000000000
--- a/api-ref/source/v1/samples/execute-action-response.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "task_id": "9e60318629ef47378b583825e7d282b7"
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/package-create-response.json b/api-ref/source/v1/samples/package-create-response.json
deleted file mode 100644
index ae63cdd61..000000000
--- a/api-ref/source/v1/samples/package-create-response.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "class_definitions": [
- "com.example.apache.ApacheHttpServer"
- ],
- "description": "The Apache HTTP Server Project is an effort to develop and maintain an\nopen-source HTTP server for modern operating systems including UNIX and\nWindows NT. The goal of this project is to provide a secure, efficient and\nextensible server that provides HTTP services in sync with the current HTTP\nstandards.\nApache httpd has been the most popular web server on the Internet since\nApril 1996, and celebrated its 17th birthday as a project this February.\n",
- "tags": [
- "HTTP",
- "Server",
- "WebServer",
- "HTML",
- "Apache"
- ],
- "updated": "2017-04-06T07:54:40",
- "is_public": false,
- "id": "10f3e349bca9432abd673319195eed2b",
- "categories": [],
- "name": "Apache HTTP Server",
- "created": "2017-04-06T07:54:40",
- "author": "Mirantis, Inc",
- "enabled": true,
- "supplier": {},
- "fully_qualified_name": "com.example.apache.ApacheHttpServer",
- "type": "Application",
- "owner_id": "c0f6e4cf1bfc48aba587e709b58c9f28"
-}
diff --git a/api-ref/source/v1/samples/package-show-response.json b/api-ref/source/v1/samples/package-show-response.json
deleted file mode 100644
index e4ff8c530..000000000
--- a/api-ref/source/v1/samples/package-show-response.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "updated": "2017-04-06T08:22:11",
- "description": "The Apache HTTP Server Project is an effort to develop and maintain an\nopen-source HTTP server for modern operating systems including UNIX and\nWindows NT. The goal of this project is to provide a secure, efficient and\nextensible server that provides HTTP services in sync with the current HTTP\nstandards.\nApache httpd has been the most popular web server on the Internet since\nApril 1996, and celebrated its 17th birthday as a project this February.\n",
- "tags": [
- "HTTP",
- "Server",
- "WebServer",
- "HTML",
- "Apache"
- ],
- "class_definitions": [
- "com.example.apache.ApacheHttpServer"
- ],
- "is_public": false,
- "categories": [],
- "name": "Apache HTTP Server",
- "created": "2017-04-06T08:22:11",
- "author": "Mirantis, Inc",
- "enabled": true,
- "id": "979637f39a7245cebeabc99e6aa01666",
- "supplier": {},
- "fully_qualified_name": "com.example.apache.ApacheHttpServer",
- "type": "Application",
- "owner_id": "c0f6e4cf1bfc48aba587e709b58c9f28"
-}
diff --git a/api-ref/source/v1/samples/package-update-request.json b/api-ref/source/v1/samples/package-update-request.json
deleted file mode 100644
index 33fb203ae..000000000
--- a/api-ref/source/v1/samples/package-update-request.json
+++ /dev/null
@@ -1,7 +0,0 @@
-[
- {
- "path": "/is_public",
- "value": true,
- "op": "replace"
- }
-]
diff --git a/api-ref/source/v1/samples/package-update-response.json b/api-ref/source/v1/samples/package-update-response.json
deleted file mode 100644
index 912e41636..000000000
--- a/api-ref/source/v1/samples/package-update-response.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "updated": "2017-04-06T08:28:22",
- "description": "The Apache HTTP Server Project is an effort to develop and maintain an\nopen-source HTTP server for modern operating systems including UNIX and\nWindows NT. The goal of this project is to provide a secure, efficient and\nextensible server that provides HTTP services in sync with the current HTTP\nstandards.\nApache httpd has been the most popular web server on the Internet since\nApril 1996, and celebrated its 17th birthday as a project this February.\n",
- "tags": [
- "HTTP",
- "Server",
- "WebServer",
- "HTML",
- "Apache"
- ],
- "class_definitions": [
- "com.example.apache.ApacheHttpServer"
- ],
- "is_public": true,
- "categories": [],
- "name": "Apache HTTP Server",
- "created": "2017-04-06T08:22:11",
- "author": "Mirantis, Inc",
- "enabled": true,
- "id": "979637f39a7245cebeabc99e6aa01666",
- "supplier": {},
- "fully_qualified_name": "com.example.apache.ApacheHttpServer",
- "type": "Application",
- "owner_id": "c0f6e4cf1bfc48aba587e709b58c9f28"
-}
diff --git a/api-ref/source/v1/samples/packages-list-response.json b/api-ref/source/v1/samples/packages-list-response.json
deleted file mode 100644
index 8f9d9cdc5..000000000
--- a/api-ref/source/v1/samples/packages-list-response.json
+++ /dev/null
@@ -1,127 +0,0 @@
-{
- "packages": [
- {
- "updated": "2017-03-30T08:35:03",
- "description": "Library of base class to develop scalable Applications with MuranoPL\n",
- "tags": [],
- "class_definitions": [
- "io.murano.applications.tests.TestPoolReplicaProvider",
- "io.murano.applications.SingleServerApplication",
- "io.murano.applications.tests.TestSoftwareComponent",
- "io.murano.applications.SoftwareComponent",
- "io.murano.applications.tests.TestEvents",
- "io.murano.applications.CloneReplicaProvider",
- "io.murano.applications.PoolReplicaProvider",
- "io.murano.applications.Event",
- "io.murano.applications.SingleServerGroup",
- "io.murano.applications.TemplateServerProvider",
- "io.murano.applications.MultiServerApplication",
- "io.murano.applications.ReplicationGroup",
- "io.murano.applications.OpenStackSecurityConfigurable",
- "io.murano.applications.Configurable",
- "io.murano.applications.tests.TestMockedServerFactory",
- "io.murano.applications.tests.TestCompositeReplicaProvider",
- "io.murano.applications.tests.TestRoundrobinReplicaProvider",
- "io.murano.applications.ServerReplicationGroup",
- "io.murano.applications.CompositeReplicaProvider",
- "io.murano.applications.tests.TestReplication",
- "io.murano.applications.CompositeServerGroup",
- "io.murano.applications.RoundrobinReplicaProvider",
- "io.murano.applications.ServerGroup",
- "io.murano.applications.ServerList",
- "io.murano.applications.Installable",
- "io.murano.applications.ReplicaProvider",
- "io.murano.applications.MultiServerApplicationWithScaling"
- ],
- "is_public": true,
- "categories": [],
- "name": "Application Development Library",
- "created": "2017-03-30T08:35:03",
- "author": "Mirantis, Inc.",
- "enabled": true,
- "id": "b0298c205235410fba047f4af8df0eb0",
- "supplier": {},
- "fully_qualified_name": "io.murano.applications",
- "type": "Library",
- "owner_id": "c0f6e4cf1bfc48aba587e709b58c9f28"
- },
- {
- "updated": "2017-03-30T08:35:07",
- "description": "Core MuranoPL library\n",
- "tags": [
- "MuranoPL"
- ],
- "class_definitions": [
- "io.murano.Exception",
- "io.murano.system.MetadefBrowser",
- "io.murano.metadata.forms.Hidden",
- "io.murano.system.NeutronSecurityGroupManager",
- "io.murano.system.AgentListener",
- "io.murano.Environment",
- "io.murano.system.SecurityGroupManager",
- "io.murano.resources.ConfLangInstance",
- "io.murano.resources.HeatSWConfigLinuxInstance",
- "io.murano.test.TestFixture",
- "io.murano.resources.MetadataAware",
- "io.murano.SharedIp",
- "io.murano.File",
- "io.murano.resources.LinuxUDInstance",
- "io.murano.configuration.Linux",
- "io.murano.resources.ExistingNeutronNetwork",
- "io.murano.resources.LinuxMuranoInstance",
- "io.murano.Object",
- "io.murano.system.Logger",
- "io.murano.metadata.engine.Synchronize",
- "io.murano.test.DummyNetwork",
- "io.murano.resources.CinderVolume",
- "io.murano.metadata.Title",
- "io.murano.Project",
- "io.murano.system.Resources",
- "io.murano.metadata.forms.Section",
- "io.murano.resources.Network",
- "io.murano.system.MistralClient",
- "io.murano.resources.CinderVolumeBackup",
- "io.murano.system.NetworkExplorer",
- "io.murano.system.DummySecurityGroupManager",
- "io.murano.resources.WindowsInstance",
- "io.murano.CloudResource",
- "io.murano.CloudRegion",
- "io.murano.system.Agent",
- "io.murano.resources.Instance",
- "io.murano.resources.Volume",
- "io.murano.system.InstanceNotifier",
- "io.murano.metadata.ModelBuilder",
- "io.murano.system.HeatStack",
- "io.murano.resources.LinuxInstance",
- "io.murano.metadata.Description",
- "io.murano.metadata.engine.Serialize",
- "io.murano.resources.ExistingCinderVolume",
- "io.murano.resources.HeatSWConfigInstance",
- "io.murano.system.StatusReporter",
- "io.murano.Application",
- "io.murano.test.TestFixtureWithEnvironment",
- "io.murano.system.AwsSecurityGroupManager",
- "io.murano.StackTrace",
- "io.murano.resources.NovaNetwork",
- "io.murano.metadata.forms.Position",
- "io.murano.metadata.HelpText",
- "io.murano.resources.NeutronNetworkBase",
- "io.murano.User",
- "io.murano.resources.InstanceAffinityGroup",
- "io.murano.resources.NeutronNetwork",
- "io.murano.resources.CinderVolumeSnapshot"
- ],
- "is_public": true,
- "categories": [],
- "name": "Core library",
- "created": "2017-03-30T08:35:07",
- "author": "murano.io",
- "enabled": true,
- "id": "5b6c8d7cd0694a7ebb7525ae62357740",
- "supplier": {},
- "fully_qualified_name": "io.murano",
- "type": "Library",
- "owner_id": "c0f6e4cf1bfc48aba587e709b58c9f28"
- }
- ]
-}
diff --git a/api-ref/source/v1/samples/session-create-response.json b/api-ref/source/v1/samples/session-create-response.json
deleted file mode 100644
index 0fd944de0..000000000
--- a/api-ref/source/v1/samples/session-create-response.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "created": "2017-04-06T07:54:40",
- "updated": "2017-04-06T07:54:40",
- "environment_id": "744e44812da84e858946f5d817de4f72",
- "state": "opened",
- "version": 0,
- "id": "257bef44a9d848daa5b2563779714820"
- }
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/session-show-response.json b/api-ref/source/v1/samples/session-show-response.json
deleted file mode 100644
index 4680e9638..000000000
--- a/api-ref/source/v1/samples/session-show-response.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "id": "4aecdc2178b9430cbbb8db44fb7ac384",
- "environment_id": "4dc8a2e8986fa8fa5bf24dc8a2e8986fa8",
- "created": "2013-11-30T03:23:42Z",
- "updated": "2013-11-30T03:23:54Z",
- "user_id": "d7b501094caf4daab08469663a9e1a2b",
- "version": 0,
- "state": "deploying"
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/static-action-request.json b/api-ref/source/v1/samples/static-action-request.json
deleted file mode 100644
index fa8e1fd0a..000000000
--- a/api-ref/source/v1/samples/static-action-request.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "className": "ns.Bar",
- "methodName": "staticAction",
- "parameters": {"myName": "John"}
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/static-action-response.json b/api-ref/source/v1/samples/static-action-response.json
deleted file mode 100644
index 2414fae54..000000000
--- a/api-ref/source/v1/samples/static-action-response.json
+++ /dev/null
@@ -1 +0,0 @@
-"Hello, John"
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/template-add-app-request.json b/api-ref/source/v1/samples/template-add-app-request.json
deleted file mode 100644
index 37c9e1582..000000000
--- a/api-ref/source/v1/samples/template-add-app-request.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "instance": {
- "assignFloatingIp": "true",
- "keyname": "mykeyname",
- "image": "cloud-fedora-v3",
- "flavor": "m1.medium",
- "?": {
- "type": "io.murano.resources.LinuxMuranoInstance",
- "id": "ef984a74-29a4-45c0-b1dc-2ab9f075732e"
- }
- },
- "name": "orion",
- "?": {
- "type": "io.murano.apps.apache.Tomcat",
- "id": "54cea43d-5970-4c73-b9ac-fea656f3c722"
- },
- "port": "8080"
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/template-add-app-response.json b/api-ref/source/v1/samples/template-add-app-response.json
deleted file mode 100644
index 22a8e77e5..000000000
--- a/api-ref/source/v1/samples/template-add-app-response.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "updated": "2017-04-26T19:41:58",
- "created": "2017-04-26T19:33:10",
- "tenant_id": "cca37eef752244d99945a4123f30ff79",
- "services": [
- {
- "instance": {
- "assignFloatingIp": "true",
- "keyname": "mykeyname",
- "image": "cloud-fedora-v3",
- "flavor": "m1.medium",
- "?": {
- "type": "io.murano.resources.LinuxMuranoInstance",
- "id": "ef984a74-29a4-45c0-b1dc-2ab9f075732e"
- }
- },
- "name": "orion",
- "?": {
- "type": "io.murano.apps.apache.Tomcat",
- "id": "54cea43d-5970-4c73-b9ac-fea656f3c722"
- },
- "port": "8080"
- }
- ],
- "version": 0,
- "description_text": "",
- "is_public": false,
- "id": "64670f5ada0848408734b2985f5cbb92",
- "name": "test_application"
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/template-clone-request.json b/api-ref/source/v1/samples/template-clone-request.json
deleted file mode 100644
index 4da52938f..000000000
--- a/api-ref/source/v1/samples/template-clone-request.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "name": "cloned_env_template_name"
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/template-clone-response.json b/api-ref/source/v1/samples/template-clone-response.json
deleted file mode 100644
index b107d9676..000000000
--- a/api-ref/source/v1/samples/template-clone-response.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "updated": "2015-01-26T09:12:51",
- "name": "cloned_env_template_name",
- "created": "2015-01-26T09:12:51",
- "tenant_id": "00000000000000000000000000000001",
- "version": 0,
- "is_public": false,
- "id": "aa9033ca7ce245fca10e38e1c8c4bbf7",
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/template-create-env-request.json b/api-ref/source/v1/samples/template-create-env-request.json
deleted file mode 100644
index 85f6962bc..000000000
--- a/api-ref/source/v1/samples/template-create-env-request.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "name": "environment_name"
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/template-create-env-response.json b/api-ref/source/v1/samples/template-create-env-response.json
deleted file mode 100644
index 72db44524..000000000
--- a/api-ref/source/v1/samples/template-create-env-response.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "environment_id": "aa90fadfafca10e38e1c8c4bbf7",
- "name": "environment_name",
- "created": "2015-01-26T09:12:51",
- "tenant_id": "00000000000000000000000000000001",
- "version": 0,
- "session_id": "adf4dadfaa9033ca7ce245fca10e38e1c8c4bbf7",
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/template-create-request.json b/api-ref/source/v1/samples/template-create-request.json
deleted file mode 100644
index fe54e28b9..000000000
--- a/api-ref/source/v1/samples/template-create-request.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "name": "env_template_name"
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/template-create-response.json b/api-ref/source/v1/samples/template-create-response.json
deleted file mode 100644
index 338005c0a..000000000
--- a/api-ref/source/v1/samples/template-create-response.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "updated": "2014-05-14T13:02:55",
- "networking": {},
- "name": "test2",
- "created": "2014-05-14T13:02:51",
- "tenant_id": "123452452345346345634563456345346",
- "version": 0,
- "is_public": true,
- "description_text": "",
- "id": "744e44812da84e858946f5d817de4f72"
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/template-list-apps-response.json b/api-ref/source/v1/samples/template-list-apps-response.json
deleted file mode 100644
index a80b9a620..000000000
--- a/api-ref/source/v1/samples/template-list-apps-response.json
+++ /dev/null
@@ -1,33 +0,0 @@
-[
- {
- "instance":
- {
- "assignFloatingIp": "true",
- "keyname": "mykeyname",
- "image": "cloud-fedora-v3",
- "flavor": "m1.medium",
- "?":
- {
- "type": "io.murano.resources.LinuxMuranoInstance",
- "id": "ef984a74-29a4-45c0-b1dc-2ab9f075732e"
- }
- },
- "name": "tomcat",
- "?":
- {
- "type": "io.murano.apps.apache.Tomcat",
- "id": "54cea43d-5970-4c73-b9ac-fea656f3c722"
- },
- "port": "8080"
- },
- {
- "instance": "ef984a74-29a4-45c0-b1dc-2ab9f075732e",
- "password": "XXX",
- "name": "mysql",
- "?":
- {
- "type": "io.murano.apps.database.MySQL",
- "id": "54cea43d-5970-4c73-b9ac-fea656f3c722"
- }
- }
-]
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/template-show-response.json b/api-ref/source/v1/samples/template-show-response.json
deleted file mode 100644
index cbc030679..000000000
--- a/api-ref/source/v1/samples/template-show-response.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "updated": "2014-05-14T13:02:55",
- "networking": {},
- "name": "test2",
- "created": "2014-05-14T13:02:51",
- "tenant_id": "123452452345346345634563456345346",
- "services": [
- {
- "instance": {
- "assignFloatingIp": "true",
- "keyname": "mykeyname",
- "image": "cloud-fedora-v3",
- "flavor": "m1.medium",
- "?": {
- "type": "io.murano.resources.LinuxMuranoInstance",
- "id": "ef984a74-29a4-45c0-b1dc-2ab9f075732e"
- }
- },
- "name": "orion",
- "?": {
- "type": "io.murano.apps.apache.Tomcat",
- "id": "54cea43d-5970-4c73-b9ac-fea656f3c722"
- },
- "port": "8080"
- }
- ],
- "version": 0,
- "is_public": true,
- "description_text": "",
- "id": "744e44812da84e858946f5d817de4f72"
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/template-update-app-request.json b/api-ref/source/v1/samples/template-update-app-request.json
deleted file mode 100644
index 9fc3ebc52..000000000
--- a/api-ref/source/v1/samples/template-update-app-request.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "instance": {
- "assignFloatingIp": "true",
- "keyname": "mykeyname",
- "image": "cloud-fedora-v3",
- "flavor": "m1.medium",
- "?": {
- "type": "io.murano.resources.LinuxMuranoInstance",
- "id": "ef984a74-29a4-45c0-b1dc-2ab9f075732e"
- }
- },
- "name": "orion",
- "port": "8080",
- "?": {
- "type": "io.murano.apps.apache.Tomcat",
- "id": "54cea43d-5970-4c73-b9ac-fea656f3c722"
- }
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/template-update-app-response.json b/api-ref/source/v1/samples/template-update-app-response.json
deleted file mode 100644
index 4d084278e..000000000
--- a/api-ref/source/v1/samples/template-update-app-response.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "instance":
- {
- "assignFloatingIp": "true",
- "keyname": "mykeyname",
- "image": "cloud-fedora-v3",
- "flavor": "m1.medium",
- "?":
- {
- "type": "io.murano.resources.LinuxMuranoInstance",
- "id": "ef984a74-29a4-45c0-b1dc-2ab9f075732e"
- }
- },
- "name": "orion",
- "?":
- {
- "type": "io.murano.apps.apache.Tomcat",
- "id": "54cea43d-5970-4c73-b9ac-fea656f3c722"
- },
- "port": "8080"
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/samples/templates-list-response.json b/api-ref/source/v1/samples/templates-list-response.json
deleted file mode 100644
index 3c6b45215..000000000
--- a/api-ref/source/v1/samples/templates-list-response.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "templates": [
- {
- "updated": "2014-05-14T13:02:54",
- "networking": {},
- "name": "test1",
- "created": "2014-05-14T13:02:46",
- "tenant_id": "726ed856965f43cc8e565bc991fa76c3",
- "version": 0,
- "is_public": false,
- "description_text": "",
- "id": "2fa5ab704749444bbeafe7991b412c33"
- },
- {
- "updated": "2014-05-14T13:02:55",
- "networking": {},
- "name": "test2",
- "created": "2014-05-14T13:02:51",
- "tenant_id": "123452452345346345634563456345346",
- "version": 0,
- "is_public": true,
- "description_text": "",
- "id": "744e44812da84e858946f5d817de4f72"
- }
- ]
-}
\ No newline at end of file
diff --git a/api-ref/source/v1/sessions.inc b/api-ref/source/v1/sessions.inc
deleted file mode 100644
index 33b1ab0ab..000000000
--- a/api-ref/source/v1/sessions.inc
+++ /dev/null
@@ -1,165 +0,0 @@
-.. -*- rst -*-
-
-=============================
-Environment Configuration API
-=============================
-
-Since Murano environments are available for local modification by different
-users and from different locations, it's therefore necessary to store local
-modifications somewhere. Thus, sessions were created to satisfy this
-requirement. After a user adds applications to an environment, a new session
-can be created. A session can be deployed only once.
-
-.. note::
-
- Multiple sessions can be opened for one environment simultaneously, but only
- one session can be deployed at a time. Only the first session that is deployed
- will be deployed, while the other ones will become invalid, no longer
- capable of being deploying. Once an environment is in ``deploying`` or
- ``deleting`` status, a new session for the environment cannot be opened.
-
-Configure Environment / Open Session
-====================================
-
-.. rest_method:: POST /environments/{env_id}/configure
-
-Creates a new configuration session for environment ``env_id``.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 403
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - env_id: env_id_url
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - created: created
- - updated: updated
- - environment_id: env_id
- - state: session_state
- - version: session_version
- - id: session_id
-
-Response Example
-----------------
-
-.. literalinclude:: samples/session-create-response.json
- :language: javascript
-
-Deploy session
-==============
-
-.. rest_method:: POST /environments/{env_id}/sessions/{session_id}/deploy
-
-Start deployment of a murano environment session.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 403
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - env_id: env_id_url
- - session_id: session_id_url
-
-Get Session Details
-===================
-
-.. rest_method:: GET /environments/{env_id}/sessions/{session_id}
-
-Start deployment of a murano environment session.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 403
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - env_id: env_id_url
- - session_id: session_id_url
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - id: session_id
- - environment_id: env_id
- - created: created
- - updated: updated
- - user_id: session_user_id
- - version: session_version
- - state: session_state
-
-Response Example
-----------------
-
-.. literalinclude:: samples/session-show-response.json
- :language: javascript
-
-Delete Session
-==============
-
-.. rest_method:: DELETE /environments/{env_id}/sessions/{session_id}
-
-Delete the session ``session_id``.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 403
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - env_id: env_id_url
- - session_id: session_id_url
diff --git a/api-ref/source/v1/status.yaml b/api-ref/source/v1/status.yaml
deleted file mode 100644
index b4d27fed5..000000000
--- a/api-ref/source/v1/status.yaml
+++ /dev/null
@@ -1,62 +0,0 @@
-#################
-# Success Codes #
-#################
-200:
- default: |
- Request was successful.
-201:
- default: |
- Resource was created and is ready to use.
-202:
- default: |
- Request was accepted for processing, but the processing has not been
- completed. A 'location' header is included in the response which contains
- a link to check the progress of the request.
-204:
- default: |
- The server has fulfilled the request by deleting the resource.
-300:
- default: |
- There are multiple choices for resources. The request has to be more
- specific to successfully retrieve one of these resources.
-302:
- default: |
- The response is about a redirection hint. The header of the response
- usually contains a 'location' value where requesters can check to track
- the real location of the resource.
-
-#################
-# Error Codes #
-#################
-
-400:
- default: |
- Some content in the request was invalid.
- resource_signal: |
- The target resource doesn't support receiving a signal.
-401:
- default: |
- User must authenticate before making a request.
-403:
- default: |
- Policy does not allow current user to do this operation.
-404:
- default: |
- The requested resource could not be found.
-405:
- default: |
- Method is not valid for this endpoint.
-409:
- default: |
- This operation conflicted with another operation on this resource.
- duplicate_zone: |
- There is already a zone with this name.
-500:
- default: |
- Something went wrong inside the service. This should not happen usually.
- If it does happen, it means the server has experienced some serious
- problems.
-503:
- default: |
- Service is not available. This is mostly caused by service configuration
- errors which prevents the service from successful start up.
diff --git a/api-ref/source/v1/templates.inc b/api-ref/source/v1/templates.inc
deleted file mode 100644
index 39e983b09..000000000
--- a/api-ref/source/v1/templates.inc
+++ /dev/null
@@ -1,517 +0,0 @@
-.. -*- rst -*-
-
-=====================
-Environment Templates
-=====================
-
-An environment template specifies a set of virtual resources and application
-information that can be deployed on top of OpenStack by translation this
-information into an application-ready environment. Environment templates can
-be customized, created, deleted and modified by users. Environment templates
-can be instantied as many times as the user desires. For example, the user can
-have different deployments from the same environment template: one for testing
-and another for production.
-
-The workflow for the creation and the instantiation of the environment template
-is as follows:
-
-#. Creation of the environment template (including application information)
-#. Transformation of the environment template into the environment
- (creation of the environment and session and adding applications to the
- environment)
-#. Deployment of the environment on top of Openstack
-
-Each environment template consists of services, which specify the application
-information. Each service includes information about the applications that
-will be installed (e.g. Tomcat), including application properties like
-the Tomcat port. Additional information pertaining to the virtual server
-may be specified, if applicable, such as keyname, flavor, image, etc.
-
-The following is an example of an environment template::
-
- {
- "name": "env_template_name",
- "services": [
- {
- "instance": {
- "assignFloatingIp": "true",
- "keyname": "mykeyname",
- "image": "cloud-fedora-v3",
- "flavor": "m1.medium",
- "?": {
- "type": "io.murano.resources.LinuxMuranoInstance",
- "id": "ef984a74-29a4-45c0-b1dc-2ab9f075732e"
- }
- },
- "name": "tomcat",
- "port": "8080",
- "?": {
- "type": "io.murano.apps.apache.Tomcat",
- "id": "54cea43d-5970-4c73-b9ac-fea656f3c722"
- }
- }
- ]
- }
-
-List environment templates
-==========================
-
-.. rest_method:: GET /templates
-
-Get a list of environment templates.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - is_public: template_is_public_url
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - templates: templates
- - created: created
- - updated: updated
- - name: template_name
- - tenant_id: tenant_id
- - version: template_version
- - description_text: template_description
- - is_public: template_is_public
- - id: template_id
-
-Response Example
-----------------
-
-.. literalinclude:: samples/templates-list-response.json
- :language: javascript
-
-Create environment template
-===========================
-
-.. rest_method:: POST /templates
-
-Create an environment template.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 409
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - name: template_name
- - is_public: template_is_public
-
-Request Example
----------------
-
-.. literalinclude:: samples/template-create-request.json
- :language: javascript
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - created: created
- - updated: updated
- - name: template_name
- - tenant_id: tenant_id
- - version: template_version
- - description_text: template_description
- - is_public: template_is_public
- - id: template_id
-
-Response Example
-----------------
-
-.. literalinclude:: samples/template-create-response.json
- :language: javascript
-
-Get environment template details
-================================
-
-.. rest_method:: GET /templates/{env_temp_id}
-
-Get details for the environment template ``env_temp_id``.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 404
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - env_temp_id: template_id_url
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - created: created
- - updated: updated
- - name: template_name
- - services: template_services
- - tenant_id: tenant_id
- - version: template_version
- - description_text: template_description
- - is_public: template_is_public
- - id: template_id
-
-Response Example
-----------------
-
-.. literalinclude:: samples/template-show-response.json
- :language: javascript
-
-Delete environment template
-===========================
-
-.. rest_method:: DELETE /templates/{env_temp_id}
-
-Delete the environment template ``env_temp_id``.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 404
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - env_temp_id: template_id_url
-
-Add application to environment template
-=======================================
-
-.. rest_method:: POST /templates/{env_temp_id}/services
-
-Create a new application for environment template ``env_temp_id``.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 404
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - env_temp_id: template_id_url
- - service: template_service
-
-Request Example
----------------
-
-.. literalinclude:: samples/template-add-app-request.json
- :language: javascript
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - updated: updated
- - created: created
- - tenant_id: tenant_id
- - services: template_services
- - version: template_version
- - description_text: template_description
- - is_public: template_is_public
- - id: template_id
- - name: template_name
-
-Response Example
-----------------
-
-.. literalinclude:: samples/template-add-app-response.json
- :language: javascript
-
-Delete application from an environment template
-===============================================
-
-.. rest_method:: DELETE /templates/{env_temp_id}/services/{service_id}
-
-Delete an application from an environment template.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 404
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - env_temp_id: template_id_url
- - service_id: service_id_url
-
-List application details for environment template
-=================================================
-
-.. rest_method:: GET /templates/{env_temp_id}/services
-
-List all the applications for the specified environment template
-``env_temp_id``.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 404
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - env_temp_id: template_id_url
-
-Response Parameters
--------------------
-
- - X-Openstack-Request-Id: request_id
- - updated: updated
- - created: created
- - tenant_id: tenant_id
- - services: template_services
- - version: template_version
- - description_text: template_description
- - is_public: template_is_public
- - id: template_id
- - name: template_name
-
-Response Example
-----------------
-
-.. literalinclude:: samples/template-list-apps-response.json
- :language: javascript
-
-Update application for an environment template
-==============================================
-
-.. rest_method:: PUT /templates/{env_temp_id}/services/{service_id}
-
-Delete an application from an environment template.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 404
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - env_temp_id: template_id_url
- - service_id: service_id_url
- - service: template_service
-
-Request Example
----------------
-
-.. literalinclude:: samples/template-update-app-request.json
- :language: javascript
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - service: template_service
-
-Response Example
-----------------
-
-.. literalinclude:: samples/template-update-app-response.json
- :language: javascript
-
-Create environment from environment template
-============================================
-
-.. rest_method:: GET /templates/{env_temp_id}/create-environment
-
-Create an environment from the environment template ``env_temp_id``.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 404
- - 409
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - env_temp_id: template_id_url
- - name: env_name
-
-Request Example
----------------
-
-.. literalinclude:: samples/template-create-env-request.json
- :language: javascript
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - environment_id: env_id
- - name: env_name
- - created: created
- - tenant_id: tenant_id
- - version: env_version
- - session_id: session_id
-
-Response Example
-----------------
-
-.. literalinclude:: samples/template-create-env-response.json
- :language: javascript
-
-Clone environment template
-==========================
-
-.. rest_method:: GET /templates/{env_temp_id}/clone
-
-Clones an environment template from one tenant into another.
-
-.. note:
-
- In order to clone an environment template, the template *must* be
- public.
-
-Response Codes
---------------
-
-.. rest_status_code:: success status.yaml
-
- - 200
-
-.. rest_status_code:: error status.yaml
-
- - 401
- - 404
- - 409
-
-Request Parameters
-------------------
-
-.. rest_parameters:: parameters.yaml
-
- - env_temp_id: template_id_url
- - name: template_name
-
-Request Example
----------------
-
-.. literalinclude:: samples/template-clone-request.json
- :language: javascript
-
-Response Parameters
--------------------
-
-.. rest_parameters:: parameters.yaml
-
- - X-Openstack-Request-Id: request_id
- - environment_id: env_id
- - name: env_name
- - created: created
- - tenant_id: tenant_id
- - version: env_version
- - session_id: session_id
-
-Response Example
-----------------
-
-.. literalinclude:: samples/template-clone-response.json
- :language: javascript
diff --git a/bandit.yaml b/bandit.yaml
deleted file mode 100644
index 3ca88f651..000000000
--- a/bandit.yaml
+++ /dev/null
@@ -1,157 +0,0 @@
-
-### This config may optionally select a subset of tests to run or skip by
-### filling out the 'tests' and 'skips' lists given below. If no tests are
-### specified for inclusion then it is assumed all tests are desired. The skips
-### set will remove specific tests from the include set. This can be controlled
-### using the -t/-s CLI options. Note that the same test ID should not appear
-### in both 'tests' and 'skips', this would be nonsensical and is detected by
-### Bandit at runtime.
-
-# Available tests:
-# B101 : assert_used
-# B102 : exec_used
-# B103 : set_bad_file_permissions
-# B104 : hardcoded_bind_all_interfaces
-# B105 : hardcoded_password_string
-# B106 : hardcoded_password_funcarg
-# B107 : hardcoded_password_default
-# B108 : hardcoded_tmp_directory
-# B109 : password_config_option_not_marked_secret
-# B110 : try_except_pass
-# B111 : execute_with_run_as_root_equals_true
-# B112 : try_except_continue
-# B201 : flask_debug_true
-# B301 : pickle
-# B302 : marshal
-# B303 : md5
-# B304 : ciphers
-# B305 : cipher_modes
-# B306 : mktemp_q
-# B307 : eval
-# B308 : mark_safe
-# B309 : httpsconnection
-# B310 : urllib_urlopen
-# B311 : random
-# B312 : telnetlib
-# B313 : xml_bad_cElementTree
-# B314 : xml_bad_ElementTree
-# B315 : xml_bad_expatreader
-# B316 : xml_bad_expatbuilder
-# B317 : xml_bad_sax
-# B318 : xml_bad_minidom
-# B319 : xml_bad_pulldom
-# B320 : xml_bad_etree
-# B321 : ftplib
-# B401 : import_telnetlib
-# B402 : import_ftplib
-# B403 : import_pickle
-# B404 : import_subprocess
-# B405 : import_xml_etree
-# B406 : import_xml_sax
-# B407 : import_xml_expat
-# B408 : import_xml_minidom
-# B409 : import_xml_pulldom
-# B410 : import_lxml
-# B411 : import_xmlrpclib
-# B412 : import_httpoxy
-# B501 : request_with_no_cert_validation
-# B502 : ssl_with_bad_version
-# B503 : ssl_with_bad_defaults
-# B504 : ssl_with_no_version
-# B505 : weak_cryptographic_key
-# B506 : yaml_load
-# B601 : paramiko_calls
-# B602 : subprocess_popen_with_shell_equals_true
-# B603 : subprocess_without_shell_equals_true
-# B604 : any_other_function_with_shell_equals_true
-# B605 : start_process_with_a_shell
-# B606 : start_process_with_no_shell
-# B607 : start_process_with_partial_path
-# B608 : hardcoded_sql_expressions
-# B609 : linux_commands_wildcard_injection
-# B701 : jinja2_autoescape_false
-# B702 : use_of_mako_templates
-
-# (optional) list included test IDs here, eg '[B101, B406]':
-tests:
-
-# (optional) list skipped test IDs here, eg '[B101, B406]':
-skips: [B104]
-
-### (optional) plugin settings - some test plugins require configuration data
-### that may be given here, per-plugin. All bandit test plugins have a built in
-### set of sensible defaults and these will be used if no configuration is
-### provided. It is not necessary to provide settings for every (or any) plugin
-### if the defaults are acceptable.
-
-#any_other_function_with_shell_equals_true:
-# no_shell: [os.execl, os.execle, os.execlp, os.execlpe, os.execv, os.execve, os.execvp,
-# os.execvpe, os.spawnl, os.spawnle, os.spawnlp, os.spawnlpe, os.spawnv, os.spawnve,
-# os.spawnvp, os.spawnvpe, os.startfile]
-# shell: [os.system, os.popen, os.popen2, os.popen3, os.popen4, popen2.popen2, popen2.popen3,
-# popen2.popen4, popen2.Popen3, popen2.Popen4, commands.getoutput, commands.getstatusoutput]
-# subprocess: [subprocess.Popen, subprocess.call, subprocess.check_call, subprocess.check_output,
-# utils.execute, utils.execute_with_timeout]
-#execute_with_run_as_root_equals_true:
-# function_names: [ceilometer.utils.execute, cinder.utils.execute, neutron.agent.linux.utils.execute,
-# nova.utils.execute, nova.utils.trycmd]
-#hardcoded_tmp_directory:
-# tmp_dirs: [/tmp, /var/tmp, /dev/shm]
-#linux_commands_wildcard_injection:
-# no_shell: [os.execl, os.execle, os.execlp, os.execlpe, os.execv, os.execve, os.execvp,
-# os.execvpe, os.spawnl, os.spawnle, os.spawnlp, os.spawnlpe, os.spawnv, os.spawnve,
-# os.spawnvp, os.spawnvpe, os.startfile]
-# shell: [os.system, os.popen, os.popen2, os.popen3, os.popen4, popen2.popen2, popen2.popen3,
-# popen2.popen4, popen2.Popen3, popen2.Popen4, commands.getoutput, commands.getstatusoutput]
-# subprocess: [subprocess.Popen, subprocess.call, subprocess.check_call, subprocess.check_output,
-# utils.execute, utils.execute_with_timeout]
-#password_config_option_not_marked_secret:
-# function_names: [oslo.config.cfg.StrOpt, oslo_config.cfg.StrOpt]
-#ssl_with_bad_defaults:
-# bad_protocol_versions: [PROTOCOL_SSLv2, SSLv2_METHOD, SSLv23_METHOD, PROTOCOL_SSLv3,
-# PROTOCOL_TLSv1, SSLv3_METHOD, TLSv1_METHOD]
-#ssl_with_bad_version:
-# bad_protocol_versions: [PROTOCOL_SSLv2, SSLv2_METHOD, SSLv23_METHOD, PROTOCOL_SSLv3,
-# PROTOCOL_TLSv1, SSLv3_METHOD, TLSv1_METHOD]
-#start_process_with_a_shell:
-# no_shell: [os.execl, os.execle, os.execlp, os.execlpe, os.execv, os.execve, os.execvp,
-# os.execvpe, os.spawnl, os.spawnle, os.spawnlp, os.spawnlpe, os.spawnv, os.spawnve,
-# os.spawnvp, os.spawnvpe, os.startfile]
-# shell: [os.system, os.popen, os.popen2, os.popen3, os.popen4, popen2.popen2, popen2.popen3,
-# popen2.popen4, popen2.Popen3, popen2.Popen4, commands.getoutput, commands.getstatusoutput]
-# subprocess: [subprocess.Popen, subprocess.call, subprocess.check_call, subprocess.check_output,
-# utils.execute, utils.execute_with_timeout]
-#start_process_with_no_shell:
-# no_shell: [os.execl, os.execle, os.execlp, os.execlpe, os.execv, os.execve, os.execvp,
-# os.execvpe, os.spawnl, os.spawnle, os.spawnlp, os.spawnlpe, os.spawnv, os.spawnve,
-# os.spawnvp, os.spawnvpe, os.startfile]
-# shell: [os.system, os.popen, os.popen2, os.popen3, os.popen4, popen2.popen2, popen2.popen3,
-# popen2.popen4, popen2.Popen3, popen2.Popen4, commands.getoutput, commands.getstatusoutput]
-# subprocess: [subprocess.Popen, subprocess.call, subprocess.check_call, subprocess.check_output,
-# utils.execute, utils.execute_with_timeout]
-#start_process_with_partial_path:
-# no_shell: [os.execl, os.execle, os.execlp, os.execlpe, os.execv, os.execve, os.execvp,
-# os.execvpe, os.spawnl, os.spawnle, os.spawnlp, os.spawnlpe, os.spawnv, os.spawnve,
-# os.spawnvp, os.spawnvpe, os.startfile]
-# shell: [os.system, os.popen, os.popen2, os.popen3, os.popen4, popen2.popen2, popen2.popen3,
-# popen2.popen4, popen2.Popen3, popen2.Popen4, commands.getoutput, commands.getstatusoutput]
-# subprocess: [subprocess.Popen, subprocess.call, subprocess.check_call, subprocess.check_output,
-# utils.execute, utils.execute_with_timeout]
-#subprocess_popen_with_shell_equals_true:
-# no_shell: [os.execl, os.execle, os.execlp, os.execlpe, os.execv, os.execve, os.execvp,
-# os.execvpe, os.spawnl, os.spawnle, os.spawnlp, os.spawnlpe, os.spawnv, os.spawnve,
-# os.spawnvp, os.spawnvpe, os.startfile]
-# shell: [os.system, os.popen, os.popen2, os.popen3, os.popen4, popen2.popen2, popen2.popen3,
-# popen2.popen4, popen2.Popen3, popen2.Popen4, commands.getoutput, commands.getstatusoutput]
-# subprocess: [subprocess.Popen, subprocess.call, subprocess.check_call, subprocess.check_output,
-# utils.execute, utils.execute_with_timeout]
-#subprocess_without_shell_equals_true:
-# no_shell: [os.execl, os.execle, os.execlp, os.execlpe, os.execv, os.execve, os.execvp,
-# os.execvpe, os.spawnl, os.spawnle, os.spawnlp, os.spawnlpe, os.spawnv, os.spawnve,
-# os.spawnvp, os.spawnvpe, os.startfile]
-# shell: [os.system, os.popen, os.popen2, os.popen3, os.popen4, popen2.popen2, popen2.popen3,
-# popen2.popen4, popen2.Popen3, popen2.Popen4, commands.getoutput, commands.getstatusoutput]
-# subprocess: [subprocess.Popen, subprocess.call, subprocess.check_call, subprocess.check_output,
-# utils.execute, utils.execute_with_timeout]
-#try_except_continue: {check_typed_exception: false}
-#try_except_pass: {check_typed_exception: false}
diff --git a/bindep.txt b/bindep.txt
deleted file mode 100644
index 64c6e0042..000000000
--- a/bindep.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-# This is a cross-platform list tracking distribution packages needed for install and tests;
-# see https://docs.openstack.org/infra/bindep/ for additional information.
-
-libpq-dev [platform:dpkg]
-mysql-client [platform:dpkg]
-mysql-server [platform:dpkg]
-postgresql
-postgresql-client [platform:dpkg]
-
-# PDF Docs package dependencies
-tex-gyre [platform:dpkg doc]
diff --git a/contrib/elements/docker/README.md b/contrib/elements/docker/README.md
deleted file mode 100644
index 1b3b9a4f6..000000000
--- a/contrib/elements/docker/README.md
+++ /dev/null
@@ -1 +0,0 @@
-This element install Docker on Ubuntu/CentOS
\ No newline at end of file
diff --git a/contrib/elements/docker/install.d/56-docker b/contrib/elements/docker/install.d/56-docker
deleted file mode 100755
index e0d943c8b..000000000
--- a/contrib/elements/docker/install.d/56-docker
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-
-set -eu
-
-if [ -e /etc/lsb-release ]; then
- if [ -e /usr/lib/apt/methods/https ]; then
- apt-get update
- apt-get install apt-transport-https
- fi
- apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
- echo "deb https://get.docker.com/ubuntu docker main" > /etc/apt/sources.list.d/docker.list
- apt-get update
- apt-get -y install lxc-docker
-else
- yum -y install docker
-fi
\ No newline at end of file
diff --git a/contrib/elements/kubernetes/README.md b/contrib/elements/kubernetes/README.md
deleted file mode 100644
index 97a8bd088..000000000
--- a/contrib/elements/kubernetes/README.md
+++ /dev/null
@@ -1 +0,0 @@
-This element installs Kubernetes on Ubuntu/CentOS
\ No newline at end of file
diff --git a/contrib/elements/kubernetes/element-deps b/contrib/elements/kubernetes/element-deps
deleted file mode 100644
index 6d0eac4b3..000000000
--- a/contrib/elements/kubernetes/element-deps
+++ /dev/null
@@ -1 +0,0 @@
-docker
\ No newline at end of file
diff --git a/contrib/elements/kubernetes/install.d/57-kubernetes b/contrib/elements/kubernetes/install.d/57-kubernetes
deleted file mode 100755
index 094788d5c..000000000
--- a/contrib/elements/kubernetes/install.d/57-kubernetes
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/bash
-install-packages curl wget linux-libc-dev git gcc libc6-dev bridge-utils haproxy
-
-SVC_ROOT=/opt/bin
-
-ETCD_LATEST_VERSION=$(curl https://github.com/coreos/etcd/releases/latest | awk -F'"' '{ print $2 }' | awk -F'/' '{ print $8 }')
-ETCD_LATEST_URL="https://github.com/coreos/etcd/releases/download/${ETCD_LATEST_VERSION}/etcd-${ETCD_LATEST_VERSION}-linux-amd64.tar.gz"
-KUBE_LATEST_VERSION=$(curl https://github.com/GoogleCloudPlatform/kubernetes/releases/latest | awk -F'"' '{ print $2 }' | awk -F'/' '{ print $8 }')
-KUBE_LATEST_URL="https://github.com/GoogleCloudPlatform/kubernetes/releases/download/${KUBE_LATEST_VERSION}/kubernetes.tar.gz"
-
-mkdir -p ${SVC_ROOT}
-pushd ${SVC_ROOT}
-
-# Install latest etcd
-wget -O ${SVC_ROOT}/etcd-latest.tar.gz $ETCD_LATEST_URL
-tar xzvf ${SVC_ROOT}/etcd-latest.tar.gz
-rm -f ${SVC_ROOT}/etcd-latest.tar.gz
-
-mv ${SVC_ROOT}/etcd-${ETCD_LATEST_VERSION}-linux-amd64/etcd ${SVC_ROOT}/
-mv ${SVC_ROOT}/etcd-${ETCD_LATEST_VERSION}-linux-amd64/etcdctl ${SVC_ROOT}/
-
-rm -rf ${SVC_ROOT}/etcd-${ETCD_LATEST_VERSION}-linux-amd64
-
-# Install latest kubernetes
-wget -O ${SVC_ROOT}/kubernetes-latest.tar.gz $KUBE_LATEST_URL
-tar xzvf ${SVC_ROOT}/kubernetes-latest.tar.gz
-rm -f ${SVC_ROOT}/kubernetes-latest.tar.gz
-
-tar xzvf ${SVC_ROOT}/kubernetes/server/kubernetes-server-linux-amd64.tar.gz
-mv ${SVC_ROOT}/kubernetes ${SVC_ROOT}/kubernetes-latest
-
-cp ${SVC_ROOT}/kubernetes-latest/server/bin/* ${SVC_ROOT}/
-
-rm -rf ${SVC_ROOT}/kubernetes-latest
-
-# Install Go
-wget -O go.tar.gz https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz
-tar xzvf go.tar.gz
-mv ${SVC_ROOT}/go /usr/local/go
-export PATH=$PATH:/usr/local/go/bin
-
-# Build flannel
-git clone https://github.com/coreos/flannel flannel
-pushd ${SVC_ROOT}/flannel
-${SVC_ROOT}/flannel/build
-popd
-
-cp ${SVC_ROOT}/flannel/bin/flanneld ${SVC_ROOT}/flanneld
-
-rm -rf ${SVC_ROOT}/flannel
-
-
-# Update system PATH
-sed -i 's/PATH="/PATH="\/opt\/bin:\/opt\/go\/bin:/g' /etc/environment
-
-
-wget -O confd https://github.com/kelseyhightower/confd/releases/download/v0.7.1/confd-0.7.1-linux-amd64
-mv confd /usr/local/bin/confd
-chmod +x /usr/local/bin/confd
-mkdir -p /etc/confd/{conf.d,templates}
-
-popd
\ No newline at end of file
diff --git a/contrib/glance/muranoartifact/__init__.py b/contrib/glance/muranoartifact/__init__.py
deleted file mode 100644
index 7c7a7b6c0..000000000
--- a/contrib/glance/muranoartifact/__init__.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (c) 2015 Mirantis, Inc.
-#
-# 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 muranoartifact.v1 import package
-
-VERSIONS = [package.MuranoPackage]
diff --git a/contrib/glance/muranoartifact/v1/__init__.py b/contrib/glance/muranoartifact/v1/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/contrib/glance/muranoartifact/v1/package.py b/contrib/glance/muranoartifact/v1/package.py
deleted file mode 100644
index 97c066a5c..000000000
--- a/contrib/glance/muranoartifact/v1/package.py
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright (c) 2015 Mirantis, Inc.
-#
-# 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 glance.common.glare import definitions
-
-
-class MuranoPackage(definitions.ArtifactType):
- __endpoint__ = 'murano'
-
- type = definitions.String(allowed_values=['Application', 'Library'],
- required=True,
- mutable=False)
-
- author = definitions.String(required=False, mutable=False)
- display_name = definitions.String(required=True, mutable=True)
- enabled = definitions.Boolean(default=True)
-
- categories = definitions.Array(default=[], mutable=True)
- class_definitions = definitions.Array(unique=True, default=[],
- mutable=False)
- inherits = definitions.Dict(default={}, properties=definitions.Array(),
- mutable=False)
- keywords = definitions.Array(default=[], mutable=True)
- logo = definitions.BinaryObject()
- archive = definitions.BinaryObject()
- ui_definition = definitions.BinaryObject()
diff --git a/contrib/glance/setup.cfg b/contrib/glance/setup.cfg
deleted file mode 100644
index 3ab134e84..000000000
--- a/contrib/glance/setup.cfg
+++ /dev/null
@@ -1,21 +0,0 @@
-[metadata]
-name = murano_artifact_plugin
-description = An artifact plugin for murano packages
-author = Alexander Tivelkov
-author-email = openstack-discuss@lists.openstack.org
-python-requires = >=3.6
-classifier =
- Development Status :: 3 - Alpha
- License :: OSI Approved :: Apache Software License
- 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
- Intended Audience :: Developers
- Environment :: Console
-
-[entry_points]
-glance.artifacts.types =
- MuranoPackage = muranoartifact:VERSIONS
diff --git a/contrib/glance/setup.py b/contrib/glance/setup.py
deleted file mode 100644
index 2a3ea51e7..000000000
--- a/contrib/glance/setup.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2011-2012 OpenStack Foundation
-# All Rights Reserved.
-#
-# 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
-
-# all other params will be taken from setup.cfg
-setuptools.setup(packages=setuptools.find_packages(),
- setup_requires=['pbr'], pbr=True)
diff --git a/contrib/packages/EncryptionDemo/Classes/EncryptionDemo.yaml b/contrib/packages/EncryptionDemo/Classes/EncryptionDemo.yaml
deleted file mode 100644
index 89e939bd9..000000000
--- a/contrib/packages/EncryptionDemo/Classes/EncryptionDemo.yaml
+++ /dev/null
@@ -1,18 +0,0 @@
-Namespaces:
- =: com.paul
- std: io.murano
- res: io.murano.resources
-
-Name: EncryptionDemo
-
-Extends: std:Application
-
-Properties:
- my_password:
- Contract: $.string()
-
-Methods:
- deploy:
- Body:
- - $reporter: $this.find(std:Environment).reporter
- - $reporter.report($this, decryptData($.my_password))
diff --git a/contrib/packages/EncryptionDemo/UI/ui.yaml b/contrib/packages/EncryptionDemo/UI/ui.yaml
deleted file mode 100644
index 1d296aec2..000000000
--- a/contrib/packages/EncryptionDemo/UI/ui.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-Application:
- ?:
- type: com.paul.EncryptionDemo
- my_password: encryptData($.instanceConfiguration.my_password)
-
-Forms:
- - instanceConfiguration:
- fields:
- - name: my_password
- type: string
diff --git a/contrib/packages/EncryptionDemo/manifest.yaml b/contrib/packages/EncryptionDemo/manifest.yaml
deleted file mode 100644
index 66942dc8d..000000000
--- a/contrib/packages/EncryptionDemo/manifest.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-FullName: com.paul.EncryptionDemo
-Type: Application
-Description: Simple app to demonstrate Murano encryption
-Author: Paul Bourke
-Classes:
- com.paul.EncryptionDemo: EncryptionDemo.yaml
diff --git a/contrib/plugins/cloudify_plugin/LICENSE b/contrib/plugins/cloudify_plugin/LICENSE
deleted file mode 100644
index 67db85882..000000000
--- a/contrib/plugins/cloudify_plugin/LICENSE
+++ /dev/null
@@ -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.
diff --git a/contrib/plugins/cloudify_plugin/README.rst b/contrib/plugins/cloudify_plugin/README.rst
deleted file mode 100644
index f364690c7..000000000
--- a/contrib/plugins/cloudify_plugin/README.rst
+++ /dev/null
@@ -1,49 +0,0 @@
-Murano Plugin for Cloudify
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Cloudify is a TOSCA-based open-source cloud orchestration engine by GigaSpaces
-Technologies.
-
-This plugin extends Murano with support of Cloudify TOSCA package format.
-TOSCA packages can be deployed on Cloudify Manager deployed at configurable
-location.
-
-Plugin registers `Cloudify.TOSCA/1.0` format identifier.
-
-Installation
-------------
-
-Installation of the plugin is done using any of Python package management
-tools. The most simple way is by saying `pip install .` from the plugin's
-directory (or `pip install -e .` for development)
-
-Also location of Cloudify Manager (engine server) must be configured
-in murano config file. This is done in `[cloudify]` section of murano.conf
-via cloudify_manager setting. For example:
-
-.. code-block:: ini
-
- [cloudify]
- cloudify_manager = 10.10.1.10
-
-
-Murano engine must be restarted after installation of the plugin.
-
-
-Requirements
-------------
-
-All Cloudify TOSCA application require `org.getcloudify.murano` library package
-to be present in Murano catalog. The package can be found in
-`cloudify_applications_library` subfolder.
-
-
-Demo application
-----------------
-
-There is a demo application that can be used to test the plugin.
-It is located in `nodecellar_example_application` subfolder. Follow
-instructions at `nodecellar_example_application/README.rst` to build
-the demo package.
-
-
diff --git a/contrib/plugins/cloudify_plugin/cloudify_applications_library/Classes/CloudifyApplication.yaml b/contrib/plugins/cloudify_plugin/cloudify_applications_library/Classes/CloudifyApplication.yaml
deleted file mode 100644
index 629724339..000000000
--- a/contrib/plugins/cloudify_plugin/cloudify_applications_library/Classes/CloudifyApplication.yaml
+++ /dev/null
@@ -1,73 +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.
-
-Namespaces:
- =: org.getcloudify.murano
- std: io.murano
- csys: io.murano.extensions.cloudify
-
-Name: CloudifyApplication
-
-Extends: std:Application
-
-Methods:
- .init:
- Body:
- - $._client: new(csys:CloudifyClient, app => $this)
- - $._environment: $.find(std:Environment).require()
-
- describe:
-
- updateOutputs:
- Arguments:
- - outputs:
- Contract:
- $.string().notNull(): $
-
- deploy:
- Body:
- - If: not $.getAttr(deployed, false)
- Then:
- - $info: $.describe()
- - $._environment.reporter.report($this, 'Checking for TOSCA package')
- - $._client.publishBlueprint($info.entryPoint)
- - $._client.createDeployment($info.inputs)
- - $._environment.reporter.report($this, 'Waiting for deployment initialization')
- - $._client.waitDeploymentReady()
- - $._environment.reporter.report($this, 'Installing {0}'.format(name($this)))
- - $._client.executeWorkflow(install)
- - $outputs: $._client.waitDeploymentReady()
- - For: outputName
- In: $outputs.keys()
- Do:
- - $output: $outputs[$outputName]
- - $._environment.reporter.report($this, $output)
- - $label: $output.get(description, $outputName)
- - $value: $output.value
- - $msg: '{0}: {1}'
- - $._environment.reporter.report($this, $msg.format($label, $value))
- - $.updateOutputs($outputs)
- - $._environment.reporter.report($this, 'Installation complete')
- - $.setAttr(deployed, true)
-
- .destroy:
- Body:
- - If: $.getAttr(deployed, false)
- Then:
- - $info: $.describe()
- - $._client.waitDeploymentReady()
- - $._environment.reporter.report($this, 'Uninstalling {0}'.format(name($this)))
- - $._client.executeWorkflow(uninstall)
- - $._client.waitDeploymentReady()
- - $._client.deleteDeployment()
- - $._environment.reporter.report($this, 'Uninstallation complete')
- - $.setAttr(deployed, false)
diff --git a/contrib/plugins/cloudify_plugin/cloudify_applications_library/manifest.yaml b/contrib/plugins/cloudify_plugin/cloudify_applications_library/manifest.yaml
deleted file mode 100644
index e0dcec634..000000000
--- a/contrib/plugins/cloudify_plugin/cloudify_applications_library/manifest.yaml
+++ /dev/null
@@ -1,32 +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.
-
-Format: MuranoPL/1.2
-
-Type: Library
-FullName: org.getcloudify.murano
-
-Name: Cloudify applications
-
-Description: >
- Cloudify Murano integration support library
-
-Author: Trammell
-
-Tags:
- - Cloudify
-
-Classes:
- org.getcloudify.murano.CloudifyApplication: CloudifyApplication.yaml
-
-Require:
- io.murano.plugins.cloudify: 0
\ No newline at end of file
diff --git a/contrib/plugins/cloudify_plugin/murano_cloudify_plugin/__init__.py b/contrib/plugins/cloudify_plugin/murano_cloudify_plugin/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/contrib/plugins/cloudify_plugin/murano_cloudify_plugin/cfg.py b/contrib/plugins/cloudify_plugin/murano_cloudify_plugin/cfg.py
deleted file mode 100644
index d395263f7..000000000
--- a/contrib/plugins/cloudify_plugin/murano_cloudify_plugin/cfg.py
+++ /dev/null
@@ -1,21 +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 oslo_config import cfg
-
-
-def init_config(conf):
- opts = [
- cfg.StrOpt('cloudify_manager', required=True)
- ]
- conf.register_opts(opts, group='cloudify')
- return conf.cloudify
diff --git a/contrib/plugins/cloudify_plugin/murano_cloudify_plugin/cloudify_client.py b/contrib/plugins/cloudify_plugin/murano_cloudify_plugin/cloudify_client.py
deleted file mode 100644
index f708744ed..000000000
--- a/contrib/plugins/cloudify_plugin/murano_cloudify_plugin/cloudify_client.py
+++ /dev/null
@@ -1,88 +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.
-
-import threading
-import time
-
-import cloudify_rest_client
-import cloudify_rest_client.exceptions as cloudify_exceptions
-from murano.dsl import dsl
-from oslo_config import cfg as config
-from yaql.language import specs
-from yaql.language import yaqltypes
-
-import cfg
-
-
-CONF = config.CONF
-archive_upload_lock = threading.Lock()
-
-
-class CloudifyClient(object):
- @specs.parameter('app', dsl.MuranoObjectParameter('io.murano.Application'))
- def __init__(self, app):
- cloudify_manager = self.CONF.cloudify_manager
- self._client = cloudify_rest_client.CloudifyClient(cloudify_manager)
- self._blueprint_id = '{0}-{1}'.format(app.type.name, app.type.version)
- self._deployment_id = app.id
- self._application_package = app.package
-
- @specs.parameter('entry_point', yaqltypes.String())
- def publish_blueprint(self, entry_point):
- global archive_upload_lock
-
- if self._check_blueprint_exists():
- return
- path = self._application_package.get_resource(entry_point)
- with archive_upload_lock:
- try:
- self._client.blueprints.upload(
- path, self._blueprint_id)
- except cloudify_exceptions.CloudifyClientError as e:
- if e.status_code != 409:
- raise
-
- def _check_blueprint_exists(self):
- try:
- self._client.blueprints.get(self._blueprint_id)
- return True
- except cloudify_exceptions.CloudifyClientError as e:
- if e.status_code == 404:
- return False
- raise
-
- @specs.parameter('parameters', dict)
- def create_deployment(self, parameters=None):
- self._client.deployments.create(
- self._blueprint_id, self._deployment_id, parameters)
-
- def delete_deployment(self):
- self._client.deployments.delete(self._deployment_id)
-
- def wait_deployment_ready(self):
- while True:
- executions = self._client.executions.list(self._deployment_id)
- if any(t.status in ('pending', 'started') for t in executions):
- time.sleep(3)
- else:
- deployment = self._client.deployments.get(self._deployment_id)
- return deployment.outputs
-
- @specs.parameter('name', yaqltypes.String())
- @specs.parameter('parameters', dict)
- def execute_workflow(self, name, parameters=None):
- self._client.executions.start(self._deployment_id, name, parameters)
-
- @classmethod
- def init_plugin(cls):
- cls.CONF = cfg.init_config(CONF)
diff --git a/contrib/plugins/cloudify_plugin/murano_cloudify_plugin/cloudify_tosca_package.py b/contrib/plugins/cloudify_plugin/murano_cloudify_plugin/cloudify_tosca_package.py
deleted file mode 100644
index fe04e8fc8..000000000
--- a/contrib/plugins/cloudify_plugin/murano_cloudify_plugin/cloudify_tosca_package.py
+++ /dev/null
@@ -1,186 +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.
-
-import yaml
-
-from murano.common.helpers import path
-from murano.packages import exceptions
-from murano.packages import package_base
-
-RESOURCES_DIR_NAME = 'Resources/'
-
-
-class YAQL(object):
- def __init__(self, expr):
- self.expr = expr
-
-
-class Dumper(yaml.SafeDumper):
- pass
-
-
-def yaql_representer(dumper, data):
- return dumper.represent_scalar(u'!yaql', data.expr)
-
-
-Dumper.add_representer(YAQL, yaql_representer)
-
-
-class CloudifyToscaPackage(package_base.PackageBase):
- def __init__(self, format_name, runtime_version, source_directory,
- manifest):
- super(CloudifyToscaPackage, self).__init__(
- format_name, runtime_version, source_directory, manifest)
-
- self._entry_point = manifest.get('EntryPoint', 'main.yaml')
- self._generated_class = None
- self._generated_ui = None
-
- @property
- def classes(self):
- return self.full_name,
-
- @property
- def requirements(self):
- return {
- 'org.getcloudify.murano': '0'
- }
-
- @property
- def ui(self):
- if not self._generated_ui:
- self._generated_ui = self._generate_ui()
- return self._generated_ui
-
- def get_class(self, name):
- if name != self.full_name:
- raise exceptions.PackageClassLoadError(
- name, 'Class not defined in this package')
- if not self._generated_class:
- self._generated_class = self._generate_class()
- return self._generated_class, ''
-
- def _generate_class(self):
- inputs, outputs = self._get_inputs_outputs()
- class_code = {
- 'Name': self.full_name,
- 'Extends': 'org.getcloudify.murano.CloudifyApplication',
- 'Properties': self._generate_properties(inputs, outputs),
- 'Methods': {
- 'describe': self._generate_describe_method(inputs),
- 'updateOutputs': self._generate_update_outputs_method(outputs)
- }
- }
- return yaml.dump(class_code, Dumper=Dumper, default_style='"')
-
- @staticmethod
- def _generate_properties(inputs, outputs):
- contracts = {}
- for name, value in inputs.items():
- prop = {
- 'Contract': YAQL('$.string().notNull()'),
- 'Usage': 'In'
- }
- if 'default' in value:
- prop['Default'] = value['default']
- contracts[name] = prop
-
- for name in outputs.keys():
- contracts[name] = {
- 'Contract': YAQL('$.string()'),
- 'Usage': 'Out'
- }
-
- return contracts
-
- def _generate_describe_method(self, inputs):
- input_values = {
- name: YAQL('$.' + name)
- for name in inputs.keys()
- }
-
- return {
- 'Body': [{
- 'Return': {
- 'entryPoint': self._entry_point,
- 'inputs': input_values
- }
- }]
- }
-
- @staticmethod
- def _generate_update_outputs_method(outputs):
- assignments = [
- {YAQL('$.' + name): YAQL('$outputs.get({0})'.format(name))}
- for name in outputs.keys()
- ]
- return {
- 'Arguments': [{
- 'outputs': {
- 'Contract': {
- YAQL('$.string().notNull()'): YAQL('$')
- }
- }
- }],
- 'Body': assignments
- }
-
- def _get_inputs_outputs(self):
- entry_point_path = path.secure_join(
- self.source_directory, RESOURCES_DIR_NAME, self._entry_point)
- with open(entry_point_path) as blueprint:
- data = yaml.safe_load(blueprint)
- return data.get('inputs') or {}, data.get('outputs') or {}
-
- def _generate_application_ui_section(self, inputs, package_name=None,
- package_version=None):
- section = {
- key: YAQL(
- '$.appConfiguration.' + key) for key in inputs.keys()
- }
- section.update({
- '?': {
- 'type': self.full_name
- }
- })
- if package_name:
- section['?']['package'] = package_name
- if package_version:
- section['?']['classVersion'] = package_version
- return section
-
- @staticmethod
- def _generate_form_ui_section(inputs):
- fields = [
- {
- 'name': key,
- 'label': key.title().replace('_', ' '),
- 'type': 'string',
- 'required': True,
- 'description': value.get('description', key)
- } for key, value in inputs.items()
- ]
- return [{
- 'appConfiguration': {
- 'fields': fields
- }
- }]
-
- def _generate_ui(self):
- inputs, outputs = self._get_inputs_outputs()
- ui = {
- 'Version': '2.2',
- 'Application': self._generate_application_ui_section(
- inputs, self.full_name, str(self.version)),
- 'Forms': self._generate_form_ui_section(inputs)
- }
- return yaml.dump(ui, Dumper=Dumper, default_style='"')
diff --git a/contrib/plugins/cloudify_plugin/nodecellar_example_application/LICENSE b/contrib/plugins/cloudify_plugin/nodecellar_example_application/LICENSE
deleted file mode 100644
index 67db85882..000000000
--- a/contrib/plugins/cloudify_plugin/nodecellar_example_application/LICENSE
+++ /dev/null
@@ -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.
diff --git a/contrib/plugins/cloudify_plugin/nodecellar_example_application/README.rst b/contrib/plugins/cloudify_plugin/nodecellar_example_application/README.rst
deleted file mode 100644
index cf5ccd32a..000000000
--- a/contrib/plugins/cloudify_plugin/nodecellar_example_application/README.rst
+++ /dev/null
@@ -1,18 +0,0 @@
-Nodecellar Example Application
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Nodecellar is an example application with a Node front end and Mongo
-database backend.
-
-To test this application with the Murano Cloudify plugin, the following steps need to
-be executed:
-
-`git clone https://github.com/cloudify-cosmo/cloudify-nodecellar-example.git Resources`
-`cd Resources`
-`git checkout tags/3.2.1`
-
-After the above steps are completed, the packages need to be zipped and uploaded to
-the Murano catalog as normally done for Murano applications.
-
-You can follow instructions from `here `_
-to quickly bring up the environment for the application.
diff --git a/contrib/plugins/cloudify_plugin/nodecellar_example_application/logo.png b/contrib/plugins/cloudify_plugin/nodecellar_example_application/logo.png
deleted file mode 100644
index f47201d28..000000000
Binary files a/contrib/plugins/cloudify_plugin/nodecellar_example_application/logo.png and /dev/null differ
diff --git a/contrib/plugins/cloudify_plugin/nodecellar_example_application/manifest.yaml b/contrib/plugins/cloudify_plugin/nodecellar_example_application/manifest.yaml
deleted file mode 100644
index 64181924b..000000000
--- a/contrib/plugins/cloudify_plugin/nodecellar_example_application/manifest.yaml
+++ /dev/null
@@ -1,28 +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.
-
-Format: Cloudify.TOSCA/1.0
-Type: Application
-FullName: org.getcloudify.muranoapps.examples.NodeCellar
-EntryPoint: singlehost-blueprint.yaml
-
-Name: Node Cellar sample app
-Description: >
- A sample application built with Backbone.js, Twitter Bootstrap,
- Node.js, Express, and MongoDB
-
-Author: Trammell
-
-Tags:
- - TOSCA
- - Cloudify
- - Sample
diff --git a/contrib/plugins/cloudify_plugin/requirements.txt b/contrib/plugins/cloudify_plugin/requirements.txt
deleted file mode 100644
index 4f11ddc00..000000000
--- a/contrib/plugins/cloudify_plugin/requirements.txt
+++ /dev/null
@@ -1 +0,0 @@
-cloudify-rest-client>=3.2
diff --git a/contrib/plugins/cloudify_plugin/setup.cfg b/contrib/plugins/cloudify_plugin/setup.cfg
deleted file mode 100644
index e70ecfe85..000000000
--- a/contrib/plugins/cloudify_plugin/setup.cfg
+++ /dev/null
@@ -1,16 +0,0 @@
-[metadata]
-name = io.murano.plugins.cloudify
-description = Murano-Cloudify integration plugin
-summary = Plugin to deploy Tosca packages via Cloudify Manager with Murano
-author = Trammell
-author-email = trammell@gigaspaces.com
-
-[files]
-packages = murano_cloudify_plugin
-
-[entry_points]
-io.murano.plugins.packages =
- Cloudify.TOSCA/1.0 = murano_cloudify_plugin.cloudify_tosca_package:CloudifyToscaPackage
-
-io.murano.extensions =
- cloudify.CloudifyClient = murano_cloudify_plugin.cloudify_client:CloudifyClient
diff --git a/contrib/plugins/cloudify_plugin/setup.py b/contrib/plugins/cloudify_plugin/setup.py
deleted file mode 100644
index 2a3ea51e7..000000000
--- a/contrib/plugins/cloudify_plugin/setup.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2011-2012 OpenStack Foundation
-# All Rights Reserved.
-#
-# 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
-
-# all other params will be taken from setup.cfg
-setuptools.setup(packages=setuptools.find_packages(),
- setup_requires=['pbr'], pbr=True)
diff --git a/contrib/plugins/magnum_plugin/LICENSE b/contrib/plugins/magnum_plugin/LICENSE
deleted file mode 100644
index 67db85882..000000000
--- a/contrib/plugins/magnum_plugin/LICENSE
+++ /dev/null
@@ -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.
diff --git a/contrib/plugins/magnum_plugin/magnum-app/com.intel.magnum.plugin.MagnumApp/Classes/MagnumBayApp.yaml b/contrib/plugins/magnum_plugin/magnum-app/com.intel.magnum.plugin.MagnumApp/Classes/MagnumBayApp.yaml
deleted file mode 100644
index 62a41f9e4..000000000
--- a/contrib/plugins/magnum_plugin/magnum-app/com.intel.magnum.plugin.MagnumApp/Classes/MagnumBayApp.yaml
+++ /dev/null
@@ -1,90 +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.
-
-Namespaces:
- =: com.intel.magnum.plugin
- std: io.murano
-
-Name: MagnumBayApp
-
-Extends: std:Application
-
-Properties:
- name:
- Contract: $.string().notNull()
-
- baymodel:
- Contract: $.class(MagnumBaymodel).notNull()
-
- nodeCount:
- Contract: $.int().check($ > 0)
-
- masterCount:
- Contract: $.int().check($ > 0)
-
- discoveryUrl:
- Contract: $.string()
-
- timeout:
- Contract: $.int().check($ >= 0)
-
-
-Methods:
- .init:
- Body:
- - $._environment: $.find(std:Environment).require()
- - Try:
- - $._magnum: new('io.murano.extensions.mirantis.magnum.Magnum', $._environment)
- Catch:
- With: 'murano.dsl.exceptions.NoPackageForClassFound'
- Do:
- Throw: PluginNotFoundException
- Message: 'Plugin for interaction with Magnum is not installed'
-
- .destroy:
- Body:
- - $bayId: $.getAttr(bayId, null)
- - $._magnum.deleteBay($bayId)
- - $msg: format('Magnum bay {0} is deleted', $.name)
- - $._environment.reporter.report($this, $msg)
- - $.baymodel.delete()
-
- deploy:
- Body:
- - $baymodelId: $.baymodel.create()
- - $msg: format('Creating Magnum bay {0}', $.name)
- - $._environment.reporter.report($this, $msg)
- - $params:
- name: $.name
- baymodel_id: $baymodelId
- node_count: $.nodeCount
- master_count: $.masterCount
- discovery_url: $.discoveryUrl
- bay_create_timeout: $.timeout
- - Try:
- - $bayId: $._magnum.createBay($params)
- Catch:
- - As: e
- Do:
- - $formatString: 'Error: {0}'
- - $._environment.reporter.report_error($, $formatString.format($e.message))
- - Rethrow:
- - $.setAttr(bayId, $bayId)
- - $bayStatus: $._magnum.getBayStatus($bayId)
- - If: $bayStatus = "CREATE_FAILED"
- Then:
- - $msg: 'Magnum bay create failed'
- - $._environment.reporter.report_error($this, $msg)
- - Throw: MagnumBayCreateFailed
- Message: $msg
- - $msg: format('Magnum bay {0} is created', $.name)
- - $._environment.reporter.report($this, $msg)
diff --git a/contrib/plugins/magnum_plugin/magnum-app/com.intel.magnum.plugin.MagnumApp/Classes/MagnumBaymodel.yaml b/contrib/plugins/magnum_plugin/magnum-app/com.intel.magnum.plugin.MagnumApp/Classes/MagnumBaymodel.yaml
deleted file mode 100644
index e9a2dc749..000000000
--- a/contrib/plugins/magnum_plugin/magnum-app/com.intel.magnum.plugin.MagnumApp/Classes/MagnumBaymodel.yaml
+++ /dev/null
@@ -1,131 +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.
-
-Namespaces:
- =: com.intel.magnum.plugin
- std: io.murano
-
-Name: MagnumBaymodel
-
-Properties:
- name:
- Contract: $.string().notNull()
-
- imageId:
- Contract: $.string().notNull()
-
- flavorId:
- Contract: $.string()
-
- masterFlavorId:
- Contract: $.string()
-
- keypairId:
- Contract: $.string().notNull()
-
- externalNetworkId:
- Contract: $.string().notNull()
-
- fixedNetwork:
- Contract: $.string()
-
- coe:
- Contract: $.string().notNull().check($ in list(kubernetes, swarm, mesos))
-
- dnsNameServer:
- Contract: $.string()
-
- dockerVolumeSize:
- Contract: $.string()
-
- labels:
- Contract: $.string()
-
- httpProxy:
- Contract: $.string()
-
- httpsProxy:
- Contract: $.string()
-
- noProxy:
- Contract: $.string()
-
- networkDriver:
- Contract: $.string()
-
- volumeDriver:
- Contract: $.string()
-
- tlsDisabled:
- Contract: $.bool()
-
- public:
- Contract: $.bool()
-
- registryEnabled:
- Contract: $.bool()
-
-Methods:
- .init:
- Body:
- - $._environment: $.find(std:Environment).require()
- - Try:
- - $._magnum: new('io.murano.extensions.mirantis.magnum.Magnum', $._environment)
- Catch:
- With: 'murano.dsl.exceptions.NoPackageForClassFound'
- Do:
- Throw: PluginNotFoundException
- Message: 'Plugin for interaction with Magnum is not installed'
-
- create:
- Body:
- - $msg: format('Creating Magnum baymodel {0}', $.name)
- - $._environment.reporter.report($this, $msg)
- - $params:
- name: $.name
- image_id: $.imageId
- keypair_id: $.keypairId
- external_network_id: $.externalNetworkId
- coe: $.coe
- flavor_id: $.flavorId
- master_flavor_id: $.masterFlavorId
- fixed_network: $.fixedNetwork
- dns_nameserver: $.dnsNameServer
- network_driver: $.networkDriver
- docker_volume_size: $.dockerVolumeSize
- labels: $.labels
- http_proxy: $.httpProxy
- https_proxy: $.httpsProxy
- no_proxy: $.noProxy
- volume_driver: $.volumeDriver
- tls_disabled: $.tlsDisabled
- public: $.public
- registry_enabled: $.registryEnabled
- - Try:
- - $baymodelId: $._magnum.createBaymodel($params)
- Catch:
- - As: e
- Do:
- - $formatString: 'Error: {0}'
- - $._environment.reporter.report_error($, $formatString.format($e.message))
- - Rethrow:
- - $.setAttr(baymodelId, $baymodeId)
- - $msg: format('Magnum baymodel is created {0}', $.name)
- - $._environment.reporter.report($this, $msg)
- - Return: $baymodelId
-
- delete:
- Body:
- - $baymodelId: $.getAttr(baymodelId, null)
- - $._magnum.deleteBaymodel($baymodelId)
- - $msg: format('Magnum baymodel {0} is deleted', $.name)
- - $._environment.reporter.report($this, $msg)
diff --git a/contrib/plugins/magnum_plugin/magnum-app/com.intel.magnum.plugin.MagnumApp/UI/ui.yaml b/contrib/plugins/magnum_plugin/magnum-app/com.intel.magnum.plugin.MagnumApp/UI/ui.yaml
deleted file mode 100644
index 8c0021745..000000000
--- a/contrib/plugins/magnum_plugin/magnum-app/com.intel.magnum.plugin.MagnumApp/UI/ui.yaml
+++ /dev/null
@@ -1,212 +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.
-
-Version: 2
-
-Templates:
- baymodel:
- ?:
- type: com.intel.magnum.plugin.MagnumBaymodel
- name: $.baymodelConfiguration.name
- imageId: $.baymodelConfiguration.imageId
- keypairId: $.baymodelConfiguration.keyPair
- externalNetworkId: $.baymodelConfiguration.externalNetworkId
- coe: $.baymodelConfiguration.coe
- flavorId: $.baymodelConfiguration.flavorId.norm()
- masterFlavorId: $.baymodelConfiguration.masterFlavorId.norm()
- networkDriver: $.baymodelConfiguration.networkDriver.norm()
- fixedNetwork: $.baymodelConfiguration.fixedNetwork.norm()
- dnsNameServer: $.baymodelConfiguration.dnsNameServer.norm()
- dockerVolumeSize: $.baymodelConfiguration.dockerVolumeSize
- labels: $.baymodelConfiguration.labels.norm()
- volumeDriver: $.baymodelConfiguration.volumeDriver.norm()
- httpProxy: $.baymodelConfiguration.httpProxy.norm()
- httpsProxy: $.baymodelConfiguration.httpsProxy.norm()
- noProxy: $.baymodelConfiguration.noProxy.norm()
- tlsDisabled: $.baymodelConfiguration.tlsDisabled
- public: $.baymodelConfiguration.public
- registryEnabled: $.baymodelConfiguration.registryEnabled
-
-Application:
- ?:
- type: com.intel.magnum.plugin.MagnumBayApp
- name: $.appConfiguration.name
- nodeCount: $.appConfiguration.nodeCount
- masterCount: $.appConfiguration.masterCount
- discoveryUrl: $.appConfiguration.discoveryUrl.norm()
- timeout: $.appConfiguration.timeout
- baymodel: $baymodel
-
-Forms:
- - appConfiguration:
- fields:
- - name: name
- type: string
- label: Bay Name
- description: >-
- Enter a desired name for the application. Just A-Z, a-z, 0-9.
- - name: nodeCount
- type: integer
- label: Node Count
- initial: 1
- required: false
- description: >-
- Enter desired no. of node counts. This node count specifies no. of
- minion node created in bay.
- - name: masterCount
- type: integer
- label: Master Node Count
- initial: 1
- required: false
- description: >-
- Enter desired no. of master node counts. This master node count specifies
- no. of master node created in bay.
- - name: discoveryUrl
- type: string
- label: Discovery URL
- required: false
- description: >-
- Specifies custom discovery url for node discovery.
- - name: timeout
- type: integer
- label: Timeout
- initial: 0
- required: false
- description: >-
- The timeout for bay creation in minutes. Set to 0 for no timeout.
- The default is no timeout.
-
- - baymodelConfiguration:
- fields:
- - name: name
- type: string
- label: Baymodel Name
- description: >-
- Enter a desired name for the application. Just A-Z, a-z, 0-9.
- - name: imageId
- type: image
- imageType: linux
- label: Instance Image
- initial: linux
- description: >-
- Select a valid image for the application. Image should already be prepared and
- registered in glance.
- - name: keyPair
- type: keypair
- label: Key Pair
- description: >-
- Select a Key Pair to control access to instances. You can login to
- instances using this KeyPair after the deployment of application.
- - name: externalNetworkId
- type: string
- label: External Network
- description: >-
- Select an External Network to assign IPs to bay nodes.
- - name: coe
- type: string
- label: Container Orchestration Engine
- initial: kubernetes
- description: >-
- Select Container Orchestration Engine type to be created.
- - name: flavorId
- type: flavor
- label: Bay Flavor
- required: false
- description: >-
- Specify the nova flavor id to use when launching the bay.
- - name: masterFlavorId
- type: flavor
- label: Master Flavor
- required: false
- description: >-
- Specify the nova flavor id to use when launching the master node of
- the bay.
- - name: networkDriver
- type: string
- label: Network Driver
- initial: flannel
- required: false
- description: >-
- Specify the network driver name for instantiating container
- networks.
- - name: fixedNetwork
- type: string
- label: Fixed Network
- required: false
- description: >-
- Specify the private Neutron network name to connect to this bay.
- - name: dnsNameServer
- type: string
- label: DNS Name Server
- initial: 8.8.8.8
- required: false
- description: >-
- Specify the DNS nameserver to use for this bay.
- - name: dockerVolumeSize
- type: integer
- label: Docker Volume Size
- required: false
- description: >-
- Specify the number of size in GB for the docker volume to use.
- - name: labels
- type: string
- label: Labels
- required: false
- description: >-
- Arbitrary labels in the form of key=value pairs to associate
- with a bay. Specify in format .
- - name: volumeDriver
- type: string
- label: Volume Driver
- required: false
- description: >-
- Specify the volume driver name for instantiating container
- volume.
- - name: httpProxy
- type: string
- label: HTTP Proxy
- required: false
- description: >-
- Specify the http_proxy address to use for nodes in bay.
- - name: httpsProxy
- type: string
- label: HTTPS Proxy
- required: false
- description: >-
- Specify the https_proxy address to use for nodes in bay.
- - name: noProxy
- type: string
- label: No Proxy
- required: false
- description: >-
- Specify the no_proxy address to use for nodes in bay.
- - name: tlsDisabled
- type: boolean
- label: TLS Disabled
- required: false
- initial: false
- description: >-
- Specify true to disable TLS in the bay.
- - name: public
- type: boolean
- label: Public
- required: false
- initial: false
- description: >-
- Specify true to make bay public.
- - name: registryEnabled
- type: boolean
- label: Registry Enabled
- required: false
- initial: false
- description: >-
- Specify true to enable docker registry in the bay.
diff --git a/contrib/plugins/magnum_plugin/magnum-app/com.intel.magnum.plugin.MagnumApp/logo.png b/contrib/plugins/magnum_plugin/magnum-app/com.intel.magnum.plugin.MagnumApp/logo.png
deleted file mode 100644
index bf09f0df5..000000000
Binary files a/contrib/plugins/magnum_plugin/magnum-app/com.intel.magnum.plugin.MagnumApp/logo.png and /dev/null differ
diff --git a/contrib/plugins/magnum_plugin/magnum-app/com.intel.magnum.plugin.MagnumApp/manifest.yaml b/contrib/plugins/magnum_plugin/magnum-app/com.intel.magnum.plugin.MagnumApp/manifest.yaml
deleted file mode 100644
index 319797a5b..000000000
--- a/contrib/plugins/magnum_plugin/magnum-app/com.intel.magnum.plugin.MagnumApp/manifest.yaml
+++ /dev/null
@@ -1,26 +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.
-
-Format: 1.0
-Type: Application
-FullName: com.intel.magnum.plugin.MagnumBayApp
-Name: Magnum App
-Description: |
- App to deploy Kubernetes cluster using Magnum
-Author: 'Intel, Inc'
-Tags: [Magnum, Kubernetes, Docker]
-Classes:
- com.intel.magnum.plugin.MagnumBaymodel: MagnumBaymodel.yaml
- com.intel.magnum.plugin.MagnumBayApp: MagnumBayApp.yaml
-
-Require:
- murano.plugins.magnum:
diff --git a/contrib/plugins/magnum_plugin/magnum_plugin/__init__.py b/contrib/plugins/magnum_plugin/magnum_plugin/__init__.py
deleted file mode 100644
index 10c76d4c0..000000000
--- a/contrib/plugins/magnum_plugin/magnum_plugin/__init__.py
+++ /dev/null
@@ -1,92 +0,0 @@
-# Copyright (c) 2016 Intel, Inc.
-#
-# 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 cfg
-import time
-
-from magnumclient import client
-from murano.common import auth_utils
-from murano.dsl import session_local_storage
-from oslo_config import cfg as config
-
-from magnumclient import exceptions
-
-CONF = config.CONF
-
-
-class MagnumClient(object):
- def __init__(self, this, region_name=None):
- self._region_name = region_name
- self._owner = this.find_owner('io.murano.Environment')
-
- @property
- def _client(self):
- region = self._region_name or (
- None if self._owner is None else self._owner['region'])
- return self._create_magnum_client(region)
-
- @classmethod
- def init_plugin(cls):
- cls.CONF = cfg.init_config(CONF)
-
- def _wait_on_status(self, bays, bay_id, wait_status, finish_status):
- while True:
- # sleep 1s to wait bay status changes, this will be useful for
- # the first time we wait for the status, to avoid another 30s
- time.sleep(1)
- status = bays.get(bay_id).status
- if status in wait_status:
- time.sleep(30)
- elif status in finish_status:
- break
- else:
- raise RuntimeError("Unexpected Status: {}".format(status))
-
- @staticmethod
- @session_local_storage.execution_session_memoize
- def _create_magnum_client(region):
- session = auth_utils.get_token_client_session(conf=CONF)
- params = auth_utils.get_session_client_parameters(
- service_type='container-infra', region=region, conf=CONF,
- session=session)
- return client.Client(**params)
-
- def create_baymodel(self, args):
- baymodel = self._client.baymodels.create(**args)
- return baymodel.uuid
-
- def delete_baymodel(self, baymodel_id):
- self._client.baymodels.delete(baymodel_id)
-
- def get_bay_status(self, bay_id):
- bays = self._client.bays
- bay = bays.get(bay_id)
- return bay.status
-
- def create_bay(self, args):
- bays = self._client.bays
- bay = bays.create(**args)
- self._wait_on_status(bays, bay.uuid, [None, "CREATE_IN_PROGRESS"],
- ["CREATE_COMPLETE", "CREATE_FAILED"])
- return bay.uuid
-
- def delete_bay(self, bay_id):
- bays = self._client.bays
- bays.delete(bay_id)
- try:
- self._wait_on_status(bays, bay_id, ["CREATE_COMPLETE",
- "DELETE_IN_PROGRESS", "CREATE_FAILED"],
- ["DELETE_COMPLETE"])
- except exceptions.NotFound:
- pass
diff --git a/contrib/plugins/magnum_plugin/magnum_plugin/cfg.py b/contrib/plugins/magnum_plugin/magnum_plugin/cfg.py
deleted file mode 100644
index 1fc711508..000000000
--- a/contrib/plugins/magnum_plugin/magnum_plugin/cfg.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright (c) 2016 Intel, Inc.
-#
-# 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 oslo_config import cfg
-
-
-def init_config(conf):
- opts = [
- cfg.IntOpt('api_version', default=2),
- cfg.StrOpt('endpoint_type', default='publicURL')
- ]
- conf.register_opts(opts, group="magnum")
- return conf.magnum
diff --git a/contrib/plugins/magnum_plugin/requirements.txt b/contrib/plugins/magnum_plugin/requirements.txt
deleted file mode 100644
index 8e337ffa9..000000000
--- a/contrib/plugins/magnum_plugin/requirements.txt
+++ /dev/null
@@ -1 +0,0 @@
-python-magnumclient>=3.0.0 # Apache-2.0
diff --git a/contrib/plugins/magnum_plugin/setup.cfg b/contrib/plugins/magnum_plugin/setup.cfg
deleted file mode 100644
index de478c4dc..000000000
--- a/contrib/plugins/magnum_plugin/setup.cfg
+++ /dev/null
@@ -1,15 +0,0 @@
-[metadata]
-name = murano.plugins.magnum
-description = Plugin to deploy a Magnum Bay to run docker containers on it.
-summary = This plugin uses python-magnumclient to deploy a Magnum Bay. You can
- deploy any of Kubernetes, Swarm and Mesos cluster with it. Just specify
- 'coe' to deploy cluster of your choice and run containers on it.
-author = Madhuri Kumari
-author-email = madhuri.kumari@intel.com
-
-[files]
-packages = magnum_plugin
-
-[entry_points]
-io.murano.extensions =
- mirantis.magnum.Magnum = magnum_plugin:MagnumClient
diff --git a/contrib/plugins/magnum_plugin/setup.py b/contrib/plugins/magnum_plugin/setup.py
deleted file mode 100644
index 25b837ae1..000000000
--- a/contrib/plugins/magnum_plugin/setup.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2016-2017 OpenStack Foundation
-# All Rights Reserved.
-#
-# 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
-
-# all other params will be taken from setup.cfg
-setuptools.setup(packages=setuptools.find_packages(),
- setup_requires=['pbr'], pbr=True)
diff --git a/contrib/plugins/murano_exampleplugin/example-app/io.murano.apps.demo.DemoApp/Classes/DemoApp.yaml b/contrib/plugins/murano_exampleplugin/example-app/io.murano.apps.demo.DemoApp/Classes/DemoApp.yaml
deleted file mode 100644
index 73bb4a664..000000000
--- a/contrib/plugins/murano_exampleplugin/example-app/io.murano.apps.demo.DemoApp/Classes/DemoApp.yaml
+++ /dev/null
@@ -1,40 +0,0 @@
-Namespaces:
- =: io.murano.apps.example.plugin
- std: io.murano
- res: io.murano.resources
- sys: io.murano.system
-
-
-Name: DemoApp
-
-Extends: std:Application
-
-Properties:
- name:
- Contract: $.string().notNull()
-
- instance:
- Contract: $.class(res:Instance).notNull()
-
-Methods:
- initialize:
- Body:
- - $._environment: $.find(std:Environment).require()
-
- deploy:
- Body:
- - If: not $.getAttr(deployed, false)
- Then:
- - $._environment.reporter.report($this, 'Creating VM ')
- - $securityGroupIngress:
- - ToPort: 22
- FromPort: 22
- IpProtocol: tcp
- External: true
- - $._environment.securityGroupManager.addGroupIngress($securityGroupIngress)
- - $.instance.deploy()
- - $resources: new(sys:Resources)
- - $._environment.reporter.report($this, 'Test VM is installed')
- - $.host: $.instance.ipAddresses[0]
- - $.user: 'root'
- - $.setAttr(deployed, true)
diff --git a/contrib/plugins/murano_exampleplugin/example-app/io.murano.apps.demo.DemoApp/Classes/DemoInstance.yaml b/contrib/plugins/murano_exampleplugin/example-app/io.murano.apps.demo.DemoApp/Classes/DemoInstance.yaml
deleted file mode 100644
index a9ad414f1..000000000
--- a/contrib/plugins/murano_exampleplugin/example-app/io.murano.apps.demo.DemoApp/Classes/DemoInstance.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-Namespaces:
- =: io.murano.apps.example.plugin
- res: io.murano.resources
-
-Name: DemoInstance
-
-Extends:
- - res:LinuxMuranoInstance
- - ImageValidatorMixin
-
-Methods:
- deploy:
- Body:
- - $.validateImage()
- - $.super($.deploy())
diff --git a/contrib/plugins/murano_exampleplugin/example-app/io.murano.apps.demo.DemoApp/Classes/ImageValidatorMixin.yaml b/contrib/plugins/murano_exampleplugin/example-app/io.murano.apps.demo.DemoApp/Classes/ImageValidatorMixin.yaml
deleted file mode 100644
index bdd4cbe94..000000000
--- a/contrib/plugins/murano_exampleplugin/example-app/io.murano.apps.demo.DemoApp/Classes/ImageValidatorMixin.yaml
+++ /dev/null
@@ -1,38 +0,0 @@
-Namespaces:
- =: io.murano.apps.example.plugin
- res: io.murano.resources
- std: io.murano
-
-Name: ImageValidatorMixin
-
-Extends:
- - res:Instance
-
-Properties:
- requiredType:
- Contract: $.string().notNull()
-
-Methods:
- validateImage:
- Body:
- - $environment: $.find(std:Environment).require()
- - Try:
- - $glance: new('io.murano.extensions.mirantis.example.Glance', $environment)
- Catch:
- With: 'murano.dsl.exceptions.NoPackageForClassFound'
- Do:
- Throw: PluginNotFoundException
- Message: 'Plugin for interaction with Glance is not installed'
- - $glanceImage: $glance.getById($.image)
- - If: $glanceImage = null
- Then:
- Throw: ImageNotFoundException
- Message: 'Image with specified Id was not found'
- - If: $glanceImage.meta = null
- Then:
- Throw: InvalidImageException
- Message: 'Image does not contain Murano metadata tag'
- - If: $glanceImage.meta.type != $.requiredType
- Then:
- Throw: InvalidImageException
- Message: 'Image has unappropriate Murano type'
diff --git a/contrib/plugins/murano_exampleplugin/example-app/io.murano.apps.demo.DemoApp/UI/ui.yaml b/contrib/plugins/murano_exampleplugin/example-app/io.murano.apps.demo.DemoApp/UI/ui.yaml
deleted file mode 100644
index 36acf6daf..000000000
--- a/contrib/plugins/murano_exampleplugin/example-app/io.murano.apps.demo.DemoApp/UI/ui.yaml
+++ /dev/null
@@ -1,79 +0,0 @@
-Version: 2
-
-Application:
- ?:
- type: io.murano.apps.example.plugin.DemoApp
- name: $.appConfiguration.name
- instance:
- ?:
- type: io.murano.apps.example.plugin.DemoInstance
- name: generateHostname($.instanceConfiguration.unitNamingPattern, 1)
- flavor: $.instanceConfiguration.flavor
- image: $.instanceConfiguration.osImage
- requiredType: $.appConfiguration.requiredType
- assignFloatingIp: $.appConfiguration.assignFloatingIP
- keyname: $.instanceConfiguration.keyPair
-
-Forms:
- - appConfiguration:
- fields:
- - name: name
- type: string
- label: Application Name
- initial: Demo
- description: >-
- Enter a desired name for the application. Just A-Z, a-z, 0-9, dash and
- underline are allowed
- - name: requiredType
- type: string
- label: Required MuranoImage Type
- initial: linux
- description: >-
- Enter a value to be matched against 'type' field of MuranoImage metadata
- - name: assignFloatingIP
- type: boolean
- label: Assign Floating IP
- description: >-
- Select to true to assign floating IP automatically
- initial: false
- required: false
- widgetMedia:
- css: {all: ['muranodashboard/css/checkbox.css']}
- - instanceConfiguration:
- fields:
- - name: title
- type: string
- required: false
- hidden: true
- description: Specify some instance parameters on which the application would be created
- - name: flavor
- type: flavor
- label: Instance flavor
- description: >-
- Select registered in OpenStack flavor. Consider that application performance
- depends on this parameter.
- required: false
- - name: osImage
- type: image
- imageType: linux
- label: Instance image
- description: >-
- Select a valid image for the application. Image should already be prepared and
- registered in glance.
- - name: keyPair
- type: keypair
- label: Key Pair
- description: >-
- Select a Key Pair to control access to instances. You can login to
- instances using this KeyPair after the deployment of application.
- required: false
- - name: availabilityZone
- type: azone
- label: Availability zone
- description: Select availability zone where the application would be installed.
- required: false
- - name: unitNamingPattern
- label: Hostname
- type: string
- required: false
-
diff --git a/contrib/plugins/murano_exampleplugin/example-app/io.murano.apps.demo.DemoApp/logo.png b/contrib/plugins/murano_exampleplugin/example-app/io.murano.apps.demo.DemoApp/logo.png
deleted file mode 100644
index 165bf1eef..000000000
Binary files a/contrib/plugins/murano_exampleplugin/example-app/io.murano.apps.demo.DemoApp/logo.png and /dev/null differ
diff --git a/contrib/plugins/murano_exampleplugin/example-app/io.murano.apps.demo.DemoApp/manifest.yaml b/contrib/plugins/murano_exampleplugin/example-app/io.murano.apps.demo.DemoApp/manifest.yaml
deleted file mode 100644
index 5a42afcf7..000000000
--- a/contrib/plugins/murano_exampleplugin/example-app/io.murano.apps.demo.DemoApp/manifest.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-Format: 1.0
-Type: Application
-FullName: io.murano.apps.example.plugin.DemoApp
-Name: Plugin Demo App
-Description: |
- Demo App to validate Glance Images
-Author: 'Mirantis, Inc'
-Tags: [Demo, Images]
-Classes:
- io.murano.apps.example.plugin.ImageValidatorMixin: ImageValidatorMixin.yaml
- io.murano.apps.example.plugin.DemoInstance: DemoInstance.yaml
- io.murano.apps.example.plugin.DemoApp: DemoApp.yaml
-
-Require:
- murano.plugins.example: 0
\ No newline at end of file
diff --git a/contrib/plugins/murano_exampleplugin/murano_exampleplugin/__init__.py b/contrib/plugins/murano_exampleplugin/murano_exampleplugin/__init__.py
deleted file mode 100644
index c9bae7c03..000000000
--- a/contrib/plugins/murano_exampleplugin/murano_exampleplugin/__init__.py
+++ /dev/null
@@ -1,84 +0,0 @@
-# Copyright (c) 2015 Mirantis, Inc.
-#
-# 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
-
-import cfg
-import glanceclient
-from oslo_config import cfg as config
-from oslo_log import log as logging
-
-from murano.common import auth_utils
-from murano.dsl import session_local_storage
-
-CONF = config.CONF
-LOG = logging.getLogger(__name__)
-
-
-class GlanceClient(object):
- def __init__(self, this):
- self._owner = this.find_owner('io.murano.Environment')
-
- @property
- def _client(self):
- region = None if self._owner is None else self._owner['region']
- return self.create_glance_client(region)
-
- def list(self):
- images = self._client.images.list()
- while True:
- try:
- image = next(images)
- yield GlanceClient._format(image)
- except StopIteration:
- break
-
- def get_by_name(self, name):
- images = list(self._client.images.list(filters={"name": name}))
- if len(images) > 1:
- raise AmbiguousNameException(name)
- elif len(images) == 0:
- return None
- else:
- return GlanceClient._format(images[0])
-
- def get_by_id(self, imageId):
- image = self._client.images.get(imageId)
- return GlanceClient._format(image)
-
- @staticmethod
- def _format(image):
- res = {"id": image.id, "name": image.name}
- if hasattr(image, "murano_image_info"):
- res["meta"] = json.loads(image.murano_image_info)
- return res
-
- @classmethod
- def init_plugin(cls):
- cls.CONF = cfg.init_config(CONF)
-
- @staticmethod
- @session_local_storage.execution_session_memoize
- def create_glance_client(region):
- LOG.debug("Creating a glance client")
- params = auth_utils.get_session_client_parameters(
- service_type='image', conf=CONF, region=region)
- return glanceclient.Client(CONF.images.api_version, **params)
-
-
-class AmbiguousNameException(Exception):
- def __init__(self, name):
- super(AmbiguousNameException, self).__init__("Image name '%s'"
- " is ambiguous" % name)
diff --git a/contrib/plugins/murano_exampleplugin/murano_exampleplugin/cfg.py b/contrib/plugins/murano_exampleplugin/murano_exampleplugin/cfg.py
deleted file mode 100644
index b2b1e016f..000000000
--- a/contrib/plugins/murano_exampleplugin/murano_exampleplugin/cfg.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright (c) 2015 Mirantis, Inc.
-#
-# 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 oslo_config import cfg
-
-
-def init_config(conf):
- opts = [
- cfg.IntOpt('api_version', default=2),
- cfg.StrOpt('endpoint_type', default='publicURL')
- ]
- conf.register_opts(opts, group="images")
- return conf.images
diff --git a/contrib/plugins/murano_exampleplugin/requirements.txt b/contrib/plugins/murano_exampleplugin/requirements.txt
deleted file mode 100644
index 5d421eca4..000000000
--- a/contrib/plugins/murano_exampleplugin/requirements.txt
+++ /dev/null
@@ -1 +0,0 @@
-python-glanceclient>=3.1.0 # Apache-2.0
diff --git a/contrib/plugins/murano_exampleplugin/setup.cfg b/contrib/plugins/murano_exampleplugin/setup.cfg
deleted file mode 100644
index db17cf418..000000000
--- a/contrib/plugins/murano_exampleplugin/setup.cfg
+++ /dev/null
@@ -1,17 +0,0 @@
-[metadata]
-name = murano.plugins.example
-description = Example Plugin to extend collection of MuranoPL system classes
-summary = An example Murano Plugin demonstrating extensibility of MuranoPL
- classes with code written in Python. This particular plugin uses
- python-glanceclient to call OpenStack Images API to list available
- images and return their ids to caller. Anther available method allows
- to get murano-related metadata from image with a given id.
-author = Alexander Tivelkov
-author-email = ativelkov@mirantis.com
-
-[files]
-packages = murano_exampleplugin
-
-[entry_points]
-io.murano.extensions =
- mirantis.example.Glance = murano_exampleplugin:GlanceClient
diff --git a/contrib/plugins/murano_exampleplugin/setup.py b/contrib/plugins/murano_exampleplugin/setup.py
deleted file mode 100644
index 2a3ea51e7..000000000
--- a/contrib/plugins/murano_exampleplugin/setup.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2011-2012 OpenStack Foundation
-# All Rights Reserved.
-#
-# 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
-
-# all other params will be taken from setup.cfg
-setuptools.setup(packages=setuptools.find_packages(),
- setup_requires=['pbr'], pbr=True)
diff --git a/contrib/plugins/murano_heat-translator_plugin/README.rst b/contrib/plugins/murano_heat-translator_plugin/README.rst
deleted file mode 100644
index 3167210b9..000000000
--- a/contrib/plugins/murano_heat-translator_plugin/README.rst
+++ /dev/null
@@ -1,25 +0,0 @@
-=============================
-OASIS TOSCA Plugin for Murano
-=============================
-This is a plugin for Murano to support the OASIS standard for TOSCA. The
-feature currently supported by this plugin is importing Murano application
-definition archives of TOSCA CSARs into Murano application catalog.
-
-
-**********
-How To Use
-**********
-In order to make use of this plugin it has to be installed first, in the same
-Python environment that Murano is running, using the pip command (i.e., run
-*pip install .* from inside the plugin folder). At a minimum, the plugin
-requires version *0.2.0* of the *TOSCA-Parser PyPI package*.
-
-Two sample Murano application definition archives are provided in unzip format:
-
-* hello_world
-* wordpress
-
-In order to import the corresponding archives refer to *README.rst* inside each
-sample folder to generate the archives first. The archives then will be ready
-to be imported into Murano application catalog via Murano command line or
-Murano UI.
diff --git a/contrib/plugins/murano_heat-translator_plugin/plugin/__init__.py b/contrib/plugins/murano_heat-translator_plugin/plugin/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/contrib/plugins/murano_heat-translator_plugin/plugin/cfg.py b/contrib/plugins/murano_heat-translator_plugin/plugin/cfg.py
deleted file mode 100644
index 478af7756..000000000
--- a/contrib/plugins/murano_heat-translator_plugin/plugin/cfg.py
+++ /dev/null
@@ -1,22 +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 oslo_config import cfg
-
-
-def init_config(conf):
- opts = [
- cfg.IntOpt('api_version', default=2),
- cfg.StrOpt('endpoint_type', default='publicURL')
- ]
- conf.register_opts(opts, group="heat_translator")
- return conf.heat_translator
diff --git a/contrib/plugins/murano_heat-translator_plugin/plugin/csar_package.py b/contrib/plugins/murano_heat-translator_plugin/plugin/csar_package.py
deleted file mode 100644
index 6480e0c7e..000000000
--- a/contrib/plugins/murano_heat-translator_plugin/plugin/csar_package.py
+++ /dev/null
@@ -1,535 +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.
-
-import os
-import shutil
-import sys
-import yaml
-import zipfile
-
-from murano.packages import exceptions
-from murano.packages import package_base
-from toscaparser.common import exception as csar_exception
-from toscaparser.prereq import csar
-from toscaparser.tosca_template import ToscaTemplate
-from translator.hot.tosca_translator import TOSCATranslator
-
-CSAR_RESOURCES_DIR_NAME = 'Resources/'
-CSAR_FILES_DIR_NAME = 'CSARFiles/'
-CSAR_ENV_DIR_NAME = 'CSAREnvironments/'
-
-
-class YAQL(object):
- def __init__(self, expr):
- self.expr = expr
-
-
-class Dumper(yaml.SafeDumper):
- pass
-
-
-def yaql_representer(dumper, data):
- return dumper.represent_scalar(u'!yaql', data.expr)
-
-
-Dumper.add_representer(YAQL, yaql_representer)
-
-
-class CSARPackage(package_base.PackageBase):
- def __init__(self, format_name, runtime_version, source_directory,
- manifest):
- super(CSARPackage, self).__init__(
- format_name, runtime_version, source_directory, manifest)
-
- self._translated_class = None
- self._source_directory = source_directory
- self._translated_ui = None
-
- @property
- def classes(self):
- return self.full_name,
-
- @property
- def requirements(self):
- return {}
-
- @property
- def ui(self):
- if not self._translated_ui:
- self._translated_ui = self._translate_ui()
- return self._translated_ui
-
- def get_class(self, name):
- if name != self.full_name:
- raise exceptions.PackageClassLoadError(
- name, 'Class not defined in this package')
- if not self._translated_class:
- self._translate_class()
- return self._translated_class, ''
-
- def _translate_class(self):
- csar_file = os.path.join(self._source_directory, 'csar.zip')
- shutil.copy(csar_file, self.get_resource(self.full_name))
-
- if not os.path.isfile(csar_file):
- raise exceptions.PackageClassLoadError(
- self.full_name, 'File with class definition not found')
-
- csar_obj = csar.CSAR(csar_file)
- try:
- csar_obj.validate()
- except csar_exception.ValidationError as ve:
- raise exceptions.PackageFormatError('Not a CSAR archive: ' +
- str(ve))
-
- translated = {
- 'Name': self.full_name,
- 'Extends': 'io.murano.Application'
- }
-
- csar_envs_path = os.path.join(self._source_directory,
- CSAR_RESOURCES_DIR_NAME,
- CSAR_ENV_DIR_NAME)
-
- validate_csar_parameters = (not os.path.isdir(csar_envs_path) or
- not os.listdir(csar_envs_path))
-
- tosca = csar_obj.get_main_template_yaml()
- parameters = CSARPackage._build_properties(tosca,
- validate_csar_parameters)
- parameters.update(CSARPackage._translate_outputs(tosca))
- translated['Properties'] = parameters
- hot = yaml.load(self._translate('tosca', csar_obj.csar,
- parameters, True))
- files = CSARPackage._translate_files(self._source_directory)
-
- template_file = os.path.join(self._source_directory,
- CSAR_RESOURCES_DIR_NAME, 'template.yaml')
- with open(template_file, 'w') as outfile:
- outfile.write(yaml.safe_dump(hot))
- translated.update(CSARPackage._generate_workflow(hot, files))
- self._translated_class = yaml.dump(translated, Dumper=Dumper,
- default_style='"')
-
- def _translate(self, sourcetype, path, parsed_params, a_file):
- output = None
- if sourcetype == "tosca":
- tosca = ToscaTemplate(path, parsed_params, a_file)
- translator = TOSCATranslator(tosca, parsed_params)
- output = translator.translate()
- return output
-
- @staticmethod
- def _build_properties(csar, csar_parameters):
- result = {
- 'generatedHeatStackName': {
- 'Contract': YAQL('$.string()'),
- 'Usage': 'Out'
- },
- 'hotEnvironment': {
- 'Contract': YAQL('$.string()'),
- 'Usage': 'In'
- }
- }
-
- if csar_parameters:
- params_dict = {}
- for key, value in (csar.get('parameters') or {}).items():
- param_contract = \
- CSARPackage._translate_param_to_contract(value)
- params_dict[key] = param_contract
- result['templateParameters'] = {
- 'Contract': params_dict,
- 'Default': {},
- 'Usage': 'In'
- }
- else:
- result['templateParameters'] = {
- 'Contract': {},
- 'Default': {},
- 'Usage': 'In'
- }
-
- return result
-
- @staticmethod
- def _translate_param_to_contract(value):
- contract = '$'
-
- parameter_type = value['type']
- if parameter_type in ('string', 'comma_delimited_list', 'json'):
- contract += '.string()'
- elif parameter_type == 'integer':
- contract += '.int()'
- elif parameter_type == 'boolean':
- contract += '.bool()'
- else:
- raise ValueError('Unsupported parameter type ' + parameter_type)
-
- constraints = value.get('constraints') or []
- for constraint in constraints:
- translated = CSARPackage._translate_constraint(constraint)
- if translated:
- contract += translated
-
- result = YAQL(contract)
- return result
-
- @staticmethod
- def _translate_outputs(csar):
- result = {}
- for key in (csar.get('outputs') or {}).keys():
- result[key] = {
- "Contract": YAQL("$.string()"),
- "Usage": "Out"
- }
- return result
-
- @staticmethod
- def _translate_files(source_directory):
- source = os.path.join(source_directory, 'csar.zip')
- dest_dir = os.path.join(source_directory, CSAR_RESOURCES_DIR_NAME,
- CSAR_FILES_DIR_NAME)
- with zipfile.ZipFile(source, "r") as z:
- z.extractall(dest_dir)
- csar_files_path = os.path.join(source_directory,
- CSAR_RESOURCES_DIR_NAME,
- CSAR_FILES_DIR_NAME)
- return CSARPackage._build_csar_resources(csar_files_path)
-
- @staticmethod
- def _build_csar_resources(basedir):
- result = []
- if os.path.isdir(basedir):
- for root, _, files in os.walk(os.path.abspath(basedir)):
- for f in files:
- full_path = os.path.join(root, f)
- relative_path = os.path.relpath(full_path, basedir)
- result.append(relative_path)
- return result
-
- @staticmethod
- def _translate_constraint(constraint):
- if 'equal' in constraint:
- return CSARPackage._translate_equal_constraint(
- constraint['equal'])
- elif 'valid_values' in constraint:
- return CSARPackage._translate_valid_values_constraint(
- constraint['valid_values'])
- elif 'length' in constraint:
- return CSARPackage._translate_length_constraint(
- constraint['length'])
- elif 'in_range' in constraint:
- return CSARPackage._translate_range_constraint(
- constraint['in_range'])
- elif 'allowed_pattern' in constraint:
- return CSARPackage._translate_allowed_pattern_constraint(
- constraint['allowed_pattern'])
-
- @staticmethod
- def _translate_equal_constraint(value):
- return ".check($ == {0})".format(value)
-
- @staticmethod
- def _translate_allowed_pattern_constraint(value):
- return ".check(matches($, '{0}'))".format(value)
-
- @staticmethod
- def _translate_valid_values_constraint(values):
- return '.check($ in list({0}))'.format(
- ', '.join([CSARPackage._format_value(v) for v in values]))
-
- @staticmethod
- def _translate_length_constraint(value):
- if 'min' in value and 'max' in value:
- return '.check(len($) >= {0} and len($) <= {1})'.format(
- int(value['min']), int(value['max']))
- elif 'min' in value:
- return '.check(len($) >= {0})'.format(int(value['min']))
- elif 'max' in value:
- return '.check(len($) <= {0})'.format(int(value['max']))
-
- @staticmethod
- def _translate_range_constraint(value):
- if 'min' in value and 'max' in value:
- return '.check($ >= {0} and $ <= {1})'.format(
- int(value['min']), int(value['max']))
- elif 'min' in value:
- return '.check($ >= {0})'.format(int(value['min']))
- elif 'max' in value:
- return '.check($ <= {0})'.format(int(value['max']))
-
- @staticmethod
- def _format_value(value):
- if isinstance(value, str):
- return u"{}".format(value)
- return str(value)
-
- @staticmethod
- def _generate_workflow(csar, files):
- hot_files_map = {}
- for f in files:
- file_path = "$resources.string('{0}{1}')".format(
- CSAR_FILES_DIR_NAME, f)
- hot_files_map['../{0}'.format(f)] = YAQL(file_path)
-
- hot_env = YAQL("$.hotEnvironment")
-
- copy_outputs = []
- for key in (csar.get('outputs') or {}).keys():
- copy_outputs.append({YAQL('$.' + key): YAQL('$outputs.' + key)})
-
- deploy = [
- {YAQL('$environment'): YAQL(
- "$.find('io.murano.Environment').require()"
- )},
- {YAQL('$reporter'): YAQL(
- "new('io.murano.system.StatusReporter', "
- "environment => $environment)")},
- {
- 'If': YAQL('$.getAttr(generatedHeatStackName) = null'),
- 'Then': [
- YAQL("$.setAttr(generatedHeatStackName, "
- "'{0}_{1}'.format(randomName(), id($environment)))")
- ]
- },
- {YAQL('$stack'): YAQL(
- "new('io.murano.system.HeatStack', $environment, "
- "name => $.getAttr(generatedHeatStackName))")},
-
- YAQL("$reporter.report($this, "
- "'Application deployment has started')"),
-
- {YAQL('$resources'): YAQL("new('io.murano.system.Resources')")},
-
- {YAQL('$template'): YAQL("$resources.yaml('template.yaml')")},
- YAQL('$stack.setTemplate($template)'),
- {YAQL('$parameters'): YAQL("$.templateParameters")},
- YAQL('$stack.setParameters($parameters)'),
- {YAQL('$files'): hot_files_map},
- YAQL('$stack.setFiles($files)'),
- {YAQL('$hotEnv'): hot_env},
- {
- 'If': YAQL("bool($hotEnv)"),
- 'Then': [
- {YAQL('$envRelPath'): YAQL("'{0}' + $hotEnv".format(
- CSAR_ENV_DIR_NAME))},
- {YAQL('$hotEnvContent'): YAQL("$resources.string("
- "$envRelPath)")},
- YAQL('$stack.setHotEnvironment($hotEnvContent)')
- ]
- },
-
- YAQL("$reporter.report($this, 'Stack creation has started')"),
- {
- 'Try': [YAQL('$stack.push()')],
- 'Catch': [
- {
- 'As': 'e',
- 'Do': [
- YAQL("$reporter.report_error($this, $e.message)"),
- {'Rethrow': None}
- ]
- }
- ],
- 'Else': [
- {YAQL('$outputs'): YAQL('$stack.output()')},
- {'Do': copy_outputs},
- YAQL("$reporter.report($this, "
- "'Stack was successfully created')"),
-
- YAQL("$reporter.report($this, "
- "'Application deployment has finished')"),
- ]
- }
- ]
-
- destroy = [
- {YAQL('$environment'): YAQL(
- "$.find('io.murano.Environment').require()"
- )},
- {YAQL('$stack'): YAQL(
- "new('io.murano.system.HeatStack', $environment, "
- "name => $.getAttr(generatedHeatStackName))")},
-
- YAQL('$stack.delete()')
- ]
-
- return {
- 'Workflow': {
- 'deploy': {
- 'Body': deploy
- },
- 'destroy': {
- 'Body': destroy
- }
- }
- }
-
- @staticmethod
- def _translate_ui_parameters(tosca, title):
- result_groups = []
-
- used_inputs = set()
- tosca_inputs = tosca.get('topology_template').get('inputs') or {}
- fields = []
- properties = []
- for input in tosca_inputs:
- input_value = tosca_inputs.get(input)
- if input_value:
- fields.append(CSARPackage._translate_ui_parameter(
- input, input_value))
- used_inputs.add(input)
- properties.append(input)
- if fields or properties:
- result_groups.append((fields, properties))
-
- rest_group = []
- properties = []
- for key, value in tosca_inputs.items():
- if key not in used_inputs:
- rest_group.append(CSARPackage._translate_ui_parameter(
- key, value))
- properties.append(key)
- if rest_group:
- result_groups.append((rest_group, properties))
-
- return result_groups
-
- @staticmethod
- def _translate_ui_parameter(name, parameter_spec):
- translated = {
- 'name': name,
- 'label': name.title().replace('_', ' ')
- }
- parameter_type = parameter_spec['type']
- if parameter_type == 'integer':
- translated['type'] = 'integer'
- elif parameter_type == 'boolean':
- translated['type'] = 'boolean'
- else:
- # string, json, and comma_delimited_list parameters are all
- # displayed as strings in UI. Any unsupported parameter would also
- # be displayed as strings.
- translated['type'] = 'string'
-
- label = parameter_spec.get('label')
- if label:
- translated['label'] = label
-
- if 'description' in parameter_spec:
- translated['description'] = parameter_spec['description']
-
- if 'default' in parameter_spec:
- translated['initial'] = parameter_spec['default']
- translated['required'] = False
- else:
- translated['required'] = True
-
- constraints = parameter_spec.get('constraints') or []
- translated_constraints = []
-
- for constraint in constraints:
- if 'length' in constraint:
- spec = constraint['length']
- if 'min' in spec:
- translated['minLength'] = max(
- translated.get('minLength', -sys.maxsize - 1),
- int(spec['min']))
- if 'max' in spec:
- translated['maxLength'] = min(
- translated.get('maxLength', sys.maxsize),
- int(spec['max']))
-
- elif 'range' in constraint:
- spec = constraint['range']
- if 'min' in spec and 'max' in spec:
- ui_constraint = {
- 'expr': YAQL('$ >= {0} and $ <= {1}'.format(
- spec['min'], spec['max']))
- }
- elif 'min' in spec:
- ui_constraint = {
- 'expr': YAQL('$ >= {0}'.format(spec['min']))
- }
- else:
- ui_constraint = {
- 'expr': YAQL('$ <= {0}'.format(spec['max']))
- }
- if 'description' in constraint:
- ui_constraint['message'] = constraint['description']
- translated_constraints.append(ui_constraint)
-
- elif 'valid_values' in constraint:
- values = constraint['valid_values']
- ui_constraint = {
- 'expr': YAQL('$ in list({0})'.format(', '.join(
- [CSARPackage._format_value(v) for v in values])))
- }
- if 'description' in constraint:
- ui_constraint['message'] = constraint['description']
- translated_constraints.append(ui_constraint)
-
- elif 'allowed_pattern' in constraint:
- pattern = constraint['allowed_pattern']
- ui_constraint = {
- 'expr': {
- 'regexpValidator': pattern
- }
- }
- if 'description' in constraint:
- ui_constraint['message'] = constraint['description']
- translated_constraints.append(ui_constraint)
-
- if translated_constraints:
- translated['validators'] = translated_constraints
-
- return translated
-
- @staticmethod
- def _generate_application_ui(groups, type_name, package_name=None,
- package_version=None):
- app = {
- '?': {
- 'type': type_name
- }
- }
- if package_name:
- app['?']['package'] = package_name
- if package_version:
- app['?']['classVersion'] = package_version
-
- for i, record in enumerate(groups):
- section = app.setdefault('templateParameters', {})
-
- for property_name in record[1]:
- section[property_name] = YAQL(
- '$.group{0}.{1}'.format(i, property_name))
-
- return app
-
- def _translate_ui(self):
- tosca = csar.CSAR(os.path.join(self._source_directory, 'csar.zip'))\
- .get_main_template_yaml()
-
- groups = CSARPackage._translate_ui_parameters(tosca, self.description)
- forms = []
- for i, record in enumerate(groups):
- forms.append({'group{0}'.format(i): {'fields': record[0]}})
-
- translated = {
- 'Version': 2.2,
- 'Application': CSARPackage._generate_application_ui(
- groups, self.full_name, self.full_name, str(self.version)),
- 'Forms': forms
- }
- return yaml.dump(translated, Dumper=Dumper, default_style='"')
diff --git a/contrib/plugins/murano_heat-translator_plugin/requirements.txt b/contrib/plugins/murano_heat-translator_plugin/requirements.txt
deleted file mode 100644
index 06c5e4c7f..000000000
--- a/contrib/plugins/murano_heat-translator_plugin/requirements.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-heat-translator>=2.0.0 # Apache-2.0
-tosca-parser>=2.0.0 # Apache-2.0
diff --git a/contrib/plugins/murano_heat-translator_plugin/sample/hello_world/README.rst b/contrib/plugins/murano_heat-translator_plugin/sample/hello_world/README.rst
deleted file mode 100644
index 35cc30256..000000000
--- a/contrib/plugins/murano_heat-translator_plugin/sample/hello_world/README.rst
+++ /dev/null
@@ -1,13 +0,0 @@
-=================================================================
-Build Murano Application Definition Archive from hello_world CSAR
-=================================================================
-In order to build a Murano application definition archive from the hello_world
-CSAR and the corresponding logo and manifest files, from inside the hello_world
-folder run following commands:
-
-1. Download archive from https://github.com/openstack/heat-translator/raw/0.4.0/translator/tests/data/csar_hello_world.zip
-2. Rename it to 'csar.zip'
-3. *zip csar_helloworld_murano_package.zip csar.zip logo.png manifest.yaml*
-
-The resulting file *csar_helloworld_murano_package.zip* is the application
-definition archive that can be imported into the Murano application catalog.
diff --git a/contrib/plugins/murano_heat-translator_plugin/sample/hello_world/logo.png b/contrib/plugins/murano_heat-translator_plugin/sample/hello_world/logo.png
deleted file mode 100644
index 01b230dd5..000000000
Binary files a/contrib/plugins/murano_heat-translator_plugin/sample/hello_world/logo.png and /dev/null differ
diff --git a/contrib/plugins/murano_heat-translator_plugin/sample/hello_world/manifest.yaml b/contrib/plugins/murano_heat-translator_plugin/sample/hello_world/manifest.yaml
deleted file mode 100644
index d946b07fb..000000000
--- a/contrib/plugins/murano_heat-translator_plugin/sample/hello_world/manifest.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-Author: OASIS TOSCA TC
-Description: Template for deploying a single server with predefined properties.
-Format: TOSCA.CSAR/1.1.0
-FullName: io.murano.apps.generated.CsarHelloWorld
-Name: csar_hello_world
-Tags:
-- TOSCA-CSAR-generated
-Template: tosca_helloworld.yaml
-Type: Application
diff --git a/contrib/plugins/murano_heat-translator_plugin/sample/wordpress/README.rst b/contrib/plugins/murano_heat-translator_plugin/sample/wordpress/README.rst
deleted file mode 100644
index c79b4cc1c..000000000
--- a/contrib/plugins/murano_heat-translator_plugin/sample/wordpress/README.rst
+++ /dev/null
@@ -1,13 +0,0 @@
-===============================================================
-Build Murano Application Definition Archive from wordpress CSAR
-===============================================================
-In order to build a Murano application definition archive from the wordpress
-CSAR and the corresponding logo and manifest files, from inside the wordpress
-folder run this command:
-
-1. Download archive from https://github.com/openstack/heat-translator/raw/0.4.0/translator/tests/data/csar_single_instance_wordpress.zip
-2. Rename it to 'csar.zip'
-3. *zip csar_wordpress_murano_package.zip csar.zip logo.png manifest.yaml*
-
-The resulting file *csar_wordpress_murano_package.zip* is the application
-definition archive that can be imported into the Murano application catalog.
diff --git a/contrib/plugins/murano_heat-translator_plugin/sample/wordpress/logo.png b/contrib/plugins/murano_heat-translator_plugin/sample/wordpress/logo.png
deleted file mode 100644
index 01b230dd5..000000000
Binary files a/contrib/plugins/murano_heat-translator_plugin/sample/wordpress/logo.png and /dev/null differ
diff --git a/contrib/plugins/murano_heat-translator_plugin/sample/wordpress/manifest.yaml b/contrib/plugins/murano_heat-translator_plugin/sample/wordpress/manifest.yaml
deleted file mode 100644
index ef942d7a5..000000000
--- a/contrib/plugins/murano_heat-translator_plugin/sample/wordpress/manifest.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-Author: OASIS TOSCA TC
-Description: 'TOSCA simple profile with wordpress, web server and mysql on the same
- server.
-
- '
-Format: TOSCA.CSAR/1.1
-FullName: io.murano.apps.generated.CsarWordpress
-Name: csar_wordpress
-Tags:
-- TOSCA-CSAR-generated
-Template: Definitions/tosca_single_instance_wordpress.yaml
-Type: Application
diff --git a/contrib/plugins/murano_heat-translator_plugin/setup.cfg b/contrib/plugins/murano_heat-translator_plugin/setup.cfg
deleted file mode 100644
index 3f9b6ce52..000000000
--- a/contrib/plugins/murano_heat-translator_plugin/setup.cfg
+++ /dev/null
@@ -1,17 +0,0 @@
-[metadata]
-name = io.murano.plugins.oasis.tosca
-description = Heat-Translator Plugin for Murano
-summary = This plugin enables import and deployment of OASIS TOSCA
- application specifications in Murano. The plugin makes use
- of tosca-parser pypi library for package imports and
- heat-translator pypi library for package deployment.
- Deployment support is not yet added and will come soon.
-author = Vahid Hashemian
-author-email = vahidhashemian@us.ibm.com
-
-[files]
-packages = murano_heat-translator_plugin
-
-[entry_points]
-io.murano.plugins.packages =
- TOSCA.CSAR/1.1.0 = plugin.csar_package:CSARPackage
diff --git a/contrib/plugins/murano_heat-translator_plugin/setup.py b/contrib/plugins/murano_heat-translator_plugin/setup.py
deleted file mode 100644
index 2a3ea51e7..000000000
--- a/contrib/plugins/murano_heat-translator_plugin/setup.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2011-2012 OpenStack Foundation
-# All Rights Reserved.
-#
-# 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
-
-# all other params will be taken from setup.cfg
-setuptools.setup(packages=setuptools.find_packages(),
- setup_requires=['pbr'], pbr=True)
diff --git a/devstack/README.rst b/devstack/README.rst
deleted file mode 100644
index e6c4288f2..000000000
--- a/devstack/README.rst
+++ /dev/null
@@ -1,52 +0,0 @@
-====================
-Enabling in Devstack
-====================
-
-#. Download DevStack_::
-
- git clone https://opendev.org/openstack/devstack
- cd devstack
-
-#. Edit ``local.conf`` to enable murano and heat devstack plugin::
-
- > cat local.conf
- [[local|localrc]]
- enable_plugin murano https://opendev.org/openstack/murano
-
- #Enable heat plugin
- enable_plugin heat https://opendev.org/openstack/heat
-
-#. If you want Murano Cloud Foundry Broker API service enabled, add the
- following line to ``local.conf``::
-
- enable_service murano-cfapi
-
-#. If you want to use Glare Artifact Repository as a storage for packages,
- add the following line to ``local.conf``:
-
- .. code-block:: ini
-
- enable_service g-glare
-
- For more information on how to use Glare Artifact Repository,
- see :ref:`glare_usage`.
-
-#. (Optional) To import Murano packages when DevStack is up, define an ordered
- list of packages FQDNs in ``local.conf``. Make sure to list all package
- dependencies. These packages will by default be imported from the murano-apps
- git repository.
-
- Example::
-
- MURANO_APPS=com.example.apache.Tomcat,org.openstack.Rally
-
- You can also use the variables ``MURANO_APPS_REPO`` and ``MURANO_APPS_BRANCH``
- to configure the git repository which will be used as the source for the
- imported packages.
-
-#. Install DevStack::
-
- ./stack.sh
-
-
-.. _DevStack: https://docs.openstack.org/devstack/latest/
diff --git a/devstack/files/apache-murano-api.template b/devstack/files/apache-murano-api.template
deleted file mode 100644
index 290a7552a..000000000
--- a/devstack/files/apache-murano-api.template
+++ /dev/null
@@ -1,25 +0,0 @@
-Listen %PUBLICPORT%
-
-
- WSGIDaemonProcess murano-api processes=1 threads=10 user=%USER% display-name=%{GROUP} %VIRTUALENV%
- WSGIProcessGroup murano-api
- WSGIScriptAlias / %MURANO_BIN_DIR%/murano-wsgi-api
- WSGIApplicationGroup %{GLOBAL}
- WSGIPassAuthorization On
- AllowEncodedSlashes On
- = 2.4>
- ErrorLogFormat "%{cu}t %M"
-
- ErrorLog /var/log/%APACHE_NAME%/murano_api.log
- CustomLog /var/log/%APACHE_NAME%/murano_api_access.log combined
-
-
- = 2.4>
- Require all granted
-
-
- Order allow,deny
- Allow from all
-
-
-
diff --git a/devstack/files/debs/murano b/devstack/files/debs/murano
deleted file mode 100644
index d0513b233..000000000
--- a/devstack/files/debs/murano
+++ /dev/null
@@ -1 +0,0 @@
-zip
diff --git a/devstack/files/rpms/murano b/devstack/files/rpms/murano
deleted file mode 100644
index d0513b233..000000000
--- a/devstack/files/rpms/murano
+++ /dev/null
@@ -1 +0,0 @@
-zip
diff --git a/devstack/plugin.sh b/devstack/plugin.sh
deleted file mode 100755
index 0e2b08dac..000000000
--- a/devstack/plugin.sh
+++ /dev/null
@@ -1,685 +0,0 @@
-#!/usr/bin/env bash
-# Plugin file for Murano services
-# -------------------------------
-
-# Dependencies:
-# ``functions`` file
-# ``DEST``, ``DATA_DIR``, ``STACK_USER`` must be defined
-
-# Save trace setting
-XTRACE=$(set +o | grep xtrace)
-set -o xtrace
-
-
-# Support entry points installation of console scripts
-if [[ -d $MURANO_DIR/bin ]]; then
- MURANO_BIN_DIR=$MURANO_DIR/bin
-else
- MURANO_BIN_DIR=$(get_python_exec_prefix)
-fi
-
-MURANO_AUTH_CACHE_DIR=${MURANO_AUTH_CACHE_DIR:-/var/cache/murano}
-
-# Toggle for deploying Murano-API under under a wsgi server
-MURANO_USE_UWSGI=${MURANO_USE_UWSGI:-True}
-
-MURANO_UWSGI=$MURANO_BIN_DIR/murano-wsgi-api
-MURANO_UWSGI_CONF=$MURANO_CONF_DIR/murano-api-uwsgi.ini
-
-if [[ "$MURANO_USE_UWSGI" == "True" ]]; then
- MURANO_API_URL="$MURANO_SERVICE_PROTOCOL://$MURANO_SERVICE_HOST/application-catalog"
-else
- MURANO_API_URL="$MURANO_SERVICE_PROTOCOL://$MURANO_SERVICE_HOST:$MURANO_SERVICE_PORT"
-fi
-
-HORIZON_URL="http://${KEYSTONE_SERVICE_HOST}/dashboard"
-
-DASHBOARD_FUNCTIONAL_CONFIG_DIR=$MURANO_DASHBOARD_DIR/muranodashboard/tests/functional/config
-
-# create_murano_accounts() - Set up common required murano accounts
-#
-# Tenant User Roles
-# ------------------------------
-# service murano admin
-function create_murano_accounts() {
- if ! is_service_enabled key; then
- return
- fi
-
- create_service_user "murano" "admin"
-
- get_or_create_service "murano" "application-catalog" "Application Catalog Service"
- get_or_create_endpoint "application-catalog" \
- "$REGION_NAME" \
- "$MURANO_API_URL" \
- "$MURANO_API_URL" \
- "$MURANO_API_URL"
-
- if is_service_enabled murano-cfapi; then
- get_or_create_service "murano-cfapi" "service-broker" "Murano CloudFoundry Service Broker"
- get_or_create_endpoint "service-broker" \
- "$REGION_NAME" \
- "$MURANO_SERVICE_PROTOCOL://$MURANO_SERVICE_HOST:$MURANO_CFAPI_SERVICE_PORT" \
- "$MURANO_SERVICE_PROTOCOL://$MURANO_SERVICE_HOST:$MURANO_CFAPI_SERVICE_PORT" \
- "$MURANO_SERVICE_PROTOCOL://$MURANO_SERVICE_HOST:$MURANO_CFAPI_SERVICE_PORT"
- fi
-}
-
-
-function mkdir_chown_stack {
- if [[ ! -d "$1" ]]; then
- sudo mkdir -p "$1"
- fi
- sudo chown $STACK_USER "$1"
-}
-
-
-function configure_murano_rpc_backend() {
- # Configure the rpc service.
- iniset_rpc_backend muranoapi $MURANO_CONF_FILE DEFAULT
-
- # TODO(ruhe): get rid of this ugly workaround.
- inicomment $MURANO_CONF_FILE DEFAULT rpc_backend
-
- if [[ $SERVICE_IP_VERSION == 6 ]]; then
- iniset $MURANO_CONF_FILE rabbitmq host "$HOST_IPV6"
- else
- iniset $MURANO_CONF_FILE rabbitmq host "$HOST_IP"
- fi
- iniset $MURANO_CONF_FILE rabbitmq login $RABBIT_USERID
- iniset $MURANO_CONF_FILE rabbitmq password $RABBIT_PASSWORD
-
- # Set non-default rabbit virtual host if required.
- if [[ -n "$MURANO_RABBIT_VHOST" ]]; then
- iniset $MURANO_CONF_FILE DEFAULT rabbit_virtual_host $MURANO_RABBIT_VHOST
- iniset $MURANO_CONF_FILE rabbitmq virtual_host $MURANO_RABBIT_VHOST
- fi
-}
-
-function configure_murano_glare_backend() {
- # Configure Murano to use GlARe application storage backend
- iniset $MURANO_CONF_FILE engine packages_service 'glare'
- if is_service_enabled murano-cfapi; then
- iniset $MURANO_CFAPI_CONF_FILE cfapi packages_service 'glare'
- fi
- iniset $MURANO_CONF_FILE glare url $GLANCE_SERVICE_PROTOCOL://$GLANCE_GLARE_HOSTPORT
- iniset $MURANO_CONF_FILE glare endpoint_type $GLARE_ENDPOINT_TYPE
- echo -e $"\nexport MURANO_PACKAGES_SERVICE='glare'" | sudo tee -a $TOP_DIR/openrc
- echo -e $"\nexport GLARE_URL='$GLANCE_SERVICE_PROTOCOL://$GLANCE_GLARE_HOSTPORT'" | sudo tee -a $TOP_DIR/openrc
-}
-
-function restart_glare_service() {
- # Restart GlARe service to apply Murano artifact plugin
- if is_running glance-glare; then
- echo_summary "Restarting GlARe to apply config changes"
- stop_process g-glare
- run_process g-glare "$GLANCE_BIN_DIR/glance-glare --config-file=$GLANCE_CONF_DIR/glance-glare.conf"
- echo "Waiting for GlARe [g-glare] ($GLANCE_GLARE_HOSTPORT) to start..."
- if ! wait_for_service $SERVICE_TIMEOUT $GLANCE_SERVICE_PROTOCOL://$GLANCE_GLARE_HOSTPORT; then
- die $LINENO " GlARe [g-glare] did not start"
- fi
- else
- echo_summary "GlARe service wasn't started yet. It will start in usual way."
- fi
-}
-
-function install_murano_artifact_plugin() {
- # Provide support of Murano artifacts type to GlARe
- setup_package $MURANO_DIR/contrib/glance -e
-}
-
-function is_murano_backend_glare() {
- is_service_enabled g-glare && [[ "$MURANO_USE_GLARE" == "True" ]] && return 0
- return 1
-}
-
-function configure_murano_networking {
- # Use keyword 'public' if Murano external network was not set.
- # If it was set but the network is not exist then
- # first available external network will be selected.
- local ext_net=${MURANO_EXTERNAL_NETWORK:-'public'}
- local ext_net_id=$(openstack --os-cloud=devstack-admin \
- --os-region-name="$REGION_NAME" network list \
- --external | grep " $ext_net " | get_field 1)
-
- # Try to select first available external network if ext_net_id is null
- if [[ ! -n "$ext_net_id" ]]; then
- ext_net_id=$(openstack --os-cloud=devstack-admin \
- --os-region-name="$REGION_NAME" network list \
- --external -f csv -c ID | tail -n +2 | tail -n 1)
- fi
-
- # Configure networking options for Murano
- if [[ -n "$ext_net" ]] && [[ -n "$ext_net_id" ]]; then
- iniset $MURANO_CONF_FILE networking external_network $ext_net_id
- iniset $MURANO_CONF_FILE networking create_router 'true'
- else
- iniset $MURANO_CONF_FILE networking create_router 'false'
- fi
-
- if [[ -n "$MURANO_DEFAULT_ROUTER" ]]; then
- iniset $MURANO_CONF_FILE networking router_name $MURANO_DEFAULT_ROUTER
- fi
-
- if [[ -n "$MURANO_DEFAULT_DNS" ]]; then
- iniset $MURANO_CONF_FILE networking default_dns $MURANO_DEFAULT_DNS
- fi
-}
-
-# Entry points
-# ------------
-
-# configure_murano() - Set config files, create data dirs, etc
-function configure_murano {
- mkdir_chown_stack "$MURANO_CONF_DIR"
-
- # Generate Murano configuration file and configure common parameters.
- oslo-config-generator --config-file $MURANO_DIR/etc/oslo-config-generator/murano.conf --output-file $MURANO_CONF_FILE
-
- cp $MURANO_DIR/etc/murano/murano-paste.ini $MURANO_CONF_DIR
-
- cleanup_murano
-
- iniset $MURANO_CONF_FILE DEFAULT debug $MURANO_DEBUG
- iniset $MURANO_CONF_FILE DEFAULT use_syslog $SYSLOG
- # Format logging
- if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ] && [ "$MURANO_USE_UWSGI" == "False" ] ; then
- setup_colorized_logging $MURANO_CONF_FILE DEFAULT
- else
- # Show user_name and project_name instead of user_id and project_id
- iniset $MURANO_CONF_FILE DEFAULT logging_context_format_string "%(asctime)s.%(msecs)03d %(levelname)s %(name)s [%(request_id)s %(user_name)s %(project_name)s] %(instance)s%(message)s"
- fi
-
- iniset $MURANO_CONF_FILE DEFAULT home_region $REGION_NAME
-
- # Murano Policy Enforcement Configuration
- if [[ "$MURANO_ENABLE_MODEL_POLICY_ENFORCEMENT" == "True" ]]; then
- iniset $MURANO_CONF_FILE engine enable_model_policy_enforcer $MURANO_ENABLE_MODEL_POLICY_ENFORCEMENT
- fi
-
- # Murano Api Configuration
- #-------------------------
-
- # Setup keystone_authtoken section
- configure_auth_token_middleware $MURANO_CONF_FILE $MURANO_ADMIN_USER $MURANO_AUTH_CACHE_DIR
-
- # Setup murano_auth section
- configure_auth_token_middleware $MURANO_CONF_FILE $MURANO_ADMIN_USER $MURANO_AUTH_CACHE_DIR murano_auth
- iniset $MURANO_CONF_FILE murano_auth www_authenticate_uri $KEYSTONE_AUTH_URI
-
- configure_murano_rpc_backend
-
- # Configure notifications for status information during provisioning
- iniset $MURANO_CONF_FILE oslo_messaging_notifications driver messagingv2
-
- # configure the database.
- iniset $MURANO_CONF_FILE database connection `database_connection_url murano`
-
- # Configure keystone auth url
- iniset $MURANO_CONF_FILE keystone auth_url $KEYSTONE_SERVICE_URI
-
- # Configure Murano API URL
- iniset $MURANO_CONF_FILE murano url "$MURANO_API_URL"
-
- # Configure the number of api workers
- if [[ -n "$MURANO_API_WORKERS" ]]; then
- iniset $MURANO_CONF_FILE murano api_workers $MURANO_API_WORKERS
- fi
-
- # Configure the number of engine workers
- if [[ -n "$MURANO_ENGINE_WORKERS" ]]; then
- iniset $MURANO_CONF_FILE engine engine_workers $MURANO_ENGINE_WORKERS
- fi
- if is_murano_backend_glare; then
- configure_murano_glare_backend
- fi
-
- if [ "$MURANO_USE_UWSGI" == "True" ]; then
- write_uwsgi_config "$MURANO_UWSGI_CONF" "$MURANO_UWSGI" "/application-catalog"
- fi
-
-}
-
-# set the murano packages service backend
-function set_packages_service_backend() {
- if is_murano_backend_glare; then
- MURANO_PACKAGES_SERVICE='glare'
- else
- MURANO_PACKAGES_SERVICE='murano'
- fi
-}
-
-# configure_murano_cfapi() - Set config files
-function configure_murano_cfapi {
-
- # Generate Murano configuration file and configure common parameters.
- oslo-config-generator --config-file $MURANO_DIR/etc/oslo-config-generator/murano-cfapi.conf --output-file $MURANO_CFAPI_CONF_FILE
-
- cp $MURANO_DIR/etc/murano/murano-cfapi-paste.ini $MURANO_CONF_DIR
-
- configure_service_broker
-
-}
-
-# install_murano_apps() - Install Murano apps from repository murano-apps, if required
-function install_murano_apps() {
- if [[ -z $MURANO_APPS ]]; then
- return
- fi
-
- # clone murano-apps only if app installation is required
- git_clone $MURANO_APPS_REPO $MURANO_APPS_DIR $MURANO_APPS_BRANCH
-
- set_packages_service_backend
-
- # install Murano apps defined in the comma-separated list $MURANO_APPS
- for murano_app in ${MURANO_APPS//,/ }; do
- find $MURANO_APPS_DIR -type d -name "package" | while read package; do
- full_name=$(grep "FullName" "$package/manifest.yaml" | awk -F ':' '{print $2}' | tr -d ' ')
- if [[ $full_name = $murano_app ]]; then
- pushd $package
- zip -r app.zip .
- murano --os-username $OS_USERNAME \
- --os-password $OS_PASSWORD \
- --os-tenant-name $OS_PROJECT_NAME \
- --os-auth-url $KEYSTONE_SERVICE_URI \
- --murano-url $MURANO_API_URL \
- --glare-url $GLANCE_SERVICE_PROTOCOL://$GLANCE_GLARE_HOSTPORT \
- --murano-packages-service $MURANO_PACKAGES_SERVICE \
- package-import \
- --is-public \
- --exists-action u \
- app.zip
- popd
- fi
- done
- done
-}
-
-
-# configure_service_broker() - set service broker specific options to config
-function configure_service_broker {
-
- iniset $MURANO_CFAPI_CONF_FILE DEFAULT debug $MURANO_DEBUG
- iniset $MURANO_CFAPI_CONF_FILE DEFAULT use_syslog $SYSLOG
-
- #Add needed options to murano-cfapi.conf
- iniset $MURANO_CFAPI_CONF_FILE cfapi tenant "$MURANO_CFAPI_DEFAULT_TENANT"
- iniset $MURANO_CFAPI_CONF_FILE cfapi bind_host "$MURANO_SERVICE_HOST"
- iniset $MURANO_CFAPI_CONF_FILE cfapi bind_port "$MURANO_CFAPI_SERVICE_PORT"
- iniset $MURANO_CFAPI_CONF_FILE cfapi auth_url "$KEYSTONE_SERVICE_URI"
-
- # configure the database.
- iniset $MURANO_CFAPI_CONF_FILE database connection `database_connection_url murano_cfapi`
-
- # Setup keystone_authtoken section
- configure_auth_token_middleware $MURANO_CFAPI_CONF_FILE $MURANO_ADMIN_USER $MURANO_AUTH_CACHE_DIR
-
-}
-
-function prepare_core_apps() {
- cd $MURANO_DIR/meta
- for i in */
- do pushd ./"$i"
- zip -r ../"${i%/}.zip" *
- popd
- done
-}
-
-function remove_core_apps_zip() {
- rm -f $MURANO_DIR/meta/*.zip
-}
-
-# init_murano() - Initialize databases, etc.
-function init_murano() {
- configure_murano_networking
-
- # (re)create Murano database
- recreate_database murano utf8
-
- $MURANO_BIN_DIR/murano-db-manage --config-file $MURANO_CONF_FILE upgrade
-
- create_murano_cache_dir
-
-}
-
-# create_murano_cache_dir() - Part of the init_murano() process
-function create_murano_cache_dir {
- # Create cache dirs
- sudo install -d -o $STACK_USER $MURANO_AUTH_CACHE_DIR
-}
-
-
-# init_murano_cfapi() - Initialize databases, etc.
-function init_murano_cfapi() {
-
- # (re)create Murano database
- recreate_database murano_cfapi utf8
-
- $MURANO_BIN_DIR/murano-cfapi-db-manage --config-file $MURANO_CFAPI_CONF_FILE upgrade
-}
-
-function setup_core_library() {
- prepare_core_apps
-
- set_packages_service_backend
-
- murano --os-username admin \
- --os-password $ADMIN_PASSWORD \
- --os-tenant-name admin \
- --os-auth-url $KEYSTONE_SERVICE_URI \
- --os-region-name $REGION_NAME \
- --murano-url $MURANO_API_URL \
- --glare-url $GLANCE_SERVICE_PROTOCOL://$GLANCE_GLARE_HOSTPORT \
- --murano-packages-service $MURANO_PACKAGES_SERVICE \
- package-import $MURANO_DIR/meta/*.zip \
- --is-public
-
- remove_core_apps_zip
-}
-
-# install_murano() - Collect source and prepare
-function install_murano() {
- install_murano_pythonclient
-
- git_clone $MURANO_REPO $MURANO_DIR $MURANO_BRANCH
-
- setup_develop $MURANO_DIR
-
- if is_murano_backend_glare; then
- install_murano_artifact_plugin
- fi
-
-}
-
-function install_murano_pythonclient() {
-# For using non-released client from git branch, need to add
-# LIBS_FROM_GIT=python-muranoclient parameter to localrc.
-# Otherwise, murano will install python-muranoclient from requirements.
- if use_library_from_git "python-muranoclient"; then
- git_clone_by_name "python-muranoclient"
- setup_dev_lib "python-muranoclient"
- # Installing bash_completion for murano
- sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-muranoclient"]}/tools/,/etc/bash_completion.d/}murano.bash_completion
- fi
-}
-
-
-# start_murano() - Start running processes, including screen
-function start_murano() {
- if [ "$MURANO_USE_UWSGI" == "True" ]; then
- run_process murano-api "$(which uwsgi) --procname-prefix murano-api --ini $MURANO_UWSGI_CONF"
- else
- run_process murano-api "$MURANO_BIN_DIR/murano-api --config-file $MURANO_CONF_DIR/murano.conf"
- fi
- run_process murano-engine "$MURANO_BIN_DIR/murano-engine --config-file $MURANO_CONF_DIR/murano.conf"
-}
-
-
-# stop_murano() - Stop running processes
-function stop_murano() {
- # Kill the Murano screen windows
- if [ "$MURANO_USE_UWSGI" == "True" ]; then
- disable_apache_site murano-api
- restart_apache_server
- fi
- stop_process murano-api
- stop_process murano-engine
-}
-
-
-# start_service_broker() - start murano CF service broker
-function start_service_broker() {
- run_process murano-cfapi "$MURANO_BIN_DIR/murano-cfapi --config-file $MURANO_CONF_DIR/murano-cfapi.conf"
-}
-
-
-# stop_service_broker() - stop murano CF service broker
-function stop_service_broker() {
- # Kill the Murano screen windows
- stop_process murano-cfapi
-}
-
-
-function cleanup_murano() {
-
- # Cleanup keystone signing dir
- sudo rm -rf $MURANO_KEYSTONE_SIGNING_DIR
-
- if [[ "$MURANO_USE_UWSGI" == "True" ]]; then
- remove_uwsgi_config "$MURANO_UWSGI_CONF" "$MURANO_UWSGI"
- fi
-
-}
-
-function configure_murano_tempest_plugin() {
-
- # Check tempest for enabling
- if is_service_enabled tempest; then
- echo_summary "Configuring Murano Tempest plugin"
- # Set murano service availability flag
- iniset $TEMPEST_CONFIG service_available murano "True"
- if is_service_enabled murano-cfapi; then
- # Enable Service Broker tests if cfapi enabled and set murano-cfapi service availability flag
- iniset $TEMPEST_CONFIG service_available murano_cfapi "True"
- iniset $TEMPEST_CONFIG service_broker run_service_broker_tests "True"
- fi
- if is_service_enabled g-glare; then
- # TODO(freerunner): This is bad way to configure tempest to
- # TODO see glare as enabled. We need to move it out to tempest
- # TODO of glance repo when glare become official OS API.
- iniset $TEMPEST_CONFIG service_available glare "True"
- fi
- if is_murano_backend_glare; then
- iniset $TEMPEST_CONFIG application_catalog glare_backend "True"
- fi
- if [[ "$TEMPEST_MURANO_SCENARIO_TESTS_ENABLED" == "True" ]]; then
- if is_service_enabled cinder; then
- iniset $TEMPEST_CONFIG application_catalog cinder_volume_tests "True"
- fi
- if [[ "$TEMPEST_MURANO_DEPLOYMENT_TESTS_ENABLED" == "True" ]]; then
- iniset $TEMPEST_CONFIG application_catalog deployment_tests "True"
- iniset $TEMPEST_CONFIG application_catalog linux_image "$CLOUD_IMAGE_NAME"
- fi
- fi
- fi
-}
-
-#### lib/murano-dashboard
-
-# Dependencies:
-#
-# - ``functions`` file
-# - ``DEST``, ``DATA_DIR``, ``STACK_USER`` must be defined
-# - ``SERVICE_HOST``
-
-# ``stack.sh`` calls the entry points in this order:
-#
-# - install_murano_dashboard
-# - configure_murano_dashboard
-# - cleanup_murano_dashboard
-
-. $TOP_DIR/lib/horizon
-
-# Defaults
-# --------
-
-HORIZON_CONFIG=${HORIZON_CONFIG:-$HORIZON_DIR/openstack_dashboard/settings.py}
-HORIZON_LOCAL_CONFIG=${HORIZON_LOCAL_CONFIG:-$HORIZON_DIR/openstack_dashboard/local/local_settings.py}
-
-# Set up default repos
-MURANO_DASHBOARD_REPO=${MURANO_DASHBOARD_REPO:-${GIT_BASE}/openstack/murano-dashboard.git}
-MURANO_DASHBOARD_BRANCH=${MURANO_DASHBOARD_BRANCH:-master}
-
-# Set up default directories
-MURANO_DASHBOARD_DIR=$DEST/murano-dashboard
-MURANO_PYTHONCLIENT_DIR=$DEST/python-muranoclient
-
-MURANO_DASHBOARD_CACHE_DIR=${MURANO_DASHBOARD_CACHE_DIR:-/tmp/murano}
-
-MURANO_REPOSITORY_URL=${MURANO_REPOSITORY_URL:-'http://apps.openstack.org/api/v1/murano_repo/liberty/'}
-
-# Entry points
-# ------------
-
-# configure_murano_dashboard() - Set config files, create data dirs, etc
-function configure_murano_dashboard() {
- configure_local_settings_py
-
- configure_dashboard_functional_config
-
- restart_apache_server
-}
-
-
-function configure_dashboard_functional_config() {
- cp $DASHBOARD_FUNCTIONAL_CONFIG_DIR/config.conf.sample $DASHBOARD_FUNCTIONAL_CONFIG_DIR/config.conf
- sed -e "s%\(^\s*horizon_url\s*=\).*$%\1 $HORIZON_URL%" -i "$DASHBOARD_FUNCTIONAL_CONFIG_DIR/config.conf"
- sed -e "s%\(^\s*murano_url\s*=\).*$%\1 $MURANO_API_URL%" -i "$DASHBOARD_FUNCTIONAL_CONFIG_DIR/config.conf"
- sed -e "s/\(^\s*user\s*=\).*$/\1 $OS_USERNAME/" -i "$DASHBOARD_FUNCTIONAL_CONFIG_DIR/config.conf"
- sed -e "s/\(^\s*password\s*=\).*$/\1 $OS_PASSWORD/" -i "$DASHBOARD_FUNCTIONAL_CONFIG_DIR/config.conf"
- sed -e "s/\(^\s*tenant\s*=\).*$/\1 $OS_PROJECT_NAME/" -i "$DASHBOARD_FUNCTIONAL_CONFIG_DIR/config.conf"
- sed -e "s%\(^\s*keystone_url\s*=\).*$%\1 $KEYSTONE_SERVICE_URI/v3%" -i "$DASHBOARD_FUNCTIONAL_CONFIG_DIR/config.conf"
-
- echo_summary "Show the DASHBOARD_FUNCTIONAL_CONFIG"
- cat $DASHBOARD_FUNCTIONAL_CONFIG_DIR/config.conf
-}
-
-
-function configure_local_settings_py() {
- local horizon_config_part=$(mktemp)
-
- mkdir_chown_stack "$MURANO_DASHBOARD_CACHE_DIR"
-
- if is_murano_backend_glare; then
- # Make Murano use GlARe only if MURANO_USE_GLARE set to True and GlARe
- # service is enabled
- local murano_use_glare=True
- else
- local murano_use_glare=False
- fi
-
- if [[ -f "$HORIZON_LOCAL_CONFIG" ]]; then
- sed -e "s/\(^\s*OPENSTACK_HOST\s*=\).*$/\1 '$HOST_IP'/" -i "$HORIZON_LOCAL_CONFIG"
- fi
-
- # Install Murano as plugin for Horizon
- ln -sf $MURANO_DASHBOARD_DIR/muranodashboard/local/enabled/*.py $HORIZON_DIR/openstack_dashboard/local/enabled/
-
- # Install setting to Horizon
- ln -sf $MURANO_DASHBOARD_DIR/muranodashboard/local/local_settings.d/*.py $HORIZON_DIR/openstack_dashboard/local/local_settings.d/
-
- # Install murano RBAC policy to Horizon
- ln -sf $MURANO_DASHBOARD_DIR/muranodashboard/conf/murano_policy.json $HORIZON_DIR/openstack_dashboard/conf/
-
- # Change Murano dashboard settings
- sed -e "s/\(^\s*MURANO_USE_GLARE\s*=\).*$/\1 $murano_use_glare/" -i $HORIZON_DIR/openstack_dashboard/local/local_settings.d/_50_murano.py
- sed -e "s%\(^\s*MURANO_REPO_URL\s*=\).*$%\1 '$MURANO_REPOSITORY_URL'%" -i $HORIZON_DIR/openstack_dashboard/local/local_settings.d/_50_murano.py
- sed -e "s%\(^\s*'NAME':\).*$%\1 os.path.join('$MURANO_DASHBOARD_DIR', 'openstack-dashboard.sqlite')%" -i $HORIZON_DIR/openstack_dashboard/local/local_settings.d/_50_murano.py
- echo -e $"\nMETADATA_CACHE_DIR = '$MURANO_DASHBOARD_CACHE_DIR'" | sudo tee -a $HORIZON_DIR/openstack_dashboard/local/local_settings.d/_50_murano.py
-
-}
-
-# init_murano_dashboard() - Initialize databases, etc.
-function init_murano_dashboard() {
- # clean up from previous (possibly aborted) runs
- # create required data files
-
- local horizon_manage_py="$HORIZON_DIR/manage.py"
-
- $PYTHON "$horizon_manage_py" collectstatic --noinput
- $PYTHON "$horizon_manage_py" compress --force
- $PYTHON "$horizon_manage_py" migrate --noinput
-
- # Compile message for murano-dashboard
- cd $MURANO_DASHBOARD_DIR/muranodashboard
- $PYTHON "$horizon_manage_py" compilemessages
-
- restart_apache_server
-}
-
-
-# install_murano_dashboard() - Collect source and prepare
-function install_murano_dashboard() {
- echo_summary "Install Murano Dashboard"
-
- git_clone $MURANO_DASHBOARD_REPO $MURANO_DASHBOARD_DIR $MURANO_DASHBOARD_BRANCH
-
- setup_develop $MURANO_DASHBOARD_DIR
-}
-
-
-# cleanup_murano_dashboard() - Remove residual data files, anything left over from previous
-# runs that a clean run would need to clean up
-function cleanup_murano_dashboard() {
- echo_summary "Cleanup Murano Dashboard"
-
- # remove all the pannels we've installed, also any pyc/pyo files
- for i in $(find $MURANO_DASHBOARD_DIR/muranodashboard/local/enabled -iname '_[0-9]*.py' -printf '%f\n'); do
- rm -rf $HORIZON_DIR/openstack_dashboard/local/enabled/${i%.*}.*
- done
-
- rm $HORIZON_DIR/openstack_dashboard/local/local_settings.d/_50_murano.*
-
- rm $HORIZON_DIR/openstack_dashboard/conf/murano_policy.json
-}
-
-# Main dispatcher
-
-if is_service_enabled murano; then
- if [[ "$1" == "stack" && "$2" == "install" ]]; then
- echo_summary "Installing Murano"
- install_murano
- if is_service_enabled horizon; then
- install_murano_dashboard
- fi
- elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
- echo_summary "Configuring Murano"
- configure_murano
- create_murano_accounts
- if is_service_enabled horizon; then
- configure_murano_dashboard
- fi
- if is_service_enabled murano-cfapi; then
- configure_murano_cfapi
- fi
- elif [[ "$1" == "stack" && "$2" == "extra" ]]; then
- echo_summary "Initializing Murano"
- init_murano
- if is_service_enabled horizon; then
- init_murano_dashboard
- fi
- start_murano
- if is_murano_backend_glare; then
- restart_glare_service
- fi
- if is_service_enabled murano-cfapi; then
- init_murano_cfapi
- start_service_broker
- fi
-
- # Give Murano some time to Start
- sleep 3
-
- setup_core_library
-
- # Install Murano apps, if needed
- install_murano_apps
- elif [[ "$1" == "stack" && "$2" == "test-config" ]]; then
- configure_murano_tempest_plugin
- fi
-
- if [[ "$1" == "unstack" ]]; then
- stop_murano
- if is_service_enabled murano-cfapi; then
- stop_service_broker
- fi
- cleanup_murano
- if is_service_enabled horizon; then
- cleanup_murano_dashboard
- fi
- fi
-fi
-
-# Restore xtrace
-$XTRACE
diff --git a/devstack/settings b/devstack/settings
deleted file mode 100644
index 565b21844..000000000
--- a/devstack/settings
+++ /dev/null
@@ -1,76 +0,0 @@
-# Settings needed for the Murano plugin
-# -------------------------------------
-
-# Set up default repos
-MURANO_REPO=${MURANO_REPO:-${GIT_BASE}/openstack/murano.git}
-MURANO_BRANCH=${MURANO_BRANCH:-master}
-
-# Variables, which used in this function
-# https://github.com/openstack-dev/devstack/blob/master/functions-common#L500-L506
-GITREPO["python-muranoclient"]=${MURANO_PYTHONCLIENT_REPO:-${GIT_BASE}/openstack/python-muranoclient.git}
-GITBRANCH["python-muranoclient"]=${MURANO_PYTHONCLIENT_BRANCH:-master}
-GITDIR["python-muranoclient"]=$DEST/python-muranoclient
-
-# Set up default directories
-MURANO_DIR=$DEST/murano
-MURANO_FILES_DIR=$MURANO_DIR/devstack/files
-MURANO_CONF_DIR=${MURANO_CONF_DIR:-/etc/murano}
-MURANO_CONF_FILE=${MURANO_CONF_DIR}/murano.conf
-MURANO_CFAPI_CONF_FILE=${MURANO_CONF_DIR}/murano-cfapi.conf
-MURANO_DEBUG=$(trueorfalse True MURANO_DEBUG)
-MURANO_ENABLE_MODEL_POLICY_ENFORCEMENT=$(trueorfalse False MURANO_ENABLE_MODEL_POLICY_ENFORCEMENT)
-
-# Set up murano service endpoint
-MURANO_SERVICE_HOST=${MURANO_SERVICE_HOST:-$SERVICE_HOST}
-MURANO_SERVICE_PORT=${MURANO_SERVICE_PORT:-8082}
-MURANO_SERVICE_PROTOCOL=${MURANO_SERVICE_PROTOCOL:-$SERVICE_PROTOCOL}
-
-# Set up settings for service broker API
-MURANO_CFAPI_SERVICE_PORT=${MURANO_CFAPI_SERVICE_PORT:-8083}
-MURANO_CFAPI_DEFAULT_TENANT=${MURANO_CFAPI_DEFAULT_TENANT:-admin}
-
-# Set up default service user for murano
-MURANO_ADMIN_USER=${MURANO_ADMIN_USER:-murano}
-
-MURANO_KEYSTONE_SIGNING_DIR=${MURANO_KEYSTONE_SIGNING_DIR:-/tmp/keystone-signing-muranoapi}
-
-# Set up murano networking settings
-MURANO_DEFAULT_ROUTER=${MURANO_DEFAULT_ROUTER:-''}
-MURANO_EXTERNAL_NETWORK=${MURANO_EXTERNAL_NETWORK:-''}
-
-DEF_MURANO_DEFAULT_DNS='8.8.8.8'
-if [[ "$SERVICE_IP_VERSION" == 6 ]]; then
- DEF_MURANO_DEFAULT_DNS='2001:4860:4860::8888'
-fi
-MURANO_DEFAULT_DNS=${MURANO_DEFAULT_DNS:-${DEF_MURANO_DEFAULT_DNS}}
-
-# Choose applications for installation
-MURANO_APPS=${MURANO_APPS:-''}
-MURANO_APPS_DIR=$DEST/murano-apps
-MURANO_APPS_REPO=${MURANO_APPS_REPO:-${GIT_BASE}/openstack/murano-apps.git}
-MURANO_APPS_BRANCH=${MURANO_APPS_BRANCH:-master}
-
-# MURANO_RABBIT_VHOST allows to specify a separate virtual host for Murano services.
-# This is not required if all OpenStack services are deployed by devstack scripts
-# on a single node. In this case '/' virtual host (which is the default) is enough.
-# The problem arise when Murano installed in 'devbox' mode, allowing two or more
-# devboxes to use one common OpenStack host. In this case it's better devboxes
-# use separated virtual hosts, to avoid conflicts between Murano services.
-# This couldn't be done using existing variables, so that's why this variable was added.
-MURANO_RABBIT_VHOST=${MURANO_RABBIT_VHOST:-''}
-
-# Settings needed for the Murano Tempest Plugin installation
-TEMPEST_DIR=$DEST/tempest
-TEMPEST_CONFIG_DIR=${TEMPEST_CONFIG_DIR:-$TEMPEST_DIR/etc}
-TEMPEST_CONFIG=$TEMPEST_CONFIG_DIR/tempest.conf
-TEMPEST_MURANO_SCENARIO_TESTS_ENABLED=$(trueorfalse True TEMPEST_MURANO_SCENARIO_TESTS_ENABLED)
-TEMPEST_MURANO_DEPLOYMENT_TESTS_ENABLED=$(trueorfalse False TEMPEST_MURANO_DEPLOYMENT_TESTS_ENABLED)
-
-# GlARe variables
-# Glance Artifact Repository endpoint type for Murano communications.
-# Public by default.
-GLARE_ENDPOINT_TYPE=${GLARE_ENDPOINT_TYPE:-publicURL}
-
-enable_service murano
-enable_service murano-api
-enable_service murano-engine
diff --git a/devstack/upgrade/resources.sh b/devstack/upgrade/resources.sh
deleted file mode 100755
index 56b217654..000000000
--- a/devstack/upgrade/resources.sh
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/bin/bash
-
-set -o errexit
-
-source $GRENADE_DIR/grenaderc
-source $GRENADE_DIR/functions
-
-source $TOP_DIR/openrc admin demo
-
-set -o xtrace
-
-function create {
- # add later
- :
-}
-
-function verify_noapi {
- # currently no good way
- :
-}
-
-function verify {
- # add later
- :
-}
-
-function destroy {
- # add later
- :
-}
-
-# Dispatcher
-case $1 in
- "create")
- create
- ;;
- "verify_noapi")
- verify_noapi
- ;;
- "verify")
- verify
- ;;
- "destroy")
- destroy
- ;;
- "force_destroy")
- set +o errexit
- destroy
- ;;
-esac
diff --git a/devstack/upgrade/settings b/devstack/upgrade/settings
deleted file mode 100644
index 3a324ae49..000000000
--- a/devstack/upgrade/settings
+++ /dev/null
@@ -1,11 +0,0 @@
-register_project_for_upgrade murano
-register_db_to_save murano
-
-devstack_localrc base enable_plugin murano https://opendev.org/openstack/murano
-devstack_localrc target enable_plugin murano https://opendev.org/openstack/murano
-
-devstack_localrc base enable_service murano-api murano-engine
-devstack_localrc target enable_service murano-api murano-engine
-
-BASE_RUN_SMOKE=False
-TARGET_RUN_SMOKE=False
diff --git a/devstack/upgrade/shutdown.sh b/devstack/upgrade/shutdown.sh
deleted file mode 100755
index 19edf0e7b..000000000
--- a/devstack/upgrade/shutdown.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-
-set -o errexit
-
-source $GRENADE_DIR/grenaderc
-source $GRENADE_DIR/functions
-
-# We need base DevStack functions for this
-source $BASE_DEVSTACK_DIR/functions
-source $BASE_DEVSTACK_DIR/stackrc # needed for status directory
-source $BASE_DEVSTACK_DIR/lib/tls
-source $BASE_DEVSTACK_DIR/lib/apache
-
-MURANO_DEVSTACK_DIR=$(dirname $(dirname $0))
-source $MURANO_DEVSTACK_DIR/settings
-source $MURANO_DEVSTACK_DIR/plugin.sh
-
-set -o xtrace
-
-stop_murano
-
-# sanity check that service is actually down
-ensure_services_stopped murano-api murano-engine
diff --git a/devstack/upgrade/upgrade.sh b/devstack/upgrade/upgrade.sh
deleted file mode 100755
index 94fc7ea01..000000000
--- a/devstack/upgrade/upgrade.sh
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/env bash
-
-# ``upgrade-murano``
-
-echo "*********************************************************************"
-echo "Begin $0"
-echo "*********************************************************************"
-
-# Clean up any resources that may be in use
-cleanup() {
- set +o errexit
-
- echo "********************************************************************"
- echo "ERROR: Abort $0"
- echo "********************************************************************"
-
- # Kill ourselves to signal any calling process
- trap 2; kill -2 $$
-}
-
-trap cleanup SIGHUP SIGINT SIGTERM
-
-# Keep track of the grenade directory
-RUN_DIR=$(cd $(dirname "$0") && pwd)
-
-# Source params
-source $GRENADE_DIR/grenaderc
-
-# Import common functions
-source $GRENADE_DIR/functions
-
-# This script exits on an error so that errors don't compound and you see
-# only the first error that occurred.
-set -o errexit
-
-# Upgrade murano
-# ==============
-
-# Get functions from current DevStack
-source $TARGET_DEVSTACK_DIR/stackrc
-source $TARGET_DEVSTACK_DIR/lib/apache
-source $TARGET_DEVSTACK_DIR/lib/tls
-source $(dirname $(dirname $BASH_SOURCE))/settings
-source $(dirname $(dirname $BASH_SOURCE))/plugin.sh
-
-# Print the commands being run so that we can see the command that triggers
-# an error. It is also useful for following allowing as the install occurs.
-set -o xtrace
-
-# Save current config files for posterity
-[[ -d $SAVE_DIR/etc.murano ]] || cp -pr $MURANO_CONF_DIR $SAVE_DIR/etc.murano
-
-# Install the target murano
-install_murano
-
-# calls upgrade-murano for specific release
-upgrade_project murano $RUN_DIR $BASE_DEVSTACK_BRANCH $TARGET_DEVSTACK_BRANCH
-
-# Migrate the database
-murano-db-manage upgrade || die $LINO "DB migration error"
-
-start_murano
-
-# Don't succeed unless the services come up
-ensure_services_started murano-api murano-engine
-
-set +o xtrace
-echo "*********************************************************************"
-echo "SUCCESS: End $0"
-echo "*********************************************************************"
diff --git a/doc/requirements.txt b/doc/requirements.txt
deleted file mode 100644
index 26d39490b..000000000
--- a/doc/requirements.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-# doc build requirements
-sphinx>=2.0.0,!=2.1.0 # BSD
-sphinxcontrib-httpdomain>=1.3.0 # BSD
-reno>=3.1.0 # Apache-2.0
-openstackdocstheme>=2.2.1 # Apache-2.0
-os-api-ref>=1.4.0 # Apache-2.0
-oslo.config>=6.8.0 # Apache-2.0
-oslo.policy>=3.6.0 # Apache-2.0
diff --git a/doc/source/_templates/sidebarlinks.html b/doc/source/_templates/sidebarlinks.html
deleted file mode 100644
index c4b3e6650..000000000
--- a/doc/source/_templates/sidebarlinks.html
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-{% if READTHEDOCS %}
-
-{% endif %}
diff --git a/doc/source/admin/admin_troubleshooting.rst b/doc/source/admin/admin_troubleshooting.rst
deleted file mode 100644
index b54da757e..000000000
--- a/doc/source/admin/admin_troubleshooting.rst
+++ /dev/null
@@ -1,189 +0,0 @@
-.. _admin-troubleshooting:
-
-===============
-Troubleshooting
-===============
-
-Log location
-~~~~~~~~~~~~
-
-By default, logs are sent to stdout. Consider how to set up the log files.
-
-Murano API + Engine
--------------------
-
-To define a file where to store logs, use the ``log_file`` option in the
-:file:`murano.conf` file. You can provide an absolute or a relative path.
-
-To enable a detailed log file configuration, set up :file:`logging.conf`.
-The example is provided in :file:`etc/murano` directory. The log configuration
-file location is set with the ``log_config_append`` option in the murano
-configuration file.
-
-Murano applications
--------------------
-
-Murano applications have a separate logging handler and a separate file where
-all logs from application definitions should be provided. Open the
-:file:`logging.conf` file and check the ``args: ('applications.log',)``
-option in the ``handler_applications`` section.
-
-Verify that ``log_config_append`` is not empty and set to the
-:file:`logging.conf` location.
-
-Issues during configuration
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-If any issues occur, first of all verify the following:
-
-* All murano components have consistent versions: murano-dashboard and
- murano-engine should use the same or compatible python-muranoclient version.
- Dependent component versions can be found in :file:`requirements.txt` file.
-
-* The database is synced with code by running:
-
- .. code-block:: console
-
- murano-db-manage --config-file murano.conf upgrade
-
-**Failed to execute `murano-db-manage`**
-
-* Make sure the ``--config-file`` option is provided.
-* Check `connection` parameter in the provided configuration file. It should
- be a `connection string `_.
-
-* Check that MySQL or PostgreSQL (depending of what you provided in the
- connection string) Python modules are installed on the system.
-
-**Applications panel is not seen in horizon**
-
-* Make sure that the following files are copied to the
- ``openstack_dashboard/local/enabled`` directory, and _50_murano.py is copied
- to ``openstack_dashboard/local/local_settings.d`` directory.
-
- * _50_dashboard_catalog.py
- * _51_muranodashboard.py
- * _60_panel_group_browse.py
- * _63_panel_murano_catalog.py
- * _70_panel_group_manage.py
- * _71_panel_murano_packages.py
- * _72_panel_murano_images.py
- * _73_panel_murano_categories.py
- * _80_panel_group_applications.py
- * _81_panel_applications_environments.py
-
-* Check that murano data is not inserted twice in the settings file and as a
- plugin.
-
-**Applications panel can be browsed, but 'Unable to communicate to murano-api server.' appears**
-
-If you have murano registered in keystone, verify the endpoint URL is valid
-and service has *application-catalog* name. If you do not want to register the
-murano service in keystone, just add ``MURANO_API_URL`` option to the horizon
-local setting.
-
-Issues during deployment
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-Besides identifying errors from log files, there is another and more flexible
-way to browse deployment errors -- directly from UI. When the *Deploy Failed*
-status appears, navigate to :menuselection:`Environment Components` and click
-the :guilabel:`Latest Deployment Log` tab. You can see steps of the deployment
-and the one that failed would have red color.
-
-**while scanning a simple key in "", line 32, column 3: ...**
-
-There is an error in the YAML file format. Before uploading a package,
-validate your file in an online YAML validator like
-`YAMLint `_.
-Later `validation tool `_
-to check package closely while uploading will be added.
-
-**NoPackageForClassFound: Package for class io.murano.Environment is not found**
-
-Verify that murano core package is uploaded. If not, the content of the
-``meta/io.murano`` folder should be zipped and uploaded to Murano.
-
-**[keystoneclient.exceptions.AuthorizationFailure]:**
-**Authorization failed: You are not authorized to perform the requested action. (HTTP 403)**
-
-The token expires during the deployment. Usually the default standard token
-lifetime is one hour. The error occurs frequently as, in most cases, a
-deployment takes longer than that or does not start right after a token is
-generated.
-
-Workarounds:
-
-* Use trusts. Only possible in the v3 version. Read more in the
- `official documentation `_
- or `here `_.
- Do not forget to check the corresponding heat and murano settings. Trusts
- are enabled by default in murano and heat since Kilo release.
-
- In murano, the corresponding configuration option is located in the
- ``engine`` section:
-
- .. code-block:: ini
-
- [engine]
-
- ...
-
- # Create resources using trust token rather than user's token (boolean
- # value)
- use_trusts = true
-
- If your Keystone runs v2 version, see the solutions below.
-
-* Make logout/login to compose a new token and start the deployment again.
- Would not help for long deployment or if the token lifetime is too small.
-
-* Increase the token lifetime in the keystone configuration file.
-
-**The murano-agent did not respond within 3600 seconds**
-
-* Check transport access to the virtual machine: verify that the router has a
- gateway.
-* Check the RabbitMQ settings: verify that the agent has valid RabbitMQ
- parameters.
- Go to the spawned virtual machine and open :file:`*/etc/murano/agent.conf`
- on the Linux-based machine or :file:`C:\\Murano\\Agent\\agent.conf` on the
- Windows-based machine. Additionally, you can examine agent logs that by
- default are located at :file:`/var/log/murano-agent.log` The first part of
- the log file contains reconnection attempts to the RabbitMQ since the valid
- RabbitMQ address and queue have not been obtained yet.
-* Verify that the ``driver`` option in ``[oslo_messaging_notifications]`` group
- is set to ``messagingv2``.
-
-**murano.engine.system.agent.AgentException**
-
-The agent started the execution plan but something went wrong. Examine agent
-logs (see the previous paragraph for the logs placement information). Also,
-try to manually execute the application scripts.
-
-**[exceptions.EnvironmentError]: Unexpected stack state NOT_FOUND or UPDATE_FAILED**
-
-An issue with heat stack creation, examine the heat log file. Try to manually
-spawn the instance. If the reason of the stack creation fail is ``no valid
-host was found``, there might be not enough resources or something is wrong
-with the nova-scheduler.
-
-**Router could not be created, no external network found**
-
-Find the ``external_network`` parameter in the ``networking`` section of the
-murano configuration file and verify that the specified external network does
-exist through Web UI or by executing the
-:command:`openstack network list --external` command.
-
-**Deployment log in the UI contains incomplete reports**
-
-Sometimes logs contain only two messages after the application deployment.
-There are no messages provided in applications themselves:
-
-.. code-block:: console
-
- 2015-09-21 11:14:58 — Action deploy is scheduled
- 2015-09-21 11:16:43 — Deployment finished successfully
-
-To fix the issue, set the ``driver`` option in the :file:`murano.config` file
-to ``messagingv2``.
diff --git a/doc/source/admin/appdev-guide/app_debugging.rst b/doc/source/admin/appdev-guide/app_debugging.rst
deleted file mode 100644
index bb290c73e..000000000
--- a/doc/source/admin/appdev-guide/app_debugging.rst
+++ /dev/null
@@ -1,62 +0,0 @@
-.. _app-debugging:
-
-================================
-Application developer's cookbook
-================================
-
-If you have not written murano packages before,
-start from the existing :ref:`Step-by-Step ` guide. It contains
-general information about murano packages development process. Additionally,
-see the :ref:`MuranoPL reference `.
-
-Load applications from a local directory
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Normally, whenever you make changes to your application, you have to package it,
-re-upload the package to the API, and delete the old package from the API. This
-makes developing and testing murano applications troublesome and time-consuming.
-Murano-engine provides a way to speed up the edit-upload-deploy loop. This can be
-done with the ``load_packages_from`` option. Murano-engine examines any directories
-mentioned in this option before accessing the API. Therefore, you do not even
-need to package the application into a ZIP archive and any changes you make are
-instantly available to the engine, if you do not plan to check or change the
-application UI. To check your application's appearance in the OpenStack dashboard,
-upload the application for the first run. Additionally, re-upload the package
-using the OpenStack dashboard or CLI each time you update the application UI.
-
-To load an application from a local directory, modify
-the ``load_packages_from`` parameter in murano config ``[engine]`` section.
-
-.. code-block:: console
-
- [engine]
- ...
- load_packages_from = /path/to/murano/applications
- ...
-
-.. note::
- The murano-engine scans the directory structure and seeks application
- manifests. Therefore, you can point the ``load_packages_from`` parameter
- to a cloned version of the murano-apps repository.
-
-Deploy environment using CLI
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The standard way to deploy an application in murano is by using the murano
-dashboard (OpenStack dashboard plug-in). However, if the OpenStack dashboard is
-not available or some sort of automation is required, murano provides the
-capability to deploy environments through CLI. It is a powerful tool
-that allows users and application developers make arbitrary changes to apps
-object-model. This can be useful in early stages of application development to
-experiment with different object models of an application. You can read more about
-it in :ref:`Deploying environments using CLI `
-
-Application unit test framework
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-An application unit test framework was created to make development process
-easier. With this framework you can check different scenarios of application
-deployment without running real deployments.
-
-For more information about application unit tests, see
-:ref:`Application unit tests `.
diff --git a/doc/source/admin/appdev-guide/app_development_framework.rst b/doc/source/admin/appdev-guide/app_development_framework.rst
deleted file mode 100644
index ae7c6b707..000000000
--- a/doc/source/admin/appdev-guide/app_development_framework.rst
+++ /dev/null
@@ -1,932 +0,0 @@
-.. _app-development-framework:
-
-=================================
-Application development framework
-=================================
-
-Application development framework is a library that helps application
-developers to create applications that can be scalable, highly available,
-(self)healable and do not contain boilerplate code for common application
-workflow operations. This library is placed into the Murano repository under
-the ``meta/io.murano.applications`` folder.
-
-To allow your applications to use the code of the library, zip it and upload
-to the Murano application catalog.
-
-Framework objectives
---------------------
-
-The library allows application developers to focus on their
-application-specific tasks without the real need to dive into resource
-orchestration, server farm configuration, and so on. For example, on how to
-install the software on the VMs, how to configure it to interact with other
-applications. Application developers are able to focus more on the software
-configuration tools (scripts, puppets, and others) and care less about the
-MuranoPL if they do not need to define any custom workflow logic.
-
-The main capabilities the library provides and its main use-cases are as
-follows:
-
-* Standard operations are implemented in the framework and can be left as is
-* The capability to create multi-server applications and scale them
-* The capability to create composite multi-component applications
-* The capability to track application failures and recover from them
-* The capability to define event handlers for various events
-
-Quickstart
-----------
-
-To use the framework in your application, include the following lines to the
-``manifest.yaml`` file:
-
-.. code-block:: yaml
-
- Require:
- io.murano.applications:
-
-Create a one-component single-server application
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-**To create a simple application deployed on a single server**:
-
-#. Include the following lines to the code of the application class:
-
- .. code-block:: yaml
-
- Namespaces:
- =: my.new.ns
- apps: io.murano.applications
-
- Name: AppName
- Extends: apps:SingleServerApplication
-
-
-#. Provide an input for the application ``server`` property in your
- ``ui.yaml`` file:
-
- .. code-block:: yaml
-
- Application:
- ?:
- type: my.new.ns.AppName
- server:
- ?:
- type: io.murano.resources.LinuxMuranoInstance
- name: generateHostname($.instanceConfiguration.unitNamingPattern, 1)
- flavor: $.instanceConfiguration.flavor
- ...
-
-
- Now you already have the app that creates a server ready for installing
- software on it.
-
-#. To create a fully functional app, add an installation script to the body
- of the ``onInstallServer`` method:
-
- .. code-block:: yaml
-
- Methods:
- onInstallServer:
- Arguments:
- - server:
- Contract: $.class(res:Instance).notNull()
- - serverGroup:
- Contract: $.class(apps:ServerGroup).notNull()
- Body:
- - $file: sys:Resources.string('installScript.sh')
- - conf:Linux.runCommand($server.agent, $file)
-
-
-#. Optional. Add other methods that handle certain stages of the application
- workflow, such as ``onBeforeInstall``, ``onCompleteInstallation``,
- ``onConfigureServer``, ``onCompleteConfiguration``, and others. For details
- about these methods, see the
- :ref:`Software components ` section.
-
-Create a one-component multi-server application
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-**To create an application that is intended to be installed on several servers**:
-
-#. Make it inherit the ``MultiServerApplication`` class:
-
- .. code-block:: yaml
-
- Namespaces:
- =: my.new.ns
- apps: io.murano.applications
-
- Name: AppName
- Extends: apps:MultiServerApplication
-
-
-#. Instead of the ``server`` property in ``SingleServerApplication``, provide
- an input for the ``servers`` property that accepts the instance of one of
- the inheritors of the ``ServerGroup`` class. The ``ui.yaml`` file in this
- case may look as follows:
-
- .. code-block:: yaml
-
- Application:
- ?:
- type: my.new.ns.AppName
- servers:
- ?:
- type: io.murano.applications.ServerList
- servers:
- - ?:
- type: io.murano.resources.LinuxMuranoInstance
- name: "Server-1"
- flavor: $.instanceConfiguration.flavor
- ...
-
- - ?:
- type: io.murano.resources.LinuxMuranoInstance
- name: "Server-2"
- flavor: $.instanceConfiguration.flavor
- ...
-
-
-#. Define the custom logic of the application in the handler methods, and it
- will be applied to the whole app, exactly like with
- ``SingleServerApplication``.
-
-Create a scalable multi-server application
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-**To provide the application with the ability to scale**:
-
-#. Make the app extend the ``MultiServerApplicationWithScaling`` class:
-
- .. code-block:: yaml
-
- Namespaces:
- =: my.new.ns
- apps: io.murano.applications
-
- Name: AppName
- Extends: apps:MultiServerApplicationWithScaling
-
-#. Provide the ``ui.yaml`` file:
-
- .. code-block:: yaml
-
- Application:
- ?:
- type: my.new.ns.AppName
- servers:
- ?:
- type: io.murano.applications.ServerReplicationGroup
- numItems: $.appConfiguration.numNodes
- provider:
- ?:
- type: io.murano.applications.TemplateServerProvider
- template:
- ?:
- type: io.murano.resources.LinuxMuranoInstance
- flavor: $.instanceConfiguration.flavor
- ...
- serverNamePattern: $.instanceConfiguration.unitNamingPattern
-
-
- The ``servers`` property accepts instance of the ``ServerReplicationGroup``
- class, and in turn it requires input of the ``numItems`` and ``provider``
- properties.
-
-After the deployment, the ``scaleOut`` and ``scaleIn`` public methods
-(actions) become available in the dashboard UI.
-
-For a working example of such application, see the
-``com.example.apache.ApacheHttpServer`` package version 1.0.0.
-
-
-Library overview
-----------------
-
-The framework includes several groups of classes:
-
- ``replication.yaml``
- Classes that provide the capability to replicate the resources.
-
- ``servers.yaml``
- Classes that provide instances grouping and replication.
-
- ``component.yaml``
- Classes that define common application workflows.
-
- ``events.yaml``
- Class for handling events.
-
- ``baseapps.yaml``
- Base classes for applications.
-
-As it is described in the :ref:`Quickstart` section, the application makes use
-of the Application development framework by inheriting from one of the base
-application classes, such as ``SingleServerApplication``,
-``MultiServerApplication``, ``MultiServerApplicationWithScaling``. In turn,
-these classes are inheritors of the standard ``Application`` class and the
-``SoftwareComponent`` class. The latter class binds all of the framework
-capabilities.
-
-The ``SoftwareComponent`` class inherits both ``Installable`` and
-``Configurable`` classes which provide boilerplate code for the installation
-and configuration workflow respectively. They also contain empty methods
-for each stage of the workflow (e.g. ``onBeforeInstall``, ``onInstallServer``),
-which are the places where application developers can add their own
-customization code.
-
-The entry point to execute deployment of the software component is its
-``deployAt`` method which requires instance of one of the inheritors of the
-``serverGroup`` class. It is the object representing the group of servers
-the application should be deployed to. The application holds such an object as
-one of its properties. It can be a single server (``SingleServerGroup``
-subclass), a prepopulated list of servers (``ServerList`` subclass) or a list
-of servers that are dynamically generated in runtime
-(``ServerReplicationGroup`` subclass).
-
-``ServerReplicationGroup`` or, more precisely, one of its parent classes
-``ReplicationGroup`` controls the number of items it holds by releasing items
-over the required amount and requesting creation of the new items in runtime
-from the ``ReplicaProvider`` class which acts like an object factory. In case
-of servers, it is ``TemplateServerProvider`` which creates new servers from the
-given template. Replication is done during the initial deployment and during
-the scaling actions execution.
-
-Framework detailed description
-------------------------------
-
-This section provides technical description of all the classes present in the
-application development library, their hierarchy and usage.
-
-Scaling primitives
-~~~~~~~~~~~~~~~~~~
-
-There is an ability to group similar resources together, produce new copies
-of the same resources or release the existing ones on request. Now it is
-implemented for instances only, other resources may be added later.
-
-The following is the hierarchy of classes that provide grouping and
-replication of resources:
-
-::
-
- +-------+
- | +-------+
- | | +--------+ +------------------+ +-----------------+
- | | | | | | | |
- +-+ | Object <--------+ ReplicationGroup +--------> ReplicaProvider |
- +-+ | | | | |
- +--------+ +---+--------------+ +-+--------+------+
- ^ ^ ^
- | | |
- | +------------------+-----+ |
- | | | |
- +-------+ | | CloneReplicaProvider | |
- | +-------+ | | + other | |
- | | +----------+ | +------------------------+ |
- | | | | | |
- +-+ | Instance | | |
- +-+ | | |
- +----+-----+ | |
- | | |
- +-----+-------+ | |
- | | | |
- | ServerGroup | | +---------------+--+
- | | | | Template |
- +-----^-------+ +---+----------+ | Server +--+
- | | Server +-------> Provider | |
- +------------+ Replication | +-----+------------+ +---+
- | Group | | | |
- +--------------+ +---+---other---+ |
- | |
- +---------------+
-
-
-**ReplicationGroup**
-
- A base class which holds the collection of objects generated in runtime in
- its ``items`` output property and contains a reference to a
- ``ReplicaProvider`` object in its ``provider`` property which is used to
- dynamically generate the objects in runtime.
-
- Input properties of this class include the ``minItems`` and ``maxItems``
- allowing to limit the number of objects it holds in its collection.
-
- An input-output property ``numItems`` allows to declaratively change the
- set of objects in the collection by setting its size.
-
- The ``deploy()`` method is used to apply the replica settings: it drops
- the objects from the collection if their number exceeds the number
- specified by the ``numItems`` or generate some new if there are not enough
- of them.
-
- The ``scale()`` method is used to increase or decrease the ``numItems`` by
- some number specified in the ``delta`` argument of the method, but in
- range between ``maxItems`` and ``minItems``.
-
-**ReplicaProvider**
-
- A class which does the object replication. The base one is abstract, its
- inheritors should implement the abstract ``createReplica`` method to
- create the actual object. The method accepts the ``index`` parameter to
- properly parametrize the newly created copy and optional ``owner``
- parameter to use it as an owner for the newly created objects.
-
- The concrete implementations of this class should define all the input
- properties needed to create new instances of object. Thus the provider
- actually acts as a template of the object it generates.
-
-**CloneReplicaProvider**
-
- An implementation of ``ReplicaProvider`` capable to create replicas by
- cloning some user-provided object, making use of the ``template()``
- contract.
-
-**PoolReplicaProvider**
-
- Replica provider that takes replicas from the prepopulated pool instead
- of creating them.
-
-**RoundrobinReplicaProvider**
-
- Replica provider with a load balancing that returns replica from the
- prepopulated list. Once the provider runs out of free items it goes to the
- beginning of the list and returns the same replicas again.
-
-**CompositeReplicaProvider**
-
- Replica provider which is a composition of other replica providers. It
- holds the collection of providers in its ``providers`` input property.
- Its ``ReplicaProvider`` method returns a new replica created by the first
- provider in that list. If that value is `null`, the replica created by the
- second provider is returned, and so on. If no not-null replicas are
- created by all providers, the method returns null.
-
- This provider can be used to have some default provider with the ability
- to fall back to the next options if the preferable one is not successful.
-
-
-Servers replication
-~~~~~~~~~~~~~~~~~~~
-
-**ServerGroup**
-
- A class that provides static methods for deployment and releasing
- resources on the group of instances.
-
- The ``deployServers()`` static method accepts instance of ``ServerGroup``
- class and a list of servers as the parameters and deploys all servers from
- the list in the environment which owns the server group, unless server is
- already deployed.
-
- The ``releaseServers()`` static method accepts a list of servers as the
- parameter and consequentially calls ``beginReleaseResources()`` and
- ``endReleaseResources()`` methods on each server.
-
-**ServerList**
-
- A class that extends the ``ServerGroup`` class and holds a group of
- prepopulated servers in its ``servers`` input property.
-
- The ``deploy()`` method calls the ``deployServers()`` method with the
- servers defined in the ``servers`` property.
-
- The ``.destroy()`` method calls the ``releaseServers()`` method with the
- servers defined in the ``servers`` property.
-
-**SingleServerGroup**
-
- Degenerate case of a ``ServerGroup`` which consists of a single server.
- Has the ``server`` input property to hold a single server.
-
-**CompositeServerGroup**
-
- A server group that is composed of other server groups.
-
-**ServerReplicationGroup**
-
- A subclass of the ``ReplicationGroup`` class and the ``ServerGroup``
- class to replicate the ``Instance`` objects it holds.
-
- The ``deploy()`` method of this group not only generates new instances of
- servers but also deploys them if needed.
-
-**TemplateServerProvider**
-
- A subclass of ``ReplicaProvider`` which is used to produce the objects
- of one of the ``Instance`` class inheritors by creating them from the
- provided template with parameterization of the hostnames. The resulting
- hostname looks like 'Server {index}{groupName}'.
-
- May be passed as ``provider`` property to objects of the
- ``ServerReplicationGroup`` class.
-
-**other replica providers**
-
- Other subclasses of ``ReplicaProvider`` may be created to produce different
- objects of ``Instance`` class and its subclasses depending on particular
- application needs.
-
-
-Classes for grouping and replication of other kinds of resources are to be
-implemented later.
-
-.. _software-components:
-
-Software Components
-~~~~~~~~~~~~~~~~~~~
-
-The class to handle the lifecycle of the application is the
-``SoftwareComponent`` class which is a subclass of ``Installable`` and
-``Configurable``:
-
-::
-
- +-----------+-+ +-+------------+
- | | | |
- | Installable | | Configurable |
- | | | |
- +-----------+-+ +-+------------+
- ^ ^
- | |
- | |
- +-+---------------+-+
- | |
- | SoftwareComponent |
- | |
- +-------------------+
-
-
-The hierarchy of the ``SoftwareComponent`` classes is used to define the
-workflows of different application lifecycles. The general logic of the
-application behaviour is contained in the methods of the base classes and
-the derived classes are able to implement the handlers for the custom logic.
-The model is event-driven: the workflow consists of the multiple steps, and
-most of the steps invoke appropriate `on%StepName%` methods intended to
-provide application-specific logic.
-
-Now 'internal' steps logic and their 'public' handlers are split into the
-separate methods. It should improve the developers' experience and simplify
-the code of the derived classes.
-
-The standard workflows (such as Installation and Configuration) are defined
-by the ``Installable`` and ``Configurable`` classes respectively. The
-``SoftwareComponent`` class inherits both these classes and defines its
-deployment workflow as a sequence of Installation and Configuration flows.
-Other future implementations may add new workflow interfaces and mix them in
-to change the deployment workflow or add new actions.
-
-**Installation** workflow consists of the following methods:
-
-::
-
- +----------------------------------------------------------------------------------------------------------------------+
- | INSTALL |
- | |
- | +------------------------------+ +---------------+ |
- | +------------------------------+ | +---------------+ | |
- | +------------------------------+ | | +---------------+ +---------------+ | | +----------------------+ |
- | | | | | | | | | | | | | |
- | | checkServerIsInstalled | +-+ +----> beforeInstall +----> installServer | +-+ +----> completeInstallation | |
- | | +-+ | | | +-+ | | |
- | +------------------------------+ +------+--------+ +------+--------+ +-----------+----------+ |
- | | | | |
- +----------------------------------------------------------------------------------------------------------------------+
- | | |
- | | |
- | | |
- v v v
- onBeforeInstall onInstallServer onCompleteInstallation
-
-
-.. list-table::
- :widths: 10 10 40
- :header-rows: 1
-
- * - Method
- - Arguments
- - Description
-
- * - **install**
- - ``serverGroup``
- - Entry point of the installation workflow.
- Iterates through all the servers of the passed ServerGroup and calls the
- ``checkServerIsInstalled`` method for each of them. If at least one
- of the calls has returned `false`, calls a ``beforeInstall`` method.
- Then, for each server which returned `false` as the result of the
- ``checkServerIsInstalled`` calls the ``installServer`` method to do
- the actual software installation.
- After the installation is completed on all the servers and if at
- least one of the previous calls of ``checkServerIsInstalled`` returned
- `false`, the method runs the ``completeInstallation`` method.
- If all the calls to ``checkServerIsInstalled`` return `true`, this
- method concludes without calling any others.
-
- * - **checkServerIsInstalled**
- - ``server``
- - Checks if the given server requires a (re)deployment of the software
- component. By default checks for the value of the attribute `installed`
- of the instance.
- May be overridden by subclasses to provide some better logic (e.g. the
- app developer may provide code to check if the given software is
- pre-installed on the image which was provisioned on the VM).
-
- * - **beforeInstall**
- - ``servers``, ``serverGroup``
- - Reports the beginning of installation process, sends notification about
- this event to all objects which are subscribed for it (see
- *Event notification pattern* section for details) and calls the public
- event handler ``onBeforeInstall``.
-
- * - **onBeforeInstall**
- - ``servers``, ``serverGroup``
- - Public handler of the `beforeInstall` event. Empty in the base class,
- may be overridden in subclasses if some custom pre-install logic needs
- to be executed.
-
- * - **installServer**
- - ``server``, ``serverGroup``
- - Does the actual software deployment on a given server by calling an
- ``onInstallServer`` public event handler (with notification on this
- event). If the installation completes successfully sets the `installed`
- attribute of the server to `true`, reports successful installation and
- returns `null`. If an exception encountered during the invocation of
- ``onInstallServer``, the method handles that exception, reports a
- warning and returns the server. The return value of the method indicates
- to the ``install`` method how many failures encountered in total during
- the installation and with what servers.
-
- * - **onInstallServer**
- - ``server``, ``serverGroup``
- - An event-handler method which is called by the ``installServer`` method
- when the actual software deployment is needed.It is empty in the base
- class. The implementations should override it with custom logic to
- deploy the actual software bits.
-
- * - **completeInstallation**
- - ``servers``, ``serverGroup``, ``failedServers``
- - It is executed after all the ``installServer`` methods were called.
- Checks for the number of errors reported during the installation: if it
- is greater than the value of ``allowedInstallFailures`` property, an
- exception is raised to interrupt the deployment workflow. Otherwise the
- method emits notification on this event, calls an
- ``onCompleteInstallation`` event handler and then reports the successful
- completion of the installation workflow.
-
- * - **onCompleteInstallation**
- - ``servers``, ``serverGroup``, ``failedServers``
- - An event-handler method which is called by the ``completeInstallation``
- method when the component installation is about to be completed.
- Default implementation is empty. Inheritors may implement this method to
- add some final handling, reporting etc.
-
-
-**Configuration** workflow consists of the following methods:
-
-::
-
- +----------------------------------------------------------------------------------------------------------------------+
- | CONFIGURATION |
- | +-----------------+ |
- | | | |
- | | +---------------+ +-----------------+ |
- | | +---------------+ | +-----------------+ | |
- | +------------v--+ +---------------+ | | +--------------+ +-----------------+ | | +-----------------------+ |
- | | | | | | | | | | | | | | | |
- | | checkCluster\ +---> checkServer\ | +-+---> preConfigure +---> configureServer | +-+---> completeConfiguration | |
- | | IsConfigured | | IsConfigured +-+ | | | +-+ | | |
- | +------------+--+ +---------------+ +------+-------+ +--------+--------+ +-----------+-----------+ |
- | | | | | |
- | | | | | |
- | +----------v----------+ | | | |
- | | | | | | |
- | | getConfigurationKey | | | | |
- | | | | | | |
- | +---------------------+ | | | |
- | | | | |
- +----------------------------------------------------------------------------------------------------------------------+
- | | |
- | | |
- v v v
- configureSecurity, onConfigureServer onCompleteConfiguration
- onPreConfigure
-
-
-.. list-table::
- :widths: 10 10 40
- :header-rows: 1
-
- * - Method
- - Arguments
- - Description
-
- * - **configure**
- - ``serverGroup``
- - Entry point of the configuration workflow.
- Calls a ``checkClusterIsConfigured`` method. If the call returns `true`,
- workflow exits without any further action. Otherwise for each server in
- the ``serverGroup`` it calls ``checkServerIsConfigured`` method and gets
- the list of servers that need reconfiguration. The ``preConfigure``
- method is called with that list. At the end calls the
- ``completeConfiguration`` method.
-
- * - **checkClusterIsConfigured**
- - ``serverGroup``
- - Has to return `true` if the configuration (i.e. the values of input
- properties) of the component has not been changed since it was last
- deployed on the given server group. Default implementation calls the
- ``getConfigurationKey`` method and compares the returned result with a
- value of `configuration` attribute of ``serverGroup``. If the results
- match returns `true` otherwise `false`.
-
- * - **getConfigurationKey**
- - None
- - Should return some values describing the configuration state of the
- component. This state is used to track the changes of the configuration
- by the ``checkClusterIsConfigured`` and ``checkServerIsConfigured``
- methods.
- Default implementation returns a synthetic value which gets updated on
- every environment redeployment. Thus the subsequent calls of the
- ``configure`` method on the same server group during the same deployment
- will not cause the reconfiguration, while the calls on the next
- deployment will reapply the configuration again.
- The inheritors may redefine this to include the actual values of the
- configuration properties, so the configuration is reapplied only if the
- appropriate input properties are changed.
-
- * - **checkServerIsConfigured**
- - ``server``, ``serverGroup``
- - It is called to check if the particular server of the server group has
- to be reconfigured thus providing more precise control compared to
- cluster-wide ``checkClusterIsConfigured``.
- Default implementation calls the ``getConfigurationKey`` method and
- compares the returned result with a value of `configuration` attribute
- of the server. If the results match returns `true` otherwise `false`.
- This method gets called only if the ``checkClusterIsConfigured`` method
- returned `false` for the whole server group.
-
- * - **preConfigure**
- - ``servers``, ``serverGroup``
- - Reports the beginning of configuration process, calls the
- ``configureSecurity`` method, emits the notification and calls the
- public event handler ``onPreConfigure``. This method is called once per
- the server group and only if the changes in configuration are detected.
-
- * - **configureSecurity**
- - ``servers``, ``serverGroup``
- - Intended for configuring the security rules. It is empty in the base
- class. Fully implemented in the ``OpenStackSecurityConfigurable`` class
- which is the inheritor of ``Configurable``.
-
- * - **onPreConfigure**
- - ``servers``, ``serverGroup``
- - Public event-handler which is called by the ``preConfigure`` method
- when the (re)configuration of the component is required.
- Default implementation is empty. Inheritors may implement this method to
- set various kinds of cluster-wide states or output properties which may
- be of use at later stages of the workflow.
-
- * - **configureServer**
- - ``server``, ``serverGroup``
- - Does the actual software configuration on a given server by calling the
- ``onConfigureServer`` public event handler. Before that reports the
- beginning of the configuration and emits the notification. If the
- configuration completes successfully calls the ``getConfigurationKey``
- method and sets the `configuration` attribute of the server to resulting
- value thus saving the configuration applied to a given server. Returns
- `null` to indicate successful configuration.
- If an exception encountered during the invocation of
- ``onConfigureServer``, the method will handle that exception, report a
- warning and return the current server to signal its failure to the
- ``configure`` method.
-
- * - **onConfigureServer**
- - ``server``, ``serverGroup``
- - An event-handler method which is called by the ``configureServer``
- method when the actual software configuration is needed. It is empty in
- the base class. The implementations should override it with custom logic
- to apply the actual software configuration on a given server.
-
- * - **completeConfiguration**
- - ``servers``, ``serverGroup``, ``failedServers``
- - It is executed after all the ``configureServer`` methods were called.
- Checks for the number of errors reported during the configuration: if it
- is greater than set by the ``allowedConfigurationFailures`` property, an
- exception is raised to interrupt the deployment workflow. Otherwise the
- method emits notification, calls an ``onCompleteConfiguration`` event
- handler, calls the ``getConfigurationKey`` method and sets the
- `configuration` attribute of the server group to resulting value and
- then reports successful completion of the configuration workflow.
-
- * - **onCompleteConfiguration**
- - ``servers``, ``serverGroup``, ``failedServers``
- - The event-handler method which is called by the ``completeConfiguration``
- method when the component configuration is finished at all the servers.
- Default implementation is empty. Inheritors may implement this method to
- add some final handling, reporting etc.
-
-
-The ``OpenStackSecurityConfigurable`` class extends ``Configurable`` by
-implementing the ``configureSecurity`` method of the base class and adding the
-empty ``getSecurityRules`` method.
-
-.. list-table::
- :widths: 10 10 40
- :header-rows: 1
-
- * - Method
- - Arguments
- - Description
-
- * - **getSecurityRules**
- - None
- - Returns an empty dictionary in default implementation. Inheritors which
- want to add security rules during the app configuration should
- implement this method and make it return a list of dictionaries
- describing the security rules with the following keys:
-
- * FromPort (port number, e.g. 80).
-
- * ToPort (port number, e.g. 80).
-
- * IpProtocol: (string, e.g. 'tcp').
-
- * External: (boolean: `true` means that the inbound traffic to the given
- port (or port range) may originate from outside of the environment;
- `false` means that only the VMs spawned by this or other apps of the
- current environment may connect to this port).
-
- * Ethertype: (optional, can be 'IPv4' or 'IPv6').
-
- * - **configureSecurity**
- - ``servers``, ``serverGroup``
- - Gets the list of security rules provided by the ``getSecurityRules``
- method and adds security group with these rules to the Heat stacks of
- all regions which the component's ``servers`` are deployed to
-
-Consider the following example of this class usage:
-
-.. code-block:: yaml
-
- Namespaces:
- =: com.example.apache
- apps: io.murano.applications
-
- Name: ApacheHttpServer
-
- Extends:
- - apps:MultiServerApplicationWithScaling
- - apps:OpenStackSecurityConfigurable
-
- Methods:
- getSecurityRules:
- Body:
- - Return:
- - ToPort: 80
- FromPort: 80
- IpProtocol: tcp
- External: true
- - ToPort: 443
- FromPort: 443
- IpProtocol: tcp
- External: true
-
-
-In the example above, the ``ApacheHttpServer`` class is configured to create
-a security group with two security rules allowing network traffic over HTTP
-and HTTPS protocols on its deployment.
-
-
-The ``SoftwareComponent`` class inherits both ``Installable`` and
-``Configurable`` and adds several additional methods.
-
-.. list-table::
- :widths: 10 10 40
- :header-rows: 1
-
- * - Method
- - Arguments
- - Description
-
- * - **deployAt**
- - ``serverGroup``
- - Binds all workflows into one process. Consequentially calls ``deploy``
- method of the ``serverGroup``, ``install`` and ``configure`` methods
- inherited from the parent classes.
-
- * - **report**
- - ``message``
- - Reports a ``message`` using environment's reporter.
-
- * - **detectSuccess**
- - ``allowedFailures``, ``serverGroup``, ``failedServers``
- - Static method that returns `true` in case the actual number of failures
- (number of ``failedServers``) is less than or equal to the
- ``allowedFailures``. The latter can be on of the following options:
- `none`, `one`, `two`, `three`, `any`, 'quorum'. `any` allows any number
- of failures during the installation or configuration. `quorum` allows
- failure of less than a half of all servers.
-
-
-Event notification pattern
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The ``Event`` class may be used to issue various notifications to other
-MuranoPL classes in an event-driven manner.
-
-Any object which is going to emit the notifications should declare the
-instances of the ``Event`` class as its public Runtime properties. You can see
-the examples of such properties in the ``Installable`` and ``Configurable``
-classes:
-
-.. code-block:: yaml
-
- Name: Installable
-
- Properties:
- beforeInstallEvent:
- Contract: $.class(Event).notNull()
- Usage: Runtime
- Default:
- name: beforeInstall
-
-
-The object which is going to subscribe for the notifications should pass
-itself into the ``subscribe`` method of the event along with the name of its
-method which will be used to handle the notification:
-
-.. code-block:: yaml
-
- $event.subscribe($subscriber, handleFoo)
-
-
-The specified handler method must be present in the subscriber class
-(if the method name is missing it will default to ``handle%Eventname%``)
-and have at least one standard (i.e. not ``VarArgs`` or ``KwArgs``) argument
-which will be treated as ``sender`` while invoking.
-
-The ``unsubscribe`` method does the opposite and removes object from the
-subscribers of the event.
-
-The class which is going to emit the notification should call the ``notify``
-method of the event and pass itself as the first argument (``sender``). All
-the optional parameters of the event may be passed as varargs/kwargs of the
-``notify`` call. They will be passed all the way to the handler methods.
-
-This is how it looks in the ``Installable`` class:
-
-.. code-block:: yaml
-
- beforeInstall:
- Arguments:
- - servers:
- Contract:
- - $.class(res:Instance).notNull()
- - serverGroup:
- Contract: $.class(ServerGroup).notNull()
- Body:
- - ...
- - $this.beforeInstallEvent.notify($this, $servers, $serverGroup)
- - ...
-
-
-The ``notifyInParallel`` method does the same, but invokes all handlers of
-subscribers in parallel.
-
-
-Base application classes
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-There are several base classes that extend standard ``io.murano.Application``
-class and ``SoftwareComponent`` class from the application development
-library.
-
-**SingleServerApplication**
- A base class for applications running a single software component on a
- single server only. Its ``deploy`` method simply creates the
- ``SingleServerGroup`` with the ``server`` provided as an application input.
-
-**MultiServerApplication**
- A base class for applications running a single software component on
- multiple servers. Unlike ``SingleServerApplication``, it has the
- ``servers`` input property instead of ``server``. It accepts instance of
- on of the inheritors of the ``ServerGroup`` class.
-
-**MultiServerApplicationWithScaling**
- Extends ``MultiServerApplication`` with the ability to scale the
- application by increasing (scaling out) or decreasing (scaling in) the
- number of nodes with the application after it is installed. The
- differences from ``MultiServerApplication`` are:
-
- * the ``servers`` property accepts only instances of
- ``ServerReplicationGroup`` rather than any ``ServerGroup``
-
- * the additional optional ``scaleFactor`` property accepts the number by
- which the app is scaled at once; it defaults to 1
-
- * the ``scaleOut`` and ``scaleIn`` public methods are added
-
-
-Application developers may as well define their own classes using the
-same approach and combining base classes behaviour with the custom code to
-satisfy the needs of their applications.
diff --git a/doc/source/admin/appdev-guide/app_migrating.rst b/doc/source/admin/appdev-guide/app_migrating.rst
deleted file mode 100644
index 0402e1d59..000000000
--- a/doc/source/admin/appdev-guide/app_migrating.rst
+++ /dev/null
@@ -1,17 +0,0 @@
-.. _app_migrating:
-
-=======================================
-Migrating applications between releases
-=======================================
-
-This document describes how a developer of murano application can update
-existing packages to make them synchronized with all implemented features
-and requirements.
-
-.. toctree::
- :maxdepth: 1
-
- app_migrating/app_migrate_to_juno
- app_migrating/app_migrate_to_kilo
- app_migrating/app_migrate_to_liberty
- app_migrating/app_migrate_to_newton
diff --git a/doc/source/admin/appdev-guide/app_migrating/app_migrate_to_juno.rst b/doc/source/admin/appdev-guide/app_migrating/app_migrate_to_juno.rst
deleted file mode 100644
index 205ade47e..000000000
--- a/doc/source/admin/appdev-guide/app_migrating/app_migrate_to_juno.rst
+++ /dev/null
@@ -1,88 +0,0 @@
-.. _app_migrate_to_juno:
-
-
-Migrate applications from Murano v0.5 to Stable/Juno
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Applications created for murano v0.5, unfortunately, are not supported in Murano
-stable/juno. This document provides the application code changes required for
-compatibility with the stable/juno murano version.
-
-Rename *'Workflow'* to *'Methods'*
-----------------------------------
-
-In stable/juno the name of section containing class methods is renamed to
-*Methods*, as the latter is more OOP and doesn't cause confusion with Mistral. So,
-you need to change it in *app.name/Classes* in all classes describing workflow
-of your app.
-
-For example:
-
-.. code-block:: yaml
-
- Workflow:
- deploy:
- Body:
- - $._environment.reporter.report($this, 'Creating VM')
-
-Should be changed to:
-
-.. code-block:: yaml
-
- Methods:
- deploy:
- Body:
- - $._environment.reporter.report($this, 'Creating VM')
-
-Change the Instance type in the UI definition 'Application' section
--------------------------------------------------------------------
-
-The Instance class was too generic and contained some dirty workarounds to
-differently handle Windows and Linux images, to bootstrap an instance in a
-number of ways, etc. To solve these problems more classes were added to the
-*Instance* inheritance hierarchy.
-
-Now, base *Instance* class is abstract and agnostic of the desired OS and agent
-type. It is inherited by two classes: *LinuxInstance* and *WindowsInstance*.
-
-- *LinuxInstance* adds a default security rule for Linux, opening a standard
- SSH port;
-
-- *WindowsInstance* adds a default security rule for Windows, opening an RDP
- port. At the same time WindowsInstance prepares a user-data allowing to use
- Murano v1 agent.
-
-*LinuxInstance* is inherited by two other classes, having different software
-config method:
-
-- *LinuxMuranoInstance* adds a user-data preparation to configure Murano
- v2 agent;
-
-- *LinuxUDInstance* adds a custom user-data field allowing the services to
- supply their own user data.
-
-You need to specify the instance type which is required by your app. It
-specifies a field in UI, where user can select an image matched to the instance
-type. This change must be added to UI form definition in *app.name/UI/ui.yaml*.
-
-For example, if you are going to install your application on Ubuntu, you need to
-change:
-
-.. code-block:: yaml
-
- Application:
- ?:
- instance:
- ?:
- type: io.murano.resources.Instance
-
-to:
-
-.. code-block:: yaml
-
- Application:
- ?:
- instance:
- ?:
- type: io.murano.resources.LinuxMuranoInstance
-
diff --git a/doc/source/admin/appdev-guide/app_migrating/app_migrate_to_kilo.rst b/doc/source/admin/appdev-guide/app_migrating/app_migrate_to_kilo.rst
deleted file mode 100644
index cf64d244a..000000000
--- a/doc/source/admin/appdev-guide/app_migrating/app_migrate_to_kilo.rst
+++ /dev/null
@@ -1,118 +0,0 @@
-.. _app_migrate_to_kilo:
-
-Migrate applications to Stable/Kilo
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-In Kilo, there are no breaking changes that affect backward compatibility.
-But there are two new features which you can use since Kilo.
-
-1. Pluggable Pythonic classes for murano
-----------------------------------------
-
-Now you can create plug-ins for MuranoPL. A plug-in (extension) is an
-independent Python package implementing functionality which you want
-to add to the workflow of your application.
-
-For a demo application demonstrating the usage of plug-ins, see the
-``murano/contrib/plugins/murano_exampleplugin`` folder.
-
-The application consist of the following components:
-
- * An `ImageValidatorMixin` class that inherits the generic instance class
- (``io.murano.resources.Instance``) and adds a method capable of validating
- the instance image for having an appropriate murano metadata type. This
- class may be used as a mixin when added to inheritance hierarchy of
- concrete instance classes.
-
- * A concrete class called `DemoInstance` that inherits from
- `io.murano.resources.LinuxMuranoInstance` and `ImageValidatorMixin`
- to add the image validation logic to a standard, murano-enabled and
- Linux-based instance.
-
- * An application that deploys a single VM using the `DemoInstance`
- class if the tag on the user-supplied image matches the user-supplied
- constant.
-
-The **ImageValidatorMixin** demonstrates the instantiation of plug-in provided
-class and its usage, as well as handling of exception which may be thrown if
-the plug-in is not installed in the environment.
-
-2. Murano mistral integration
------------------------------
-
-The core library has a new system class for mistral client that allows to call
-Mistral APIs from the murano application model.
-
-The system class allows you to:
-
- * Upload a mistral workflow to mistral.
-
- * Trigger the mistral workflow that is already deployed, wait for completion
- and return the execution output.
-
-To use this feature, add some mistral workflow to ``Resources`` folder
-of your package. For example, create file `TestEcho_MistralWorkflow.yaml`:
-
- .. code-block:: yaml
-
- version: '2.0'
-
- test_echo:
- type: direct
- input:
- - input_1
- output:
- out_1: <% $.task1_output_1 %>
- out_2: <% $.task2_output_2 %>
- out_3: <% $.input_1 %>
- tasks:
- my_echo_test:
- action: std.echo output='just a string'
- publish:
- task1_output_1: 'task1_output_1_value'
- task1_output_2: 'task1_output_2_value'
- on-success:
- - my_echo_test_2
-
- my_echo_test_2:
- action: std.echo output='just a string'
- publish:
- task2_output_1: 'task2_output_1_value'
- task2_output_2: 'task2_output_2_value'
- ..
-
-And provide workflow to use the mistral client:
-
- .. code-block:: yaml
-
- Namespaces:
- =: io.murano.apps.test
- std: io.murano
- sys: io.murano.system
-
-
- Name: MistralShowcaseApp
-
- Extends: std:Application
-
- Properties:
- name:
- Contract: $.string().notNull()
-
- mistralClient:
- Contract: $.class(sys:MistralClient)
- Usage: Runtime
-
-
- Methods:
- initialize:
- Body:
- - $this.mistralClient: new(sys:MistralClient)
-
- deploy:
- Body:
- - $resources: new('io.murano.system.Resources')
- - $workflow: $resources.string('TestEcho_MistralWorkflow.yaml')
- - $.mistralClient.upload(definition => $workflow)
- - $output: $.mistralClient.run(name => 'test_echo', inputs => dict(input_1 => input_1_value))
- - $this.find(std:Environment).reporter.report($this, $output.get('out_3'))
diff --git a/doc/source/admin/appdev-guide/app_migrating/app_migrate_to_liberty.rst b/doc/source/admin/appdev-guide/app_migrating/app_migrate_to_liberty.rst
deleted file mode 100644
index 53c209f70..000000000
--- a/doc/source/admin/appdev-guide/app_migrating/app_migrate_to_liberty.rst
+++ /dev/null
@@ -1,259 +0,0 @@
-.. _app_migrate_to_liberty:
-
-Migrate applications to Stable/Liberty
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-In Liberty a number of useful features that can be used by developers creating
-their murano applications were implemented. This document describes these
-features and steps required to include them to new apps.
-
-1. Versioning
--------------
-
-Package version
-```````````````
-
-Now murano packages have a new optional attribute in their manifest called
-`Version` - a standard SemVer format version string. All MuranoPL classes have
-the version of the package they contained in.
-To specify the version of your package, add a new section to the manifest file:
-
- .. code-block:: yaml
-
- Version: 0.1.0
-
- ..
-
-If no version specified, the package version will be equal to *0.0.0*.
-
-Package requirements
-````````````````````
-
-There are cases when packages may require other packages for their work.
-Now you need to list such packages in the `Require` section of the manifest
-file:
-
- .. code-block:: yaml
-
- Require:
- package1_FQN: version_spec_1
- ...
- packageN_FQN: version_spec_N
-
- ..
-
-`version_spec` here denotes the allowed version range. It can be either in
-semantic_version specification pip-like format or as partial version string.
-If you do not want to specify the package version, leave this value empty:
-
- .. code-block:: yaml
-
- Require:
- package1_FQN: '>=0.0.3'
- package2_FQN:
-
- ..
-
-In this case, the last dependency *0.x.y* is used.
-
-
-.. note::
- All packages depend on the `io.murano` package (core library). If you do not
- specify this requirement in the list (or the list is empty or even there is
- no `Require` key in package manifest), then dependency *io.murano: 0* will
- be automatically added.
-
-
-Object version
-``````````````
-Now you can specify the version of objects in UI definition when your
-application requires specific version of some class. To do this, add new key
-`classVersion` to section `?` describing object:
-
- .. code-block:: yaml
-
- ?:
- type: io.test.apps.TestApp
- classVersion: 0.0.1
-
- ..
-
-`classVersion` of all classes included to package equals `Version` of this
-package.
-
-2. YAQL
--------
-
-In Liberty, murano was updated to use `yaql 1.0.0`.
-The new version of YAQL allows you to use a number of new functions and
-features that help to increase the speed of developing new applications.
-
-.. note::
- Usage of these features makes your applications incompatible with
- older versions of murano.
-
-Also, in Liberty you can change `Format` in the manifest of package from
-*1.0* to *1.1* or *1.2*.
-
- * **1.0** - supported by all versions of murano.
- * **1.1** - supported by Liberty+. Specify it, if you want to use features
- from *yaql 0.2* and *yaql 1.0.0* at the same time in your application.
- * **1.2** - supported by Liberty+. A number of features from *yaql 0.2* do not
- work with this format (see the list below). We recommend you to use it for
- new applications where compatibility with Kilo is not required.
-
-Some examples of *yaql 0.2* features that are not compatible with the *1.2* format
-```````````````````````````````````````````````````````````````````````````````````
-
- * Several functions now cannot be called as MuranoObject methods:
- ``id(), cast(), super(), psuper(), type()``.
-
- * Now you do not have the ability to compare non-comparable types.
- For example "string != false"
-
- * Dicts are not iterable now, so you cannot do this:
- ``If: $key in $dict``. Use ``$key in $dict.keys()``
- or ``$v in $dict.values()``
-
- * Tuples are not available. ``=>`` always means keyword argument.
-
-3. Simple software configuration
---------------------------------
-
-Previously, you always had to create execution plans even when some short
-scripts had to be executed on a VM. This process included creating a template
-file, creating a script, and describing the sending of the execution plan to
-the murano agent.
-
-Now you can use a new class **io.murano.configuration.Linux** from murano
-`core-library`. This allows sending short commands to the VM and putting files
-from the ``Resources`` folder of packages to some path on the VM without the
-need of creating execution plans.
-
-To use this feature you need to:
-
-* Declare a namespace (for convenience)
-
- .. code-block:: yaml
-
- Namespaces:
- conf: io.murano.configuration
- ...
- ..
-
-* Create object of ``io.murano.configuration.Linux`` class in workflow of
- your application:
-
- .. code-block:: yaml
-
- $linux: new(conf:Linux)
- ..
-
-* Run one of the two feature methods: ``runCommand`` or ``putFile``:
-
- .. code-block:: yaml
-
- # first argument is agent of instance, second - your command
- $linux.runCommand($.instance.agent, 'service apache2 restart')
- ..
-
- or:
-
- .. code-block:: yaml
-
- # getting content of file from 'Resources' folder
- - $resources: new(sys:Resources)
- - $fileContent: $resources.string('your_file.name')
- # put this content to some directory on VM
- - $linux.putFile($.instance.agent, $fileContent, '/tmp/your_file.name')
- ..
-
-
-.. note::
- At the moment, you can use this feature only if your app requires an
- instance of ``LinuxMuranoInstance`` type.
-
-4. UI network selection element
--------------------------------
-
-Since Liberty, you can provide users with the ability to choose where to join
-their VM: to a new network created during the deployment, or to an already
-existing network.
-Dynamic UI now has a new type of field - ``NetworkChoiseField``. This field
-provides a selection of networks and their subnetworks as a dropdown populated
-with those which are available to the current project (tenant).
-
-To use this feature, you should make the following updates in the Dynamic UI of
-an application:
-
-* Add ``network`` field:
-
- .. code-block:: yaml
-
- fields:
- - name: network
- type: network
- label: Network
- description: Select a network to join. 'Auto' corresponds to a default environment's network.
- required: false
- murano_networks: translate
- ..
-
- To see the full list of the ``network`` field arguments, refer to the UI
- forms :ref:`specification `.
-
-* Add template:
-
- .. code-block:: yaml
-
- Templates:
- customJoinNet:
- - ?:
- type: io.murano.resources.ExistingNeutronNetwork
- internalNetworkName: $.instanceConfiguration.network[0]
- internalSubnetworkName: $.instanceConfiguration.network[1]
- ..
-
-* Add declaration of `networks` instance property:
-
- .. code-block:: yaml
-
- Application:
- ?:
- type: com.example.exampleApp
- instance:
- ?:
- type: io.murano.resources.LinuxMuranoInstance
- networks:
- useEnvironmentNetwork: $.instanceConfiguration.network[0]=null
- useFlatNetwork: false
- customNetworks: switch($.instanceConfiguration.network[0], $=null=>list(), $!=null=>$customJoinNet)
-
- ..
-
-For more details about this feature, see :ref:`use-cases `
-
-.. note::
- To use this feature, the version of UI definition must be **2.1+**
-
-5. Remove name field from fields and object model in dynamic UI
----------------------------------------------------------------
-
-Previously, each class of an application had a ``name`` property. It had no
-built-in predefined meaning for MuranoPL classes and mostly used for dynamic UI
-purposes.
-
-Now you can create your applications without this property in classes and
-without a corresponding field in UI definitions. The field for app name will be
-automatically generated on the last management form before start of deployment.
-Bonus of deleting this - to remove unused property from muranopl class that is
-needed for dashboard only.
-
-So, to update existing application developer should make 3 steps:
-
-#. remove ``name`` field and property declaration from UI definition;
-
-#. remove ``name`` property from class of application and make sure that it is
- not used anywhere in workflow
-
-#. set version of UI definition to **2.2 or higher**
diff --git a/doc/source/admin/appdev-guide/app_migrating/app_migrate_to_newton.rst b/doc/source/admin/appdev-guide/app_migrating/app_migrate_to_newton.rst
deleted file mode 100644
index 3b360cce6..000000000
--- a/doc/source/admin/appdev-guide/app_migrating/app_migrate_to_newton.rst
+++ /dev/null
@@ -1,132 +0,0 @@
-.. _app_migrate_to_newton:
-
-Migrate applications to Stable/Newton
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-In Newton a number of useful features that can be used by developers creating
-their murano applications were implemented. Also some changes are not backward
-compatible. This document describes these features, how they may be included
-into the new apps and what benefits the apps may gain.
-
-
-1. New syntax for the action declaration
-----------------------------------------
-
-Previously, for declaring action in MuranoPL application, following syntax was
-used:
-
- .. code-block:: yaml
-
- methodName:
- Usage: Action
-
-This syntax is deprecated now for packages with FormatVersion starting from
-1.4, and you should use the `Scope` attribute:
-
- .. code-block:: yaml
-
- methodName:
- Scope: Public
-
-For more information about actions in MuranoPL, see :ref:`actions`.
-
-
-2. Usage of static methods as Action
-------------------------------------
-
-Now you can declare static method as action with `Scope` and `Usage`
-attributes
-
- .. code-block:: yaml
-
- methodName:
- Scope: Public
- Usage: Static
-
-For more information about static methods in MuranoPL, see :ref:`static_methods_and_properties`.
-
-3. Template contract support
-----------------------------
-
-New contract function ``template`` was introduced. ``template`` works
-similar to the ``class`` in regards to the data validation but does not
-instantiate objects. The template is just a dictionary with object model
-representation of the object.
-
-It is useful when you do not necessarily need to pass the actual object as a
-property or as a method argument and use it right away, but rather to create
-new objects of this type in runtime from the given template. It is especially
-beneficial for resources replication or situations when object creation
-depends on some conditions.
-
-Objects that are assigned to the property or argument with ``template``
-contract will be automatically converted to their object model
-representation.
-
-4. Multi-region support
------------------------
-
-Starting from Newton release cloud resource classes (instances, networks,
-volumes) can be explicitly put into OpenStack regions other than environment
-default. Thus it becomes possible to have applications that make use of more
-than one region including stretching/bursting to other regions.
-
-Each resource class has got new ``regionName`` property which controls its
-placement. If no value is provided, default region for environment is used.
-Applications wanting to take advantage of multi-region support should access
-security manager and Heat stacks from regions of their resources rather than
-from the environment.
-
-Regions need to be configured before they can be used. Please refer to
-documentation on how to do this: :ref:`multi_region`.
-
-Changes in the core library
-```````````````````````````
-
-`io.murano.Environment` class contains `regions` property with list of
-`io.murano.CloudRegion` objects. Heat stack, networks and agent listener are
-now owned by `io.murano.CloudRegion` instances rather than by `Environment`.
-
-You can not get `io.murano.resources.Network` objects from
-`Enviromnent::defaultNetworks` now. This property only contains templates for
-`io.murano.CloudRegion` default networks.
-
-The proper way to retrieve `io.murano.resources.Network` object is now the
-following:
-
- .. code-block:: yaml
-
- $region: $instance.getRegion()
- $networks: $region.defaultNetworks
-
-5. Changes to property validation
----------------------------------
-
-`string()` contract no longer converts to string anything but scalar values.
-
-6. Garbage collection
----------------------
-
-New approach to resource deallocation was introduced.
-
-Previously murano used to load ``Objects`` and ``ObjectsCopy`` sections of the
-JSON object model independently which cause for objects that were not deleted
-between deployments to instantiate twice. If deleted objects were to cause any
-changes to such alive objects they were made to the objects loaded from
-``ObjectsCopy`` and immediately discarded before the deployment.
-Now this behaviour is changed and there are no more duplicates of the same object.
-
-Applications can also make use of the new features. Now it is possible to
-perform on-demand destruction of the unreferenced MuranoPL objects during the
-deployment from the application code.
-The ``io.murano.system.GC.GarbageCollector.collect()`` static method may be
-used for that.
-
-Also objects obtained ability to set up destruction dependencies to the
-other objects. Destruction dependencies allow to define the preferable order
-of objects destruction and let objects be aware of other objects destruction,
-react to this event, including the ability to prevent other objects from
-being destroyed.
-
-Please refer to the documentation on how to use the
-:ref:`Garbage Collector `.
diff --git a/doc/source/admin/appdev-guide/app_unit_tests.rst b/doc/source/admin/appdev-guide/app_unit_tests.rst
deleted file mode 100644
index 03b07f8af..000000000
--- a/doc/source/admin/appdev-guide/app_unit_tests.rst
+++ /dev/null
@@ -1,220 +0,0 @@
-.. _app-unit-tests:
-
-======================
-Application unit tests
-======================
-
-Murano applications are written in :ref:`MuranoPL `.
-To make the development of applications easier and enable application
-testing, a special framework was created. So it is possible to add
-unit tests to an application package and check if the application is in
-actual state. Also, application deployment can be simulated with unit tests,
-so you do not need to run the murano engine.
-
-A separate service that is called *murano-test-runner* is used to run
-MuranoPL unit tests.
-
-All application test cases should be:
-
-* Specified in the MuranoPL class, inherited from
- `io.murano.test.testFixture `_
-
- This class supports loading object model with the corresponding `load(json)`
- function. Also it contains a minimal set of assertions such as
- ``assertEqual`` and etc.
-
- Note, that test class has the following reserved methods are:
-
- * *initialize* is executed once, like in any other murano application
- * *setUp* is executed before each test case
- * *tearDown* is executed after each test case
-
-* Named with *test* prefix
-
-.. code-block:: console
-
- usage: murano-test-runner [-h] [--config-file CONFIG_FILE]
- [--os-auth-url OS_AUTH_URL]
- [--os-username OS_USERNAME]
- [--os-password OS_PASSWORD]
- [--os-project-name OS_PROJECT_NAME]
- [-l [ [ ...]]] [-v]
- [--version]
-
- [ [ ...]]
-
- positional arguments:
-
- Full name of application package that is going to be
- tested
-
- List of method names to be tested
-
- optional arguments:
- -h, --help show this help message and exit
- --config-file CONFIG_FILE
- Path to the murano config
- --os-auth-url OS_AUTH_URL
- Defaults to env[OS_AUTH_URL]
- --os-username OS_USERNAME
- Defaults to env[OS_USERNAME]
- --os-password OS_PASSWORD
- Defaults to env[OS_PASSWORD]
- --os-project-name OS_PROJECT_NAME
- Defaults to env[OS_PROJECT_NAME]
- -l [ [ ...]], --load_packages_from [ [ ...]]
- Directory to search packages from. Will be used instead of
- directories, provided in the same option in murano configuration file.
- -v, --verbose increase output verbosity
- --version show program's version number and exit
-
-
-The fully qualified name of a package is required to specify the test location.
-It can be an application package that contains one or several classes with all
-the test cases, or a separate package. You can specify a class name to
-execute all the tests located in it, or specify a particular test case name.
-
-Authorization parameters can be provided in the murano configuration file, or
-with higher priority ``-os-`` parameters.
-
-Consider the following example of test execution for the Tomcat application.
-Tests are located in the same package with application, but in a separate class
-called ``io.murano.test.TomcatTest``. It contains ``testDeploy1`` and
-``testDeploy2`` test cases.
-The application package is located in the */package/location/directory*
-(murano-apps repository e.g). As the result of the following command, both
-test cases from the specified package and class will be executed.
-
-.. code-block:: console
-
- murano-test-runner io.murano.apps.apache.Tomcat io.murano.test.TomcatTest -l /package/location/directory /io.murano/location -v
-
-The following command runs a single *testDeploy1* test case from the
-application package.
-
-.. code-block:: console
-
- murano-test-runner io.murano.apps.apache.Tomcat io.murano.test.TomcatTest.testDeploy1
-
-The main purpose of MuranoPL unit test framework is to enable mocking.
-Special :ref:`yaql` functions are registered for that:
-
-`def inject(target, target_method, mock_object, mock_name)`
- ``inject`` to set up mock for *class* or *object*, where mock definition is a *name of the test class method*
-
-`def inject(target, target_method, yaql_expr)`
- ``inject`` to set up mock for *a class* or *object*, where mock definition is a *YAQL expression*
-
-Parameters description:
-
-**target**
- MuranoPL class name (namespaces can be used or full class name
- in quotes) or MuranoPL object
-
-**target_method**
- Method name to mock in target
-
-**mock_object**
- Object, where mock definition is contained
-
-**mock_name**
- Name of method, where mock definition is contained
-
-**yaql_expr**
- YAQL expression, parameters are allowed
-
-So the user is allowed to specify mock functions in the following ways:
-
-* Specify a particular method name
-* Provide a YAQL expression
-
-Consider how the following functions may be used in the MuranoPL class with
-unit tests:
-
-.. code-block:: yaml
-
- Namespaces:
- =: io.murano.test
- sys: io.murano.system
-
- Extends: TestFixture
-
- Name: TomcatTest
-
- Methods:
- initialize:
- Body:
- # Object model can be loaded from JSON file, or provided
- # directly in MuranoPL code as a YAML insertion.
- - $.appJson: new(sys:Resources).json('tomcat-for-mock.json')
- - $.heatOutput: new(sys:Resources).json('output.json')
- - $.log: logger('test')
- - $.agentCallCount: 0
-
- # Mock method to replace the original one
- agentMock:
- Arguments:
- - template:
- Contract: $
- - resources:
- Contract: $
- - timeout:
- Contract: $
- Default: null
- Body:
- - $.log.info('Mocking murano agent')
- - $.assertEqual('Deploy Tomcat', $template.Name)
- - $.agentCallCount: $.agentCallCount + 1
-
- # Mock method, that returns predefined heat stack output
- getStackOut:
- Body:
- - $.log.info('Mocking heat stack')
- - Return: $.heatOutput
-
- testDeploy1:
- Body:
- # Loading object model
- - $.env: $this.load($.appJson)
-
- # Set up mock for the push method of *io.murano.system.HeatStack* class
- - inject(sys:HeatStack, push, $.heatOutput)
-
- # Set up mock with YAQL function
- - inject($.env.stack, output, $.heatOutput)
-
- # Set up mock for the concrete object with mock method name
- - inject('io.murano.system.Agent', call, $this, agentMock)
-
- # Mocks will be called instead of original function during the deployment
- - $.env.deploy()
-
- # Check, that mock worked correctly
- - $.assertEqual(1, $.agentCallCount)
-
-
- testDeploy2:
- Body:
- - inject(sys:HeatStack, push, $this, getStackOut)
- - inject(sys:HeatStack, output, $this, getStackOut)
-
- # Mock is defined with YAQL function and it will print the original variable (agent template)
- - inject(sys:Agent, call, withOriginal(t => $template) -> $.log.info('{0}', $t))
-
- - $.env: $this.load($.appJson)
- - $.env.deploy()
-
- - $isDeployed: $.env.applications[0].getAttr(deployed, false, 'com.example.apache.Tomcat')
- - $.assertEqual(true, $isDeployed)
-
-Provided methods are test cases for the Tomcat application. Object model and
-heat stack output are predefined and located in the package ``Resources``
-directory. By changing some object model or heat stack parameters, different
-cases may be tested without a real deployment. Note, that some asserts are used
-in those example. The first one is checked, that agent call function was called
-only once as needed. And assert from the second test case checks for a variable
-value at the end of the application deployment.
-
-Test cases examples can be found in :file:`TomcatTest.yaml` class of the
-Apache Tomcat application located at `murano-apps repository `_.
-You can run test cases with the commands provided above.
diff --git a/doc/source/admin/appdev-guide/cinder_volume_supporting.rst b/doc/source/admin/appdev-guide/cinder_volume_supporting.rst
deleted file mode 100644
index 6d30756f0..000000000
--- a/doc/source/admin/appdev-guide/cinder_volume_supporting.rst
+++ /dev/null
@@ -1,152 +0,0 @@
-.. _cinder_volume_supporting:
-
-Cinder volume support
-~~~~~~~~~~~~~~~~~~~~~
-
-Cinder volume is a block storage service for OpenStack, which represents a
-detachable device, similar to a USB hard drive. You can attach a volume to
-only one instance. In murano, it is possible to work with Cinder volumes
-in several ways:
-
-* Attaching Cinder volumes to murano instance
-* Booting from Cinder volume
-
-Below both ways are considered with ApacheHttpServer application as an
-example.
-
-For more information about Cinder volumes, see
-`Manage Cinder volumes
-`_.
-
-Attaching Cinder volumes
-------------------------
-
-Several volumes can be attached to the murano instance. Consider an example
-that shows how to attach a created volume to the instance (next, in the
-*Booting from Cinder volume* section, we are going to boot from a volume
-created by us).
-
-**Example**
-
-#. In the OpenStack dashboard, go to :guilabel:`Volumes` to create a volume.
-
-#. Modify the ``ui.yaml`` file:
-
-.. code-block:: yaml
-
- ....
-
- Application:
- ....
- instance:
- ....
- volumes:
- $.volumeConfiguration.volumePath:
- ?:
- type: io.murano.resources.ExistingCinderVolume
- openstackId: $.volumeConfiguration.volumeID
-
- ....
-
-An existing Cinder volume can be initialized with its ``openstackId`` and can
-be attached with its ``volumePath``. These parameters come here from
-modified ``Forms`` section of the ``ui.yaml`` file:
-
-.. code-block:: yaml
-
- ....
-
- Forms:
- - appConfiguration:
- ....
- - instanceConfiguration:
- ....
- - volumeConfiguration:
- fields:
- - name: volumeID
- type: string
- label: Existing volume ID
- description: Put in existing volume openstackID
- required: true
- - name: volumePath
- type: string
- label: Path
- description: Put in volume path to be mounted
- required: true
-
-Therefore, create a ZIP archive of the built package and upload it to murano.
-Attach created application to the environment. Enter its openstackId (which
-can be found in OpenStack dashboard) and path for mounting. For example, you
-can fill the latter with ``/dev/vdb`` value.
-
-After the application is deployed, verify that the volume is attached to the
-instance in the OpenStack dashboard :guilabel:`Volumes` tab. Alternatively,
-see the topology of the ``Heat Stack``.
-
-
-Booting from Cinder volume
---------------------------
-
-You can create a volume from an existing image. The example below shows how to
-create a volume from an image and use the volume to boot an instance.
-
-**Example**
-
-It is possible to create a volume through the Heat template, instead of
-the OpenStack dashboard. For this, modify the ``ui.yaml`` file:
-
-.. code-block:: yaml
-
- ....
-
- Templates:
- customJoinNet:
- ....
- bootVolumes:
- - volume:
- ?:
- type: io.murano.resources.CinderVolume
- size: $.instanceConfiguration.volSize
- sourceImage: $.instanceConfiguration.osImage
- bootIndex: 0
- deviceName: vda
- deviceType: disk
- ....
-
- Application:
- ....
- instance:
- ....
- blockDevices: $bootVolumes
-
- ....
-
-The example above shows that the ``Templates`` section now has a
-``bootVolumes`` field, which is stored in the changed ``Application``
-section.
-Pay attention that ``image`` property should be deleted from
-``Application`` to avoid defining both image and volume to boot.
-The ``size`` and ``sourceImage`` properties come in ``Templates`` from the
-changed ``Forms`` section of the ``ui.yaml`` file:
-
-.. code-block:: yaml
-
- ....
-
- Forms:
- - appConfiguration:
- ....
-
- - instanceConfiguration:
- fields:
- ....
- - name: volSize
- type: integer
- label: Size of volume
- required: true
- description: >-
- Specify volume size which is going to be created from image
- ....
-
-After sending this package to murano you can boot your instance from the
-volume by chosen image.
diff --git a/doc/source/admin/appdev-guide/developer_index.rst b/doc/source/admin/appdev-guide/developer_index.rst
deleted file mode 100644
index 23a9d1462..000000000
--- a/doc/source/admin/appdev-guide/developer_index.rst
+++ /dev/null
@@ -1,24 +0,0 @@
-.. _developer-guide:
-
-Application Developer Guide
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. toctree::
- :maxdepth: 1
-
- step-by-step/step_by_step
- exec_plan
- hot_packages
- murano_pl
- murano_packages
- murano_bundles
- app_migrating
- app_unit_tests
- cinder_volume_supporting
- multi_region
- examples
- use_cases
- app_development_framework
- app_debugging
- garbage_collection
- encrypting_properties
diff --git a/doc/source/admin/appdev-guide/encrypting_properties.rst b/doc/source/admin/appdev-guide/encrypting_properties.rst
deleted file mode 100644
index 179afe2e9..000000000
--- a/doc/source/admin/appdev-guide/encrypting_properties.rst
+++ /dev/null
@@ -1,61 +0,0 @@
-.. _encrypting-properties:
-
-=================================
-Managing Sensitive Data in Murano
-=================================
-
-Overview
---------
-If you are developing a Murano application that manages sensitive data such as
-passwords, user data, etc, you may want to ensure this is stored in a secure
-manner in the Murano backend.
-
-Murano offers two `yaql` functions to do this, `encryptData` and
-`decryptData`.
-
-.. note:: Barbican or a similar compatible secret storage backend must be
- configured to use this feature.
-
-Configuring
------------
-Murano makes use of Castellan_ to manage encryption using a supported secret
-storage backend. As of OpenStack Pike, Barbican_ is the only supported
-backend, and hence is the one tested by the Murano community.
-
-To configure Murano to use Barbican, place the following configuration into
-`murano-engine.conf`::
-
- [key_manager]
- auth_type = keystone_password
- auth_url =
- username =
- password =
- user_domain_name =
-
-Similarly, place the following configuration into `_50_murano.py` to configure
-the murano-dashboard end::
-
- KEY_MANAGER = {
- 'auth_url': '/v3',
- 'username': '',
- 'user_domain_name': '',
- 'password': '',
- 'project_name': '',
- 'project_domain_name': ''
- }
-
-.. note:: Horizon config must be valid Python, so the quotes above are important.
-
-Example
--------
-`encryptData(foo)`: Call to encrypt string `foo` in storage. Will return a
-`uuid` which is used to retrieve the encrypted value.
-
-`decryptData(foo_key)`: Call to decrypt and retrieve the value represented by
-`foo_key` from storage.
-
-There is an example application available in the murano repository_.
-
-.. _Castellan: https://opendev.org/openstack/castellan
-.. _Barbican: https://opendev.org/openstack/barbican
-.. _repository: https://opendev.org/openstack/murano/src/branch/master/contrib/packages/EncryptionDemo
diff --git a/doc/source/admin/appdev-guide/examples.rst b/doc/source/admin/appdev-guide/examples.rst
deleted file mode 100644
index 51a65c58a..000000000
--- a/doc/source/admin/appdev-guide/examples.rst
+++ /dev/null
@@ -1,66 +0,0 @@
-.. _examples:
-
-========
-Examples
-========
-
-.. list-table::
- :header-rows: 1
- :widths: 30 70
- :stub-columns: 0
- :class: borderless
-
- * - Application name
- - Description
-
- * - | `Zabbix Agent`_
- - Zabbix Agent is a simple application. It doesn't deploy a VM by itself,
- but is installed on a specific VM that may contain any other
- applications. This VM is tracked by Zabbix and by its configuration.
-
- So Murano performs the Zabbix agent configuration based on the user
- input. The user chooses the way of instance tracking - HTTP or ICMP that may
- perform some modifications in the application package.
-
- It is worth noting that application scripts are written in Python, not
- in Bash as usual. This application does not work without Zabbix server
- application since it's a required property, determined in the
- application definition.
-
- * - | `Zabbix Server`_
- - Zabbix Server application interacts with Zabbix Agent by calling its
- setUpAgent method and providing information about itself: IP and hostname
- of VM on which the server is installed.
-
- Server installs MySQL database and requests database name, password and
- some other parameters from the user.
-
- * - | `Docker Crate`_
- - This is a good example on how difficult logic may be simplified with
- the inheritance that is supported by MuranoPL. Definition of this app is
- simple, but the opportunity it provides is fantastic.
-
- Crate is a distributed database, in the Murano Application catalog it
- looks like a regular application. It may be deployed on Google Kubernetes
- or regular Docker server. The user picks the desired option while filling in
- the form since these options are set in the UI definition. The form field
- has a list of possible options::
-
- ...
- type:
- - com.mirantis.docker.kubernetes.KubernetesPod
- - com.mirantis.docker.DockerStandaloneHost
-
- Information about the application itself (docker image and port that is
- needed to be opened) is contained in the getContainer method. All other
- actions for the application configuration are located at the
- DockerStandaloneHost definition and its dependencies. Note that this
- application doesn't have a filename:Resources folder at all since the
- installation is made by Docker itself.
-
-
-
-.. Links:
-.. _`Zabbix Agent`: https://github.com/openstack/murano-apps/tree/master/ZabbixAgent/package
-.. _`Zabbix Server`: https://github.com/openstack/murano-apps/tree/master/ZabbixServer/package
-.. _`Docker Crate`: https://github.com/openstack/murano-apps/tree/master/Docker/Applications/Crate/package
diff --git a/doc/source/admin/appdev-guide/exec_plan.rst b/doc/source/admin/appdev-guide/exec_plan.rst
deleted file mode 100644
index 40e85085e..000000000
--- a/doc/source/admin/appdev-guide/exec_plan.rst
+++ /dev/null
@@ -1,174 +0,0 @@
-.. _exec_plan:
-
-=======================
-Execution plan template
-=======================
-
-An execution plan template is a set of metadata that describes
-the installation process of an application on a virtual
-machine. It is a minimal executable unit that can be
-triggered in Murano workflows and is understandable to
-the Murano agent, which is responsible for receiving,
-correctness verification and execution of the statements
-included in the template.
-
-The execution plan template is able to trigger any type of script
-that executes commands and installs application components
-as the result. Each script included in the execution
-plan template may consist of a single file or a set of interrelated
-files. A single script can be reused across several execution
-plans.
-
-This section is devoted to the structure and syntax of an execution
-plan template. For different configurations of templates, please
-refer to the :ref:`Examples ` section.
-
-Template sections
-~~~~~~~~~~~~~~~~~
-
-The table below contains the list of the sections that can be
-included in the execution plan template with the description of
-their meaning and the default attributes which are used by the
-agent if any of the listed parameters is not specified.
-
-================== ===================================================
- Section name Meaning and default value
-================== ===================================================
- FormatVersion a version of the execution plan template syntax
- format. Default is ``1.0.0``. **Optional**
-
- Name a human-readable name for the execution plan to
- be used for logging. **Optional**
-
- Version a version of the execution plan itself, is used
- for logging and tracing. Each time the content
- of the template content changes (main script,
- attached scripts, properties, etc.), the version
- value should be incremented.
- This is in contrast with ``FormatVersion``,
- which is used to distinguish the execution plan
- format.
- The default value is ``0.0.0``. **Optional**
-
- Body string that represents the Python statement and is
- executed by the murano-agent. Scripts defined in
- the Scripts section are invoked from here.
- **Required**
-
- Parameters a dictionary of the ``String->JsonObject`` type
- that maps parameter names to their values.
- **Optional**.
-
- Scripts a dictionary that maps script names to their
- script definitions. **Required**
-================== ===================================================
-
-
-.. _format_version:
-
-FormatVersion property
-~~~~~~~~~~~~~~~~~~~~~~
-
-``FormatVersion`` is a property that all other depend on.
-That is why it is very important to specify it correctly.
-
-FormatVersion 1.0.0 (default) is still used by Windows murano-agent.
-Almost all the applications in murano-apps repository work with FormatVersion
-2.0.0. New features that are introduced in Kilo, such as Chef or Puppet,
-and downloadable files require version 2.1.0 or greater. Since FormatVersion
-2.2.0 it is possible to enable Berkshelf. It requires Mitaka version of agent.
-If you omit the ``FormatVersion`` property or put something like ``<2.0.0``,
-it will lead to the incorrect behaviour. The same happens if, for example,
-``FormatVersion=2.1.0``, and a VM has the pre-Kilo agent.
-
-
-Scripts section
-~~~~~~~~~~~~~~~
-
-Scripts are the building blocks of execution plan templates. As
-the name implies those are the scripts for different deployment
-platforms.
-
-Each script may consists of one or more files. Those files are
-script's program modules, resource files, configs, certificates etc.
-
-Scripts may be executed as a whole (like a single piece of code),
-expose some functions that can be independently called in an execution
-plan script or both. This depends on deployment platform and executor
-capabilities.
-
-Scripts are specified using ``Scripts`` attribute of execution plan.
-This attribute maps script name to a structure (document) that describes
-the script. It has the following properties:
-
-**Type**
- the name of a deployment platform the script is targeted to.
- The available alternative options for version>=2.1.0 are
- ``Application``, ``Chef``, ``Puppet``, and for version<2.1.0 is
- ``Application`` only. String, required.
-
-**Version**
- the minimum version of the deployment platform/executor required
- by the script. String, optional.
-
-**EntryPoint**
- the name of the script file that is an entry point for this
- execution plan template. String, required.
-
-**Files**
- the filenames of the additional files required for the script. Thus,
- if the script specified in the ``EntryPoint`` section imports other
- scripts, they should be provided in this section.
-
- The filenames may include slashes that the agent preserve on VM.
- If a filename is enclosed in the angle brackets (<...>) it will be
- base64-encoded. Otherwise, it will be treated as a plain-text that
- may affect line endings.
-
- In Kilo, entries for this property may be not just strings but also
- dictionaries (for example, ``filename: URL``) to specify downloadable files
- or git repositories.
-
- The default value is ``[]`` that means that no extra files are used.
- Array, optional.
-
-**Options**
- an optional dictionary of type ``String->JsonObject`` that contains
- additional options for the script executor. If not provided, an
- empty dictionary is assumed.
-
- Available alternatives are: ``captureStdout``, ``captureStderr``,
- ``verifyExitcode`` (raise an exception if result is not positive).
- As Options are executor-dependent, these three alternatives
- are available for the Application executor, but may have no sense for
- other types. ``captureStdout``, ``captureStderr`` and ``verifyExitcode``
- require boolean values, and have True as their default values.
-
- Dictionary, optional.
-
-Please make sure the files specified in EntryPoint and Files sections exist.
-
-.. needs checking, commenting it for now
-
- Files section
- ~~~~~~~~~~~~~
-
- Files is an execution plan's entry that describes files that are passed
- as the part of the execution plan template. This is a dictionary that
- maps file ID to a document describing the file.
-
- It has the following attributes:
-
- **Name**
- the filename; may include slashes to specify files located in nested
- folders. The root directory is the ``Resources/scripts`` directory.
-
- **BodyType**
- is one of the following:
- * ``Text``: Body attribute contains string content of the file
- * ``Base64``: Body attribute contains base64 encoded string content of
- the (binary) file
-
- **Body**
- contains file data or valid file reference
-
diff --git a/doc/source/admin/appdev-guide/faq.rst b/doc/source/admin/appdev-guide/faq.rst
deleted file mode 100644
index 907863672..000000000
--- a/doc/source/admin/appdev-guide/faq.rst
+++ /dev/null
@@ -1,79 +0,0 @@
-.. _faq:
-
-===
-FAQ
-===
-
-**There are too many files in Murano package, why not to use a single
-Heat Template?**
-
- To install a simple Apache service to a new VM, Heat Template is
- definitely simpler. But the Apache service is useless without its
- applications running under it. Thus, a new Heat Template is necessary
- for every application that you want to run with Apache. In Murano,
- you can compose a result software to install it on a VM on-the-fly:
- it is possible to select an application that can run under Apache
- dynamically. Or you can set a VM where Apache is installed as a
- parameter. This way, the files in the application package allow
- to compose compound applications with multiple configuration options.
- For any single combination you need a separate Heat Template.
-
-**The Application section is defined in the UI form. Can I remove it?**
-
- No. The ``Application`` section is a template for Murano object model
- which is the instruction that helps you to understand the
- environment structure that you deploy. While filling the forms that
- are auto-generated from the UI.yaml file, object model is
- updated with the values entered by the user. Eventually, the Murano
- engine receives the resulted object model (.json file) after the
- environment is sent to the deploy.
-
-**The Templates section is defined in the UI form. What's the purpose?**
-
- Sometimes, the user needs to create several instances with the same
- configuration. A template defined by a variable in the
- ``Templates`` section is multiplied by the value of the number of
- instances that are set by the user. A YAQL ``repeat`` function is
- used for this operation.
-
-**Some properties have Usage, others do not. What does this affect?**
-
- ``Usage`` indicates how a particular property is used. The default
- value is ``In``, so sometimes it is omitted. The ``Out`` property
- indicates that it is not set from outside, but is calculated in
- the class methods and is available for the ``read`` operation from
- other classes. If you don't want to initialize in the class
- constructor, and the property has no default value, you specify
- ``Out`` in the ``Usage``.
-
-**Can I use multiple inheritance in my classes?**
-
- Yes. You can specify a list of parent classes instead of a single
- string in the regular YAML notation. The list with one element is
- also acceptable.
-
-**There are FullName and Name properties in the manifest file. What's
-the difference between them?**
-
- ``Name`` is displayed in the web UI catalog, and ``FullName`` is a
- system name used by the engine to get the class definition and
- resolve the class interconnections.
-
-**How does Murano know which class is the main one?**
-
- There is no ``main`` class term in the MuranoPL. Everything depends
- on a particular object model and an instance class representing the
- instance. Usually, an entry-point class has exactly the same name
- as the package FullName, and it uses other classes.
-
-**What is the difference between $variable and $.variable in the class
-definitions?**
-
- By default, ``$`` represents a current object (similar to ``self``
- in Python or ``this`` in C++/Java/C#), so ``$.variable`` accesses
- the object field/property. In contrast, ``$variable`` (without a dot)
- means a local method variable. Note that ``$`` can change its value
- during execution of some YAQL functions like select, where it means
- a current value. A more safe form is to use a reserved variable
- ``$this`` instead of ``$``. ``$this.variable`` always refers to an
- object-level value in any context.
diff --git a/doc/source/admin/appdev-guide/figures/chef_server.png b/doc/source/admin/appdev-guide/figures/chef_server.png
deleted file mode 100644
index 98b60aa3d..000000000
Binary files a/doc/source/admin/appdev-guide/figures/chef_server.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/figures/chef_server_form.png b/doc/source/admin/appdev-guide/figures/chef_server_form.png
deleted file mode 100644
index 80dd09617..000000000
Binary files a/doc/source/admin/appdev-guide/figures/chef_server_form.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/figures/logo.png b/doc/source/admin/appdev-guide/figures/logo.png
deleted file mode 100644
index 29990d097..000000000
Binary files a/doc/source/admin/appdev-guide/figures/logo.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/figures/step_1.png b/doc/source/admin/appdev-guide/figures/step_1.png
deleted file mode 100644
index d09b5315d..000000000
Binary files a/doc/source/admin/appdev-guide/figures/step_1.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/figures/step_2.png b/doc/source/admin/appdev-guide/figures/step_2.png
deleted file mode 100644
index 3bd995426..000000000
Binary files a/doc/source/admin/appdev-guide/figures/step_2.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/figures/structure.png b/doc/source/admin/appdev-guide/figures/structure.png
deleted file mode 100644
index 2b48019ea..000000000
Binary files a/doc/source/admin/appdev-guide/figures/structure.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/figures/structure.vdx b/doc/source/admin/appdev-guide/figures/structure.vdx
deleted file mode 100644
index d2743ddd3..000000000
--- a/doc/source/admin/appdev-guide/figures/structure.vdx
+++ /dev/null
@@ -1 +0,0 @@
-1.36590.3152.66291.09280.68290.1575-0.01.36590.3150.68290.15750.68290.1575-0.0#000000#0000001.00.010.0125#0000001040.00312510#000000Arial0.138888888888888900.00.00.0-1.00.00.0100.00.15751.36590.15750.682950.00.682950.3151.36590.3150.682950.15750.682950.15750.0#000000#0000001.00.010.00625#00cccc1000.0031251111110001.09260.31471.36570.15720.01.00.01.0NURBS(1.0,3,0,0,0.9106,0.999,0.0,1.0,0.9999,0.7768,0.0,1.0)1.0926-3.0E-40.01.00.01.0NURBS(1.0,3,0,0,0.9999,0.2235,0.0,1.0,0.9106,-0.001,0.0,1.0)0.2732-3.0E-41.0E-40.15720.01.00.01.0NURBS(1.0,3,0,0,0.0898,-0.001,0.0,1.0,1.0E-4,0.2235,0.0,1.0)0.27320.31470.01.00.01.0NURBS(1.0,3,0,0,1.0E-4,0.7768,0.0,1.0,0.0898,0.999,0.0,1.0)1.09260.31471images.lst1.00121.00122.43726.8740.50060.5006-0.0#000000#0000001.00.010.0125#0000001040.0031251100.00.50061.00120.50060.50060.00.50061.00121.00121.00120.50060.50060.50060.50060.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0.4380.4384.85266.36090.2190.219-0.0#000000#0000001.00.010.0125#0000001040.0031251100.00.2190.4380.2190.2190.00.2190.4380.4380.4380.2190.2190.2190.2190.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.62940.34634.77844.06911.81470.1732-0.03.62940.34631.81470.17321.81470.1732-0.0#000000#0000001.00.010.0125#0000001040.00312510#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.138888888888888900.00.00.0-1.00.00.0000.00.173153.62940.173151.81470.01.81470.34633.62940.34631.81470.173151.81470.173150.0#000000#0000001.00.010.00625#ffffff1000.0031251111110001.0E-40.31530.03140.34650.01.00.01.0NURBS(1.0,3,0,0,0.0,0.9593,0.0,1.0,0.0038,1.0006,0.0,1.0)3.59820.34653.62950.31530.01.00.01.0NURBS(1.0,3,0,0,0.9962,1.0006,0.0,1.0,1.0,0.9593,0.0,1.0)3.62950.03153.59823.0E-40.01.00.01.0NURBS(1.0,3,0,0,1.0,0.0404,0.0,1.0,0.9962,9.0E-4,0.0,1.0)0.03143.0E-41.0E-40.03150.01.00.01.0NURBS(1.0,3,0,0,0.0038,9.0E-4,0.0,1.0,0.0,0.0404,0.0,1.0)1.0E-40.31530an application entry point. The file name is fixed. 0.96610.96611.10819.51690.48310.4831-0.0#000000#0000001.00.010.0125#0000001040.0031251100.00.483050.96610.483050.483050.00.483050.96610.96610.96610.483050.483050.483050.483050.0111111iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAQbZJREFUeNrtvWm0JVd1JvjtExH33jdlvpyUqZSERjRZAwUWCIMtgTGuFghbLlAhBgnKuLDLpso2NDaYqja97HK3Vxl3F7VsY+MuELSFxSAshjJgMRuQEBIIAZLQkMpUZr4c33yniDi7f5xpnxPxXqZm1uq6uV7ee+OeOHHi7G/v/e19hiBmxv98/f/3pZ7uBvzP19P7yp/uBhz3a+F3ZjFZ7YDKTqiJzyTmExSyrZpUFxpboYhArrD7oMRn9/14Xtq+s/3M5qP7TQMAM6APK1IjrevDTHQwI3oAuj6Ifj6H2T9feLq77Hhe9JPpAt6tRssHnpnnuIgU/ZxS6mIA21jRdlJqEyiDEawTKK3znn6m5FoKXsiAfU8/p33kgJGU1zW4rucJOADoQ1rje6z5q5nCXehu/zHwv2n8hL1+ggBw9QSGmy7VpF5GjJ+ForOoU2y2zTRvThlZHIMCyH6mRMOj720AYPFbKmgtvvqLmncS3915zCAwoCgxPAyMq6N1zfeT0l9TJT6Dhflv4eQbB093jwM/AQAYr/7aRXmRvYJq/lek6GJ0CwIYqAGuGZGmK/dfKiy2IHBAsP/RehYB8fnROyEAwAkYiFwBs63KtpFJlBfvrEEZWWAwMKiYwd9jwserenRzZ+qDdz2d/f+0AOCjH706u+qK6ZfkSv07VtmLqaumoQGUDGaycnLaWwNcA1Sbz9AIJttqnBScFDrZ3+hYPCABE7MRKIAGB4iAQOIcAljBuCf7574z2fsAiBgoyPw8rFZI8xcr5r+46bMr//SqV91YP9WyeGoB8J03F/XZ43+pFL0Fmfp56mQKJYO17UxyHV7Zv9K+c/idpN8nY46lqZeWAAognRwD2q0AEJt6cawVAAlXYG5aDCYLiALgHKAcBhwAuDbN6ijwuNbQfIvW1Xuz+374j3jO7eVTJZKnDADVyrUvzpR6B0i9hDo5MNZW2525LQGMzDvV8BpMwncTmsIkSjScggvwb+L89V6pmfdmXPSR5ALp79ExHbsLwFqCAqAuQIWxENDGKnQz8KgCWP9Tzfwn+fT1X3wq5PLkA2D+umegw/8JWfY6FKqLkQazsryrAngEYAygTvy4Ei5bAgChjBeqEsJNAICkjugnKVj3g9Rk91tqFVLhOq23YHbHo/N8+Gj/MgAdC4bMuAcFoABQ8wil/jAq+t+x6YO7n0zxPLkAWHrt6znL/pi62SkYW1NPZAU/AHgMf+epdkvt9/IWv62n4Q2Tj6Ssa4f9yv5DLPy0b7jtuBacVJp/aQ1sOZ2eY8uqDqAmAOQmmlCwrqHarcvqXdnsDR96skT05ABg4apZTb3/rDqdN4OguGQY8lUCegBwCSYGRQKWJh/xO6Ua32bmEyvQZvIbmCAhINEPxEKo4sVCwABiS2C/u3LOGvjfdfM8byUcAAsDBCoMEAoCWGtdVu9TPHwnZm9aeKJF9cQD4PCrn81d9V7q5j+DsWX1rI3G6yGCxrcIM7IC4nubCY+0nLC2C1jD98vgofHiNYQv3iVh9MfTcDGxBg4kyW9G/AxoDQaBqGeBoAw/MNbgGzTSb8HWj9zxRIrrCQVAPf/qV6tMvZe62VYeuQ4bAXXf3Hhk1i2Dd2EZJZbAHYt8v9DyBhlMzg0HY3PvhLduJJB89wKG+C1JDklz3wBD4gqk+Zf1yz/KgGzCcAQA1CXwqD6sy+ot2daPfuSJktkTNhikj/7rt2UFfZAy2soDDXANrlaActnE8WknN5Iva/2WxujuY5KNS49HPpmTz22XlufJwxxnfdN2Ha/+NCIMaYLilDODwFwB1TK4WgZQgwc1KKOtWSf/oD78qrc9UXJ7AizA1Zk+Qn9IXfUu0gzWCuAKXK8AXIEkmyeh7cc0+baTIl4ABIsBNDN9sr40AZSUi46lZE9+aAkLU8D5sYC0TItLkMe5paxmW0PgE4QMyKcA5CBik1+q9B9hM/0h8PiSR4/PAnz06kwf1X+iuvQuqtkouh6AqyUQl0mHU7u2yI6JOpeS766IDp+jfHwitNbrtTK7uL7UWrTVkSaFGveRaHZajqnZdgYYLGyA7zWwLsHjJaAegDVAmoGOepc+rP8PfPTq7PGI8HEAgEi/WL9bdbL/FZUGaw2uV8FjZ/KF8FvDojXi7RQQqR9NBbmmL9WBeTdMt0gne5+r4/rXvJ5oqwQjkoE+r+VJnek9+7osJRI9R67fyBBpLlfB1SpYM1AyVJfepi+v3t1i6o779ZgBoA//yu9Srv7ApHIZqPqgqh/119pEew3Nku/c0un+cxsjdwXSq1phe4GkAzfOfIsRwYY2J/yhrT28ngzaeEyLJWIbDXg7IF2LbV/VB6o+WGugYlCh/kAf/KW3PlY5PiYOUB/4pVerIr+eSBWsGVz3gXpk4noyt0DenyfhmGrJ20ehHsL3tlCvjQ/47wl/aL1jmQA6lrDcoZQ4JhaoUSaNANYjryyKcQAAAxxlExnEbL9qQHVB+SRIEZi51FV9bbb9Hx51dPCoAVDOXfncvFN8loi2cA0j/GpoRuUEySMpKHvcpP7TDF9K8lJBr5P7bx0DANYnf+uFgBIAMjMogdAWDooDUuASLLqlDs3R7yyAZcy/9sCIrI9zP1kPlE2CcoA1H6kG1RXFyZ+67dHI89G5gLkrtmVK/Q3ltIUrDa5WgXIYtMreHFlIs+xI1+3MBtnS/0Yja4gUbF0ZHSsU9GXbyCLWOQbEPtxyilbht1mDRPhsJZqOIFJcn0xTOEJo4J9mLK3LKYfgsg8uNShXW7KC/gZzV2x7kgDwbqWR/6mayC/ikQZXA6Ac+BsncScsGsrOnAkBkWT6guw3yVwqZIRObJA0AQL/J7WRY8FJTY8AmQjY8YfoUi1tSClDC+FlwfMDNuJ2xQTQNakNwLZA3QdXQ/CohppQF2mt/hR493HL9bgL1vu/81oq6DoMa6AeB+Gn/ZK8KD3WxowbISAHwUS+tAUEkRVJLtAQeAtAUtPaWieStqClPRrJzbVYBKfNVjmi4tpXT96SinuPbk8oEACUfaAaAyOG6qjr6r23vfZ45Xp8HGD/LzyD1cTXqVCn8LgEj1fhU7sgOysHIpEj07skeCDB5LodaVbRb3GKWHxH+NrAbBsfiBJE6/l86e/lMYrf1xot9EJOfb4UfkICAYTwNNTHTuAik2lmnQkeAHGOq1c7F0NAZwqqU4DHes8Iwxf2TvzCMYeSj8sCaO78IfXUKVzW4HEf4BohlBL94UKhRmO9cwjT6Fi6AllHYoYbZlbO4JUdLLW7xbKsSSyo5bdm+9uTRG1uow0EMifSvGcP0cQYNaxEYyKqFFINjPvgcQ3qqVM6uvjD45HtMS1Atfd/+fmsyD9LoI4eD4BqgChF65i7CszeaLjBFgnWzra8JzUuQojIfFuaGGiNFFrH/NMBISFoyTfS09sEGHU6kmNthA9CMLGrYHseRQBwrkPKVSOEgK4eCUhxXIu2WHJN+QRUtweGHtcVX5Gf9D9uWU++61uA+6/oZip7FxXU4bI0jN9rOVreBQm0xNB8ZN8BrZMsWEpEkjNxgVZC10KOUs1sHFtDi7HW8ba2JlwiOk9WFdpHsMK3302fBHCwEH6ErNZJKCnoYC0qbGRQggrVyYD/CFzRfcwAqCfqKynny3hUg8v+GmY1EaIIBTm5aa/PDeFx+F+i3guxJf/fJuiGoFIGnwCojRA2ND4BSXpuIwUszklkGX437q+R8vXNDNeIbFljlDPpe5iUsS4H4JEG5fRz9e76yscGgF0v6inQ70IR8XgI1GKiats4uDyetDHVHPbERipf6JCG5nNyrTQKQFx/3AZXTqMNeK3coOHfk7p9PTpuowRMS10ctVkUt4rCHq/CUqT9Kq1PFEKLeqsSPB4BSpFS9LvY9aLeowZAnRUvpZwu5VEFVKM1blS2NdaM0PC4M8L9mQ4kW4xS/9YI0dx5cgCmrQNSk464IK/3p5NzRRu0uE6kgaJeLYXLYG7LIQAuH8BSkTxFkfWKUcMGIU3bk9xpOQKPSlCOS+useOmjBMDVmSJ6MzIiLodA7YacOXrzDVvLLUTviNBM/qPU/KTTYYXSuLZYrNGmbWtGBSmaWgQtz4suzYhi/ai6VAgcm28PjrTzjLl3SUKOMoMtfRl1fqIg4lrEAOoaXI6AjEhp/DrQPmzcCoDy4fmLoOhyjGqgHEc3zI2LUuPeG+nZyISaz+w6qCEwWf9aYWWSPmwxq0HwMoUrhoflXyOHI4HUluCRoGqbFcyRH3cnUUOoOuJITX+egnuN9YprfS9HwKgCMlyGhw9cdNwAyIivoY6a1OMRuK4j5MrRqmZGTt5I2qGCAGpLEhOlCP3qQJJagvR60twjblOrwBwI2s5vuY+UuXmwSAsUC4BZgNsLLlwjNJdB2vam09rokpL4xs1oRDjJPZrrM7iuoUdjUIcmK52/pk3WzTzA/Vds4KK8lTrqXL0sJneoJO5PZ/XKuD2N7+1vZIeKAftZnK9AQE5hdS1k3UkugCGyjeIakjP7aQBN/0iFMgs1S9gdEsiuS5S9HH+Eu6Rb+dso26K9NQO1blpNlmBIrBsAYm0Jo7QCOuYha2YGBRg1AypDNjMNrvQ9VK4+D2d9a0neU3ODiM7guciKs3k0BuvKCEu5xjlBuAaooNYsfzPhSDT2b27Z9iJHfaUKBV0yDuwbYd9cif4wlncqbIp+lBIi/7Z9e45tW7vYMJub5lUWTwXhnh+s4LP/NI8HHxxi27YCL3jeBrzkRbMRLzH3Y+GaE1Br7H1kiL37SozHHLXF+3EYzdNM6BbAtq0K27Z0MT2tzIqfksG1yfmTFFqk5Y4orzFI1UI3Il5CiLY7oLoGj0qgU5xd6d7zcuAL6wKg0tmVeRdKr45MRQQwk5mMCG2zeElq0ws+EQzbFpEoJ3wB2XGBL35pCX/5gSO498ER+n2NMp1OGLByXLOfCMDUlMLUZIaXXD6F33zTDuw8uQco4PZvL+O6X38Qcwcq5Dmh1oy//u9H8I637sBvvflEsxbV9yyDMsJdd63gz947hzu/38dqXwdOvNaLgSwDJiYIU5MZLjqvixf97DRe/MJp7DixAJUMraXplv3VsPeJtBN+5UCT8hAHR67B4xGyyUKpUr0cCQBiF3D/FV1djL6pcvoXemnJmC5SYuJuSwqYhAuIZvS0ze6BN/1EBCoI//iFJbz57XMYjBhFTi1rPWOBH+/kN80Aa8ZwxLjsBZP48N+ciW5H4Zo3PoAvf2MFE71gnaoamJki3HzDmTj7nEmYlUwAZYR9+0d45bUP4P4Hx+h0jOs6nhl4jgswmyBKM+PUkwr8m2tmce3VmzA1paDLFlKXgoGtWSfhAoTVYEsMo7kWkcUwWpzNzoArupNO6z4f+OzIXTW20dnKOYrYmn9tVl4LdLHzqSz8ZUT4pK9LkGqBxp6oMLhi/N1NSxiOgYmeQp4T8lwhy8SfouhPHedfnhGKQmF6KsO37xji9u+sYv/cCHf9cIiJXmYFaf6KnDC/qPG1b6z61dsAAwXw95+Yx/0PlZiczGzbju/6WaaQ5wpFodDrKUxOZNh/sMa733MYb/wPe/HQQ0OoHLJjIaQK789dX8pgxuMkhNAsIw+vKO4EDR6WAPjs8UMr50iRRwCoa3UxCjWlx2MBskBYKDIvbaxfhGfSgrXm5gFdMXY9UqNTKChl/qRgHsufq8f/ZQpECoeOMHbvLjEat5RRCooU9uwfA5URBgHAuMaPHxwiy7JG+cfStqJQ6HUzfO22Id7w23N4aNcYKpcuE2haADT7DnGfxhPjDH8JyTXrncdjUAdTWa0uXhMAIHoBdG1sYirAxFLF8XoaViWNDnbR3yQByHLCeeduRFXj0Ql1nb/Wju/kOOXkaQxGyrq0lmtkCit9ZVap2/sZD4Gj82Rd0xPTJqUIEz2F+3dVeOefHEZ/tbIbmUiFSgeFEPUtcaBcnCiY/B6JsKoBrQHiF6wBAFIgfQFqbcaWG5mmOLlBDL+KRVqKOJmjW5CsQ10EvPHaM7F16wSGwxr1MYDw6K0BgTVw0s4pXHDBRtS1XrssAURFBNaqYiwtE7LsibFK8livp/C1b49ww00rZhORNMZ3/eUziMGoM1yYKJJpkdtNBs8YRvhVDQAXQmyp4qOA1R9efsLEBJ8Ea/4bCymZTSzvLbxZ3k1s5rJ4FDsy6D67xkdj8aZOPapw6bNqfOSGF+OD19+PH/7wCHbtWjWrXxLL2PbKFGE8rg2w1yRmGq977VmY3DQGa0KWZWYkLinvhAxLHolMlJLnGZTKkGXtF0hJKzNQljWqilEUWRoJR6+iAD7yqT5e9bJJzEwpE7dHYairk0XqIQkJRb7ahZbsyF8UQDAwrkB5Z+fqDy8/Yep8zEUAoHJ0IneKHRjXEXJIKRESO2G7kE/6oCTca2zAAAEO23Ai6OVD+KmdNf70j8/Bar+D5dUMYeuYZNq3CEGVyvHd7+7DW9/6VZQlQ6mkw4gwGtV49nN24DWv3AwMHoZLQMncUhCkALFwY2Ylu5jmbsuyvYd3vOM5eO5zdxrrAmA0LvHwwyv4+j/P4ctf2oPFxTHynCIv6l6dgvDQIxrfumOMl76oZzZLSVPDoguda3IkOhRhMYnUnS+msDkwjCuwKnYQ9IlAAoCs09madbin+878k0/4EGBm87Cdo+YSQMzmuBOLOE1AL7EEzqIEweqVo8DqPKaKDqaKPIApnfnjZJARluYZ73/ffozGQJGnVIagNWPzlgn8p3eej+liv5/CuL4FaG5BR+R8edMCkMpx5olLOO/0Ghg7kGd49k9N4qorz8Ud3zsNb33bbdi3r+8tSJqZHI2BHz1Y46WXyUs3SV8s/FAuxmzgCDEfMFXVlUZWoNep+AR3fQ8A1Z06GbwMrrXoaQJDw1EFv+sa/BRGn9M3KVISlsHkEPyNRNlDwS2EVdDl2Mxu9RdzIKDoY83AH/3ZAu64a4BeL0OregF4y29dgIvPWwEv90HdMEWt3QIo709JcJ/gw6khPKIM9WgFWO1Dj4WrtL3z7PN34N//1jPxjj/4vrUg7C2JqyvPCfc+YJZ5NcJoAQJXnrzgXZ4hsRjCOjSiB5McAdPUSQ0ADIfZicWENmTBze/ziGIxB5TEbBZr2sjGqcTiXHjeEEBAoVEuQeRuVroHEu+yHphU7t/f2MfNnx9jciJv9f3DkcZVv3w6Xv+qKfDKgwArfwmlVKsFUIo9B5B56sDm4xPYukfDp5ruiplBC/vxwou34IQTJnDkyKjVihQM7N2vUVccXKsHASJAhSjAhXchPG+OPopKnPXVRr5lSTsc3fUAKEtsR1csooyWY7mLByZKlveDKMziZpily26gh6w2eUtgC65hAQRpiADobpq6CnfcMcZ7PzBAp9NOsKqKcc45m/C2f38K1OAhaB0sFTmBtswbzTI2LsCGTybKAZSwAG0AaMxikmycCdPZEk7a2cGRI2Vre1WWAJ3T+swBNzgorRNDlHGAcOeulTvQjHFN2ydTADDUBmgdX9w4f7CElTdhohXKlaEgLFHW34Q7FMW4CS9wg0lSG0CgHDh6uMIf/ddVrKwaAhX4prmO1oypqRzv+v3zsG1mH3R/HCIee2trWQBH9kIa3d7RMQAQBCf6SPRfWdYY9GufQQzns22PgSazTtLccWbPCToasXQmPz4tygtEDWYGtEbNaoM7HKIATd3GrBVNYWte/zIcgSQ4mI2ZJY4tudsWjgKbhdsKNuowN17gwh95QTMaWVXAf3nfCPc9BHQ7gZNIdl7XGr/2a2fjec9aBi8uJZbHlD+2C9BB3SxgjmkBtBBIVCmwb67E/rkaRdGckMPM0AxMTxXwK4bYxPkhYRaGjZ39jQd+ELmDJhgTMJh6/EzhMBqYUR5WmYiTNYxf9+QjJIQjBffCg6/DyNUeV0mjZdjoz43GWH0Zygkfv2mMz35ZY3Ki2ZFEwHCocfnlO3Hd1RPA4oMmUkk7CcfLAZwR4OMDQOJ7CQBlDF0DN9xcY1SabGLbq64ZZ501gSyroGvr7wXTd+1gl29x1+I42ZMy/sgNyHcDVi93MRxcC7RYsqYoBoEHuWABLjy0RNEs/0r9FEDOmkCATBI+AH782Yd/DJUD37mzxl/eoO2YQbMTq4pxxpkb8Pu/sxPF8CHjyXxPSVCqdcJAhvIWILgkkwQyiSAZBTgAKAVAse0etu0B9u3X+H8/qfGPX2P0upk4L41YGOee2QWyEihjjYaVs+ly02Eux88u4ogmhIj+lX5fvjRHYA0A0EqgSrD3KE/dNM/mjYNt0NbyWj9O0p+7OlwOwdciyoiyKiccPMD407/RWB3QGn4f6E0Q3vbbp+PE2X3QK2XSTtmpa1uATFkSCJm+dqN77XkAgPCRT1X4yrcY2q7vJ2bs3Q/ctwtYXGEUufLBT/rSmrFxNsdFZwOodEieOubveZbLuAoX7S1BfI8xAZRRQFK2AQC/i7UQvidpAkk+McNxGWEVSItyZLeIVZYnOKh4JWchr5AvJgWMx8B/vZ7x4B5Ct+PmE4juJ0JVa7zhdc/AC7zfd/eR9LZt5vouAPHDQ7B2FOBet32XLXe2GssEpcyEENfmtN3uVVWMCy+YxLmnM/RAC04V+sa4A7eKSJC+aPAoAUR63Jd3LiBYJAGAPBT2AltD4xnBnCMkOLzlFHwhRZ9P77hT29SDCJQBH/sUcMs3Cb1uTPbcazxmPP/SrXjD1R3w4iPWLMpElmg2u8u5gZ+4jFLmphh1uGe2qWOlWgUIAJ1CXiTB3BoJKiePTi/Da35lGrmeMyskmCNdawhTnhyZeSkmNgKMFu+mBDGIXYSBnXAhy/BjRhgLPEQIgg/Yjgj5HhcxiASLjAOjJJG7UUDlwO3fU/jAP2QoOmH1ucAHqgo46eQO3vqWbegOHzRTrKR1iqxX6Kwsy0HQLRbAhGQxi2bBAdYX6LFe6bnDEeOaV2/FCy4YQs+XPtXulcQ3Q3srgNTvR2AQJ7WAg0Q51p0mADQmYhR5mi/YvfvNS7glm+fpghs7sOSQQ0LGCTwe9bODPDlw8BDw3g/nGI4IRdHiPxnodBR+89d34pSNe6FXxiHkCyMnoYN884xPb0sFK2W5iASAllHA8Qn2WC+tGeOS8fIrt+LXX1uA5x8J7B6pYNl/jAW8js9vA0cUOgIaLQCoMQ1wZnwEkXEBcIJbw6H66CAhXN7mku9IKOv7rWly+RkZMSgFjMeEv/z7Dh7al6PT5agagyvCeMz416/chhc/ZwW8sIQoWZGOhgVJmTAwU2ZCRQqADCAX7orT6BgAOF5QMBuXNTOT4XWv3IrX/7JC9+iD0JVojJftWoLEmsJnR8B9RU522qzD8FYkQ80TLQDgaZhHmoQQyPSAcAMpHYiyTSEiiPrd/kSO4IhMEXkzzbazgZs+38VXbi/Q67oTg78mMp148bNmcN0rFXhxzkcbcEknCQQ5oGQvrUiBlCF38pVp+FSwDKUCCWwXdl0jzPCNOscc1xrodgmzsxme89Mz+KVXzOD8U1bAc7tQlxUIyiqdmCrfiOeFUL2VQqThURoY8IrLOgwVm/7OUWOqBQDYCHAHka2IhC3Ts4JVRR1PotVxZ4RUMYsSNnRkQHUYt97VwfWf6SLPqbXDtQa2nVDgP/zGDKbKXdC1DjyiVfFFO6yQlE3eNEcDRVSiYxC52UXy5TT1vPMnsHlzDjcL2L2UAqanc8xuynHuOQXOO7vA1qkBsLgb9Z5Fcfem8Z6ktQk9mZnVSO4giMN9Zjf7ynFCf37XyLoJgCkA02A953PcXqRypo/0/0pcsYUFt/1m5KM9f2CYkOnAgQx/8dEpjEuFIg+dKdk6A/g3123GmVvmoBdHLuEQCUXkYxDnpC0HWMsFNMYCYN2SQpY11rhAaxP5vP7qaTz3kq6YzQO4gQdyD73qLwLLi9BHhp40+zBPyDDWdCdkYZFlckdaqkTwfusdhhg+ttrKk6jaSOBYTwD5LMzmhBb5Ih0bLINYpeMzbu7q5BL04Vg6rhMhwWTQRiPCX3xiBvsO5+gWJqkkNY4IGI0YL3/5Rrz0kkXw/ALQtqyRWtbluY51mFXrAcCuWhJJGKUUMtUEABl/AizsB/avgqvAgN25WrN9CISDnxNFbO6piR00nkvUyvQFcNZi/bIvWINpBnXdRgI5R0UbQVBhFMpPfXIIsg1zmifYvRNAm6TlaKKYyW6wooCPf2ka3/p+D91Ch4kZvqMJdc141rMm8BuvrUH9OfPgLf8AigRU7oM1fdBkLTpDwXIAanEBfpKTHQyy96YIDQ7gJ2e4ftDaPxIh0hUATMrSqGCyZTrdfVqT9HlQhMgksqoREFisDQxuKixDU6gxjZpbE0HAkDdhgroAjwFNZr26CogOMJDCT82/dMbiGNvIgkPSSGXAPbu6uOkrMygKIxwpePfKMsL27Rk+/akF1MMphLECRClr6f6ne4wtmzSesaPE9s0huUOKQNxc3ZMRzIQMuRqcjZCJuBGJ+MEgkT2MI1A3eBNG9qQaeIF5oQLRAE9ARnKydAOiDiF8N17gw3AbcxN1MKyno01tIgAMeAN6atLuCCIaR0qE/Bysvmf0Hu7CCXP4TlYDdHAnJplDuPGWjVgdZugUzdBJguCLXxziC3oCoEms9SKfCDK5/SIHJnsaP33+CL961aLX5jYXQHKgSgyIOQLYbgGcb7acxloeR+ycL3Yanvr78LskeUJhWomhfYmxB1mOZH1WXm4AiLMpDOoJyH2NwqRQMMZ1D5XagoLnE24hWJGjAe6iPp2LEDJ6gMiowd0FWeLH2LW/ix893EOnCBpJa+Rcu93m8bSs0UyJTsJgpPCFWwsUivCcCysT/ikKIHb379yCDoMB7AEQA0Yp6yadBfBKGk/Fjvy8q1X48Thsky4glIlAgKgSPxVMjqNFeQFvycz1S2zEuMohB9TDpFBoVFxgjE0oso7dFEoIjhksJkCwnEYtyaGMGEKrAkH0oGHsOVBguZ+h22mPItYCw1qvdPq2e030gO/c28PJOwd2WFe1cwCqg+8kRkZAr2eAlJJAZqAoCNNTFG3/0prLp2A1GiGdLCeBQGsInwM4A+EUIJT1yPOowIhnUGmKUuuN5eEr9Sym1RS4nrcnO9WEZZEEglgQ4uqP9reRCRkbLiZTvMBW2UiBoqd1PHrhH6usAlBrBdUxOYaqasKNAWzZCKiMUZemrXnG2DgTtreNAUPo5ISpnvYAiIQv5NsUZKrtskysuQ3hR+Y+gIrcAy/kOVq4snwaq+Wk3YAjoFmwLqPd/XoKldpixvH9RUWjNMzTKmwDomnJWngfGbZoR64ETEvGaacqzM4qMMdLqdJFGMf6O1ZZrQkbZhQuPk+j17UATspkWYZn7BjDbINrMmiZqnHyCbUlgsk1mbBxA7B1Q2kebu6ijlRQ6aNr2oZufTmO+8iBxe0+JpI7blc1fxrk0nCO2kJMqNUm9Mc53IhMEwAwPmWsOxhis3lwoeaWhlsfo+VcdQ68woZFrTfqH9XDqGvGaSeOcMUvGg0rSzNOIP+A5rH1/uys59AH2swp6PYUrvqlDk7dtohLnpNhPDZ1O2FWFeHEnQoXn1uBx9rMbAaDyxovvKTCzIyym0KQv8VxCfzs8wkT+UjILBZUWMwh+k6vI/g0vo/2AwjnMlhgheM/iL52BFVNYqCnMa6VX5/gXmFSKIyL1iAsVxsxnW+yj35TiEmcKx0uxirObPmpZME/CNMUwja91Merf34BZ5y1Fd/4psZDD2j0B83JGuYsaqMJUYmoZQxs3Khwzrk5fu5nM5wzux98eAXXvHyEwwtT+MHdY5QlmxBzR4Y3XaewubuEuk+e2LEGTtu0gGtftwl/dwOwvKyhtRmhvOxFXVzxgiPQS6UFK8Q9uq/SLbpIIeEA0bu0nokVSChEPAIYlwnhpf3e2YSlQdcnFWVHRhzAJbdWqkmMe5uRq0NAPRK9KkkhhUkhlhS6xaOsOSBNgsA1TmYRH9mPS3cOcOkbN2GketCUiaST0DoHAjH7qA0AsnyGGh29AiweQX3A7I20qdyL3/vN03HfI5OYOwhsmGGcfTpj02gP9NGRSH5ZpVtexUsuOoALfupEPLALGI4IO3cAZ+9Ygtp/IMw/TJM3Ul8iAshr/CbPCfX5HcTc3dnfWdbXxjUsgCjrocQGrI5UWBUlmhiTQDJzYiousFRvxJZsC7jaG5M3OeKgk++2jCT7JqvM7kOcPbSupN53BJibD2v8otEaF59xOJeaAAhzS0jMaGPUWkcArPsjFPt+jAs3zeDCEztmyfTRFdTDUVSfj9MB1HMHsGNyGTvOnDThwmAIvXvZjgJK6+aEID60bZqxruBjAJA4BB9lJBFC6qYlOIotWBp2UNV2yDvBaMMCuI2blsoZzHY3QamjYD2wGm3NmBIJn2QvfB80JAYgjC3YAyqAwHUil3UQfKzQMRBa3AGLcp6Kpuu23ceqRn14PqDUL3YF5JQyKa96pQ8srwogUyxoyO/y5DXMvJezEKoEnuBODohhxDHRek+wheBZA2oKtdqIxb7plzbXKvIArpMBxYxR3cFyvQGzna3gwR74oE+OvcdDb4iGe9mGZxTMliF1QFgyRqFDJXKly/E2S3R045pJr0Y9DGE5EJ9HSTl5zbaxDglCqanp9dbV/Ph6fudEzZ4isPiNo3MSwYMTohgAwExQxTYsDTKMKkJWOMMa91cggSoA2/XB/HgGMxOboPJFcLkIVo5orSUA24hoto+YEwjnDsSiUl+fuLD3JrYjJfdsrCuU2iebQ83OapRpwUwjOdPit9c8Jr6nw9Sy2ULbwzprUS1HFUWXa5RrCN9alXwWNc1gftUOujk5gKBE8NfiAoKFHtUdLJZT2NzZZh4Rpyu4hZ+JBw5vDMsN2Gsdkxi5s8iWoIjvikyyKe3Y6GsLUBovKW3BGQhh2puvyw3CSLeUAq3ZlFhQLVzANy/wAZ++FeXZ9QnLsQT7vpavh/wcyrEVK3VOwEJfY1RlyPJAq4liUhkDQCKFAEWMo+MpTGfT6HS2Qg/3+97wTwWMLHKb2ZMdKR40BY761lcmOguN39YQsq8oKSNN+Voa6lxaq4QhcdlO4hrfOQBLClCkzV3IHJoQNDfUlZh72e40BHTn2mtR7wSMdQdHV8yUM9c1JoO7hguoq1pTZl1BDTC5EbscR0dT2DGx2T63dhHCxofJo5EgRAekx5nNMLOfPBLug2xHEZuh6EixG2hpwwLH15ezaWi989IDabxOLQJHEGrqamTFa0QKTutjytDi51sndsQADKuINZBtBOWbcGRhjKpWyN0GVwgcoK61h3wAgObSic2tpQeZlbmL4x6m8x6mu9uh6wHAYy9AtnFwFJl5ly410t2lNb92kIitgEiAwVllRjAYbhjadVQYkk5HacIH61Ds1zbSug6auLXSpplnea1YwIFnsuCHdotcUR97oIg6U96SmnvfFPtdM0BdqN6JWB7WWOyXINWFm9Mo09+1hn/8S1gYovWqY4iKyO/9o2x28NBgEr2pCll3J3i4G2HygvPzkhyKREDEOoUplEvCyZm/sAtZRNLDBJ0AFodWOXomtT5JeQrO2RRsNPMJ/lhkvtNKGEHo3suwT1MQyKTL/e9iPx9p03ULoNqGfyOSJ4+5AwrU24lK5zg4bzK4foN3DzqbC6nrVVe9V5/VwXBBielY8cYnjFGd4dCgC2TToM6OuHEO8m7cgzk+3jBrCMf9+IDpDBPratN5bhBJ4seh3b275L+LhZ1Gsg6PoQHbmTku7y4/A2k+nmUZuHaI33XahiAcsp85rRNC8G6AR2q9GCdp9hHHwmc0Bp6oux3IZ3BwYQWjsoYCeSCG5XCGfA8Gw4WGBajK6hBRF2EzZyN8BYCVmVe3OCrQVTk2T2wGdAkeHzQlhKtNdEtYBeH3vfaKkpF7CGrF1lrEgxgh2eMpqY0cXMhFwie5VIP5ogFxJhA2rYxm0ApXknKR4FaEm+HkfhraKz7LYo0y7ntsaZqRQEADdbaBOltxdHEFSytDZKrwM5m8Ejt5kkI1rg83ADAYjh/W6ELZ+VJ+ur8jEAQwEQ71C3RUjenuCQDX4PGR4IflDCBnLlMXEHnLNveAaJsAV698xp4HjLD40g8HjyBn3woASfA5vOlkzqNocVuUKV2Gh6U3721CTQUeNT728ZHgk7o8sbVWqrMFqrsDy/0BDi2sINhuc89m87bAAUAKo6ryj5T1ABiV+sCgX9aKVMaoo2ScEvKqWWFuJccpMyW6nR3G1JXzEEQgUjkf2niMUEuPik5IHqkunGqAsfMFAmzpadHaRCkkQpg5KzNv4mz2grVxebQhZowCFiOdfnhWgizV9FSovgHc+HnN+B9G+FRsBnV3YjgqMXd4EVozMmVSvsqafafACma39X6/rAflaL+7Bc8Bdh+YO1BWejG389wUxblj5w4yBZQ1Yd+SeVfdnaBic+zrXWO1OFbDP8Il+NDEJ0dITzrK+Uf3XiP4Uc8dQmeyXd8gx+iJ3WXY9mEyiYLDHDvv3xH/xiw5AcymhZIjOIFFPAHNvmnpI3YK0ygvweOEvwXUOwllWWPv4XmUlfbL3kPYFxJqRIxMZRjXvLB739KBBgD+9kM3z9Uac1me+VDQPyKHhBmBWcwxrBT2LmqUGqDuiUCxNXRkSv6ibJXVHFFUksCIkCVTtEOnJZ3oySQHMpUKQFtiBgcMnQggEbQWv8v2aTTKt4M+aZ9vp47ew+QOjold1CdJncU2UHcnylLjkUNHMRqX9lFL5BWVrNBJBUDkuYLWfOBvb/zcnJO7dwG33nr/8vLq8N4tk/n5ZKFBmuy+OYYTgAwonH8elIS98zVO2qhQdHeAUYDHc0aIJKbSxk4SgSNYnylWElHkVd3J0kUcK6PD7YdlVVGRtfK8UuuSY85VsajD3VfDjjsFEDWsSQA5eZcnMMAK6G6H6mxFWdXYe/gIBqMxMsr8OI6yAnJcOgCCkGU5lhZH99566/3Lruqwuo+ZH5k7eie5TZTsqhiPJBFGmBU25mKDMeORhTHGZQ3V3QqaOBWgLsB2f3rNMaobGiQ1B3aNnTDNci4hUm1INVJ0bKv1aDueanFb+eSagBnviHyzs15osQLia2SdOP4cuQeEurQG0AUmngHV3YZRWeKRg0cw6I+Q2dA9PGxNys3yAcdoVIY9B5fuZLF+PRoL2Lt/5fbVc2bLPKOi0lL4Ruh+2p+7GDGgGMOxxp6FMXZuBCY709ATp4NH+03a2A/3CjKXbjgRaabbZRSCUVs9E8YgaDSjMfQaETCZUfKmaG1thzwv0cRUsxvnuDawOCTdoCgblU8+syjEDOQbQb2dUKqD1cEQ+w4fxXhcI1NB+MRkzL113c4hODllmcLqoC73H1y5Xd5OlEf9yGdvvXt5pZzL8ywaFnYZJe9jKJysLGEcjzX2HBliYXUMUgWod4pNGGWIEi8S7dKXt02AlNrq+aLwmd6/JxMrU78pSVubX47qEmX0GmVdY8TvHP05n95yv+mz/6I2QdystiZ/B9TEKSBVYGF5GY/MHcJ4bBa4EIDMp3itvHwGN+znTAQUmcLSajn3yc/dcbeUeWQBvvrVb+8/uvjS23du6pxSktV4t44Pdlsgsht+KLMRogEEuUEG7JsfYjDW2Lahi6x7ApBPg4cHgGpZjAY6RRT5gnT0z/tPGTa6JJLVLR8exhpGaT0uhEyXH/gBGNkeXpsWCMX31knOhpaxM7ec1/DtyTHvIwDkG0Dd7aB8ArqucXD+CI4urIAIyEhZ5QuCVyA7LscWHAEYRObBF0eXRt/5/Ffv3i9aEFsAZq7u/OGeL5VV0G4nYIChbMDtWKZb7+ESRZmdWXV0eYQ9h1cNO80nQJPPAE2cAlBPaIUWHKFNy5IOivyjsBK1sBY6KGfqd1knWgoO1sT3PTczxbIO2TxpAaJwDzHvSdsb3YuOL6BrQPVAE6eYPssnMBqOsHv/ARyZXwSR3bGExLxHAhTbBBYRFIdt8MiCQYFQ1sD37jvwJWau1gQAAHz6i/d89ch8/2CeC/9C7HeBdxeTRNAAgj1YMgX0hxUePrSCI0sDoxzdWdDUGUBvJ0AdG0sLtwCddGbyLjsuXYARkSjz3ecafGjIDZcSx+tJXTr5S91J3VJnRAglwRMWygqb5f1pbYjzxEmgqTNAnc1gZhyZX8Cuffux2h8gU8oL0ymcfJKt++7Jn7MQbMz//OLo4D9+ffdXUnk3APC5L91275655W90LA/wIIDMCcQhhlKOhbIvnyuGrjXmjq5iz8ElrA5GAGUmUpg6A6p3EpDZnclqHRIqMlZue9BzW/ztTHEj/kaz83WbcIFm4ma9P2Gh2qKSaBUUPEfwFk8zSGu7ydYk0DvZ9El3GwgZVldXsXvvfswdPAxdaeRKQVkL7CIyZad6KJBVQo4GX8PWCWa30t0HV7/x6S/deV8q78baQGYevvPf/cubLzpz5mUZUVHbG1WKvM+HNT2y9xUQT2qEISIAY3U4Rn9ujI1TXWzeMIFetwC6W4BiFlyvAuWi4Qhcwee609Rv9EqcdDIzuXXPomhLO1ENS/4hz3FfE78d1Rn1XAtnCKgJmzQQWOWgfBooZkH5FIhyABrDwQBH5uexuLwCBhuWbxULclTPkXHFIeMHxwccMKyCKoX+qKpu+fbuTzHzIJV38+nhAE48cdNpn3rva24++5SpC4eDAbguwVxCVyW0LsF1CXAFXZdgXdtHzGtolilYjdqadud3da2hFLBxqodNMxYIUNYfl6BqxaxGqvtm/iFq3+FMfraAGCSSdC/5bT3ANLNB678cLpib9UkCJy/jNB8MogygHMgmQPk0OJsGZR0/Z2A0GmJ+cRELy0u2j6xuKyF0RTasU3ZjCkfylH8HEVRWgKiAyjqgrIvexCR+vH9095W/f8uV+/fP70pvLW+737m5hd1f/87Dnzxr57kXKjLsHyym8pMZHvbLteyom0IY99YI352sSBG01phfWsXiyiqmJrqYnZ7EZK+DPCvAnc0ANoG5BvQIVA+MhaiGIGgw1yCIh1rKDaQcQCxxZKIWLKxH76n57gd22OyY4moQzxOIiCoBQAaQ3VVKdaGyKSCbBLIugMznVKqqwmq/j8XFRSz3V82jepVCRlKbXTinoDjO8ysxwcOl7oPvt09HIbMd/Ve/O3fT3NzCnjZZtwKAmfX5z9z2yZc8b+frTj1h4vSRNo8q9H1O8R4R2v8Q+gswGz5ruz+gG3NXdidxZo3llQGWVwbodjJMT3YxMzGJbrdAnmXgbArIpgBssVygAukSzBWgxyCuwFwbDeMalAjVr2FoE2wEghaTESQd/Bo1SzLcM4hzK/QOmAqQKsCU2/2OnJAYVVVjNBpieWUFKysrGI6GYACKMjN27/mVECaH0T3JvXzL3Tlkt76xiqmI0S0UHj60+tD7b7r7k8zc+szzVgAAwI/uP/yDW765+xNveMU5byVLNjTcticiIIYDA/vfXaZQcwwUdv8oPG+IoTEajTAYDHBELaJbdNDrdjA10cVEr4siz6HyDMQdcNaNxWj9PfHxmnaX3WsBhTfxoo41qwtA8kJg540t+AHUdYWqLNEf9NFf7WM4HGA4GkEz++cV+8UzLm6H1HJBumVaPjhDI2wmfwuKQuJOM/DFO/Z/4kcPL/5grR5ZEwDMPDrjlK03XvacHb/8zJOmzhwMSotIKUiASdtciA4PFtHmd7/pmt1syi3T86SZLKDI7N/HWmM4HGIwHGB+wXRSt5Oj0ynQyQt0ux10igJZnpt9e+yun54mScIYDsRSdCYbciIni+PuXOnfJRjIGgbD6g2pr8GaUVUVRqMRxuMhxuMxxuMxhqMhtK6t8NyDqsO+BhT9BeH6wR0nbOcC4CZ2kM8GBhcQhrJ7RYb7960+8H///b03MnOy8PE4AAAADz1y5K6Pf+HeD//2NRf/x0xB1X67MvtHzgJY388CGBymYriZMspyBfN7SMiY4zZ5kZFItmgMBkMMBv3gjgk+JqbM5Coyu8ebmz4WBvRbhNmw+OKHRNvbGINfpwdAa8NHdF2hrmvUtQ7Wkcz0K2WnZplFIe7duVIW5hux8P0/cdxFA5HQ5bnmX6YIo5HWH//Kwx9+aG7prvVkvC4AmHlIRB978SU7f+HS87f8TL9i4YSM6TVTxxjaCpA1/DFHBp1pJWbzCD9tiCTbRRl+3gXI1OOshuUR8nEpDEBXNSpoYKRtO7UHm3wL+/05QEhaGgtaWgMHa3Jz0/wStlDSC8NqHbkkjc2YhVlUDLciyEzRtk8mkULmIFQ5+4qY7YrexFow/OMK3ZZ3bvIHKaBXKNx678K3/ujD93yMmYfryfh49sC+5z0fuuP9h+cHC0XhGh7MleKQ/PEZKWcgYJ5NEdBqGq+s1itm83QNCsOZGUSGi2AnNoZwKIPJSuYAcmWyjrki+6eQK4VMEXIF5BkhI/kbUGTyO9k65LtCoRQKZTJoeUbISaEghZzcZ0KmFHICcpjPCuTbnomEmMmimjZnpH3CLEPw18qVCZoHN/GGICxFZCEYisknh1zc38mBw4vjhfd87MfvB3DPsYSbH6sAM1dE9LlfvGTnjddecea/zWCic6ssIfRieKRr5faElFxAKqjTKKGkIE8OrfW35zhrEDonWi/qtnORMbmdHhyWiYfIhAXhczRBnhaZfQ6g9gcjD5MSwUA9nNYqRw6JvAXxTB+hXJr7aroCYz3gQOWAAUtASUOpDGDg5m/M3fjpWw99Ls37PyYAWBDsm5wsrr/gjA0XXnr+5uf3B6UgghpkHnjixOAfHGmNefT0cbE/dhAsw5UMEQICrgDyw78mKjYux/GQaIWtAEk0AdW5LVemLWEkg4IWzhAlGF3CUYAZbaGarYu8GxHPYYbrE4rLROTO3E9kARIu4O5soqNw64+Xvvn2D9x/PTPvOx7ZHvdjEAaD6o7f+6s7/uqRg6t7e4XbPpWF1lizxTZnbTy6B4cbvnSdZcw8+ZBFLhdQ7MozMmseM2tGXd2Zcm4E1hTK0Un3PZzjzotGMG1nKsTzH6Nr298zV47cnsPw52VAZP79+Qh1kQvPLCl2ShLmVIh+ce1js49CWsYv8tSBIvYKwiOHBnt/728f+KvBoLrjeOV63ABg5sFtPzj4+f/ykR/89eqgXO1kbvaJFpzAEjeSHUumDLE/FoDBotO0zWDp8MfynFBGgQVILIew3zOywnLfOQg3cwK3dThQxUAIgAhATf/MNSK+AjLtQJgyF8x8cBs+Vgdi4HEq/HhI3pl6+fAHsvfRyQj9gV79s0/u+evb7lv6fFvOf63XcbkAAYI5IvrYmdt7O//tFae+KSdkfgWBNclmWrVzCeZOzNNCNBgaRNqzef8IdEeaRIgVlhg4ZxKF8NZasHC8Ngx0vQy3KCQ2+/6hi4L3yzrCzfpT3Ik+GpGLlNxM6XCuWFnkXIkgyBCXSRZBheZAZAWdq3Eu1B50Vjcziz3rD3zxwIff9z8OfoyZ5/AoXo8KAPZ179v/+u7rT5wttvzKC7a9kslNigmd48gbeYIXHmniuJNZ/WuIjV8S4OTAgSi6/9nzB+0dNEdgENhwgo9WiwhCGLEMJMIn2Qhf3oHZy8mX1/ZwCA1BIZXrGLAUPiXgEFcWoDDWM+UgbsmbeQim2Un9k986ctPbP7DregD3PlphPmoAMHNNRLe/8T13vn/D5LMnfuFZsy8ra0Bb7Q8DQiKN7kbFHDnkQBZdNtC/e0vir2e1W7TBw0p2nYzPWZTlRieH31oOtpYXz0vgQNT8Z3vcA4OloGwZGx5Qgga/R5BrOydlRPOUsCxKEboZ4QvfXfjMG//bj98P4Dtr5fvXez2KZ2FFIBhXFf75mj/53vu+/L35z3XyYL7NZIfg49zYgfPncCNVzuxz8JM+7IKcjiZIofOh3ncGwmX8urYkNBA/xe7PXstfL/X5sjw8mQ08RvAKBNLppmhFJC4dk5f5M4h75ODrfYJHSNzVl2ydgAxANyN8+e7lz13z5/e9r6rwz+ule9d7tc4HOO6TiTZOdrIX3fB7573pFy6afVmlNaraTKgzZt1l6ORqHCNpl+oNM2p1OO7GHr0ZcOXiqTrxqCyL5EFsH0ShyFc3J5y6Y83yadRIog6z8VWw9WH/AitqhskQ+uV2NsNPIbCToz7xPsgq5BCUSTplRLjl+0ufueb/2vX+/rj+EjMvPmYZPh4AWBBsyoAXfvB3znn9K567+SqlkJelIXx+eZXz3SL/7x+VpnWYZOmSPmKKNAtyGWZ8oilsmWkKmQZEM4HaYn8kAAh00/5MCEvNOfqpUZ1YVx8edRfAQD7eVXBDpkQuhgi/u3SyB4AtURQZaqbqU99euOm6/7brQzXwdWaef1zye7wAsDe5AcDPvOeNp1117eVbXzPdy6aHYzNW7wXot6XRfs48W/egxXRoaSUCIKzAIcAieIKMQuB/l8JtF3njPta6QV6jgCWLIh/op2W5zSf9pkxuyRaUtwxG0O7ZBWH5tmH91gpYy9ErMqwMeOVDX5v/u9/90N6bAHyDmZcet+yeCACYG6dJAJe88UVbL3vnq3Ze+4zNnTOH49oTPhYrbd30ErLTyPykSe8aZFkOs4adVgN2uZSQhK/Dnh9ztqY0G3vdCRPhowC5QjrUHbSaPW9hMTXbCFzsxI+g+W5wy2BAwY3qyK3v463pFXodhd1Hygf++BMHP/SBry58GcC3mbn/hMjtiQKAbXgHwAXnntz76b9806mvvuTMicsJoFIMk7IWgmQLBQ7DwVqLp2DaocLI91sAuQUZIZ8gXIOP2xN73RbrU1oADTMve6ixT2UsZgGAZNqGm1dPIomrrEXg4Pt9WSJ0MpMiuu2B0Zd/4//Z95F79g9vB3A3M4+fMJk9kQAQQDgdwLPf+6sn/+Irn7fpX22ZVptHY41a1yG6Fy7Amf1A/Jw1CGPFLMw868TEOyviz5dSJGEN4sBRvuJeEJofx58yK9NCDENO2wvcBXiuGY7Q+bVcghDaY0qZvP6RFT76sdsWP/6W6w98DsAdzPzQEy6rJwMA5j5pE4B/cdlPTT3rP1+985cvOqX3/E7B+dAkDaxrsJqtA4uXhC5s1iS4QET0rFCdBXHfXUzZktQJuJDJBUn7zXcj62OQPnEw8ETp320E4LM7Qcjw/l8QPiL0CoWyouquvcNvvvPGQ5/8yj2D7wK48/GSvaccABYEBYCzAZz/9leccMmvXjb78pM35edlxBhXWph/wC26ZG0F6KaU+/SyjRqYwzRlNxJoz/cJJpEpbE38iO9tQvVybBW+zXY6nx+5DZ/OMY/fJZEfjKICu5zKEkIFhU5uRkD2HK1/9N+/tvSZ//MzR28D8EMA9zFziSfp9aQCwF+EaDOA82ansrP+4Mptz7vqp6deumM2P7NQwLjUqOVyKrih3sZivMgCyJ1/WLssYhCIU3wzMYG8MYhIIIRFJ7PDtjUjIquXcIM0qpSpA05yACR4gavQzeuzHKGbZyhrYN+SfuAf7lz9/B9/euHWhdX6fgA/YuajT7psngoAWBAQgJMAnL1tJjvtd35x9uJXPGvDZadsyc6bKKhTaY2ykkzfkT1J7uBzBPJhVf4Rav68xtXR0P+W0E7gJ17EnJ4X/WaBYwt64uen5lpQ+GdhkJlplBP6Ixo/Ml//6Obv9r/y5/+0/L1Dy/UuAPcB2MtPkWCeMgD4CxJlMEA4A8BJb3jhhme+5vlTl5y3vfOs2Qna2S2AWjOq2loGrcNgDALR8xrvxhlaNnz2nG2NFycabeoN/p+THc2ijZbTcICDmXeuwF08sw+gzhRhVAPzA973o7nquzfc2v/2B77R/zGAvQAehBH8o87nPy55PNUA8Bc2vbUdwKkAdpy5tdhx9fMmz/r5cycuPG1r9szZCd4+06Upp+2azZPGNAtTTyaXINm/CyelcKJ8ERxblwQvnEDp/xSb+shCJAEHgewcR/e4WbOCamWM1YU+H9h1tP7xLfeMvn/j7YP7Hzis5wDMAXgYwIGnSuMbcni6ABA1gmgawA4AOwFsLjLMvvyiie3PP6M49bmnFc88aVP2jG6GmYkObZzMMVlkgf0HwQdJeNn4vE6crYtfcoNI1yDEHoO5ca6zSvLMqmb0S/SHFRaHJZYfWdJ7vv1wdd83Hxg//Om7xwfKGgsAjgLYB2COmVee9r7/SQBA1CCiGQCzALYC2AJgBsD0WSeo6Qt2dmZP3Uwbzjkh37ZlmmZmezSTK85nujSNZFgnucsYEQBiSkhYx1MgpJtE/QxeHvNKVaFaGOrlI6u8fO+B+tDDR/XS3XPVwv0H9QqAFQDLAI4AOAxggZmX8RP0+okDQNQ44yZmAEwDmLLv0wAmYWeGw8ijeJqaWMKgo7J/fRihrwBYte/LT5d5P57XTzQA1my0IZIFDAAUHtvMpifiVcEkpSsA5VNN4J6I1/8HBq3Cgi6UwmIAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDUtMDhUMTE6NTA6NTUrMDA6MDBXfw+IAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTA1LTA4VDExOjUwOjU1KzAwOjAwJiK3NAAAAABJRU5ErkJggg==8.511.01.01.00.50.50.50.5111.01.03.31320.35244.62022.78231.65660.1762-0.03.31320.35241.65660.17621.65660.1762-0.0#FFFFFF#0000000.00.010.00625#ffffff1000.010#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.138888888888888900.00.00.0-1.00.00.0000.00.17623.31320.17621.65660.01.65660.35243.31320.35241.65660.17621.65660.17620.0#ffffff#0000000.00.010.00625#ffffff1000.01111110an image to be used as an application logonullnull[]nullnull0null5solid0nullnullnullnullfitnull100nullnullnullnull[]nullnullnull2.58810.63816.45597.44381.29410.3191-0.02.58810.63811.29410.31911.29410.3191-0.0#FFFFFF#0000000.00.010.00625#ffffff1000.010#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#000000Arial0.138888888888888900.00.00.0-1.00.00.0000.00.319052.58810.319051.294050.01.294050.63812.58810.63811.294050.319051.294050.319050.0#ffffff#0000000.00.010.00625#ffffff1000.01111111contains all the script files required for an application deploymentnullnull[]nullnull0null5solid0nullnullnullnullfitnull100nullnullnullnull[]nullnullnull2.66246.8743.66376.8741.00120.03.1636.8740.50060.0-0.00.00.11250.12370.00.00.0-0.00.0125#8080801000.003125221101600.12370.00.00.00.12370.0Reposition Text1000.00.01.00120.0121.10819.72911.10814.01210.05.7171.10816.87060.02.8585-0.00.00.11250.05.01070.00.0-0.00.01875#8080801000.003125221101600.05.01070.00.00.05.0107Reposition Text1000.05.7170.00.0121.10818.39362.16188.41321.0538-0.01961.63498.40340.5269-0.0098-0.00.00.11250.1302-0.01720.00.0-0.00.01875#8080801000.003125221101600.1302-0.01720.00.00.1302-0.0172Reposition Text1000.0-0.01961.05380.0121.03881.03882.45598.43240.51940.5194-0.0#b2b2b2#0000000.00.010.0#0000001000.01100.00.51941.03880.51940.51940.00.51941.03881.03881.03880.51940.51940.51940.51940.01nullnull[]1nullnullnull00solid0nullnullnullnull/imageProxy/cdn3.iconfinder.com/data/icons/vista-general/128/folder.pngnull0100nullnullnull[]nullfolder, open (128x128)nulliconfindernull1.10816.8742.16186.8741.05380.01.63496.8740.52690.0-0.00.00.11250.13020.00.00.0-0.00.01875#8080801000.003125221101600.13020.00.00.00.13020.0Reposition Text1000.00.01.05380.0121.00121.00122.43726.8740.50060.5006-0.0#b2b2b2#0000000.00.010.0#0000001000.01100.00.50061.00120.50060.50060.00.50061.00121.00121.00120.50060.50060.50060.50060.01nullnull[]1nullnullnull00solid0nullnullnullnull/imageProxy/cdn3.iconfinder.com/data/icons/vista-general/128/folder.pngnull100nullnullnull[]nullfolder, open (128x128)nulliconfindernull1.62510.38832.47386.2950.81260.1942-0.01.62510.38830.81260.19420.81260.1942-0.0#8feaea#0000000.00.010.00625#00cccc1000.010#000000Arial0.1666666666666666600.00.00.0-1.00.00.0100.00.194151.62510.194150.812550.00.812550.38831.62510.38830.812550.194150.812550.194150.0#8feaea#0000000.00.010.00625#00cccc1000.01111111Resourcesnullnull[]nullnull0null3solid0nullnullnullnullfitnull0100nullnullnullnull[]nullnullnull1.62510.38422.47387.83630.81260.1921-0.01.62510.38420.81260.19210.81260.1921-0.0#8feaea#0000000.00.010.00625#00cccc1000.010#000000Arial0.1666666666666666600.00.00.0-1.00.00.0100.00.19211.62510.19210.812550.00.812550.38421.62510.38420.812550.19210.812550.19210.0#8feaea#0000000.00.010.00625#00cccc1000.01111111Classesnullnull[]nullnull0null3solid0nullnullnullnullfitnull100nullnullnullnull[]nullnullnull1.10815.27722.10935.27721.00120.01.60875.27720.50060.0-0.00.00.11250.12370.00.00.0-0.00.01875#8080801000.003125221101600.12370.00.00.00.12370.0Reposition Text1000.00.01.00120.0121.00121.00122.41215.33480.50060.5006-0.0#b2b2b2#0000000.00.010.0#0000001000.01100.00.50061.00120.50060.50060.00.50061.00121.00121.00120.50060.50060.50060.50060.01nullnull[]1nullnullnull00solid0nullnullnullnull/imageProxy/cdn3.iconfinder.com/data/icons/vista-general/128/folder.pngnull0100nullnullnull[]nullfolder, open (128x128)nulliconfindernull1.63250.41472.47754.74260.81620.2074-0.01.63250.41470.81620.20740.81620.2074-0.0#8feaea#0000000.00.010.00625#00cccc1000.010#000000Arial0.1666666666666666600.00.00.0-1.00.00.0100.00.207351.63250.207350.816250.00.816250.41471.63250.41470.816250.207350.816250.207350.0#8feaea#0000000.00.010.00625#00cccc1000.01111111UInullnull[]nullnull0null3solid0nullnullnullnullfitnull100nullnullnullnull[]nullnullnull1.10814.05212.66244.05211.55440.01.88524.05210.77720.0-0.00.00.11250.1920.00.00.0-0.00.01875#8080801000.003125221101600.1920.00.00.00.1920.0Reposition Text1000.00.01.55440.0121.48340.34372.66292.30350.74170.1718-0.01.48340.34370.74170.17180.74170.1718-0.0#e6e6e6#0000000.00.010.00625#00cccc1000.010#000000Arial0.138888888888888900.00.00.0-1.00.00.0100.00.171851.48340.171850.74170.00.74170.34371.48340.34370.74170.171850.74170.171850.0#e6e6e6#0000000.00.010.00625#00cccc1000.01111111logo.pngnullnull[]nullnull0null3solid0nullnullnullnullfitnull0100nullnullnullnull[]nullnullnull1.10812.76952.66242.76951.55440.01.88522.76950.77720.0-0.00.00.11250.1920.00.00.0-0.00.01875#8080802000.003125221101600.1920.00.00.00.1920.0Reposition Text1000.00.01.55440.0121.63910.37582.66293.59190.81960.1879-0.01.63910.37580.81960.18790.81960.1879-0.0#e6e6e6#0000000.00.010.00625#00cccc1000.010#000000Arial0.138888888888888900.00.00.0-1.00.00.0100.00.18791.63910.18790.819550.00.819550.37581.63910.37580.819550.18790.819550.18790.0#e6e6e6#0000000.00.010.00625#00cccc1000.01111111manifest.yamlnullnull[]nullnull0null3solid0nullnullnullnullfitnull100nullnullnullnull[]nullnullnull1.36590.3152.66291.09280.68290.1575-0.01.36590.3150.68290.15750.68290.1575-0.0#e6e6e6#0000000.00.010.00625#00cccc1000.010#000000Arial0.138888888888888900.00.00.0-1.00.00.0100.00.15751.36590.15750.682950.00.682950.3151.36590.3150.682950.15750.682950.15750.0#e6e6e6#0000000.00.010.00625#00cccc1000.01111111images.lstnullnull[]nullnull0null3solid0nullnullnullnullfitnull0100nullnullnullnull[]nullnullnull1.10814.09011.10811.56730.02.52271.10812.82870.01.2614-0.00.00.11250.02.21110.00.0-0.00.01875#8080802000.003125221101600.02.21110.00.00.02.2111Reposition Text1000.02.52270.00.0121.10811.54452.58481.54451.47680.01.84641.54450.73840.0-0.00.00.11250.18240.00.00.0-0.00.01875#8080802000.003125221101600.18240.00.00.00.18240.0Reposition Text1000.00.01.47680.0123.66377.3873.66376.36090.01.02613.66376.8740.00.5131-0.00.0125#9999991000.00312522111121111000.01.02610.00.00.01.00.01.0NURBS(1.0,3,1,1,0.0,0.5131,0.0,1.0,0.0,0.5131,0.0,1.0)3.66377.3874.66497.3871.00120.04.16437.3870.50060.0-0.00.00.11250.12370.00.00.0-0.00.0125#8080801000.003125221101600.12370.00.00.00.12370.0Reposition Text1000.00.01.00120.0123.66376.36094.66496.36091.00120.04.16436.36090.50060.0-0.00.00.11250.12370.00.00.0-0.00.0125#8080801000.003125221101600.12370.00.00.00.12370.0Reposition Text1000.00.01.00120.0120.75090.75094.797.3870.37550.3755-0.0#b2b2b2#0000000.00.010.0#0000001000.01100.00.375450.75090.375450.375450.00.375450.75090.75090.75090.375450.375450.375450.375450.01nullnull[]1nullnullnull00solid0nullnullnullnull/imageProxy/cdn3.iconfinder.com/data/icons/vista-general/128/folder.pngnull0100nullnullnull[]nullfolder, open (128x128)nulliconfindernull2.24610.38194.85175.90311.12310.191-0.02.24610.38191.12310.1911.12310.191-0.0#f7f4f4#0000000.00.010.00625#00cccc1000.010#000000Arial0.138888888888888900.00.00.0-1.00.00.0100.00.190952.24610.190951.123050.01.123050.38192.24610.38191.123050.190951.123050.190950.0#f7f4f4#0000000.00.010.00625#00cccc1000.01111111execution_plan.templatenullnull[]nullnull0null3solid0nullnullnullnullfitnull0100nullnullnullnull[]nullnullnull1.59750.39814.85176.87340.79880.199-0.01.59750.39810.79880.1990.79880.199-0.0#96f8f8#0000000.00.010.00625#00cccc1000.010#000000Arial0.138888888888888900.00.00.0-1.00.00.0100.00.199051.59750.199050.798750.00.798750.39811.59750.39810.798750.199050.798750.199050.0#96f8f8#0000000.00.010.00625#00cccc1000.01111111scriptsnullnull[]nullnull0null3solid0nullnullnullnullfitnull0100nullnullnullnull[]nullnullnull3.79560.35264.79558.67151.89780.1763-0.03.79560.35261.89780.17631.89780.1763-0.0#FFFFFF#0000000.00.010.0#8080801000.010#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.138888888888888900.00.00.0-1.00.00.0000.00.17633.79560.17631.89780.01.89780.35263.79560.35261.89780.17631.89780.17630.0#FFFFFF#0000000.00.010.0#8080801000.01111110contains MuranoPL class definitions (*.yaml files)nullnull[]nullnull0null5solid0nullnullnullnullfitnull100nullnullnullnull[]nullnullnull3.06660.35514.43335.44741.53330.1776-0.03.06660.35511.53330.17761.53330.1776-0.0#FFFFFF#0000000.00.010.00625#ffffff1000.010#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.138888888888888900.00.00.0-1.00.00.0000.00.177553.06660.177551.53330.01.53330.35513.06660.35511.53330.177551.53330.177550.0#ffffff#0000000.00.010.00625#ffffff1000.01111110contains dynamic UI yaml definitionsnullnull[]nullnull0null5solid0nullnullnullnullfitnull0100nullnullnullnull[]nullnullnull3.62940.34634.77844.06911.81470.1732-0.03.62940.34631.81470.17321.81470.1732-0.0#FFFFFF#0000000.00.010.00625#ffffff1000.010#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.138888888888888900.00.00.0-1.00.00.0000.00.173153.62940.173151.81470.01.81470.34633.62940.34631.81470.173151.81470.173150.0#ffffff#0000000.00.010.00625#ffffff1000.01111110an application entry point. The file name is fixed. nullnull[]nullnull0null5solid0nullnullnullnullfitnull0100nullnullnullnull[]nullnullnull1.82380.36743.88811.60260.91190.1837-0.01.82380.36740.91190.18370.91190.1837-0.0#FFFFFF#0000000.00.010.00625#ffffff1000.010#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.13888888888888890#4d4d4dArial0.138888888888888900.00.00.0-1.00.00.0000.00.18371.82380.18370.91190.00.91190.36741.82380.36740.91190.18370.91190.18370.0#ffffff#0000000.00.010.00625#ffffff1000.01111110lists images if requirednullnull[]nullnull0null5solid0nullnullnullnullfitnull0100nullnullnullnull[]nullnullnull0.4380.4384.85266.36090.2190.219-0.0#b2b2b2#0000000.00.010.0#0000001000.01100.00.2190.4380.2190.2190.00.2190.4380.4380.4380.2190.2190.2190.2190.01nullnull[]1nullnullnull00solid0nullnullnullnull/imageProxy/cdn4.iconfinder.com/data/icons/Basic_set2_Png/64/document.pngnull100nullnullnull[]nulldocument, file, paper (64x64)nulliconfindernull0.49750.49752.66562.76160.24870.2487-0.0#b2b2b2#0000000.00.010.0#0000001000.01100.00.248750.49750.248750.248750.00.248750.49750.49750.49750.248750.248750.248750.248750.01nullnull[]1nullnullnull00solid0nullnullnullnull/imageProxy/cdn4.iconfinder.com/data/icons/Basic_set2_Png/64/document.pngnull0100nullnullnull[]nulldocument, file, paper (64x64)nulliconfindernull0.49750.49752.66564.07190.24870.2487-0.0#b2b2b2#0000000.00.010.0#0000001000.01100.00.248750.49750.248750.248750.00.248750.49750.49750.49750.248750.248750.248750.248750.01nullnull[]1nullnullnull00solid0nullnullnullnull/imageProxy/cdn4.iconfinder.com/data/icons/Basic_set2_Png/64/document.pngnull100nullnullnull[]nulldocument, file, paper (64x64)nulliconfindernull0.49750.49752.66241.54450.24870.2487-0.0#b2b2b2#0000000.00.010.0#0000001000.01100.00.248750.49750.248750.248750.00.248750.49750.49750.49750.248750.248750.248750.248750.01nullnull[]1nullnullnull00solid0nullnullnullnull/imageProxy/cdn4.iconfinder.com/data/icons/Basic_set2_Png/64/document.pngnull100nullnullnull[]nulldocument, file, paper (64x64)nulliconfindernull0.96610.96611.10819.51690.48310.4831-0.0#b2b2b2#0000000.00.010.0#0000001000.01100.00.483050.96610.483050.483050.00.483050.96610.96610.96610.483050.483050.483050.483050.01nullnull[]1nullnullnull00solid0nullnullnullnullhttps://cdn2.iconfinder.com/data/icons/Qetto___icons_by_ampeross-d4njobq/128/zip (2).pngnull100nullnullnull[]nullzip (128x128)nulliconfindernull
\ No newline at end of file
diff --git a/doc/source/admin/appdev-guide/garbage_collection.rst b/doc/source/admin/appdev-guide/garbage_collection.rst
deleted file mode 100644
index f6a0b0e92..000000000
--- a/doc/source/admin/appdev-guide/garbage_collection.rst
+++ /dev/null
@@ -1,117 +0,0 @@
-.. _garbage_collection:
-
-=====================================
-Garbage collection system in MuranoPL
-=====================================
-
-A garbage collection system (GC) manages the deallocation of resources in
-murano. The garbage collection system implementation is based on the execution
-of special ``.destroy()`` methods that you may define in MuranoPL classes.
-These methods contain logic to deallocate any resources that were allocated
-by MuranoPL objects. During deployment all objects that are not referenced by
-any other object and that are not present in the object model anymore is deleted
-by GC.
-
-* The ``.destroy()`` methods are executed for each class in the class hierarchy of
- the object that has this method. Child classes cannot prevent parent classes
- ``.destroy`` from being called and cannot call base classes
- implementation manually
-
-* ``.destroy()`` methods for class hierarchy are called in reversed order from that
- of ``.init()`` - starting from the actual object type and up to the
- `io.murano.Object` class
-
-* If object `Bar` is owned (directly or indirectly) by object `Foo` then `Bar`
- is going to be destroyed before `Foo`. There is a way for `Foo` to get
- notified on `Bar`'s destruction so that it can prepare for it. See below for
- details.
-
-* For objects that are not related to each other the destruction
- order is undefined. However objects may establish destruction dependency between
- them to establish the order.
-
-* Unrelated objects might be destroyed in different green threads.
-
-* Any exceptions thrown in the ``.destroy()`` methods are muted (but still logged).
-
-Destruction dependencies may be used to notify `Foo` of `Bar`'s destruction even if
-`Bar` is not owned by `Foo`. If you subscribe `Foo` to `Bar`'s destruction,
-the following will happen:
-
-* `Foo` will be notified when `Bar` is about to be destroyed.
-
-* If both `Foo` and `Bar` are going to be destroyed in the same garbage
- collection execution, `Bar` will be destroyed before `Foo`.
-
-Garbage collector methods
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Murano garbage collector class (``io.murano.system.GC``) has
-the following methods:
-
-``collect()``
- Initiates garbage collection of unreferenced objects of current deployment.
- Usually, it is called by murano ``ObjectStore`` object during deployment.
- However, it can be called from MuranoPL code like
- ``io.murano.system.GC.collect()``.
-
-``isDestroyed(object)``
- Checks if the ``object`` was already destroyed during a GC session and thus
- its methods cannot be called.
-
-``isDoomed(object)``
- Can be used within the ``.destroy()`` method to check if another object is
- also going to be destroyed.
-
-``subscribeDestruction(publisher, subscriber, handler=null)``
- Establishes a destruction dependency from the ``subscriber`` to the object
- passed as ``publisher``. This method may be called several times with the same
- arguments. In this case, only a single destruction dependency will be established.
- However, the same amount of calls of ``unsubscribeDestruction`` will be required to
- remove it.
-
- The ``handler`` argument is optional. If passed, it should be the name of an
- instance method defined by the caller class to handle the notification of
- ``publisher`` destruction. The following argument will be passed to the
- ``handler`` method:
-
- ``object``
- A target object that is going to be destroyed. It is not recommended
- persisting the reference to this object anywhere. This will not prevent the
- object from being garbage collected but the object will be moved to the
- "destroyed" state. This is an advanced feature that should
- not be used unless it is absolutely necessary.
-
-``unsubscribeDestruction(publisher, subscriber, handler=null)``
- Removes the destruction dependency from the ``subscriber`` to the object
- passed as ``publisher``. The method may be called several times with the same
- arguments without any side effects. If ``subscribeDestruction`` was called more
- than once, the same (or more) amount of calls to ``unsubscribeDestruction`` is
- needed to remove the dependency.
-
- The ``handler`` argument is optional and must correspond to the handler
- passed during subscription if it was provided.
-
-Using destruction dependencies
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-To use direct destruction dependencies in your murano applications, use the
-methods from MuranoPL ``io.murano.system.GC``. To establish a
-destruction dependency, call the
-``io.murano.system.GC.subscribeDestruction`` method in you
-application code:
-
-.. code-block:: console
-
- .init:
- Body:
- - If: $.publisher
- Then:
- - sys:GC.subscribeDestruction($.publisher, $this, onPublisherDestruction)
-
-
-In the example above, ``onPublisherDestruction`` is a `Foo` object method that
-will be called when `Bar` is destroyed. If you do not want to do something
-specific with the destroyed object omit the third parameter.
-The destruction dependencies will be persisted between deployments and
-deserialized from the objects model to murano object.
diff --git a/doc/source/admin/appdev-guide/hot_packages.rst b/doc/source/admin/appdev-guide/hot_packages.rst
deleted file mode 100644
index 0735626a8..000000000
--- a/doc/source/admin/appdev-guide/hot_packages.rst
+++ /dev/null
@@ -1,147 +0,0 @@
-.. _hot-packages:
-
-============
-HOT packages
-============
-
-.. _compose_package:
-
-Compose a package
-~~~~~~~~~~~~~~~~~
-
-Murano is an Application catalog which intends to support applications defined in different formats. As a first step to universality, support of a heat orchestration template was added.
-It means that any heat template could be added as a separate application into the Application Catalog. This could be done in two ways: manual and automatic.
-
-Automatic package composing
----------------------------
-
-Before uploading an application into the catalog, it should be prepared and archived.
-A Murano command line will do all preparation for you.
-Just choose the desired Heat Orchestration Template and perform the following command:
-
-::
-
- murano package-create --template wordpress/template.yaml
-
-Note, that optional parameters could be specified:
-
-:--name: an application name, copied from a template by default
-:--logo: an application square logo, by default the heat logo will be used
-:--description: text information about an application, by default copied from a template
-:--author: a name of an application author
-:--output: a name of an output file archive to save locally
-:--full-name: a fully qualified domain name that specifies exact application location
-:--resources-dir: a path to the directory containing application resources
-
-.. note::
- To performing this command python-muranoclient should be installed in the system
-
-As the result, an application definition archive will be ready for uploading.
-
-Manual package composing
-------------------------
-
-Application package could be composed manually. Follow the 5 steps below.
-
-* *Step 1. Choose the desired heat orchestration template*
-
- For this example
- `chef-server.yaml `_
- template will be used.
-
-* *Step 2. Rename it to template.yaml*
-* *Step 3. Prepare an application logo (optional step)*
-
- It could be any picture associated with the application.
-
-* *Step 4. Create manifest.yaml file*
-
- All service information about the application is contained here. Specify the following parameters:
-
- :Format: defines an application definition format; should be set to ``Heat.HOT/1.0``
- :Type: defines a manifest type, should be set to ``Application``
- :FullName: a unique name which will be used to identify the application in Murano Catalog
- :Description: text information about an application
- :Author: a name of an application author or a company
- :Tags: keywords associated with the application
- :Logo: a name of a logo file for an application
-
- Take a look at the example:
-
- .. code-block:: yaml
-
- Format: Heat.HOT/1.0
- Type: Application
- FullName: com.example.Chef-Server
- Name: Chef Server
- Description: "Heat template to deploy Open Source CHEF server on a VM"
- Author: Kate
- Tags:
- - hot-based
- Logo: logo.png
-
-* *Step 5. Create a zip archive, containing the specified files:* ``template.yaml``, ``manifest.yaml``, ``logo.png``
-
-`Browse` page looks like:
-
-.. image:: figures/chef_server.png
-
-The configuration form, where you can enter template parameters, will be generated automatically and looks as follows:
-
-.. image:: figures/chef_server_form.png
-
-After filling the form the application is ready to be deployed.
-
-Hot packages with nested Heat templates
----------------------------------------
-
-In Murano HOT packages it is possible to allow Heat nested templates to be
-saved and deployed as part of a Murano Heat applications. Such templates
-should be placed in package under '/Resources/HotFiles'. Adding additional
-templates to a package is optional. When a Heat generated package is being
-deployed, if there are any Heat nested templates located in the package under
-'/Resources/HotFiles', they are sent to Heat together with the main template
-and params during stack creation.
-
-These nested templates can be referenced by putting the template name into the
-``type`` attribute of resource definition, in the main template. This
-mechanism then compose one logical stack with these multiple templates. The
-following examples illustrate how you can use a custom template to define new
-types of resources. These examples use a custom template stored in a
-``sub_template.yaml`` file
-
- .. code-block:: yaml
-
- heat_template_version: 2015-04-30
-
- parameters:
- key_name:
- type: string
- description: Name of a KeyPair
-
- resources:
- server:
- type: OS::Nova::Server
- properties:
- key_name: {get_param: key_name}
- flavor: m1.small
- image: ubuntu-trusty
-
-Use the template filename as type
----------------------------------
-
-The following main template defines the ``sub_template.yaml`` file as value for
-the type property of a resource
-
- .. code-block:: yaml
-
- heat_template_version: 2015-04-30
-
- resources:
- my_server:
- type: sub_template.yaml
- properties:
- key_name: my_key
-
-.. note::
- This feature is supported Liberty onwards.
\ No newline at end of file
diff --git a/doc/source/admin/appdev-guide/multi_region.rst b/doc/source/admin/appdev-guide/multi_region.rst
deleted file mode 100644
index 4f6c0a502..000000000
--- a/doc/source/admin/appdev-guide/multi_region.rst
+++ /dev/null
@@ -1,148 +0,0 @@
-.. _multi_region:
-
-Multi-region application
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-Since Newton release, Murano supports multi-region application deployment.
-All MuranoPL resource classes are inherited from the
-``io.murano.CloudResource`` class.
-An application developer can set a custom region for ``CloudResource``
-subclasses deployment.
-
-Set a region for resources
---------------------------
-
-**To set a region for resources:**
-
-#. Specify a region for ``CloudResource`` subclasses deployment
- through the ``regionName`` property. For example:
-
- .. code-block:: yaml
-
- Application:
- ?:
- type: com.example.apache.ApacheHttpServer
- enablePHP: $.appConfiguration.enablePHP
-
- ...
-
- instance:
- ?:
- type: io.murano.resources.LinuxMuranoInstance
- regionName: 'CustomRegion'
-
- ...
-
-#. Retrieve ``io.murano.CloudRegion`` objects:
-
- .. code-block:: yaml
-
- $region: $.instance.getRegion()
- $regionName: $region.name
- $regionLocalStack: $region.stack
- $regionDefaultNetworks: $region.defaultNetworks
-
-
-As a result, all region-local properties are moved from the ``io.murano.Environment``
-class to the new :ref:`cloud-region` class.
-For backward compatibility, the ``io.murano.Environment`` class stores
-region-specific properties of default region, except the ``defaultNetworks``
-in its own properties.
-The ``Environment::defaultNetworks`` property contains templates for
-the ``CloudRegion::defaultNetworks`` property.
-
-Through current UI, you cannot select networks, flavor, images
-and availability zone from a non-default region.
-We suggest using regular text fields to specify region-local resources.
-
-Networking and multi-region applications
-----------------------------------------
-
-By default, each region has its own separate network.
-To ensure connectivity between the networks, create and configure networks in regions
-before deploying the application and use ``io.murano.resources.ExistingNeutronNetwork``
-to connect the instance to an existing network.
-Example:
-
-.. code-block:: yaml
-
- Application:
- ?:
- type: application.fully.qualified.Name
-
- ...
-
- instance_in_region1:
- ?:
- type: io.murano.resources.LinuxMuranoInstance
- regionName: 'CustomRegion1'
- networks:
- useEnvironmentNetwork: false
- useFlatNetwork: false
- customNetworks:
- - ?:
- type: io.murano.resources.ExistingNeutronNetwork
- regionName: 'CustomRegion1'
- internalNetworkName: 'internalNetworkNameInCustomRegion1'
- internalSubnetworkName: 'internalSubNetNameInCustomRegion1'
-
- instance_in_region2:
- ?:
- type: io.murano.resources.LinuxMuranoInstance
- regionName: 'CustomRegion2'
- networks:
- useEnvironmentNetwork: false
- useFlatNetwork: false
- customNetworks:
- - ?:
- type: io.murano.resources.ExistingNeutronNetwork
- regionName: 'CustomRegion2'
- internalNetworkName: 'internalNetworkNameInCustomRegion2'
- internalSubnetworkName: 'internalSubNetNameInCustomRegion2'
-
- ...
-
-Also, you can configure networks with the same name and use a template
-for the region networks.
-That is, describe ``io.murano.resources.ExistingNeutronNetwork`` only once
-and assign it to the ``Environment::defaultNetworks::environment`` property.
-The environment will create ``Network`` objects for regions from the
-``ExistingNeutronNetwork`` template.
-Example:
-
-.. code-block:: console
-
- OS_REGION_NAME="RegionOne" openstack network create
- OS_REGION_NAME="RegionTwo" openstack network create
-
- # configure subnets
- #...
-
- # add ExistingNeutronNetwork to environment object model
- murano environment-create --join-net-id
-
- # also it is possible to specify subnet from
- murano environment-create --join-net-id --join-subnet-id
-
-
-Additionally, consider the ``[networking]`` section in the configuration
-file.
-Currently, ``[networking]`` settings are common for all regions.
-
-.. code-block:: ini
-
- [networking]
-
- external_network = %EXTERNAL_NETWORK_NAME%
- router_name = %MURANO_ROUTER_NAME%
- create_router = true
-
-If you choose an automatic neutron configuration, configure the external
-network with identical names in all regions.
-If you disable the automatic router creation, create routers with
-identical names in all regions.
-Also, the ``default_dns`` address must be reachable from all created networks.
-
-.. note::
-
- To use regions, first configure them as described in :ref:`multi-region`.
diff --git a/doc/source/admin/appdev-guide/murano_bundles.rst b/doc/source/admin/appdev-guide/murano_bundles.rst
deleted file mode 100644
index bad3569ce..000000000
--- a/doc/source/admin/appdev-guide/murano_bundles.rst
+++ /dev/null
@@ -1,57 +0,0 @@
-.. _murano-bundles:
-
-==============
-Murano bundles
-==============
-
-A bundle is a collection of packages. In the Community App Catalog, you can find
-such bundles as ``container-based-apps``, ``app-servers``, and so on.
-The packages in the Application Catalog are sorted by usage. You can import
-bundles from the catalog using Dashboard or CLI. You can read about this in
-:ref:`Managing applications ` and :ref:`Using CLI `.
-Specific information about *bundle-import* command can be found at
-:ref:`Murano command-line client `.
-
-Bundle structure
-~~~~~~~~~~~~~~~~
-
-Bundle description is a JSON structure, that contains list of packages
-in the bundle and bundle version. Here is the example:
-
- .. code-block:: javascript
-
- {
- "Packages": [
- {
- "Name": "com.example.apache.ApacheHttpServer",
- "Version": ""
- },
- {
- "Name": "com.example.apache.Tomcat",
- "Version": ""
- }
- ],
- "Version": 1
- }
-
- ..
-
-``Name`` is a required parameter and should contain package fully qualified name.
-``Version`` is not a mandatory parameter. Version for package entry specifies the
-version of the package to look into :ref:`Murano package repository `.
-If it is specified, murano client would look for a file with that version
-specification in murano repository (for example ``com.example.MyApp.0.0.1.zip``
-for com.example.MyApp of version 0.0.1). If the version is omitted or left
-blank client would search for ``com.example.MyApp.zip``.
-
-Create local bundle
-~~~~~~~~~~~~~~~~~~~
-
-However, you may need to create a local bundle. You may need it if you want to
-setup your own :ref:`Murano package repository `. To create a new
-bundle, perform the following steps:
-
- #. Navigate to the directory with the target packages.
-
- #. Create a ``.bundle`` file. List all the required packages in ``Packages``
- section. If needed, specify the bundle version in the ``Version`` section.
diff --git a/doc/source/admin/appdev-guide/murano_packages.rst b/doc/source/admin/appdev-guide/murano_packages.rst
deleted file mode 100644
index 75d44e6f8..000000000
--- a/doc/source/admin/appdev-guide/murano_packages.rst
+++ /dev/null
@@ -1,12 +0,0 @@
-.. _murano-packages:
-
-===============
-Murano packages
-===============
-
-.. toctree::
- :maxdepth: 1
-
- muranopackages/package_structure
- muranopackages/dynamic_ui
- muranopackages/repository
diff --git a/doc/source/admin/appdev-guide/murano_pl.rst b/doc/source/admin/appdev-guide/murano_pl.rst
deleted file mode 100644
index 387da6c55..000000000
--- a/doc/source/admin/appdev-guide/murano_pl.rst
+++ /dev/null
@@ -1,22 +0,0 @@
-.. _murano-pl:
-
-==================
-MuranoPL Reference
-==================
-
-To develop applications, murano project refers to Murano Programming
-Language (MuranoPL). It is represented by easily readable YAML and
-YAQL languages. The sections below describe these languages.
-
-.. toctree::
- :maxdepth: 1
-
- murano_pl/yaml
- murano_pl/yaql
- murano_pl/class_templ
- murano_pl/core_lib
- murano_pl/reflection
- murano_pl/statics
- murano_pl/metadata
- murano_pl/versioning
- murano_pl/actions
\ No newline at end of file
diff --git a/doc/source/admin/appdev-guide/murano_pl/actions.rst b/doc/source/admin/appdev-guide/murano_pl/actions.rst
deleted file mode 100644
index 9033beb7e..000000000
--- a/doc/source/admin/appdev-guide/murano_pl/actions.rst
+++ /dev/null
@@ -1,133 +0,0 @@
-.. _actions:
-
-==============
-Murano actions
-==============
-
-Murano action is a type of MuranoPL method. The differences from a regular
-MuranoPL method are:
-
-* Action is executed on deployed objects.
-* Action execution is initiated by API request, you do not have to call
- the method manually.
-
-So murano action allows performing any operations on objects:
-
-* Getting information from the VM, like a config that is generated during the
- deployment
-* VM rebooting
-* Scaling
-
-A list of available actions is formed during the environment deployment.
-Right after the deployment is finished, you can call action asynchronously.
-Murano engine generates a task for every action. Therefore, the action status
-can be tracked.
-
-.. note::
- Actions may be called against any MuranoPL object, including ``Environment``,
- ``Application``, and any other objects.
-
-.. note::
- Now murano doesn't support big files download during action execution. This is
- because action results are stored in murano database and are limited by
- approximately 10kb size.
-
-To mark a method as an action, use ``Scope: Public`` or ``Usage: Action``.
-The latter option is deprecated for the package format versions > 1.3 and
-occasionally will be no longer supported. Also, you cannot use both
-``Usage: Action`` and ``Scope: Session`` in one method.
-
-The following example shows an action that returns an archive with a
-configuration file:
-
-.. code-block:: yaml
-
- exportConfig:
- Scope: Public
- Body:
- - $._environment.reporter.report($this, 'Action exportConfig called')
- - $resources: new(sys:Resources)
- - $template: $resources.yaml('ExportConfig.template')
- - $result: $.masterNode.instance.agent.call($template, $resources)
- - $._environment.reporter.report($this, 'Got archive from Kubernetes')
- - Return: new(std:File, base64Content => $result.content,
- filename => 'application.tar.gz')
-
-List of available actions can be found with environment details or application
-details API calls. It's located in object model special data.
-Take a look at the following example:
-
-Request:
-``http://localhost:8082/v1/environments//services/``
-
-Response:
-
-.. code-block:: json
-
- {
- "name": "SimpleVM",
- "?": {
- "_26411a1861294160833743e45d0eaad9": {
- "name": "SimpleApp"
- },
- "type": "com.example.Simple",
- "id": "e34c317a-f5ee-4f3d-ad2f-d07421b13d67",
- "_actions": {
- "e34c317a-f5ee-4f3d-ad2f-d07421b13d67_exportConfig": {
- "enabled": true,
- "name": "exportConfig"
- }
- }
- }
- }
-
-
-==============
-Static actions
-==============
-
-Static methods (:ref:`static_methods_and_properties`) can also be called
-through the API if they are exposed by specifying ``Scope: Public``, and the
-result of its execution will be returned.
-
-Consider the following example of the static action that makes use both of
-static class property and user's input as an argument:
-
-.. code-block:: yaml
-
- Name: Bar
-
- Properties:
- greeting:
- Usage: Static
- Contract: $.string()
- Default: 'Hello, '
-
- Methods:
- staticAction:
- Scope: Public
- Usage: Static
- Arguments:
- - myName:
- Contract: $.string().notNull()
- Body:
- - Return: concat($.greeting, $myName)
-
-Request:
-``http://localhost:8082/v1/actions``
-
-Request body:
-
-.. code-block:: json
-
- {
- "className": "ns.Bar",
- "methodName": "staticAction",
- "parameters": {"myName": "John"}
- }
-
-Responce:
-
-.. code-block:: json
-
- "Hello, John"
diff --git a/doc/source/admin/appdev-guide/murano_pl/class_templ.rst b/doc/source/admin/appdev-guide/murano_pl/class_templ.rst
deleted file mode 100644
index d8fca9e1c..000000000
--- a/doc/source/admin/appdev-guide/murano_pl/class_templ.rst
+++ /dev/null
@@ -1,702 +0,0 @@
-.. _class_templ:
-
-Common class structure
-~~~~~~~~~~~~~~~~~~~~~~
-
-Here is a common template for class declarations. Note, that it is in the YAML
-format.
-
-.. code-block:: yaml
- :linenos:
-
- Name: class name
- Namespaces: namespaces specification
- Extends: [list of parent classes]
- Properties: properties declaration
- Methods:
- methodName:
- Arguments:
- - list
- - of
- - arguments
- Body:
- - list
- - of
- - instructions
-
-Thus MuranoPL class is a YAML dictionary with predefined key names, all keys except
-for ``Name`` are optional and can be omitted (but must be valid if specified).
-
-Class name
-----------
-
-Class names are alphanumeric names of the classes. Traditionally, all class names
-begin with an upper-case letter symbol and are written in PascalCasing.
-
-In MuranoPL all class names are unique. At the same time, MuranoPL
-supports namespaces. So, in different namespaces you can have classes
-with the same name. You can specify a namespace explicitly, like
-`ns:MyName`. If you omit the namespace specification, ``MyName`` is
-expanded using the default namespace ``=:``. Therefore, ``MyName``
-equals ``=:MyName`` if ``=`` is a valid namespace.
-
-Namespaces
-----------
-
-Namespaces declaration specifies prefixes that can be used in the class body
-to make long class names shorter.
-
-.. code-block:: yaml
-
- Namespaces:
- =: io.murano.services.windows
- srv: io.murano.services
- std: io.murano
-
-In the example above, the ``srv: Something`` class name is automatically
-translated to ``io.murano.services.Something``.
-
-``=`` means the current namespace, so that ``MyClass`` means
-``io.murano.services.windows.MyClass``.
-
-If the class name contains the period (.) in its name, then it is assumed
-to be already fully namespace qualified and is not expanded.
-Thus ``ns.Myclass`` remains as is.
-
-
-.. note::
- To make class names globally unique, we recommend specifying a developer's
- domain name as a part of the namespace.
-
-Extends
--------
-
-MuranoPL supports multiple inheritance. If present, the ``Extends`` section
-shows base classes that are extended. If the list consists of a single entry,
-then you can write it as a scalar string instead of an array. If you
-do not specify any parents or omit the key, then the class extends
-``io.murano.Object``. Thus, ``io.murano.Object`` is the root class
-for all class hierarchies.
-
-.. _class_props:
-
-
-Properties
-----------
-
-Properties are class attributes that together with methods create public
-class interface. Usually, but not always, properties are the values, and
-reference other objects that have to be entered in an environment
-designer prior to a workflow invocation.
-
-Properties have the following declaration format:
-
-.. code-block:: yaml
-
- propertyName:
- Contract: property contract
- Usage: property usage
- Default: property default
-
-Contract
-++++++++
-
-Contract is a YAQL expression that says what type of the value is expected for
-the property as well as additional constraints imposed on a property. Using
-contracts you can define what value can be assigned to a property or argument.
-In case of invalid input data it may be automatically transformed to confirm
-to the contract. For example, if bool value is expected and user passes any
-not null value it will be converted to ``True``. If converting is impossible
-exception ``ContractViolationException`` will be raised.
-
-The following contracts are available:
-
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| Operation | Definition |
-+===========================================================+=================================================================================================+
-| | $.int() | | an integer value (may be null). String values consisting of digits are converted to integers |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | $.int().notNull() | | a mandatory integer |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | $.string() | | a string. If the value is not a string, it is converted to a string |
-| | $.string().notNull() | |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | $.bool() | | bools are true and false. ``0`` is converted to false, other integers to true |
-| | $.bool().notNull() | |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | $.class(ns:ClassName) | | value must be a reference to an instance of specified class name |
-| | $.class(ns:ClassName).notNull() | |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | $.template(ns:ClassName) | | value must be a dictionary with object-model representation of specified class name |
-| | $.template(ns:ClassName).notNull() | |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | $.class(ns:ClassName, ns:DefaultClassName) | | create instance of the ``ns:DefaultClassName`` class if no instance provided |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | $.class(ns:Name).check($.p = 12) | | the value must be of the ``ns:Name`` type and have the ``p`` property equal to 12 |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | $.class(ns:Name).owned() | | a current object must be direct or indirect owner of the value |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | $.class(ns:Name).notOwned() | | the value must be owned by any object except current one |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | [$.int()] | | an array of integers. Similar to other types. |
-| | [$.int().notNull()] | |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | [$.int().check($ > 0)] | | an array of the positive integers (thus not null) |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | [$.int(), $.string()] | | an array that has at least two elements, first is int and others are strings |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | [$.int(), 2] | | an array of ints with at least 2 items |
-| | [$.int(), 2, 5] | | an array of ints with at least 2 items, and maximum of 5 items |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | { A: $.int(), B: [$.string()] } | | the dictionary with the ``A`` key of the int type and ``B`` - an array of strings |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | $ | | any scalar or data structure as is |
-| | [] | | any array |
-| | {} | | any dictionary |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | { $.string().notNull(): $.int().notNull() } | | dictionary string -> int |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | A: StringMap | | the dictionary with the ``A`` key that must be equal to ``StringMap``, and other keys be |
-| | $.string().notNull(): $ | | any scalar or data structure |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | $.check($ in $this.myStaticMethod()) | | the value must be equal to one of a member of a list returned by static method of the class |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-| | $.check($this.myStaticMethod($)) | | the static method of the class must return true for the value |
-+-----------------------------------------------------------+-------------------------------------------------------------------------------------------------+
-
-In the example below property ``port`` must be int value greater than 0 and
-less than 65536; ``scope`` must be a string value and one of 'public', 'cloud',
-'host' or 'internal', and ``protocol`` must be a string value and either
-'TCP' or 'UDP'. When user passes some values to these properties it will be checked
-that values confirm to the contracts.
-
-.. code-block:: yaml
-
- Namespaces:
- =: io.murano.apps.docker
- std: io.murano
-
- Name: ApplicationPort
-
- Properties:
- port:
- Contract: $.int().notNull().check($ > 0 and $ < 65536)
-
- scope:
- Contract: $.string().notNull().check($ in list(public, cloud, host, internal))
- Default: private
-
- protocol:
- Contract: $.string().notNull().check($ in list(TCP, UDP))
- Default: TCP
-
- Methods:
- getRepresentation:
- Body:
- Return:
- port: $.port
- scope: $.scope
- protocol: $.protocol
-
-
-The ``template`` contract does the same validation as the ``class`` contract,
-but does not require the actual object to be passed as a property or argument.
-Instead it allows to create an object from the given template later. Also you
-can exclude some of the properties from validation and provide them later in
-the body of the method.
-
-Consider the following example:
-
-.. code-block:: yaml
-
- Namespaces:
- =: io.murano.applications
- res: io.murano.resources
- std: io.murano
-
- Name: TemplateServerProvider
-
- Properties:
- template:
- Contract: $.template(res:Instance, excludeProperties => [name]).notNull()
- serverNamePattern:
- Contract: $.string().notNull()
- threshold:
- Contract: $.int().check($ > 0)
-
- Methods:
- createReplica:
- Arguments:
- - index:
- Contract: $.int().notNull()
- - owner:
- Contract: $.class(std:Object)
- Body:
- - If: $index < $this.threshold
- Then:
- - $template: $this.template
- - $template.name: $this.serverNamePattern.format($index)
- - $template['?'].name: format('Server {0}', $index)
- - Return: new($template, $owner)
- Else:
- - Return: null
-
-In the example above the class has the ``template`` property that is validated
-by the ``template`` contract. It holds the template of the object of the
-``Instance`` class or its inheritor. In the ``createReplica`` method
-``template`` is used to dynamically create instances in runtime considering
-some conditions and customizing the ``name`` property of an instance, as it
-was excluded from validation.
-
-You still can pass an actual object to the property or argument with the
-``template`` contract, but it will be automatically converted to its object
-model representation.
-
-.. _property_usage:
-
-Property usage
-++++++++++++++
-
-Usage states the purpose of the property. This implies who and how can
-access it. The following usages are available:
-
-.. list-table::
- :header-rows: 1
- :widths: 20 80
- :stub-columns: 0
- :class: borderless
-
- * - | Value
- - | Explanation
-
- * - | In
- - | Input property. Values of such properties are obtained from a user
- and cannot be modified in MuranoPL workflows. This is the default
- value for the Usage key.
-
- * - | Out
- - | A value is obtained from executing MuranoPL workflow and cannot be
- modified by a user.
-
- * - | InOut
- - | A value can be modified both by user and by workflow.
-
- * - | Const
- - | The same as ``In`` but once workflow is executed a property cannot be
- changed neither by a user nor by a workflow.
-
- * - | Runtime
- - | A property is visible only from within workflows. It is neither read
- from input nor serialized to a workflow output.
-
- * - | Static
- - | Property is defined on a class rather than on an instance.
- See :ref:`static_methods_and_properties` for details.
-
- * - | Config
- - | A property allows to have per-class configuration. A value is obtained
- from the config file rather than from the object model. These config
- files are stored in a special folder that is configured in the
- ``[engine]`` section of the Murano config file under the
- ``class_configs`` key.
-
-The usage attribute is optional and can be omitted (which implies ``In``).
-
-If the workflow tries to write to a property that is not declared with
-one of the types above, it is considered to be private and accessible
-only to that class (and not serialized to output and thus would be
-lost upon the next deployment). An attempt to read the property that was
-not initialized results in an exception.
-
-
-Default
-+++++++
-
-Default is a value that is used if the property value is not mentioned in
-the input object model, but not when it is set to null.
-Default, if specified, must conform to a declared property contract.
-If Default is not specified, then null is the default.
-
-For properties that are references to other classes, Default can modify
-a default value of the referenced objects. For example:
-
-.. code-block:: yaml
-
- p:
- Contract: $.class(MyClass)
- Default: {a: 12}
-
-This overrides default for the ``a`` property of ``MyClass`` for instance
-of ``MyClass`` that is created for this property.
-
-Workflow
---------
-
-Workflows are the methods that describe how the entities that are
-represented by MuranoPL classes are deployed.
-
-In a typical scenario, the root object in an input data model is of
-the ``io.murano.Environment`` type, and has the ``deploy`` method.
-This method invocation causes a series of infrastructure activities
-(typically, a Heat stack modification) and the deployment scripts
-execution initiated by VM agents commands. The role of the workflow
-is to map data from the input object model, or a result of previously
-executed actions, to the parameters of these activities and to
-initiate these activities in a correct order.
-
-
-Methods
--------
-
-Methods have input parameters, and can return a value to a caller.
-Methods are defined in the Workflow section of the class using the
-following template::
-
- methodName:
- Scope: Public
- Arguments:
- - list
- - of
- - arguments
- Body:
- - list
- - of
- - instructions
-
-Public is an optional parameter that specifies methods to be executed
-by direct triggering after deployment.
-
-
-.. _method_arguments:
-
-Method arguments
-++++++++++++++++
-
-Arguments are optional too, and are declared using the same syntax
-as class properties. Same as properties, arguments also have contracts and
-optional defaults.
-
-Unlike class properties Arguments may have a different set of Usages:
-
-.. list-table::
- :header-rows: 1
- :widths: 20 80
- :stub-columns: 0
- :class: borderless
-
- * - | Value
- - | Explanation
-
- * - | Standard
- - | Regular method argument. Holds a single value based on its contract.
- This is the default value for the Usage key.
-
- * - | VarArgs
- - | A variable length argument. Method body sees it as a list of values,
- each matching a contract of the argument.
-
- * - | KwArgs
- - | A keywrod-based argument, Method body sees it as a dict of values,
- with keys being valid keyword strings and values matching a contract
- of the argument.
-
-Arguments example:
-
-.. code-block:: yaml
-
- scaleRc:
- Arguments:
- - rcName:
- Contract: $.string().notNull()
- - newSize:
- Contract: $.int().notNull()
- - rest:
- Contract: $.int()
- Usage: VarArgs
- - others:
- Contract: $.int()
- Usage: KwArgs
-
-.. method_body:
-
-Method body
-+++++++++++
-
-The Method body is an array of instructions that get executed sequentially.
-There are 3 types of instructions that can be found in a workflow body:
-
-* Expressions,
-* Assignments,
-* Block constructs.
-
-.. method_usage:
-
-Method usage
-++++++++++++
-
-Usage states the purpose of the method. This implies who and how can
-access it. The following usages are available:
-
-.. list-table::
- :header-rows: 1
- :widths: 20 80
- :stub-columns: 0
- :class: borderless
-
- * - | Value
- - | Explanation
-
- * - | Runtime
- - | Normal instance method.
-
- * - | Static
- - | Static method that does not require class instance.
- See :ref:`static_methods_and_properties` for details.
-
- * - | Extension
- - | Extension static method that extends some other type.
- See :ref:`extension_methods` for details.
-
- * - | Action
- - | Method can be invoked from outside (using Murano API).
- This option is deprecated for the package format versions > 1.3 in
- favor of ``Scope: Public`` and occasionally will be no longer
- supported.
- See :ref:`actions` for details.
-
-The ``Usage`` attribute is optional and can be omitted (which implies
-``Runtime``).
-
-Method scope
-++++++++++++
-
-The ``Scope`` attribute declares method visibility. It can have two possible
-values:
-
-* `Session` - regular method that is accessible from anywhere in the current
- execution session. This is the default if the attribute is omitted;
-
-* `Public` - accessible anywhere, both within the session and from
- outside through the API call.
-
-The ``Scope`` attribute is optional and can be omitted (which implies
-``Session``).
-
-Expressions
-+++++++++++
-
-Expressions are YAQL expressions that are executed for their side effect.
-All accessible object methods can be called in the expression using
-the ``$obj.methodName(arguments)`` syntax.
-
-+-----------------------------------------+----------------------------------------------------------------+
-| Expression | Explanation |
-+=========================================+================================================================+
-| | $.methodName() | | invoke method 'methodName' on this (self) object |
-| | $this.methodName() | |
-+-----------------------------------------+----------------------------------------------------------------+
-| | $.property.methodName() | | invocation of method on object that is in ``property`` |
-| | $this.property.methodName() | |
-+-----------------------------------------+----------------------------------------------------------------+
-| | $.method(1, 2, 3) | | methods can have arguments |
-+-----------------------------------------+----------------------------------------------------------------+
-| | $.method(1, 2, thirdParameter => 3) | | named parameters also supported |
-+-----------------------------------------+----------------------------------------------------------------+
-| | list($.foo().bar($this.property), $p) | | complex expressions can be constructed |
-+-----------------------------------------+----------------------------------------------------------------+
-
-
-Assignment
-++++++++++
-
-Assignments are single key dictionaries with a YAQL expression as a key
-and arbitrary structure as a value. Such a construct is evaluated
-as an assignment.
-
-+------------------------------+---------------------------------------------------------------------------------+
-| Assignment | Explanation |
-+==============================+=================================================================================+
-| | $x: value | | assigns ``value`` to the local variable ``$x`` |
-+------------------------------+---------------------------------------------------------------------------------+
-| | $.x: value | | assign ``value`` to the object's property |
-| | $this.x: value | |
-+------------------------------+---------------------------------------------------------------------------------+
-| | $.x: $.y | | copies the value of the property ``y`` to the property ``x`` |
-+------------------------------+---------------------------------------------------------------------------------+
-| | $x: [$a, $b] | | sets ``$x`` to the array of two values: ``$a`` and ``$b`` |
-+------------------------------+---------------------------------------------------------------------------------+
-| | $x: | | structures of any level of complexity can be evaluated |
-| | SomeKey: | |
-| | NestedKey: $variable | |
-+------------------------------+---------------------------------------------------------------------------------+
-| | $.x[0]: value | | assigns ``value`` to the first array entry of the ``x`` property |
-+------------------------------+---------------------------------------------------------------------------------+
-| | $.x: $.x.append(value) | | appends ``value`` to the array in the ``x`` property |
-+------------------------------+---------------------------------------------------------------------------------+
-| | $.x: $.x.insert(1, value) | | inserts ``value`` into position 1 of the array in the ``x`` property |
-+------------------------------+---------------------------------------------------------------------------------+
-| | $x: list($a, $b).delete(0) | | sets ``$x`` to the list without the item at index 0 |
-+------------------------------+---------------------------------------------------------------------------------+
-| | $.x.key.subKey: value | | deep dictionary modification |
-| | $.x[key][subKey]: value | |
-+------------------------------+---------------------------------------------------------------------------------+
-
-
-Block constructs
-++++++++++++++++
-
-Block constructs control a program flow. They are dictionaries that have
-strings as all their keys.
-
-The following block constructs are available:
-
-+---------------------------+---------------------------------------------------------------------------------------+
-| Assignment | Explanation |
-+===========================+=======================================================================================+
-| | Return: value | | Returns value from a method |
-+---------------------------+---------------------------------------------------------------------------------------+
-| | If: predicate() | | ``predicate()`` is a YAQL expression that must be evaluated to ``True`` or ``False``|
-| | Then: | |
-| | - code | | The ``Else`` section is optional |
-| | - block | | One-line code blocks can be written as scalars rather than an array. |
-| | Else: | |
-| | - code | |
-| | - block | |
-+---------------------------+---------------------------------------------------------------------------------------+
-| | While: predicate() | | ``predicate()`` must be evaluated to ``True`` or ``False`` |
-| | Do: | |
-| | - code | |
-| | - block | |
-+---------------------------+---------------------------------------------------------------------------------------+
-| | For: variableName | | ``collection`` must be a YAQL expression returning iterable collection or |
-| | In: collection | evaluatable array as in assignment instructions, for example, ``[1, 2, $x]`` |
-| | Do: | |
-| | - code | | Inside a code block loop, a variable is accessible as ``$variableName`` |
-| | - block | |
-+---------------------------+---------------------------------------------------------------------------------------+
-| | Repeat: | | Repeats the code block specified number of times |
-| | Do: | |
-| | - code | |
-| | - block | |
-+---------------------------+---------------------------------------------------------------------------------------+
-| | Break: | | Breaks from loop |
-+---------------------------+---------------------------------------------------------------------------------------+
-| | Match: | | Matches the result of ``$valExpression()`` against a set of possible values |
-| | case1: | (cases). The code block of first matched case is executed. |
-| | - code | |
-| | - block | | If no case matched and the default key is present |
-| | case2: | than the ``Default`` code block get executed. |
-| | - code | | The case values are constant values (not expressions). |
-| | - block | |
-| | Value: $valExpression() | |
-| | Default: | |
-| | - code | |
-| | - block | |
-+---------------------------+---------------------------------------------------------------------------------------+
-| | Switch: | | All code blocks that have their predicate evaluated to ``True`` are executed, |
-| | $predicate1(): | but the order of predicate evaluation is not fixed. |
-| | - code | |
-| | - block | |
-| | $predicate2(): | |
-| | - code | |
-| | - block | |
-| | Default: | | The ``Default`` key is optional. |
-| | - code | |
-| | - block | | If no predicate evaluated to ``True``, the ``Default`` code block get executed. |
-+---------------------------+---------------------------------------------------------------------------------------+
-| | Parallel: | | Executes all instructions in code block in a separate green threads in parallel. |
-| | - code | |
-| | - block | |
-| | Limit: 5 | | The limit is optional and means the maximum number of concurrent green threads. |
-+---------------------------+---------------------------------------------------------------------------------------+
-| | Try: | | Try and Catch are keywords that represent the handling of exceptions due to data |
-| | - code | or coding errors during program execution. A ``Try`` block is the block of code in |
-| | - block | which exceptions occur. A ``Catch`` block is the block of code, that is executed if |
-| | Catch: | an exception occurred. |
-| | With: keyError | | Exceptions are not declared in Murano PL. It means that exceptions of any types can |
-| | As: e | be handled and generated. Generating of exception can be done with construct: |
-| | Do: | ``Throw: keyError``. |
-| | - code | |
-| | - block | |
-| | Else: | | The ``Else`` is optional block. ``Else`` block is executed if no exception occurred.|
-| | - code | |
-| | - block | |
-| | Finally: | | The ``Finally`` also is optional. It's a place to put any code that will |
-| | - code | be executed, whether the try-block raised an exception or not. |
-| | - block | |
-+---------------------------+---------------------------------------------------------------------------------------+
-
-Notice, that if you have more than one block construct in your workflow, you
-need to insert dashes before each construct. For example::
-
- Body:
- - If: predicate1()
- Then:
- - code
- - block
- - While: predicate2()
- Do:
- - code
- - block
-
-
-.. _object-model:
-
-Object model
-------------
-
-Object model is a JSON serialized representation of objects and their
-properties. Everything you do in the OpenStack dashboard is reflected
-in an object model. The object model is sent to the Application catalog engine
-when the user decides to deploy the built environment. On the engine
-side, MuranoPL objects are constructed and initialized from the received
-Object model, and a predefined method is executed on the root object.
-
-Objects are serialized to JSON using the following template:
-
-.. code-block:: json
- :linenos:
-
- {
- "?": {
- "id": "globally unique object ID (UUID)",
- "type": "fully namespace-qualified class name",
-
- "optional designer-related entries can be placed here": {
- "key": "value"
- }
- },
-
- "classProperty1": "propertyValue",
- "classProperty2": 123,
- "classProperty3": ["value1", "value2"],
-
- "reference1": {
- "?": {
- "id": "object id",
- "type": "object type"
- },
-
- "property": "value"
- },
-
- "reference2": "referenced object id"
- }
-
-Objects can be identified as dictionaries that contain the ``?`` entry.
-All system fields are hidden in that entry.
-
-There are two ways to specify references:
-
-#. ``reference1`` as in the example above. This method allows inline
- definition of an object. When the instance of the referenced object
- is created, an outer object becomes its parent/owner that is responsible
- for the object. The object itself may require that its parent
- (direct or indirect) be of a specified type, like all applications
- require to have ``Environment`` somewhere in a parent chain.
-
-#. Referring to an object by specifying other object ID. That object must
- be defined elsewhere in an object tree. Object references distinguished
- from strings having the same value by evaluating property contracts.
- The former case would have ``$.class(Name)`` while the later - the
- ``$.string()`` contract.
diff --git a/doc/source/admin/appdev-guide/murano_pl/core_lib.rst b/doc/source/admin/appdev-guide/murano_pl/core_lib.rst
deleted file mode 100644
index 75dabe9d6..000000000
--- a/doc/source/admin/appdev-guide/murano_pl/core_lib.rst
+++ /dev/null
@@ -1,397 +0,0 @@
-.. _core_lib:
-
-MuranoPL Core Library
-~~~~~~~~~~~~~~~~~~~~~
-
-Some objects and actions can be used in several application deployments.
-All common parts are grouped into MuranoPL libraries.
-Murano core library is a set of classes needed in each deployment.
-Class names from core library can be used in the application definitions.
-This library is located under the `meta `_
-directory.
-
-Classes included in the Murano core library are as follows:
-
-**io.murano**
-
-- :ref:`object`
-- :ref:`application`
-- :ref:`security-group-manager`
-- :ref:`environment`
-- :ref:`cloud-region`
-
-**io.murano.resources**
-
-- :ref:`instance`
-- :ref:`network`
-
-**io.murano.system**
-
-- :ref:`logger`
-- :ref:`status-reporter`
-
-
-.. _object:
-
-Class: Object
--------------
-
-A parent class for all MuranoPL classes. It implements the ``initialize``,
-``setAttr``, and ``getAttr`` methods defined in the pythonic part of the Object class.
-All MuranoPL classes are implicitly inherited from this class.
-
-.. seealso::
-
- Source `Object.yaml
- `_
- file.
-
-
-
-.. _application:
-
-Class: Application
-------------------
-
-Defines an application itself. All custom applications must be derived from
-this class.
-
-.. seealso::
-
- Source `Application.yaml
- `_
- file.
-
-
-.. _security-group-manager:
-
-Class: SecurityGroupManager
----------------------------
-
-Manages security groups during an application deployment.
-
-.. seealso::
-
- Source `SecurityGroupManager.yaml
- `_
- file.
-
-
-.. _cloud-region:
-
-Class: CloudRegion
-------------------
-
-Defines a CloudRegion and groups region-local properties
-
-.. list-table:: **CloudRegion class properties**
- :widths: 10 35 7
- :header-rows: 1
-
- * - Property
- - Description
- - Default usage
- * - ``name``
- - A region name.
- - ``In``
- * - ``agentListener``
- - A property containing the ``io.murano.system.AgentListener`` object
- that can be used to interact with Murano Agent.
- - ``Runtime``
- * - ``stack``
- - A property containing a HeatStack object that can be used to interact
- with Heat.
- - ``Runtime``
- * - ``defaultNetworks``
- - A property containing user-defined Networks
- (``io.murano.resources.Network``) that can be used as default networks
- for the instances in this environment.
- - ``In``
- * - ``securityGroupManager``
- - A property containing the ``SecurityGroupManager`` object that can
- be used to construct a security group associated with this environment.
- - ``Runtime``
-
-
-.. seealso::
-
- Source `CloudRegion.yaml
- `_
- file.
-
-.. _environment:
-
-Class: Environment
-------------------
-
-Defines an environment in terms of the deployment process and
-groups all Applications and their related infrastructures. It also able
-to deploy them at once.
-
-Environments is intent to group applications to manage them easily.
-
-.. list-table:: **Environment class properties**
- :widths: 10 35 7
- :header-rows: 1
-
- * - Property
- - Description
- - Default usage
- * - ``name``
- - An environment name.
- - ``In``
- * - ``applications``
- - A list of applications belonging to an environment.
- - ``In``
- * - ``agentListener``
- - A property containing the ``io.murano.system.AgentListener`` object
- that can be used to interact with Murano Agent.
- - ``Runtime``
- * - ``stack``
- - A property containing a HeatStack object in default region that can
- be used to interact with Heat.
- - ``Runtime``
- * - ``instanceNotifier``
- - A property containing the ``io.murano.system.InstanceNotifier`` object
- that can be used to keep track of the amount of deployed instances.
- - ``Runtime``
- * - ``defaultNetworks``
- - A property containing templates for user-defined Networks in regions
- (``io.murano.resources.Network``).
- - ``In``
- * - ``securityGroupManager``
- - A property containing the ``SecurityGroupManager`` object from default region
- that can be used to construct a security group associated with this environment.
- - ``Runtime``
- * - ``homeRegionName``
- - A property containing the name of home region from `murano` config
- - ``Runtime``
- * - ``regions``
- - A property containing the map `regionName` -> `CloudRegion` instance.
- - ``InOut``
- * - ``regionConfigs``
- - A property containing the map `regionName` -> `CloudRegion` config
- - ``Config``
-
-.. seealso::
-
- Source `Environment.yaml
- `_
- file.
-
-
-.. _instance:
-
-Class: Instance
----------------
-
-Defines virtual machine parameters and manages an instance lifecycle: spawning,
-deploying, joining to the network, applying security group, and deleting.
-
-.. list-table:: **Instance class properties**
- :widths: 10 35 7
- :header-rows: 1
-
- * - Property
- - Description
- - Default usage
- * - ``regionName``
- - Inherited from ``CloudResource``. Describe region for instance deployment
- - ``In``
- * - ``name``
- - An instance name.
- - ``In``
- * - ``flavor``
- - An instance flavor defining virtual machine hardware parameters.
- - ``In``
- * - ``image``
- - An instance image defining operation system.
- - ``In``
- * - ``keyname``
- - Optional. A key pair name used to connect easily to the instance.
- - ``In``
- * - ``agent``
- - Configures interaction with the Murano agent using
- ``io.murano.system.Agent``.
- - ``Runtime``
- * - ``ipAddresses``
- - A list of all IP addresses assigned to an instance. Floating ip address
- is placed in the list tail if present.
- - ``Out``
- * - ``networks``
- - Specifies the networks that an instance will be joined to.
- Custom networks that extend :ref:`Network class ` can be
- specified. An instance will be connected to them and for the default
- environment network or flat network if corresponding values are set
- to ``True``. Without additional configuration, instance will be joined
- to the default network that is set in the current environment.
- - ``In``
- * - ``volumes``
- - Specifies the mapping of a mounting path to volume implementations
- that must be attached to the instance. Custom volumes that extend
- ``Volume`` class can be specified.
- - ``In``
- * - ``blockDevices``
- - Specifies the list of block device mappings that an instance will use
- to boot from. Each mapping defines a volume that must be an instance of
- ``Volume`` class, device name, device type, and boot order.
- Either the ``blockDevices`` property or ``image`` property must be
- specified in order to boot an instance
- - ``In``
- * - ``assignFloatingIp``
- - Determines if floating IP is required. Default is ``False``.
- - ``In``
- * - ``floatingIpAddress``
- - IP addresses assigned to an instance after an application deployment.
- - ``Out``
- * - ``securityGroupName``
- - Optional. A security group that an instance will be joined to.
- - ``In``
-
-.. seealso::
-
- Source `Instance.yaml
- `_
- file.
-
-
-.. _instance-resources:
-
-Resources
-+++++++++
-
-Instance class uses the following resources:
-
-**Agent-v2.template**
- Python Murano Agent template.
-
- .. note::
-
- This agent is supposed to be unified. Currently, only Linux-based
- machines are supported. Windows support will be added later.
-
-**linux-init.sh**
- Python Murano Agent initialization script that sets up an agent with
- valid information containing an updated agent template.
-
-**Agent-v1.template**
- Windows Murano Agent template.
-
-**windows-init.sh**
- Windows Murano Agent initialization script.
-
-
-.. _network:
-
-Class: Network
---------------
-
-The basic abstract class for all MuranoPL classes representing networks.
-
-.. seealso::
-
- Source `Network.yaml
- `_
- file.
-
-.. _logger:
-
-Class: Logger
--------------
-
-Logging API is the part of core library since Liberty release. It was
-introduced to improve debuggability of MuranoPL programs.
-
-You can get a logger instance by calling a ``logger`` function which
-is located in ``io.murano.system`` namespace. The ``logger`` function takes
-a logger name as the only parameter. It is a common recommendation to use full
-class name as a logger name within that class. This convention avoids names
-conflicts in logs and ensures a better logging subsystem configurability.
-
-Logger class instantiation:
-
-.. code-block:: yaml
-
- $log: logger('io.murano.apps.activeDirectory.ActiveDirectory')
-
-
-.. list-table:: **Log levels prioritized in order of severity**
- :widths: 10 35
- :header-rows: 1
-
- * - Level
- - Description
- * - CRITICAL
- - Very severe error events that will presumably lead the application
- to abort.
- * - ERROR
- - Error events that might not prevent the application from running.
- * - WARNING
- - Events that are potentially harmful but will allow the application
- to continue running.
- * - INFO
- - Informational messages highlighting the progress of the application
- at the coarse-grained level.
- * - DEBUG
- - Detailed informational events that are useful when debugging an
- application.
- * - TRACE
- - Even more detailed informational events comparing to the DEBUG level.
-
-There are several methods that fully correspond to the log levels you can use
-for logging events. They are ``debug``, ``trace``, ``info``, ``warning``,
-``error``, and ``critical``.
-
-Logging example:
-
-.. code-block:: yaml
-
- $log.info('print my info message {message}', message=>message)
-
-Logging methods use the same format rules as the YAQL :command:`format`
-function. Thus the line above is equal to the:
-
-.. code-block:: yaml
-
- $log.info('print my info message {message}'.format(message=>message))
-
-To print an exception stacktrace, use the :command:`exception` method.
-This method uses the ERROR level:
-
-.. code-block:: yaml
-
- Try:
- - Throw: exceptionName
- Message: exception message
- Catch:
- With: exceptionName
- As: e
- Do:
- - $log.exception($e, 'something bad happen "{message}"', message=>message)
-
-.. note::
- You can configure the logging subsystem through the ``logging.conf`` file
- of the Murano Engine.
-
-.. seealso::
-
- * Source `Logger.yaml
- `_
- file.
-
- * `OpenStack networking logging
- configuration `_.
-
-.. _status-reporter:
-
-Class: StatusReporter
----------------------
-
-Provides feedback feature. To follow the deployment process in the UI, all status changes should be included
-in the application configuration.
-
-.. seealso::
-
- Source `StatusReporter.yaml
- `_
- file.
diff --git a/doc/source/admin/appdev-guide/murano_pl/metadata.rst b/doc/source/admin/appdev-guide/murano_pl/metadata.rst
deleted file mode 100644
index 474ce1356..000000000
--- a/doc/source/admin/appdev-guide/murano_pl/metadata.rst
+++ /dev/null
@@ -1,318 +0,0 @@
-.. _metadata:
-
-MuranoPL Metadata
-~~~~~~~~~~~~~~~~~
-
-MuranoPL metadata is a way to attach additional information to various MuranoPL
-entities such as classes, packages, properties, methods, and method arguments.
-That information can be used by both applications (to implement dynamic
-programming techniques) or by the external callers (API consumers like UI or
-even by the Murano Engine itself to impose some runtime behavior based on
-well known meta values). Thus, metadata is a flexible alternative to adding new
-keyword for every new feature.
-
-Work with metadata includes the following cases:
-
-* Defining your own metadata classes
-* Attaching metadata to various parts of MuranoPL code
-* Obtaining metadata and its usage
-
-Define metadata classes
------------------------
-
-Define MuranoPL class with the description of arbitrary metadata. The class
-that can be used as metadata differs from the regular class:
-
-* The ``Usage`` attribute of the former equals to ``Meta``, while the ``Usage``
- attribute of the latter equals to ``Class``. The default value of the
- ``Usage`` attribute is ``Class``.
-
-* Metadata class has additional attributes (``Cardinality``, ``Applies`` and
- ``Inherited``) to control how and where instances of that class can be
- attached.
-
-Cardinality
-+++++++++++
-
-The ``Cardinality`` attribute can be set to either ``One`` or ``Many`` and
-indicates the possibility to attach two or more instances of metadata to a
-single language entity. The default value is ``One``.
-
-Applies
-+++++++
-
-The ``Applies`` attribute can be set to one of ``Package``, ``Type``,
-``Method``, ``Property``, ``Argument`` or ``All`` and controls the possible
-language entities which instances of metadata class can be attached to. It is
-possible to specify several values using YAML list notation. The default value
-is ``All``.
-
-Inherited
-+++++++++
-
-The ``Inherited`` attribute can be set to ``true`` or ``false`` and specifies
-if there is metadata retained for child classes, overridden methods and
-properties. The default value is ``false``.
-
-Using of ``Inherited: true`` has the following consequences.
-
-If some class inherits from two classes with the same metadata attached and
-this metadata has ``Cardinality: One``, it will lead to emerging of two
-metadata objects with ``Cardinality: One`` within a single entity and will
-throw an exception. However, if the child class has this metadata attached
-explicitly, it will override the inherited metas and there is no conflict.
-
-If the child class has the same meta as its parent (attached explicitly),
-then in case of ``Cardinatity: One`` the meta of the child overrides the
-meta of the parent as it is mentioned above. And in case of
-``Cardinatity: Many`` meta of the parent is added to the list of the child's
-metas.
-
-Example
-+++++++
-
-The following example shows a simple meta-class implementation:
-
-.. code-block:: yaml
-
- Name: MetaClassOne
- Usage: Meta
- Cardinality: One
- Applies: All
-
- Properties:
- description:
- Contract: $.string()
- Default: null
-
- count:
- Contract: $.int().check($ >= 0)
- Default: 0
-
-``MetaClassOne`` is defined as a metadata class by setting the ``Usage``
-attribute to ``Meta``. The ``Cardinality`` and ``Applies`` attributes determine
-that only one instance of ``MetaClassOne`` can be attached to object of any
-type. The ``Inherited`` attribute is omitted so there is no metadata
-retained for child classes, overridden methods and properties. In the
-example above, ``Cardinality`` and ``Applies`` can be omitted as well, as
-their values are set to default but in this case the author wants to be
-explicit.
-
-The following example shows metadata class with different values of attributes:
-
-.. code-block:: yaml
-
- Name: MetaClassMany
- Usage: Meta
- Cardinality: Many
- Applies: [Property, Method]
- Inherited: true
-
- Properties:
- description:
- Contract: $.string()
- Default: null
-
- count:
- Contract: $.int().check($ >= 0)
- Default: 0
-
-An instance (or several instances) of ``MetaClassMany`` can be attached to
-either property or method. Overridden methods and properties inherit
-metadata from its parents.
-
-Attach metadata to a MuranoPL entity
-------------------------------------
-
-To attach metadata to MuranoPL class, package, property, method or method
-argument, add the ``Meta`` keyword to its description. Under the
-description, specify a list of metadata class instances which you want to
-attach to the entity. To attach only one metadata class instance, use a single
-scalar instead of a list.
-
-Consider the example of attaching previously defined metadata to different
-entities in a class definition:
-
-.. code-block:: yaml
-
- Namespaces:
- =: io.murano.bar
- std: io.murano
- res: io.murano.resources
- sys: io.murano.system
-
-
- Name: Bar
-
- Extends: std:Application
-
- Meta:
- MetaClassOne:
- description: "Just an empty application class with some metadata"
- count: 1
-
- Properties:
- name:
- Contract: $.string().notNull()
- Meta:
- - MetaClassOne:
- description: "Name of the app"
- count: 1
- - MetaClassMany:
- count: 2
- - MetaClassMany:
- count: 3
-
- Methods:
- initialize:
- Body:
- - $._environment: $.find(std:Environment).require()
- Meta:
- MetaClassOne:
- description: "Method for initializing app"
- count: 1
-
- deploy:
- Body:
- - If: not $.getAttr(deployed, false)
- Then:
- - $._environment.reporter.report($this, 'Deploy started')
- - $._environment.reporter.report($this, 'Deploy finished')
- - $.setAttr(deployed, true)
-
-The ``Bar`` class has an instance of metadata class ``MetaClassOne`` attached.
-For this, the ``Meta`` keyword is added to the ``Bar`` class description and
-the instance of the ``MetaClassOne`` class is specified under it. This
-instance's properties are ``description`` and ``count``.
-
-There are three meta-objects attached to the ``name`` property of the ``Bar``
-class. One of it is a ``MetaclassOne`` object and the other two are
-``MetaClassMany`` objects. There can be more than one instance of
-``MetaClassMany`` attached to a single entity since the ``Cardinality``
-attribute of ``MetaClassMany`` is set to ``Many``.
-
-The ``initialize`` method of ``Bar`` also has its metadata.
-
-To attach metadata to the package, add the ``Meta`` keyword to
-``manifest.yaml`` file.
-
-Example:
-
-.. code-block:: yaml
-
- Format: 1.0
- Type: Application
- FullName: io.murano.bar.Bar
- Name: Bar
- Description: |
- Empty Description
- Author: author
- Tags: [bar]
- Classes:
- io.murano.bar.Bar: Bar.yaml
- io.murano.bar.MetaClassOne: MetaClassOne.yaml
- io.murano.bar.MetaClassMany: MetaClassMany.yaml
- Supplier:
- Name: Name
- Description: Description
- Summary: Summary
- Meta:
- io.murano.bar.MetaClassOne:
- description: "Just an empty application with some metadata"
- count: 1
-
-Obtain metadata in runtime
---------------------------
-
-Metadata can be accessed from MuranoPL using reflection capabilities and
-from Python code using existing YAQL mechanism.
-
-The following example shows how applications can access attached metadata:
-
-.. code-block:: yaml
-
- Namespaces:
- =: io.murano.bar
- std: io.murano
- res: io.murano.resources
- sys: io.murano.system
-
- Name: Bar
-
- Extends: std:Application
-
- Meta:
- MetaClassOne:
- description: "Just an empty application class with some metadata"
-
- Methods:
- sampleAction:
- Scope: Public
- Body:
- - $._environment.reporter.report($this, typeinfo($).meta.
- where($ is MetaClassOne).single().description)
-
-The ``sampleAction`` method is added to the ``Bar`` class definition. This
-makes use of metadata attached to the ``Bar`` class.
-
-The information about the ``Bar`` class is received by calling the
-``typeinfo`` function. Then metadata is accessed through the ``meta``
-property which returns the collection of all meta attached to the property.
-Then it is checked that the meta is a ``MetaClassOne`` object to ensure that
-it has ``description``. While executing the action, the phrase "Just an
-empty application class with some metadata" is reported to a log. Some
-advanced usages of MuranoPL reflection capabilities can be found in the
-corresponding section of this reference.
-
-By using metadata, an application can get information of any type attached
-to any object and use this information to change its own behavior. The most
-valuable use-cases of metadata can be:
-
-* Providing information about capabilities of application and its parts
-* Setting application requirements
-
-Capabilities can include version of software, information for use in UI or
-CLI, permissions, and any other. Metadata can also be used in requirements as
-a part of the contract.
-
-The following example demonstrates the possible use cases for the metadata:
-
-.. code-block:: yaml
-
- Name: BlogApp
-
- Meta:
- m:SomeFeatureSupport:
- support: true
-
- Properties:
- volumeName:
- Contract: $.string().notNull()
- Meta:
- m:Deprecated:
- text: "volumeName property is deprecated"
- server:
- Contract: $.class(srv:CoolServer).notNull().check(typeinfo($).meta.
- where($ is m:SomeFeatureSupport and $.support = true).any())
-
- Methods:
- importantAction:
- Scope: Public
- Meta:
- m:CallerMustBeAdmin
-
-Note, that the classes in the example do not exist as of Murano Mitaka, and
-therefore the example is not a real working code.
-
-The ``SomeFeatureSupport`` metadata with ``support: true`` says that the
-``BlogApp`` application supports some feature. The ``Deprecated`` metadata
-attached to the ``volumeName`` property informs that this
-property has a better alternative and it will not be used in the future
-versions anymore. The ``CallerMustBeAdmin`` metadata attached to the
-``importantAction`` method sets permission to execute this method to the
-admin users only.
-
-In the contract of the ``server`` property it is specified that the server
-application must be of the ``srv:CoolServer`` class and must have the
-attached meta-object of the ``m:SomeFeatureSupport`` class with the
-``support`` property set to ``true``.
diff --git a/doc/source/admin/appdev-guide/murano_pl/reflection.rst b/doc/source/admin/appdev-guide/murano_pl/reflection.rst
deleted file mode 100644
index e628c84f4..000000000
--- a/doc/source/admin/appdev-guide/murano_pl/reflection.rst
+++ /dev/null
@@ -1,269 +0,0 @@
-.. _reflection:
-
-Reflection capabilities in MuranoPL.
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Reflection provides objects that describes MuranoPL classes and packages.
-
-The first important function is ``typeinfo`` . Usage:
-
-.. code-block:: yaml
-
- $typeInfo: typeinfo($someObject)
-
-
-
-Now ``$typeInfo`` variable contains instance of type of ``$someObject`` (``MuranoClass`` instance).
-
-MuranoPL provide following abilities to reflection:
-
-
-.. _types_reflection:
-
-Types
------
-
-.. list-table::
- :header-rows: 1
- :widths: 20 80
- :stub-columns: 0
- :class: borderless
-
- * - Property
- - Description
- * - ``name``
- - name of MuranoPL class
- * - ``version``
- - version (`SemVer`_) of MuranoPL class.
- * - ``ancestors``
- - list of class ancestors
- * - ``properties``
- - list of class properties. See :ref:`properties_reflection`
- * - ``package``
- - package information. See :ref:`package_reflection`
- * - ``methods``
- - list of methods. See :ref:`methods_reflection`
- * - ``type``
- - reference to type, which can be used as argument in engine functions
-
-
-
-*Example*
-
-.. code-block:: yaml
-
- - $typeInfo: typeinfo($)
- ...
- # log name, version and package name of this class
- - $log.info("This is "{class_name}/{version} from {package}",
- class_name => $typeInfo.name,
- version => str($typeInfo.version),
- package => $typeInfo.package.name))
- - $log.info("Ancestors:")
- - For: ancestor
- In: $typeInfo.ancestors
- Do:
- #log all ancestors names
- - $log.info("{ancestor_name}", ancestor_name => $ancestor.name)
- # log full class version
- - $log.info("{version}", version => str($typeInfo.version))
- # create object with same class
- - $newObject = new($typeInfo.type)
-
-
-.. _properties_reflection:
-
-Properties
-----------
-
-
-Property introspection
-++++++++++++++++++++++
-
-.. list-table::
- :header-rows: 1
- :widths: 20 80
- :stub-columns: 0
- :class: borderless
-
- * - Property
- - Description
- * - ``name``
- - name of property
- * - ``hasDefault``
- - boolean value. `True`, if property has default value, `False` otherwise
- * - ``usage``
- - `Usage` property's field. See :ref:`property_usage` for details
- * - ``declaringType``
- - type - owner of declared property
-
-
-Property access
-+++++++++++++++
-
-.. list-table::
- :header-rows: 1
- :widths: 20 80
- :stub-columns: 0
- :class: borderless
-
- * - Methods
- - Description
- * - ``$property.setValue($target, $value)``
- - set value of ``$property`` for object ``$target`` to ``$value``
- * - ``$property.getValue($target)``
- - get value of ``$property`` for object ``$target``
-
-*Example*
-
-.. code-block:: yaml
-
- - $typeInfo: typeinfo($)
- ...
- # select first property
- - $selectedPropety: $typeInfo.properties.first()
- # log property name
- - $log.info("Hi, my name is {p_name}, p_name => $selectedProperty.name)
- # set new property value
- - $selectedProperty.setValue($, "new_value")
- # log new property value using reflection
- - $log.info("My new value is {value}", value => $selectedProperty.getValue($))
- # also, if property static, $target can be null
- - $log.info("Static property value is {value},
- value => $staticProperty.getValue(null))
-
-
-
-.. _package_reflection:
-
-Packages
---------
-
-.. list-table::
- :header-rows: 1
- :widths: 20 80
- :stub-columns: 0
- :class: borderless
-
- * - Property
- - Description
- * - ``types``
- - list of types, declared in package
- * - ``name``
- - package name
- * - ``version``
- - package version
-
-
-*Example*
-
-.. code-block:: yaml
-
- - $typeInfo: typeinfo($)
- ...
- - $packageRef: $typeInfo.package
- - $log.info("This is package {p_name}/{p_version}",
- p_name => $packageRef.name,
- p_version => str($packageRef.version))
- - $log.info("Types in package:")
- - For: type_
- In: $packageRef.types
- Do:
- - $log.info("{typename}", typename => type_.name)
-
-
-.. _methods_reflection:
-
-Methods
--------
-
-Methods properties
-++++++++++++++++++
-
-.. list-table::
- :header-rows: 1
- :widths: 20 80
- :stub-columns: 0
- :class: borderless
-
- * - Property
- - Description
- * - ``name``
- - method's name
- * - ``declaringType``
- - type - owner of declared method
- * - ``arguments``
- - list of method's arguments. See :ref:`arguments_reflection`
-
-
-Method invoking
-+++++++++++++++
-
-.. list-table::
- :header-rows: 1
- :widths: 20 80
- :stub-columns: 0
- :class: borderless
-
- * - Methods
- - Description
- * - ``$method.invoke($target, $arg1, ... $argN, kwarg1 => value1, ..., kwargN => valueN)``
- - call ``$target``'s method $method with ``$arg1``, ..., ``$argN`` positional arguments and ``kwarg1``, .... ``kwargN`` named arguments
-
-*Example*
-
-.. code-block:: yaml
-
- - $typeInfo: typeinfo($)
- ...
- # select single method by name
- - $selectedMethod: $typeInfo.methods.where($.name = sampleMethodName).single()
- # log method name
- - $log.info("Method name: {m_name}", m_name => $selectedMethod.name)
- # log method arguments names
- - For: argument
- In: $selectedMethod.arguments
- Do:
- - $log.info("{name}", name => $argument.name)
- # call method with positional argument 'bar' and named `baz` == 'baz'
- - $selectedMethod.invoke($, 'bar', baz => baz)
-
-
-.. _arguments_reflection:
-
-Method arguments
-----------------
-
-.. list-table::
- :header-rows: 1
- :widths: 20 80
- :stub-columns: 0
- :class: borderless
-
- * - Property
- - Description
- * - ``name``
- - argument's name
- * - ``hasDefault``
- - `True` if argument has default value, `False` otherwise
- * - ``declaringMethod``
- - method - owner of argument
- * - ``usage``
- - argument's usage type. See :ref:`method_arguments` for details
-
-.. code-block:: yaml
-
- - $firstArgument: $selectedMethod.arguments.first()
- # store argument's name
- - $argName: $firstArgument.name
- # store owner's name
- - $methodName: $firstArgument.declaringMethod.name
- - $log.info("Hi, my name is {a_name} ! My owner is {m_name}",
- a_name => $argName,
- m_name => $methodName)
-
-
-.. Links:
-.. _`SemVer`: http://semver.org
-
-
diff --git a/doc/source/admin/appdev-guide/murano_pl/statics.rst b/doc/source/admin/appdev-guide/murano_pl/statics.rst
deleted file mode 100644
index 93b970ae8..000000000
--- a/doc/source/admin/appdev-guide/murano_pl/statics.rst
+++ /dev/null
@@ -1,183 +0,0 @@
-.. _static_methods_and_properties:
-
-Static methods and properties
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-In MuranoPL, static denotes class methods and class properties (as opposed to
-instance methods and instance properties). These methods and properties can be
-accessed without an instance present.
-
-Static methods are often used for helper methods that are not bound to any object
-(that is, do not maintain a state) or as a convenient way to write a class factory.
-
-Type objects
-------------
-
-Usually static methods and properties are accessed using `type object`. That
-is, an object that represents the class rather than class instance.
-
-For any given class `foo.Bar` its type object may be retrieved using
-any of the following ways:
-
-* Using ``ns:Bar`` notation considering that `ns` is declared in `Namespaces`
- section (and it is `foo` in this case),
-* Using ``:Bar`` syntax if `Bar` is in the current namespace (that is, what
- ``=:Bar`` would mean if ``=`` was a valid namespace prefix),
-* Using ``type()`` function with a fully qualified class name: ``type('foo.Bar')``,
-* By obtaining a type of class instance: ``type($object)`` (available for
- packages with format version starting from `1.3`),
-* Through reflection: ``typeinfo($object).type``.
-
-No matter what method was used to get type object, the returned object will
-be the same because there can be only one type object per class.
-
-All functions that accept type name, for example ``new()`` function, also
-accept type objects.
-
-
-Accessing static methods and properties
----------------------------------------
-
-Static methods can be invoked using one of the two ways:
-
- * Using `type object`: ``ns:Bar.foo(arg)``, ``:Bar.foo(arg)``, and so on,
- * On a class instance similar to normal methods: ``$obj.foo(arg)``.
-
-Access to properties is similar to that:
- * Using `type object`: ``ns:Bar.property``, ``:Bar.property``, and so on,
- * On a class instance: ``$obj.property``.
-
-Static properties are defined on a class rather than on an instance.
-Therefore, their values will be the same for all class instances (for
-particular version of the class).
-
-
-Declaration of static methods and properties
---------------------------------------------
-
-Methods and properties are declared to be static by specifying
-``Usage: Static`` on them.
-
-For example:
-
-.. code-block:: yaml
-
- Properties:
- property:
- Contract: $.string()
- Usage: Static
-
- Methods:
- foo:
- Usage: Static
- Body:
- - Return: $.property
-
-Static properties are never initialized from object model but can be modified
-from within MuranoPL code (i.e. they are not immutable).
-Static methods also can be executed as an action from outside using
-``Scope: Public``. Within static method `Body` ``$this`` (and ``$`` if not
-set to something else in expression) are set to type object rather than to
-instance, as it is for regular methods.
-
-
-Static methods written in Python
---------------------------------
-
-For MuranoPL classes entirely or partially written in Python, all methods
-that have either ``@staticmethod`` or ``@classmethod`` decorators are
-automatically imported as static methods and work as they normally do in
-Python.
-
-
-.. _extension_methods:
-
-Extension methods
-~~~~~~~~~~~~~~~~~
-
-Extension methods are a special kind of static methods that can act as if they
-were regular instance methods of some other type.
-
-Extension methods enable you to "add" methods to existing types without
-modifying the original type.
-
-
-Defining extension methods
---------------------------
-
-Extension methods are declared with the ``Usage: Extension`` modifier.
-
-For example:
-
-.. code-block:: yaml
-
- Name: SampleClass
- Methods:
- mul:
- Usage: Extension
- Arguments:
- - self:
- Contract: $.int().notNull()
- - arg:
- Contract: $.int().notNull()
- Body:
- Return: $self * $arg
-
-Extension method are said to extend some other type and that type is deducted
-from the first method argument contract. Thus extension methods must have
-at least one argument.
-
-Extension methods can also be written in Python just the same way as static
-methods. However one should be careful in method declaration and use precise
-YAQL specification of the type of first method argument otherwise the method
-will become an extension of any type.
-
-To turn Python static method into extension method it must be decorated with
-``@yaql.language.specs.meta('Usage', 'Extension')`` decorator.
-
-
-Using extension methods
------------------------
-
-The example above defines a method that extends integer type. Therefore, with
-the method above it becomes possible to say ``2.mul(3)``. However, the most
-often usage is to extend some existing MuranoPL class using ``class()``
-contract.
-
-If the first argument contract does not have ``notNull()``, then the method
-can be invoked on the ``null`` object as well (like ``null.foo()``).
-
-Extension methods are static methods and, therefore,can be invoked in a usual
-way on type object: ``:SampleClass.mul(2, 3)``. However, unlike regular static
-methods extensions cannot be invoked on a class instance because this can
-result in ambiguity.
-
-
-Using extension lookup order
-----------------------------
-
-When somewhere in the code the ``$foo.bar()`` expression is encountered, MuranoPL
-uses the following order to locate bar() ``implementation``:
-
-* If there is an instance or static method in ``$foo``'s class, it will be used.
-* Otherwise if the current class (where this expression was encountered) has
- an extension method called ``bar`` and ``$foo`` satisfies the contract of
- its first argument, then this method will be called.
-
-Normally, if no method was found an exception will be raised. However,
-additional extension methods can be imported into the current context. This is
-done using the ``Import`` keyword on a class level. The ``Import`` section
-specifies either a list or a single type name (or type object) which extension
-methods will be available anywhere within the class code:
-
-.. code-block:: yaml
-
- Name: MyClass
- Import:
- - ns:SomeOtherType
- - :ClassFomCurrentContext
- - 'io.murano.foo.Bar'
-
-If no method was found with the algorithm above, the search continues on
-extension methods of all classes listed in the ``Import`` section in the order
-types are listed.
diff --git a/doc/source/admin/appdev-guide/murano_pl/versioning.rst b/doc/source/admin/appdev-guide/murano_pl/versioning.rst
deleted file mode 100644
index c73fdeb56..000000000
--- a/doc/source/admin/appdev-guide/murano_pl/versioning.rst
+++ /dev/null
@@ -1,185 +0,0 @@
-.. _versioning:
-
-Versioning
-~~~~~~~~~~
-
-Versioning is an ability to assign a version number to some particular package
-(and, in turn, to a class) and then distinguish packages with different
-versions.
-
-Package version
----------------
-
-It is possible to specify a version for packages. You can import several
-versions of the same package simultaneously and even deploy them inside a
-single environment. To do this, you should use Glare as a storage for packages.
-But if you're going to keep only the latest version API is still good enough
-and both FormatVersion and Version rules will still be there. For more
-information about using Glare, refer to :ref:`glare_usage`.
-
-To specify the version of your package, add a new section to the manifest file:
-
- .. code-block:: yaml
-
- Version: 0.1.0
-
- ..
-
-It should be standard SemVer format version string consisting of 3 parts:
-``Major.Minor.Patch`` and optional SemVer suffixes
-``[-dev-build.label[+metadata.label]]``.
-All MuranoPL classes have the version of the package they are contained in.
-If no version is specified, the package version is *0.0.0*.
-
-.. note::
- It is impossible to show multiple versions of the same application in murano
- dashboard: only the last one is shown if the multiple versions are present.
-
-Package requirements
---------------------
-
-In some cases, packages may require other packages for their work.
-You need to list such packages in the `Require` section of the manifest
-file:
-
- .. code-block:: yaml
-
- Require:
- package1_FQN: version_spec_1
- ...
- packageN_FQN: version_spec_N
-
- ..
-
-``version_spec`` here denotes the allowed version range. It can be either in
-semantic_version specification pip-like format or as a partial version string.
-If you do not want to specify the package version, leave this value empty:
-
- .. code-block:: yaml
-
- Require:
- package1_FQN: '>=0.0.3'
- package2_FQN:
-
- ..
-
-In this case, version specification is equal to *0*.
-
-
-.. note::
- All packages depend on the `io.murano` package (Core Library). If you do not
- specify this requirement in the list (or the list is empty, or there is
- no ``Require`` key in the package manifest), then dependency *io.murano: 0*
- will be automatically added.
-
-
-Object version
---------------
-
-You can specify the version of the objects in UI definition when your
-application requires a specific version of some class. To do this, add a new key
-``classVersion`` to section ``?`` describing the object:
-
- .. code-block:: yaml
-
- ?:
- type: io.test.apps.TestApp
- classVersion: version_spec
-
- ..
-
-
-Side-by-side versioning of packages
------------------------------------
-
-In some cases it might happen that several different versions of the same class
-are simultaneously present in a single environment:
-
- * There are different versions of the same MuranoPL class inside a single
- object model (environment).
- * Several class versions encounter within class parents. For example, class A
- extends B and C and class C inherits B2, where B and B2 are two different
- versions of the same class.
-
-The first case, when two different versions of the same class need to communicate
-with each other, is handled by the fact that in order to do that there is a
-``class()`` contract for that value. ``class()`` contract validates object
-version against package requirements. If class A has a property with contract
-$.class(B), then an object passed in this property when upcasted to B must have a
-version compatible with requirement specification in A's package (requesting
-B's package).
-
-For the second case, where a single class attempts to inherit from two
-different versions of the same class engine (DSL), it attempts to find a
-version of this class which satisfies all parties and use it instead.
-However, if it is impossible, all remained different versions of the same class
-are treated as if they are unrelated classes.
-
-For example: classA inherits classB from packageX and classC from packageY.
-Both classB and classC inherit from classD from packageZ; however, packageX
-depends on the version 1.2.0 of packageZ, while packageY depends on the
-version 1.3.0. This leads to a situation when classA transitively inherits
-classD of both versions 1.2 and 1.3. Therefore, an exception is thrown.
-However, if packageY's dependency would be just "1" (which means any of the
-1.x.x family), the conflict would be resolved and the 1.2 would be used as it
-satisfies both inheritance chains.
-
-Murano engine is free to use any package version that is valid for the spec.
-For example, one application requires packageX with version spec < 0.3 and
-another package with the spec > 0. If both packages are get used in the same
-environment and the engine already loaded version 0.3 it can still use it for
-the second requirement even if there is a package with version 0.4 in the
-catalog and the classes from both classes are never interfere. In other words,
-engine always tries to minimize the number of versions in use for
-the single package to avoid conflicts and unnecessary package downloads.
-However, it also means that packages not always get the latest requirements.
-
-.. _ManifestFormat:
-
-Manifest format versioning
---------------------------
-
-The manifests of packages are versioned using *Format* attribute. Currently,
-available versions are: `1.0`, `1.1`, `1.2` and `1.3`.
-The versioning of manifest format is directly connected with YAQL and version
-of murano itself.
-
-The short description of versions:
-
-================== ===========================================================
- Format version Description
-================== ===========================================================
- **1.0** supported by all versions of murano. Use this version
- if you are planning to use *yaql 0.2* in your
- application
-
- **1.1** supported since Liberty. *yaql 0.2* is supported in
- legacy mode. Specify it, if you want to use features
- from *yaql 0.2* and *yaql 1.0.0* at the same time in
- your application.
-
- **1.2** supported since Liberty. Do not use *yaql 0.2* in
- applications with this format.
-
- **1.3** supported since Mitaka. *yaql 1.1* is available. It's
- recommended specifying this format in new applications,
- where compatibility with older versions of murano is not
- required.
-
- **1.4** supported since Newton. Keyword ``Scope`` is introduced
- for class methods to declare method's accessibility from
- outside through the API call.
-================== ===========================================================
-
-UI forms versioning
--------------------
-
-UI forms are versioned using Format attribute inside YAML definition.
-For more information, refer to :ref:`corresponding documentation`.
-
-Execution plan format versioning
---------------------------------
-
-Format of an execution plan can be specified using property ``FormatVersion``.
-More information can be found :ref:`here`.
-
diff --git a/doc/source/admin/appdev-guide/murano_pl/yaml.rst b/doc/source/admin/appdev-guide/murano_pl/yaml.rst
deleted file mode 100644
index 1e89f523b..000000000
--- a/doc/source/admin/appdev-guide/murano_pl/yaml.rst
+++ /dev/null
@@ -1,35 +0,0 @@
-.. _yaml:
-
-YAML
-~~~~
-
-YAML is an easily readable data serialization format that is a superset
-of JSON. Unlike JSON, YAML is designed to be read and written by humans
-and relies on visual indentation to denote nesting of data structures.
-This is similar to how Python uses indentation for block structures
-instead of curly brackets in most C-like languages. Also YAML may
-contain more data types as compared to JSON. See http://yaml.org/
-for a detailed description of YAML.
-
-MuranoPL is designed to be representable in YAML so that MuranoPL code could
-remain readable and structured. Usually MuranoPL files are YAML encoded documents.
-But MuranoPL engine itself does not deal directly with YAML documents, and it is up to
-the hosting application to locate and deserialize the definitions of particular classes.
-This gives the hosting application the ability to control where those definitions can be
-found (a file system, a database, a remote repository, etc.) and possibly use some other
-serialization formats instead of YAML.
-
-MuranoPL engine relies on a host deserialization code when detecting YAQL
-expressions in a source definition. It provides them as instances of the YaqlExpression
-class rather than plain strings. Usually, YAQL expressions can be distinguished by the
-presence of $ (the dollar sign) and operators, but in YAML, a developer can always
-state the type by using YAML tags explicitly. For example:
-
-.. code-block:: yaml
- :linenos:
-
- Some text - a string
- $.something() - a YAQL expression
- "$.something()" - a string because quotes are used
- !!str $ - a string because a YAML tag is used
- !yaql "text" - a YAQL expression because a YAML tag is used
diff --git a/doc/source/admin/appdev-guide/murano_pl/yaql.rst b/doc/source/admin/appdev-guide/murano_pl/yaql.rst
deleted file mode 100644
index f9a754490..000000000
--- a/doc/source/admin/appdev-guide/murano_pl/yaql.rst
+++ /dev/null
@@ -1,46 +0,0 @@
-.. _yaql:
-
-YAQL
-~~~~
-
-YAQL (Yet Another Query Language) is a query language that was also
-designed as a part of the murano project. MuranoPL makes an extensive
-use of YAQL. A description of YAQL can be found `here `_.
-
-Simply speaking, YAQL is the language for expression evaluation.
-The following examples are all valid YAQL expressions:
-``2 + 2, foo() > bar(), true != false``.
-
-The interesting thing in YAQL is that it has no built in list of
-functions. Everything YAQL can access is customizable. YAQL cannot call
-any function that was not explicitly registered to be accessible by YAQL.
-The same is true for operators. So the result of the expression 2 *
-foo(3, 4) completely depends on explicitly provided implementations
-of "foo" and "operator_*".
-
-YAQL uses a dollar sign ($) to access external variables, which are also
-explicitly provided by the host application, and function arguments.
-``$variable`` is a syntax to get a value of the variable "$variable",
-$1, $2, etc. are the names for function arguments. "$" is a name for current object:
-data on which an expression is evaluated, or a name of a single argument. Thus,
-"$" in the beginning of an expression and "$" in the middle of it can refer
-to different things.
-
-By default, YAQL has a lot of functions that can be registered in a YAQL
-context. This is very similar to how SQL works but uses more Python-like
-syntax. For example: :code:`$.where($.myObj.myScalar > 5`,
-:code:`$.myObj.myArray.len() > 0`, and :code:`$.myObj.myArray.any($ = 4)).select($.myObj.myArray[0])` can be executed on :code:`$ = array` of objects,
-and result in another array that is a filtration and projection of a source data.
-
-.. note::
- There is no assignment operator in YAQL, and ``=`` means
- comparison, the same what ``==`` means in Python.
-
-As YAQL has no access to underlying operating system resources and
-is fully controllable by the host, it is secure to execute YAQL expressions
-without establishing a trust to the executed code. Also, because functions
-are not predefined, different methods can be accessible in different
-context. So, YAQL expressions that are used to specify property
-contracts are not necessarily valid in workflow definitions.
-
-
diff --git a/doc/source/admin/appdev-guide/muranopackages/dynamic_ui.rst b/doc/source/admin/appdev-guide/muranopackages/dynamic_ui.rst
deleted file mode 100644
index 9d36970d6..000000000
--- a/doc/source/admin/appdev-guide/muranopackages/dynamic_ui.rst
+++ /dev/null
@@ -1,612 +0,0 @@
-.. _DynamicUISpec:
-
-Dynamic UI definition specification
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The main purpose of Dynamic UI is to generate application creation
-forms "on-the-fly". The Murano dashboard does not know anything about
-applications that will be presented in the catalog and which web forms are
-required to create an application instance. So all application definitions
-should contain an instruction, which tells the dashboard how to create an
-application and what validations need to be applied. This document will help
-you to compose a valid UI definition for your application.
-
-The UI definition should be a valid YAML file and may contain the following
-sections (for version 2.x):
-
-* **Version**
- Points out the syntax version in use. *Optional*
-* **Templates**
- An auxiliary section, used together with an Application section
- to help with object model composing. *Optional*
-* **Parameters**
- An auxiliary section for evaluated once parameters. *Optional*
-* **ParametersSource**
- A static action name (ClassName.methodName) to call for additional
- parameters. *Optional*
-* **Application**
- Object model description passed to murano engine and used for application
- deployment. *Required*
-* **Forms**
- Web form definitions. *Required*
-
-.. _DynamicUIversion:
-
-Version
--------
-
-The syntax and format of dynamic UI definitions may change over time, so the
-concept of *format versions* is introduced. Each UI definition file may contain
-a top-level section called *Version* to indicate the minimum version of Murano
-Dynamic UI platform which is capable to process it.
-If the section is missing, the format version is assumed to be latest supported.
-
-The version consists of two non-negative integer segments, separated by a dot,
-i.e. has a form of *MAJOR.MINOR*.
-Dynamic UI platforms having the same MAJOR version component are compatible:
-i.e. the platform having the higher version may process UI definitions with
-lower versions if their MAJOR segments are the same.
-For example, Murano Dynamic UI platform of version 2.2 is able to process UI
-definitions of versions 2.0, 2.1 and 2.2, but is unable to process 3.0 or
-1.9.
-
-Currently, the latest version of Dynamic UI platform is 2.3. It is incompatible
-with UI definitions of Version 1.0, which were used in Murano releases before
-Juno.
-
-.. note::
-
- Although the ``Version`` field is considered to be optional, its default
- value is the latest supported version. So if you intent to use applications
- with the previous stable murano version, verify that the version
- is set correctly.
-
-Version history
-~~~~~~~~~~~~~~~
-
-+---------+-------------------------------------------------------------------+-------------------+
-| Version | Changes | OpenStack Version |
-+=========+===================================================================+===================+
-| 1.0 | - Initial Dynamic UI implementation | Icehouse |
-+---------+-------------------------------------------------------------------+-------------------+
-| 2.0 | - *instance* field support is dropped | Juno, Kilo |
-| | - New *Application* section that describes engine object model | |
-| | - New *Templates* section for keeping reusable pieces of Object | |
-+---------+-------------------------------------------------------------------+-------------------+
-| 2.1 | - New *network* field provides a selection of networks and | Liberty |
-| | their subnetworks as a dropdown populated with those which are | |
-| | available to the current tenant. | |
-+---------+-------------------------------------------------------------------+-------------------+
-| 2.2 | - Now *application name* is added automatically to the last | Liberty |
-| | service form. It is needed for a user to recognize one | |
-| | created application from another in the UI. Previously all | |
-| | application definitions contained the *name* property. So to | |
-| | support backward compatibility, you need to manually remove | |
-| | *name* field from class properties. | |
-+---------+-------------------------------------------------------------------+-------------------+
-| 2.3 | - Now *password* field supports ``confirmInput`` flag and | Mitaka |
-| | validator overloading with single ``regexpValidator`` or | |
-| | multiple *validators* attribute. | |
-+---------+-------------------------------------------------------------------+-------------------+
-| 2.4 | - Parameters and ParametersSource sections were added | Ocata |
-| | - ref() YAQL function were added to Application DSL | |
-| | - YAQL expressions can be used anywhere in the form definition | |
-| | - choice control accepts choices in dictionary format | |
-+---------+-------------------------------------------------------------------+-------------------+
-
-Application
------------
-
-The Application section describes an *application object model*.
-The model is a dictionary (document) of application property values (inputs).
-Property value might be of any JSON-serializable type (including lists and
-maps). In addition the value can be of an object type (another application,
-application component, list of components etc.). Object properties are
-represented either by the object model of the component (i.e. dictionary) or
-by an object ID (string) if the object was already defined elsewhere.
-Each object definition (including the one in Application itself) must have a
-special ``?`` key called ``object header``. This key holds object metadata most
-important of which is the object type name. Thus the Application might look
-like this:
-
-.. code-block:: yaml
-
- Application:
- ?:
- type: "com.myCompany.myNamespace.MyClass"
- property1: "string property value"
- property2: 123
- property3:
- key1: value1
- key2: [1, false, null]
- property4:
- ?:
- type: "com.myCompany.myNamespace.MyComponent"
- property: value
-
-However in most cases the values in object model should come from input fields
-rather than being static as in example above. To achieve this, object model
-values can also be of a `YAQL `
-expression type. With expressions language it becomes possible to retrieve
-input control values, do some calculations and data transformations (queries).
-Any YAML value that is not enclosed in quote marks and conforms to the YAQL
-syntax is considered to be a YAQL expression. There is also an explicit
-YAML tag for the YAQL expressions: ``!yaql``.
-
-So with the YAQL addition ``Application`` section might look like this:
-
-.. code-block:: yaml
-
- Application:
- ?:
- type: "com.myCompany.myNamespace.MyClass"
- property1: $.formName.controlName
- property2: 100 + 20 + 3
- property3:
- !yaql "'KEY1'.toLower()'": !yaql "value1 + '1'"
- key2: [$parameter, not true]
- property4: null
-
-When evaluating YAQL expressions ``$`` is set to the forms data (list of
-dictionaries with cleaned validated forms' data) and templates and parameters
-are available using $templateName ($parameterName) syntax. See below on
-templates and parameters.
-
-YAQL comes with hundreds of functions bundled. In addition to that there are
-another four functions provided by murano dashboard:
-
-* **generateHostname(pattern, index)** is used for a machine hostname template
- generation. It accepts two arguments: name pattern (string) and index
- (integer). If '#' symbol is present in name pattern, it will be replaced
- with the index provided. If pattern is an empty string, a random name will be
- generated.
-* **repeat(template, times)** is used to produce a list of data snippets, given
- the template snippet (first argument) and number of times it should be
- reproduced (second argument). Inside that template snippet current step can
- be referenced as *$index*.
-* **name()** returns current application name.
-* **ref(templateName [, parameterName] [, idOnly])** is used to generate object
- definition from the template and then reference it several times in the
- object model. This function evaluates template ``templateName`` and
- fixes the result in parameters under ``parameterName`` key (or
- ``templateName`` if the second parameter was omitted). Then it generates
- object ID and places it into ``?/id`` field. On the first use of
- ``parameterName`` or if ``idOnly`` is ``false`` the function will return
- the whole object structure. On subsequent calls or if ``idOnly`` is
- ``true`` it will return the ID that was generated upon the first call.
-
-Templates
----------
-
-It is often that application object model contains number of similar instances
-of the same component/class. For example it might be list of servers for
-multi-server application or list of nodes or list of components. For such cases
-UI definition markup allow to give the repeated object model snippet a name
-and then refer to it by the name in the application object model.
-Such snippets are placed into ``Templates`` section:
-
-.. code-block:: yaml
-
- Templates:
- primaryController:
- ?:
- type: "io.murano.windows.activeDirectory.PrimaryController"
- host:
- ?:
- type: "io.murano.windows.Host"
- adminPassword: $.appConfiguration.adminPassword
- name: generateHostname($.appConfiguration.unitNamingPattern, 1)
- flavor: $.instanceConfiguration.flavor
- image: $.instanceConfiguration.osImage
-
- secondaryController:
- ?:
- type: "io.murano.windows.activeDirectory.SecondaryController"
- host:
- ?:
- type: "io.murano.windows.Host"
- adminPassword: $.appConfiguration.adminPassword
- name: generateHostname($.appConfiguration.unitNamingPattern, $index + 1)
- flavor: $.instanceConfiguration.flavor
- image: $.instanceConfiguration.osImage
-
-Then the template can be inserted into application object model or to another
-template using ``$templateName`` syntax. It is often case that it is used
-together with ``repeat`` function to put several instances of template. In
-this case templates may use of ``$index`` variable which will hold current
-iteration number:
-
-.. code-block:: yaml
-
- Application:
- ?:
- type: io.murano.windows.activeDirectory.ActiveDirectory
- primaryController: $primaryController
- secondaryControllers: repeat($secondaryController, $.appConfiguration.dcInstances - 1)
-
-
-It is important to remember that templates are evaluated upon each access or
-``repeat()`` iteration. Thus if the template has some properties set to a
-random or generated values they are going to be different for each instance
-of the template.
-
-Another use case for templates is when single object is referenced several
-times within application object model:
-
-.. code-block:: yaml
-
- Templates:
- instance:
- ?:
- type: "io.murano.resources.LinuxMuranoInstance"
- image: myImage
- flavor: "m1.small"
-
- Application:
- ?:
- type: "com.example.MyApp"
- components:
- - ?:
- type: "com.example.MyComponentType1"
- instance: ref(instance)
- - ?:
- type: "com.example.MyComponentType2"
- instance: ref(instance)
-
-In example above there are two components that uses the same server instance.
-If this example had ``$instance`` instead of ``ref(instance)`` that would
-be two unrelated servers based on the same template i.e. with the same image
-and flavor, but not the same VM.
-
-
-Parameters and ParametersSource
--------------------------------
-
-Parameters are values that are used to parametrize the UI form and/or
-application object model. Parameters are put into ``Parameters`` section and
-accessed using ``$parameterName`` syntax:
-
-.. code-block:: yaml
-
- Parameters:
- param1: "Hello!"
-
- Application:
- ?:
- type: "com.example.MyApp"
- stringProperty: $param1
-
-Parameters are very similar to Templates with two differences:
-
-#. Parameter values are evaluated only once per application instance at the
- very beginning whereas templates are evaluated on each access.
-
-#. Parameter values can be used to initialize UI control attributes (e.g.
- initial text box value, list of choices for a drop down etc.)
-
-However the most powerful feature about parameters is that their values
-might be obtained from the application class. Here is how to do it:
-
-#. In one of the classes in the MuranoPL package (usually the main application
- class define a static action method without arguments that returns a
- dictionary of variables:
-
- .. code-block:: yaml
-
- Name: "com.example.MyApp"
- Methods:
- myMethod:
- Usage: Static
- Scope: Public
- Body:
- # arbitrary MuranoPL code can be used here
- Return:
- var1: value1
- var2: 123
-
-#. In UI definition file add
- .. code-block:: yaml
-
- ParametersSource: "com.example.MyApp.myMethod"
-
- The class name may be omitted. In this case the dashboard will try to use
- the type of Application object or package FQN for that purpose.
-
-The values returned by the method are going to be merged into Parameters
-section like if they were defined statically.
-
-
-
-
-
-Forms
------
-
-This section describes markup elements for defining forms, which are currently
-rendered and validated with Django. Each form has a name, field definitions
-(mandatory), and validator definitions (optionally).
-
-Note that each form is split into 2 parts:
-
-* **input area** - left side, where all the controls are located
-* **description area** - right side, where descriptions of the controls are located
-
-Each field should contain:
-
-* **name** - system field name, could be any
-* **type** - system field type
-
-Currently supported options for **type** attribute are:
-
-* *string* - text field (no inherent validations) with one-line text input
-* *boolean* - boolean field, rendered as a checkbox
-* *text* - same as string, but with a multi-line input
-* *integer* - integer field with an appropriate validation, one-line text input
-* *choice* - drop-down list of variants. Each variant has a display string that
- is going to be displayed to the user and associated key that is going to be
- a control value
-* *password* - text field with validation for strong password, rendered as two
- masked text inputs (second one is for password confirmation)
-* *clusterip* - specific text field, used for entering cluster IP address
- (validation for valid IP address syntax)
-* *databaselist* - specific field, a list of databases (comma-separated list of
- databases' names, where each name has the following syntax first symbol
- should be latin letter or underscore; subsequent symbols can be latin
- letter, numeric, underscore, at the sign, number sign or dollar sign),
- rendered as one-line text input
-* *image* - specific field, used for filtering suitable images by image type
- provided in murano metadata in glance properties.
-* *flavor* - specific field, used for selection instance flavor from a list
-* *keypair* - specific field, used for selecting a keypair from a list
-* *azone* - specific field, used for selecting instance availability zone from
- a list
-* *network* - specific field, used to select a network and subnet from a list
- of the ones available to the current user
-* *securitygroup* - specific field, used for selecting a custom security group
- to assign to the instance
-* *volume* - specific field, used for selecting a volume or a volume snapshot
- from a list of available volumes (and volume snapshots)
-* any other value is considered to be a fully qualified name for some
- Application package and is rendered as a pair of controls: one for selecting
- already existing Applications of that type in an Environment, second - for
- creating a new Application of that type and selecting it
-
-Other arguments (and whether they are required or not) depends on a
-field's type and other attributes values. Most of them are standard Django
-field attributes. The most common attributes are the following:
-
-* **label** - name, that will be displayed in the form; defaults to **name**
- being capitalized.
-* **description** - description, that will be displayed in the description area.
- Use YAML line folding character ``>-`` to keep the correct formatting during
- data transferring.
-* **descriptionTitle** - title of the description, defaults to **label**;
- displayed in the description area
-* **hidden** whether field should be visible or not in the input area.
- Note that hidden field's description will still be visible in the
- descriptions area (if given). Hidden fields are used storing some data to be
- used by other, visible fields.
-* **minLength**, **maxLength** (for string fields) and **minValue**,
- **maxValue** (for integer fields) are transparently translated into django
- validation properties.
-* **choices** - a choices for the ``choice`` control type. The format is
- ``[["key1", "display value1"], ["key2", "display value2"]]``. Starting from
- version 2.4 this can also be passed as a
- ``{key1: "display value1", key2: "display value2"}``
-* **regexpValidator** - regular expression to validate user input. Used with
- *string* or *password* field.
-* **errorMessages** - dictionary with optional 'invalid' and 'required' keys
- that set up what message to show to the user in case of errors.
-* **validators** is a list of dictionaries, each dictionary should at least
- have *expr* key, under that key either some
- `YAQL `_
- expression is stored, either one-element dictionary with *regexpValidator*
- key (and some regexp string as value).
- Another possible key of a validator dictionary is *message*, and although
- it is not required, it is highly desirable to specify it - otherwise, when
- validator fails (i.e. regexp doesn't match or YAQL expression evaluates to
- false) no message will be shown. Note that field-level validators use YAQL
- context different from all other attributes and section: here *$* root object
- is set to the value of field being validated (to make expressions shorter).
-
- .. code-block:: yaml
-
- - name: someField
- type: string
- label: Domain Name
- validators:
- - expr:
- regexpValidator: '(^[^.]+$|^[^.]{1,15}\..*$)'
- message: >-
- NetBIOS name cannot be shorter than 1 symbol and
- longer than 15 symbols.
- - expr:
- regexpValidator: '(^[^.]+$|^[^.]*\.[^.]{2,63}.*$)'
- message: >-
- DNS host name cannot be shorter than 2 symbols and
- longer than 63 symbols.
- helpText: >-
- Just letters, numbers and dashes are allowed.
- A dot can be used to create subdomains
-
- Using of *regexpValidator* and *validators* attributes with *password*
- field was introduced in version 2.3. By default, password should have at
- least 7 characters, 1 capital letter, 1 non-capital letter, 1 digit, and 1
- special character. If you do not want password validation to be so strong,
- you can override it by setting a custom validator or multiple validators for
- password. For that add *regexpValidator* or *validators* to the *password*
- field and specify custom regexp string as value, just like with any *string*
- field.
-
- *Example*
-
- .. code-block:: yaml
-
- - name: password
- type: password
- label: Password
- descriptionTitle: Password
- description: >-
- Please, provide password for the application. Password should be
- 5-50 characters long and consist of alphanumeric characters
- regexpValidator: '^[a-zA-Z0-9]{5,50}?$'
-
-* **confirmInput** is a flag used only with password field and defaults to
- ``true``. If you decided to turn off automatic password field cloning, you
- should set it to ``false``. In this case password confirmation is not
- required from a user.
-
-* **widgetMedia** sets some custom *CSS* and *JavaScript* used for the field's
- widget rendering. Note, that files should be placed to Django static folder
- in advance. Mostly they are used to do some client-side field
- enabling/disabling, hiding/unhiding etc.
-
-* **requirements** is used only with flavor field and prevents user to pick
- unstable for a deployment flavor.
- It allows to set minimum ram (in MBs), disk space (in GBs) or virtual CPU
- quantity.
-
- Example that shows how to hide items smaller than regular *small* flavor
- in a flavor select field:
-
- .. code-block:: yaml
-
- - name: flavor
- type: flavor
- label: Instance flavor
- requirements:
- min_disk: 20
- min_vcpus: 2
- min_memory_mb: 2048
-
-* **include_snapshots** is used only with the volume field. ``True`` by default.
- If ``True``, the field list includes available volumes and volume snapshots.
- If set to ``False``, only available volumes are shown.
-
-* **include_subnets** is used only with network field. ``True`` by default.
- If ``True``, the field list includes all the possible combinations of network
- and subnet. E.g. if there are two available networks X and Y, and X has two
- subnets A and B, while Y has a single subnet C, then the list will include 3
- items: (X, A), (X, B), (Y, C). If set to ``False`` only network names will be
- listed, without their subnets.
-
-* **filter** is used only with network field. ``None`` by default. If set to a
- regexp string, will be used to display only the networks with names matching
- the given regexp.
-
-* **murano_networks** is used only with network field. ``None`` by default. May
- have values ``None``, ``exclude`` or ``translate``. Defines the handling of
- networks which are created by murano.
- Such networks usually have very long randomly generated names, and thus look
- ugly when displayed in the list. If this value is set to ``exclude`` then these
- networks are not shown in the list at all. If set to ``translate`` the
- names of such networks are replaced by a string ``Network of %env_name%``.
-
- .. note::
- This functionality is based on the simple string matching of the
- network name prefix and the names of all the accessible murano
- environments. If the environment is renamed after the initial deployment
- this feature will not be able to properly translate or exclude its network
- name.
-
-* **allow_auto** is used only with network field. ``True`` by default. Defines if
- the default value of the dropdown (labeled "Auto") should be present in the
- list. The default value is a tuple consisting of two ``None`` values. The logic
- on how to treat this value is up to application developer. It is suggested to
- use this field to indicate that the instance should join default environment
- network. For use-cases where such behavior is not desired, this parameter
- should be set to ``False``.
-
-*Network* field and its specific attributes (*include_subnets*, *filter*,
-*murano_networks*, *allow_auto*) are available since version 2.1.
-Before that, there was no way for the end user to select existing network in
-the UI. The only way to change the default networking behavior was the usage
-of networking.yaml file. It allows to override the networking setting at
-the environment level, for all the murano environments of all the tenants.
-Now you can simple add a *network* field to your form definition and provide
-the ability to select the desired network for the specific application.
-
-*Example*
-
-.. code-block:: yaml
-
- - instanceConfiguration:
- fields:
- - name: network
- type: network
- label: Network
- description: Select a network to join. 'Auto' corresponds to a default environment's network.
- murano_networks: translate
-
-Besides field-level validators, form-level validators also exist. They
-use **standard context** for YAQL evaluation and are required when
-there is a need to validate some form's constraint across several
-fields.
-
-*Example*
-
-.. code-block:: yaml
-
- Forms:
- - appConfiguration:
- fields:
- - name: dcInstances
- type: integer
- hidden: true
- initial: 1
- required: false
- maxLength: 15
- helpText: Optional field for a machine hostname template
- - name: unitNamingPattern
- type: string
- label: Instance Naming Pattern
- required: false
- maxLength: 64
- regexpValidator: '^[a-zA-Z][-_\w]*$'
- errorMessages:
- invalid: Just letters, numbers, underscores and hyphens are allowed.
- helpText: Just letters, numbers, underscores and hyphens are allowed.
- description: >-
- Specify a string that will be used in a hostname instance.
- Just A-Z, a-z, 0-9, dash, and underline are allowed.
-
-
- - instanceConfiguration:
- fields:
- - name: title
- type: string
- required: false
- hidden: true
- descriptionTitle: Instance Configuration
- description: Specify some instance parameters based on which service will be created.
- - name: flavor
- type: flavor
- label: Instance flavor
- description: >-
- Select a flavor registered in OpenStack. Consider that service performance
- depends on this parameter.
- required: false
- - name: osImage
- type: image
- imageType: windows
- label: Instance image
- description: >-
- Select valid image for a service. Image should already be prepared and
- registered in glance.
- - name: availabilityZone
- type: azone
- label: Availability zone
- description: Select an availability zone, where service will be installed.
- required: false
- validators:
- # if unitNamingPattern is given and dcInstances > 1, then '#' should occur in unitNamingPattern
- - expr: $.appConfiguration.dcInstances < 2 or not $.appConfiguration.unitNamingPattern.bool()
- or '#' in $.appConfiguration.unitNamingPattern
- message: Incrementation symbol "#" is required in the Instance Naming Pattern
-
-Control attributes might be initialized with a YAQL expression. However prior
-to version 2.4 it only worked for forms other than the first. It was designed
-to initialize controls with values input on the previous step. Starting with
-version 2.4 this limitation was removed and it become possible to use
-arbitrary YAQL expressions for any of control fields on any forms and use
-parameter values as part of these expressions.
diff --git a/doc/source/admin/appdev-guide/muranopackages/package_structure.rst b/doc/source/admin/appdev-guide/muranopackages/package_structure.rst
deleted file mode 100644
index 941c90dc4..000000000
--- a/doc/source/admin/appdev-guide/muranopackages/package_structure.rst
+++ /dev/null
@@ -1,41 +0,0 @@
-.. _package_structure:
-
-Package structure
-~~~~~~~~~~~~~~~~~
-
-The structure of the Murano application package is predefined. An
-application could be successfully uploaded to an application catalog.
-
-The application package root folder should contain the following:
-
-**manifest.yaml** file
- is an application entry point.
-
- .. note:: the filename is fixed, do not use any custom names.
-
-**Classes** folder
- contains MuranoPL class definitions.
-
-**Resources** folder
- contains execution plan templates and the **scripts**
- folder with all the files required for an application
- deployment located in it.
-
-**UI** folder
- contains the dynamic UI YAML definitions.
-
-**logo.png** file (optional)
- is an image file associated to your application.
-
- .. note::
- There are no any special limitations regarding an image filename.
- Though, if it differs from the default ``logo.png``, specify it
- in an application manifest file.
-
-**images.lst** file (optional)
- contains a list of images required by an application.
-
-Here is the visual representation of the Murano application
-package structure:
-
-.. image:: ../figures/structure.png
diff --git a/doc/source/admin/appdev-guide/muranopackages/repository.rst b/doc/source/admin/appdev-guide/muranopackages/repository.rst
deleted file mode 100644
index 0f514877d..000000000
--- a/doc/source/admin/appdev-guide/muranopackages/repository.rst
+++ /dev/null
@@ -1,31 +0,0 @@
-.. _repository:
-
-Murano package repository
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Murano client and dashboard can install both packages and bundles of packages from murano repository. To do so you should set MURANO_REPO_URL settings in murano dashboard or MURANO_REPO_URL env variable for the CLI client, and use a respective command to import the package. These commands automatically import all the prerequisites required to install the application along with any images mentioned in the applications.
-
-Setting up your own repository
-------------------------------
-
-It is fairly easy to set up your own murano package repository. To do so you need a web server that would serve 3 directories:
- * /apps/
- * /bundles/
- * /images/
-
-When importing an application by name, the client appends any version info, if present to the application name, ``.zip`` file extension and searches for that file in the ``apps`` directory.
-
-When importing a bundle by name, the client appends ``.bundle`` file extension to the bundle name and searches it in the bundles directory. A bundle file is a JSON or a YAML file with the following structure:
-
-.. code-block:: json
-
- {"Packages":
- [
- {"Name": "com.example.ApacheHttpServer"},
- {"Version": "", "Name": "com.example.Nginx"},
- {"Version": "0.0.1", "Name": "com.example.Lighttpd"}
- ]
- }
-
-Glance images can be auto-imported by the client, when mentioned in ``images.lst`` inside the package. Please see :ref:`step-by-step` for more information about package composition.
-When importing images from the ``image.lst`` file, the client simply searches for a file with the same name as the name attribute of the image in the ``images`` directory of the repository.
diff --git a/doc/source/admin/appdev-guide/step-by-step/configure-step1.png b/doc/source/admin/appdev-guide/step-by-step/configure-step1.png
deleted file mode 100644
index 8b0dc0744..000000000
Binary files a/doc/source/admin/appdev-guide/step-by-step/configure-step1.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/step-by-step/configure-step2.png b/doc/source/admin/appdev-guide/step-by-step/configure-step2.png
deleted file mode 100644
index 5114dbdfe..000000000
Binary files a/doc/source/admin/appdev-guide/step-by-step/configure-step2.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/step-by-step/hello-world-desc.png b/doc/source/admin/appdev-guide/step-by-step/hello-world-desc.png
deleted file mode 100644
index 1d99928b3..000000000
Binary files a/doc/source/admin/appdev-guide/step-by-step/hello-world-desc.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/step-by-step/hello-world-screen-1.png b/doc/source/admin/appdev-guide/step-by-step/hello-world-screen-1.png
deleted file mode 100644
index fdf5d2302..000000000
Binary files a/doc/source/admin/appdev-guide/step-by-step/hello-world-screen-1.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/step-by-step/hello-world-screen-2.png b/doc/source/admin/appdev-guide/step-by-step/hello-world-screen-2.png
deleted file mode 100644
index 01f6baba7..000000000
Binary files a/doc/source/admin/appdev-guide/step-by-step/hello-world-screen-2.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/step-by-step/new-env-1.png b/doc/source/admin/appdev-guide/step-by-step/new-env-1.png
deleted file mode 100644
index 1b4fe36c1..000000000
Binary files a/doc/source/admin/appdev-guide/step-by-step/new-env-1.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/step-by-step/new-env-2.png b/doc/source/admin/appdev-guide/step-by-step/new-env-2.png
deleted file mode 100644
index ab25dc87e..000000000
Binary files a/doc/source/admin/appdev-guide/step-by-step/new-env-2.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/step-by-step/new-env-3.png b/doc/source/admin/appdev-guide/step-by-step/new-env-3.png
deleted file mode 100644
index 03d1fb720..000000000
Binary files a/doc/source/admin/appdev-guide/step-by-step/new-env-3.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/step-by-step/part1.rst b/doc/source/admin/appdev-guide/step-by-step/part1.rst
deleted file mode 100644
index 39301a1a7..000000000
--- a/doc/source/admin/appdev-guide/step-by-step/part1.rst
+++ /dev/null
@@ -1,395 +0,0 @@
-
-Part 1: Creating your first Application Package
------------------------------------------------
-
-All tutorials on programming languages start with a "Hello, World" example,
-and since Murano provides its own programming language, this guide will start
-the same way. Let's do a "Hello, World" application. It will not do anything
-useful yet, but will provide you with an understanding of how things work
-in Murano. We will add more logic to the package at later stages. Now let's
-start with the basics:
-
-
-Creating package manifest
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Let's start with creating an empty Murano Package. All packages consist of
-multiple files (two at least) organized into a special structure. So, let's
-create a directory somewhere in our file system and set it as our current
-working directory. This directory will contain our package:
-
-.. code-block:: shell
-
- $ mkdir HelloWorld
- $ cd HelloWorld
-
-
-The main element of the package is its `manifest`. It is a description of the
-package, telling Murano how to display the package in the catalog. It is
-defined in a yaml file called ``manifest.yaml`` which should be placed right in
-the main package directory. Let's create this file and open it with any text
-editor:
-
-.. code-block:: shell
-
- $ vim manifest.yaml
-
-
-This file may contain a number of sections (we will take a closer look at some
-of them later), but the mandatory ones are ``FullName`` and ``Type``.
-
-The ``FullName`` should be a unique identifier of the package, the name which
-Murano uses to distinguish it among other packages in the catalog. It is very
-important for this name to be globally unique: if you publish your package and
-someone adds it to their catalog, there should be no chances that someone
-else's package has the same name. That's why it is recommended to give your
-packages Full Names based on the domain you (or the company your work for) own.
-We recommend using "reversed-domain-name" notation, similar to the one used in
-the world of Java development: if the `yourdomain.com` is the domain name you
-own, then you could name your package ``com.yourdomain.HellWorld``. This way
-your package name will not duplicate anybody else's, even if they also named
-their package "HelloWorld", because theirs will begin with a different
-domain-specific prefix.
-
-``Type`` may have either of two values: ``Application`` or ``Library``.
-``Application`` indicates the standard package to deploy an application with
-Murano, while a ``Library`` is bundle of reusable scenarios which may be used
-by other packages. For now we just need a single standalone app, so let's
-choose an ``Application`` type.
-The ``Description`` is a text attribute, providing detailed info about your
-package.
-
-Enter these values and save the file. You should have something like this:
-
-
-.. code-block:: yaml
-
- FullName: com.yourdomain.HelloWorld
- Type: Application
- Description: |
- A package which demonstrates
- development for Murano
- by greeting the user.
-
-This is the minimum required to start. We'll add more manifest data later.
-
-Adding a class
-~~~~~~~~~~~~~~
-
-While `manifests` describe Murano packages in the catalog, the actual logic of
-packages is put into `classes`, which are plain YAML files placed into the
-``Classes`` directory of the application package. So, let's create a directory
-to store the logic of our application, then create and edit the file to contain
-the first class of the package.
-
-.. code-block:: shell
-
- $ mkdir Classes
- $ vim Classes/HelloWorld.yaml
-
-
-Murano classes follow standard patterns of object-oriented programming: they
-define the types of the objects which may be instantiated by Murano. The types
-are composed of `properties`, defining the data structure of objects, and
-`methods`, containing the logic that defines the way in which Murano executes
-the former. The types may be `extended`: the extended class contains all the
-methods and properties of the class it extends, or it may override some of
-them.
-
-Let's type in the following YAML to create our first class:
-
-.. code-block:: yaml
- :linenos:
-
- Name: com.yourdomain.HelloWorld
-
- Extends: io.murano.Application
-
- Methods:
- deploy:
- Body:
- - $reporter: $this.find('io.murano.Environment').reporter
- - $reporter.report($this, "Hello, World!")
-
-
-Let's walk through this code line by line and see what this code does.
-The first line is pretty obvious: it states the name of our class,
-``com.yourdomain.HelloWorld``. Note that this name matches the name of the
-package - that's intentional. Although it is not mandatory, it is strongly
-recommended to give the main class of your application package the same name as
-the package itself.
-
-Then, there is an ``Extends`` directive. It says that our class extends (or
-inherits) another class, called ``io.murano.Application``. That is the base
-class for all classes which should deploy Applications in Murano. As many other
-classes it is shipped with Murano itself, thus its name starts with
-`io.murano.` prefix: `murano.io` domain is controlled by the Murano development
-team and no one else should create packages or classes having names in that
-namespace.
-
-Note that ``Extends`` directive may contain not only a single value, but a
-list. In that case the class we create will inherit multiple base classes.
-Yes, Murano has multiple inheritance, yay!
-
-Now, the ``Methods`` block contains all the logic encapsulated in our class. In
-this example there is just one method, called ``deploy``. This method is
-defined in the base class we've just inherited - the ``io.murano.Application``,
-so here we `override` it. ``Body`` block of the method contains the
-implementation, the actual logic of the method. It's a list of instructions
-(note the dash-prefixed lines - that's how YAML defines lists), each executed
-one by one.
-
-There are two instruction statements here. The first one declares a `variable`
-named ``$reporter`` (note the ``$`` character: all the words prefixed with it
-are variables in Murano language) and assigns it a value. Unlike other
-languages Murano uses colon (``:``) as an assignment operator: this makes it
-convenient to express Murano statements as regular YAML mappings.
-The expression to the right of the colon is executed and the result value is
-assigned to a variable to the left of the colon.
-
-Let's take a closer look at the right-hand side of the expression in the first
-statement:
-
-.. code-block:: yaml
-
- - $reporter: $this.find('io.murano.Environment').reporter
-
-
-It takes a value of a special variable called ``$this`` (which always contains
-a reference to the current object, i.e. the instance of our class for which the
-method was called; it is same as ``self`` in python or ``this`` in Java) and
-calls a method named ``find`` on it with a string parameter equal
-to 'io.murano.Environment'; from the call result it takes a "reporter"
-attribute; this value is assigned to the variable in the left-hand side of the
-expression.
-
-The meaning of this code is simple: it `finds` the object of class
-``io.murano.Environment`` which owns the current application and returns its
-"reporter" object. This ``io.murano.Environment`` is a special object which
-groups multiple deployed applications. When the end-user interacts with Murano
-they create these `Environments` and place applications into them. So, every
-Application is able to get a reference to this object by calling ``find``
-method like we just did. Meanwhile, the ``io.murano.Environment`` class has
-various methods to interact with the "outer world", for example to report
-various messages to the end-user via the deployment log: this is done by the
-"reporter" property of that class.
-
-So, our first statement just retrieved that reporter. The second one uses it to
-display a message to a user: it calls a method "report", passes the reference
-to a reporting object and a message as the arguments of the method:
-
-.. code-block:: yaml
-
- - $reporter.report($this, "Hello, World!")
-
-Note that the second statement is not a YAML-mapping: it does not have a colon
-inside. That's because this statement just makes a method call, it does not
-need to remember the result.
-
-That's it: we've just made a class which greets the user with a traditional
-"Hello, World!" message. Now we need to include this class into the package we
-are creating. Although it is placed within a ``Classes`` subdirectory of the
-package, it still needs to be explicitly added to the package. To do that, add
-a ``Classes`` section to your manifest.yaml file. This should be a YAML
-mapping, having class names as keys and relative paths of files within the
-``Classes`` directory as the values. So, for our example class it should look
-like this:
-
-.. code-block:: yaml
-
- Classes:
- com.yourdomain.HelloWorld: HelloWorld.yaml
-
-Paste this block anywhere in the ``manifest.yaml``
-
-Pack and upload your app
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-Our application is ready. It's very simplistic and lacks many features required
-for real-world applications, but it already can be deployed into Murano and run
-there.
-To do that we need to pack it first. We use good old zip for it.
-That's it: just zip everything inside your package directory into a zip
-archive, and you'll get a ready-to-use Murano package:
-
-.. code-block:: shell
-
- $ zip -r hello_world.zip *
-
-This will add all the contents of our package directory to a zip archive called
-``hello_world.zip``. Do not forget the ``-r`` argument to include the files in
-subdirectories (the class file in our case).
-
-Now, let's upload the package to murano. Ensure that your system has a
-murano-client installed and your OpenStack cloud credentials are exported as
-environmnet variables (if not, sourcing an `openrc` file, downloadable from
-your horizon dashboard will do the latter). Then execute the following command:
-
-.. code-block:: shell
-
- $ murano package-import ./hello_world.zip
- Importing package com.yourdomain.HelloWorld
- +----------------------------------+---------------------------+---------------------------+-----------+--------+-----------+-------------+---------+
- | ID | Name | FQN | Author | Active | Is Public | Type | Version |
- +----------------------------------+---------------------------+---------------------------+-----------+--------+-----------+-------------+---------+
- | 251a409645d1444aa1ead8eaac451a1d | com.yourdomain.HelloWorld | com.yourdomain.HelloWorld | OpenStack | True | | Application | |
- +----------------------------------+---------------------------+---------------------------+-----------+--------+-----------+-------------+---------+
-
-As you can see from the output, the package has been uploaded to Murano catalog
-and is now available there. Let's now deploy it.
-
-Deploying your application
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-To deploy an application with Murano one needs to create an `Environment` and
-add configured instances of your applications into it. It may be done either
-with the help of user interface (but that requires some extra effort from
-package developer) or by providing an explicit JSON, describing the exact
-application instance and its configuration. Let's do the latter option for now.
-
-First, let's create a json snippet for our application. Since the app is very
-basic, the snippet is simple as well:
-
-.. code-block:: json
-
- [
- {
- "op": "add",
- "path": "/-",
- "value": {
- "?": {
- "name": "Demo",
- "type": "com.yourdomain.HelloWorld",
- "id": "42"
- }
- }
- }
- ]
-
-This json follows a standard json-patch notation, i.e. it defines a number of
-operations to edit a large json document. This particular one `adds` (note the
-value of ``op`` key) an object described in the ``value`` of the json to the
-`root` (note the ``path`` equal to ``/-`` - that's root) of our environment.
-The object we add has the `type` of ``com.yourdomain.HelloWorld`` - that's the
-class we just created two steps ago. Other keys in this json parameterize the
-object we create: they add a `name` and an `id` to the object. Id is mandatory,
-name is optional. Note that since the id, name and type are the `system
-properties` of our object, they are defined in a special section of the json -
-the so-called `?-header`. Non-system properties, if they existed, would be
-defined at a top-level of the object. We'll add them in a next chapter to see
-how they work.
-
-For now, save this JSON to some local file (say, ``input.json``) and let's
-finally deploy the thing.
-
-Execute the following sequence of commands:
-
-.. code-block:: shell
-
- $ murano environment-create TestHello
- +----------------------------------+-----------+--------+---------------------+---------------------+
- | ID | Name | Status | Created | Updated |
- +----------------------------------+-----------+--------+---------------------+---------------------+
- | 34bf673a26a8439d906827dea328c99c | TestHello | ready | 2016-10-04T13:19:12 | 2016-10-04T13:19:12 |
- +----------------------------------+-----------+--------+---------------------+---------------------+
-
- $ murano environment-session-create 34bf673a26a8439d906827dea328c99c
- Created new session:
- +----------+----------------------------------+
- | Property | Value |
- +----------+----------------------------------+
- | id | 6d4a8fa2a5f4484fbc07740ef3ab60dd |
- +----------+----------------------------------+
-
- $ murano environment-apps-edit --session-id 6d4a8fa2a5f4484fbc07740ef3ab60dd 34bf673a26a8439d906827dea328c99c ./input.json
-
-This first command creates a murano environment named ``TestHello``. Note the
-`id` of the created environment - we use it to reference it in subsequent
-operations.
-
-The second command creates a "configuration session" for this environment.
-Configuration sessions allow one to edit environments in transactional isolated
-manner. Note the `id` of the created sessions: all subsequent calls to modify
-or deploy the environment use both ids of environment and session.
-
-The third command applies the json-patch we've created before to our
-environment within the configuration session we created.
-
-Now, let's deploy the changes we made:
-
-.. code-block:: shell
-
- $ murano environment-deploy --session-id 6d4a8fa2a5f4484fbc07740ef3ab60dd 34bf673a26a8439d906827dea328c99c
- +------------------+---------------------------------------------+
- | Property | Value |
- +------------------+---------------------------------------------+
- | acquired_by | 7b0fe7c67ede443da9840adb2d518d5c |
- | created | 2016-10-04T13:39:34 |
- | description_text | |
- | id | 34bf673a26a8439d906827dea328c99c |
- | name | TestHello |
- | services | [ |
- | | { |
- | | "?": { |
- | | "name": "Demo", |
- | | "status": "deploying", |
- | | "type": "com.yourdomain.HelloWorld", |
- | | "id": "42" |
- | | } |
- | | } |
- | | ] |
- | status | deploying |
- | tenant_id | 60b7b5f7d4e64ff0b1c5f047d694d7ca |
- | updated | 2016-10-04T13:39:34 |
- | version | 0 |
- +------------------+---------------------------------------------+
-
-This will deploy the environment. You may check for its status by executing
-the following command:
-
-.. code-block:: shell
-
- $ murano environment-show 34bf673a26a8439d906827dea328c99c
- +------------------+-----------------------------------------------------------------------------+
- | Property | Value |
- +------------------+-----------------------------------------------------------------------------+
- | acquired_by | None |
- | created | 2016-10-04T13:39:34 |
- | description_text | |
- | id | 34bf673a26a8439d906827dea328c99c |
- | name | TestHello |
- | services | [ |
- | | { |
- | | "?": { |
- | | "status": "ready", |
- | | "name": "Demo", |
- | | "type": "com.yourdomain.HelloWorld/0.0.0@com.yourdomain.HelloWorld", |
- | | "_actions": {}, |
- | | "id": "42", |
- | | "metadata": null |
- | | } |
- | | } |
- | | ] |
- | status | ready |
- | tenant_id | 60b7b5f7d4e64ff0b1c5f047d694d7ca |
- | updated | 2016-10-04T13:40:29 |
- | version | 1 |
- +------------------+-----------------------------------------------------------------------------+
-
-As you can see, the status of the Environment has changed to ``ready``: it
-means that the application has been deployed. Open Murano Dashboard, navigate
-to Environment list and browse the contents of the ``TestHello`` environment
-there.
-You'll see that the 'Last Operation' column near the "Demo" component says
-"Hello, World!" - that's the reporting made by our application:
-
-.. image:: hello-world-screen-1.png
-
-This concludes the first part of our course. We've created a Murano Application
-Package, added a manifest describing its contents, written a class which
-reports a "Hello, World" message, packed all of these into a package archive
-and uploaded it to Murano Catalog and finally deployed an Environment with this
-application added.
-
-In the next part we will learn how to improve this application in various
-aspects, both from users' and developers' perspectives.
diff --git a/doc/source/admin/appdev-guide/step-by-step/part2.rst b/doc/source/admin/appdev-guide/step-by-step/part2.rst
deleted file mode 100644
index 346c2bcb0..000000000
--- a/doc/source/admin/appdev-guide/step-by-step/part2.rst
+++ /dev/null
@@ -1,445 +0,0 @@
-Part 2: Customizing your Application Package
---------------------------------------------
-
-We've built a classic "Hello, World" application during the first part of
-this tutorial, now let's play a little with it and customize it for better
-user and developer experience - while learning some more Murano features,
-of course.
-
-Adding user input
-~~~~~~~~~~~~~~~~~
-
-Most deployment scenarios for cloud applications require user input. It may
-be various options which should be applied in software configuration files,
-passwords for default administrator's accounts, IP addresses of external
-services to register with and so on. Murano Application Packages may define
-the user inputs they expect, prompt the end-users to pass the values as these
-inputs, so that they may utilize these values during application lifecycle
-workflows.
-
-In Murano user input is defined for each class as `input properties`.
-`Properties` are object-level variables of the class, they may be of different
-kinds, and the `input properties` are the ones which are expected to contain
-user input. See :ref:`class_props` for details on other kinds of them.
-
-To define properties of the class you should add a ``Properties`` block
-somewhere in the YAML file of that class.
-
-.. note::
- Usually it is better to place this block after the ``Name`` and ``Extends``
- blocks but before the ``Methods`` block. Following this suggestion will
- improve the overall readability of your code.
-
-The ``Properties`` block should contain a YAML dictionary, mapping the names of
-the properties to their descriptions. These descriptions may specify the kind
-of properties, the restrictions on the type and value of the property
-(so-called `contracts`), provide default value for the property and so on.
-
-Let's add some user input to our "Hello, World" application. Let's ask the end
-user to provide their name, so the application will greet the user instead of
-the whole world. To do that, we need to edit our ``com.yourdomain.HelloWorld``
-class to look the following way:
-
-.. code-block:: yaml
- :linenos:
- :emphasize-lines: 5-8
-
- Name: com.yourdomain.HelloWorld
-
- Extends: io.murano.Application
-
- Properties:
- username:
- Usage: In
- Contract: $.string().notNull()
-
- Methods:
- deploy:
- Body:
- - $reporter: $this.find('io.murano.Environment').reporter
- - $reporter.report($this, "Hello, World!")
-
-On line 6 we declare a property named ``username``, on line 7 we specify that
-it is an input property, and on line 8 we provide a contract, i.e. a
-restriction on the value. This particular one states that the property's value
-should be a string and should not be null (i.e. should be provided by the
-user).
-
-.. note::
- Although there are a total of 7 different kinds of properties, it turns
- out that the input ones are the most common. So, for input properties you
- may omit the ``Usage`` part - all the properties without an explicit usage
- are considered to be input properties.
-
-
-Once the property is declared within the ``Properties`` block, you may access
-it in the code of the class methods. Since the properties are object-level
-variables they may be accessed by calling a ``$this`` variable (which is a
-reference to a current instance of your class) followed by a dot and a property
-name. So, our ``username`` property may be accessed as ``$this.username``.
-
-Let's modify the ``deploy`` method of our class to make use of the property to
-greet the user by name:
-
-.. code-block:: yaml
-
- Methods:
- deploy:
- Body:
- - $reporter: $this.find('io.murano.Environment').reporter
- - $reporter.report($this, "Hello, " + $this.username + "!")
-
-OK, let's try it. Save the file and archive your package directory again, then
-re-import your zip-file to the Murano Catalog as a package.
-You'll probably get a warning, since the package with the same name already
-exists in the catalog (we imported it there in the previous part of the
-tutorial), so murano CLI will ask you if you want to update it. In production
-it is better to make a newer version of our application and thus to have both
-in the catalog, but for now let's just overwrite the old package with the new
-one.
-
-But you cannot deploy it with the old json input we used in the previous part:
-since the property's contract has that ``.notNull()`` part it means that the
-input should contain the value for the property. If you attempt to deploy an
-application without this value, you'll get an error.
-
-So, let's edit the ``input.json`` file we created in the previous part and add
-the value of the property to the input:
-
-.. code-block:: json
- :linenos:
- :emphasize-lines: 11
-
- [
- {
- "op": "add",
- "path": "/-",
- "value": {
- "?": {
- "name": "Demo",
- "type": "com.yourdomain.HelloWorld",
- "id": "42"
- },
- "username": "Alice"
- }
- }
- ]
-
-Save the json file and repeat the steps from the previous part to create an
-environment, open a configuration session, add an application and deploy it.
-Now in the 'Last Operation' of Murano Dashboard you will see the updated
-reporting message, containing the username:
-
-.. image:: hello-world-screen-2.png
- :width: 100%
-
-
-Adding user interface
-~~~~~~~~~~~~~~~~~~~~~
-
-As you can see in all the examples above, deploying applications via Murano
-CLI is quite a cumbersome process: the user has to create environments and
-sessions and provide the appropriate json-based input for the application.
-
-This is inconvenient for a real user, of course. The CLI is intended to be used
-by various external automation systems which interact with Murano via scripts,
-but the human users will use Murano Dashboard which simplifies all those
-actions and provides a nice interface for them.
-
-Murano Dashboard provides a nice interface to create and deploy environments
-and manages sessions transparently for the end users, but when it comes to the
-generation of input JSON it can't do it out of the box: it needs some hints
-from the package developer. By having hints, Murano Dashboard will be able to
-generate nicely looking wizard-like dialogs to configure applications and add
-them to an environment. In this section we'll learn how to create these UI
-hints.
-
-The UI hints (also called `UI definitions`) should be defined in a separate
-YAML file (yeah, YAML again) in your application package. The file should be
-named ``ui.yaml`` and placed in a special directory of your package called
-``UI``.
-
-The main section which is mandatory for all the UI definitions is called
-``Application``: it defines the object structure which should be passed as the
-input to Murano. That's it: it is equivalent to the JSON ``input.json`` we were
-creating before. The data structure remains the same: ?-header is for system
-properties and all other properties belong inside the top level of the object.
-
-The ``Application`` section for our modified "Hello, World" application should
-look like this:
-
-.. code-block:: yaml
- :linenos:
-
- Application:
- ?:
- type: com.yourdomain.HelloWorld
- username: Alice
-
-This input is almost the same as the ``input.json`` we used last time, except
-that the data is expressed in a different format. However, there are several
-important differences: there are not JSON-Patch related keywords ("op", "path"
-and "value") - that's because Murano Dashboard will generate them
-automatically.
-
-Same is true for the missing ``id`` and ``name`` from the ?-header of the
-object: the dashboard will generate the id on its own and ask the end-user for
-the name, and then will insert both into the structure it sends to Murano.
-
-However, there is one problem in the example above: it has the ``username``
-hardcoded to be Alice. Of course we do not want the user input to be hardcoded:
-it won't be an input then. So, let's define a user interface which will ask the
-end user for the actual value of this parameter.
-
-Since Murano Dashboard works like a step-by-step wizard, we need to define at
-least one wizard step (so-called `form`) and place a single text-box control
-into it, so the end-user will be able to enter his/her name there.
-
-These steps are defined in the ``Forms`` section of our ui definition file.
-This section should contain a list of key-value pairs. Keys are the identifiers
-of the forms, while values should define a list of `field` objects. Each field
-may define a name, a type, a description, a requirement indicator and some
-other attributes intended for advanced usage.
-
-For our example we need a single step with a single text field. The ``Forms``
-section should look like this:
-
-.. code-block:: yaml
- :linenos:
-
- Forms:
- - step1:
- fields:
- - name: username
- type: string
- description: Username of the user to say 'hello' to
- required: true
-
-This defines the needed textbox control in the ui. Finally, we need to bind
-the value user puts into that textbox to the appropriate position in our
-``Application`` section. To do that we replace the hardcoded value with an
-expression of form ``$..``. In our case this will be
-``$step1.username``.
-
-So, our final UI definition will look like this:
-
-.. code-block:: yaml
- :linenos:
-
- Application:
- ?:
- type: com.yourdomain.HelloWorld
- username: $.step1.username
-
- Forms:
- - step1:
- fields:
- - name: username
- type: string
- description: Username of the user to say 'hello' to
- required: true
-
-Save this code into your ``UI/ui.yaml`` file and then re-zip your package
-directory and import the resulting archive to Murano Catalog again.
-
-Now, let's deploy this application using Murano Dashboard.
-
-Open Murano Dashboard with your browser, navigate to
-"Applications/Catalog/Environments" panel, click the "Create Environment"
-button, enter the name for your environment and click "Create". You'll be
-taken to the contents of your environment: you'll see that it is empty, but on
-top of the screen there is a list of components you may add to it. If your
-Murano Catalog was empty when you started this tutorial, this list will
-contain just one item: your "Hello, World" application. The screen should look
-like this:
-
-.. image:: new-env-1.png
- :width: 100%
-
-Drag-n-drop your "com.yourdomain.HelloWorld" application from the list on top
-of the screen to the "Drop components here" panel beneath it. You'll see a
-dialog, prompting you to enter a username:
-
-.. image:: configure-step1.png
- :width: 100%
-
-Enter the name and click "Next". Although you've configured just one step of
-the wizard, the actual interface will consist of two: the dashboard always adds
-a final step to prompt the user to enter the name of the application instance
-within the environment:
-
-.. image:: configure-step2.png
- :width: 100%
-
-When you click "Create" button an instance of your application will be added to
-the environment, you'll see it in the list of components:
-
-.. image:: new-env-2.png
- :width: 100%
-
-So, now you may click the "Deploy this Environment" button and the application
-will greet the user with the name you've entered.
-
-.. image:: new-env-3.png
- :width: 100%
-
-
-Simplifying code: namespaces
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Now that we've learned how to simplify the user's life by adding a UI
-definition, let's simplify the developer's life a bit.
-
-When you were working with Murano classes in the previous part you probably
-noticed that the long class names with all those domain-name-based segments
-were hard to write and that it was easy to make a mistake:
-
-.. code-block:: yaml
- :linenos:
-
- Name: com.yourdomain.HelloWorld
-
- Extends: io.murano.Application
-
- Methods:
- deploy:
- Body:
- - $reporter: $this.find('io.murano.Environment').reporter
- - $reporter.report($this, "Hello, World!")
-
-
-To simplify the code we may use the concept of `namespaces` and `short names`.
-All but last segments of a long class name are namespaces, while the last
-segment is a short name of a class. In our example ``com.yourdomain`` is a
-namespace while the ``HelloWorld`` is a short name.
-
-Short names have to be unique only within their namespace, so they tend to be
-expressive, short and human readable, while the namespaces are globally unique
-and thus are usually long and too detailed.
-
-Murano provides a capability to abbreviate long namespaces with a short alias.
-Unlike namespaces, aliases don't need to be globally unique: they have
-to be unique only within a single file which uses them. So, they may be very
-short. So, in your file you may abbreviate your ``com.yourdomain`` namespace
-as ``my``, and standard Murano's ``io.murano`` as ``std``. Then instead of a
-long class name you may write a namespace alias followed by a colon character
-and then a short name, e.g. ``my:HelloWorld`` or ``std:Application``. This
-becomes very helpful when you have lots of class names in your code.
-
-To use this feature, declare a special section called ``Namespaces`` in your
-class file. Inside that section provide a mapping of namespace aliases to full
-namespaces, like this:
-
-.. code-block:: yaml
-
- Namespaces:
- my: com.yourdomain
- std: io.murano
-
-.. note::
-
- Since namespaces are often used in all other sections of files it is
- considered good practice to declare this section at a very top of your
- class file.
-
-Quite often there is a namespace which is used much more often than others in a
-given file. In this case it would be beneficial to declare this namespace as a
-`default namespace`. Default namespace does not need a prefix at all: you just
-type short name of the class and Murano will interpret it as being in your
-default namespace. Use '=' character to declare the default namespace in your
-namespaces block:
-
-.. code-block:: yaml
- :linenos:
- :emphasize-lines: 2,5
-
- Namespaces:
- =: com.yourdomain
- std: io.murano
-
- Name: HelloWorld
-
- Extends: std:Application
-
- Methods:
- deploy:
- Body:
- - $reporter: $this.find(std:Environment).reporter
- - $reporter.report($this, "Hello, World!")
-
-
-Notice that ``Name`` definition at line 5 uses the default namespace: the
-``HelloWorld`` is not prefixed with any namespaces, but is properly resolved
-to ``com.yourdomain.HelloWorld`` because of the default namespace declaration
-at line 2. Also, because Murano recognizes the ``ns:Class`` syntax there is
-no need to enclose ``std:Environment`` in quote marks, though it will also
-work.
-
-
-Adding more info for the catalog
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-As you could see while browsing Murano Catalog your application entry in it is
-not particularly informative: the user can't get any description about your
-app, and the long domain-based name is not very user-friendly aither.
-
-This can easily be improved. The ``manifest.yaml`` which we wrote in the first
-part contained only mandatory fields. This is how it should look by now:
-
-
-.. code-block:: yaml
- :linenos:
-
- FullName: com.yourdomain.HelloWorld
- Type: Application
- Description: |
- A package which demonstrates
- development for Murano
- by greeting the user.
- Classes:
- com.yourdomain.HelloWorld: HelloWorld.yaml
-
-Let's add more fields here.
-
-First, you can add a ``Name`` attribute. Unlike ``FullName``, it is not a
-unique identifier of the package. But, if specified, it overrides the name of
-the package that is displayed in the catalog.
-
-Then an ``Author`` field: here you can put your name or the name of your
-company, so it will be displayed in catalog as the name of the package
-developer. If this field is omitted, the catalog will consider the package to
-be made by "OpenStack", so don't forget this field if you care about your
-copyright.
-
-When you add these fields your manifest may look like this:
-
-.. code-block:: yaml
- :linenos:
-
- FullName: com.yourdomain.HelloWorld
- Type: Application
- Name: 'Hello, World'
- Description: |
- A package which demonstrates
- development for Murano
- by greeting the user.
- Author: John Doe
- Classes:
- com.yourdomain.HelloWorld: HelloWorld.yaml
-
-
-You may also add an icon to be displayed for your application. To do that just
-place a ``logo.png`` file with an appropriate image into the root folder of
-your package.
-
-Zip the package directory and re-upload the file to the catalog. Then use
-Murano Dashboard and navigate to Applications/Catalog/Browse panel. You'll see
-that your app gets a logo, a more appropriate name and a description:
-
-.. image:: hello-world-desc.png
- :width: 50%
-
-So, here we've learned how to improve both the user's and developer's
-experience with developing Murano application packages. That was all we could
-do with the oversimplistic "Hello World" app. Let's move forward and touch
-some real-life applications.
diff --git a/doc/source/admin/appdev-guide/step-by-step/part3.rst b/doc/source/admin/appdev-guide/step-by-step/part3.rst
deleted file mode 100644
index 1f9f95870..000000000
--- a/doc/source/admin/appdev-guide/step-by-step/part3.rst
+++ /dev/null
@@ -1,799 +0,0 @@
-Part 3: Creating a Plone CMS application package
-------------------------------------------------
-
-If you've completed "Hello, World" scenarios in the previous parts and are
-ready for some serious tasks, we've got a good example here.
-
-Let's automate the deployment of some real application. We've chosen a "Plone
-CMS" for this purpose. Plone is a simple, but powerful and flexible Content
-Management System which can efficiently run on cloud. Its deployment scenario
-can be very simple for demo cases and can become really complicated for
-production-grade usage. So it's a good playground: in this part we'll create a
-Murano application to address the simplest scenario, then we will gradually add
-more features of production-grade deployments.
-
-.. note::
- To learn more about Plone, its features, capabilities and deployment
- scenarios you may visit the `Official website of Plone Foundation
- `_.
-
-The goal
-~~~~~~~~
-
-Simplest deployment of Plone CMS requires a single server, or, in the case of
-OpenStack, a Virtual Machine, to run on. Then a software should be downloaded
-and configured to run on that server.
-
-So, as a bare minimum our Plone application package for Murano should automate
-the following steps:
-
-#. Provision a virtual machine in OpenStack (VM);
-#. Configure ths VM's network connectivity and security;
-#. Download a distribution of Plone from Internet to the virtual machine;
-#. Install the distribution and configure some of its parameters with user
- input.
-
-
-Preparation
-~~~~~~~~~~~
-
-First let's revisit what we've learned in previous parts and create a new
-application package with its manifest and create a class file to contain the
-logic of your app.
-
-Create a new directory for a package, call it ``PloneApp``. Create a
-``manifest.yaml`` file as described in part 1 of this tutorial in the root of
-the package and fill it with data: name your package ``com.yourdomain.Plone``,
-set its type to ``Application``, give it a display name of "Plone CMS" and put
-your name as the author of the package:
-
-.. code-block:: yaml
- :linenos:
-
- FullName: com.yourdomain.Plone
- Name: Plone CMS
- Description: Simple Plone Deployment
- Type: Application
- Author: John Doe
-
-Then create a ``Classes`` sub directory inside your package directory and
-create a ``plone.yaml`` there. This will be your application class.
-
-At the top of this file declare a `Namespace` section: this will simplify the
-code and save time on typing long class names. Make your namespace
-(``com.yourdomain``) a default namespace of the file, also include the standard
-namespace for Murano applications - ``io.murano``, alias it as ``std``.
-
-Don't forget to include the ``Name`` of your class. Since you've declared a
-default namespace for a file you can name your class without a need to type its
-long part, just using the shortname.
-
-Also include the ``Extends`` section: same as in our "Hello, World" example
-this application will inherit the ``io.murano.Application`` class, but since
-we've aliased this namespace as well, it may be shortened to
-``std:Application``
-
-By now your class file should look like this:
-
-.. code-block:: yaml
-
- Namespaces:
- =: com.yourdomain
- std: io.murano
-
- Name: Plone
-
- Extends: std:Application
-
-
-We'll add the actual logic in the next section. Now, save the file and include
-it into the ``Classes`` section of your manifest.yaml, which should now look
-like this:
-
-.. code-block:: yaml
- :linenos:
- :emphasize-lines: 6-7
-
- FullName: com.yourdomain.Plone
- Name: Plone CMS
- Description: Simple Plone Deployment
- Type: Application
- Author: John Doe
- Classes:
- com.yourdomain.Plone: plone.yaml
-
-
-You are all set and ready to go. Let's add the actual deployment logic.
-
-Library classes
-~~~~~~~~~~~~~~~
-
-Murano comes bundled with a so-called "Murano Core Library" - a Murano Package
-containing the classes to automate different scenarios of interaction with
-other entities such as OpenStack services or virtual machines. They follow
-object-oriented design: for example, there is a Murano class called
-``Instance`` which represents an OpenStack virtual machine: if you create an
-object of this class and execute a method called ``deploy`` for it Murano will
-do all the needed system calls to OpenStack Services to orchestrate the
-provisioning of a virtual machine and its networking configuration. Then this
-object will contain information about the state and configuration of the VM,
-such as its hostname, ip addresses etc. After the VM is provisioned you can use
-its object to send the configuration scripts to the VM to install and configure
-software for your application.
-
-Other OpenStack resources such as Volumes, Networks, Ports, Routers etc also
-have their corresponding classes in the core library.
-
-
-Provisioning a VM
-~~~~~~~~~~~~~~~~~
-
-When creating your application package you can `compose` your application out
-of the components of core library. For example for an application which
-should run on a VM you can define an input property called ``instance`` and
-restrict the value type of this property to the aforementioned ``Instance``
-class with a contract.
-
-Let's do that in the ``plone.yaml`` class file you've created.
-First, add a new namespace alias to your ``Namespaces`` section:
-shorten ``io.murano.resources`` as ``res``. This namespace of the core
-library contains all the resource classes, including the
-``io.murano.resources.Instance`` which we need to define the virtual machine:
-
-.. code-block:: yaml
- :emphasize-lines: 4
-
- Namespaces:
- =: com.yourdomain
- std: io.murano
- res: io.murano.resources
-
-Now, let's add an input property to your class:
-
-.. code-block:: yaml
- :linenos:
-
- Properties:
- instance:
- Usage: In
- Contract: $.class(res:Instance)
-
-Notice the contract at line 4: it limits the values of this property to the
-objects of class ``io.murano.resources.Instance`` or its subclasses.
-
-This defines that your application needs a virtual machine. Now let's ensure
-that it is provisioned - or provision it otherwise. Add a ``deploy`` method to
-your application class and call instance's deploy method from it:
-
-.. code-block:: yaml
- :linenos:
-
- Methods:
- deploy:
- Body:
- - $this.instance.deploy()
-
-That's very simple: you just access the ``instance`` property of your current
-object and run a method ``deploy`` for it. The core library defines this method
-of the ``Instance`` class in an `idempotent` manner: you may call it as many
-times as you want: the first call will actually provision the virtual machine
-in the cloud, while all the subsequent calls will no nothing, thus you may
-always call this method to ensure that the VM was properly provisioned. It's
-important since we define it as an input property: theoretically a user can
-pass an already-provisioned VM object as input, but you need to be sure.
-Always calling the ``deploy`` method is the best practice to follow.
-
-Running a command on the VM
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Once the VM has been provisioned you may execute various kinds of software
-configuration scenarios on it to install and configure the actual application
-on the VM. Murano supports different types of software configuration tools to
-be run on a VM, but the simplest and the most common type is just a shell
-script.
-
-To run a shell script on a virtual machine you may use a `static method`
-``runCommand`` of class ``io.murano.configuration.Linux``. Since this method is
-static you do not need to create any objects of its class: you can just do
-something like:
-
-.. code-block:: yaml
-
- - type('io.murano.configuration.Linux').runCommand($server.agent, 'sudo apt-get update')
-
-or, if we declare another namespace prefix
-
-.. code-block:: yaml
-
- Namespaces:
- ...
- conf: io.murano.configuration
-
-this may be shortened to
-
-.. code-block:: yaml
-
- - conf:Linux.runCommand($server.agent, 'sudo apt-get update')
-
-In this case ``$server`` should be a variable containing an object of
-``io.murano.resources.Instance`` class, everything you pass as a second
-argument (``apt get update`` in the example above) is the shell command to be
-executed on a VM. You may pass not just a single line, but a multi-line text:
-it will be treated as a shell script.
-
-.. note::
- The shell scripts and commands you send to a VM are executed by a special
- software component running on the VM - a `murano agent`. For the most
- popular distributions of Linux (Debian, Ubuntu, Centos, Fedora, etc.) it
- automatically gets installed on the VM once it is provisioned, but for other
- distribution and non-Linux OSes it has to be manually pre-installed in the
- image. See :ref:`Building Murano Image ` for details.
-
-
-Loading a script from a resource file
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Passing strings as a second argument of a ``runCommand`` method is convenient
-for short commands like the ``apt-get update`` shown in an example above.
-However for larger scripts it is not that useful. Instead it is preferable
-to load a script text from a file and run it. You can do that in Murano.
-
-For example, let's make a script which downloads, unpacks, installs and
-configures Plone CMS on our VM. First, create a directory called ``Resources``
-inside your package directory. Then, create a file named ``install-plone.sh``
-and put the following script there:
-
-.. code-block:: shell
-
- #!/bin/bash
-
- #input parameters
-
- PL_PATH="$1"
- PL_PASS="$2"
- PL_PORT="$3"
-
-
- # Write log. Redirect stdout & stderr into log file:
- exec &> /var/log/runPloneDeploy.log
- # echo "Update all packages."
- sudo apt-get update
-
- # Install the operating system software and libraries needed to run Plone:
- sudo apt-get install python-setuptools python-dev build-essential libssl-dev libxml2-dev libxslt1-dev libbz2-dev libjpeg62-dev
-
- # Install optional system packages for the handling of PDF and Office files. Can be omitted:
- sudo apt-get install libreadline-dev wv poppler-utils
-
- # Download the latest Plone unified installer:
- wget --no-check-certificate https://launchpad.net/plone/5.0/5.0.4/+download/Plone-5.0.4-UnifiedInstaller.tgz
-
- # Unzip the latest Plone unified installer:
- tar -xvf Plone-5.0.4-UnifiedInstaller.tgz
- cd Plone-5.0.4-UnifiedInstaller
-
- # Set the port that Plone will listen to on available network interfaces. Editing "http-address" param in buildout.cfg file:
- sed -i "s/^http-address = [0-9]*$/http-address = ${PL_PORT}/" buildout_templates/buildout.cfg
-
- # Run the Plone installer in standalone mode
- ./install.sh --password="${PL_PASS}" --target="${PL_PATH}" standalone
-
- # Start Plone
- cd "${PL_PATH}/zinstance"
- bin/plonectl start
-
-.. note::
- As you can see, this script uses apt to install the prerequisite software
- packages, so it expects a Debian-compatible Linux distro as the VM operating
- system. This particular script was tested on Ubuntu 14.04. Other distros
- may have a different set of preinstalled software and thus require different
- additional prerequisites.
-
-
-The comments in the script give the needed explanation: the script installs all
-the prerequisites, downloads a targz archive with a distribution of Plone,
-unpacks it, edits the ``buildout.cfg`` file to specify the port Plone will
-listen at, then runs the installation script which is included in the
-distribution. When that script is finished, the Plone daemon is started.
-
-Save the file as ``Resources/install-plone.sh``. Now you may load its contents
-into a string variable in your class file. To do that, you need to use another
-static method: a ``string()`` method of a ``io.murano.system.Resources`` class:
-
-.. code-block:: yaml
-
- - $script: type('io.murano.system.Resources').string('install-plone.sh')
-
-or, with the introduction of another namespace prefix
-
-.. code-block:: yaml
-
- - $script: sys:Resources.string('install-plone.sh')
-
-But before sending this script to a VM, it needs to be parametrized: as you
-can see in the script snippet above, it declares three variables which are
-used to set the installation path in the VM's filesystem, a default
-administrator's password and a listening port. In the script these values are
-initialized with stubs ``$1``, ``$2`` and ``$3``, now we need to replace these
-stubs with the actual user input. To do that our class needs to define the
-appropriate input properties and then do string replacement.
-
-First, let's define the appropriate input properties in the ``Properties``
-block of the class, right after the ``instance`` property:
-
-
-.. code-block:: yaml
- :linenos:
- :emphasize-lines: 6-18
-
- Properties:
- instance:
- Usage: In
- Contract: $.class(res:Instance)
-
- installationPath:
- Usage: In
- Contract: $.string().notNull()
- Default: '/opt/plone'
-
- defaultPassword:
- Usage: In
- Contract: $.string().notNull()
-
- listeningPort:
- Usage: In
- Contract: $.int().notNull()
- Default: 8080
-
-Now, let's replace the stub values in that script value we've loaded into the
-``$script`` variable. This may be done using a ``replace`` function:
-
-
-.. code-block:: yaml
-
- - $script: $script.replace({"$1" => $this.installationPath,
- "$2" => $this.defaultPassword,
- "$3" => $this.listeningPort})
-
-Finally, the resulting ``$script`` variable may be passed as a second argument
-of a ``runCommand`` method, while the first one should be the ``instance``
-property, containing our VM-object:
-
-.. code-block:: yaml
-
- - conf:Linux.runCommand($this.instance.agent, $script)
-
-
-Configuring OpenStack Security
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-By now we've got code which provisions a VM and a script which deploys and
-configures Plone on it. However, in most OpenStack clouds this is not enough:
-usually all incoming traffic to all the VMs is blocked by default, so we need
-to configure security group of OpenStack to allow the incoming http calls to
-our VM on the port our Plone server listens at.
-
-To do that we need to use a ``securityGroupManager`` property of the
-``Environment`` class which owns our application. That property contains an
-object of type ``io.murano.system.SecurityGroupManager``, which defines a
-``addGroupIngress`` method. This method allows us to add a security group rule
-to allow incoming traffic of some type through a specific port within a port
-range. It accepts a list of YAML objects, each having four keys: ``FromPort``
-and ``ToPort`` to define the boundaries of the port range, ``IpProtocol`` to
-define the type of the protocol and ``External`` boolean flag to indicate if
-the incoming traffic should be be allowed to originate from outside of the
-environment (if this flag is false, the traffic will be accepted only from the
-VMs deployed by the application in the same Murano environment).
-
-Let's do this in code:
-
-.. code-block:: yaml
- :linenos:
-
- - $environment: $this.find(std:Environment)
- - $manager: $environment.securityGroupManager
- - $rules:
- - FromPort: $this.listeningPort
- ToPort: $this.listeningPort
- IpProtocol: tcp
- External: true
- - $manager.addGroupIngress($rules)
- - $environment.stack.push()
-
-It's quite straightforward, just notice the last line. It is required, because
-current implementation of ``SecurityGroupManager`` relies on Heat underneath -
-it modifies the `Heat Stack` associated with our environment, but does not
-apply the changes to the actual cloud. To apply them the stack needs to be
-`pushed`, i.e. submitted to Heat Orchestration service. The last line does
-exactly that.
-
-
-Notifying end-user on Plone location
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-When the deployment is completed and our instance of Plone server starts
-listening on a provisioned virtual machine, the end user has one last question
-to solve: to find out where it is. Of course, the user may use OpenStack
-Dashboard to list all the provisioned VMs, find the one which has just been
-created and look for its IP address. But that's inconvenient. It would be much
-better if Murano notified the end-user on where to find Plone once it is ready.
-
-We may utilize the same approach we used in the previous parts to say "Hello,
-World" - call a ``report`` method of ``reporter`` attribute of the
-``Environment`` class. The tricky part is getting the IP address.
-
-Class ``io.murano.resources.Instance`` has an `output property` called
-``ipAddresses``. Unlike input properties the output ones are not provided by
-users but are set by objects themselves while their methods are executed. The
-``ipAddresses`` is assigned during the execution of ``deploy`` method of the
-VM. The value is the list of ip addresses assigned to different interfaces of
-the machine. Also, if the ``assignFloatingIp`` input property is set to
-``true``, another output property will be set during the execution of
-``deploy`` - a ``floatingIpAddress`` will contain the floating ip attached to
-the VM.
-
-Let's use this knowledge and build a proper report message:
-
-.. code-block:: yaml
- :linenos:
-
- - $message: 'Plone is up and running at '
- - If: $this.instance.assignFloatingIp
- Then:
- - $message: $message + $this.instance.floatingIpAddress
- Else:
- - $message: $message + $this.instance.ipAddresses.first()
- - $message: $message + ":" + str($this.listeningPort)
- - $environment.reporter.report($this, $message)
-
-Note the usage of ``If`` expression: it is similar to other programming
-languages, just uses YAML keys to define the "if" and "else" blocks.
-
-This code creates a string variable called ``$message``, initializes it with
-the beginning of the message string, then appends either a floating ip address
-of the VM (if it's set) or the first of the regular ips otherwise. Then it
-appends a listening port after a colon character - and reports the resulting
-message to the user.
-
-Completing the Plone class
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-We've got all the pieces to deploy our Plone application, now let's combine
-them together. Our final class file should look like this:
-
-
-.. code-block:: yaml
-
- Namespaces:
- =: com.yourdomain
- std: io.murano
- res: io.murano.resources
- sys: io.murano.system
-
- Name: Plone
-
- Extends: std:Application
-
- Properties:
- instance:
- Usage: In
- Contract: $.class(res:Instance)
-
- installationPath:
- Usage: In
- Contract: $.string().notNull()
- Default: '/opt/plone'
-
- defaultPassword:
- Usage: In
- Contract: $.string().notNull()
-
- listeningPort:
- Usage: In
- Contract: $.int().notNull()
- Default: 8080
-
- Methods:
- deploy:
- Body:
- - $this.instance.deploy()
- - $script: sys:Resources.string('install-plone.sh')
- - $script: $script.replace({
- "$1" => $this.installationPath,
- "$2" => $this.defaultPassword,
- "$3" => $this.listeningPort
- })
- - type('io.murano.configuration.Linux').runCommand($this.instance.agent, $script)
- - $environment: $this.find(std:Environment)
- - $manager: $environment.securityGroupManager
- - $rules:
- - FromPort: $this.listeningPort
- ToPort: $this.listeningPort
- IpProtocol: tcp
- External: true
- - $manager.addGroupIngress($rules)
- - $environment.stack.push()
- - $formatString: 'Plone is up and running at {0}:{1}'
- - If: $this.instance.assignFloatingIp
- Then:
- - $address: $this.instance.floatingIpAddress
- Else:
- - $address: $this.instance.ipAddresses.first()
- - $message: format($formatString, $address, $this.listeningPort)
- - $environment.reporter.report($this, $message)
-
-
-That's all, our class is ready.
-
-
-Providing a UI definition
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Last but not least, we need to add a UI definition file to define a template
-for the user input and create wizard steps.
-
-This time both are a bit more complicated than they were for the "Hello, World"
-app.
-
-First, let's create the wizard steps. It's better to decompose the UI into two
-steps: the first one will define the properties of a Virtual Machine, and the
-second one the configuration properties of the Plone application itself.
-
-.. code-block:: yaml
- :linenos:
-
- Forms:
- - instanceConfiguration:
- fields:
- - name: hostname
- type: string
- required: true
- - name: image
- type: image
- imageType: linux
- - name: flavor
- type: flavor
- - name: assignFloatingIp
- type: boolean
- - ploneConfiguration:
- fields:
- - name: installationPath
- type: string
- - name: defaultPassword
- type: password
- required: true
- - name: listeningPort
- type: integer
-
-This is familiar to what we had on the previous step, however there are several
-new types of fields: while the types ``integer`` and ``boolean`` are quite
-obvious - they will render a numeric up-and-down textbox and checkbox controls
-respectively - other field types are more specific.
-
-Field of type ``image`` will render a drop-down list allowing you to choose an
-image for your VM, and the list of images will contain only the ones having
-appropriate metadata associated (the type of metadata is defined by the
-``imageType`` attribute: this particular example requires it to be tagged as
-"Generic Linux").
-
-Field of type ``flavor`` will render a drop-down list allowing you to choose a
-flavor for your VM among the ones registered in Nova.
-
-Field of type ``password`` will render a pair of text-boxes in a password
-input mode (i.e. hiding all the input with '*'-characters). The rendered field
-will have appropriate validation: it will ensure that the values entered in
-both fields are identical (thus providing a "repeat password" functionality)
-and will also enforce password complexity check.
-
-This defines the basic UI, but it is not particularly user friendly: when
-MuranoDashboard renders the wizard it will label appropriate controls with the
-names of the fields, but they usually don't look informative and pretty.
-
-So, to improve the user experience you may add additional attributes to field
-descriptors here. ``label`` attribute allows you to define a custom label to be
-rendered next to appropriate control, ``description`` allows you to provide a
-longer text to be displayed on the form as a description of the control, and,
-finally, an ``initial`` attribute allows you define the default value to be
-entered into the control when it is shown to the end-user.
-
-Modify the ``Forms`` section to use these attributes:
-
-.. code-block:: yaml
- :linenos:
- :emphasize-lines: 6-9,14-17,20-23,26-28,33-36,38-39,44-46
-
- Forms:
- - instanceConfiguration:
- fields:
- - name: hostname
- type: string
- label: Host Name
- description: >-
- Enter a hostname for a virtual machine to be created
- initial: plone-vm
- required: true
- - name: image
- type: image
- imageType: linux
- label: Instance image
- description: >-
- Select valid image for the application. Image should already be prepared and
- registered in glance.
- - name: flavor
- type: flavor
- label: Instance flavor
- description: >-
- Select registered in Openstack flavor. Consider that application performance
- depends on this parameter.
- - name: assignFloatingIp
- type: boolean
- label: Assign Floating IP
- description: >-
- Check to assign floating IP automatically
- - ploneConfiguration:
- fields:
- - name: installationPath
- type: string
- label: Installation Path
- initial: '/opt/plone'
- description: >-
- Enter the path on the VM filesystem to deploy Plone into
- - name: defaultPassword
- label: Admin password
- description: Default administrator's password
- type: password
- required: true
- - name: listeningPort
- type: integer
- label: Listening Port
- description: Port to listen at
- initial: 8080
-
-
-Now, let's add an ``Application`` section to provide templated input for our
-app:
-
-.. code-block:: yaml
- :linenos:
-
- Application:
- ?:
- type: com.yourdomain.Plone
- instance:
- ?:
- type: io.murano.resources.LinuxMuranoInstance
- name: $.instanceConfiguration.hostname
- image: $.instanceConfiguration.image
- flavor: $.instanceConfiguration.flavor
- assignFloatingIp: $.instanceConfiguration.assignFloatingIp
- installationPath: $.ploneConfiguration.installationPath
- defaultPassword: $.ploneConfiguration.defaultPassword
- listeningPort: $.ploneConfiguration.listeningPort
-
-Note the ``instance`` part here: since our ``instance`` input property is not
-a scalar value but rather an object, we are placing another object template
-inside the appropriate section. Note that the type of this object is not
-``io.murano.resources.Instance`` as you could expect based on the property
-contract, but a more specific class: ``LinuxMuranoInstance`` in the same
-namespace. Since this class inherits the former, it matches the contract, but
-it provides a more appropriate implementation than the base one.
-
-
-Let's combine the two snippets together, we'll get the final UI definition of
-our app:
-
-.. code-block:: yaml
- :linenos:
-
- Application:
- ?:
- type: com.yourdomain.Plone
- instance:
- ?:
- type: io.murano.resources.LinuxMuranoInstance
- name: $.instanceConfiguration.hostname
- image: $.instanceConfiguration.image
- flavor: $.instanceConfiguration.flavor
- assignFloatingIp: $.instanceConfiguration.assignFloatingIp
- installationPath: $.ploneConfiguration.installationPath
- defaultPassword: $.ploneConfiguration.defaultPassword
- listeningPort: $.ploneConfiguration.listeningPort
- Forms:
- - instanceConfiguration:
- fields:
- - name: hostname
- type: string
- label: Host Name
- description: >-
- Enter a hostname for a virtual machine to be created
- initial: 'plone-vm'
- required: true
- - name: image
- type: image
- imageType: linux
- label: Instance image
- description: >-
- Select valid image for the application. Image should already be prepared and
- registered in glance.
- - name: flavor
- type: flavor
- label: Instance flavor
- description: >-
- Select registered in Openstack flavor. Consider that application performance
- depends on this parameter.
- - name: assignFloatingIp
- type: boolean
- label: Assign Floating IP
- description: >-
- Check to assign floating IP automatically
- - ploneConfiguration:
- fields:
- - name: installationPath
- type: string
- label: Installation Path
- initial: '/opt/plone'
- description: >-
- Enter the path on the VM filesystem to deploy Plone into
- - name: defaultPassword
- label: Admin password
- description: Default administrator's password
- type: password
- required: true
- - name: listeningPort
- type: integer
- label: Listening Port
- description: Port to listen at
- initial: 8080
-
-
-Save this file as a ``ui.yaml`` in a ``UI`` folder of your package. As a final
-touch add a logo to the package - save the image below to the root directory of
-your package as ``logo.png``:
-
-.. image:: plone-logo.png
- :width: 100
-
-The package is ready. Zip it and import to Murano catalog. We are ready to try
-it.
-
-Deploying the package
-~~~~~~~~~~~~~~~~~~~~~
-
-Go to Murano Dashboard, create an environment and add a "Plone CMS" application
-to it. You'll see the nice wizard with all the field labels and descriptions
-you've added to the ui definition file:
-
-.. image:: plone-simple-step1.png
- :width: 50%
-
-.. image:: plone-simple-step2.png
- :width: 50%
-
-After the app is added to the environment, click the "Deploy this environment"
-button. The deployment will take about 10 minutes, depending on the speed of
-the VM's internet connection and the amount of packages to be updated. When it
-is over, check the "Last operation" column in the environment's list of
-components near the Plone component. It should contain a message "Plone is up
-and running at ..." followed by ip address and port:
-
-.. image:: plone-ready.png
- :width: 50%
-
-Enter this address to the address bar of your browser. You'll see the default
-management interface of Plone:
-
-.. image:: plone-admin.png
- :width: 50%
-
-If you click a "Create a new Plone site" button you'll be prompted for username
-and password. Use ``admin`` username and the password which you entered in the
-Wizard. See `Plone Documentation `_ for details on how
-to operate Plone.
-
-This concludes this part of the course. The application package we created
-demonstrates the basic capabilities of Murano for the deployments of real-world
-applications. However, the deployed configuration of Plone is not of
-production-grade service: it is just a single VM with all-in-one service
-topology, which is not a scalable or fault-tolerant solution.
-In the next part we will learn some advanced features which may help to bring
-more production-grade capabilities to our package.
diff --git a/doc/source/admin/appdev-guide/step-by-step/part4.rst b/doc/source/admin/appdev-guide/step-by-step/part4.rst
deleted file mode 100644
index dd9c39e62..000000000
--- a/doc/source/admin/appdev-guide/step-by-step/part4.rst
+++ /dev/null
@@ -1,355 +0,0 @@
-Part 4: Refactoring code to use the Application Framework
----------------------------------------------------------
-
-Up until this point we wrote the Plone application in a manner that was common
-to all applications that were written before the application framework was
-introduced.
-
-In this last tutorial step we are going to refactor the Plone code in order
-to take advantage of the framework.
-
-Application framework was written in order to simplify the application
-development and encapsulate common deployment workflows. This gives things
-primitives for application scaling and high availability without the need to
-develop them over and over again for each application.
-
-When using the frameworks, an application developer only has to inherit the
-class that best suits him and provide it only with the code that is specific
-to the application, while leaving the rest to the framework.
-This typically includes:
-
-* instructions on how to provision the software on each node (server)
-* instructions on how to configure the provisioned software
-* server group onto which the software should be installed. This may be a
- fixed server list, a shared server pool, or a scalable server group that
- creates servers using the given instance template, or one of the several
- other implementations provided by the framework
-
-The framework is located in a separate library package
-``io.murano.applications`` that is shipped with Murano. We are going to use
-the ``apps`` namespace prefix to refer to this namespace through the code.
-
-Step 1: Add dependency on the App Framework
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-In order to use one Murano Package from another, the former must be explicitly
-specified as a requirement for the latter. This is done by filling the
-``Require`` section in the package's manifest file.
-
-Open the Plone's manifest.yaml file and append the following lines:
-
-.. code-block:: yaml
-
- Require:
- io.murano.applications:
-
-Requirements are specified as a mapping from package name to the desired
-version of that package (or version range). The missing value indicates
-the dependency on the latest ``0.*.*`` version of the package which is exactly
-what we need since the current version of the app framework library is 0.
-
-Step 2: Get rid of the instance
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Since we are going to have a multi-sever Plone application there won't be
-a single instance belonging to the application. Instead, we are going to
-provide it with the server group that abstracts the server management from
-the application.
-
-So instead of
-
-.. code-block:: yaml
-
- Properties:
- instance:
- Contract: $.class(res:Instance)
-
-we are going to have
-
-.. code-block:: yaml
-
- Properties:
- servers:
- Contract: $.class(apps:ServerGroup).notNull()
-
-
-Step 3: Change the base classes
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Another change that we are going to make to the main application class is
-to change its base classes. Regular applications inherit from the
-``std:Application`` which only has the method ``deploy`` that does all the
-work.
-
-Application framework provides us with its own implementation of that class and
-method. Instead of one monolithic method that does everything, with the
-framework, the application provides only the code needed to provision and
-configure the software on each server.
-
-So instead of ``std:Application`` class we are going to inherit two of
-the framework classes:
-
-.. code-block:: yaml
-
- Extends:
- - apps:MultiServerApplicationWithScaling
- - apps:OpenStackSecurityConfigurable
-
-The first class tells us that we are going to have an application that runs
-on multiple servers. In the following section we are going to split out
-``deploy`` method into two smaller methods that are going to be invoked by
-the framework to install the software on each of the servers. By inheriting the
-``apps:MultiServerApplicationWithScaling``, the application automatically gets
-all the UI buttons to scale it out and in.
-
-The second class is a mix-in class that tells the framework that we are going
-to provide the OpenStack-specific security group configuration for the
-application.
-
-
-Step 4: Split the deployment logic
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-In this step we are going to split the installation into two phases:
-provisioning and configuration.
-
-Provisioning is implemented by overriding the ``onInstallServer`` method,
-which is called every time a new server is added to the server group. In this
-method we are going to install the Plone software bits onto the server
-(which is provided as a method parameter).
-
-Configuration is done through the ``onConfigureServer``, which is called
-upon the first installation on the server, and every time any of the
-application settings change, and ``onCompleteConfiguration`` which is
-executed on each server after everything was configured so that we can
-perform post-configuration steps like starting application daemons and
-reporting messages to the user.
-
-Thus we are going to split the ``install-plone.sh`` script into two scripts:
-``installPlone.sh`` and ``configureServer.sh`` and execute each one in their
-corresponding methods:
-
-.. code-block:: yaml
-
- onInstallServer:
- Arguments:
- - server:
- Contract: $.class(res:Instance).notNull()
- - serverGroup:
- Contract: $.class(apps:ServerGroup).notNull()
- Body:
- - $file: sys:Resources.string('installPlone.sh').replace({
- "$1" => $this.deploymentPath,
- "$2" => $this.adminPassword
- })
- - conf:Linux.runCommand($server.agent, $file)
-
- onConfigureServer:
- Arguments:
- - server:
- Contract: $.class(res:Instance).notNull()
- - serverGroup:
- Contract: $.class(apps:ServerGroup).notNull()
- Body:
- - $primaryServer: $serverGroup.getServers().first()
- - If: $server = $primaryServer
- Then:
- - $file: sys:Resources.string('configureServer.sh').replace({
- "$1" => $this.deploymentPath,
- "$2" => $primaryServer.ipAddresses[0]
- })
- Else:
- - $file: sys:Resources.string('configureClient.sh').replace({
- "$1" => $this.deploymentPath,
- "$2" => $this.servers.primaryServer.ipAddresses[0],
- "$3" => $this.listeningPort})
- - conf:Linux.runCommand($server.agent, $file)
-
-
- onCompleteConfiguration:
- Arguments:
- - servers:
- Contract:
- - $.class(res:Instance).notNull()
- - serverGroup:
- Contract: $.class(apps:ServerGroup).notNull()
- - failedServers:
- Contract:
- - $.class(res:Instance).notNull()
- Body:
- - $startCommand: format('{0}/zeocluster/bin/plonectl start', $this.deploymentPath)
- - $primaryServer: $serverGroup.getServers().first()
- - If: $primaryServer in $servers
- Then:
- - $this.report('Starting DB node')
- - conf:Linux.runCommand($primaryServer.agent, $startCommand)
- - conf:Linux.runCommand($primaryServer.agent, 'sleep 10')
-
- - $otherServers: $servers.where($ != $primaryServer)
- - If: $otherServers.any()
- Then:
- - $this.report('Starting Client nodes')
- # run command on all other nodes in parallel with pselect
- - $otherServers.pselect(conf:Linux.runCommand($.agent, $startCommand))
-
- # build an address string with IPs of all our servers
- - $addresses: $serverGroup.getServers().
- select(
- switch($.assignFloatingIp => $.floatingIpAddress,
- true => $.ipAddresses[0])
- + ':' + str($this.listeningPort)
- ).join(', ')
- - $this.report('Plone listeners are running at ' + str($addresses))
-
-During configuration phase we distinguish the first server in the server group
-from the rest of the servers. The first server is going to be the primary
-node and treated differently from the others.
-
-Step 5: Configuring OpenStack security group
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The last change to the main class is to set up the security group rules.
-We are going to do this by overriding the ``getSecurityRules`` method
-that we inherited from the ``apps:OpenStackSecurityConfigurable`` class:
-
-.. code-block:: yaml
-
- getSecurityRules:
- Body:
- - Return:
- - FromPort: $this.listeningPort
- ToPort: $this.listeningPort
- IpProtocol: tcp
- External: true
- - FromPort: 8100
- ToPort: 8100
- IpProtocol: tcp
- External: false
-
-The code is very similar to that of the old ``deploy`` method with the only
-difference being that it returns the rules rather than sets them on its own.
-
-Step 6: Provide the server group instance
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Do you remember, that previously we replaced the ``instance`` property with
-``servers`` of type ``apps:ServerGroup``? Since the object is coming from the
-UI definition, we must change the latter in order to provide
-the class with the ``apps:ServerReplicationGroup`` instance rather than
-``resources:Instance``.
-
-To do this we are going to replace the ``instance`` property in the
-Application template with the following snippet:
-
-.. code-block:: yaml
-
- servers:
- ?:
- type: io.murano.applications.ServerReplicationGroup
- numItems: $.ploneConfiguration.numNodes
- provider:
- ?:
- type: io.murano.applications.TemplateServerProvider
- template:
- ?:
- type: io.murano.resources.LinuxMuranoInstance
- flavor: $.instanceConfiguration.flavor
- image: $.instanceConfiguration.osImage
- assignFloatingIp: $.instanceConfiguration.assignFloatingIP
- serverNamePattern: $.instanceConfiguration.unitNamingPattern
-
-If you take a closer look at the code above you will find out that the
-new declaration is very similar to the old one. But now instead of providing
-the ``Instance`` property values directly, we are providing them as a template
-for the ``TemplateServerProvider`` server provider. ``ServerReplicationGroup``
-is going to use the provider each time it requires another server. In turn,
-the provider is going to use the familiar template for the new instances.
-
-Besides the instance template we also specify the initial number of Plone
-nodes using the ``numItems`` property and the name pattern for the servers.
-Thus we must also add it to the list of our controls:
-
-.. code-block:: yaml
-
- Forms:
- - instanceConfiguration:
- fields:
- ...
- - name: unitNamingPattern
- type: string
- label: Instance Naming Pattern
- required: false
- maxLength: 64
- initial: 'plone-{0}'
- description: >-
- Specify a string, that will be used in instance hostname.
- Just A-Z, a-z, 0-9, dash and underline are allowed.
-
- - ploneConfiguration:
- fields:
- ...
- - name: numNodes
- type: integer
- label: Initial number of Client Nodes
- initial: 1
- minValue: 1
- required: true
- description: >-
- Select the initial number of Plone Client Nodes
-
-Step 6: Using server group composition
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-By this step we should already have a working Plone application. But let's
-go one step further and enhance our sample application.
-
-Since we are running the database on the first server group server only,
-we might want it to have different properties. For example we might want
-to give it a bigger flavor or just a special name. This is a perfect
-opportunity for us to demonstrate how to construct complex server groups.
-All we need to do is to just use another implementation of
-``apps:ServerGroup``. Instead of ``apps:ServerReplicationGroup`` we are going
-to use the ``apps:CompositeServerGroup`` class, which allows us to compose
-several server groups together. One of them is going to be a single-server
-server group consisting of our primary server, and the second is going to be
-the scalable server group that we used to create in the previous step.
-
-So again, we change the ``Application`` section of our UI definition file
-with even a more advanced ``servers`` property definition:
-
-.. code-block:: yaml
-
- servers:
- ?:
- type: io.murano.applications.CompositeServerGroup
- serverGroups:
- - ?:
- type: io.murano.applications.SingleServerGroup
- server:
- ?:
- type: io.murano.resources.LinuxMuranoInstance
- name: format($.instanceConfiguration.unitNamingPattern, 'db')
- image: $.instanceConfiguration.image
- flavor: $.instanceConfiguration.flavor
- assignFloatingIp: $.instanceConfiguration.assignFloatingIp
- - ?:
- type: io.murano.applications.ServerReplicationGroup
- numItems: $.ploneConfiguration.numNodes
- provider:
- ?:
- type: io.murano.applications.TemplateServerProvider
- template:
- ?:
- type: io.murano.resources.LinuxMuranoInstance
- flavor: $.instanceConfiguration.flavor
- image: $.instanceConfiguration.osImage
- assignFloatingIp: $.instanceConfiguration.assignFloatingIP
- serverNamePattern: $.instanceConfiguration.unitNamingPattern
-
-Here the instance definition for the ``SingleServerGroup`` (our primary
-server) differs from the servers in the ``ServerReplicationGroup`` by its name
-only. However the same technique might be used to customize other properties
-as well as to create even more sophisticated server group topologies. For
-example, we could implement region bursting by composing several scalable
-server groups that allocate servers in different regions. And all of that
-without making any changes to the application code itself!
diff --git a/doc/source/admin/appdev-guide/step-by-step/plone-admin.png b/doc/source/admin/appdev-guide/step-by-step/plone-admin.png
deleted file mode 100644
index a613b8812..000000000
Binary files a/doc/source/admin/appdev-guide/step-by-step/plone-admin.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/step-by-step/plone-logo.png b/doc/source/admin/appdev-guide/step-by-step/plone-logo.png
deleted file mode 100644
index 423f5b468..000000000
Binary files a/doc/source/admin/appdev-guide/step-by-step/plone-logo.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/step-by-step/plone-ready.png b/doc/source/admin/appdev-guide/step-by-step/plone-ready.png
deleted file mode 100644
index d7e0df5e7..000000000
Binary files a/doc/source/admin/appdev-guide/step-by-step/plone-ready.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/step-by-step/plone-simple-step1.png b/doc/source/admin/appdev-guide/step-by-step/plone-simple-step1.png
deleted file mode 100644
index 11b670537..000000000
Binary files a/doc/source/admin/appdev-guide/step-by-step/plone-simple-step1.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/step-by-step/plone-simple-step2.png b/doc/source/admin/appdev-guide/step-by-step/plone-simple-step2.png
deleted file mode 100644
index 956593ee8..000000000
Binary files a/doc/source/admin/appdev-guide/step-by-step/plone-simple-step2.png and /dev/null differ
diff --git a/doc/source/admin/appdev-guide/step-by-step/step_by_step.rst b/doc/source/admin/appdev-guide/step-by-step/step_by_step.rst
deleted file mode 100644
index 48607dbee..000000000
--- a/doc/source/admin/appdev-guide/step-by-step/step_by_step.rst
+++ /dev/null
@@ -1,41 +0,0 @@
-.. _step-by-step:
-
-Developing Murano Packages 101
-==============================
-
-Murano provides a very powerful and flexible platform to automate the
-provisioning, deployment, configuration and lifecycle management of
-applications in OpenStack clouds. However, the flexibility comes at cost: to
-manage an application with Murano one has to design and develop special
-scenarios which will tell Murano how to handle different aspects of application
-lifecycle. These scenarios are usually called "Murano Applications" or "Murano
-Packages". It is not hard to build them, but it requires some time to get
-familiar with Murano's DSL to define these scenarios and to learn the common
-patterns and best practices. This article provides a basic introductory course
-of these aspects and aims to be the starting point for the developers willing
-to learn how to develop Murano Application packages with ease.
-
-The course consists of the following parts:
-
-.. toctree::
- :maxdepth: 2
-
- part1
- part2
- part3
- part4
-
-.. #. Creating your first Application Package
-.. #. Adding User Interface to your package and other improvements
-.. #. Modifying the application to do something useful
-.. #. Adding scalability scenarios
-.. #. Learning some advanced stuff for production-grade deployments
-
-Before you proceed, please ensure that you have an OpenStack cloud
-(devstack-based will work just fine) and the latest version of Murano deployed.
-This guide assumes that the reader has a basic knowledge of some programming
-languages and object-oriented design and is a bit familiar with the scripting
-languages used to configure Linux servers. Also it would be beneficial to be
-familiar with YAML format: lots of software configuration tools nowadays use
-YAML, and Murano is no different.
-
diff --git a/doc/source/admin/appdev-guide/use_cases.rst b/doc/source/admin/appdev-guide/use_cases.rst
deleted file mode 100644
index dde1b9a8d..000000000
--- a/doc/source/admin/appdev-guide/use_cases.rst
+++ /dev/null
@@ -1,272 +0,0 @@
-.. _use-cases:
-
-=========
-Use-cases
-=========
-
-Performing application interconnections
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Murano can handle application interconnections installed on virtual machines.
-The decision of how to combine applications is made by the author of
-an application.
-
-To illustrate the way such interconnection can be configured,
-let's analyze the mechanisms applied in WordPress application, which
-uses MySql.
-
-MySql is a very popular database and can be used in quite a number of various
-applications. Instead of the creation of a database inside definition of the
-WordPress application, it calls the methods from the MySQL class. At the same
-time MySQL remains an independent application.
-
-MySql has a number of methods:
-
-* ``deploy``
-* ``createDatabase``
-* ``createUser``
-* ``assignUser``
-* ``getConnectionString``
-
-In the ``com.example.WordPress`` class definition the database property is a
-contact for the ``com.example.databases.MySql`` class. So, the database
-configuration methods can be called with the parameters passed by the user
-in the main method:
-
-.. code-block:: yaml
-
- - $.database.createDatabase($.dbName)
- - $.database.createUser($.dbUser, $.dbPassword)
- - $.database.assignUser($.dbUser, $.dbName)
-
-Any other methods of any other class can be invoked the same way to
-make the proposal application installation algorithm clear and
-constructive. Also, it allows not to duplicate the code in new applications.
-
-Abstract dependencies between applications
-------------------------------------------
-In the example above it is also possible to specify a generic class in the
-contract ``com.example.databases.SqlDatabase`` instead of
-``com.example.databases.MySql``. It means that an object of any class inherited
-from ``com.example.databases.SqlDatabase`` can be passed to a parameter. In
-this case you should also use this generic class as a type for a field in
-the file ``ui.yaml``:
-
-.. code-block:: yaml
-
- Forms:
- - appConfiguration:
- fields:
- - name: database
- type: com.example.databases.SqlDatabase
- label: Database Server
- description: >-
- Select a database server to host the application`s database
-
-After that you can choose any database package in a drop-down box.
-The last place, which should be changed in the WordPress package to enable this
-feature, is manifest file. It should contain the full name of SQL Library
-package and optionally packages inherited from SQL library if you want them to
-be downloaded as dependencies. For example:
-
-.. code-block:: yaml
-
- Require:
- com.example.databases:
- com.example.databases.MySql:
- com.example.databases.PostgreSql:
-
-.. note::
- To use this feature you have to enable Glare as a storage for your packages
- and a version of your murano-dashboard should be not older than newton.
-
-Using application already installed on the image
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Suppose you have everything already prepared on image. And you want to share this
-image with others. This problem can be solved in several ways.
-
-Let's use the
-`HDPSandbox `_
-application to illustrate how this can be done with Murano.
-
-.. note::
- An image may not contain murano-agent at all.
-
-Prepare an application package of the structure:
-
-::
-
- |_ Classes
- | |_ HDPSandbox.yaml
- |
- |_ UI
- | |_ ui.yaml
- |
- |_ logo.png
-
-.. note::
-
- The ``Resources`` folder is not included in the package since the image
- contains everything that user expects. So no extra instructions are needed
- to be executed on murano-agent.
-
-UI is provided for specifying the application name, which is used for the application
-recognition in logging. And what is more, it contains the image name as a deployment
-instruction template (object model) in the ``Application`` section:
-
-.. code-block:: yaml
- :linenos:
-
- Application:
- ?:
- type: com.example.HDPSandbox
- name: $.appConfiguration.name
- instance:
- ?:
- type: io.murano.resources.LinuxMuranoInstance
- name: generateHostname($.instanceConfiguration.unitNamingPattern, 1)
- flavor: $.instanceConfiguration.flavor
- image: 'hdp-sandbox'
- assignFloatingIp: true
-
-Moreover, the unsupported flavors can be specified here, so that the user can
-select only from the valid ones. Provide the requirements in the
-corresponding section to do this:
-
-.. code-block:: yaml
-
- requirements:
- min_disk: 50 (Gb)
- min_memory_mb: 4096 (Mb)
- min_vcpus: 1
-
-After the UI form creation, and the HDPSandbox application deployment,
-the VM with the predefined image is spawned. Such type of applications may
-interact with regular applications. Thus, if you have an image with Puppet,
-you can call the ``deploy`` method of the Puppet application and then puppet
-manifests or any shell scripts on the freshly spawned VM.
-
-The presence of the logo.png should never be underestimated, since it helps to make
-your application recognizable among other applications included in the catalog.
-
-Interacting with non-OpenStack services
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-This section tells about the interaction between an application and any non-OpenStack
-services, that have an API.
-
-External load-balancer
-----------------------
-Suppose, you have powerful load-balancer on a real server. And you want to run
-the application on an OpenStack VM. Murano can set up new applications to be managed
-by that external load-balancer (LB). Let's go into more details.
-
-To implement this case the following apps are used:
-
-* ``LbApp``: its class methods call LB API
-
-* ``WebApp``: runs on the real LB
-
-Several instances of ``WebApp`` are deployed with each of them calling
-two methods:
-
-.. code-block:: yaml
-
- - $.loadBalancer.createPool()
- - $.loadBalancer.addMember($instance)
- # where $.loadBalancer is an instance of the LbApp class
-
-The first method creates a pool and associates it with a virtual server.
-This happens once only. The second one registers a member in the newly created pool.
-
-It is also possible to perform other modifications to the LB configuration,
-which are only restricted by the LB API functionality.
-
-So, you need to specify the maximum instance number in the UI form related to the
-``WebApp`` application. All of them are subsequently added to the LB pool.
-After the deployment, the LB virtual IP, by which an application is accessible,
-is displayed.
-
-Configuring Network Access for VMs
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-By default, each VM instance deployed by ``io.murano.resources.Instance`` class
-or its descendants joins an environment's default network. This network gets
-created when the Environment is deployed for the first time, a subnet is
-created in it and is uplinked to a router which is detected automatically based
-on its name.
-
-This behavior may be overridden in two different ways.
-
-Using existing network as environment's default
------------------------------------------------
-
-This option is available for users when they create a new environment in the
-Dashboard. A dropdown control is displayed next to the input field prompting
-for the name of environment. By default this control provides to create a new
-network, but the user may opt to choose some already existing network to be the
-default for the environment being created. If the network has more than one
-subnet, the list will include all the available options with their CIDRs
-shown. The selected network will be used as environment's default, so no new
-network will be created.
-
-.. note::
-
- Murano does not check the configuration or topology of the network selected
- this way. It is up to the user to ensure that the network is uplinked to some
- external network via a router - otherwise the murano engine will not be able
- to communicate with the agents on the deployed VMs. If the Applications being
- deployed require internet connectivity it is up to the user to ensure that
- this net provides it, than DNS nameservers are set and accessible etc.
-
-
-Modifying the App UI to prompt user for network
------------------------------------------------
-
-The application package may be designed to ask user about the network they want
-to use for the VMs deployed by this particular application. This allows to
-override the default environment's network setting regardless of its value.
-
-To do this, application developer has to include a ``network`` field into the
-Dynamic UI definition of the app. The value returned by this field is a tuple
-of network_id and a subnet_id. This values may be passed as the
-input properties for ``io.murano.resources.ExistingNeutronNetwork`` object
-which may be in its turn passed to an instance of
-``io.murano.resources.Instance`` as its network configuration.
-
-The UI definition may look like this:
-
-.. code-block:: yaml
-
- Templates:
- customJoinNet:
- - ?:
- type: io.murano.resources.ExistingNeutronNetwork
- internalNetworkName: $.instanceConfiguration.network[0]
- internalSubnetworkName: $.instanceConfiguration.network[1]
- Application:
- ?:
- type: com.example.someApplicationName
- instance:
- ?:
- type: io.murano.resources.LinuxMuranoInstance
- networks:
- useEnvironmentNetwork: $.instanceConfiguration.network[0]=null
- useFlatNetwork: false
- customNetworks: switch($.instanceConfiguration.network[0], $=null=>list(), $!=null=>$customJoinNet)
- Forms:
- - instanceConfiguration:
- fields:
- - name: network
- type: network
- label: Network
- description: Select a network to join. 'Auto' corresponds to a default environment's network.
- required: false
- murano_networks: translate
-
-For more details on the Dynamic UI its controls and templates please refer to
-its :ref:`specification `.
-
-
-
diff --git a/doc/source/admin/config-wsgi.rst b/doc/source/admin/config-wsgi.rst
deleted file mode 100644
index 92d2d36a9..000000000
--- a/doc/source/admin/config-wsgi.rst
+++ /dev/null
@@ -1,112 +0,0 @@
-Installing Murano API via WSGI
-==============================
-
-This document is a guide to deploy murano using two WSGI mode uwsgi and
-mod_wsgi of Apache.
-
-Please note that if you intend to use mode uwsgi, you should install
-``mode_proxy_uwsgi`` module. For example on deb-base system:
-
-.. code-block:: console
-
- # sudo apt-get install libapache2-mod-proxy-uwsgi
- # sudo a2enmod proxy
- # sudo a2enmod proxy_uwsgi
-
-.. end
-
-WSGI Application
-----------------
-
-The function ``murano.httpd.init_application`` will setup a WSGI application
-to run behind uwsgi and mod_wsgi
-
-Murano API behind uwsgi
------------------------
-
-Create a ``murano-api-uwsgi`` file with content below:
-
-.. code-block:: ini
-
- [uwsgi]
- chmod-socket = 666
- socket = /var/run/uwsgi/murano-wsgi-api.socket
- lazy-apps = true
- add-header = Connection: close
- buffer-size = 65535
- hook-master-start = unix_signal:15 gracefully_kill_them_all
- thunder-lock = true
- plugins = python
- enable-threads = true
- worker-reload-mercy = 90
- exit-on-reload = false
- die-on-term = true
- master = true
- processes = 2
- wsgi-file = /murano-wsgi-api
-
-.. end
-
-Start murano-api:
-
-.. code-block:: console
-
- # uwsgi --ini /etc/murano/murano-api-uwsgi.ini
-
-.. end
-
-Murano API behind mod_wsgi
---------------------------
-
-Create ``/etc/apache2/murano.conf`` with content below:
-
-.. code-block:: ini
-
- Listen 8082
-
-
- WSGIDaemonProcess murano-api processes=1 threads=10 user=%USER% display-name=%{GROUP} %VIRTUALENV%
- WSGIProcessGroup murano-api
- WSGIScriptAlias / %MURANO_BIN_DIR%/murano-wsgi-api
- WSGIApplicationGroup %{GLOBAL}
- WSGIPassAuthorization On
- AllowEncodedSlashes On
- = 2.4>
- ErrorLogFormat "%{cu}t %M"
-
- ErrorLog /var/log/%APACHE_NAME%/murano_api.log
- CustomLog /var/log/%APACHE_NAME%/murano_api_access.log combined
-
-
- = 2.4>
- Require all granted
-
-
- Order allow,deny
- Allow from all
-
-
-
-
-.. end
-
-Then on deb-based systems copy or symlink the file to ``/etc/apache2/sites-available``.
-For rpm-based systems the file will go in ``/etc/httpd/conf.d``.
-
-Enable the murano site. On deb-based systems:
-
-.. code-block:: console
-
- # a2ensite murano
- # systemctl reload apache2.service
-
-.. end
-
-On rpm-based systems:
-
-.. code-block:: console
-
- # systemctl reload httpd.service
-
-.. end
-
diff --git a/doc/source/admin/configure_cloud_foundry_service_broker.rst b/doc/source/admin/configure_cloud_foundry_service_broker.rst
deleted file mode 100644
index e2dc877f9..000000000
--- a/doc/source/admin/configure_cloud_foundry_service_broker.rst
+++ /dev/null
@@ -1,208 +0,0 @@
-.. _configure_service_broker:
-
-=======================================
-Murano service broker for Cloud Foundry
-=======================================
-
-Service broker overview
------------------------
-
-Service broker is a new murano component which implements `Cloud Foundry
-`_ Service Broker API.
-
-This lets users build 'hybrid' infrastructures that are services like databases, message
-queues, key/value stores, and so on. This services can be uploaded and deployed with
-murano and made available to Cloud Foundry apps on demand. The result is lowered cost,
-shorter timetables, and quicker access to required tools — developers can 'self serve'
-by building any required service, then make it instantly available in Cloud Foundry.
-
-Configure service broker
-------------------------
-
-Manual installation
-~~~~~~~~~~~~~~~~~~~
-
-If you use local murano installation, you can configure and run murano service
-broker in a few simple steps:
-
-#. Change into the murano directory:
-
- .. code-block:: console
-
- cd ~/murano/murano
-
-#. Generate the murano service broker config file.
- Murano service broker has a common config file for service broker API services.
- Using tox, generate a sample configuration file:
-
- .. code-block:: console
-
- tox -e gencfconfig
-
-#. Copy the configuration file for further modifications:
-
- .. code-block:: console
-
- cd ~/murano/murano/etc/murano
- ln -s murano-cfapi.conf.sample murano-cfapi.conf
-
-#. Edit ``murano-cfapi.conf``. Below is an example of the basic
- settings you may need to configure.
-
- .. note::
-
- The example below uses the SQLite database. Edit the **[database]**
- section to use another database.
-
- .. code-block:: ini
-
- [DEFAULT]
- debug = true
- verbose = true
-
- ...
-
- [database]
- backend = sqlalchemy
- connection = sqlite:///murano_cfapi.sqlite
-
- ...
-
- [keystone_authtoken]
- www_authenticate_uri = 'http://%OPENSTACK_HOST_IP%:5000/v3'
- auth_host = '%OPENSTACK_HOST_IP%'
- auth_port = 5000
- auth_protocol = http
- admin_tenant_name = %OPENSTACK_ADMIN_TENANT%
- admin_user = %OPENSTACK_ADMIN_USER%
- admin_password = %OPENSTACK_ADMIN_PASSWORD%
-
- ...
-
- [cfapi]
- tenant = %TENANT_NAME%
- bind_host = %HOST_IP%
- bind_port = 8083
- auth_url = 'http://%OPENSTACK_HOST_IP%:5000/v3'
-
-
- .. note::
-
- The ``bind_host`` IP should be in the same network as the
- Cloud Foundry instance.
-
-#. Create database tables for murano service broker:
-
- .. code-block:: console
-
- cd ~/murano/murano
- tox -e venv -- murano-cfapi-db-manage \
- --config-file ./etc/murano/murano-cfapi.conf upgrade
-
-#. Launch the murano service broker API in a separate terminal:
-
- .. code-block:: console
-
- cd ~/murano/murano
- tox -e venv -- murano-cfapi --config-file ./etc/murano/murano-cfapi.conf
-
- .. note::
-
- Run the command in a new terminal as the process will be running in
- the terminal until you terminate it, therefore, blocking the current
- terminal.
-
-Devstack installation
-~~~~~~~~~~~~~~~~~~~~~
-
-It is really easy to enable service broker in your devstack installation.
-You need simply update your ``local.conf`` with the following:
-
- .. code-block:: ini
-
- [[local|localrc]]
- enable_plugin murano https://opendev.org/openstack/murano
- enable_service murano-cfapi
-
-How to use service broker
--------------------------
-
-After service broker is configured and started you have nothing to do with service
-broker from murano side - it is an adapter which is used by Cloud Foundry PaaS.
-
-To access and use murano packages through Cloud Foundry, you need to perform following steps:
-
-#. Log in to Cloud Foundry instance via ssh.
-
- .. code-block:: console
-
- ssh -i @
-
-#. Log in to Cloud Foundry itself.
-
- .. code-block:: console
-
- cf login -a https://api..xip.io -u -p
-
-#. Add murano service broker.
-
- .. code-block:: console
-
- cf create-service-broker http://:8083
-
-#. Enable access to murano packages.
-
- .. code-block:: console
-
- cf enable-service-access
-
- .. warning::
-
- By default, access to all services is prohibited.
-
- .. note::
-
- You can use ``service-access`` command to see human-readable list of packages.
-
-#. Provision murano service through Cloud Foundry.
-
- .. code-block:: console
-
- cf create-service 'Apache HTTP Server' default MyApacheInstance -c apache.json
-
- .. code-block:: json
-
- {
- "instance": {
- "flavor": "m1.medium",
- "?": {
- "type": "io.murano.resources.LinuxMuranoInstance"
- },
- "keyname": "nstarodubtsev",
- "assignFloatingIp": "True",
- "name": "",
- "availabilityZone": "nova",
- "image": "1b9ff37e-dff3-4308-be08-9185705dad91"
- },
- "enablePHP": "True"
- }
-
-Known issues
-------------
-
-* `Hard to deploy complex apps
- `_
-
-Useful links
-------------
-
-Here is the list of the links for Cloud Foundry documentation which you might need:
-
-#. `Cloud Foundry development version launcher
- `_
-
-#. `How to manage Cloud Foundry service brokers
- `_
-
-#. `Cloud Foundry CLI docs
- `_
diff --git a/doc/source/admin/deploy_murano.rst b/doc/source/admin/deploy_murano.rst
deleted file mode 100644
index 2a86a8a98..000000000
--- a/doc/source/admin/deploy_murano.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-================
-Deploying murano
-================
-
-.. toctree::
- :maxdepth: 2
-
- deploy_murano/prerequisites
- deploy_murano/devstack
- deploy_murano/install_manually
- deploy_murano/configure_ssl
diff --git a/doc/source/admin/deploy_murano/configure_ssl.rst b/doc/source/admin/deploy_murano/configure_ssl.rst
deleted file mode 100644
index 52746d02a..000000000
--- a/doc/source/admin/deploy_murano/configure_ssl.rst
+++ /dev/null
@@ -1,111 +0,0 @@
-=============
-Configure SSL
-=============
-
-Murano components can work with SSL. This section provides information on
-how to set SSL properly.
-
-Configure SSL for Murano API
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-To configure SSL for the Murano API service, modify the ``[ssl]`` section in ``/etc/murano/murano.conf``:
-
-.. code-block:: ini
-
- [ssl]
- cert_file =
- key_file =
- ca_file =
-
-.. list-table::
- :widths: 10 25
- :header-rows: 1
-
- * - Parameter
- - Description
- * - ``cert_file``
- - A path to the certificate file the server should use when binding to an SSL-wrapped socket.
- * - ``key_file``
- - A path to the private key file the server should use when binding to an SSL-wrapped socket.
- * - ``ca_file``
- - A path to the CA certificate file the server should use to validate client certificates provided during an SSL handshake. This parameter is ignored if the ``cert_file`` and ``key_file`` parameters are not set.
-
-Murano API starts using SSL automatically after you point to the HTTPS protocol
-instead of HTTP during the registration of the Murano API service
-in endpoints, modifying the ``publicurl`` argument to start with ``https://``.
-
-SSL for Murano API is implemented the same way as in any other OpenStack
-component. See `ssl python module
-`_ for details.
-
-Configure SSL for RabbitMQ
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-All murano components communicate with each other using RabbitMQ.
-By default, all messages in RabbitMQ are not encrypted. You can encrypt
-this interaction with SSL. Configure each RabbitMQ exchange separately.
-
-Murano API <-> RabbitMQ <-> Murano engine
------------------------------------------
-
-Modify the ``[default]`` section in the ``/etc/murano/murano.conf`` file:
-
-#. Enable SSL for RabbitMQ:
-
- .. code-block:: ini
-
- # connect over SSL for RabbitMQ (boolean value)
- rabbit_use_ssl = true
-
-
-#. Set the ``kombu`` parameters.
-
- Specify the paths to the SSL key file and SSL CA certificate in a regular
- ```` format without quotes or leave them empty to enable
- self-signed certificates:
-
- .. code-block:: ini
-
- # SSL version to use (valid only if SSL enabled). valid values
- # are TLSv1, SSLv23 and SSLv3. SSLv2 may be available on some
- # distributions (string value)
- kombu_ssl_version =
-
- # SSL key file (valid only if SSL enabled) (string value)
- kombu_ssl_keyfile =
-
- # SSL cert file (valid only if SSL enabled) (string value)
- kombu_ssl_certfile =
-
- # SSL certification authority file (valid only if SSL enabled)
- # (string value)
- kombu_ssl_ca_certs =
-
-Murano agent -> RabbitMQ
-------------------------
-
-To encrypt the communication between the murano agent and RabbitMQ,
-set ``ssl = True`` in the ``[rabbitmq]`` section of
-``/etc/murano/murano.conf``:
-
-.. code-block:: ini
-
- [rabbitmq]
- ...
- ssl = True
- insecure = False
-
-If you want to configure the murano agent differently, you need to change
-the `default template `_ located in the murano core library.
-After you finish with the template modification, verify that you zip and
-re-upload the murano core library.
-
-Configure SSL for the Dashboard
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-If you do not plan to use self-signed certificates, no additional
-configurations are required. Just point your web browser to the URL
-starting with ``https://``.
-
-Otherwise, set the ``MURANO_API_INSECURE`` parameter to ``True`` in
-``/etc/openstack-dashboard/local_settings.py``.
diff --git a/doc/source/admin/deploy_murano/devstack.rst b/doc/source/admin/deploy_murano/devstack.rst
deleted file mode 100644
index e7f612657..000000000
--- a/doc/source/admin/deploy_murano/devstack.rst
+++ /dev/null
@@ -1,67 +0,0 @@
-==============================
-Integrate murano with DevStack
-==============================
-
-You can install murano with DevStack. The `murano/devstack`_ directory
-in the murano repository contains the files necessary to integrate murano
-with `DevStack`_.
-
-To install the development version of an OpenStack environment
-with murano, proceed with the following steps:
-
-#. Download DevStack:
-
- .. code-block:: console
-
- git clone https://opendev.org/openstack/devstack
- cd devstack
-
-#. Edit ``local.conf`` to enable murano DevStack plug-in:
-
- .. code-block:: console
-
- > cat local.conf
- [[local|localrc]]
- enable_plugin murano https://opendev.org/openstack/murano
-
-#. If you want to enable Murano Cloud Foundry Broker API service, add the
- following line to ``local.conf``:
-
- .. code-block:: ini
-
- enable_service murano-cfapi
-
-#. If you want to use Glare Artifact Repository as a strorage for packages,
- add the following line to ``local.conf``:
-
- .. code-block:: ini
-
- enable_service g-glare
-
- For more information on how to use Glare Artifact Repository,
- see :ref:`glare_usage`.
-
-#. (Optional) To import murano packages when DevStack is up, define an ordered
- list of FQDN packages in ``local.conf``. Verify that you list all package
- dependencies. These packages will be imported from the ``murano-apps``
- git repository by default. For example:
-
- .. code-block:: ini
-
- MURANO_APPS=com.example.apache.Tomcat,com.example.Guacamole
-
- To configure the git repository that will be used as the source for
- the imported packages, configure the ``MURANO_APPS_REPO`` and
- ``MURANO_APPS_BRANCH`` variables.
-
-#. Run DevStack:
-
- .. code-block:: console
-
- ./stack.sh
-
-**Result:** Murano has installed with DevStack.
-
-.. Links
-.. _DevStack: https://docs.openstack.org/devstack/latest/
-.. _murano/devstack: https://opendev.org/openstack/murano/src/branch/master/devstack
diff --git a/doc/source/admin/deploy_murano/install_manually.rst b/doc/source/admin/deploy_murano/install_manually.rst
deleted file mode 100644
index e9098996e..000000000
--- a/doc/source/admin/deploy_murano/install_manually.rst
+++ /dev/null
@@ -1,385 +0,0 @@
-.. _install_manually:
-
-=======================
-Install murano manually
-=======================
-
-Before you install Murano, verify that you completed the following tasks:
-
-#. Install software prerequisites depending on the operating system you use
- as described in the System prerequisites section.
-
- .. TODO (OG): add ref to System prerequisites when it is ready
-
-#. Install tox:
-
- .. code-block:: console
-
- sudo pip install tox
-
-#. Install and configure a database.
-
- Murano can use various database types on back end. For development
- purposes, use SQLite. For production installations, consider using
- MySQL database.
-
- .. warning::
-
- Murano supports PostgreSQL as well. Though, use it with caution
- as it has not been thoroughly tested yet.
-
- Before you can use MySQL database, proceed with the following:
-
- #. Install MySQL:
-
- .. code-block:: console
-
- apt-get install mysql-server
-
- #. Create an empty database:
-
- Replace %MURANO_DB_PASSWORD% with the actual password. For example,
- 'admin'.
-
- .. code-block:: console
-
- mysql -u root -p
-
- mysql> CREATE DATABASE murano;
- mysql> GRANT ALL PRIVILEGES ON murano.* TO 'murano'@'localhost' \
- IDENTIFIED BY %MURANO_DB_PASSWORD%;
- mysql> exit;
-
-Install the API service and engine
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-#. Create a folder to which all murano components will be stored:
-
- .. code-block:: console
-
- mkdir ~/murano
-
-#. Clone the murano git repository to the management server:
-
- .. code-block:: console
-
- cd ~/murano
- git clone https://opendev.org/openstack/murano
-
-#. Create the configuration file. Murano has a common configuration
- file for API and engine services.
-
- #. Generate a sample configuration file using tox:
-
- .. code-block:: console
-
- cd ~/murano/murano
- tox -e genconfig
-
- #. Create a copy of ``murano.conf`` for further modifications:
-
- .. code-block:: console
-
- cd ~/murano/murano/etc/murano
- cp murano.conf.sample murano.conf
-
-#. Edit the ``murano.conf`` file. An example below contains the basic
- configuration.
-
- .. note::
-
- The example uses MySQL database. If you want to use another
- database type, edit the ``[database]`` section correspondingly.
-
- Replace items in "%" with the actual values. For example, replace
- %RABBITMQ_SERVER_IP% with 127.0.0.1. So, the complete row with the
- replaced value will be rabbit_host = 127.0.0.1
-
- .. code-block:: ini
-
- [DEFAULT]
- debug = true
- verbose = true
- rabbit_host = %RABBITMQ_SERVER_IP%
- rabbit_userid = %RABBITMQ_USER%
- rabbit_password = %RABBITMQ_PASSWORD%
- rabbit_virtual_host = %RABBITMQ_SERVER_VIRTUAL_HOST%
-
- ...
-
- [database]
- connection = mysql+pymysql://murano:%MURANO_DB_PASSWORD%@127.0.0.1/murano
-
- ...
-
- [keystone]
- auth_url = 'http://%OPENSTACK_HOST_IP%:5000'
-
- ...
-
- [keystone_authtoken]
- www_authenticate_uri = 'http://%OPENSTACK_HOST_IP%:5000'
- auth_host = '%OPENSTACK_HOST_IP%'
- auth_port = 5000
- auth_protocol = http
- admin_tenant_name = %OPENSTACK_ADMIN_TENANT%
- admin_user = %OPENSTACK_ADMIN_USER%
- admin_password = %OPENSTACK_ADMIN_PASSWORD%
-
- ...
-
- [murano]
- url = http://%YOUR_HOST_IP%:8082
-
- [rabbitmq]
- host = %RABBITMQ_SERVER_IP%
- login = %RABBITMQ_USER%
- password = %RABBITMQ_PASSWORD%
- virtual_host = %RABBITMQ_SERVER_VIRTUAL_HOST%
-
- [networking]
- default_dns = 8.8.8.8 # In case OpenStack neutron has no default
- # DNS configured
-
- [oslo_messaging_notifications]
- driver = messagingv2
-
-#. Create a virtual environment and install murano prerequisites
- using **tox**. The virtual environment will be created under
- the ``tox`` directory.
-
- #. Install MySQL driver since it is not a part of the murano requirements:
-
- .. code-block:: console
-
- tox -e venv -- pip install PyMYSQL
-
- #. Create database tables for murano:
-
- .. code-block:: console
-
- cd ~/murano/murano
- tox -e venv -- murano-db-manage \
- --config-file ./etc/murano/murano.conf upgrade
-
- #. Launch the murano API in a separate terminal:
-
- .. code-block:: console
-
- cd ~/murano/murano
- tox -e venv -- murano-api --config-file ./etc/murano/murano.conf
-
- .. note::
-
- Run the command in a new terminal as the process will be running in
- the terminal until you terminate it, therefore, blocking the current
- terminal.
-
- #. Leaving the API process running, return to the previous console and
- import murano core library and other libraries from the `meta`
- directory:
-
- .. code-block:: console
-
- cd ~/murano/murano/meta/
- for i in */; do pushd ./"$i"; zip -r ../../"${i%/}.zip" *; popd; done
- cd ..
- tox -e venv -- murano --os-username %OPENSTACK_ADMIN_USER% \
- --os-password %OPENSTACK_ADMIN_PASSWORD% \
- --os-auth-url http://%OPENSTACK_HOST_IP%:5000 \
- --os-project-name %OPENSTACK_ADMIN_TENANT% \
- --murano-url http://%MURANO_IP%:8082 \
- package-import --is-public *.zip
- rm *.zip
-
- #. Launch the murano engine in a separate terminal:
-
- .. code-block:: console
-
- cd ~/murano/murano
- tox -e venv -- murano-engine --config-file ./etc/murano/murano.conf
-
- .. note::
-
- Run the command in a new terminal as the process will be running in
- the terminal until you terminate it, therefore, blocking the current
- terminal.
-
-Register in keystone
-~~~~~~~~~~~~~~~~~~~~
-
-To make the murano API available to all OpenStack users, you need to register
-the Application Catalog service within the Identity service.
-
-#. Add the ``application-catalog`` service to keystone:
-
- .. code-block:: console
-
- openstack service create --name murano --description \
- "Application Catalog for OpenStack" application-catalog
-
-#. Provide an endpoint for this service:
-
- .. code-block:: console
-
- openstack endpoint create --region RegionOne --publicurl 'http://%MURANO_IP%:8082/' \
- --adminurl 'http://%MURANO_IP%:8082/' --internalurl 'http://%MURANO_IP%:8082/' \
- %MURANO_SERVICE_ID%
-
- where ``MURANO-SERVICE-ID`` is the unique service number that can be found
- in the :command:`openstack service create` output.
-
- .. note::
-
- URLs (``--publicurl``, ``--internalurl``, and ``--adminurl`` values)
- may differ depending on your environment.
-
-Install the murano dashboard
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-This section describes how to install and run the murano dashboard.
-
-#. Clone the repository with the murano dashboard:
-
- .. code-block:: console
-
- cd ~/murano
- git clone https://opendev.org/openstack/murano-dashboard
-
-#. Clone the ``horizon`` repository:
-
- .. code-block:: console
-
- git clone https://opendev.org/openstack/horizon
-
-#. Create a virtual environment and install ``muranodashboard``
- as an editable module:
-
- .. code-block:: console
-
- cd horizon
- tox -e venv -- pip install -e ../murano-dashboard
-
-#. Prepare local settings.
-
- .. code-block:: console
-
- cp openstack_dashboard/local/local_settings.py.example \
- openstack_dashboard/local/local_settings.py
-
-
- For more information, check out the official
- `horizon documentation `_.
-
-#. Enable and configure Murano dashboard in the OpenStack Dashboard:
-
- * For the Newton (and later) OpenStack installations, copy plug-in file
- local settings files, and policy files:
-
- .. code-block:: console
-
- cp ../murano-dashboard/muranodashboard/local/enabled/*.py \
- openstack_dashboard/local/enabled/
-
- cp ../murano-dashboard/muranodashboard/local/local_settings.d/*.py \
- openstack_dashboard/local/local_settings.d/
-
- cp ../murano-dashboard/muranodashboard/conf/* openstack_dashboard/conf/
-
- * For the OpenStack installations prior to the Newton release, run:
-
- .. code-block:: console
-
- cp ../murano-dashboard/muranodashboard/local/_50_murano.py \
- openstack_dashboard/local/enabled/
-
- Customize local settings of your horizon installation, by editing the
- ``openstack_dashboard/local/local_settings.py`` file:
-
- .. code-block:: python
-
- ...
- ALLOWED_HOSTS = '*'
-
- # Provide your OpenStack Lab credentials
- OPENSTACK_HOST = '%OPENSTACK_HOST_IP%'
-
- ...
-
- DEBUG_PROPAGATE_EXCEPTIONS = DEBUG
-
- Change the default session back end from browser cookies to database
- to avoid issues with forms during the applications creation:
-
- .. code-block:: python
-
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.sqlite3',
- 'NAME': 'murano-dashboard.sqlite',
- }
- }
-
- SESSION_ENGINE = 'django.contrib.sessions.backends.db'
-
-
-#. (Optional) If you do not plan to get the murano service from the keystone
- application catalog, specify where the ``murano-api`` service is running:
-
- .. code-block:: python
-
- MURANO_API_URL = 'http://%MURANO_IP%:8082'
-
-#. (Optional) If you have set up the database as a session back end (this is
- done by default with murano local_settings file starting with Newton),
- perform database migration:
-
- .. code-block:: console
-
- tox -e venv -- python manage.py migrate --noinput
-
- Since a separate user is not required for development purpose,
- you can reply ``no``.
-
-#. Run Django server at ``127.0.0.1:8000`` or provide a different ``IP``
- and ``PORT`` parameters:
-
- .. code-block:: console
-
- tox -e venv -- python manage.py runserver
-
- .. note::
-
- The development server restarts automatically on every code change.
-
-**Result:** The murano dashboard is available at ``http://IP:PORT``.
-
-Import murano applications
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-To fill the application catalog, you need to import applications to your
-OpenStack environment. You can import applications using the murano dashboard,
-as well as the command-line client.
-
-To import applications using CLI, complete the following tasks:
-
-#. Clone the murano apps repository:
-
- .. code-block:: console
-
- cd ~/murano
- git clone https://opendev.org/openstack/murano-apps
-
-#. Import every package you need from this repository by running
- the following command:
-
- .. code-block:: console
-
- cd ~/murano/murano
- pushd ../murano-apps/Docker/Applications/%APP-NAME%/package
- zip -r ~/murano/murano/app.zip *
- popd
- tox -e venv -- murano --murano-url http://%MURANO_IP%:8082 package-import app.zip
-
-**Result:** The applications are imported and available from the application
-catalog.
diff --git a/doc/source/admin/deploy_murano/prerequisites.rst b/doc/source/admin/deploy_murano/prerequisites.rst
deleted file mode 100644
index 61d92fc1f..000000000
--- a/doc/source/admin/deploy_murano/prerequisites.rst
+++ /dev/null
@@ -1,178 +0,0 @@
-===================
-System requirements
-===================
-
-This section provides basic information about the murano environment system
-requirements. Additionally, it contains a description of the performance
-test scenario, which you may use to check if your hardware fits
-the requirements. To do this, run the test and compare the results with
-the baseline data provided.
-
-Software prerequisites
-~~~~~~~~~~~~~~~~~~~~~~
-
-Before you install murano, verify your system meets the following
-prerequisites.
-
-**Supported operating systems:**
-
-* Ubuntu Server
-* RHEL/CentOS
-* Debian
-
-**System packages for Ubuntu:**
-
-* gcc
-* python3-pip
-* python3-dev
-* libxml2-dev
-* libxslt-dev
-* libffi-dev
-* libpq-dev
-* python3-openssl
-* mysql-client
-
-**System packages for CentOS:**
-
-* gcc
-* python3-pip
-* python3-devel
-* libxml2-devel
-* libxslt-devel
-* libffi-devel
-* postgresql-devel
-* pyOpenSSL
-* mysql
-
-Hardware requirements
-~~~~~~~~~~~~~~~~~~~~~
-
-We recommend that your system meets the following hardware requirements:
-
-+------------+--------------------------------+----------------------+
-| Criteria | Minimal | Recommended |
-+============+================================+======================+
-| CPU | 4 core @ 2.4 GHz | 24 core @ 2.67 GHz |
-+------------+--------------------------------+----------------------+
-| RAM | 8 GB | 24 GB or more |
-+------------+--------------------------------+----------------------+
-| HDD | 2 x 500 GB (7200 rpm) | 4 x 500 GB (7200 rpm)|
-+------------+--------------------------------+----------------------+
-| RAID | Software RAID-1 (use mdadm as | Hardware RAID-10 |
-| | it improves the read | |
-| | performance almost twice) | |
-+------------+--------------------------------+----------------------+
-
-Other possible storage configurations:
-
-* 1x SSD 500+ GB
-
-* 1x HDD (7200 rpm) 500+ GB and 1x SSD 250+ GB (install the system onto
- the HDD and mount the SSD drive to the directory where the virtual
- machines images are stored)
-
-* 1x HDD (15000 rpm) 500+ GB
-
-Testing the performance
-~~~~~~~~~~~~~~~~~~~~~~~
-
-We have measured the time required to boot 1 to 5 instances of the Windows
-operating system simultaneously. You can use this data as the baseline
-to check if your system is fast enough.
-
-.. note::
-
- Use *sysprepped* images for this test to simulate an instance first boot.
-
-To reproduce the performance test, proceed with the following steps:
-
-#. Prepare a Windows 2012 Standard (with GUI) image in the ``QCOW2`` format.
- This example uses the ``ws-2012-std.qcow2`` image.
-
-#. Verify that there are no KVM processes running on the host:
-
- .. code-block:: console
-
- ps aux | grep kvm
-
-#. Make 5 copies of the Windows image file:
-
- .. code-block:: console
-
- for i in $(seq 5); do \
- cp ws-2012-std.qcow2 ws-2012-std-$i.qcow2; done
-
-#. Create the ``start-vm.sh`` script in the directory with the ``.qcow2``
- files:
-
- .. code-block:: console
-
- #!/bin/bash
- [ -z $1 ] || echo "VM count not provided!"; exit 1
- for i in $(seq $1); do
- echo "Starting VM $i ..."
- kvm -m 1024 -drive file=ws-2012-std-$i.qcow2,if=virtio -net user -net nic,model=virtio -nographic -usbdevice tablet -vnc :$i & done
-
-#. Start ONE instance using the command below (as root) and measure time
- between the instance launch and the moment when the Server Manager window
- displays.
-
- .. code-block:: console
-
- sudo ./start-vm.sh 1
-
- To view the instance desktop, connect with VNC viewer to your host
- to VNC screen :1 (port 5901).
-
-#. Turn off the instance. You may simply kill all KVM processes by running:
-
- .. code-block:: console
-
- sudo killall kvm
-
-#. Start FIVE instances with the command below (as root) and measure time
- interval between ALL instances launch and the moment when the LAST
- Server Manager window displays.
-
- .. code-block:: console
-
- sudo ./start-vm.sh 5
-
- To view VM's desktops, connect with VNC viewer to your
- host to VNC screens :1 thru :5 (ports 5901-5905).
-
-#. Turn off the instances. You may simply kill all KVM processes by running:
-
- .. code-block:: console
-
- sudo killall kvm
-
-Baseline data
--------------
-
-The table below provides the baseline data that was received in our test
-murano environment.
-
-+--------------------------+--------------------------+---------------------+
-| | Boot ONE instance | Boot FIVE instances |
-+==========================+==========================+=====================+
-| Avg. Time | 3m:40s | 8m |
-+--------------------------+--------------------------+---------------------+
-| Max. Time | 5m | 20m |
-+--------------------------+--------------------------+---------------------+
-
-**Avg. Time**
- Refers to the environment with the recommended hardware configuration
-
-**Max. Time**
- Refers to the minimal hardware configuration
-
-Host optimizations
-------------------
-
-You can improve your default KVM installation performance with the following
-optimizations up to 30%:
-
-* Change the default scheduler from **CFQ** to **Deadline**
-* Use **ksm**
-* Use **vhost-net**
diff --git a/doc/source/admin/figures/add-interface.png b/doc/source/admin/figures/add-interface.png
deleted file mode 100644
index df90deb5e..000000000
Binary files a/doc/source/admin/figures/add-interface.png and /dev/null differ
diff --git a/doc/source/admin/figures/deploy-log.png b/doc/source/admin/figures/deploy-log.png
deleted file mode 100644
index be3b2f8ad..000000000
Binary files a/doc/source/admin/figures/deploy-log.png and /dev/null differ
diff --git a/doc/source/admin/figures/network-topology-1.png b/doc/source/admin/figures/network-topology-1.png
deleted file mode 100644
index 6c8081883..000000000
Binary files a/doc/source/admin/figures/network-topology-1.png and /dev/null differ
diff --git a/doc/source/admin/figures/network-topology-2.png b/doc/source/admin/figures/network-topology-2.png
deleted file mode 100644
index f85e86450..000000000
Binary files a/doc/source/admin/figures/network-topology-2.png and /dev/null differ
diff --git a/doc/source/admin/figures/new-inst.png b/doc/source/admin/figures/new-inst.png
deleted file mode 100644
index 7d95fd672..000000000
Binary files a/doc/source/admin/figures/new-inst.png and /dev/null differ
diff --git a/doc/source/admin/index.rst b/doc/source/admin/index.rst
deleted file mode 100644
index e70d163f9..000000000
--- a/doc/source/admin/index.rst
+++ /dev/null
@@ -1,25 +0,0 @@
-.. index:: Murano Administrator Guide
-
-.. _admin-guide:
-
-Deploying Murano
-~~~~~~~~~~~~~~~~
-
-.. toctree::
- :maxdepth: 2
-
- deploy_murano
- prepare_lab
- murano_policies
- manage_packages
- manage_images
- manage_categories
- murano_repository
- murano_agent
- policy_enf
- using_glare.rst
- net_configuration
- configure_cloud_foundry_service_broker
- admin_troubleshooting
- appdev-guide/developer_index
- config-wsgi
diff --git a/doc/source/admin/manage_categories.rst b/doc/source/admin/manage_categories.rst
deleted file mode 100644
index ca80e7dbb..000000000
--- a/doc/source/admin/manage_categories.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-.. _manage-categories:
-
-===================
-Managing categories
-===================
diff --git a/doc/source/admin/manage_images.rst b/doc/source/admin/manage_images.rst
deleted file mode 100644
index fea673b60..000000000
--- a/doc/source/admin/manage_images.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-.. _manage-images:
-
-===============
-Managing images
-===============
-
-Build an image
-~~~~~~~~~~~~~~
-
-Manage images
-~~~~~~~~~~~~~
diff --git a/doc/source/admin/manage_packages.rst b/doc/source/admin/manage_packages.rst
deleted file mode 100644
index c0a056718..000000000
--- a/doc/source/admin/manage_packages.rst
+++ /dev/null
@@ -1,57 +0,0 @@
-.. _manage-packages:
-
-=================
-Managing packages
-=================
-
-Managing packages on engine side
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-To get access to the contents of murano packages, ``murano-engine`` queries
-``murano-api``. However, it is also possible to specify a list of directories
-that may contain packages locally. This option is useful to speed up
-debugging and development of packages and/or to save bandwidth between the API
-and the engine. If local directories are specified, they are examined before
-querying the API.
-
-Local package directories
--------------------------
-
-To define a list of directories where the engine would look for package files,
-set the ``load_packages_from`` option in the ``engine`` section
-of the :file:`murano.conf` configuration file. This option can be set to a
-comma-separated list of directory paths. Whenever an engine needs to access a
-package, it would inspect these directories first, before accessing
-``murano-api``.
-
-API package cache
------------------
-
-If the package was not found in any of the ``load_packages_from`` directories,
-or if none were specified, then ``murano-engine`` queries API for package
-contents.
-Whenever ``murano-engine`` downloads a package from API, it stores and unpacks
-it locally. The engine uses the directory defined in the ``packages_cache``
-option in the ``engine`` section of the :file:`murano.conf`
-configuration file. If it is not used, a temporary directory is created.
-
-The ``enable_packages_cache`` option in the same section defines whether the
-packages would persist on disk or not. When set to ``False``, each package
-downloaded from API is stored in a separate directory, that will be deleted
-after the deployment (or action) is over. This means that every deployment
-or action execution needs to download all the packages it requires,
-regardless of any packages previously downloaded by the engine. When set to
-``True`` (default), the engine shares downloaded packages between deployments
-and action executions. This means that packages persist on disk and have to be
-eventually deleted. Therefore, whenever the engine requires a package and that
-package is not found locally, the engine downloads the package. Afterwards, it
-checks all the previously cached packages with the same FQN and same version.
-If the cached package is not required by any ongoing deployment, it gets
-deleted. Otherwise, it stays on disk until a new version is downloaded.
-
-.. note::
- On UNIX-based operating systems, murano uses ``fcntl`` for IPC locks that
- support both shared and exclusive locking. On Windows, ``msvcrt`` is used.
- It does not support shared file locks. Therefore, enabling package cache
- mechanism under Windows might result in performance decrease, since only
- one process would be able to use one package at the same time.
diff --git a/doc/source/admin/murano_agent.rst b/doc/source/admin/murano_agent.rst
deleted file mode 100644
index 018d2e003..000000000
--- a/doc/source/admin/murano_agent.rst
+++ /dev/null
@@ -1,153 +0,0 @@
-.. _murano-agent:
-
-============
-Murano agent
-============
-
-Murano easily installs and configures necessary software on new virtual
-machines. Murano agent is one of the main participants of these processes.
-
-Usually, it is enough to execute a single script to install a simple
-application. A more complex installation requires a deep script result
-analysis. For example, we have a cross-platform application. The first script
-determines the operation system and the second one calls an appropriate
-installation script. Note, that installation script may be written in different
-languages (the shell for Linux and PowerShell for Windows). Murano agent can
-easily handle this situation and even more complicated ones.
-
-So murano agent operates not with scripts, but with execution plans, which are
-minimum units of the installation workflow.
-
-Murano-agent on a new VM
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-Earlier most of the application deployments were possible only on images with
-pre-installed murano agent. You can refer to
-:ref:`corresponding documentation `
-on building an image with murano-agent.
-
-Currently murano-agent can be automatically installed by cloud-init. To deploy
-an application on an image with pre-installed cloud-init you should mark the
-image with Murano specific metadata. More information about preparing images
-can be found :ref:`here `. This type of installation has some
-limitations. The image has to have pre-installed python. Murano-agent is
-installed from PyPi so the instance should have connectivity with the Internet.
-Also it requires an installation of some python packages, e.g. python3-pip,
-python3-dev, python3-setuptools, python3-virtualenv, which are also installed by
-cloud-init.
-
-Interaction with murano-engine
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-First of all, communication between murano-agent and murano engine should be
-established. The communication is performed through AMQP protocol. This type of
-communication is preferable (for example, compared to SSH) because it is:
-
-* Durable
-
- * To establish the connection, there is no need to wait until the
- instance is spawned. Murano-agent, on its turn, does not need
- to wait for a murano-engine task.
-
- * Messages can be sent to RabbitMQ asynchronously.
-
- * The connection does not depend on network issues. And moreover, there is no
- way to physically connect to the virtual machine if floating IP is not set.
-
- * It is possible to reload the instance and change network parameters during
- the deployment.
-
-* Reliable
-
- If one instance of murano-engine fails in the middle of the deployment,
- another one picks up the messages from the queue and continue the deployment.
-
-Right after application author calls the :command:`deploy` method of the class, inherited from
-*io.murano.resources.Instance*, new murano-agent configuration file starts
-forming in accordance with the values specified in the ``[rabbitmq]`` murano
-configuration file section. A script that runs through cloud-init copies a
-new file to the right place during the instance booting.
-
-
-Execution plans and execution plan templates
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-It was already mentioned that murano-agent recognizes execution plans.
-These instructions contain scripts with all the required parameters
-The application package author provides the execution plan templates together
-with scripts code. During the deployment it is complemented with all required
-parameters (including user-input).
-
-For more information on execution plan templates, refer to
-:ref:`Execution plan template `.
-
-Take a look at the muranoPL code snippet. The``EtcdAddMember`` template expects
-*name* and *ip* parameters. The first line shows that these parameters are
-passed to the template, and the second one shows that the template is sent to
-the agent:
-
-.. code-block:: console
-
- - $template: $resources.yaml('EtcdAddMember.template').bind(dict(
- name => $.instance.name,
- ip => $.getIp()
- ))
- - $clusterConfig: $._cluster.masterNode.instance.agent.call($template, $resources)
-
-Beside the simple agent call, there is a method that enables sending an already
-prepared execution plan (not a template). The main difference between template
-and full execution plan is in the ``files`` section. Prepared execution plan contains
-file contents and name by which they are reachable. So it is not required to
-provide the resources argument:
-
-.. code-block:: console
-
- ..instance.agent.callRaw($plan)
-
-Also, there are ``instance.agent.call($template, $resources)`` and
-``..instance.agent.sendRaw($plan)`` methods which have the same meaning but
-indicate the engine not to wait for the script execution result. The default
-agent call response time (with the corresponding method call) is set in
-murano configuration file and equals to one hour. Take a look at the ``engine``
-section:
-
-.. code-block:: console
-
- [engine]
- # Time for waiting for a response from murano-agent during the
- # deployment (integer value)
- agent_timeout = 3600
-
-.. note:: Murano-agent is able to run different types of scripts,
- such as powershell, python, bash, chef, and puppets. Moreover, it has
- a mechanism for extending supported formats and that is why murano
- agent is called ``unified``
-
-To use puppet a deployment workflow, configure an execution plan as follows:
-
-#. Set correct version of format:
-
- ``FormatVersion >=2.1.0``. Previous formats does not support puppet execution.
-
-#. Use corresponding type
-
- In the script section, script item should have ``Type: Puppet``
-
-#. Provide entry-point class
-
- Use puppet syntax ``EntryPoint: mysql::server``
-
-
-.. note:: You can use scripts directly from git or svn repositories:
-
- .. code-block:: console
-
- Files:
- - mysql: https://github.com/nanliu/puppet-staging.git
-
-A script output is available in the murano-agent log file. This file is located
-on the spawned instance at :file:`/etc/murano/agent.conf` on a Linux-based
-machine, or :file:`C:\\Murano\\Agent\\agent.conf` on a Windows-based machine.
-You can also refer to murano-agent log if there is no connectivity with
-murano-engine (check if RabbitMQ settings are updated) or to track
-deployment execution.
diff --git a/doc/source/admin/murano_policies.rst b/doc/source/admin/murano_policies.rst
deleted file mode 100644
index 6f56cacdd..000000000
--- a/doc/source/admin/murano_policies.rst
+++ /dev/null
@@ -1,115 +0,0 @@
-.. _murano_policies:
-
-===============
-Murano Policies
-===============
-
-Murano only uses 2 roles for policy enforcement. Murano allows access by
-default and uses the admin role for any action that involves accessing
-data across multiple projects in the cloud.
-
-.. glossary::
-
- role:Member
- User is non-admin to all APIs.
-
- role:admin
- User is admin to all APIs.
-
-Sample File Generation
-----------------------
-
-To generate a sample policy.yaml file from the Murano defaults, run the
-oslo policy generation script::
-
- oslopolicy-sample-generator \
- --config-file etc/oslo-policy-generator/murano-policy-generator.conf \
- --output-file policy.yaml.sample
-
-or using tox::
-
- tox -egenpolicy
-
-.. note::
-
- In previous OpenStack releases the default policy format was JSON, but
- now the `recommended format `_
- is YAML.
-..
-
-Merged File Generation
-----------------------
-
-This will output a policy file which includes all registered policy defaults
-and all policies configured with a policy file. This file shows the effective
-policy in use by the project::
-
- oslopolicy-sample-generator \
- --config-file etc/oslo-policy-generator/murano-policy-generator.conf
-
-List Redundant Configurations
------------------------------
-
-This will output a list of matches for policy rules that are defined in a
-configuration file where the rule does not differ from a registered default
-rule. These are rules that can be removed from the policy file with no change
-in effective policy::
-
- oslopolicy-list-redundant \
- --config-file etc/oslo-policy-generator/murano-policy-generator.conf
-
-Policy configuration
---------------------
-
-Like each service in OpenStack, Murano has its own role-based access policies
-that determine who can access objects and under what circumstances. The default
-implementation for these policies is defined in the service's source code --
-under :file:`murano.common.policies`. The default policy definitions can be
-overridden using the :file:`policy.yaml` file.
-
-On each API call the corresponding policy check is performed.
-:file:`policy.yaml` file can be changed without interrupting the API service.
-
-For detailed information on :file:`policy.yaml` syntax, please refer to the
-`OpenStack official documentation `_
-
-With this file you can set who may upload packages and perform other operations.
-
-So, changing ``"upload_package": "rule:default"`` to ``"rule:admin_api"``
-will forbid regular users from uploading packages.
-
-For reference:
-
-- ``"get_package"`` is checked whenever a user accesses a package
- from the catalog. default: anyone
-- ``"upload_package"`` is checked whenever a user uploads a package
- to the catalog. default: anyone
-- ``"modify_package"`` is checked whenever a user modifies a package
- in the catalog. default: anyone
-- ``"publicize_package"`` is checked whenever a user is trying to
- make a murano package public (both when creating a new package or
- modifying an existing one). default: admin users
-- ``"manage_public_package"`` is checked whenever a user attempts to
- modify parameters of a public package. default: admin users
-- ``"delete_package"`` is checked whenever a user attempts to
- delete a package from the catalog. default: anyone
-- ``"download_package"`` is checked whenever a user attempts to
- download a package from the catalog. default: anyone
-- ``"list_environments_all_tenants"`` is checked whenever a request
- to list environments of all tenants is made. default: admin users
-- ``"execute_action"`` is checked whenever a user attempts to execute
- an action on deployment environments. default: anyone
-
-.. note::
-
- The package upload wizard in Murano dashboard consists of several steps:
- The "upload_package" policy is enforced during the first step while
- "modify_package" is enforced during the second step. Package parameters are
- modified during package upload. So, please modify both policy definitions
- together. Otherwise it will not be possible to browse package details on the
- second step of the wizard.
-
-Default Murano Policies
------------------------
-
-.. literalinclude:: ../_static/murano.policy.yaml.sample
diff --git a/doc/source/admin/murano_repository.rst b/doc/source/admin/murano_repository.rst
deleted file mode 100644
index d0367af58..000000000
--- a/doc/source/admin/murano_repository.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-.. _murano-repository:
-
-=================
-Murano repository
-=================
-
-Use an existing repository
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Set up a custom repository
-~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/source/admin/net_configuration.rst b/doc/source/admin/net_configuration.rst
deleted file mode 100644
index d55c2c394..000000000
--- a/doc/source/admin/net_configuration.rst
+++ /dev/null
@@ -1,114 +0,0 @@
-=====================
-Network configuration
-=====================
-
-Murano may work in various networking environments and is capable of detecting
-the current network configuration and choosing appropriate settings
-automatically. However, some additional actions are required to support
-advanced scenarios.
-
-Nova-network support
-^^^^^^^^^^^^^^^^^^^^
-
-Nova-network is the simplest networking solution, which has limited
-capabilities but is available on any OpenStack deployment without the need to
-deploy any additional components.
-
-When a new murano environment is created, murano checks if a dedicated
-networking service, for example, neutron, exists in the current OpenStack
-deployment. It relies on the Identity service catalog for that. If such a
-service is not present, murano automatically falls back to nova-network. No
-further configuration is needed in this case, all the VMs spawned by Murano
-will be joining the same network.
-
-Neutron support
-^^^^^^^^^^^^^^^
-
-If neutron is installed, murano enables its advanced networking features that
-give you the ability to avoid configuring networks for your application.
-
-By default, it creates an isolated network for each environment and joins
-all VMs needed by your application to that network. To install and configure
-the application in a newly spawned virtual machine, murano also requires a
-router to be connected to the external network.
-
-Automatic neutron configuration
-+++++++++++++++++++++++++++++++
-
-To create the router automatically, provide the following parameters in the
-configuration file:
-
-.. code-block:: ini
-
- [networking]
-
- external_network = %EXTERNAL_NETWORK_NAME%
- router_name = %MURANO_ROUTER_NAME%
- create_router = true
-
-To figure out the name of the external network, run
-:command:`openstack network list --external`.
-
-During the first deployment, the required networks and router with a specified
-name will be created and set up.
-
-Manual neutron configuration
-++++++++++++++++++++++++++++
-
-To configure neutron manually, follow the steps below.
-
-#. Create a public network.
-
- #. Log in to the OpenStack dashboard as an administrator.
-
- #. Verify the existence of external networks. For this, navigate to
- :menuselection:`Project > Network > Network Topology`.
-
- #. Check the network type in network details. For this, navigate to
- :menuselection:`Admin > Networks` and see the :guilabel:`Network name`
- section.
- Alternatively, run the :command:`openstack network list --external`
- command using CLI.
-
- #. Create a new external network as described in the `OpenStack documentation `_.
-
- .. image:: figures/network-topology-1.png
- :alt: Network Topology page
- :width: 630 px
-
-#. Create a local network.
-
- #. Navigate to :menuselection:`Project > Network > Networks`.
- #. Click :guilabel:`Create Network` and fill in the form.
-
-
-#. Create a router.
-
- #. Navigate to :menuselection:`Project > Network > Routers`.
- #. Click :guilabel:`Create Router`.
- #. In the :guilabel:`Router Name` field, enter *murano-default-router*.
- If you specify a name other than *murano-default-router*, change the
- following settings in the configuration file:
-
- .. code-block:: ini
-
- [networking]
-
- router_name = %SPECIFIED_NAME%
- create_router = false
-
- #. Click :guilabel:`Create router`.
- #. Click the newly created router name.
- #. In the :guilabel:`Interfaces` tab, click :guilabel:`Add Interface`.
- #. Specify the subnet and IP address.
-
- .. image:: figures/add-interface.png
- :alt: Add Interface dialog
- :width: 630 px
-
- #. Verify the result in
- :menuselection:`Project > Network > Network Topology`.
-
- .. image:: figures/network-topology-2.png
- :alt: Network Topology page
- :width: 630 px
diff --git a/doc/source/admin/policy_enf.rst b/doc/source/admin/policy_enf.rst
deleted file mode 100644
index 4ca030760..000000000
--- a/doc/source/admin/policy_enf.rst
+++ /dev/null
@@ -1,51 +0,0 @@
-.. _policy_enf:
-
-=================================
-Policy enforcement using Congress
-=================================
-
-Policies are defined and evaluated in the Congress_ project.
-The policy language for Congress is Datalog. The congress policy consists
-of the Datalog rules and facts.
-
-Examples of policies are as follows:
-
-* Minimum 2 GB of RAM for all VM instances.
-* A certified version for all Apache server instances.
-* Data placement policy: all database instances must be deployed at a given
- geographic location enforcing some law restriction on data placement.
-
-These policies are evaluated over data in the form of tables (Congress data
-structures). A deployed Murano environment must be decomposed to the Congress
-data structures. The decomposed environment is sent to Congress for simulation.
-Congress simulates whether the resulting state violates any defined
-policy: deployment is aborted in case of policy violation.
-
-Murano uses two predefined policies in Congress:
-
-* ``murano_system`` contains rules and facts of policies defined by the cloud
- administrator.
-* ``murano`` contains only facts/records reflecting the resulting state after
- the deployment of an environment.
-
-Records in the ``murano`` policy are queried by rules from
-the ``murano_system`` policy. The Congress simulation does not create any
-records in the ``murano`` policy, and only provides the feedback on whether
-the resulting state violates the policy or not.
-
-As a part of the policy guided fulfillment, you need to enforce policies
-on a murano environment deployment. If the policy enforcement fails,
-the deployment fails as well.
-
-.. _Congress: https://wiki.openstack.org/wiki/Congress
-
-This section contains the following subsections:
-
-.. toctree::
- :maxdepth: 2
-
- policy_enforcement/policy_enf_setup
- policy_enforcement/policy_enf_rules
- policy_enforcement/policy_enf_dev
- policy_enforcement/policy_enf_modify
-
diff --git a/doc/source/admin/policy_enforcement/policy_enf_dev.rst b/doc/source/admin/policy_enforcement/policy_enf_dev.rst
deleted file mode 100644
index 82fd8fc87..000000000
--- a/doc/source/admin/policy_enforcement/policy_enf_dev.rst
+++ /dev/null
@@ -1,197 +0,0 @@
-.. _policyenf_dev:
-
-Murano policy enforcement internals
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-This section describes internals of the murano policy enforcement
-feature.
-
-Model decomposition
--------------------
-
-The data for the policy validation comes from the models of Murano
-applications. These models are transformed to a set of rules that are
-processed by Congress.
-
-There are several *tables* created in murano policy for different kinds
-of rules that are as follows:
-
-* ``murano:objects(object_id, parent_id, type_name)``
-* ``murano:properties(object_id, property_name, property_value)``
-* ``murano:relationships(source, target, name)``
-* ``murano:connected(source, target)``
-* ``murano:parent_types(object_id, parent_type_name)``
-* ``murano:states(environment_id, state)``
-
-**murano:objects(object_id, parent_id, type_name)**
-
- This rule is used for representation of all objects in Murano model,
- such as environment, application, instance, and other.
-
- Value of the ``type`` property is used as the ``type_name`` parameter:
-
- .. code-block:: yaml
-
- name: wordpress-env
- '?': {type: io.murano.Environment, id: 83bff5ac}
- applications:
- - '?': {id: e7a13d3c, type: com.example.databases.MySql}
-
- The model above transforms to the following rules:
-
- * ``murano:objects+("83bff5ac", "tenant_id", "io.murano.Environment")``
- * ``murano:objects+("83bff5ac", "e7a13d3c", "com.example.databases.MySql")``
-
- .. note::
-
- The owner of the environment is a project (tenant).
-
-**murano:properties(object_id, property_name, property_value)**
-
- Each object may have properties. In this example we have an application
- with one property:
-
- .. code-block:: yaml
-
- applications:
- - '?': {id: e7a13d3c, type: com.example.databases.MySql}
- database: wordpress
-
- The model above transforms to the following rule:
-
- * ``murano:properties+("e7a13d3c", "database", "wordpress")``
-
- Inner properties are also supported using dot notation:
-
- .. code-block:: yaml
-
- instance:
- '?': {id: 825dc61d, type: io.murano.resources.LinuxMuranoInstance}
- networks:
- useFlatNetwork: false
-
- The model above transforms to the following rule:
-
- * ``murano:properties+("825dc61d", "networks.useFlatNetwork", "False")``
-
- If a model contains list of values, it is represented as a set of multiple
- rules:
-
- .. code-block:: yaml
-
- instances:
- - '?': {id: be3c5155, type: io.murano.resources.LinuxMuranoInstance}
- networks:
- customNetworks: [10.0.1.0, 10.0.2.0]
-
- The model above transforms to the following rules:
-
- * ``murano:properties+("be3c5155", "networks.customNetworks", "10.0.1.0")``
- * ``murano:properties+("be3c5155", "networks.customNetworks", "10.0.2.0")``
-
-**murano:relationships(source, target, name)**
-
- Murano application models may contain references to other applications.
- In this example, the WordPress application references MySQL in
- the ``database`` property:
-
- .. code-block:: yaml
-
- applications:
- - '?':
- id: 0aafd67e
- type: com.example.databases.MySql
- - '?':
- id: 50fa68ff
- type: com.example.WordPress
- database: 0aafd67e
-
- The model above transforms to the following rule:
-
- * ``murano:relationships+("50fa68ff", "0aafd67e", "database")``
-
- .. note::
-
- For the ``database`` property we do not create
- the ``murano:properties+`` rule.
-
- If we define an object within other object, they will have relationships
- between them:
-
- .. code-block:: yaml
-
- applications:
- - '?':
- id: 0aafd67e
- type: com.example.databases.MySql
- instance:
- '?': {id: ed8df2b0, type: io.murano.resources.LinuxMuranoInstance}
-
- The model above transforms to the following rule:
-
- * ``murano:relationships+("0aafd67e", "ed8df2b0", "instance")``
-
- There are special relationships of ``services`` from the environment
- to its applications: ``murano:relationships+("env_id", "app_id",
- "services")``
-
-**murano:connected(source, target)**
-
- This table stores both direct and indirect connections between instances.
- It is derived from ``murano:relationships``:
-
- .. code-block:: yaml
-
- applications:
- - '?':
- id: 0aafd67e
- type: com.example.databases.MySql
- instance:
- '?': {id: ed8df2b0, type: io.murano.resources.LinuxMuranoInstance}
- - '?':
- id: 50fa68ff
- type: com.example.WordPress
- database: 0aafd67e
-
- The model above transforms to the following rules:
-
- * ``murano:connected+("50fa68ff", "0aafd67e")`` # WordPress to MySql
- * ``murano:connected+("50fa68ff", "ed8df2b0")`` # WordPress to LinuxMuranoInstance
- * ``murano:connected+("0aafd67e", "ed8df2b0")`` # MySql to LinuxMuranoInstance
-
-**murano:parent_types(object_id, parent_name)**
-
- Each object in murano has a class type. These classes may inherit from one
- or more parents. For example, ``LinuxMuranoInstance > LinuxInstance >
- Instance``:
-
- .. code-block:: yaml
-
- instances:
- - '?': {id: be3c5155, type: LinuxMuranoInstance}
-
- The model above transforms to the following rules:
-
- * ``murano:objects+("...", "be3c5155", "LinuxMuranoInstance")``
- * ``murano:parent_types+("be3c5155", "LinuxMuranoInstance")``
- * ``murano:parent_types+("be3c5155", "LinuxInstance")``
- * ``murano:parent_types+("be3c5155", "Instance")``
-
- .. note::
-
- The type of an object is also repeated in its parent types
- (``LinuxMuranoInstance`` in the example) for easier handling of
- user-created rules.
-
- .. note::
-
- If a type inherits from more than one parent, and these parents inherit
- from one common type, the ``parent_type`` rule is included only once in
- the common type.
-
-**murano:states(environment_id, state)**
-
- Currently only one record for environment is created:
-
- * ``murano:states+("uugi324", "pending")``
-
diff --git a/doc/source/admin/policy_enforcement/policy_enf_modify.rst b/doc/source/admin/policy_enforcement/policy_enf_modify.rst
deleted file mode 100644
index d77073047..000000000
--- a/doc/source/admin/policy_enforcement/policy_enf_modify.rst
+++ /dev/null
@@ -1,101 +0,0 @@
-Using policy for the base modification of an environment
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Congress policies enables a user to define modification of an environment
-prior to its deployment. This includes:
-
-* Adding components, for example, monitoring.
-* Changing and setting properties, for example enforcing a given zone,
- flavors, and others.
-* Configuring relationships within an environment.
-
-Use cases examples:
-
-* Installation of the monitoring agent on each VM instance
- by adding a component with the agent and creating relationship
- between the agent and instance.
-
-* Enabling a certified version to all Apache server instances:
- setting the version property to all Apache applications within
- an environment to a particular version.
-
-These policies are evaluated over data in the form of tables that are Congress
-data structures. A deployed murano environment must be decomposed to Congress
-data structures. The further workflow is as follows:
-
-* The decomposed environment is sent to Congress for simulation.
-
-* Congress simulates whether the resulting state requires modification.
-
-* In case the modification of a deployed environment is required,
- Congress returns a list of actions in the YAML format
- to be performed on the environment prior to the deployment.
-
- For example:
-
- .. code-block:: yaml
-
- set-property: {object_id: c46770dec1db483ca2322914b842e50f, prop_name: keyname, value: production-key}
-
- The example above sets the ``keyname`` property to the ``production-key``
- value on the instance identified by ``object_id``. An administrator can use
- it as an output of the Congress rules.
-
-* The action specification is parsed in murano. The given action class is
- loaded, and the action instance is created.
-
-* The parsed parameters are supplied to the action ``__init__`` method.
-
-* The action is performed on a given environment (the ``modify`` method).
-
-
-.. _base_mod_rules:
-
-Creating base modification rules
---------------------------------
-
-This example illustrates how to configure the rule enforcing all VM instances
-to deploy with a secure key pair. This may be required in a production
-environment.
-
-.. warning::
-
- Before you create rules, configure your OpenStack environment as described
- in :ref:`policyenf_setup`.
-
-**Procedure:**
-
-#. To create the ``predeploy_modify`` rule, run:
-
- .. code-block:: console
-
- congress policy rule create murano_system 'predeploy_modify(eid, obj_id, action):-murano:objects(obj_id, pid, type), murano_env_of_object(obj_id, eid), murano:properties(obj_id, "keyname", kn), concat("set-property: {object_id: ", obj_id, first_part), concat(first_part, ", prop_name: keyname, value: production-key}", action)'
-
- The command above contains the following information:
-
- .. code-block:: console
-
- predeploy_modify(eid, obj_id, action) :-
- murano:objects(obj_id, pid, type),
- murano:objects(eid, tid, "io.murano.Environment"),
- murano:connected(eid, pid),
- murano:properties(obj_id, "keyname", kn),
- concat("set-property: {object_id: ", obj_id, first_part),
- concat(first_part, ", prop_name: keyname, value: production-key}", action)
-
- Policy validation engine checks the ``predeploy_modify`` rule.
- And the Congress engine evaluates the rules referenced inside this rule.
-
- .. note::
-
- The ``production-key`` key pair must already exist, though you can use
- any other existing key pair.
-
-#. Deploy the environment.
-
-Instances within the environment are deployed with the specified key pair.
-
-.. seealso::
-
- * :ref:`policy_enf_rules`
-
diff --git a/doc/source/admin/policy_enforcement/policy_enf_rules.rst b/doc/source/admin/policy_enforcement/policy_enf_rules.rst
deleted file mode 100644
index 491abb6c6..000000000
--- a/doc/source/admin/policy_enforcement/policy_enf_rules.rst
+++ /dev/null
@@ -1,84 +0,0 @@
-.. _policy_enf_rules:
-
-Creating policy enforcement rules
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-This article illustrates how you can create policy enforcement rules.
-For testing purposes, create rules that prohibit the creation
-of instances with the flavor with over 2048 MB of RAM following
-the procedure below.
-
-**Procedure:**
-
-#. Verify that you have configured your OpenStack environment as described
- in :ref:`policyenf_setup`.
-
-#. To create the ``predeploy_errors`` rule, run:
-
- .. code-block:: console
-
- congress policy rule create murano_system "predeploy_errors(eid, obj_id, msg) :- murano:objects(obj_id, pid, type), murano:objects(eid, tid, \"io.murano.Environment\"), murano:connected(eid, pid), murano:properties(obj_id, \"flavor\", flavor_name), flavor_ram(flavor_name, ram), gt(ram, 2048), murano:properties(obj_id, \"name\", obj_name), concat(obj_name, \": instance flavor has RAM size over 2048MB\", msg)"
-
- The command above contains the following information:
-
- .. code-block:: console
-
- predeploy_errors(eid, obj_id, msg) :-
- murano:objects(obj_id, pid, type),
- murano:objects(eid, tid, "io.murano.Environment"),
- murano:connected(eid, pid),
- murano:properties(obj_id, "flavor", flavor_name),
- flavor_ram(flavor_name, ram),
- gt(ram, 2048),
- murano:properties(obj_id, "name", obj_name),
- concat(obj_name, ": instance flavor has RAM size over 2048MB", msg)
-
- Policy validation engine checks the ``predeploy_errors`` rule, and rules
- referenced within this rule are evaluated by the Congress engine.
-
- In this example, we create the rule that references the ``flavor_ram``
- rule we create afterwards. It disables flavors with RAM more than
- 2048 MB and constructs the message returned to the user
- in the ``msg`` variable.
-
- In this example we use data from policy **murano** which is represented by
- ``murano:properties``. There are stored rows with decomposition of model
- representing murano application. We also use built-in functions of Congress:
-
- * ``gt`` stands for 'greater-than'
- * ``concat`` joins two strings into one variable
-
-#. To create the ``flavor_ram`` rule, run:
-
- .. code-block:: console
-
- congress policy rule create murano_system "flavor_ram(flavor_name, ram) :- nova:flavors(id, flavor_name, cpus, ram)"
-
- This rule resolves parameters of flavor by flavor name and returns
- the ``ram`` parameter. It uses the ``flavors`` rule from ``nova`` policy.
- Data in this policy is filled by the ``nova`` datasource driver.
-
-#. Check the rule usage.
-
- #. Create an environment with a simple application:
-
- - Select an application from the murano applications.
- - Create a ``m1.medium`` instance, which uses 4096 MB RAM.
-
- .. image:: ../figures/new-inst.png
- :alt: Create new instance
- :width: 100 %
-
- #. Deploy the environment.
-
-Deployment fails as the rule is violated: environment is in the ``Deploy
-FAILURE`` status. Check the deployment logs for details:
-
-.. image:: ../figures/deploy-log.png
- :alt: Deployment log
- :width: 100 %
-
-
-.. seealso::
-
- * :ref:`base_mod_rules`
diff --git a/doc/source/admin/policy_enforcement/policy_enf_setup.rst b/doc/source/admin/policy_enforcement/policy_enf_setup.rst
deleted file mode 100644
index e07a41738..000000000
--- a/doc/source/admin/policy_enforcement/policy_enf_setup.rst
+++ /dev/null
@@ -1,111 +0,0 @@
-.. _policyenf_setup:
-
-Setting up policy enforcement
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Before you use the policy enforcement feature, configure Murano and Congress
-properly.
-
-.. note::
-
- This article does not cover Murano and Congress configuration options
- useful for Murano application deployment, for example, DNS setup,
- floating IPs, and so on.
-
-**To enable policy enforcement, complete the following tasks:**
-
-#. In Murano:
-
- * Enable the ``enable_model_policy_enforcer`` option
- in the ``murano.conf`` file:
-
- .. code-block:: ini
-
- [engine]
- # Enable model policy enforcer using Congress (boolean value)
- enable_model_policy_enforcer = true
-
- * Restart murano-engine.
-
-#. Verify that Congress is installed and available in your OpenStack
- environment. See the details in the `Congress official documentation
- `_.
-
-#. `Install the congress command-line client
- `_
- as any other OpenStack command-line client.
-
-#. For Congress, configure the following policies that policy enforcement uses
- during the evaluation:
-
- * ``murano`` policy
-
- It is created by the Congress` murano datasource driver, which is a part
- of Congress. Configure it for the OpenStack project (tenant) where you plan to
- deploy your Murano application. Datasource driver retrieves deployed
- Murano environments and populates Congress' murano policy tables.
- See :ref:`policyenf_dev` for details.
-
- Remove the existing ``murano`` policy and create a new ``murano`` policy
- configured for the ``demo`` project, by running:
-
- .. code-block:: console
-
- # remove default murano datasource configuration, because it is using 'admin' project. We need 'demo' project to be used.
- openstack congress datasource delete murano
- openstack congress datasource create murano murano --config username="$OS_USERNAME" --config tenant_name="demo" --config password="$OS_PASSWORD" --config auth_url="$OS_AUTH_URL"
-
- * ``murano_system`` policy
-
- It holds the user-defined rules for policy enforcement. Typically,
- the rules use tables from other policies, for example, murano, nova,
- keystone, and others. Policy enforcement expects the ``predeploy_errors``
- table here that is available on the ``predeploy_errors`` rules creation.
-
- Create the ``murano_system`` rule, by running:
-
- .. code-block:: console
-
- # create murano_system policy
- openstack congress policy create murano_system
-
- # resolves objects within environment
- openstack congress policy rule create murano_system 'murano_env_of_object(oid,eid):-murano:connected(eid,oid), murano:objects(eid,tid,"io.murano.Environment")'
-
- * ``murano_action`` policy with internal management rules.
-
- These rules are used internally in the policy enforcement request
- and stored in a dedicated ``murano_action`` policy that is
- created here. They are important in case an environment is redeployed.
-
- .. code-block:: console
-
- # create murano_action policy
- openstack congress policy create murano_action --kind action
-
- # register action deleteEnv
- openstack congress policy rule create murano_action 'action("deleteEnv")'
-
- # states
- openstack congress policy rule create murano_action 'murano:states-(eid, st) :- deleteEnv(eid), murano:states( eid, st)'
-
- # parent_types
- openstack congress policy rule create murano_action 'murano:parent_types-(tid, type) :- deleteEnv(eid), murano:connected(eid, tid),murano:parent_types(tid,type)'
- openstack congress policy rule create murano_action 'murano:parent_types-(eid, type) :- deleteEnv(eid), murano:parent_types(eid,type)'
-
- # properties
- openstack congress policy rule create murano_action 'murano:properties-(oid, pn, pv) :- deleteEnv(eid), murano:connected(eid, oid), murano:properties(oid, pn, pv)'
- openstack congress policy rule create murano_action 'murano:properties-(eid, pn, pv) :- deleteEnv(eid), murano:properties(eid, pn, pv)'
-
- # objects
- openstack congress policy rule create murano_action 'murano:objects-(oid, pid, ot) :- deleteEnv(eid), murano:connected(eid, oid), murano:objects(oid, pid, ot)'
- openstack congress policy rule create murano_action 'murano:objects-(eid, tnid, ot) :- deleteEnv(eid), murano:objects(eid, tnid, ot)'
-
- # relationships
- openstack congress policy rule create murano_action 'murano:relationships-(sid, tid, rt) :- deleteEnv(eid), murano:connected(eid, sid), murano:relationships( sid, tid, rt)'
- openstack congress policy rule create murano_action 'murano:relationships-(eid, tid, rt) :- deleteEnv(eid), murano:relationships(eid, tid, rt)'
-
- # connected
- openstack congress policy rule create murano_action 'murano:connected-(tid, tid2) :- deleteEnv(eid), murano:connected(eid, tid), murano:connected(tid,tid2)'
- openstack congress policy rule create murano_action 'murano:connected-(eid, tid) :- deleteEnv(eid), murano:connected(eid,tid)'
-
diff --git a/doc/source/admin/prepare_lab.rst b/doc/source/admin/prepare_lab.rst
deleted file mode 100644
index 8dca506ff..000000000
--- a/doc/source/admin/prepare_lab.rst
+++ /dev/null
@@ -1,204 +0,0 @@
-========================
-Prepare a lab for murano
-========================
-This section provides basic information about lab's system requirements.
-It also contains a description of a test which you may use to check if
-your hardware fits the requirements. To do this, run the test and
-compare the results with baseline data provided.
-
-.. _system_prerequisites:
-
-System prerequisites
-~~~~~~~~~~~~~~~~~~~~
-
-Supported operating systems
----------------------------
-
-* Ubuntu Server 16.04 LTS or higher
-* RHEL/CentOS 7.4 or higher
-
-**System packages are required for Murano**
-
-*Ubuntu*
-
-* gcc
-
-* python3-pip
-
-* python3-dev
-
-* libxml2-dev
-
-* libxslt-dev
-
-* libffi-dev
-
-* libpq-dev
-
-* python3-openssl
-
-* mysql-client
-
-Install all the requirements on Ubuntu by running::
-
- sudo apt-get install gcc python3-pip python3-dev \
- libxml2-dev libxslt-dev libffi-dev \
- libpq-dev python3-openssl mysql-client
-
-*CentOS*
-
-* gcc
-
-* python3-pip
-
-* python3-devel
-
-* libxml2-devel
-
-* libxslt-devel
-
-* libffi-devel
-
-* postgresql-devel
-
-* pyOpenSSL
-
-* mysql
-
-Install all the requirements on CentOS by running::
-
- sudo yum install gcc python3-pip python3-devel libxml2-devel \
- libxslt-devel libffi-devel postgresql-devel pyOpenSSL \
- mysql
-
-.. _lab_requirements:
-
-Lab requirements
-----------------
-
-+------------+--------------------------------+-----------------------+
-| Criteria | Minimal | Recommended |
-+============+================================+=======================+
-| CPU | 4 core @ 2.4 GHz | 24 core @ 2.67 GHz |
-+------------+--------------------------------+-----------------------+
-| RAM | 8 GB | 24 GB or more |
-+------------+--------------------------------+-----------------------+
-| HDD | 2 x 500 GB (7200 rpm) | 4 x 500 GB (7200 rpm) |
-+------------+--------------------------------+-----------------------+
-| RAID | Software RAID-1 (use mdadm as | Hardware RAID-10 |
-| | it will improve read | |
-| | performance almost two times) | |
-+------------+--------------------------------+-----------------------+
-
-`Table: Hardware requirements`
-
-There are a few possible storage configurations except the shown above.
-All of them were tested and were working well.
-
-* 1x SSD 500+ GB
-
-* 1x HDD (7200 rpm) 500+ GB and 1x SSD 250+ GB (install the system onto
- the HDD and mount the SSD drive to folder where VM images are)
-
-* 1x HDD (15000 rpm) 500+ GB
-
-
-Test your lab host performance
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-We have measured time required to boot 1 to 5 instances of Windows
-system simultaneously. You can use this data as the baseline to check if
-your system is fast enough.
-
-You should use sysprepped images for this test, to simulate VM first
-boot.
-
-Steps to reproduce test:
-
-#. Prepare Windows 2012 Standard (with GUI) image in QCOW2 format. Let's
- assume that its name is ws-2012-std.qcow2
-
-#. Ensure that there is NO KVM PROCESSES on the host. To do this, run
- command:
-
- .. code-block:: console
-
- ps aux | grep kvm
-
-#. Make 5 copies of Windows image file:
-
- .. code-block:: console
-
- for i in $(seq 5); do \
- cp ws-2012-std.qcow2 ws-2012-std-$i.qcow2; done
-
-#. Create script start-vm.sh in the folder with .qcow2 files:
-
- .. code-block:: console
-
- #!/bin/bash
- [ -z $1 ] || echo "VM count not provided!"; exit 1
- for i in $(seq $1); do
- echo "Starting VM $i ..."
- kvm -m 1024 -drive file=ws-2012-std-$i.qcow2,if=virtio -net user -net nic,model=virtio -nographic -usbdevice tablet -vnc :$i & done
-
-#. Start ONE instance with command below (as root) and measure time
- between VM's launch and the moment when Server Manager window
- appears. To view VM's desktop, connect with VNC viewer to your host
- to VNC screen :1 (port 5901):
-
- .. code-block:: console
-
- sudo ./start-vm.sh 1
-
-#. Turn VM off. You may simply kill all KVM processes by
-
- .. code-block:: console
-
- sudo killall kvm
-
-#. Start FIVE instances with command below (as root) and measure time
- interval between ALL VM's launch and the moment when LAST Server Manager
- window appears. To view VM's desktops, connect with VNC viewer to your
- host to VNC screens :1 thru :5 (ports 5901-5905):
-
- .. code-block:: console
-
- sudo ./start-vm.sh 5
-
-#. Turn VMs off. You may simply kill all KVM processes by
-
- .. code-block:: console
-
- sudo killall kvm
-
-
-Baseline data
-~~~~~~~~~~~~~
-
-The table below provides baseline data which we've got in our
-environment.
-
-+----------------+--------------------------+---------------------+
-| | Boot 1 instance | Boot 5 instances |
-+================+==========================+=====================+
-| Avg. Time | 3m:40s | 8m |
-+----------------+--------------------------+---------------------+
-| Max. Time | 5m | 20m |
-+----------------+--------------------------+---------------------+
-
-``Avg. Time`` refers to the lab with recommended hardware configuration,
-while ``Max. Time`` refers to minimal hardware configuration.
-
-
-Host optimizations
-~~~~~~~~~~~~~~~~~~
-
-Default KVM installation could be improved to provide better
-performance.
-
-The following optimizations may improve host performance up to 30%:
-
-* change default scheduler from ``CFQ`` to ``Deadline``
-* use ``ksm``
-* use ``vhost-net``
diff --git a/doc/source/admin/using_glare.rst b/doc/source/admin/using_glare.rst
deleted file mode 100644
index d7ea93179..000000000
--- a/doc/source/admin/using_glare.rst
+++ /dev/null
@@ -1,132 +0,0 @@
-.. _glare_usage:
-
-=====================================
-Using Glare as a storage for packages
-=====================================
-
-DevStack installation
----------------------
-
-#. Enable Glare service in DevStack
-
- To enable the Glare service in DevStack, edit the ``local.conf`` file:
-
- .. code-block:: console
-
- $ cat local.conf
- [[local|localrc]]
- enable_service g-glare
-
-#. Run DevStack:
-
- .. code-block:: console
-
- $ ./stack.sh
-
- **Result** Glare service is installed with DevStack.
- You can find logs in ``g-glare`` screen session.
-
-#. Install the ``muranoartifact`` plug-in from ``murano/contrib``
-
- .. code-block:: console
-
- $ cd $DEST/murano/contrib/glance/
- $ sudo pip install -e .
-
-#. Restart ``Glare``
-
-#. Set Glare as packages service in murano-engine. For this,
- edit the ``[engine]`` section in the ``murano.conf`` file.
- By default, ``murano.conf`` is located in the ``/etc/murano`` directory
-
- .. code-block:: ini
-
- [engine]
-
- packages_service = glare
-
-#. Restart ``murano-engine``
-
- .. note:: You also can use ``glance`` as a value of the
- ``packages_service`` option for the same behaviour
-
-#. Enable Glare in ``murano-dashboard``. For this, modify the following line
- in the ``_50_murano.py`` file
-
- .. code-block:: python
-
- MURANO_USE_GLARE = True
-
- By default, the ``_50_murano.py`` file is located in
- ``$HORIZON_DIR/openstack_dashboard/local/local_settings.d/``.
-
-#. Restart the ``apache2`` service.
- Now ``murano-dashboard`` will retrieve packages from Glare.
-
-#. Log in to Dashboard and navigate to :menuselection:`Applications > Manage > Packages`
- to view the empty list of packages.
- Alternatively, use the :command:`murano` command.
-
-#. Use ``--murano-packages-service`` option to specify backend,
- used by :command:`murano` command. Set it to ``glare`` for using ``Glare``
-
- .. note:: You also can use ``glance`` as value
- of ``--murano-packages-service`` option or environment variable
- ``MURANO_PACKAGES_SERVICE`` for same behaviour
-
- + View list of packages:
-
- .. code-block:: console
-
- $ . {DEVSTACK_SOURCE_DIR}/openrc admin admin
- $ murano --murano-packages-service=glare package-list
-
- +----+------+-----+--------+--------+-----------+------+---------+
- | ID | Name | FQN | Author | Active | Is Public | Type | Version |
- +----+------+-----+--------+--------+-----------+------+---------+
- +----+------+-----+--------+--------+-----------+------+---------+
-
- + Importing ``Core library``
-
- .. code-block:: console
-
- $ cd $DEST/murano/meta/io.murano/
- $ zip io.murano.zip -r *
- $ murano --murano-packages-service=glare package-import \
- --is-public /opt/stack/murano/meta/io.murano/io.murano.zip
-
- Importing package io.murano
- +--------------------------------------+--------------+-----------+-----------+--------+-----------+---------+---------+
- | ID | Name | FQN | Author | Active | Is Public | Type | Version |
- +--------------------------------------+--------------+-----------+-----------+--------+-----------+---------+---------+
- | 91a9c78f-f23a-4c82-aeda-14c8cbef096a | Core library | io.murano | murano.io | True | | Library | 0.0.0 |
- +--------------------------------------+--------------+-----------+-----------+--------+-----------+---------+---------+
-
-Set up Glare API entrypoint manually
-------------------------------------
-
-If you do not plan to get Glare service from keystone application catalog,
-specify where g-glare service is running.
-
-#. Specify Glare URL in ``murano.conf``.It is http://0.0.0.0:9494 by default
- and can be changed by setting `bind_host` and `bind_port` options in
- the ``glance-glare.conf`` file.
-
- .. code-block:: ini
-
- [glare]
-
- url = http://:
-
-#. Specify Glare URL in the Dashboard settings file, ``_50_murano.py`` :
-
- .. code-block:: python
-
- GLARE_API_URL = 'http://:'
-
-#. Set the ``GLARE_URL`` environment variable for python-muranoclient.
- Alternatively, use the ``--glare-url`` option in CLI.
-
- .. code-block:: console
-
- $ murano --murano-packages-service=glare --glare-url=http://0.0.0.0:9494 package-list
diff --git a/doc/source/cli/index.rst b/doc/source/cli/index.rst
deleted file mode 100644
index 02f244763..000000000
--- a/doc/source/cli/index.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-========================
-Murano CLI Documentation
-========================
-
-In this section you will find information on Murano's command line
-interface.
-
-.. toctree::
- :maxdepth: 1
-
- murano-status
diff --git a/doc/source/cli/murano-status.rst b/doc/source/cli/murano-status.rst
deleted file mode 100644
index 28c2f5ff6..000000000
--- a/doc/source/cli/murano-status.rst
+++ /dev/null
@@ -1,83 +0,0 @@
-=============
-murano-status
-=============
-
-----------------------------------------
-CLI interface for Murano status commands
-----------------------------------------
-
-Synopsis
-========
-
-::
-
- murano-status []
-
-Description
-===========
-
-:program:`murano-status` is a tool that provides routines for checking the
-status of a Murano deployment.
-
-Options
-=======
-
-The standard pattern for executing a :program:`murano-status` command is::
-
- murano-status []
-
-Run without arguments to see a list of available command categories::
-
- murano-status
-
-Categories are:
-
-* ``upgrade``
-
-Detailed descriptions are below:
-
-You can also run with a category argument such as ``upgrade`` to see a list of
-all commands in that category::
-
- murano-status upgrade
-
-These sections describe the available categories and arguments for
-:program:`murano-status`.
-
-Upgrade
-~~~~~~~
-
-.. _murano-status-checks:
-
-``murano-status upgrade check``
- Performs a release-specific readiness check before restarting services with
- new code. For example, missing or changed configuration options,
- incompatible object states, or other conditions that could lead to
- failures while upgrading.
-
- **Return Codes**
-
- .. list-table::
- :widths: 20 80
- :header-rows: 1
-
- * - Return code
- - Description
- * - 0
- - All upgrade readiness checks passed successfully and there is nothing
- to do.
- * - 1
- - At least one check encountered an issue and requires further
- investigation. This is considered a warning but the upgrade may be OK.
- * - 2
- - There was an upgrade status check failure that needs to be
- investigated. This should be considered something that stops an
- upgrade.
- * - 255
- - An unexpected error occurred.
-
- **History of Checks**
-
- **7.0.0 (Stein)**
-
- * Sample check to be filled in with checks as they are added in Stein.
diff --git a/doc/source/conf.py b/doc/source/conf.py
deleted file mode 100644
index 928cd6037..000000000
--- a/doc/source/conf.py
+++ /dev/null
@@ -1,135 +0,0 @@
-# Copyright (C) 2014 Mirantis Inc
-#
-# 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
-
-on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-sys.path.insert(0, os.path.abspath('../../'))
-sys.path.insert(0, os.path.abspath('../'))
-sys.path.insert(0, os.path.abspath('./'))
-
-# -- General configuration -----------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#needs_sphinx = '1.0'
-
-# 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',
- 'sphinx.ext.doctest',
- 'sphinx.ext.todo',
- 'sphinx.ext.coverage',
- 'oslo_config.sphinxconfiggen',
- 'oslo_config.sphinxext',
- 'oslo_policy.sphinxext',
- 'oslo_policy.sphinxpolicygen',
- 'sphinx.ext.viewcode',
- 'sphinxcontrib.httpdomain',]
-
-if not on_rtd:
- extensions.append('openstackdocstheme')
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix of source filenames.
-source_suffix = '.rst'
-
-# The master toctree document.
-master_doc = 'index'
-
-# openstackdocstheme options
-openstackdocs_repo_name = 'openstack/murano'
-openstackdocs_pdf_link = True
-openstackdocs_bug_project = 'murano'
-openstackdocs_bug_tag = ''
-
-config_generator_config_file = '../../etc/oslo-config-generator/murano.conf'
-sample_config_basename = '_static/murano'
-
-policy_generator_config_file = [
- ('../../etc/oslo-policy-generator/murano-policy-generator.conf',
- '_static/murano'),
-]
-
-# Set the default Pygments syntax
-highlight_language = 'python'
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-exclude_patterns = ['specification/murano-repository.rst',
- 'specification/murano-api.rst',
- 'murano_pl/builtin_functions.rst',
- 'install/configure_network.rst',
- 'articles/ad-ui.rst',
- 'articles/telnet.rst']
-
-# If true, sectionauthor and moduleauthor directives will be shown in the
-# output. They are ignored by default.
-show_authors = False
-
-# -- Options for HTML output ---------------------------------------------------
-
-# The theme to use for HTML and HTML Help pages. See the documentation for
-# a list of builtin themes.
-
-if not on_rtd:
- #TODO(efedorova): Change local theme to correspond with the theme on rtd
- pass
-
-# The name for this set of Sphinx documents. If None, it defaults to
-# " v documentation".
-html_title = 'Murano'
-html_theme = 'openstackdocs'
-
-# Custom sidebar templates, maps document names to template names.
-html_sidebars = {
- 'index': ['sidebarlinks.html', 'localtoc.html', 'searchbox.html', 'sourcelink.html'],
- '**': ['localtoc.html', 'relations.html',
- 'searchbox.html', 'sourcelink.html']
-}
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-# html_static_path = ['_static']
-
-# -- Options for LaTeX output -------------------------------------------------
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title, author, documentclass
-# [howto/manual]).
-latex_documents = [
- ('index', 'doc-murano.tex', u'Murano Documentation',
- u'OpenStack Foundation', 'manual'),
-]
-latex_domain_indices = False
-
-latex_elements = {
- 'makeindex': '',
- 'printindex': '',
- 'preamble': r'\setcounter{tocdepth}{3}',
- 'maxlistdepth': '10',
-}
-
-# Disable usage of xindy https://bugzilla.redhat.com/show_bug.cgi?id=1643664
-latex_use_xindy = False
-
-# Disable smartquotes, they don't work in latex
-smartquotes_excludes = {'builders': ['latex']}
diff --git a/doc/source/configuration/config-options.rst b/doc/source/configuration/config-options.rst
deleted file mode 100644
index 8b8a4a278..000000000
--- a/doc/source/configuration/config-options.rst
+++ /dev/null
@@ -1,12 +0,0 @@
-=========================================================
-Configuration options for the Application Catalog service
-=========================================================
-
-The following options can be set in the ``/etc/murano/murano.conf`` config file.
-
-.. only:: html
-
- A :doc:`sample configuration file ` is also available.
-
-.. show-options::
- :config-file: etc/oslo-config-generator/murano.conf
diff --git a/doc/source/configuration/index.rst b/doc/source/configuration/index.rst
deleted file mode 100644
index 9e19dc0bf..000000000
--- a/doc/source/configuration/index.rst
+++ /dev/null
@@ -1,12 +0,0 @@
-===================
-Configuration Guide
-===================
-
-.. only:: html
-
- .. toctree::
- :maxdepth: 1
-
- config-options
- sample_config
- sample_policy
diff --git a/doc/source/configuration/sample_config.rst b/doc/source/configuration/sample_config.rst
deleted file mode 100644
index 94d36f8a0..000000000
--- a/doc/source/configuration/sample_config.rst
+++ /dev/null
@@ -1,14 +0,0 @@
-===========================
-Murano Configuration Sample
-===========================
-
-The following is a sample murano configuration for adaptation and use. It is
-auto-generated from murano when this documentation is built, so if you are
-having issues with an option, please compare your version of murano with the
-version of this documentation.
-
-.. only:: html
-
- The sample configuration can also be downloaded in `file form <../_static/murano.conf.sample>`_.
-
-.. literalinclude:: ../_static/murano.conf.sample
diff --git a/doc/source/configuration/sample_policy.rst b/doc/source/configuration/sample_policy.rst
deleted file mode 100644
index 67df03a15..000000000
--- a/doc/source/configuration/sample_policy.rst
+++ /dev/null
@@ -1,26 +0,0 @@
-====================
-Murano Sample Policy
-====================
-
-.. warning::
-
- JSON formatted policy file is deprecated since Murano 11.0.0 (Wallaby).
- This `oslopolicy-convert-json-to-yaml`__ tool will migrate your existing
- JSON-formatted policy file to YAML in a backward-compatible way.
-
-.. __: https://docs.openstack.org/oslo.policy/latest/cli/oslopolicy-convert-json-to-yaml.html
-
-The following is a sample murano policy file that has been auto-generated
-from default policy values in code. If you're using the default policies, then
-the maintenance of this file is not necessary, and it should not be copied into
-a deployment. Doing so will result in duplicate policy definitions. It is here
-to help explain which policy operations protect specific murano APIs, but it
-is not suggested to copy and paste into a deployment unless you're planning on
-providing a different policy for an operation that is not the default.
-
-If you wish build a policy file, you can also use ``tox -e genpolicy`` to
-generate it.
-
-The sample policy file can also be downloaded in `file form <../_static/murano.policy.yaml.sample>`_.
-
-.. literalinclude:: ../_static/murano.policy.yaml.sample
diff --git a/doc/source/contributor/contributing.rst b/doc/source/contributor/contributing.rst
deleted file mode 100644
index 8110f1020..000000000
--- a/doc/source/contributor/contributing.rst
+++ /dev/null
@@ -1,47 +0,0 @@
-============================
-So You Want to Contribute...
-============================
-For general information on contributing to OpenStack, please check out the
-`contributor guide `_ to get started.
-It covers all the basics that are common to all OpenStack projects: the accounts
-you need, the basics of interacting with our Gerrit review system, how we
-communicate as a community, etc.
-Below will cover the more project specific information you need to get started
-with Murano.
-
-Communication
-~~~~~~~~~~~~~
-* IRC channel #murano at OFTC
-* Mailing list (prefix subjects with ``[murano]`` for faster responses)
- http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss
-
-Contacting the Core Team
-~~~~~~~~~~~~~~~~~~~~~~~~
-Please refer the `murano Core Team
-`_ contacts.
-
-New Feature Planning
-~~~~~~~~~~~~~~~~~~~~
-murano features are tracked on `Launchpad `_.
-
-Task Tracking
-~~~~~~~~~~~~~
-We track our tasks in `Launchpad `_.
-If you're looking for some smaller, easier work item to pick up and get started
-on, search for the 'low-hanging-fruit' tag.
-
-Reporting a Bug
-~~~~~~~~~~~~~~~
-You found an issue and want to make sure we are aware of it? You can do so on
-`Launchpad `_.
-
-Getting Your Patch Merged
-~~~~~~~~~~~~~~~~~~~~~~~~~
-All changes proposed to the murano project require one or two +2 votes
-from murano core reviewers before one of the core reviewers can approve
-patch by giving ``Workflow +1`` vote.
-
-Project Team Lead Duties
-~~~~~~~~~~~~~~~~~~~~~~~~
-All common PTL duties are enumerated in the `PTL guide
-`_.
diff --git a/doc/source/contributor/contributor_index.rst b/doc/source/contributor/contributor_index.rst
deleted file mode 100644
index fe11ede3b..000000000
--- a/doc/source/contributor/contributor_index.rst
+++ /dev/null
@@ -1,17 +0,0 @@
-.. index:: Murano Contributor Guide
-
-.. _contributor-guide:
-
-Contributor Guide
-~~~~~~~~~~~~~~~~~
-
-.. toctree::
- :maxdepth: 2
-
- how_to_contribute
- dev_guidelines
- plugins
- dev_env
- testing
- doc_guidelines
- stable_branches
\ No newline at end of file
diff --git a/doc/source/contributor/dev_env.rst b/doc/source/contributor/dev_env.rst
deleted file mode 100644
index 8ac49d4e4..000000000
--- a/doc/source/contributor/dev_env.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-.. _dev-env:
-
-=======================
-Development environment
-=======================
diff --git a/doc/source/contributor/dev_guidelines.rst b/doc/source/contributor/dev_guidelines.rst
deleted file mode 100644
index ea9d3fc0b..000000000
--- a/doc/source/contributor/dev_guidelines.rst
+++ /dev/null
@@ -1,43 +0,0 @@
-.. _dev-guidelines:
-
-======================
-Development guidelines
-======================
-
-Conventions
-~~~~~~~~~~~
-
-High-level overview of Murano components
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Coding guidelines
-~~~~~~~~~~~~~~~~~
-
-There are several significant rules for the Murano developer:
-
-* Follow PEP8 and OpenStack style guidelines.
-
-* Do not import functions. Only module imports are accepted.
-
-* Make commits as small as possible. It speeds up review of the change.
-
-* Six library usage rule: use it only when really necessary (for example if
- existing code will not work in python 3 at all).
-
-* Mark application name in the 1st line of commit message for murano-apps
- repository, i.e. [Apache] or [Kubernetes].
-
-* Prefer code readability over performance unless the situations when
- performance penalty can be proven to be big.
-
-* Write Py3-compatible code. If that's impossible leave comment.
-
-Rules for MuranoPL coding style:
-
-* Use camelCase for MuranoPL functions/namespaces/variables/properties,
- PascalCase for class names.
-
-* Consider using ``$this`` instead of ``$`` where appropriate.
-
-Debug tips
-~~~~~~~~~~
diff --git a/doc/source/contributor/doc_guidelines.rst b/doc/source/contributor/doc_guidelines.rst
deleted file mode 100644
index 54f7715a8..000000000
--- a/doc/source/contributor/doc_guidelines.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-.. _doc-guidelines:
-
-========================
-Documentation guidelines
-========================
diff --git a/doc/source/contributor/how_to_contribute.rst b/doc/source/contributor/how_to_contribute.rst
deleted file mode 100644
index 2c23415fe..000000000
--- a/doc/source/contributor/how_to_contribute.rst
+++ /dev/null
@@ -1,13 +0,0 @@
-.. _how_to_contribute:
-
-=================
-How to contribute
-=================
-
-.. TODO add a brief intro:
- - Intended audience.
- - How to start developing?
- - How a new-comer can contribute?
- - Communication channels
- - Useful links for an OpenStack contributor
- - consider the context of https://docs.openstack.org/sahara/latest/contributor/how-to-participate.html
diff --git a/doc/source/contributor/plugins.rst b/doc/source/contributor/plugins.rst
deleted file mode 100644
index 5c1deff04..000000000
--- a/doc/source/contributor/plugins.rst
+++ /dev/null
@@ -1,19 +0,0 @@
-.. _plugins:
-
-===============
-Murano plug-ins
-===============
-
-Murano plug-ins help to extend the capability of murano.
-There are two types of murano plug-ins which serve different purposes:
-
-* Extend murano Core Library by implementing additional functionality.
-* Add new package type classes.
-
-This section contains the following topics:
-
-.. toctree::
- :maxdepth: 2
-
- plugins/murano_plugins
- plugins/manage_plugins
\ No newline at end of file
diff --git a/doc/source/contributor/plugins/manage_plugins.rst b/doc/source/contributor/plugins/manage_plugins.rst
deleted file mode 100644
index 550ea0884..000000000
--- a/doc/source/contributor/plugins/manage_plugins.rst
+++ /dev/null
@@ -1,105 +0,0 @@
-.. _manage_plugins:
-
-Creating a Murano plug-in
--------------------------
-
-Murano plug-in is a setuptools-compliant python package with ``setup.py`` and
-all other necessary files. For more information about defining stevedore
-plug-ins, see `stevedore documentation
-`_.
-
-The structure of the demo application package
-+++++++++++++++++++++++++++++++++++++++++++++
-
-The package must meet the following requirements:
-
-* It must be a ZIP archive.
-* The root folder of the archive must contain a ``manifest.yaml`` file.
-* The manifest must be a valid YAML file representing key-value associative
- array.
-* The manifest should contain a *Format* key, that is, a format identifier. If
- it is not present, "MuranoPL/1.0" is used.
-
-Murano uses the *Format* attribute of the manifest file to find an appropriate
-plug-in for a particular package type. All interactions between the rest of
-Murano and package file contents are done through the plug-in interface alone.
-
-Because Murano never directly accesses files inside the packages, it is
-possible for plug-ins to dynamically generate MuranoPL classes on the fly.
-Those classes will be served as adapters between Murano and third-party systems
-responsible for deployment of particular package types. Thus, for Murano all
-packages remain to be of MuranoPL type though some of them are "virtual".
-
-The format identifier has the following format: ``Name/Version``.
-For example, ``Heat.HOT/1.0``. If name is not present, it is assumed to be
-``MuranoPL`` (thus ``1.0`` becomes ``MuranoPL/1.0``). Version strings are in
-SemVer three-component format (major.minor.patch). Missing version components
-are assumed to be zero (thus 1.0 becomes 1.0.0).
-
-Installing a plug-in
---------------------
-
-To use a plug-in, install it on murano nodes in the same Python environment
-with murano engine service.
-
-To install a plug-in:
-
-#. Execute the plug-in setup script.
-
- Alternatively, use a package deployment tool, such as pip:
-
- .. code-block:: console
-
- cd plugin_dir
- pip install .
-
-#. Restart murano engine. After that, it will be possible to upload and deploy
- the applications that use the capabilities that a plug-in provides.
-
-Plug-in versioning
-------------------
-
-Plug-ins located in Murano repository have the same version as Murano.
-Therefore, to use a specific version of such plug-in, checkout to this version.
-Then specify the version of plug-in classes in your application's manifest file
-as usual:
-
- .. code-block:: yaml
-
- Require:
- murano.plugins.example: 2.0.0
-
-It should be standard SemVer format version string consisting of three parts:
-Major.Minor.Patch. For more information about versioning, refer to
-:ref:`versioning`.
-
-.. note::
- Enable Glare to use versioning.
-
-Organization
-------------
-
-Documentation
-+++++++++++++
-
-Documentation helps users understand what your plug-in does. For plug-ins
-located in the Murano repository, create a ``README.rst`` file in the main
-folder of the plug-in. The ``README.rst`` file may contain information about
-the plug-in and an installation guide.
-
-Code
-++++
-
-The code of your plug-in may be located in the following repositories:
-
-* Murano repository. In this case, the plug-in should be located in the
- ``murano/contrib/plugins`` folder.
-
-* A separate repository. In this case, create your own project.
-
-Bugs
-++++
-
-All bugs for specific plug-ins are reported in their projects. Bugs related
-to plug-ins located in Murano repository should be reported in the `Murano
-`_ project.
diff --git a/doc/source/contributor/plugins/murano_plugins.rst b/doc/source/contributor/plugins/murano_plugins.rst
deleted file mode 100644
index 36fca354e..000000000
--- a/doc/source/contributor/plugins/murano_plugins.rst
+++ /dev/null
@@ -1,243 +0,0 @@
-.. _muranopl_extensions:
-
-MuranoPL extension plug-ins
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Murano plug-ins allow extending MuranoPL with new classes. Therefore, using
-such plug-ins applications with MuranoPL format, you access some additional
-functionality defined in a plug-in. For example, the Magnum plug-in, which
-allows murano to deploy applications such as Kubernetes using the capabilities
-of the Magnum client.
-
-MuranoPL extension plug-ins can be used for the following purposes:
-
-* Providing interaction with external services.
-
- For example, you want to interact with the OpenStack Image service to get
- information about images suitable for deployment. A plug-in may request image
- data from glance during deployment, performing any necessary checks.
-
-* Enabling connections between murano applications and external hardware
-
- For example, you have an external load balancer located on a powerful
- hardware and you want your applications launched in OpenStack to use that
- load balancer. You can write a plug-in that interacts with the load balancer
- API. Once done, add new apps to the pool of your load balancer or make any
- other configurations from within your application definition.
-
-* Extending Core Library class functionality, which is responsible for creating
- networks, interaction with murano-agent, and others
-
- For example, you want to create networks with special parameters for all of
- your applications. You can just copy the class that is responsible for
- network management from the Murano Core library, make the desired
- modification, and load the new class as a plug-in. Both classes will be
- available, and it is up to you to decide which way to create your networks.
-
-* Optimization of frequently used operations. Plug-in classes are written in
- Python, therefore, the opportunity for improvement is significant.
-
- Murano provides a number of optimization opportunities depending on the
- improvement needs. For example, classes in the Murano Core Library can be
- rewritten in C and used from Python code to improve their performance in
- particular use cases.
-
-.. _package_type_plugins:
-
-MuranoPL package type plug-ins
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The only package type natively supported by Murano is MuranoPL. However, it is
-possible to extend Murano with support for other formats of application
-definitions. TOSCA CSARs and HOT templates are the two examples of alternate
-ways to define applications.
-
-Package types plug-ins are normal Python packages that can be distributed
-through PyPI and installed using :command:`pip` or its alternatives. It is
-important that the plug-in be installed to the same Python instance that is
-used to run Murano API and Murano Engine. For multi-node Murano deployments,
-plug-ins need to be installed on each node.
-
-To associate a plug-in with a particular package format, it needs to have a
-special record in `[entry_points]` section of setup.cfg file:
-
-.. code-block:: ini
-
- io.murano.plugins.packages =
- Name/Version = namespace:Class
-
-For example:
-
-.. code-block:: ini
-
- [entry_points]
- io.murano.plugins.packages =
- Cloudify.TOSCA/1.0 = murano_cloudify_plugin.cloudify_tosca_package:CloudifyToscaPackage
-
-
-This declaration maps particular pair of format-name/version to Python class
-that implements Package API interface for the package type. It is possible
-to specify several different format names or versions and map them to single
-or different Python classes. For example, it is possible to specify
-
-.. code-block:: ini
-
- [entry_points]
- io.murano.plugins.packages =
- Cloudify.TOSCA/1.0 = murano_cloudify_plugin.cloudify_tosca_package:CloudifyToscaPackage
- Cloudify.TOSCA/1.1 = murano_cloudify_plugin.cloudify_tosca_package:CloudifyToscaPackage
- Cloudify.TOSCA/2.0 = murano_cloudify_plugin.cloudify_tosca_package:CloudifyToscaPackage_v2
-
-.. note::
-
- A single Python plug-in package may contain several Murano plug-ins
- including of different types. For example, it is possible to combine
- MuranoPL extension and package type plug-ins into a single package.
-
-
-Tooling for package preparation
--------------------------------
-
-Some package formats may require additional tooling to prepare package ZIP
-archive of desired structure. In such cases it is expected that those tools
-will be provided by plug-in authors either as part of the same Python package
-(by exposing additional shell entry points) or as a separate package or
-distribution.
-
-The only two exceptions to this rule are native MuranoPL packages and HOT
-packages that are built into Murano (there is no need to install additional
-plug-ins for them). Tooling for those two formats is a part of
-python-muranoclient.
-
-
-Package API interface reference
--------------------------------
-
-Plug-ins expose API for the rest of Murano to interact with the package
-by implementing `murano.packages.package.Package` interface.
-
-
-Class initializer:
-
- `def __init__(self, format_name, runtime_version, source_directory, manifest):`
-
-
- * **format_name**: name part of the format identifier (string)
- * **runtime_version**: version part of the format identifier (instance of
- semantic_version.Version)
- * **source_directory**: path to the directory where package content was
- extracted (string)
- * **manifest**: contents of the manifest file (string->string dictionary)
-
- **Note**: implementations must call base class (`Package`) initializer
- passing the first three of these arguments.
-
-Abstract properties that must be implemented by the plug-in:
-
- `def full_name(self):`
-
- * Fully qualified name of the package. Must be unique within package
- scope of visibility (string)
-
- `def version(self):`
-
- * Package version (not to confuse with format version!). An instance of
- `semantic_version.Version`
-
- `def classes(self):`
-
- * List (or tuple) of MuranoPL class names (FQNs) that package contains
-
- `def requirements(self):`
-
- * Dictionary of requirements (dependencies on other packages) in a form
- of key-value mapping from required package FQN string to SemVer
- version range specifier (instance of semantic_version.Spec or string
- representation supported by Murano versioning scheme)
-
- `def package_type(self):`
-
- * Package type: "Application" or "Library"
-
- `def display_name(self):`
-
- * Human-readable name of the package as presented to the user (string)
-
- `def description(self):`
-
- * Package description (string or None)
-
- `def author(self):`
-
- * Package author (string or None)
-
- `def supplier(self):`
-
- * Package supplier (string or None)
-
- `def tags(self):`
-
- * List or tags for the package (list of strings)
-
- `def logo(self):`
-
- * Package (application) logo file content (str or None)
-
- `def supplier_logo(self):`
-
- * Package (application) supplier logo file content (str or None)
-
- `def ui(self):`
-
- * YAML-encoded string containing application's form definition (string or
- None)
-
-Abstract methods that must be implemented by the plug-in:
-
- `def get_class(self, name):`
-
- * Returns string containing MuranoPL code (YAML-encoded string) for the
- class whose fully qualified name is in "name" parameter (string)
-
- `def get_resource(self, name):`
-
- * Returns path for resource file whose name is in "name" parameter (string)
-
-
-Properties that can be overridden in the plug-in:
-
- `def format_name(self):`
-
- * Canonical format name for the plug-in. Usually the same value that was
- passed to class initializer
-
-
- `def runtime_version(self):`
-
- * Format version. Usually the same value that was passed to class
- initializer (semantic_version.Version)
-
- `def blob(self):`
-
- * Package file (.zip) content (str)
-
-
-PackageBase class
------------------
-
-Usually, there is no need to manually implement all the methods and properties
-described. There is a `murano.packages.package.PackageBase` class that provides
-typical implementation of most of required properties by obtaining
-corresponding value from manifest file.
-
-When inheriting from PackageBase class, plug-in remains responsible for
-implementation of:
-
-* `ui` property
-* `classes` property
-* `get_class` method
-
-This allows plug-in developers to concentrate on dynamic aspects of the package
-type plug-in while keeping all static aspects (descriptions, logos and so on)
-consistent across all package types (at least those who inherit from
-`PackageBase`).
\ No newline at end of file
diff --git a/doc/source/contributor/stable_branches.rst b/doc/source/contributor/stable_branches.rst
deleted file mode 100644
index 7577d5ee1..000000000
--- a/doc/source/contributor/stable_branches.rst
+++ /dev/null
@@ -1,63 +0,0 @@
-.. _stable_branches:
-
-==============================
-Backporting to stable/branches
-==============================
-
-Since murano is a big-tent OS project it largely follows the
-`OpenStack stable branch guide `_
-
-Upstream support phases
-~~~~~~~~~~~~~~~~~~~~~~~
-
-#. Phase I (first 6 months): All bugfixes (which meet the stable port criteria,
- described in OS stable branch policy) are appropriate
-#. Phase II (6-12 months): Only critical bugfixes and
- security patches are acceptable
-#. Phase III (more than 12 months): Only security
- patches are acceptable
-
-In order to accept a change into $release it must first be accepted into all
-releases back to master.
-
-There are two notable exceptions to the support phases rule:
-
-- murano-apps repository:
- We recognise, that murano apps have different lifecycle than main murano
- repository. Most of the time new apps are being written for already released
- versions of murano, not for master. Having a rich collection of apps is one of
- the goals of murano-apps repository, therefore we accept backports of apps and
- app features to previous release branches. This is done on a case by case basis
- and should be discussed with PTL and Murano core members on IRC or Mailing
- List. However we believe, that submitting an app to stable branch only means
- that author of the patch is not going to support the app. Therefore for the app
- to get backported it still has to be first accepted to master and all
- subsequent releases.
-
-- murano core library patches: Murano Core Library is an
- app, that provides core functionality and classes for other murano apps. It
- shares a lot of properties of regular murano apps and the rationale behind
- allowing backports of MuranoPL code from master to stable branches is basically
- the same: low regression risks during upgrades, high adoption impact. However
- since core library is much more sensitive app, backports to it should be taken
- more seriously and should be discussed on IRC and Mailing List and receive
- PTL's approval.
-
-These two exceptions do not mean, that we're free to backport
-any code from master to stable branches. Instead they show, that murano team
-recognises the importance of these two areas of murano project and treats
-exceptions to those slightly more liberally than to other parts of murano
-project.
-
-Bug nomination process
-~~~~~~~~~~~~~~~~~~~~~~
-
-Whenever you file a bug, or see a bug, that you think
-is eligible for backporting in stable branch nominate it for the corresponding
-series. If bug reporter does not nominate the bug for eligible branch — this is
-done by murano bug supervisor during triaging/confirmation process. In case it
-is not clear whether the bug is eligible or not or if you do not have
-permissions to nominate a bug for series you can set
-`$release-backport-potential` tag (for example `liberty-backport-potential`).
-Murano team is holding bi-weekly meetings on IRC (as part of regular community
-meetings) to triage and nominate bugs for stable backports.
diff --git a/doc/source/contributor/testing.rst b/doc/source/contributor/testing.rst
deleted file mode 100644
index adc82211c..000000000
--- a/doc/source/contributor/testing.rst
+++ /dev/null
@@ -1,25 +0,0 @@
-.. _testing:
-
-=======
-Testing
-=======
-
-Testing guidelines
-~~~~~~~~~~~~~~~~~~
-
-Continuous Integration service
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-UI testing
-~~~~~~~~~~
-
-Tempest tests
-~~~~~~~~~~~~~
-
-Automated testing machinery
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-CI design
----------
-CI jobs
--------
diff --git a/doc/source/first-app/Before_the_start.rst b/doc/source/first-app/Before_the_start.rst
deleted file mode 100644
index a4ea4a0fa..000000000
--- a/doc/source/first-app/Before_the_start.rst
+++ /dev/null
@@ -1,9 +0,0 @@
-================
-Before the start
-================
-
-What you need
--------------
-
-Deploy Murano
--------------
diff --git a/doc/source/first-app/Debugging_and_troubleshooting_your_murano_app.rst b/doc/source/first-app/Debugging_and_troubleshooting_your_murano_app.rst
deleted file mode 100644
index 5e995ece5..000000000
--- a/doc/source/first-app/Debugging_and_troubleshooting_your_murano_app.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-=============================================
-Debugging and troubleshooting your Murano app
-=============================================
diff --git a/doc/source/first-app/Develop_murano_app_for_plone.rst b/doc/source/first-app/Develop_murano_app_for_plone.rst
deleted file mode 100644
index 8302e9b92..000000000
--- a/doc/source/first-app/Develop_murano_app_for_plone.rst
+++ /dev/null
@@ -1,48 +0,0 @@
-============================
-Develop Murano app for Plone
-============================
-
-Develop standalone Plone Murano app (single VM)
------------------------------------------------
-
-Plone server requirements
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Define host VM requirements
-...........................
-
-Host VM operatting system requirements
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Host VM hardware resources requirements
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Define preinstalled software and libraries requirements
-.......................................................
-
-Define what the PloneServerApp should do
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Create and debug sh-script that fully deploys the Plone server on a single VM
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Create Murano package for your app
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Upload and deploy your Murano app to OpenStack cloud
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Develop cluster Plone Murano app (multi VM)
--------------------------------------------
-
-Develop basic server-client Murano app
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Add load-balancing to the Plone cluster
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Add scalability to the Plone cluster
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Add self-healing to the Plone cluster
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/source/first-app/Publish_your_murano_app_in_the_application_catalog.rst b/doc/source/first-app/Publish_your_murano_app_in_the_application_catalog.rst
deleted file mode 100644
index 1d9baec14..000000000
--- a/doc/source/first-app/Publish_your_murano_app_in_the_application_catalog.rst
+++ /dev/null
@@ -1,15 +0,0 @@
-==================================================
-Publish your Murano app in the application catalog
-==================================================
-
-Join the OpenStack community
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Prepare testing environment
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Contribute your code to Murano-apps
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Contribute your code to App-catalog
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/source/first-app/README.rst b/doc/source/first-app/README.rst
deleted file mode 100644
index 88ec6d6fb..000000000
--- a/doc/source/first-app/README.rst
+++ /dev/null
@@ -1,33 +0,0 @@
-This directory contains the "My first Murano App getting started guide"
-tutorial.
-
-The tutorials work with an application that can be found in the
-`openstack/murano-apps `_
-repository.
-
-Prerequisites
--------------
-
-To build the documentation, you must install the Graphviz package.
-
-/source
-~~~~~~~
-
-The :code:`/source` directory contains the tutorial documentation as
-`reStructuredText `_ (RST).
-
-To build the documentation, you must install `Sphinx `_ and the
-`OpenStack docs.openstack.org Sphinx theme (openstackdocstheme) `_. When
-you invoke tox, these dependencies are automatically pulled in from the
-top-level :code:`test-requirements.txt`.
-
-You must also install `Graphviz `_ on your build system.
-
-The document is build as part of the docs build, for example using::
-
- tox -e docs
-
-/samples
-~~~~~~~~
-
-The code samples in this guide are located in this directory.
diff --git a/doc/source/first-app/What_is_the_use_case.rst b/doc/source/first-app/What_is_the_use_case.rst
deleted file mode 100644
index 78c9527ed..000000000
--- a/doc/source/first-app/What_is_the_use_case.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-====================
-What is the use case
-====================
diff --git a/doc/source/first-app/What_you_will_learn.rst b/doc/source/first-app/What_you_will_learn.rst
deleted file mode 100644
index 38ef961a4..000000000
--- a/doc/source/first-app/What_you_will_learn.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-===================
-What you will learn
-===================
diff --git a/doc/source/first-app/Who_is_this_guide_for.rst b/doc/source/first-app/Who_is_this_guide_for.rst
deleted file mode 100644
index a29a7602c..000000000
--- a/doc/source/first-app/Who_is_this_guide_for.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-=====================
-Who is this guide for
-=====================
diff --git a/doc/source/first-app/index.rst b/doc/source/first-app/index.rst
deleted file mode 100644
index bcf505fb6..000000000
--- a/doc/source/first-app/index.rst
+++ /dev/null
@@ -1,19 +0,0 @@
-=========================================
-My first Murano App getting started guide
-=========================================
-
-.. include:: README.rst
-
-Contents
-~~~~~~~~
-
-.. toctree::
- :maxdepth: 3
-
- Who_is_this_guide_for
- What_is_the_use_case
- What_you_will_learn
- Before_the_start
- Develop_murano_app_for_plone
- Debugging_and_troubleshooting_your_murano_app
- Publish_your_murano_app_in_the_application_catalog
diff --git a/doc/source/index.rst b/doc/source/index.rst
deleted file mode 100644
index ea967bfc0..000000000
--- a/doc/source/index.rst
+++ /dev/null
@@ -1,129 +0,0 @@
-===============================
-Welcome to Murano Documentation
-===============================
-
-**Murano** is an open source OpenStack project that combines an application
-catalog with versatile tooling to simplify and accelerate packaging and
-deployment. It can be used with almost any application and service in
-OpenStack.
-
-Murano project consists of several source code repositories:
-
-* `murano`_ -- the main repository. It contains code for Murano API server,
- Murano engine and MuranoPL.
-* `murano-agent`_ -- the agent that runs on guest VMs and executes the
- deployment plan.
-* `murano-dashboard`_ -- Murano UI implemented as a plugin for the OpenStack
- Dashboard.
-* `python-muranoclient`_ -- Client library and CLI client for Murano.
-
-.. note::
- `Administrator Documentation`, `Contributor Documentation`, and `Appendix`
- are under development at the moment.
-
-.. Links
-
-.. _murano: https://opendev.org/openstack/murano/
-.. _murano-agent: https://opendev.org/openstack/murano-agent/
-.. _murano-dashboard: https://opendev.org/openstack/murano-dashboard/
-.. _python-muranoclient: https://opendev.org/openstack/python-muranoclient/
-
-
-Introduction to Murano
-~~~~~~~~~~~~~~~~~~~~~~
-
-.. toctree::
- :maxdepth: 1
-
- reference/overview_index
-
-
-Using Murano
-~~~~~~~~~~~~
-
-Learn how to use the Application Catalog directly from the Dashboard and
-through the command-line interface (CLI), manage applications and environments.
-The screenshots provided in this guide are of the Liberty release.
-
-.. toctree::
- :maxdepth: 1
-
- user/quickstart/quickstart
- user/user_index
-
-Installation
-~~~~~~~~~~~~
-
-.. toctree::
- :maxdepth: 2
-
- install/index
-
-Configuration
-~~~~~~~~~~~~~
-
-.. toctree::
- :maxdepth: 2
-
- configuration/index
-
-CLI Guide
-~~~~~~~~~
-
-.. toctree::
- :maxdepth: 2
-
- cli/index
-
-Administrator Documentation
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Learn how to manage images, categories, and repositories using the Murano
-client.
-
-.. toctree::
- :maxdepth: 1
-
- admin/index
-
-First App Guide
-~~~~~~~~~~~~~~~
-
-A guide for developing your first Murano application.
-
-.. toctree::
- :maxdepth: 1
-
- first-app/index
-
-Application Developer Documentation
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Learn how to compose an application package and get it ready for uploading to
-Murano.
-
-.. toctree::
- :maxdepth: 1
-
- admin/appdev-guide/developer_index
- admin/appdev-guide/faq
-
-Contributor Documentation
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-* If you are a new contributor to Murano please refer: :doc:`contributor/contributing`
-
-.. toctree::
- :maxdepth: 1
-
- contributor/contributing
- contributor/contributor_index
-
-Other Documentation
-~~~~~~~~~~~~~~~~~~~
-
-.. toctree::
- :maxdepth: 1
-
- reference/appendix/appendix_index
- reference/appendix/articles/articles_index
diff --git a/doc/source/install/common_prerequisites.rst b/doc/source/install/common_prerequisites.rst
deleted file mode 100644
index 76792354a..000000000
--- a/doc/source/install/common_prerequisites.rst
+++ /dev/null
@@ -1,98 +0,0 @@
-Prerequisites
--------------
-
-Before you install and configure the Application Catalog service,
-you must create a database, service credentials, and API endpoints.
-
-#. To create the database, complete these steps:
-
- Murano can use various database types on the back end. For development
- purposes, SQLite is enough in most cases. For production installations, you
- should use MySQL or PostgreSQL databases.
-
- .. warning::
-
- Although murano could use a PostgreSQL database on the back end,
- it wasn't thoroughly tested and should be used with caution.
- ..
-
-
- * Use the database access client to connect to the database
- server as the ``root`` user:
-
- .. code-block:: console
-
- $ mysql -u root -p
- ..
-
- * Create the ``murano`` database:
-
- .. code-block:: mysql
-
- CREATE DATABASE murano;
- ..
-
- * Grant proper access to the ``murano`` database:
-
- .. code-block:: mysql
-
- GRANT ALL PRIVILEGES ON murano.* TO 'murano'@'localhost' IDENTIFIED BY 'MURANO_DBPASS';
- ..
-
- Replace ``MURANO_DBPASS`` with a suitable password.
-
- * Exit the database access client.
-
- .. code-block:: mysql
-
- exit;
- ..
-
-#. Source the ``admin`` credentials to gain access to
- admin-only CLI commands:
-
- .. code-block:: console
-
- $ . admin-openrc
- ..
-
-#. To create the service credentials, complete these steps:
-
- * Create the ``murano`` user:
-
- .. code-block:: console
-
- $ openstack user create --domain default --password-prompt murano
- ..
-
- * Add the ``admin`` role to the ``murano`` user:
-
- .. code-block:: console
-
- $ openstack role add --project service --user murano admin
- ..
-
- * Create the murano service entities:
-
- .. code-block:: console
-
- $ openstack service create --name murano --description "Application Catalog" application-catalog
- ..
-
-#. Create the Application Catalog service API endpoints:
-
- .. code-block:: console
-
- $ openstack endpoint create --region RegionOne \
- application-catalog public http://:8082
- $ openstack endpoint create --region RegionOne \
- application-catalog internal http://:8082
- $ openstack endpoint create --region RegionOne \
- application-catalog admin http://:8082
- ..
-
- .. note::
-
- URLs (publicurl, internalurl and adminurl) may be different
- depending on your environment.
- ..
diff --git a/doc/source/install/enable-ssl.rst b/doc/source/install/enable-ssl.rst
deleted file mode 100644
index caa01c9d9..000000000
--- a/doc/source/install/enable-ssl.rst
+++ /dev/null
@@ -1,149 +0,0 @@
-..
- Copyright 2014 Mirantis, Inc.
-
- 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.
-
-=================
-SSL configuration
-=================
-Murano components are able to work with SSL. This section will help you
-to configure proper settings for SSL configuration.
-
-HTTPS for Murano API
-====================
-
-SSL for the Murano API service can be configured in the *ssl* section in
-``/etc/murano/murano.conf``. Just point to a valid SSL certificate.
-See the example below:
-
-::
-
-
- [ssl]
- cert_file = PATH
- key_file = PATH
- ca_file = PATH
-
-- *cert\_file* Path to the certificate file the server should use when binding to an SSL-wrapped socket.
-- *key\_file* Path to the private key file the server should use when binding to an SSL-wrapped socket.
-- *ca\_file* Path to the CA certificate file the server should use to validate client certificates provided during an SSL handshake. This is ignored if cert\_file and "key\_file" are not set.
-
-.. note::
-
- The use of SSL is automatically started after pointing to an HTTPS protocol
- instead of HTTP, during the registration of the Murano API service endpoints
- (Change publicurl argument to start with \https://).
-..
-
-
-SSL for Murano API is implemented like in any other OpenStack component.
-This is because Murano uses the ssl python module; more information about
-it can be found `here`_.
-
-.. _`here`: https://docs.python.org/2/library/ssl.html
-
-SSL for RabbitMQ
-================
-
-All Murano components communicate with each other via RabbitMQ. This
-interaction can be encrypted with SSL. By default, all messages in Rabbit
-MQ are not encrypted. Each RabbitMQ Exchange should be configured
-separately.
-
-**Murano API <-> Rabbit MQ exchange <-> Murano Engine**
-
-Edit ssl parameters in default section of ``/etc/murano/murano.conf``. Set the
-``rabbit_use_ssl`` option to *true* and configure the ssl kombu parameters.
-Specify the path to the SSL keyfile and SSL CA certificate in a regular format:
-/path/to/file without quotes or leave it empty to allow for self-signed
-certificates.
-
-::
-
- # connect over SSL for RabbitMQ (boolean value)
- #rabbit_use_ssl=false
-
- # SSL version to use (valid only if SSL enabled). valid values
- # are TLSv1, SSLv23 and SSLv3. SSLv2 may be available on some
- # distributions (string value)
- #kombu_ssl_version=
-
- # SSL key file (valid only if SSL enabled) (string value)
- #kombu_ssl_keyfile=
-
- # SSL cert file (valid only if SSL enabled) (string value)
- #kombu_ssl_certfile=
-
- # SSL certification authority file (valid only if SSL enabled)
- # (string value)
- #kombu_ssl_ca_certs=
-
-
-**Murano Agent -> Rabbit MQ exchange**
-
-In the main murano configuration file, there is a section named *rabbitmq*,
-which is responsible for setting up communication between Murano Agent and
-Rabbit MQ. Just set the *ssl* parameter to True to enable ssl.
-
-::
-
- [rabbitmq]
- host = localhost
- port = 5672
- login = guest
- password = guest
- virtual_host = /
- ssl = True
-
-If you want to configure Murano Agent in a different way, change the default
-template. It can be found in the Murano Core Library, located at
-*https://opendev.org/openstack/murano/src/branch/master/meta/io.murano/Resources/Agent-v1.template*.
-Take a look at the appSettings section:
-
-::
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-The desired parameter should be set directly to the value of the key that
-you want to change. Quotes need to be kept. Thus you can change
-"rabbitmq.ssl" and "rabbitmq.port" values to make Rabbit MQ work with
-this exchange differently than the default Murano Engine way.
-
-.. note::
-
- After modification, don't forget to zip and re-upload the core library.
-..
-
-SSL for Murano Dashboard
-========================
-
-If you are not going to use self-signed certificates, additional
-configuration does not need to be done. Just prefix https in the URL.
-Otherwise, set *MURANO_API_INSECURE = True* in Horizon's config file. You can
-find it in ``/etc/openstack-dashboard/local_settings.py``.
diff --git a/doc/source/install/from-source.rst b/doc/source/install/from-source.rst
deleted file mode 100644
index df9b4f9fb..000000000
--- a/doc/source/install/from-source.rst
+++ /dev/null
@@ -1,277 +0,0 @@
-Install Murano from Source
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-This section describes how to install and configure the Application Catalog
-service for Ubuntu 16.04 (LTS) from source code.
-
-.. include:: common_prerequisites.rst
-
-Install the API service and Engine
-----------------------------------
-
-#. Create a folder which will hold all Murano components.
-
- .. code-block:: console
-
- mkdir ~/murano
- ..
-
-#. Clone the murano git repository to the management server.
-
- .. code-block:: console
-
- cd ~/murano
- git clone https://opendev.org/openstack/murano
- ..
-
-#. Set up the murano config file
-
- Murano has a common config file for API and Engine services.
-
- First, generate a sample configuration file, using tox
-
- .. code-block:: console
-
- cd ~/murano/murano
- tox -e genconfig
- ..
-
- And make a copy of it for further modifications
-
- .. code-block:: console
-
- cd ~/murano/murano/etc/murano
- ln -s murano.conf.sample murano.conf
- ..
-
-#. Edit ``murano.conf`` with your favorite editor. Below is an example
- which contains basic settings you likely need to configure.
-
- .. note::
-
- The example below uses SQLite database. Edit **[database]** section
- if you want to use any other database type.
- ..
-
- .. code-block:: ini
-
- [DEFAULT]
- debug = true
- verbose = true
- transport_url = rabbit://%RABBITMQ_USER%:%RABBITMQ_PASSWORD%@%RABBITMQ_SERVER_IP%:5672/
-
- ...
-
- [database]
- connection = mysql+pymysql://murano:MURANO_DBPASS@controller/murano
-
- ...
-
- [keystone]
- auth_url = http://%OPENSTACK_KEYSTONE_ENDPOINT%
-
- ...
-
- [keystone_authtoken]
- project_domain_name = Default
- project_name = %OPENSTACK_ADMIN_PROJECT%
- user_domain_name = Default
- password = %OPENSTACK_ADMIN_PASSWORD%
- username = %OPENSTACK_ADMIN_USER%
- auth_url = http://%OPENSTACK_KEYSTONE_ENDPOINT%
- auth_type = password
-
- ...
-
- [murano]
- url = http://%YOUR_HOST_IP%:8082
-
- [rabbitmq]
- host = %RABBITMQ_SERVER_IP%
- login = %RABBITMQ_USER%
- password = %RABBITMQ_PASSWORD%
- virtual_host = %RABBITMQ_SERVER_VIRTUAL_HOST%
-
- [networking]
- default_dns = 8.8.8.8 # In case openstack neutron has no default
- # DNS configured
- ..
-
-#. Create a virtual environment and install Murano prerequisites. We will use
- *tox* for that. The virtual environment will be created under *.tox*
- directory.
-
- .. code-block:: console
-
- cd ~/murano/murano
- tox
- ..
-
-#. Create database tables for Murano.
-
- .. code-block:: console
-
- cd ~/murano/murano
- tox -e venv -- murano-db-manage \
- --config-file ./etc/murano/murano.conf upgrade
- ..
-
-#. Open a new console and launch Murano API. A separate terminal is
- required because the console will be locked by a running process.
-
- .. code-block:: console
-
- cd ~/murano/murano
- tox -e venv -- murano-api --config-file ./etc/murano/murano.conf
- ..
-
-#. Import Core Murano Library.
-
- .. code-block:: console
-
- cd ~/murano/murano
- pushd ./meta/io.murano
- zip -r ../../io.murano.zip *
- popd
- tox -e venv -- murano --murano-url http://localhost:8082 \
- package-import --is-public io.murano.zip
- ..
-
-#. Open a new console and launch Murano Engine. A separate terminal is
- required because the console will be locked by a running process.
-
- .. code-block:: console
-
- cd ~/murano/murano
- tox -e venv -- murano-engine --config-file ./etc/murano/murano.conf
- ..
-
-Install Murano Dashboard
-========================
-
-Murano API & Engine services provide the core of Murano. However, your need a
-control plane to use it. This section describes how to install and run Murano
-Dashboard.
-
-#. Clone the murano dashboard repository.
-
- .. code-block:: console
-
- $ cd ~/murano
- $ git clone https://opendev.org/openstack/murano-dashboard
- ..
-
-#. Clone the ``horizon`` repository
-
- .. code-block:: console
-
- $ git clone https://opendev.org/openstack/horizon
- ..
-
-#. Create a virtual environment and install ``muranodashboard`` as an editable
- module:
-
- .. code-block:: console
-
- $ cd horizon
- $ tox -e venv -- pip install -e ../murano-dashboard
- ..
-
-#. Prepare local settings.
-
- .. code-block:: console
-
- $ cp openstack_dashboard/local/local_settings.py.example \
- openstack_dashboard/local/local_settings.py
- ..
-
- For more information, check out the official
- `horizon documentation `_.
-
-#. Enable and configure Murano dashboard in the OpenStack Dashboard:
-
- * For Newton (and later) OpenStack installations, copy the plugin file,
- local settings files, and policy files.
-
- .. code-block:: console
-
- $ cp ../murano-dashboard/muranodashboard/local/enabled/*.py \
- openstack_dashboard/local/enabled/
-
- $ cp ../murano-dashboard/muranodashboard/local/local_settings.d/*.py \
- openstack_dashboard/local/local_settings.d/
-
- $ cp ../murano-dashboard/muranodashboard/conf/* openstack_dashboard/conf/
- ..
-
- * For the OpenStack installations prior to the Newton release, run:
-
- .. code-block:: console
-
- $ cp ../murano-dashboard/muranodashboard/local/_50_murano.py \
- openstack_dashboard/local/enabled/
- ..
-
- Customize local settings of your horizon installation, by editing the
- :file:`openstack_dashboard/local/local_settings.py` file:
-
- .. code-block:: python
-
- ...
- ALLOWED_HOSTS = '*'
-
- # Provide OpenStack Lab credentials
- OPENSTACK_HOST = '%OPENSTACK_HOST_IP%'
-
- ...
-
- DEBUG_PROPAGATE_EXCEPTIONS = DEBUG
- ..
-
- Change the default session back end-from using browser cookies to using a
- database instead to avoid issues with forms during the creation of
- applications:
-
- .. code-block:: python
-
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.sqlite3',
- 'NAME': 'murano-dashboard.sqlite',
- }
- }
-
- SESSION_ENGINE = 'django.contrib.sessions.backends.db'
- ..
-
-#. (Optional) If you do not plan to get the murano service from the keystone
- application catalog, specify where the murano-api service is running:
-
- .. code-block:: python
-
- MURANO_API_URL = 'http://%MURANO_IP%:8082'
- ..
-
-#. (Optional) If you have set up the database as a session back-end (this is
- done by default with the murano local_settings file starting with Newton),
- perform database migration:
-
- .. code-block:: console
-
- $ tox -e venv -- python manage.py migrate --noinput
- ..
-
-#. Run the Django server at 127.0.0.1:8000 or provide different IP and PORT
- parameters:
-
- .. code-block:: console
-
- $ tox -e venv -- python manage.py runserver
- ..
-
-.. note::
-
- The development server restarts automatically following every code change.
-..
-
-**Result:** The murano dashboard is available at http://IP:PORT.
diff --git a/doc/source/install/get_started.rst b/doc/source/install/get_started.rst
deleted file mode 100644
index 3f735fcb6..000000000
--- a/doc/source/install/get_started.rst
+++ /dev/null
@@ -1,23 +0,0 @@
-====================================
-Application Catalog service overview
-====================================
-The Application Catalog service consists of the following components:
-
-``murano`` command-line client
- A CLI that communicates with the ``murano-api`` to publish various
- cloud-ready applications on new virtual machines.
-
-``murano-api`` service
- An OpenStack-native REST API that processes API requests by sending
- them to the ``murano-engine`` service via AMQP.
-
-``murano-agent`` service
- The agent that runs on guest VMs and executes the deployment plan,
- a combination of execution plan templates and scripts.
-
-``murano-engine`` service
- The workflow component of Murano, responsible for the deployment of an
- environment.
-
-``murano-dashboard`` service
- Murano UI implemented as a plugin for the OpenStack Dashboard.
diff --git a/doc/source/install/import-murano-apps.rst b/doc/source/install/import-murano-apps.rst
deleted file mode 100644
index 4c38a3d57..000000000
--- a/doc/source/install/import-murano-apps.rst
+++ /dev/null
@@ -1,36 +0,0 @@
-..
- Copyright 2014 Mirantis, Inc.
-
- 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.
-
-Applications need to be imported to fill the catalog.
-This can be done via the dashboard or via CLI:
-
-1. Clone the murano apps repository.
-
- .. code-block:: console
-
- cd ~/murano
- git clone https://opendev.org/openstack/murano-apps
- ..
-
-2. Import every package you need from this repository, using the command
- below.
-
- .. code-block:: console
-
- cd ~/murano/murano
- pushd ../murano-apps/Docker/Applications/%APP-NAME%/package
- zip -r ~/murano/murano/app.zip *
- popd
- tox -e venv -- murano --murano-url http://:8082 package-import app.zip
diff --git a/doc/source/install/index.rst b/doc/source/install/index.rst
deleted file mode 100644
index a6fb6de24..000000000
--- a/doc/source/install/index.rst
+++ /dev/null
@@ -1,21 +0,0 @@
-===========================
-Application Catalog service
-===========================
-
-.. toctree::
- :maxdepth: 2
-
- get_started.rst
- install.rst
- verify.rst
- next-steps.rst
-
-The Murano Project introduces an application catalog to OpenStack, enabling
-application developers and cloud administrators to publish various cloud-ready
-applications in a browsable categorized catalog. Cloud users -- including
-inexperienced ones -- can then use the catalog to compose reliable application
-environments with the push of a button.
-
-This chapter assumes a working setup of OpenStack following the
-`OpenStack Installation Tutorial
-`_.
diff --git a/doc/source/install/install-api.rst b/doc/source/install/install-api.rst
deleted file mode 100644
index 097b3c1d0..000000000
--- a/doc/source/install/install-api.rst
+++ /dev/null
@@ -1,106 +0,0 @@
-..
- Copyright 2014 Mirantis, Inc.
-
- 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.
-
-Install Murano API
-~~~~~~~~~~~~~~~~~~
-
-This section describes how to install and configure the Application Catalog
-service for Ubuntu 16.04 (LTS).
-
-.. include:: common_prerequisites.rst
-
-Install and configure components
---------------------------------
-
-#. Install the packages:
-
- .. code-block:: console
-
- # apt-get update
-
- # apt-get install murano-engine murano-api
-
-#. Edit ``murano.conf`` with your favorite editor. Below is an example
- which contains basic settings you likely need to configure.
-
- .. note::
-
- The example below uses SQLite database. Edit **[database]** section
- if you want to use any other database type.
- ..
-
- .. code-block:: ini
-
- [DEFAULT]
- debug = true
- verbose = true
- transport_url = rabbit://%RABBITMQ_USER%:%RABBITMQ_PASSWORD%@%RABBITMQ_SERVER_IP%:5672/
-
- ...
-
- [database]
- connection = mysql+pymysql://murano:MURANO_DBPASS@controller/murano
-
- ...
-
- [keystone]
- auth_url = http://%OPENSTACK_KEYSTONE_ENDPOINT%
-
- ...
-
- [keystone_authtoken]
- project_domain_name = Default
- project_name = %OPENSTACK_ADMIN_PROJECT%
- user_domain_name = Default
- password = %OPENSTACK_ADMIN_PASSWORD%
- username = %OPENSTACK_ADMIN_USER%
- auth_url = http://%OPENSTACK_KEYSTONE_ENDPOINT%
- auth_type = password
-
- ...
-
- [murano]
- url = http://%YOUR_HOST_IP%:8082
-
- [rabbitmq]
- host = %RABBITMQ_SERVER_IP%
- login = %RABBITMQ_USER%
- password = %RABBITMQ_PASSWORD%
- virtual_host = %RABBITMQ_SERVER_VIRTUAL_HOST%
-
- [networking]
- default_dns = 8.8.8.8 # In case openstack neutron has no default
- # DNS configured
- ..
-
-#. Populate the Murano database:
-
- .. code-block:: console
-
- # su -s /bin/sh -c "murano-db-manage upgrade" murano
-
- .. note::
-
- Ignore any deprecation messages in this output.
-
-Finalize installation
----------------------
-
-#. Restart the Application Catalog services:
-
- .. code-block:: console
-
- # service murano-api restart
- # service murano-engine restart
diff --git a/doc/source/install/install-dashboard.rst b/doc/source/install/install-dashboard.rst
deleted file mode 100644
index 03905747c..000000000
--- a/doc/source/install/install-dashboard.rst
+++ /dev/null
@@ -1,75 +0,0 @@
-..
- Copyright 2014 Mirantis, Inc.
-
- 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.
-
-Install Murano Dashboard
-========================
-
-Murano API & Engine services provide the core of Murano. However, your need a
-control plane to use it. This section describes how to install and run Murano
-Dashboard.
-
-#. Install OpenStack Dashboard, the steps please reference from
- `OpenStack Dashboard Install Guide `__.
-
-#. Install the packages:
-
- .. code-block:: console
-
- # apt install python-murano-dashboard
-
-#. Edit the ``/etc/openstack-dashboard/local_settings.py``
- file to customize local settings of your envi
-
- .. code-block:: python
-
- ...
- OPENSTACK_HOST = '%OPENSTACK_HOST_IP%'
- OPENSTACK_KEYSTONE_DEFAULT_ROLE = '%OPENSTACK_ROLE%'
- ...
-
- ..
-
- Change the default session back end-from using browser cookies to using a
- database instead to avoid issues with forms during the creation of
- applications:
-
- .. code-block:: python
-
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.sqlite3',
- 'NAME': 'murano-dashboard.sqlite',
- }
- }
-
- SESSION_ENGINE = 'django.contrib.sessions.backends.db'
- ..
-
-#. (Optional) If you do not plan to get the murano service from the keystone
- application catalog, specify where the murano-api service is running:
-
- .. code-block:: python
-
- MURANO_API_URL = 'http://%MURANO_IP%:8082'
- ..
-
-Finalize installation
----------------------
-
-#. Restart the Apache service:
-
- .. code-block:: console
-
- # service apache2 restart
diff --git a/doc/source/install/install-network-config.rst b/doc/source/install/install-network-config.rst
deleted file mode 100644
index 1b629403a..000000000
--- a/doc/source/install/install-network-config.rst
+++ /dev/null
@@ -1,61 +0,0 @@
-..
- Copyright 2014 Mirantis, Inc.
-
- 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.
-
-=====================
-Network Configuration
-=====================
-Murano may work in various networking environments and is capable of detecting
-the current network configuration and choosing the appropriate settings
-automatically. However, some additional actions are required to support
-advanced scenarios.
-
-Nova network support
-====================
-Nova Network is the simplest networking solution, which has limited
-capabilities but is available on any OpenStack deployment without the need to
-deploy any additional components. For more information about Nova Network, see
-``__.
-
-When a new Murano Environment is created, Murano checks if a dedicated
-networking service (i.e. Neutron) exists in the current OpenStack deployment.
-It relies on Keystone's service catalog for that. If such a service is not
-present, Murano automatically falls back to Nova Network. No further
-configuration is needed in this case; all the VMs spawned by Murano will join
-the same network.
-
-Neutron support
-===============
-If Neutron is installed, Murano enables its advanced networking features that
-give you the ability to not care about configuring networks for your
-application.
-
-By default, Murano will create an isolated network for each environment and
-attach all VMs needed by your application to that network. To install and
-configure applications in just-spawned virtual machines, Murano also requires
-a router connected to the external network.
-
-Automatic Neutron network configuration
-=======================================
-To create a router automatically, provide the following parameters in the
-config file:
-
-.. code-block:: ini
-
- [networking]
-
- external_network = %EXTERNAL_NETWORK_NAME%
- router_name = %MURANO_ROUTER_NAME%
- create_router = true
-..
diff --git a/doc/source/install/install.rst b/doc/source/install/install.rst
deleted file mode 100644
index f6ab49972..000000000
--- a/doc/source/install/install.rst
+++ /dev/null
@@ -1,32 +0,0 @@
-.. _install:
-
-Install and configure
-~~~~~~~~~~~~~~~~~~~~~
-
-This section describes how to install and configure the
-Application Catalog service, code-named murano, on the controller node.
-
-This section assumes that you already have a working OpenStack environment with
-at least the following components installed: Identity service, Image service,
-Compute service, Networking service, Block Storage service and Orchestration
-service. See `OpenStack Install Guides `__.
-
-Note that installation and configuration vary by distribution. Currently,
-this installation guide is tailored toward Ubuntu environments, but can easily
-be adapted to work with other types of distros.
-
-.. note::
-
- Fedora support wasn't thoroughly tested. We do not guarantee that murano
- will work on Fedora.
-..
-
-.. toctree::
- :maxdepth: 2
-
- install-api.rst
- install-dashboard.rst
- from-source.rst
- install-network-config.rst
- enable-ssl.rst
diff --git a/doc/source/install/next-steps.rst b/doc/source/install/next-steps.rst
deleted file mode 100644
index d04b2acc8..000000000
--- a/doc/source/install/next-steps.rst
+++ /dev/null
@@ -1,19 +0,0 @@
-.. _next-steps:
-
-Next steps
-~~~~~~~~~~
-
-Your OpenStack environment now includes the Murano service.
-
-Import Murano Applications
---------------------------
-.. include:: import-murano-apps.rst
-
-Additional Resources
---------------------
-
-#. To add additional services, see
- ``__.
-
-#. If you would like to add glare as the storage service for packages, see:
- ``__.
diff --git a/doc/source/install/verify.rst b/doc/source/install/verify.rst
deleted file mode 100644
index 24af77f43..000000000
--- a/doc/source/install/verify.rst
+++ /dev/null
@@ -1,25 +0,0 @@
-.. _verify:
-
-Verify operation
-~~~~~~~~~~~~~~~~
-
-Verify operation of the Application Catalog service.
-
-.. note::
-
- Perform these commands on the controller node.
-
-#. Source the ``admin`` project credentials to gain access to
- admin-only CLI commands:
-
- .. code-block:: console
-
- $ . admin-openrc
-
-#. List service components to verify successful launch and registration
- of each process:
-
- .. code-block:: console
-
- $ openstack service list | grep application-catalog
- | 7b12ef5edef848fc9200c271f71b1307 | murano | application-catalog |
\ No newline at end of file
diff --git a/doc/source/reference/appendix/appendix_index.rst b/doc/source/reference/appendix/appendix_index.rst
deleted file mode 100644
index 13b430cc6..000000000
--- a/doc/source/reference/appendix/appendix_index.rst
+++ /dev/null
@@ -1,12 +0,0 @@
-Appendix
-~~~~~~~~
-
-.. toctree::
- :maxdepth: 2
-
- murano_concepts
- tutorials
- rest_api_spec
- cli_ref
- glossary
- articles/articles_index
diff --git a/doc/source/reference/appendix/articles/articles_index.rst b/doc/source/reference/appendix/articles/articles_index.rst
deleted file mode 100644
index 36d90bec2..000000000
--- a/doc/source/reference/appendix/articles/articles_index.rst
+++ /dev/null
@@ -1,41 +0,0 @@
-Miscellaneous
-~~~~~~~~~~~~~
-
-**Background Concepts for Murano**
-
-.. toctree::
- :maxdepth: 1
-
- workflow
-
-
-**Tutorials**
-
-.. toctree::
- :maxdepth: 1
-
- image_builders/index
- test_docs
-
-
-**Guidelines**
-
-.. toctree::
- :maxdepth: 1
-
- guidelines
-
-**Gerrit review dashboard**
-
-.. toctree::
- :maxdepth: 1
-
- murano_gerrit_dashboard
-
-
-**API specification**
-
-.. toctree::
- :maxdepth: 1
-
- specification/index
diff --git a/doc/source/reference/appendix/articles/guidelines.rst b/doc/source/reference/appendix/articles/guidelines.rst
deleted file mode 100644
index 1e497b3e7..000000000
--- a/doc/source/reference/appendix/articles/guidelines.rst
+++ /dev/null
@@ -1,83 +0,0 @@
-======================
-Development Guidelines
-======================
-
-Coding Guidelines
------------------
-
-For all the code in Murano we have a rule - it should pass `PEP 8`_.
-
-To check your code against PEP 8 run:
-
-::
-
- tox -e pep8
-
-
-.. seealso::
-
- * https://pep8.readthedocs.org/en/latest/
- * https://flake8.readthedocs.org
- * https://docs.openstack.org/hacking/latest/
-
-Blueprints and Specs
---------------------
-
-Murano team uses the `murano-specs`_ repository for its blueprint and
-specification (specs) review process. See `Launchpad`_ to propose or
-see the status of a current blueprint.
-
-Testing Guidelines
-------------------
-
-Murano has a suite of tests that are run on all submitted code,
-and it is recommended that developers execute the tests themselves to
-catch regressions early. Developers are also expected to keep the
-test suite up-to-date with any submitted code changes.
-
-Unit tests are located at ``murano/tests``.
-
-Murano's suite of unit tests can be executed in an isolated environment
-with `Tox`_. To execute the unit tests run the following from the root of
-Murano repo on Python 3.x:
-
-::
-
- tox -e py3.x
-
-
-Documentation Guidelines
-------------------------
-
-Murano dev-docs are written using Sphinx / RST and located in the main repo
-in ``doc`` directory.
-
-The documentation in docstrings should follow the `PEP 257`_ conventions
-(as mentioned in the `PEP 8`_ guidelines).
-
-More specifically:
-
-1. Triple quotes should be used for all docstrings.
-2. If the docstring is simple and fits on one line, then just use
- one line.
-3. For docstrings that take multiple lines, there should be a newline
- after the opening quotes, and before the closing quotes.
-4. `Sphinx`_ is used to build documentation, so use the restructured text
- markup to designate parameters, return values, etc. Documentation on
- the sphinx specific markup can be found here:
-
-
-
-Run the following command to build docs locally.
-
-::
-
- tox -e docs
-
-
-.. _PEP 8: http://www.python.org/dev/peps/pep-0008/
-.. _PEP 257: http://www.python.org/dev/peps/pep-0257/
-.. _Tox: http://tox.testrun.org/
-.. _Sphinx: http://sphinx.pocoo.org/markup/index.html
-.. _murano-specs: http://opendev.org/openstack/murano-specs
-.. _Launchpad: http://blueprints.launchpad.net/murano
diff --git a/doc/source/reference/appendix/articles/image_builders/index.rst b/doc/source/reference/appendix/articles/image_builders/index.rst
deleted file mode 100644
index faa1d50fd..000000000
--- a/doc/source/reference/appendix/articles/image_builders/index.rst
+++ /dev/null
@@ -1,12 +0,0 @@
-.. _building_images:
-
-=====================
-Building Murano Image
-=====================
-
-.. toctree::
- :maxdepth: 2
-
- windows
- linux
- upload
diff --git a/doc/source/reference/appendix/articles/image_builders/linux.rst b/doc/source/reference/appendix/articles/image_builders/linux.rst
deleted file mode 100644
index d4d0e9923..000000000
--- a/doc/source/reference/appendix/articles/image_builders/linux.rst
+++ /dev/null
@@ -1,64 +0,0 @@
-===========
-Linux Image
-===========
-
-At the moment the best way to build a Linux image with the murano agent is
-to use disk image builder.
-
-
-.. note::
-
- Disk image builder requires sudo rights
-
-
-The process is quite simple. Let's assume that you use a directory ~/git
-for cloning git repositories:
-
-.. code-block:: console
-
- export GITDIR=~/git
- mkdir -p $GITDIR
-
-
-Clone the components required to build an image to that directory:
-
-.. code-block:: console
-
- cd $GITDIR
- git clone https://opendev.org/openstack/murano
- git clone https://opendev.org/openstack/murano-agent
-
-
-Install diskimage-builder
-
-.. code-block:: console
-
- sudo pip install diskimage-builder
-
-
-Install additional packages required by disk image builder:
-
-.. code-block:: console
-
- sudo apt-get install qemu-utils curl python3-tox
-
-
-Export paths where additional dib elements are located:
-
-.. code-block:: console
-
- export ELEMENTS_PATH=$GITDIR/murano/contrib/elements:$GITDIR/murano-agent/contrib/elements
-
-
-Build Ubuntu-based image with the murano agent:
-
-.. code-block:: console
-
- disk-image-create vm ubuntu murano-agent -o murano-agent.qcow2
-
-
-If you need a Fedora based image, replace 'ubuntu' to 'fedora' in the last command.
-
-It'll take a while (up to 30 minutes if your hard drive and internet connection are slow).
-
-When you are done upload the murano-agent.qcow2 image to glance and play :)
diff --git a/doc/source/reference/appendix/articles/image_builders/upload.rst b/doc/source/reference/appendix/articles/image_builders/upload.rst
deleted file mode 100644
index d1029bdcb..000000000
--- a/doc/source/reference/appendix/articles/image_builders/upload.rst
+++ /dev/null
@@ -1,90 +0,0 @@
-.. _upload_images:
-
-========================
-Upload image into glance
-========================
-
-To deploy applications with murano, virtual machine images should be uploaded into glance in a special way - *murano_image_info* property should be set.
-
-1. Use the OpenStack client image create command to import your disk image to glance:
-
-.. code-block:: console
-
- openstack image create --public \
- > --disk-format qcow2 --container-format bare \
- > --file --property
-..
-
-Replace the command line arguments to openstack image create with the appropriate values for your environment and disk image:
-
-* Replace **** with the local path to the image file to upload. E.g. **ws-2012-std.qcow2**.
-
-* Replace **** with the following property string
-
-* Replace **** with the name that users will refer to the disk image by. E.g. **ws-2012-std**
-
-.. code-block:: text
-
- murano_image_info='{"title": "Windows 2012 Standard Edition", "type": "windows.2012"}'
-..
-
-where:
-
-* **title** - user-friendly description of the image
-* **type** - murano image type, see :ref:`murano_image_types`
-
-2. To update metadata of the existing image run the command:
-
-.. code-block:: console
-
- openstack image set --property
-..
-
-* Replace **** with murano_image_info property, e.g.
-
-* Replace **** with image id from the previous command output.
-
-.. code-block:: text
-
- murano_image_info='{"title": "Windows 2012 Standard Edition", "type": "windows.2012"}'
-..
-
-.. warning::
-
- The value of the **--property** argument (named **murano_image_info**) is a JSON string.
- Only double quotes are valid in JSON, so please type the string exactly as in the example above.
-..
-
-.. note::
-
- Existing images could be marked in a simple way in the horizon UI with the murano dashboard installed.
- Navigate to *Applications -> Manage -> Images -> Mark Image* and fill up a form:
-
- * **Image** - ws-2012-std
- * **Title** - My Prepared Image
- * **Type** - Windows Server 2012
-..
-
-After these steps desired image can be chosen in application creation wizard.
-
-
-.. _murano_image_types:
-
-Murano image types
-------------------
-
-.. list-table::
- :header-rows: 1
-
- * - Type Name
- - Description
-
- * - windows.2012
- - Windows Server 2012
-
- * - linux
- - Generic Linux images, Ubuntu / Debian, RedHat / Centos, etc
-
- * - cirros.demo
- - Murano demo image, based on CirrOS
-..
diff --git a/doc/source/reference/appendix/articles/image_builders/windows.rst b/doc/source/reference/appendix/articles/image_builders/windows.rst
deleted file mode 100644
index 1ed749d70..000000000
--- a/doc/source/reference/appendix/articles/image_builders/windows.rst
+++ /dev/null
@@ -1,172 +0,0 @@
-MS Windows image builder for OpenStack Murano
-=============================================
-
-Introduction
-------------
-
-This repository contains MS Windows templates, powershell scripts and bash scripted logic used to create qcow2 images
-for QEMU/KVM based virtual machines used in OpenStack.
-
-MS Windows Versions
--------------------
-
-Supported by builder versions with en_US localization:
-
-* Windows 2012 R2
-* Windows 2012 R2 Core
-* Windows 2008 R2
-* Windows 2008 R2 Core
-
-Getting Started
----------------
-
-Trial versions of Windows 2008 R2 / 2012 R2 used by default. You could use these images for 180 days without activation.
-You could download evaluation versions from official Microsoft website:
-
-* `[Windows 2012 R2 - download] `_
-* `[Windows 2008 R2 - download] `_
-
-System requirements
-~~~~~~~~~~~~~~~~~~~
-
-* Debian based Linux distribution, like Ubuntu, Mint and so on.
-* Packages required:
- ``qemu-kvm virt-manager virt-goodies virtinst bridge-utils libvirt-bin
- uuid-runtime samba samba-common cifs-utils``
-* User should be able to run sudo without password prompt!
-
- .. code-block:: console
-
- sudo echo "${USER} ALL = NOPASSWD: ALL" > /etc/sudoers.d/${USER}
- sudo chmod 440 /etc/sudoers.d/${USER}
-
-* Free disk space > 50G on partition where script will spawn virtual machines because of ``40G`` required by virtual
- machine HDD image.
-* Internet connectivity.
-* Samba shared resource.
-
-Configuring builder
-~~~~~~~~~~~~~~~~~~~
-
-Configuration parameters to tweak:
-
-``[default]``
-
-* ``workdir`` - place where script would prepare all software required by build scenarios. By `default` is not set,
- i.e. script directory would used as root of working space.
-* ``vmsworkdir`` - must contain valid path, this parameter tells script where it should spawn virtual machines.
-* ``runparallel`` - *true* of *false*, **false** set by default. This parameter describes how to start virtual machines,
- one by one or in launch them in background.
-
-``[samba]``
-
-* ``mode`` - *local* or *remote*. In local mode script would try to install and configure Samba server locally. If set
- to remote, you should also provide information about connection.
-* ``host`` - in local mode - is 192.168.122.1, otherwise set proper ip address.
-* ``user`` - set to **guest** by default in case of guest rw access.
-* ``domain`` - Samba server user domain, if not set `host` value used.
-* ``password`` - Samba server user password.
-* ``image-builder-share`` - Samba server remote directory.
-
-MS Windows install preparation:
-
-``[win2k12r2]`` or ``[win2k8r2]`` - shortcuts for 2012 R2 and 2008 R2.
-
-* ``enabled`` - *true* of *false*, include or exclude release processing by script.
-* ``editions`` - standard, core or both(space used as delimiter).
-* ``iso`` - local path to iso file
-
-By default ``[win2k8r2]`` - disabled, if you need you can enable this release in *config.ini* file.
-
-Run
----
-
-Preparation
-~~~~~~~~~~~
-
-Run ``chmod +x *.sh`` in builder directory to make script files executable.
-
-Command line parameters:
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-``runme.sh`` - the main script
-
-* ``--help`` - shows usage
-* ``--forceinstall-dependencies`` - Runs dependencies install.
-* ``--check-smb`` - Run checks or configuration of Samba server.
-* ``--download-requirements`` - Download all required and configures software except MS Windows ISO.
-* ``--show-configured`` - Shows configured and available to use MS Windows releases.
-* ``--run`` - normal run
-
-Experimental options:
-^^^^^^^^^^^^^^^^^^^^^
-
-* ``--config-file`` - Set configuration file location instead of default.
-
-Use cases
----------
-
-All examples below describes changes in ``config.ini`` file
-
-1. I want to build one image for specific version and edition. For example: version - **2012 R2** and edition -
- **standard**. Steps to reach the goal:
-
- * Disable ``[win2k8r2]`` from script processing.
-
- .. code-block:: ini
-
- [win2k8r2]
- enabled=false
-
- - Update ``[win2k12r2]`` with desired edition(**standard**).
-
- .. code-block:: ini
-
- [win2k12r2]
- enabled=true
- editions=standard
-
- * Execute ``runme.sh --run``
-
-2. I want to build two images for specific version with all supported by script editions. For example: **2012 R2** and
- editions - **standard** and **core**. Steps to reach the goal:
-
- * Disable `[win2k8r2]` from script processing.
-
- .. code-block:: ini
-
- [win2k8r2]
- enabled=false
-
- * Update ``[win2k12r2]`` with desired editions(**standard** and **core**).
-
- .. code-block:: ini
-
- [win2k12r2]
- enabled=true
- editions=standard core
-
-
- * Execute ``runme.sh --run``
-
-3. I want to build two images for all supported by script versions with specific editions. For example: versions -
- **2012 R2** and **2008 R2** and edition - **core**. Steps to reach the goal:
-
- * Update ``[win2k8r2]`` with desired edition(**core**).
-
- .. code-block:: ini
-
- [win2k8r2]
- enabled=true
- editions=core
-
- * Update ``[win2k12r2]`` with desired edition(**core**).
-
- .. code-block:: ini
-
- [win2k12r2]
- enabled=true
- editions=core
-
- * Execute ``runme.sh --run``
-
diff --git a/doc/source/reference/appendix/articles/multi_region.rst b/doc/source/reference/appendix/articles/multi_region.rst
deleted file mode 100644
index da091c04b..000000000
--- a/doc/source/reference/appendix/articles/multi_region.rst
+++ /dev/null
@@ -1,61 +0,0 @@
-.. _multi-region:
-
-=============================
-Support for OpenStack regions
-=============================
-Murano supports multi-region deployment. If OpenStack setup has several regions
-it is possible to choose the region to deploy an application.
-
-There is the new option in the murano configuration file:
-
-* `home_region` - default region name used to get services
- endpoints. The region where murano-api resides.
-
-Now murano has two possible ways to deploy apps in different regions:
-
-1. Deploy an application in the current murano region.
-2. Associate environments with regions.
-
-Deploy an app in the current region
-===================================
-Each region has a copy of murano services and its own RabbitMQ for api to
-engine communication. In this case application will be deployed to the same
-region that murano run in.
-
-.. seealso::
-
- :ref:`multi_region`
-
-Associate environments with regions
-===================================
-Murano services are in one region but environments can be associated with
-different regions. There are two new properties in the class
-`io.murano.Environment`:
-
-* `regionConfigs` - a dict with RabbitMQ settings for each region. The
- structure of the agentRabbitMq part of the dict is identical to [rabbitmq]
- section in the `murano.conf` file. For example:
-
- .. code-block:: yaml
-
- regionConfigs:
- RegionOne:
- agentRabbitMq:
- host: 192.1.1.1
- login: admin
- password: admin
-
- User can store such configs as YAML or JSON files. These config files must
- be stored in a special folder that is configured in [engine] section of
- `murano.conf` file under `class_configs` key and must be named using
- %FQ class name%.json or %FQ class name%.yaml pattern.
-
-* `region` - region name to deploy an app. It can be passed when creating
- environment via CLI:
-
- .. code-block:: console
-
- murano environment-create environment_name --region RegionOne
-
- If it is not specified a value from `home_region` option of `murano.conf`
- file will be used.
diff --git a/doc/source/reference/appendix/articles/murano_gerrit_dashboard.rst b/doc/source/reference/appendix/articles/murano_gerrit_dashboard.rst
deleted file mode 100644
index b23f0e097..000000000
--- a/doc/source/reference/appendix/articles/murano_gerrit_dashboard.rst
+++ /dev/null
@@ -1,57 +0,0 @@
-Murano Gerrit Dashboard
-=======================
-
-Description
------------
-If you would like to contribute to murano by reviewing patches to
-murano-related projects — you can use this gerrit dashboard, or create your own
-using
-`Gerrit Dash Creator `__
-
-URL
----
-
-::
-
- https://review.opendev.org/#/dashboard/?foreach=%28project%3A%5E.%2A%2F.%2Amurano.%2A+OR+project%3Aopenstack%2Fyaql%29+NOT+label%3AWorkflow%3C%3D%2D1+NOT+label%3ACode%2DReview%3C%3D%2D2+status%3Aopen&title=Murano&My+Patches=owner%3Aself&You+are+a+reviewer%2C+but+haven%27t+voted+in+the+current+revision=NOT+label%3ACode%2DReview%3C%3D2%2Cself+reviewer%3Aself+NOT+owner%3Aself&Need+Feedback=NOT+label%3ACode%2DReview%3C%3D2+NOT+label%3AVerified%3C%3D%2D1+NOT+owner%3Aself&Passed+Jenkins%2C+No+Negative+Feedback=label%3ACode%2DReview%3E%3D1+NOT+label%3ACode%2DReview%3C%3D%2D1+AND+NOT+label%3AVerified%3C%3D%2D1+NOT+owner%3Aself+NOT+reviewer%3Aself+limit%3A50&Maybe+Review%3F=NOT+owner%3Aself+NOT+reviewer%3Aself+limit%3A25&My+%2B1s=label%3ACode%2DReview%3D1%2Cself+limit%3A25&Need+final+%2B2=label%3ACode%2DReview%3E%3D2+NOT+label%3ACode%2DReview%3C%3D%2D1+NOT+label%3AVerified%3C%3D%2D1+NOT+label%3ACode%2DReview%3C%3D2%2Cself+NOT+owner%3Aself+limit%3A25&My+%2B2s=label%3ACode%2DReview%3D2%2Cself+limit%3A25
-
-`View this dashboard `__
-
-
-Configuration
--------------
-
-::
-
-
- [dashboard]
- title = Murano
- description = Murano Review Inbox
- foreach = (project:^.*/.*murano.* OR project:openstack/yaql) NOT label:Workflow<=-1 NOT label:Code-Review<=-2 status:open
-
- [section "My Patches"]
- query = owner:self
-
- [section "You are a reviewer, but haven't voted in the current revision"]
- query = NOT label:Code-Review<=2,self reviewer:self NOT owner:self
-
- [section "Need Feedback"]
- query = NOT label:Code-Review<=2 NOT label:Verified<=-1 NOT owner:self
-
- [section "Passed Jenkins, No Negative Feedback"]
- query = label:Code-Review>=1 NOT label:Code-Review<=-1 AND NOT label:Verified<=-1 NOT owner:self NOT reviewer:self limit:50
-
- [section "Maybe Review?"]
- query = NOT owner:self NOT reviewer:self limit:25
-
- [section "My +1s"]
- query = label:Code-Review=1,self limit:25
-
- [section "Need final +2"]
- query = label:Code-Review>=2 NOT label:Code-Review<=-1 NOT label:Verified<=-1 NOT label:Code-Review<=2,self NOT owner:self limit:25
-
- [section "My +2s"]
- query = label:Code-Review=2,self limit:25
-
-
-
diff --git a/doc/source/reference/appendix/articles/specification/index.rst b/doc/source/reference/appendix/articles/specification/index.rst
deleted file mode 100644
index 48bb53e49..000000000
--- a/doc/source/reference/appendix/articles/specification/index.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-===========================
-Murano API v1 specification
-===========================
-
-.. toctree::
- :maxdepth: 1
-
- overview
- murano-api
- murano-repository
- murano-env-temp
\ No newline at end of file
diff --git a/doc/source/reference/appendix/articles/specification/murano-api.rst b/doc/source/reference/appendix/articles/specification/murano-api.rst
deleted file mode 100644
index 80d0bc9a4..000000000
--- a/doc/source/reference/appendix/articles/specification/murano-api.rst
+++ /dev/null
@@ -1,1316 +0,0 @@
-==========
-Murano API
-==========
-
-Glossary
-========
-
-.. _glossary-environment:
-
-* **Environment**
-
- The environment is a set of applications managed by a single project (tenant). They could be related logically with each other or not.
- Applications within a single environment may comprise of complex configuration while applications in different environments are always
- independent from one another. Each environment is associated with a single OpenStack project.
-
-.. _glossary-sessions:
-
-* **Session**
-
- Since murano environments are available for local modification for different users and from different locations, it's needed to store local modifications somewhere.
- Sessions were created to provide this opportunity. After a user adds an application to the environment - a new session is created.
- After a user sends an environment to deploy, a session with a set of applications changes status to *deploying* and all other open sessions for that environment become invalid.
- One session could be deployed only once.
-
-* **Object Model**
-
- Applications are defined in MuranoPL object model, which is defined as a JSON object.
- The murano API doesn't know anything about it.
-
-* **Package**
-
- A .zip archive, containing instructions for an application deployment.
-
-* **Environment-Template**
- The environment template is the specification of a set of applications managed by a single project, which are
- related to each other. The environment template is stored in an environment template catalog, and it can be
- managed by the user (creation, deletion, updating). Finally, it can be deployed on OpenStack by translating
- into an environment.
-
-
-Environment API
-===============
-
-+----------------------+------------+-------------------------------------------+
-| Attribute | Type | Description |
-+======================+============+===========================================+
-| id | string | Unique ID |
-+----------------------+------------+-------------------------------------------+
-| name | string | User-friendly name |
-+----------------------+------------+-------------------------------------------+
-| created | datetime | Creation date and time in ISO format |
-+----------------------+------------+-------------------------------------------+
-| updated | datetime | Modification date and time in ISO format |
-+----------------------+------------+-------------------------------------------+
-| tenant_id | string | OpenStack project ID |
-+----------------------+------------+-------------------------------------------+
-| version | int | Current version |
-+----------------------+------------+-------------------------------------------+
-| networking | string | Network settings |
-+----------------------+------------+-------------------------------------------+
-| acquired_by | string | Id of a session that acquired this |
-| | | environment (for example is deploying it) |
-+----------------------+------------+-------------------------------------------+
-| status | string | Deployment status: ready, pending, |
-| | | deploying |
-+----------------------+------------+-------------------------------------------+
-
-**Common response codes**
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | Operation completed successfully |
-+----------------+-----------------------------------------------------------+
-| 403 | User is not authorized to perform the operation |
-+----------------+-----------------------------------------------------------+
-
-List environments
------------------
-
-*Request*
-
-
-+----------+----------------------------------+----------------------------------+
-| Method | URI | Description |
-+==========+==================================+==================================+
-| GET | /environments | Get a list of existing |
-| | | Environments |
-+----------+----------------------------------+----------------------------------+
-
-
-*Parameters:*
-
-* `all_tenants` - boolean, indicates whether environments from all projects are listed.
- *True* environments from all projects are listed. Admin user required.
- *False* environments only from current project are listed (default like option unspecified).
-
-* `tenant` - indicates environments from specified tenant are listed. Admin user required.
-
-*Response*
-
-
-This call returns a list of environments. Only the basic properties are
-returned.
-
-::
-
- {
- "environments": [
- {
- "status": "ready",
- "updated": "2014-05-14T13:02:54",
- "networking": {},
- "name": "test1",
- "created": "2014-05-14T13:02:46",
- "tenant_id": "726ed856965f43cc8e565bc991fa76c3",
- "version": 0,
- "id": "2fa5ab704749444bbeafe7991b412c33"
- },
- {
- "status": "ready",
- "updated": "2014-05-14T13:02:55",
- "networking": {},
- "name": "test2",
- "created": "2014-05-14T13:02:51",
- "tenant_id": "726ed856965f43cc8e565bc991fa76c3",
- "version": 0,
- "id": "744e44812da84e858946f5d817de4f72"
- }
- ]
- }
-
-Create environment
-------------------
-
-+----------------------+------------+--------------------------------------------------------+
-| Attribute | Type | Description |
-+======================+============+========================================================+
-| name | string | Environment name; at least one non-white space symbol |
-+----------------------+------------+--------------------------------------------------------+
-
-*Request*
-
-+----------+----------------------------------+----------------------------------+
-| Method | URI | Description |
-+==========+==================================+==================================+
-| POST | /environments | Create new Environment |
-+----------+----------------------------------+----------------------------------+
-
-* **Content-Type**
- application/json
-
-* **Example**
- {"name": "env_name"}
-
-*Response*
-
-::
-
- {
- "id": "ce373a477f211e187a55404a662f968",
- "name": "env_name",
- "created": "2013-11-30T03:23:42Z",
- "updated": "2013-11-30T03:23:44Z",
- "tenant_id": "0849006f7ce94961b3aab4e46d6f229a",
- "version": 0
- }
-
-
-Update environment
-------------------
-
-+----------------------+------------+--------------------------------------------------------+
-| Attribute | Type | Description |
-+======================+============+========================================================+
-| name | string | Environment name; at least one non-white space symbol |
-+----------------------+------------+--------------------------------------------------------+
-
-*Request*
-
-+----------+----------------------------------+----------------------------------+
-| Method | URI | Description |
-+==========+==================================+==================================+
-| PUT | /environments/ | Update an existing Environment |
-+----------+----------------------------------+----------------------------------+
-
-* **Content-Type**
- application/json
-
-* **Example**
- {"name": "env_name_changed"}
-
-*Response*
-
-**Content-Type**
- application/json
-
-::
-
- {
- "id": "ce373a477f211e187a55404a662f968",
- "name": "env_name_changed",
- "created": "2013-11-30T03:23:42Z",
- "updated": "2013-11-30T03:45:54Z",
- "tenant_id": "0849006f7ce94961b3aab4e46d6f229a",
- "version": 0
- }
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | Edited environment |
-+----------------+-----------------------------------------------------------+
-| 400 | Environment name must contain at least one non-white space|
-| | symbol |
-+----------------+-----------------------------------------------------------+
-| 403 | User is not authorized to access environment |
-+----------------+-----------------------------------------------------------+
-| 404 | Environment not found |
-+----------------+-----------------------------------------------------------+
-| 409 | Environment with specified name already exists |
-+----------------+-----------------------------------------------------------+
-
-Get environment details
------------------------
-
-*Request*
-
-Return information about the environment itself and about applications, including this environment.
-
-+----------+----------------------------------+-----------------------------------+----------------------------------+
-| Method | URI | Header | Description |
-+==========+==================================+===================================+==================================+
-| GET | /environments/{id} | X-Configuration-Session (optional)| Response detailed information |
-| | | | about Environment including |
-| | | | child entities |
-+----------+----------------------------------+-----------------------------------+----------------------------------+
-
-*Response*
-
-**Content-Type**
- application/json
-
-::
-
- {
- "status": "ready",
- "updated": "2014-05-14T13:12:26",
- "networking": {},
- "name": "quick-env-2",
- "created": "2014-05-14T13:09:55",
- "tenant_id": "726ed856965f43cc8e565bc991fa76c3",
- "version": 1,
- "services": [
- {
- "instance": {
- "flavor": "m1.medium",
- "image": "cloud-fedora-v3",
- "name": "exgchhv6nbika2",
- "ipAddresses": [
- "10.0.0.200"
- ],
- "?": {
- "type": "io.murano.resources.Instance",
- "id": "14cce9d9-aaa1-4f09-84a9-c4bb859edaff"
- }
- },
- "name": "rewt4w56",
- "?": {
- "status": "ready",
- "_26411a1861294160833743e45d0eaad9": {
- "name": "Telnet"
- },
- "type": "io.murano.apps.linux.Telnet",
- "id": "446373ef-03b5-4925-b095-6c56568fa518"
- }
- }
- ],
- "id": "20d4a012628e4073b48490a336a8acbf"
- }
-
-Delete environment
-------------------
-
-*Request*
-
-
-+----------+----------------------------------+----------------------------------+
-| Method | URI | Description |
-+==========+==================================+==================================+
-| DELETE | /environments/{id}?abandon | Remove specified Environment. |
-+----------+----------------------------------+----------------------------------+
-
-
-*Parameters:*
-
-* `abandon` - boolean, indicates how to delete environment. *False* is used if
- all resources used by environment must be destroyed; *True* is used when just
- database must be cleaned
-
-
-*Response*
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | OK. Environment deleted successfully |
-+----------------+-----------------------------------------------------------+
-| 403 | User is not allowed to delete this resource |
-+----------------+-----------------------------------------------------------+
-| 404 | Not found. Specified environment doesn`t exist |
-+----------------+-----------------------------------------------------------+
-
-
-Environment configuration API
-=============================
-
-Multiple :ref:`sessions ` could be opened for one environment
-simultaneously, but only one session going to be deployed. First session that
-starts deploying is going to be deployed; other ones become invalid and could
-not be deployed at all.
-User could not open new session for environment that in
-*deploying* state (that's why we call it "almost lock free" model).
-
-+----------------------+------------+-------------------------------------------+
-| Attribute | Type | Description |
-+======================+============+===========================================+
-| id | string | Session unique ID |
-+----------------------+------------+-------------------------------------------+
-| environment\_id | string | Environment that going to be modified |
-| | | during this session |
-+----------------------+------------+-------------------------------------------+
-| created | datetime | Creation date and time in ISO format |
-+----------------------+------------+-------------------------------------------+
-| updated | datetime | Modification date and time in ISO format |
-+----------------------+------------+-------------------------------------------+
-| user\_id | string | Session owner ID |
-+----------------------+------------+-------------------------------------------+
-| version | int | Environment version for which |
-| | | configuration session is opened |
-+----------------------+------------+-------------------------------------------+
-| state | string | Session state. Could be: open, deploying, |
-| | | deployed |
-+----------------------+------------+-------------------------------------------+
-
-Configure environment / open session
-------------------------------------
-
-During this call a new working session is created with its ID returned in response body.
-Notice that the session ID should be added to request headers with name ``X-Configuration-Session``
-in subsequent requests when necessary.
-
-*Request*
-
-
-+----------+----------------------------------+----------------------------------+
-| Method | URI | Description |
-+==========+==================================+==================================+
-| POST | /environments//configure | Creating new configuration |
-| | | session |
-+----------+----------------------------------+----------------------------------+
-
-*Response*
-
-**Content-Type**
- application/json
-
-::
-
- {
- "id": "257bef44a9d848daa5b2563779714820",
- "updated": datetime.datetime(2014, 5, 14, 14, 17, 58, 949358),
- "environment_id": "744e44812da84e858946f5d817de4f72",
- "ser_id": "4e91d06270c54290b9dbdf859356d3b3",
- "created": datetime.datetime(2014, 5, 14, 14, 17, 58, 949305),
- "state": "open",
- "version": 0L
- }
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | Session created successfully |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to access this session |
-+----------------+-----------------------------------------------------------+
-| 403 | Could not open session for environment, environment has |
-| | deploying status |
-+----------------+-----------------------------------------------------------+
-| 404 | Not found. Specified environment doesn`t exist |
-+----------------+-----------------------------------------------------------+
-
-
-Deploy session
---------------
-
-With this request all local changes made within the environment start to deploy on OpenStack.
-
-*Request*
-
-+----------+---------------------------------+--------------------------------+
-| Method | URI | Description |
-+==========+=================================+================================+
-| POST | /environments//sessions/| Deploy changes made in session |
-| | /deploy | with specified session_id |
-+----------+---------------------------------+--------------------------------+
-
-*Response*
-
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | Session status changes to *deploying* |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to access this session |
-+----------------+-----------------------------------------------------------+
-| 403 | Session is already deployed or deployment is in progress |
-+----------------+-----------------------------------------------------------+
-| 404 | Not found. Specified session or environment doesn`t exist |
-+----------------+-----------------------------------------------------------+
-
-Get session details
--------------------
-
-*Request*
-
-+----------+---------------------------------+---------------------------+
-| Method | URI | Description |
-+==========+=================================+===========================+
-| GET | /environments//sessions/| Get details about session |
-| | | with specified session_id |
-+----------+---------------------------------+---------------------------+
-
-*Response*
-
-
-::
-
- {
- "id": "4aecdc2178b9430cbbb8db44fb7ac384",
- "environment_id": "4dc8a2e8986fa8fa5bf24dc8a2e8986fa8",
- "created": "2013-11-30T03:23:42Z",
- "updated": "2013-11-30T03:23:54Z",
- "user_id": "d7b501094caf4daab08469663a9e1a2b",
- "version": 0,
- "state": "deploying"
- }
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | Session details information received |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to access this session |
-+----------------+-----------------------------------------------------------+
-| 403 | Session is invalid |
-+----------------+-----------------------------------------------------------+
-| 404 | Not found. Specified session or environment doesn`t exist |
-+----------------+-----------------------------------------------------------+
-
-Delete session
---------------
-
-*Request*
-
-+----------+---------------------------------+----------------------------------+
-| Method | URI | Description |
-+==========+=================================+==================================+
-| DELETE | /environments//sessions/| Delete session with specified |
-| | | session_id |
-+----------+---------------------------------+----------------------------------+
-
-*Response*
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | Session is deleted successfully |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to access this session |
-+----------------+-----------------------------------------------------------+
-| 403 | Session is in deploying state and could not be deleted |
-+----------------+-----------------------------------------------------------+
-| 404 | Not found. Specified session or environment doesn`t exist |
-+----------------+-----------------------------------------------------------+
-
-Environment model API
-=====================
-
-Get environment model
----------------------
-
-+----------+-------------------------------------+------------------------+--------------------------+
-| Method | URI | Header | Description |
-+==========+=====================================+========================+==========================+
-| GET | /environments//model/ | X-Configuration-Session| Get an Environment model |
-| | | (optional) | |
-+----------+-------------------------------------+------------------------+--------------------------+
-
-Specifying allows to get a specific section of the model, for example
-`defaultNetworks`, `region` or `?` or any of the subsections.
-
-*Response*
-
-**Content-Type**
- application/json
-
-.. code-block:: javascript
-
- {
- "defaultNetworks": {
- "environment": {
- "internalNetworkName": "net_two",
- "?": {
- "type": "io.murano.resources.ExistingNeutronNetwork",
- "id": "594e94fcfe4c48ef8f9b55edb3b9f177"
- }
- },
- "flat": null
- },
- "region": "RegionTwo",
- "name": "new_env",
- "regions": {
- "": {
- "defaultNetworks": {
- "environment": {
- "autoUplink": true,
- "name": "new_env-network",
- "externalRouterId": null,
- "dnsNameservers": [],
- "autogenerateSubnet": true,
- "subnetCidr": null,
- "openstackId": null,
- "?": {
- "dependencies": {
- "onDestruction": [{
- "subscriber": "c80e33dd67a44f489b2f04818b72f404",
- "handler": null
- }]
- },
- "type": "io.murano.resources.NeutronNetwork/0.0.0@io.murano",
- "id": "e145b50623c04a68956e3e656a0568d3",
- "name": null
- },
- "regionName": "RegionOne"
- },
- "flat": null
- },
- "name": "RegionOne",
- "?": {
- "type": "io.murano.CloudRegion/0.0.0@io.murano",
- "id": "c80e33dd67a44f489b2f04818b72f404",
- "name": null
- }
- },
- "RegionOne": "c80e33dd67a44f489b2f04818b72f404",
- "RegionTwo": {
- "defaultNetworks": {
- "environment": {
- "autoUplink": true,
- "name": "new_env-network",
- "externalRouterId": "e449bdd5-228c-4747-a925-18cda80fbd6b",
- "dnsNameservers": ["8.8.8.8"],
- "autogenerateSubnet": true,
- "subnetCidr": "10.0.198.0/24",
- "openstackId": "00a695c1-60ff-42ec-acb9-b916165413da",
- "?": {
- "dependencies": {
- "onDestruction": [{
- "subscriber": "f8cb28d147914850978edb35eca156e1",
- "handler": null
- }]
- },
- "type": "io.murano.resources.NeutronNetwork/0.0.0@io.murano",
- "id": "72d2c13c600247c98e09e2e3c1cd9d70",
- "name": null
- },
- "regionName": "RegionTwo"
- },
- "flat": null
- },
- "name": "RegionTwo",
- "?": {
- "type": "io.murano.CloudRegion/0.0.0@io.murano",
- "id": "f8cb28d147914850978edb35eca156e1",
- "name": null
- }
- }
- },
- services: []
- "?": {
- "type": "io.murano.Environment/0.0.0@io.murano",
- "_actions": {
- "f7f22c174070455c9cafc59391402bdc_deploy": {
- "enabled": true,
- "name": "deploy",
- "title": "deploy"
- }
- },
- "id": "f7f22c174070455c9cafc59391402bdc",
- "name": null
- }
- }
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | Environment model received successfully |
-+----------------+-----------------------------------------------------------+
-| 403 | User is not authorized to access environment |
-+----------------+-----------------------------------------------------------+
-| 404 | Environment is not found or specified section of the |
-| | model does not exist |
-+----------------+-----------------------------------------------------------+
-
-Update environment model
-------------------------
-
-*Request*
-
-+----------+--------------------------------+------------------------+-----------------------------+
-| Method | URI | Header | Description |
-+==========+================================+========================+=============================+
-| PATCH | /environments//model/ | X-Configuration-Session| Update an Environment model |
-+----------+--------------------------------+------------------------+-----------------------------+
-
-* **Content-Type**
- application/env-model-json-patch
-
- Allowed operations for paths:
-
- * "" (model root): no operations
- * "defaultNetworks": "replace"
- * "defaultNetworks/environment": "replace"
- * "defaultNetworks/environment/?/id": no operations
- * "defaultNetworks/flat": "replace"
- * "name": "replace"
- * "region": "replace"
- * "?/type": "replace"
- * "?/id": no operations
-
- For other paths any operation (add, replace or remove) is allowed.
-
-* **Example of request body with JSON-patch**
-
-.. code-block:: javascript
-
- [{
- "op": "replace",
- "path": "/defaultNetworks/flat",
- "value": true
- }]
-
-*Response*
-
-**Content-Type**
- application/json
-
-See *GET* request response.
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | Environment is edited successfully |
-+----------------+-----------------------------------------------------------+
-| 400 | Body format is invalid |
-+----------------+-----------------------------------------------------------+
-| 403 | User is not authorized to access environment or specified |
-| | operation is forbidden for the given property |
-+----------------+-----------------------------------------------------------+
-| 404 | Environment is not found or specified section of the |
-| | model does not exist |
-+----------------+-----------------------------------------------------------+
-
-Environment deployments API
-===========================
-
-Environment deployment API allows to track changes of environment status, deployment events and errors.
-It also allows to browse deployment history.
-
-List Deployments
-----------------
-
-Returns information about all deployments of the specified environment.
-
-*Request*
-
-+----------+------------------------------------+--------------------------------------+
-| Method | URI | Description |
-+==========+====================================+======================================+
-| GET | /environments//deployments | Get list of environment deployments |
-+----------+------------------------------------+--------------------------------------+
-| GET | /deployments | Get list of deployments for all |
-| | | environments in user's project |
-+----------+------------------------------------+--------------------------------------+
-
-*Response*
-
-**Content-Type**
- application/json
-
-::
-
- {
- "deployments": [
- {
- "updated": "2014-05-15T07:24:21",
- "environment_id": "744e44812da84e858946f5d817de4f72",
- "description": {
- "services": [
- {
- "instance": {
- "flavor": "m1.medium",
- "image": "cloud-fedora-v3",
- "?": {
- "type": "io.murano.resources.Instance",
- "id": "ef729199-c71e-4a4c-a314-0340e279add8"
- },
- "name": "xkaduhv7qeg4m7"
- },
- "name": "teslnet1",
- "?": {
- "_26411a1861294160833743e45d0eaad9": {
- "name": "Telnet"
- },
- "type": "io.murano.apps.linux.Telnet",
- "id": "6e437be2-b5bc-4263-8814-6fd57d6ddbd5"
- }
- }
- ],
- "defaultNetworks": {
- "environment": {
- "name": "test2-network",
- "?": {
- "type": "io.murano.lib.networks.neutron.NewNetwork",
- "id": "b6a1d515434047d5b4678a803646d556"
- }
- },
- "flat": null
- },
- "name": "test2",
- "?": {
- "type": "io.murano.Environment",
- "id": "744e44812da84e858946f5d817de4f72"
- }
- },
- "created": "2014-05-15T07:24:21",
- "started": "2014-05-15T07:24:21",
- "finished": null,
- "state": "running",
- "id": "327c81e0e34a4c93ad9b9052ef42b752"
- }
- ]
- }
-
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | Deployments information received successfully |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to access this environment |
-+----------------+-----------------------------------------------------------+
-
-Application management API
-==========================
-
-All applications should be created within an environment and all environment modifications are held within the session.
-Local changes apply only after successful deployment of an environment session.
-
-Get application details
------------------------
-
-Using GET requests to applications endpoint user works with list containing all
-applications for specified environment. A user can request a whole list,
-specific application, or specific attribute of a specific application using tree
-traversing. To request a specific application, the user should add to endpoint part
-an application id, e.g.: */environments//services/*. For
-selection of specific attribute on application, simply appending part with
-attribute name will work. For example to request application name, user
-should use next endpoint: */environments//services//name*
-
-*Request*
-
-+----------------+-----------------------------------------------------------+------------------------------------+
-| Method | URI | Header |
-+================+===========================================================+====================================+
-| GET | /environments//services/ | X-Configuration-Session (optional) |
-+----------------+-----------------------------------------------------------+------------------------------------+
-
-**Parameters:**
-
-* `env_id` - environment ID, required
-* `app_id` - application ID, optional
-
-*Response*
-
-**Content-Type**
- application/json
-
-::
-
- {
- "instance": {
- "flavor": "m1.medium",
- "image": "cloud-fedora-v3",
- "?": {
- "type": "io.murano.resources.Instance",
- "id": "060715ff-7908-4982-904b-3b2077ff55ef"
- },
- "name": "hbhmyhv6qihln3"
- },
- "name": "dfg34",
- "?": {
- "status": "pending",
- "_26411a1861294160833743e45d0eaad9": {
- "name": "Telnet"
- },
- "type": "io.murano.apps.linux.Telnet",
- "id": "6e7b8ad5-888d-4c5a-a498-076d092a7eff"
- }
- }
-
-Create new application
-----------------------
-
-Create a new application and add it to the murano environment.
-Result JSON is calculated in Murano dashboard, which is based on `UI definition `_.
-
-*Request*
-
-**Content-Type**
- application/json
-
-+----------------+-----------------------------------------------------------+------------------------------------+
-| Method | URI | Header |
-+================+===========================================================+====================================+
-| POST | /environments//services | X-Configuration-Session |
-+----------------+-----------------------------------------------------------+------------------------------------+
-
-::
-
- {
- "instance": {
- "flavor": "m1.medium",
- "image": "clod-fedora-v3",
- "?": {
- "type": "io.murano.resources.Instance",
- "id": "bce8308e-5938-408b-a27a-0d3f0a2c52eb"
- },
- "name": "nhekhv6r7mhd4"
- },
- "name": "sdf34sadf",
- "?": {
- "_26411a1861294160833743e45d0eaad9": {
- "name": "Telnet"
- },
- "type": "io.murano.apps.linux.Telnet",
- "id": "190c8705-5784-4782-83d7-0ab55a1449aa"
- }
- }
-
-
-*Response*
-
-Created application returned
-
-
-**Content-Type**
- application/json
-
-::
-
- {
- "instance": {
- "flavor": "m1.medium",
- "image": "cloud-fedora-v3",
- "?": {
- "type": "io.murano.resources.Instance",
- "id": "bce8308e-5938-408b-a27a-0d3f0a2c52eb"
- },
- "name": "nhekhv6r7mhd4"
- },
- "name": "sdf34sadf",
- "?": {
- "_26411a1861294160833743e45d0eaad9": {
- "name": "Telnet"
- },
- "type": "io.murano.apps.linux.Telnet",
- "id": "190c8705-5784-4782-83d7-0ab55a1449a1"
- }
- }
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | Application was created successfully |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to perform this action |
-+----------------+-----------------------------------------------------------+
-| 403 | Policy prevents this user from performing this action |
-+----------------+-----------------------------------------------------------+
-| 404 | Not found. Environment doesn't exist |
-+----------------+-----------------------------------------------------------+
-| 400 | Required header or body are not provided |
-+----------------+-----------------------------------------------------------+
-
-Update applications
--------------------
-
-Applications list for environment can be updated.
-
-*Request*
-
-**Content-Type**
- application/json
-
-+----------------+-----------------------------------------------------------+------------------------------------+
-| Method | URI | Header |
-+================+===========================================================+====================================+
-| PUT | /environments//services | X-Configuration-Session |
-+----------------+-----------------------------------------------------------+------------------------------------+
-
-::
-
- [{
- "instance": {
- "availabilityZone": "nova",
- "name": "apache-instance",
- "assignFloatingIp": true,
- "keyname": "",
- "flavor": "m1.small",
- "image": "146d5523-7b2d-4abc-b0d0-2041f920ce26",
- "?": {
- "type": "io.murano.resources.LinuxMuranoInstance",
- "id": "25185cb6f29b415fa2e438309827a797"
- }
- },
- "name": "ApacheHttpServer",
- "enablePHP": true,
- "?": {
- "type": "com.example.apache.ApacheHttpServer",
- "id": "6e66106d7dcb4748a5c570150a3df80f"
- }
- }]
-
-
-*Response*
-
-Updated applications list returned
-
-
-**Content-Type**
- application/json
-
-::
-
- [{
- "instance": {
- "availabilityZone": "nova",
- "name": "apache-instance",
- "assignFloatingIp": true,
- "keyname": "",
- "flavor": "m1.small",
- "image": "146d5523-7b2d-4abc-b0d0-2041f920ce26",
- "?": {
- "type": "io.murano.resources.LinuxMuranoInstance",
- "id": "25185cb6f29b415fa2e438309827a797"
- }
- },
- "name": "ApacheHttpServer",
- "enablePHP": true,
- "?": {
- "type": "com.example.apache.ApacheHttpServer",
- "id": "6e66106d7dcb4748a5c570150a3df80f"
- }
- }]
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | Services are updated successfully |
-+----------------+-----------------------------------------------------------+
-| 400 | Required header is not provided |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized |
-+----------------+-----------------------------------------------------------+
-| 403 | Session is in deploying state and could not be updated |
-| | or user is not allowed to update services |
-+----------------+-----------------------------------------------------------+
-| 404 | Not found. Specified environment and/or session do not |
-| | exist |
-+----------------+-----------------------------------------------------------+
-
-Delete application from environment
------------------------------------
-
-Delete one or all applications from the environment
-
-*Request*
-
-+----------------+-----------------------------------------------------------+-----------------------------------+
-| Method | URI | Header |
-+================+===========================================================+===================================+
-| DELETE | /environments//services/ | X-Configuration-Session(optional) |
-+----------------+-----------------------------------------------------------+-----------------------------------+
-
-**Parameters:**
-
-* `env_id` - environment ID, required
-* `app_id` - application ID, optional
-
-Statistic API
-=============
-
-Statistic API intends to provide billing feature
-
-Instance environment statistics
--------------------------------
-
-*Request*
-
-Get information about all deployed instances in the specified environment
-
-+----------------+--------------------------------------------------------------+
-| Method | URI |
-+================+==============================================================+
-| GET | /environments//instance-statistics/raw/ |
-+----------------+--------------------------------------------------------------+
-
-**Parameters:**
-
-* `env_id` - environment ID, required
-* `instance_id` - ID of the instance for which need to provide statistic information, optional
-
-*Response*
-
-
-+----------------------+------------+-----------------------------------------------------------------+
-| Attribute | Type | Description |
-+======================+============+=================================================================+
-| type | int | Code of the statistic object; 200 - instance, 100 - application |
-+----------------------+------------+-----------------------------------------------------------------+
-| type_name | string | Class name of the statistic object |
-+----------------------+------------+-----------------------------------------------------------------+
-| instance_id | string | Id of deployed instance |
-+----------------------+------------+-----------------------------------------------------------------+
-| active | bool | Instance status |
-+----------------------+------------+-----------------------------------------------------------------+
-| type_title | string | User-friendly name for browsing statistic in UI |
-+----------------------+------------+-----------------------------------------------------------------+
-| duration | int | Seconds of instance uptime |
-+----------------------+------------+-----------------------------------------------------------------+
-
-**Content-Type**
- application/json
-
-::
-
- [
- {
- "type": 200,
- "type_name": "io.murano.resources.Instance",
- "instance_id": "ef729199-c71e-4a4c-a314-0340e279add8",
- "active": true,
- "type_title": null,
- "duration": 1053,
- }
- ]
-
-*Request*
-
-+----------------+--------------------------------------------------------------+
-| Method | URI |
-+================+==============================================================+
-| GET | /environments//instance-statistics/aggregated |
-+----------------+--------------------------------------------------------------+
-
-*Response*
-
-+----------------------+------------+-----------------------------------------------------------------+
-| Attribute | Type | Description |
-+======================+============+=================================================================+
-| type | int | Code of the statistic object; 200 - instance, 100 - application |
-+----------------------+------------+-----------------------------------------------------------------+
-| duration | int | Amount uptime of specified type objects |
-+----------------------+------------+-----------------------------------------------------------------+
-| count | int | Quantity of specified type objects |
-+----------------------+------------+-----------------------------------------------------------------+
-
-**Content-Type**
- application/json
-
- ::
-
- [
- {
- "duration": 720,
- "count": 2,
- "type": 200
- }
- ]
-
-General Request Statistics
---------------------------
-
-*Request*
-
-+----------------+---------------+
-| Method | URI |
-+================+===============+
-| GET | /stats |
-+----------------+---------------+
-
-*Response*
-
-+----------------------+------------+-----------------------------------------------------------------+
-| Attribute | Type | Description |
-+======================+============+=================================================================+
-| requests_per_tenant | int | Number of incoming requests for user project |
-+----------------------+------------+-----------------------------------------------------------------+
-| errors_per_second | int | Class name of the statistic object |
-+----------------------+------------+-----------------------------------------------------------------+
-| errors_count | int | Class name of the statistic object |
-+----------------------+------------+-----------------------------------------------------------------+
-| requests_per_second | float | Average number of incoming request received in one second |
-+----------------------+------------+-----------------------------------------------------------------+
-| requests_count | int | Number of all requests sent to the server |
-+----------------------+------------+-----------------------------------------------------------------+
-| cpu_percent | bool | Current cpu usage |
-+----------------------+------------+-----------------------------------------------------------------+
-| cpu_count | int | Available cpu power is ``cpu_count * 100%`` |
-+----------------------+------------+-----------------------------------------------------------------+
-| host | string | Server host-name |
-+----------------------+------------+-----------------------------------------------------------------+
-| average_response_time| float | Average time response waiting, seconds |
-+----------------------+------------+-----------------------------------------------------------------+
-
-**Content-Type**
- application/json
-
-::
-
- [
- {
- "updated": "2014-05-15T08:26:17",
- "requests_per_tenant": "{\"726ed856965f43cc8e565bc991fa76c3\": 313}",
- "created": "2014-04-29T13:23:59",
- "cpu_count": 2,
- "errors_per_second": 0,
- "requests_per_second": 0.0266528,
- "cpu_percent": 21.7,
- "host": "fervent-VirtualBox",
- "error_count": 0,
- "request_count": 320,
- "id": 1,
- "average_response_time": 0.55942
- }
- ]
-
-
-Actions API
-===========
-
-Murano actions are simple MuranoPL methods, that can be called on deployed applications.
-Application contains a list with available actions. Actions may return a result.
-
-Execute an action
------------------
-
-Generate task with executing specified action. Input parameters may be provided.
-
-*Request*
-
-**Content-Type**
- application/json
-
-+----------------+-----------------------------------------------------------+------------------------------------+
-| Method | URI | Header |
-+================+===========================================================+====================================+
-| POST | /environments//actions/ | |
-+----------------+-----------------------------------------------------------+------------------------------------+
-
-**Parameters:**
-
-* `env_id` - environment ID, required
-* `actions_id` - action ID to execute, required
-
-::
-
- "{: value}"
-
- or
-
- "{}" in case action has no properties
-
-*Response*
-
-Task ID that executes specified action is returned
-
-**Content-Type**
- application/json
-
-::
-
- {
- "task_id": "620e883070ad40a3af566d465aa156ef"
- }
-
-GET action result
------------------
-
-Request result value after action execution finish. Not all actions have return values.
-
-
-*Request*
-
-+----------------+-----------------------------------------------------------+------------------------------------+
-| Method | URI | Header |
-+================+===========================================================+====================================+
-| GET | /environments//actions/ | |
-+----------------+-----------------------------------------------------------+------------------------------------+
-
-**Parameters:**
-
-* `env_id` - environment ID, required
-* `task_id` - task ID, generated on desired action execution
-
-*Response*
-
-Json, describing action result is returned. Result type and value are provided.
-
-**Content-Type**
- application/json
-
-::
-
- {
- "isException": false,
- "result": ["item1", "item2"]
- }
-
-
-Static Actions API
-==================
-
-Static actions are MuranoPL methods that can be called on a MuranoPL class
-without deploying actual applications and usually return a result.
-
-Execute a static action
------------------------
-
-Invoke public static method of the specified MuranoPL class.
-Input parameters may be provided if method requires them.
-
-*Request*
-
-**Content-Type**
- application/json
-
-+----------------+-----------------------------------------------------------+------------------------------------+
-| Method | URI | Header |
-+================+===========================================================+====================================+
-| POST | /actions | |
-+----------------+-----------------------------------------------------------+------------------------------------+
-
-::
-
- {
- "className": "my.class.fqn",
- "methodName": "myMethod",
- "packageName": "optional.package.fqn",
- "classVersion": "1.2.3",
- "parameters": {
- "arg1": "value1",
- "arg2": "value2"
- }
- }
-
-+-----------------+------------+-----------------------------------------------------------------------------+
-| Attribute | Type | Description |
-+=================+============+=============================================================================+
-| className | string | Fully qualified name of MuranoPL class with static method |
-+-----------------+------------+-----------------------------------------------------------------------------+
-| methodName | string | Name of the method to invoke |
-+-----------------+------------+-----------------------------------------------------------------------------+
-| packageName | string | Fully qualified name of a package with the MuranoPL class (optional) |
-+-----------------+------------+-----------------------------------------------------------------------------+
-| classVersion | string | Class version specification, "=0" by default |
-+-----------------+------------+-----------------------------------------------------------------------------+
-| parameters | object | Key-value pairs of method parameter names and their values, "{}" by default |
-+-----------------+------------+-----------------------------------------------------------------------------+
-
-*Response*
-
-JSON-serialized result of the static method execution.
-
-HTTP codes:
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | OK. Action was executed successfully |
-+----------------+-----------------------------------------------------------+
-| 400 | Bad request. The format of the body is invalid, method |
-| | doesn't match provided arguments, mandatory arguments are |
-| | not provided |
-+----------------+-----------------------------------------------------------+
-| 403 | User is not allowed to execute the action |
-+----------------+-----------------------------------------------------------+
-| 404 | Not found. Specified class, package or method doesn't |
-| | exist or method is not exposed |
-+----------------+-----------------------------------------------------------+
-| 503 | Unhandled exception in the action |
-+----------------+-----------------------------------------------------------+
diff --git a/doc/source/reference/appendix/articles/specification/murano-env-temp.rst b/doc/source/reference/appendix/articles/specification/murano-env-temp.rst
deleted file mode 100644
index efc33bccd..000000000
--- a/doc/source/reference/appendix/articles/specification/murano-env-temp.rst
+++ /dev/null
@@ -1,591 +0,0 @@
-Environment template API
-========================
-
-Manage environment template definitions in murano. It is possible to create, update, delete, and deploy into OpenStack by translating
-it into an environment. In addition, applications can be added to or deleted from the environment template.
-
-**Environment Template Properties**
-
-+----------------------+------------+-------------------------------------------+
-| Attribute | Type | Description |
-+======================+============+===========================================+
-| id | string | Unique ID |
-+----------------------+------------+-------------------------------------------+
-| name | string | User-friendly name |
-+----------------------+------------+-------------------------------------------+
-| created | datetime | Creation date and time in ISO format |
-+----------------------+------------+-------------------------------------------+
-| updated | datetime | Modification date and time in ISO format |
-+----------------------+------------+-------------------------------------------+
-| tenant_id | string | OpenStack project |
-+----------------------+------------+-------------------------------------------+
-| version | int | Current version |
-+----------------------+------------+-------------------------------------------+
-| networking | string | Network settings |
-+----------------------+------------+-------------------------------------------+
-| description | string | The environment template specification |
-+----------------------+------------+-------------------------------------------+
-
-**Common response codes**
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | Operation completed successfully |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to perform the operation |
-+----------------+-----------------------------------------------------------+
-
-Methods for Environment Template API
-
-List Environments Templates
----------------------------
-
-*Request*
-
-+----------+----------------------------------+----------------------------------+
-| Method | URI | Description |
-+==========+==================================+==================================+
-| GET | /templates | Get a list of existing |
-| | | environment templates |
-+----------+----------------------------------+----------------------------------+
-
-*Parameters:*
-
-* `is_public` - boolean, indicates whether public environment templates are listed or not.
- *True* public environments templates from all projects are listed.
- *False* private environments templates from current project are listed
- *empty* all project templates plus public templates from all projects are listed
-
-*Response*
-
-This call returns a list of environment templates. Only the basic properties are
-returned.
-
-::
-
- {
- "templates": [
- {
- "updated": "2014-05-14T13:02:54",
- "networking": {},
- "name": "test1",
- "created": "2014-05-14T13:02:46",
- "tenant_id": "726ed856965f43cc8e565bc991fa76c3",
- "version": 0,
- "is_public": false,
- "id": "2fa5ab704749444bbeafe7991b412c33"
- },
- {
- "updated": "2014-05-14T13:02:55",
- "networking": {},
- "name": "test2",
- "created": "2014-05-14T13:02:51",
- "tenant_id": "123452452345346345634563456345346",
- "version": 0,
- "is_public": true,
- "id": "744e44812da84e858946f5d817de4f72"
- }
- ]
- }
-
-
-Create environment template
----------------------------
-
-+----------------------+------------+---------------------------------------------------------+
-| Attribute | Type | Description |
-+======================+============+=========================================================+
-| name | string | Environment template name; only alphanumeric characters |
-| | and '-' | |
-+----------------------+------------+---------------------------------------------------------+
-
-*Request*
-
-+----------+--------------------------------+--------------------------------------+
-| Method | URI | Description |
-+==========+================================+======================================+
-| POST | /templates | Create a new environment template |
-+----------+--------------------------------+--------------------------------------+
-
-*Content-Type*
- application/json
-
-*Example*
- {"name": "env_temp_name"}
-
-*Response*
-
-::
-
- {
- "id": "ce373a477f211e187a55404a662f968",
- "name": "env_temp_name",
- "created": "2013-11-30T03:23:42Z",
- "updated": "2013-11-30T03:23:44Z",
- "tenant_id": "0849006f7ce94961b3aab4e46d6f229a",
- }
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | Operation completed successfully |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to perform the operation |
-+----------------+-----------------------------------------------------------+
-| 409 | The environment template already exists |
-+----------------+-----------------------------------------------------------+
-
-
-Get environment templates details
----------------------------------
-
-*Request*
-
-Return information about environment template itself and about applications, including to this
-environment template.
-
-+----------+--------------------------------+-------------------------------------------------+
-| Method | URI | Description |
-+==========+================================+=================================================+
-| GET | /templates/{env-temp-id} | Obtains the environment template information |
-+----------+--------------------------------+-------------------------------------------------+
-
-* `env-temp-id` - environment template ID, required
-
-*Response*
-
-*Content-Type*
- application/json
-
-::
-
- {
- "updated": "2015-01-26T09:12:51",
- "networking":
- {
- },
- "name": "template_name",
- "created": "2015-01-26T09:12:51",
- "tenant_id": "00000000000000000000000000000001",
- "version": 0,
- "id": "aa9033ca7ce245fca10e38e1c8c4bbf7",
- }
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | OK. Get environment template details successfully |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to access this session |
-+----------------+-----------------------------------------------------------+
-| 404 | The environment template does not exist |
-+----------------+-----------------------------------------------------------+
-
-Delete environment template
----------------------------
-
-*Request*
-
-+----------+-----------------------------------+-----------------------------------+
-| Method | URI | Description |
-+==========+===================================+===================================+
-| DELETE | /templates/ | Delete the template id |
-+----------+-----------------------------------+-----------------------------------+
-
-
-*Parameters:*
-
-* `env-temp_id` - environment template ID, required
-
-*Response*
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | OK. Environment Template deleted successfully |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to access this session |
-+----------------+-----------------------------------------------------------+
-| 404 | The environment template does not exist |
-+----------------+-----------------------------------------------------------+
-
-Adding application to environment template
-------------------------------------------
-
-*Request*
-
-+----------+------------------------------------+----------------------------------+
-| Method | URI | Description |
-+==========+====================================+==================================+
-| POST | /templates/{env-temp-id}/services | Create a new application |
-+----------+------------------------------------+----------------------------------+
-
-*Parameters:*
-
-* `env-temp-id` - The environment-template id, required
-* payload - the service description
-
-*Content-Type*
- application/json
-
-*Example*
-
-::
-
- {
- "instance": {
- "assignFloatingIp": "true",
- "keyname": "mykeyname",
- "image": "cloud-fedora-v3",
- "flavor": "m1.medium",
- "?": {
- "type": "io.murano.resources.LinuxMuranoInstance",
- "id": "ef984a74-29a4-45c0-b1dc-2ab9f075732e"
- }
- },
- "name": "orion",
- "port": "8080",
- "?": {
- "type": "io.murano.apps.apache.Tomcat",
- "id": "54cea43d-5970-4c73-b9ac-fea656f3c722"
- }
- }
-
-*Response*
-
-::
-
-
- {
- "instance":
- {
- "assignFloatingIp": "true",
- "keyname": "mykeyname",
- "image": "cloud-fedora-v3",
- "flavor": "m1.medium",
- "?":
- {
- "type": "io.murano.resources.LinuxMuranoInstance",
- "id": "ef984a74-29a4-45c0-b1dc-2ab9f075732e"
- }
- },
- "name": "orion",
- "?":
- {
- "type": "io.murano.apps.apache.Tomcat",
- "id": "54cea43d-5970-4c73-b9ac-fea656f3c722"
- },
- "port": "8080"
- }
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | OK. Application added successfully |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to access this session |
-+----------------+-----------------------------------------------------------+
-| 404 | The environment template does not exist |
-+----------------+-----------------------------------------------------------+
-
-Delete application from an environment template
------------------------------------------------
-
-*Request*
-
-+----------+---------------------------------------------+--------------------------------------+
-| Method | URI | Description |
-+==========+=============================================+======================================+
-| DELETE | /templates/{env-temp-id}/services/{app-id} | Delete application with Specified id |
-+----------+---------------------------------------------+--------------------------------------+
-
-*Parameters:*
-
-* `env-temp-id` - The environment template ID, required
-* `app-id` - The application ID, required
-
-*Content-Type*
- application/json
-
-*Response*
-
-
-::
-
- {
- "updated": "2015-01-26T09:12:51",
- "services": [],
- "name": "template_name",
- "created": "2015-01-26T09:12:51",
- "tenant_id": "00000000000000000000000000000001",
- "version": 0,
- "id": "aa9033ca7ce245fca10e38e1c8c4bbf7",
- }
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | OK. Application deleted successfully |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to access this session |
-+----------------+-----------------------------------------------------------+
-| 404 | The application does not exist |
-+----------------+-----------------------------------------------------------+
-
-Get applications information from an environment template
----------------------------------------------------------
-
-*Request*
-
-+----------+-------------------------------------+-----------------------------------+
-| Method | URI | Description |
-+==========+=====================================+===================================+
-| GET | /templates/{env-temp-id}/services | It obtains the service description|
-+----------+-------------------------------------+-----------------------------------+
-
-*Parameters:*
-
-* `env-temp-id` - The environment template ID, required
-
-*Content-Type*
- application/json
-
-*Response*
-
-::
-
- [
- {
- "instance":
- {
- "assignFloatingIp": "true",
- "keyname": "mykeyname",
- "image": "cloud-fedora-v3",
- "flavor": "m1.medium",
- "?":
- {
- "type": "io.murano.resources.LinuxMuranoInstance",
- "id": "ef984a74-29a4-45c0-b1dc-2ab9f075732e"
- }
- },
- "name": "tomcat",
- "?":
- {
- "type": "io.murano.apps.apache.Tomcat",
- "id": "54cea43d-5970-4c73-b9ac-fea656f3c722"
- },
- "port": "8080"
- },
- {
- "instance": "ef984a74-29a4-45c0-b1dc-2ab9f075732e",
- "password": "XXX",
- "name": "mysql",
- "?":
- {
- "type": "io.murano.apps.database.MySQL",
- "id": "54cea43d-5970-4c73-b9ac-fea656f3c722"
- }
- }
- ]
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | OK. Application information received successfully |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to access this session |
-+----------------+-----------------------------------------------------------+
-| 404 | The environment template does not exist |
-+----------------+-----------------------------------------------------------+
-
-Update applications information from an environment template
-------------------------------------------------------------
-
-*Request*
-
-+----------+-----------------------------------------------+-----------------------------------+
-| Method | URI | Description |
-+==========+===============================================+===================================+
-| PUT | /templates/{env-temp-id}/services/{service-id}| It updates the service description|
-+----------+-----------------------------------------------+-----------------------------------+
-
-*Parameters:*
-
-* `env-temp-id` - The environment template ID, required
-* `service-id` - The service ID to be updated
-* payload - the service description
-
-*Content-Type*
- application/json
-
-*Example*
-
-::
-
- {
- "instance": {
- "assignFloatingIp": "true",
- "keyname": "mykeyname",
- "image": "cloud-fedora-v3",
- "flavor": "m1.medium",
- "?": {
- "type": "io.murano.resources.LinuxMuranoInstance",
- "id": "ef984a74-29a4-45c0-b1dc-2ab9f075732e"
- }
- },
- "name": "orion",
- "port": "8080",
- "?": {
- "type": "io.murano.apps.apache.Tomcat",
- "id": "54cea43d-5970-4c73-b9ac-fea656f3c722"
- }
- }
-
-*Response*
-
-::
-
-
- {
- "instance":
- {
- "assignFloatingIp": "true",
- "keyname": "mykeyname",
- "image": "cloud-fedora-v3",
- "flavor": "m1.medium",
- "?":
- {
- "type": "io.murano.resources.LinuxMuranoInstance",
- "id": "ef984a74-29a4-45c0-b1dc-2ab9f075732e"
- }
- },
- "name": "orion",
- "?":
- {
- "type": "io.murano.apps.apache.Tomcat",
- "id": "54cea43d-5970-4c73-b9ac-fea656f3c722"
- },
- "port": "8080"
- }
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | OK. Environment Template updated successfully |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to access this session |
-+----------------+-----------------------------------------------------------+
-| 404 | The environment template does not exist |
-+----------------+-----------------------------------------------------------+
-
-Create an environment from an environment template
---------------------------------------------------
-
-*Request*
-
-+----------+--------------------------------------------+--------------------------------------+
-| Method | URI | Description |
-+==========+============================================+======================================+
-| POST | /templates/{env-temp-id}/create-environment| Create an environment |
-+----------+--------------------------------------------+--------------------------------------+
-
-
-*Parameters:*
-
-* `env-temp-id` - The environment template ID, required
-
-*Payload:*
-
-* 'environment name': The environment name to be created.
-
-*Content-Type*
- application/json
-
-*Example*
-
-::
-
- {
- "name": "environment_name"
- }
-
-*Response*
-
-::
-
- {
- "environment_id": "aa90fadfafca10e38e1c8c4bbf7",
- "name": "environment_name",
- "created": "2015-01-26T09:12:51",
- "tenant_id": "00000000000000000000000000000001",
- "version": 0,
- "session_id": "adf4dadfaa9033ca7ce245fca10e38e1c8c4bbf7",
- }
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | OK. Environment created from template successfully |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to access this session |
-+----------------+-----------------------------------------------------------+
-| 404 | The environment template does not exist |
-+----------------+-----------------------------------------------------------+
-| 409 | The environment already exists |
-+----------------+-----------------------------------------------------------+
-
-
-**POST /templates/{env-temp-id}/clone**
-
-*Request*
-
-+----------+--------------------------------+-------------------------------------------------+
-| Method | URI | Description |
-+==========+================================+=================================================+
-| POST | /templates/{env-temp-id}/clone | It clones a public template from one project |
-| | | to another |
-+----------+--------------------------------+-------------------------------------------------+
-
-*Parameters:*
-
-* `env-temp-id` - environment template ID, required
-
-*Example Payload*
-::
-
- {
- 'name': 'cloned_env_template_name'
- }
-
-*Content-Type*
- application/json
-
-*Response*
-
-::
-
- {
- "updated": "2015-01-26T09:12:51",
- "name": "cloned_env_template_name",
- "created": "2015-01-26T09:12:51",
- "tenant_id": "00000000000000000000000000000001",
- "version": 0,
- "is_public": False,
- "id": "aa9033ca7ce245fca10e38e1c8c4bbf7",
- }
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | OK. Environment Template cloned successfully |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to access this session |
-+----------------+-----------------------------------------------------------+
-| 403 | User has no access to these resources |
-+----------------+-----------------------------------------------------------+
-| 404 | The environment template does not exist |
-+----------------+-----------------------------------------------------------+
-| 409 | Conflict. The environment template name already exists |
-+----------------+-----------------------------------------------------------+
-
diff --git a/doc/source/reference/appendix/articles/specification/murano-repository.rst b/doc/source/reference/appendix/articles/specification/murano-repository.rst
deleted file mode 100644
index 22481b3a6..000000000
--- a/doc/source/reference/appendix/articles/specification/murano-repository.rst
+++ /dev/null
@@ -1,606 +0,0 @@
-Application catalog API
-=======================
-
-Manage application definitions in the Application Catalog.
-You can browse, edit and upload new application packages (.zip.package archive with all data that required for a service deployment).
-
-Packages
-========
-
-Methods for application package management
-
-**Package Properties**
-
-- ``id``: guid of a package (``fully_qualified_name`` can also be used for some API functions)
-- ``fully_qualified_name``: fully qualified domain name - domain name that specifies exact application location
-- ``name``: user-friendly name
-- ``type``: package type, "library" or "application"
-- ``description``: text information about application
-- ``author``: name of application author
-- ``tags``: list of short names, connected with the package, which allows to search applications easily
-- ``categories``: list of application categories
-- ``class_definition``: list of class names used by a package
-- ``is_public``: determines whether the package is shared for other projects
-- ``enabled``: determines whether the package is browsed in the Application Catalog
-- ``owner_id``: id of a project that owns the package
-
-.. note::
-
- It is possible to use ``in`` operator for properties ``id``, ``category`` and ``tag``.
- For example to get packages with ``id1, id2, id3`` use ``id=in:id1,id2,id3``.
-
-List packages
--------------
-
-`/v1/catalog/packages?{marker}{limit}{order_by}{type}{category}{fqn}{owned}{id}{catalog}{class_name}{name} [GET]`
-
-This is the compound request to list and search through application catalog.
-If there are no search parameters all packages that is_public, enabled and belong to the user's project will be listed.
-Default order is by 'created' field.
-For an admin role all packages are available.
-
-**Parameters**
-
-+---------------------+--------+---------------------------------------------+
-| Attribute | Type | Description |
-+=====================+========+=============================================+
-| ``catalog`` | bool | If false (default) - search packages, that |
-| | | current user can edit (own for non-admin, |
-| | | all for admin) |
-| | | If true - search packages, that current user|
-| | | can deploy (i.e. his own + public) |
-+---------------------+--------+---------------------------------------------+
-| ``marker`` | string | A package identifier marker may be |
-| | | specified. When present only packages which |
-| | | occur after the identifier ID will be listed|
-+---------------------+--------+---------------------------------------------+
-| ``limit`` | string | When present the maximum number of results |
-| | | returned will not exceed the specified |
-| | | value. The typical pattern of limit and |
-| | | marker is to make an initial limited request|
-| | | and then to use the ID of the last package |
-| | | from the response as the marker parameter in|
-| | | a subsequent limited request. |
-+---------------------+--------+---------------------------------------------+
-| ``order_by`` | string | Allows to sort packages by: `fqn`, `name`, |
-| | | `created`. Created is default value. |
-+---------------------+--------+---------------------------------------------+
-| ``type`` | string | Allows to point a type of package: |
-| | | `application`, `library` |
-+---------------------+--------+---------------------------------------------+
-| ``category`` | string | Allows to point a categories for a search |
-+---------------------+--------+---------------------------------------------+
-| ``fqn`` | string | Allows to point a fully qualified package |
-| | | name for a search |
-+---------------------+--------+---------------------------------------------+
-| ``owned`` | bool | Search only from packages owned by current |
-| | | project |
-+---------------------+--------+---------------------------------------------+
-| ``id`` | string | Allows to point an id for a search |
-+---------------------+--------+---------------------------------------------+
-| ``include_disabled``| bool | Include disabled packages in a the result |
-+---------------------+--------+---------------------------------------------+
-| ``search`` | string | Gives opportunity to search specified data |
-| | | by all the package parameters and order |
-| | | packages |
-+---------------------+--------+---------------------------------------------+
-| ``class_name`` | string | Search only for packages, that use specified|
-| | | class |
-+---------------------+--------+---------------------------------------------+
-| ``name`` | string | Allows to point a package name for a search |
-+---------------------+--------+---------------------------------------------+
-
-**Response 200 (application/json)**
-
-::
-
- {"packages": [
- {
- "id": "fed57567c9fa42c192dcbe0566f8ea33",
- "fully_qualified_name" : "com.example.murano.services.linux.telnet",
- "is_public": false,
- "name": "Telnet",
- "type": "linux",
- "description": "Installs Telnet service",
- "author": "OpenStack, Inc.",
- "created": "2014-04-02T14:31:55",
- "enabled": true,
- "tags": ["linux", "telnet"],
- "categories": ["Utility"],
- "owner_id": "fed57567c9fa42c192dcbe0566f8ea40"
- },
- {
- "id": "fed57567c9fa42c192dcbe0566f8ea31",
- "fully_qualified_name": "com.example.murano.services.windows.WebServer",
- "is_public": true,
- "name": "Internet Information Services",
- "type": "windows",
- "description": "The Internet Information Service sets up an IIS server and joins it into an existing domain",
- "author": "OpenStack, Inc.",
- "created": "2014-04-02T14:31:55",
- "enabled": true,
- "tags": ["windows", "web"],
- "categories": ["Web"],
- "owner_id": "fed57567c9fa42c192dcbe0566f8ea40"
- }]
- }
-
-
-
-Upload a new package[POST]
---------------------------
-
-`/v1/catalog/packages`
-
-See the example of multipart/form-data request, It should contain two parts - text (JSON string) and file object
-
-**Request (multipart/form-data)**
-
-.. code-block:: none
-
- Content-type: multipart/form-data, boundary=AaB03x
- Content-Length: $requestlen
-
- --AaB03x
- content-disposition: form-data; name="submit-name"
-
- --AaB03x
- Content-Disposition: form-data; name="JsonString"
- Content-Type: application/json
-
- {"categories":["web"] , "tags": ["windows"], "is_public": false, "enabled": false}
- `categories` - array, required
- `tags` - array, optional
- `name` - string, optional
- `description` - string, optional
- `is_public` - bool, optional
- `enabled` - bool, optional
-
- --AaB03x
- content-disposition: file; name="file"; filename="test.tar"
- Content-Type: targz
- Content-Transfer-Encoding: binary
-
- $binarydata
- --AaB03x--
-
-
-**Response 200 (application/json)**
-
-.. code-block:: json
-
- {
- "updated": "2014-04-03T13:00:13",
- "description": "A domain service hosted in Windows environment by using Active Directory Role",
- "tags": ["windows"],
- "is_public": true,
- "id": "8f4f09bd6bcb47fb968afd29aacc0dc9",
- "categories": ["test1"],
- "name": "Active Directory",
- "author": "Mirantis, Inc",
- "created": "2014-04-03T13:00:13",
- "enabled": true,
- "class_definition": [
- "com.mirantis.murano.windows.activeDirectory.ActiveDirectory",
- "com.mirantis.murano.windows.activeDirectory.SecondaryController",
- "com.mirantis.murano.windows.activeDirectory.Controller",
- "com.mirantis.murano.windows.activeDirectory.PrimaryController"
- ],
- "fully_qualified_name": "com.mirantis.murano.windows.activeDirectory.ActiveDirectory",
- "type": "Application",
- "owner_id": "fed57567c9fa42c192dcbe0566f8ea40"
- }
-
-Get package details
--------------------
-
-`/v1/catalog/packages/{id} [GET]`
-
-Display details for a package.
-
-**Parameters**
-
-``id`` (required) Hexadecimal `id` (or fully qualified name) of the package
-
-**Response 200 (application/json)**
-
-::
-
- {
- "updated": "2014-04-03T13:00:13",
- "description": "A domain service hosted in Windows environment by using Active Directory Role",
- "tags": ["windows"],
- "is_public": true,
- "id": "8f4f09bd6bcb47fb968afd29aacc0dc9",
- "categories": ["test1"],
- "name": "Active Directory",
- "author": "Mirantis, Inc",
- "created": "2014-04-03T13:00:13",
- "enabled": true,
- "class_definition": [
- "com.mirantis.murano.windows.activeDirectory.ActiveDirectory",
- "com.mirantis.murano.windows.activeDirectory.SecondaryController",
- "com.mirantis.murano.windows.activeDirectory.Controller",
- "com.mirantis.murano.windows.activeDirectory.PrimaryController"
- ],
- "fully_qualified_name": "com.mirantis.murano.windows.activeDirectory.ActiveDirectory",
- "type": "Application",
- "owner_id": "fed57567c9fa42c192dcbe0566f8ea40"
- }
-
-**Response 403**
-
-* In attempt to get a non-public package by a user whose project is not an owner of this package.
-
-**Response 404**
-
-* In case the specified package id doesn't exist.
-
-Update a package
-================
-
-`/v1/catalog/packages/{id} [PATCH]`
-
-Allows to edit mutable fields (categories, tags, name, description, is_public, enabled).
-See the full specification `here `_.
-
-**Parameters**
-
-``id`` (required) Hexadecimal `id` (or fully qualified name) of the package
-
-**Content type**
-
-application/murano-packages-json-patch
-
-Allowed operations:
-
-::
-
- [
- { "op": "add", "path": "/tags", "value": [ "foo", "bar" ] },
- { "op": "add", "path": "/categories", "value": [ "foo", "bar" ] },
- { "op": "remove", "path": "/tags", ["foo"] },
- { "op": "remove", "path": "/categories", ["foo"] },
- { "op": "replace", "path": "/tags", "value": [] },
- { "op": "replace", "path": "/categories", "value": ["bar"] },
- { "op": "replace", "path": "/is_public", "value": true },
- { "op": "replace", "path": "/enabled", "value": true },
- { "op": "replace", "path": "/description", "value":"New description" },
- { "op": "replace", "path": "/name", "value": "New name" }
- ]
-
-**Request 200 (application/murano-packages-json-patch)**
-
-::
-
- [
- { "op": "add", "path": "/tags", "value": [ "windows", "directory"] },
- { "op": "add", "path": "/categories", "value": [ "Directory" ] }
- ]
-
-**Response 200 (application/json)**
-
-::
-
- {
- "updated": "2014-04-03T13:00:13",
- "description": "A domain service hosted in Windows environment by using Active Directory Role",
- "tags": ["windows", "directory"],
- "is_public": true,
- "id": "8f4f09bd6bcb47fb968afd29aacc0dc9",
- "categories": ["test1"],
- "name": "Active Directory",
- "author": "Mirantis, Inc",
- "created": "2014-04-03T13:00:13",
- "enabled": true,
- "class_definition": [
- "com.mirantis.murano.windows.activeDirectory.ActiveDirectory",
- "com.mirantis.murano.windows.activeDirectory.SecondaryController",
- "com.mirantis.murano.windows.activeDirectory.Controller",
- "com.mirantis.murano.windows.activeDirectory.PrimaryController"
- ],
- "fully_qualified_name": "com.mirantis.murano.windows.activeDirectory.ActiveDirectory",
- "type": "Application",
- "owner_id": "fed57567c9fa42c192dcbe0566f8ea40"
- }
-
-**Response 403**
-
-* An attempt to update immutable fields
-* An attempt to perform operation that is not allowed on the specified path
-* An attempt to update non-public package by user whose project is not an owner of this package
-
-**Response 404**
-
-* An attempt to update package that doesn't exist
-
-
-Delete application definition from the catalog
-----------------------------------------------
-
-`/v1/catalog/packages/{id} [DELETE]`
-
-**Parameters**
-
-* ``id`` (required) Hexadecimal `id` (or fully qualified name) of the package to delete
-
-**Response 404**
-
-* An attempt to delete package that doesn't exist
-
-
-Get application package
------------------------
-
-`/v1/catalog/packages/{id}/download [GET]`
-
-Get application definition package
-
-**Parameters**
-
-* ``id`` (required) Hexadecimal `id` (or fully qualified name) of the package
-
-**Response 200 (application/octet-stream)**
-
-The sequence of bytes representing package content
-
-**Response 404**
-
-Specified package id doesn't exist
-
-
-Get UI definition
------------------
-
-`/v1/catalog/packages/{id}/ui [GET]`
-
-Retrieve UI definition for an application which described in a package with provided id
-
-**Parameters**
-
-* ``id`` (required) Hexadecimal `id` (or fully qualified name) of the package
-
-**Response 200 (application/octet-stream)**
-
-The sequence of bytes representing UI definition
-
-**Response 404**
-
-Specified package id doesn't exist
-
-**Response 403**
-
-Specified package is not public and not owned by user project, performing the request
-
-**Response 404**
-
-* Specified package id doesn't exist
-
-
-Get logo
---------
-
-Retrieve application logo which described in a package with provided id
-
-`/v1/catalog/packages/{id}/logo [GET]`
-
-**Parameters**
-
-``id`` (required) Hexadecimal `id` (or fully qualified name) of the package
-
-**Response 200 (application/octet-stream)**
-
-The sequence of bytes representing application logo
-
-**Response 403**
-
-Specified package is not public and not owned by user project,
-performing the request
-
-**Response 404**
-
-Specified package is not public and not owned by user project,
-performing the request
-
-Categories
-==========
-
-Provides category management. Categories are used in the Application Catalog
-to group application for easy browsing and search.
-
-List categories
----------------
-
-* `/v1/catalog/packages/categories [GET]`
-
- !DEPRECATED (Plan to remove in L release) Retrieve list of all available application categories
-
- **Response 200 (application/json)**
-
- A list, containing category names
-
- *Content-Type*
- application/json
-
- ::
-
- {
- "categories": ["Web service", "Directory", "Database", "Storage"]
- }
-
-
-* `/v1/catalog/categories [GET]`
-
- +----------+------------------------------+---------------------------------+
- | Method | URI | Description |
- +==========+==============================+=================================+
- | GET | /catalog/categories | Get list of existing categories |
- +----------+------------------------------+---------------------------------+
-
- Retrieve list of all available application categories
-
- **Response 200 (application/json)**
-
- A list, containing detailed information about each category
-
- *Content-Type*
- application/json
-
- ::
-
- {"categories": [
- {
- "id": "0420045dce7445fabae7e5e61fff9e2f",
- "updated": "2014-12-26T13:57:04",
- "name": "Web",
- "created": "2014-12-26T13:57:04",
- "package_count": 1
- },
- {
- "id": "3dd486b1e26f40ac8f35416b63f52042",
- "updated": "2014-12-26T13:57:04",
- "name": "Databases",
- "created": "2014-12-26T13:57:04",
- "package_count": 0
- }]
- }
-
-
-
-Get category details
---------------------
-
-`/catalog/categories/ [GET]`
-
- Return detailed information for a provided category
-
-*Request*
-
-+----------+-----------------------------------+-----------------------------+
-| Method | URI | Description |
-+==========+===================================+=============================+
-| GET | /catalog/categories/ | Get category detail |
-+----------+-----------------------------------+-----------------------------+
-
-*Parameters*
-
-* ``category_id`` - required, category ID, required
-
-*Response*
-
- *Content-Type*
- application/json
-
-::
-
- {
- "id": "b308f7fa8a2f4a5eb419970c827f4466",
- "updated": "2015-01-28T17:00:19",
- "packages": [
- {
- "fully_qualified_name": "io.murano.apps.ZabbixServer",
- "id": "4dfb566e69e6445fbd4aea5099fe95e9",
- "name": "Zabbix Server"
- }
- ],
- "name": "Web",
- "created": "2015-01-28T17:00:19",
- "package_count": 1
- }
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | OK. Category deleted successfully |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to access this session |
-+----------------+-----------------------------------------------------------+
-| 404 | Not found. Specified category doesn`t exist |
-+----------------+-----------------------------------------------------------+
-
-Add new category
-----------------
-
-`/catalog/categories [POST]`
-
- Add new category to the Application Catalog
-
-*Parameters*
-
-+----------------------+------------+----------------------------------------+
-| Attribute | Type | Description |
-+======================+============+========================================+
-| name | string | Environment name; only alphanumeric |
-| | | characters and '-' |
-+----------------------+------------+----------------------------------------+
-
-*Request*
-
-+----------+----------------------------------+------------------------------+
-| Method | URI | Description |
-+==========+==================================+==============================+
-| POST | /catalog/categories | Create new category |
-+----------+----------------------------------+------------------------------+
-
- *Content-Type*
- application/json
-
- *Example*
- {"name": "category_name"}
-
-*Response*
-
-::
-
- {
- "id": "ce373a477f211e187a55404a662f968",
- "name": "category_name",
- "created": "2013-11-30T03:23:42Z",
- "updated": "2013-11-30T03:23:44Z",
- "package_count": 0
- }
-
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | OK. Category created successfully |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to access this session |
-+----------------+-----------------------------------------------------------+
-| 409 | Conflict. Category with specified name already exist |
-+----------------+-----------------------------------------------------------+
-
-
-Delete category
----------------
-
-`/catalog/categories [DELETE]`
-
-*Request*
-
-+----------+-----------------------------------+-----------------------------+
-| Method | URI | Description |
-+==========+===================================+=============================+
-| DELETE | /catalog/categories/ | Delete category with |
-| | | specified ID |
-+----------+-----------------------------------+-----------------------------+
-
-*Parameters:*
-
-* ``category_id`` - required, category ID, required
-
-*Response*
-
-+----------------+-----------------------------------------------------------+
-| Code | Description |
-+================+===========================================================+
-| 200 | OK. Category deleted successfully |
-+----------------+-----------------------------------------------------------+
-| 401 | User is not authorized to access this session |
-+----------------+-----------------------------------------------------------+
-| 404 | Not found. Specified category doesn`t exist |
-+----------------+-----------------------------------------------------------+
-| 403 | Forbidden. Category with specified name is assigned to |
-| | the package, presented in the catalog |
-+----------------+-----------------------------------------------------------+
diff --git a/doc/source/reference/appendix/articles/specification/overview.rst b/doc/source/reference/appendix/articles/specification/overview.rst
deleted file mode 100644
index 527774de0..000000000
--- a/doc/source/reference/appendix/articles/specification/overview.rst
+++ /dev/null
@@ -1,41 +0,0 @@
-General information
-===================
-
-* **Introduction**
-
- The murano service API is a programmatic interface used for interaction with
- murano. Other interaction mechanisms like the murano dashboard or the murano CLI
- should use the API as an underlying protocol for interaction.
-
-* **Allowed HTTPs requests**
-
- * *POST* : To create a resource
- * *GET* : Get a resource or list of resources
- * *DELETE* : To delete resource
- * *PATCH* : To update a resource
-
-* **Description Of Usual Server Responses**
-
- * 200 ``OK`` - the request was successful.
- * 201 ``Created`` - the request was successful and a resource was created.
- * 204 ``No Content`` - the request was successful but there is no representation to return (i.e. the response is empty).
- * 400 ``Bad Request`` - the request could not be understood or required parameters were missing.
- * 401 ``Unauthorized`` - authentication failed or user didn't have permissions for requested operation.
- * 403 ``Forbidden`` - access denied.
- * 404 ``Not Found`` - resource was not found
- * 405 ``Method Not Allowed`` - requested method is not supported for resource.
- * 406 ``Not Acceptable`` - the requested resource is only capable of generating content not acceptable
- according to the Accept headers sent in the request.
- * 409 ``Conflict`` - requested method resulted in a conflict with the current state of the resource.
-
-* **Response of POSTs and PUTs**
-
- All POST and PUT requests by convention should return the created object
- (in the case of POST, with a generated ID) as if it was requested by
- GET.
-
-* **Authentication**
-
- All requests include a keystone authentication token header
- (X-Auth-Token). Clients must authenticate with keystone before
- interacting with the murano service.
\ No newline at end of file
diff --git a/doc/source/reference/appendix/articles/telnet_example.rst b/doc/source/reference/appendix/articles/telnet_example.rst
deleted file mode 100644
index 22a8dedf2..000000000
--- a/doc/source/reference/appendix/articles/telnet_example.rst
+++ /dev/null
@@ -1,48 +0,0 @@
-:orphan:
-
-.. _telnet_example:
-
-Telnet Example
---------------
-
-.. code-block:: yaml
-
- Namespaces:
- =: io.murano.apps.linux
- std: io.murano
- res: io.murano.resources
-
-
- Name: Telnet
-
- # Inheritance from io.murano.Application class
- # (located at Murano Core library) indicates,
- # that this is a complete application
- # and that 'deploy' method has to be defined.
- Extends: std:Application
-
- Properties:
- name:
- Contract: $.string().notNull()
-
- instance:
- Contract: $.class(res:Instance).notNull()
-
-
- Methods:
- deploy:
- Body:
- # Determine the environment to which the application belongs.
- # This message will be stored in deployment logs and available in UI
- - $this.find(std:Environment).reporter.report($this, 'Creating VM for Telnet Instance.')
- # Deploy VM
- - $.instance.deploy()
- - $this.find(std:Environment).reporter.report($this, 'Instance is created. Setup Telnet service.')
- # Create instance of murano resource class. Agent will use it to find
- # corresponding execution plan by the file name
- - $resources: new('io.murano.system.Resources')
- # Deploy Telnet
- - $template: $resources.yaml('DeployTelnet.template')
- # Send prepared execution plan to Murano agent
- - $.instance.agent.call($template, $resources)
- - $this.find(std:Environment).reporter.report($this, 'Telnet service setup is done.')
diff --git a/doc/source/reference/appendix/articles/test_docs.rst b/doc/source/reference/appendix/articles/test_docs.rst
deleted file mode 100644
index b06d1d34e..000000000
--- a/doc/source/reference/appendix/articles/test_docs.rst
+++ /dev/null
@@ -1,237 +0,0 @@
-.. _test_docs:
-
-==================================
-Murano automated tests description
-==================================
-
-This page describes automated tests for a Murano project:
-
-* where tests are located
-* how they are run
-* how to execute tests on a local machine
-* how to find the root of problems with FAILed tests
-
-Murano continuous integration service
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Murano project has separate CI server, which runs tests for all commits and
-verifies that new code does not break anything.
-
-Murano CI uses OpenStack QA cloud for testing infrastructure.
-
-Murano CI url: https://murano-ci.mirantis.com/jenkins/ Anyone can login
-to that server, using launchpad credentials.
-
-There you can find each job for each repository: one for **murano** and
-another one for **murano-dashboard**.
-
-* ``gate-murano-dashboard-ubuntu\*`` verifies each commit to
- the murano-dashboard repository
-* ``gate-murano-ubuntu\*`` verifies each commit to the murano repository
-
-Other jobs allow one to build and test Murano documentation and to perform other
-useful work to support the Murano CI infrastructure.
-All jobs are run following a fresh installation of the operating system and all components
-are installed on each run.
-
-UI tests
-~~~~~~~~
-
-The Murano project has a web user interface and all possible user scenarios
-should be tested.
-All UI tests are located at
-``https://opendev.org/openstack/murano-dashboard/src/branch/master/muranodashboard/tests/functional``.
-
-Automated tests for the Murano web UI are written in Python using the special
-Selenium library. This library is used to automate web browser interactions
-with Python. See official `Selenium documentation `_
-for details.
-
-Prerequisites:
---------------
-
-* Install the Python module called nose using either the
- :command:`easy_install nose` or :command:`pip install nose` command.
- This will install the nose libraries, as well as the ``nosetests`` script,
- which you can use to automatically discover and run tests.
-* Install external Python libraries, which are required for the Murano web UI
- tests: ``testtools`` and ``selenium``.
-* Verify that you have one of the following web browsers installed:
-
- * Mozilla Firefox 46.0
-
- .. note::
-
- If you do not have Firefox package out of the box,
- install and remove it. Otherwise, you will need to install
- dependent libraries manually. To downgrade Firefox:
-
- .. code-block:: console
-
- apt-get remove firefox
- wget https://ftp.mozilla.org/pub/firefox/releases/46.0/linux-x86_64/en-US/firefox-46.0.tar.bz2
- tar -xjf firefox-46.0.tar.bz2
- rm -rf /opt/firefox
- mv firefox /opt/firefox46
- ln -s /opt/firefox46/firefox /usr/bin/firefox
-
- * Google Chrome
-
-* To run the tests on a remote server, configure the remote X server.
- Use VNC Software to see the test results in real-time.
-
- #. Specify the display environment variable:
-
- .. code-block:: console
-
- $DISPLAY=:
-
- #. Configure remote X server and VNC Software by typing:
-
- .. code-block:: console
-
- apt-get install xvfb xfonts-100dpi xfonts-75dpi xfonts-cyrillic xorg dbus-x11
- "Xvfb -fp "/usr/share/fonts/X11/misc/" :$DISPLAY -screen 0 "1280x1024x16" &"
- apt-get install --yes x11vnc
- x11vnc -bg -forever -nopw -display :$DISPLAY -ncache 10
- sudo iptables -I INPUT 1 -p tcp --dport 5900 -j ACCEPT
-
-Download and run tests
-----------------------
-
-To download and run the tests:
-
-#. Verify that all additional components has been installed.
-
-#. Clone the ``murano-dashboard`` git repository:
-
- .. code-block:: console
-
- git clone https://opendev.org/openstack/murano-dashboard
-
-#. Change the default settings:
-
- #. Specify the Murano Repository URL variable for Horizon local settings
- in ``murano_dashboard/muranodashboard/local/local_settings.d/_50_murano.py``:
-
- .. code-block:: console
-
- MURANO_REPO_URL = 'http://localhost:8099'
-
- #. Copy ``muranodashboard/tests/functional/config/config.conf.sample`` to
- ``config.conf``.
-
- #. Set appropriate URLs and credentials for your OpenStack lab.
- Only Administrator user credentials are appropriate.
-
- .. code-block:: console
-
- [murano]
-
- horizon_url = http://localhost/dashboard
- murano_url = http://localhost:8082
- user = ***
- password = ***
- tenant = ***
- keystone_url = http://localhost:5000/v3
-
-All tests are kept in ``sanity_check.py`` and divided into 10 test suites:
-
-* TestSuiteSmoke - verification of Murano panels; checks that they can be open
- without errors.
-* TestSuiteEnvironment - verification of all operations with environment are
- finished successfully.
-* TestSuiteImage - verification of operations with images.
-* TestSuiteFields - verification of custom fields validators.
-* TestSuitePackages - verification of operations with Murano packages.
-* TestSuiteApplications - verification of Application Catalog page and of
- application creation process.
-* TestSuiteAppsPagination - verification of apps pagination in case of many
- applications installed.
-* TestSuiteRepository - verification of importing packages and bundles.
-* TestSuitePackageCategory - verification of main operations with categories.
-* TestSuiteCategoriesPagination - verification of categories pagination
- in case of many categories created.
-* TestSuiteMultipleEnvironments - verification of ability to apply action
- to multiple environments.
-
-To run the tests follow these instructions:
-
-* To run all tests:
-
-.. code-block:: console
-
- nosetests sanity_check.py
-
-* To run a single suite:
-
-.. code-block:: console
-
- nosetests sanity_check.py:
-
-* To run a single test:
-
-.. code-block:: console
-
- nosetests sanity_check.py:.
-
-
-In case of successful execution, you should see something like this:
-
-.. code-block:: console
-
- .........................
- Ran 34 tests in 1.440s
- OK
-
-In case of failure, the folder with screenshots of the last operation of
-tests that finished with errors would be created.
-It is located in ``muranodashboard/tests/functional`` folder.
-
-There are also a number of command line options that can be used to control
-the test execution and generated outputs. For more details about ``nosetests``,
-type:
-
-.. code-block:: console
-
- nosetests -h
-
-
-Tempest tests
-~~~~~~~~~~~~~
-
-All Murano services have tempest-based automated tests, which verify
-API interfaces and deployment scenarios.
-Tempest tests for Murano are located at ``https://opendev.org/openstack/murano/src/branch/master/murano/tests/functional``.
-
-The following Python files contain basic test suites for different Murano components.
-
-API tests
----------
-
-Murano API tests are run on the devstack gate located at
-``https://opendev.org/openstack/murano-tempest-plugin/src/branch/master/murano_tempest_tests/tests/api``.
-
-* ``test_murano_envs.py`` contains test suite with actions on murano
- environments (create, delete, get, and others).
-* ``test_murano_sessions.py`` contains test suite with actions on murano
- sessions (create, delete, get, and others).
-* ``test_murano_services.py`` contains test suite with actions on murano
- services (create, delete, get, and others).
-* ``test_murano_repository.py`` contains test suite with actions on murano
- package repository.
-
-Engine tests
-------------
-
-Murano Engine Tests are run on murano-ci at ``https://opendev.org/openstack/murano-tempest-plugin/src/branch/master/murano_tempest_tests/tests/functional``:
-
-* ``base.py`` contains base test class and tests with actions on deploy
- Murano services such as Telnet and Apache.
-
-Command-line interface tests
-----------------------------
-
-Murano CLI tests are currently in the middle of creation. The current scope
-is read-only operations on a cloud that are hard to test through unit tests.
-All tests have description and execution steps in their docstrings.
diff --git a/doc/source/reference/appendix/articles/workflow.rst b/doc/source/reference/appendix/articles/workflow.rst
deleted file mode 100644
index 3ba569160..000000000
--- a/doc/source/reference/appendix/articles/workflow.rst
+++ /dev/null
@@ -1,100 +0,0 @@
-.. _murano-workflow:
-
-===============
-Murano workflow
-===============
-What happens when a component is being created in an environment? This document
-will use the Telnet package referenced elsewhere as an example. It assumes the
-package has been previously uploaded to Murano.
-
-
-Step 1. Begin deployment
-=========================
-The API sends a message that instructs murano-engine, the workflow component of
-Murano, to deploy an environment. The message consists of a JSON document
-containing the class types required to create the environment, as well as any
-parameters the user selected prior to deployment. Examples are:
-
-* An :ref:`Environment` object (io.murano.Environment) with a *name*
-* An object (or objects) referring to networks that need to be created
- or that already exist
-* A list of Applications (e.g. io.murano.apps.linux.Telnet). Each Application
- will contain, or will reference, anything it requires. The Telnet example,
- has a property called *instance* whose contract states it must be of type
- io.murano.resources.Instance. In turn the Instance has properties it requires
- (like a name, a flavor, a keypair name).
-
-Each object in this *model* has an ID so that the state of each can be tracked.
-
-The classes that are required are determined by the application's manifest. In
-the :ref:`Telnet example ` only one class is explicitly
-required; the telnet application definition.
-
-The :ref:`Telnet class definition ` refers to several other
-classes. It extends :ref:`Application` and it requires an :ref:`Instance`.
-It also refers to the :ref:`Environment` in which it will be contained,
-sends reports through the environment's :ref:`status-reporter`
-and adds security group rules to the :ref:`security-group-manager`.
-
-
-Step 2. Load definitions
-=========================
-The engine makes a series of requests to the API to download packages it
-needs. These requests pass the class names the environment will require, and
-during this stage the engine will validate that all the required classes exist
-and are accessible, and will begin creating them. All Classes whose *workflow*
-sections contain an *initialize* fragment are then initialized. A typical initialization
-order would be (defined by the ordering in the *model* sent to the murano-engine):
-
-* :ref:`Network`
-* :ref:`Instance`
-* :ref:`Object`
-* :ref:`Environment`
-
-
-Step 3. Deploy resources
-==========================
-The workflow defined in Environment.deploy is now executed. The first step
-typically is to initialize the messaging component that will pay attention
-to murano-agent (see later). The next stage is to deploy each application the
-environment knows about in turn, by running deploy() for each application.
-This happens concurrently for all the applications belonging to an instance.
-
-In the :ref:`Telnet example ` (under *Workflow*), the workflow
-dictates sending a status message (via the environment's *reporter*, and
-configuring some security group rules. It is at this stage that the engine
-first contacts Heat to request information about any pre-existing resources
-(and there will be none for a fresh deploy) before updating the new Heat
-template with the security group information.
-
-Next it instructs the engine to deploy the *instance* it relies on. A large
-part of the interaction with Heat is carried out at this stage; the first
-thing an Instance does is add itself to the environment's network. Since the
-network doesn't yet exist, murano-engine runs the neutron network workflow
-which pushes template fragments to Heat. These fragments can define:
-* Networks
-* Subnets
-* Router interfaces
-
-Once this is done the Instance itself constructs a Heat template fragment and
-again pushes it to Heat. The Instance will include a *userdata* script that
-is run when the instance has started up, and which will configure and run
-murano-agent.
-
-
-Step 4. Software configuration via murano-agent
-================================================
-If the workflow includes murano-agent components (and the telnet example does),
-typically the application workflow will execute them as the next step.
-
-In the telnet example, the workflow instructs the engine to load
-*DeployTelnet.yaml* as YAML, and pass it to the murano-agent running on the
-configured instance. This causes the agent to execute the *EntryPoint* defined
-in the agent script (which in this case deploys some packages and sets some
-iptables rules).
-
-
-Step 5. Done
-=============
-After execution is finished, the engine sends a last message indicating that
-fact; the API receives it and marks the environment as deployed.
diff --git a/doc/source/reference/appendix/cli_ref.rst b/doc/source/reference/appendix/cli_ref.rst
deleted file mode 100644
index b5cc7622b..000000000
--- a/doc/source/reference/appendix/cli_ref.rst
+++ /dev/null
@@ -1,624 +0,0 @@
-.. _cli-ref:
-
-==========================
-Murano command-line client
-==========================
-
-The ``murano`` client is the command-line
-interface (CLI) for the Application catalog API and its extensions.
-
-For help on a specific ``murano`` command, enter:
-
-.. code-block:: console
-
- murano help COMMAND
-
- murano usage
- usage: murano \[--version] \[-d] \[-v] \[-k] \[--os-cacert ]
- \[--cert-file CERT_FILE] \[--key-file KEY_FILE]
- \[--ca-file CA_FILE] \[--api-timeout API_TIMEOUT]
- \[--os-username OS_USERNAME] \[--os-password OS_PASSWORD]
- \[--os-tenant-id OS_TENANT_ID] \[--os-tenant-name OS_TENANT_NAME]
- \[--os-auth-url OS_AUTH_URL] \[--os-region-name OS_REGION_NAME]
- \[--os-auth-token OS_AUTH_TOKEN] \[--os-no-client-auth]
- \[--murano-url MURANO_URL] \[--glance-url GLANCE_URL]
- \[--murano-api-version MURANO_API_VERSION]
- \[--os-service-type OS_SERVICE_TYPE]
- \[--os-endpoint-type OS_ENDPOINT_TYPE] \[--include-password]
- \[--murano-repo-url MURANO_REPO_URL]
- ...
-
-Subcommands
-===========
-
-* *bundle-import* Import a bundle.
-
-* *category-create* Create a category.
-
-* *category-delete* Delete a category.
-
-* *category-list* List all available categories.
-
-* *category-show*
-
-* *deployment-list* List deployments for an environment.
-
-* *env-template-add-app* Add application to the environment template.
-
-* *env-template-create* Create an environment template.
-
-* *env-template-del-app* Delete application to the environment template.
-
-* *env-template-delete* Delete an environment template.
-
-* *env-template-list* List the environments templates.
-
-* *env-template-show* Display environment template details.
-
-* *env-template-update* Update an environment template.
-
-* *environment-create* Create an environment.
-
-* *environment-delete* Delete an environment.
-
-* *environment-list* List the environments.
-
-* *environment-rename* Rename an environment.
-
-* *environment-show* Display environment details.
-
-* *package-create* Create an application package.
-
-* *package-delete* Delete a package.
-
-* *package-download* Download a package to a filename or stdout.
-
-* *package-import* Import a package.
-
-* *package-list* List available packages.
-
-* *package-show* Display details for a package.
-
-* *service-show*
-
-* *bash-completion* Prints all of the commands and options to stdout.
-
-* *help* Display help about this program or one of its subcommands.
-
-Murano optional arguments
-=========================
-
-**--version**
- show program's version number and exit
-
-**-d, --debug**
- Defaults to env[MURANOCLIENT_DEBUG]
-
-**-v, --verbose**
- Print more verbose output
-
-**-k, --insecure**
- Explicitly allow muranoclient to perform "insecure" SSL (https) requests.
- The server's certificate will not be verified against any certificate
- authorities. This option should be used with caution.
-
-**--os-cacert **
- Specify a CA bundle file to use in verifying a TLS (https) server
- certificate. Defaults to env[OS_CACERT]
-
-**--cert-file CERT_FILE**
- Path of certificate file to use in SSL connection. This file can optionally
- be prepended with the private key.
-
-**--key-file KEY_FILE**
- Path of client key to use in SSL connection. This option is not necessary
- if your key is prepended to your cert file.
-
-**--ca-file CA_FILE**
- Path of CA SSL certificate(s) used to verify the remote server certificate.
- Without this option glance looks for the default system CA certificates.
-
-**--api-timeout API_TIMEOUT**
- Number of seconds to wait for an API response, defaults to system socket
- timeout
-
-**--os-username OS_USERNAME**
- Defaults to env[OS_USERNAME]
-
-**--os-password OS_PASSWORD**
- Defaults to env[OS_PASSWORD]
-
-**--os-project-id OS_PROJECT_ID**
- Defaults to env[OS_PROJECT_ID]
-
-**--os-project-name OS_PROJECT_NAME**
- Defaults to env[OS_PROJECT_NAME]
-
-**--os-auth-url OS_AUTH_URL**
- Defaults to env[OS_AUTH_URL]
-
-**--os-region-name OS_REGION_NAME**
- Defaults to env[OS_REGION_NAME]
-
-**--os-auth-token OS_AUTH_TOKEN**
- Defaults to env[OS_AUTH_TOKEN]
-
-**--os-no-client-auth**
- Do not contact keystone for a token. Defaults to env[OS_NO_CLIENT_AUTH].
-
-**--murano-url MURANO_URL**
- Defaults to env[MURANO_URL]**
-
-**--glance-url GLANCE_URL**
- Defaults to env[GLANCE_URL]
-
-**--murano-api-version MURANO_API_VERSION**
- Defaults to env[MURANO_API_VERSION] or 1
-
-**--os-service-type OS_SERVICE_TYPE**
- Defaults to env[OS_SERVICE_TYPE]
-
-**--os-endpoint-type OS_ENDPOINT_TYPE**
- Defaults to env[OS_ENDPOINT_TYPE]
-
-**--include-password**
- Send os-username and os-password to murano.
-
-**--murano-repo-url MURANO_REPO_URL**
- Defaults to env[MURANO_REPO_URL] or
- `http://storage.apps.openstack.org_`
-
-Application catalog API v1 commands
-===================================
-
-murano bundle-import
-~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano bundle-import \[--is-public] \[--exists-action {a,s,u}]
- \[ ...]
-
-Import a bundle. ``FILE`` can be either a path to a zip file, URL or name from
-repo. if ``FILE`` is a local file does not attempt to parse requirements and
-treat Names of packages in a bundle as file names, relative to location of
-bundle file.
-
-Positional arguments
---------------------
-
-****
- Bundle URL, bundle name, or path to the bundle file
-
-Optional arguments
-------------------
-
-**--is-public**
- Make packages available to users from other project
-
-**--exists-action {a,s,u}**
- Default action when a package already exists
-
-murano category-create
-~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano category-create
-
-Create a category.
-
-Positional arguments
---------------------
-
-****
- Category name
-
-murano category-delete
-~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano category-delete \[ ...]
-
-Delete a category.
-
-Positional arguments
---------------------
-
-****
- ID of a category(s) to delete
-
-murano category-list
-~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano category-list
-
-List all available categories.
-
-murano category-show
-~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano category-show
-
-Positional arguments
---------------------
-
-****
- ID of a category(s) to show
-
-murano deployment-list
-~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano deployment-list
-
-List deployments for an environment.
-
-Positional arguments
---------------------
-
-****
- Environment ID for which to list deployments
-
-murano env-template-add-app
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano env-template-add-app
-
-Add application to the environment template.
-
-Positional arguments
---------------------
-
-****
- Environment template name
-
-****
- Path to the template.
-
-murano env-template-create
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano env-template-create
-
-Create an environment template.
-
-Positional arguments
---------------------
-
-****
- Environment template name
-
-murano env-template-del-app
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano env-template-del-app
-
-Delete application to the environment template.
-
-Positional arguments
---------------------
-
-****
- Environment template ID
-
-****
- Application ID
-
-murano env-template-delete
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano env-template-delete \[ ...]
-
-Delete an environment template.
-
-Positional arguments
---------------------
-
-****
- ID of environment(s) template to delete
-
-murano env-template-list
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano env-template-list
-
-List the environments templates.
-
-murano env-template-show
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano env-template-show
-
-Display environment template details.
-
-Positional arguments
---------------------
-
-****
- Environment template ID
-
-murano env-template-update
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano env-template-update
-
-Update an environment template.
-
-Positional arguments
---------------------
-
-****
- Environment template ID
-
-****
- Environment template name
-
-murano environment-create
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano environment-create
-
-Create an environment.
-
-Positional arguments
---------------------
-
-****
- Environment name
-
-murano environment-delete
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano environment-delete \[ ...]
-
-Delete an environment.
-
-Positional arguments
---------------------
-
-****
- ID or name of environment(s) to delete
-
-Optional arguments
-------------------
-
-**--abandon**
- If set will abandon environment without deleting any of its resources
-
-murano environment-list
-~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano environment-list
-
-List the environments.
-
-murano environment-rename
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano environment-rename
-
-Rename an environment.
-
-Positional arguments
---------------------
-
-****
- Environment ID or name
-
-****
- A name to which the environment will be renamed
-
-murano environment-show
-~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano environment-show
-
-Display environment details.
-
-Positional arguments
---------------------
-
-****
- Environment ID or name
-
-murano package-create
-~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block::console
-
- usage: murano package-create \[-t ] \[-c ]
- \[-r ] \[-n ]
- \[-f ] \[-a ]
- \[--tags \[ \[