diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index a54a246..0000000 --- a/.coveragerc +++ /dev/null @@ -1,7 +0,0 @@ -[run] -branch = True -source = tuning_box -omit = tuning_box/openstack/* - -[report] -ignore_errors = True \ No newline at end of file diff --git a/.gitignore b/.gitignore deleted file mode 100644 index d7352a0..0000000 --- a/.gitignore +++ /dev/null @@ -1,57 +0,0 @@ -*.py[cod] - -# C extensions -*.so - -# Packages -*.egg -*.egg-info -dist -build -.eggs -eggs -parts -bin -var -sdist -develop-eggs -.installed.cfg -lib -lib64 - -# Installer logs -pip-log.txt - -# Unit test / coverage reports -.coverage -.tox -nosetests.xml -.testrepository -.venv -cover -.cache -testdb - -# Translations -*.mo - -# Mr Developer -.mr.developer.cfg -.project -.pydevproject - -# Complexity -output/*.html -output/*/index.html - -# Sphinx -doc/build - -# pbr generates these -AUTHORS -ChangeLog - -# Editors -*~ -.*.swp -.*sw? diff --git a/.mailmap b/.mailmap deleted file mode 100644 index cc92f17..0000000 --- a/.mailmap +++ /dev/null @@ -1,3 +0,0 @@ -# Format is: -# -# \ No newline at end of file diff --git a/.testr.conf b/.testr.conf deleted file mode 100644 index e88bd59..0000000 --- a/.testr.conf +++ /dev/null @@ -1,9 +0,0 @@ -[DEFAULT] -test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1} \ - OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1} \ - OS_LOG_CAPTURE=${OS_LOG_CAPTURE:-1} \ - OS_DEBUG=${OS_DEBUG:-1} \ - OS_TEST_TIMEOUT=${OS_TEST_TIMEOUT:-60} \ - ${PYTHON:-python} -m subunit.run discover -t ./ . $LISTOPT $IDOPTION -test_id_option=--load-list $IDFILE -test_list_option=--list diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst deleted file mode 100644 index 3c35493..0000000 --- a/CONTRIBUTING.rst +++ /dev/null @@ -1,17 +0,0 @@ -If you would like to contribute to the development of OpenStack, you must -follow the steps in this page: - - http://docs.openstack.org/infra/manual/developers.html - -If you already have a good understanding of how the system works and your -OpenStack accounts are set up, you can skip to the development workflow -section of this documentation to learn how changes to OpenStack should be -submitted for review via the Gerrit tool: - - http://docs.openstack.org/infra/manual/developers.html#development-workflow - -Pull requests submitted through GitHub will be ignored. - -Bugs should be filed on Launchpad, not GitHub: - - https://bugs.launchpad.net/tuning_box \ No newline at end of file diff --git a/HACKING.rst b/HACKING.rst deleted file mode 100644 index 8ce6b31..0000000 --- a/HACKING.rst +++ /dev/null @@ -1,4 +0,0 @@ -tuning_box Style Commandments -=============================================== - -Read the OpenStack Style Commandments http://docs.openstack.org/developer/hacking/ \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 67db858..0000000 --- a/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/MAINTAINERS b/MAINTAINERS deleted file mode 100644 index 7b7ca70..0000000 --- a/MAINTAINERS +++ /dev/null @@ -1,32 +0,0 @@ ---- -description: - For Fuel team structure and contribution policy, see [1]. - - This is repository level MAINTAINERS file. All contributions to this - repository must be approved by one or more Core Reviewers [2]. - If you are contributing to files (or create new directories) in - root folder of this repository, please contact Core Reviewers for - review and merge requests. - - If you are contributing to subfolders of this repository, please - check 'maintainers' section of this file in order to find maintainers - for those specific modules. - - It is mandatory to get +1 from one or more maintainers before asking - Core Reviewers for review/merge in order to decrease a load on Core Reviewers [3]. - Exceptions are when maintainers are actually cores, or when maintainers - are not available for some reason (e.g. on vacation). - - [1] https://specs.openstack.org/openstack/fuel-specs/policy/team-structure - [2] https://review.openstack.org/#/admin/groups/1325,members - [3] http://lists.openstack.org/pipermail/openstack-dev/2015-August/072406.html - - Please keep this file in YAML format in order to allow helper scripts - to read this as a configuration data. - -maintainers: - -- ./: - - name: Aleksandr Kislitsky - email: akislitsky@mirantis.com - IRC: akislitsky diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index f4e62ac..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1,7 +0,0 @@ -include AUTHORS -include ChangeLog -exclude .gitignore -exclude .gitreview -recursive-include tuning_box/migrations *.py - -global-exclude *.pyc diff --git a/README.rst b/README.rst index 200fd98..86e34d6 100644 --- a/README.rst +++ b/README.rst @@ -1,292 +1,10 @@ -========== -Tuning Box -========== +This project is no longer maintained. -Tuning Box is a configuration storage for your clouds. +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". -Tuning Box can be used as a centralized storage for all configurations. It -supports Keystone authentication. By default, Tuning Box installs as a Fuel -extension but also it can be run as a service. - -* Free software: `Apache license`_ -* Source_ -* Bugs_ - -.. _Source: https://github.com/openstack/tuning-box -.. _Bugs: https://bugs.launchpad.net/fuel/+bugs?field.searchtext=&orderby=-importance&search=Search&field.tag=area-configdb+ -.. _Apache license: https://www.apache.org/licenses/LICENSE-2.0 - -Features --------- - -ConfigDB entities: - -- Environment -- Component -- Hierarchy level -- Resource definition -- Resource value -- Resource value override - -Installation ------------- - -#. Download Tuning Box RPM package or code to the Fuel Master node. The - package can be built from the source code using:: - - $ python setup.py bdist_rpm - -#. Tuning Box installs as a Fuel Nailgun extension. Therefore, perform the - DB migration and restart the Nailgun service:: - - $ nailgun_syncdb - $ systemctl restart nailgun.service - -#. Configure the Tuning Box keystone service:: - - $ export OS_USERNAME=admin OS_PASSWORD=admin OS_PROJECT_NAME=admin OS_AUTH_URL=http://10.20.0.2:5000 - $ openstack service create --name tuning-box config - $ openstack endpoint create --publicurl http://10.20.0.2:8000/api/config --region RegionOne tuning-box - -Now, you have enabled a set of ``config`` commands in the ``fuel2`` CLI. - -Commands groups for fuel2 CLI ------------------------------ - -The ``fuel2`` CLI commands groups are the following: - -- ``config comp`` - CRUD operations for components -- ``config def`` - CRUD operations for resource definitions -- ``config env`` - CRUD operations for environments -- ``config get``, ``config set``, ``config del`` - CRUD operations for - resource values -- ``config override``, ``config rm override`` - operations for resource values - overrides - -API ---- - -For all operations authentication is required. Auth token should be passed in -the X-Auth-Token HTTP header. Tuning Box installed as a Fuel Nailgun extension -thus base API URL is placed at ``http://MASTER_NODE_IP:8000/api/v1/config`` -All operations URLs should be concatenated with the base API URL. - -Environments operations -======================= - -URL: ``/environments`` -Operations: - -- (GET) list environments -- (POST) create environment - -For environment creation POST: - -.. code-block:: python - - { - 'hierarchy_levels': [ - # list of hierarchy levels - ], - 'components': [ - # list of components ids - ] - } - - -Environment operations -====================== - -URL: ``/environments/`` -Operations: - -- (GET) get environment -- (PUT/PATCH) update environment -- (DELETE) delete environment - -Components operations -===================== - -URL: ``/components`` -Operations: - -- (GET) list components -- (POST) create component - -For component creation POST: - -.. code-block:: python - - { - 'name': str, - 'resource_definitions': [ - { - 'name': str, 'content': str - } - ] - } - - -Component operations -==================== - -URL: ``/components/`` -Operations: - -- (GET) get component -- (PUT/PATCH) update component -- (DELETE) delete component - -Hierarchy levels operations -=========================== - -URL: ``/environments//hierarchy_levels`` -Operations: - -- (GET) list environment hierarchy levels - -Hierarchy levels modifications performed via environment -modifications. - -Hierarchy level operations -========================== - -URL: ``/environments//`` -Operations: - -- (GET) get hierarchy level - -.. _`keys operations`: - -Keys operations -=============== - -For performing keys operation send PATCH request to the appropriate URL. As data use -list of keys written in the order of access. For instance you have the following data: - -.. code-block:: python - - { - 'k0': { - 'k1': 'val01', - 'k2': 'val02, - 'k3': [{'k4': 'val030'}] - } - } - -For access to the val02 key path will be: ['k0', 'k2'] -If you want to modify value add required value to the keys path. For instance, if you -want change 'val02' to 'val02_new' key paths will be: ['k0', 'k2', 'val02_new'] - -If you want to delete 'k4' key use key path ['k0', 'k3', 0, 'k4'] - -Key operations work only in batch mode, so you should pass list of keys paths to the -appropriate API handler:: - - [['k0', 'k1', 'val01_new'], ['k0', 'k2', 'val02_new']] - -For adding new key 'new_k' to the data you should send the following keys paths:: - - [['new_k', 'new_val']] - -Resource definitions operations -=============================== - -URL: ``/resource_definitions`` -Operations: - -- (GET) list resource definitions -- (POST) create resource definition - -For resource definition creation POST: - -.. code-block:: python - - { - 'name': str, - 'component_id': int, - 'content': str - } - - -Resource definition operations -============================== - -URL: ``/resource_definitions/`` -Operations: - -- (GET) get resource definition -- (PUT/PATCH) update resource definition -- (DELETE) delete resource definition - -Resource definition keys operations -=================================== - -Operations with keys modifies resource definition content only. -These operations supports nested keys. For details see: `keys operations`_. - -URL: ``/resource_definitions//keys/`` -Handled keys operations: - -- get resource value key -- update resource definition key -- delete resource definition key - -Resource values operations -========================== - -URL: ``/environments//resources//values`` -Operations: - -- (GET) get resource value -- (PUT) create/update resource value - -For resource value creation set PUT HTTP request with data as workload. -This data will be stored to the resource values bound to the appropriate -level value. - -For merging data from all levels specify 'effective' parameter for GET -HTTP request. - -For tracing the level from which data is got specify 'show_lookup' -parameter for the GET HTTP request. Lookup has sense only if you are -fetching the effective values. - -Resource values keys operations -=============================== - -Operations with keys modifies resource values only. -These operations supports nested keys. For details see: `keys operations`_. - -URL: ``/environments//resources//values/keys/`` -Handled keys operations: - -- get resource values key -- update resource values key -- delete resource values key - -Resource overrides operations -============================= - -URL: ``/environments//resources//overrides`` -Operations: - -- (GET) get resource overrides -- (PUT) create/update resource overrides - -For resource value creation set PUT HTTP request with data as workload. -This data will be stored to the resource override bound to the appropriate -level value. - -Resource values keys operations -=============================== - -Operations with keys modifies resource overrides only. -These operations supports nested keys. For details see: `keys operations`_. - -URL: ``/environments//resources//overrides/keys/`` -Handled keys operations: - -- get resource value key -- update resource value key -- delete resource value key +For any further questions, please email +openstack-discuss@lists.openstack.org or join #openstack-dev on +Freenode. diff --git a/TODO b/TODO deleted file mode 100644 index 9f8ef99..0000000 --- a/TODO +++ /dev/null @@ -1,7 +0,0 @@ -* API input validation -* properly handle collections/elements in API (currently all operations are - allowed on both collection and element which leads to bad error codes) -* add cascade deletes or smth like it -* verify that schema/template is actually related to environment -* add component priorities -* add versioning of all data diff --git a/alembic.ini b/alembic.ini deleted file mode 100644 index 9469e7e..0000000 --- a/alembic.ini +++ /dev/null @@ -1,41 +0,0 @@ -[alembic] -script_location = tuning_box/migrations -# use in-memory sqlite to generate revisions -sqlalchemy.url = sqlite:/// -version_table = alembic_version - - -# Logging configuration -[loggers] -keys = root,sqlalchemy,alembic - -[handlers] -keys = console - -[formatters] -keys = generic - -[logger_root] -level = WARN -handlers = console -qualname = - -[logger_sqlalchemy] -level = WARN -handlers = -qualname = sqlalchemy.engine - -[logger_alembic] -level = INFO -handlers = -qualname = alembic - -[handler_console] -class = StreamHandler -args = (sys.stderr,) -level = NOTSET -formatter = generic - -[formatter_generic] -format = %(levelname)-5.5s [%(name)s] %(message)s -datefmt = %H:%M:%S diff --git a/babel.cfg b/babel.cfg deleted file mode 100644 index efceab8..0000000 --- a/babel.cfg +++ /dev/null @@ -1 +0,0 @@ -[python: **.py] diff --git a/bindep.txt b/bindep.txt deleted file mode 100644 index 8993680..0000000 --- a/bindep.txt +++ /dev/null @@ -1,10 +0,0 @@ -# This is a cross-platform list tracking distribution packages needed by tests; -# see http://docs.openstack.org/infra/bindep/ for additional information. - -# Requirements for DB migrations check -libpq-dev [platform:dpkg] -postgresql-devel [platform:rpm] -mysql-server [platform:dpkg] -mariadb-server [platform:rpm] -postgresql -postgresql-server [platform:rpm] diff --git a/doc/source/conf.py b/doc/source/conf.py deleted file mode 100755 index 7f3208b..0000000 --- a/doc/source/conf.py +++ /dev/null @@ -1,75 +0,0 @@ -# -*- coding: utf-8 -*- -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import sys - -sys.path.insert(0, os.path.abspath('../..')) -# -- General configuration ---------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = [ - 'sphinx.ext.autodoc', - #'sphinx.ext.intersphinx', - 'oslosphinx' -] - -# autodoc generation is a bit aggressive and a nuisance when doing heavy -# text edit cycles. -# execute "export SPHINX_DEBUG=1" in your terminal to disable - -# The suffix of source filenames. -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'tuning_box' -copyright = u'2013, OpenStack Foundation' - -# If true, '()' will be appended to :func: etc. cross-reference text. -add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -add_module_names = True - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# -- Options for HTML output -------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. Major themes that come with -# Sphinx are currently 'default' and 'sphinxdoc'. -# html_theme_path = ["."] -# html_theme = '_theme' -# html_static_path = ['static'] - -# Output file base name for HTML help builder. -htmlhelp_basename = '%sdoc' % project - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto/manual]). -latex_documents = [ - ('index', - '%s.tex' % project, - u'%s Documentation' % project, - u'OpenStack Foundation', 'manual'), -] - -# Example configuration for intersphinx: refer to the Python standard library. -#intersphinx_mapping = {'http://docs.python.org/': None} \ No newline at end of file diff --git a/doc/source/contributing.rst b/doc/source/contributing.rst deleted file mode 100644 index ed77c12..0000000 --- a/doc/source/contributing.rst +++ /dev/null @@ -1,4 +0,0 @@ -============ -Contributing -============ -.. include:: ../../CONTRIBUTING.rst \ No newline at end of file diff --git a/doc/source/index.rst b/doc/source/index.rst deleted file mode 100644 index 2eb82b2..0000000 --- a/doc/source/index.rst +++ /dev/null @@ -1,24 +0,0 @@ -.. tuning_box documentation master file, created by - sphinx-quickstart on Tue Jul 9 22:26:36 2013. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to tuning_box's documentation! -======================================================== - -Contents: - -.. toctree:: - :maxdepth: 2 - - readme - installation - usage - contributing - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/doc/source/installation.rst b/doc/source/installation.rst deleted file mode 100644 index 0e25466..0000000 --- a/doc/source/installation.rst +++ /dev/null @@ -1,12 +0,0 @@ -============ -Installation -============ - -At the command line:: - - $ pip install tuning_box - -Or, if you have virtualenvwrapper installed:: - - $ mkvirtualenv tuning_box - $ pip install tuning_box \ No newline at end of file diff --git a/doc/source/readme.rst b/doc/source/readme.rst deleted file mode 100644 index 38ba804..0000000 --- a/doc/source/readme.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../../README.rst \ No newline at end of file diff --git a/doc/source/records/01-first-show/component.json b/doc/source/records/01-first-show/component.json deleted file mode 100644 index ce86699..0000000 --- a/doc/source/records/01-first-show/component.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "comp1", - "templates": [ - { - "name": "temp1", - "content": {"asd": "ns1.a"} - } - ], - "schemas": [{ - "name": "schema1", - "content": {}, - "namespace_id": 1 - }] -} diff --git a/doc/source/records/01-first-show/environment.json b/doc/source/records/01-first-show/environment.json deleted file mode 100644 index b7dcb51..0000000 --- a/doc/source/records/01-first-show/environment.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "env1", - "components": [1], - "hierarchy_levels": ["node"] -} diff --git a/doc/source/records/01-first-show/namespace.json b/doc/source/records/01-first-show/namespace.json deleted file mode 100644 index 1a4dd2a..0000000 --- a/doc/source/records/01-first-show/namespace.json +++ /dev/null @@ -1 +0,0 @@ -{"name": "ns1"} diff --git a/doc/source/records/01-first-show/record.json b/doc/source/records/01-first-show/record.json deleted file mode 100644 index c4bc19d..0000000 --- a/doc/source/records/01-first-show/record.json +++ /dev/null @@ -1,2017 +0,0 @@ -{ - "version": 1, - "width": 158, - "height": 39, - "duration": 508.156163, - "command": "/bin/bash", - "title": "Tuning Box first show", - "env": { - "TERM": "screen", - "SHELL": "/bin/bash" - }, - "stdout": [[0.090453,"\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.102895," "], - [1.000000,"W"], - [0.223738,"e"], - [0.103918," "], - [0.216029,"h"], - [0.095900,"a"], - [0.263872,"v"], - [0.055507,"e"], - [0.104514," "], - [0.192026,"c"], - [0.095795,"l"], - [0.119794,"e"], - [0.168061,"a"], - [0.104423,"r"], - [0.511493," "], - [0.960160,"F"], - [0.168105,"u"], - [0.111982,"e"], - [0.127583,"l"], - [0.104021," "], - [0.200770,"m"], - [0.087239,"a"], - [0.168266,"s"], - [0.216622,"t"], - [0.135207,"e"], - [0.120250,"r"], - [0.024038," "], - [0.256555,"h"], - [0.087568,"e"], - [0.080034,"r"], - [0.191675,"e"], - [1.000000,","], - [0.054874," "], - [0.207927,"l"], - [0.112166,"e"], - [0.151980,"t"], - [0.473008,"'"], - [0.078913,"s"], - [0.072044," "], - [0.184946,"i"], - [0.086959,"n"], - [0.136052,"s"], - [0.095893,"t"], - [0.160802,"a"], - [0.079052,"l"], - [0.144482,"l"], - [0.103858," "], - [1.000000,"T"], - [0.151295,"u"], - [0.063626,"n"], - [0.168441,"i"], - [0.071825,"n"], - [0.176007,"g"], - [0.120153," "], - [0.159841,"B"], - [0.168142,"o"], - [0.095882,"x"], - [0.096083," "], - [0.247808,"o"], - [0.072705,"n"], - [0.103161," "], - [0.096257,"i"], - [0.151722,"t"], - [1.000000,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.071196," "], - [0.168366,"L"], - [0.241231,"e"], - [0.086412,"t"], - [0.136177,"'"], - [0.127969,"s"], - [0.071826," "], - [0.376547,"c"], - [0.087593,"h"], - [0.111803,"e"], - [0.160395,"c"], - [0.104058,"k"], - [0.119813," "], - [0.159847,"i"], - [0.096037,"f"], - [0.063964," "], - [0.256310,"t"], - [0.047807,"h"], - [0.152007,"e"], - [0.112090,"r"], - [0.159963,"e"], - [0.928326,"'"], - [0.095656,"s"], - [0.087991," "], - [0.200740,"a"], - [0.167199,"n"], - [0.208638,"y"], - [0.047361," "], - [0.296184,"d"], - [0.111742,"a"], - [0.120144,"t"], - [0.336235,"a"], - [1.000000,"b"], - [0.111841,"a"], - [0.184209,"s"], - [0.191729,"e"], - [0.087395," "], - [0.241039,"t"], - [0.118905,"a"], - [0.072033,"b"], - [0.103738,"l"], - [0.107668,"e"], - [1.000000,"s"], - [0.127942," "], - [0.295947,"o"], - [0.087229,"f"], - [0.079797," "], - [0.297060,"T"], - [0.271785,"u"], - [0.095938,"n"], - [0.119976,"i"], - [0.112304,"n"], - [0.127698,"g"], - [0.128423," "], - [0.600312,"B"], - [0.151986,"o"], - [0.111929,"x"], - [0.095904," "], - [0.111748,"i"], - [0.080368,"n"], - [0.119778," "], - [0.656405,"o"], - [0.063306,"u"], - [0.072228,"r"], - [0.368318," "], - [0.176116,"D"], - [0.079632,"B"], - [1.000000,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"sudo -u postgres psql -c '\\dt' nailgun | grep tuning_box"], - [1.000000,"\r\n"], - [0.036977,"\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.806724," "], - [0.239950,"O"], - [0.287884,"f"], - [0.103922," "], - [0.231869,"c"], - [0.080279,"o"], - [0.207935,"u"], - [0.087618,"r"], - [0.512441,"s"], - [0.496109,"e"], - [0.088270," "], - [0.199892,"t"], - [0.063471,"h"], - [0.128032,"e"], - [0.071791,"r"], - [0.149042,"e "], - [0.163321,"i"], - [0.103704,"s"], - [0.320233,"n"], - [0.688366,"'"], - [0.135860,"t"], - [0.367898,","], - [0.079841," "], - [0.464726,"l"], - [0.087695,"e"], - [0.095573,"t"], - [0.353307,"'"], - [0.047019,"s"], - [0.090436," "], - [0.261916,"d"], - [0.087771,"o"], - [0.264259,"w"], - [0.125268,"n"], - [0.210424,"l"], - [0.192229,"o"], - [0.288105,"a"], - [0.087525,"d"], - [0.104304," "], - [1.000000,"T"], - [0.376306,"u"], - [0.119353,"n"], - [0.171361,"i"], - [0.084648,"n"], - [0.088127,"g"], - [0.079873," "], - [0.224197,"B"], - [0.127993,"o"], - [0.095997,"x"], - [0.087780," "], - [0.208233,"f"], - [0.159851,"r"], - [0.528641,"o"], - [0.063618,"m"], - [0.079727," "], - [0.264089,"G"], - [0.168402,"i"], - [0.154985,"t"], - [1.000000," "], - [0.151838,"f"], - [0.079706,"i"], - [0.280615,"r"], - [0.207070,"s"], - [0.083716,"t"], - [1.000000,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [0.551500,"g"], - [0.088104,"i"], - [0.103982,"t"], - [0.080043," "], - [0.376652,"c"], - [0.079281,"l"], - [0.168551,"o"], - [0.103195,"n"], - [0.656360,"e"], - [0.031877," "], - [0.240023,"g"], - [0.087581,"i"], - [0.088161,"t"], - [0.216079,":"], - [0.191924,"/"], - [0.135905,"/"], - [0.144496,"g"], - [0.079595,"i"], - [0.095798,"t"], - [0.248187,"h"], - [0.079812,"u"], - [0.120107,"b"], - [0.208285,"."], - [0.135676,"c"], - [0.071875,"o"], - [0.072191,"m"], - [0.151982,"/"], - [0.494550,"m"], - [0.095923,"i"], - [0.070937,"r"], - [0.074764,"a"], - [0.125558,"n"], - [0.136210,"t"], - [0.115181,"i"], - [0.132721,"s"], - [0.319990,"/"], - [0.624187,"t"], - [0.248375,"u"], - [0.207609,"n"], - [0.120626,"i"], - [0.087438,"n"], - [0.144004,"g"], - [0.408028,"-"], - [0.407996,"b"], - [0.079724,"o"], - [0.113065,"x"], - [1.000000,"\r\n"], - [0.004567,"Cloning into 'tuning-box'...\r\n"], - [0.515271,"remote: Counting objects: 284, done.\u001b[K\r\nremote: Compressing objects: 7% (1/14) \u001b[K\rremote: Compressing objects: 14% (2/14) \u001b[K\rremote: Compressing objects: 21% (3/14) \u001b[K\r"], - [0.000030,"remote: Compressing objects: 28% (4/14) \u001b[K\rremote: Compressing objects: 35% (5/14) \u001b[K\rremote: Compressing objects: 42% (6/14) \u001b[K\rremote: Compressing objects: 50% (7/14) \u001b[K\rremote: Compressing objects: 57% (8/14) \u001b[K\rremote: Compressing objects: 64% (9/14) \u001b[K\rremote: Compressing objects: 71% (10/14) \u001b[K\rremote: Compressing objects: 78% (11/14) \u001b[K\r"], - [0.000061,"remote: Compressing objects: 85% (12/14) \u001b[K\rremote: Compressing objects: 92% (13/14) \u001b[K\rremote: Compressing objects: 100% (14/14) \u001b[K\rremote: Compressing objects"], - [0.001656,": 100% (14/14), done.\u001b[K\r\n"], - [0.103538,"Receiving objects: 0% (1/284) \r"], - [0.000048,"Receiving objects: 1% (3/284) \r"], - [0.000735,"Receiving objects: 2% (6/284) \r"], - [0.000094,"Receiving objects: 3% (9/284) \r"], - [0.000585,"Receiving objects: 4% (12/284) \r"], - [0.001125,"Receiving objects: 5% (15/284) \r"], - [0.000225,"Receiving objects: 6% (18/284) \r"], - [0.000137,"Receiving objects: 7% (20/284) \r"], - [0.000402,"Receiving objects: 8% (23/284) \r"], - [0.000239,"Receiving objects: 9% (26/284) \r"], - [0.000177,"Receiving objects: 10% (29/284) \r"], - [0.000178,"Receiving objects: 11% (32/284) \r"], - [0.000194,"Receiving objects: 12% (35/284) \r"], - [0.000141,"Receiving objects: 13% (37/284) \r"], - [0.000181,"Receiving objects: 14% (40/284) \r"], - [0.000164,"Receiving objects: 15% (43/284) \r"], - [0.000270,"Receiving objects: 16% (46/284) \r"], - [0.000157,"Receiving objects: 17% (49/284) \r"], - [0.000152,"Receiving objects: 18% (52/284) \r"], - [0.000142,"Receiving objects: 19% (54/284) \r"], - [0.000482,"Receiving objects: 20% (57/284) \r"], - [0.000586,"Receiving objects: 21% (60/284) \r"], - [0.000102,"Receiving objects: 22% (63/284) \r"], - [0.000189,"Receiving objects: 23% (66/284) \r"], - [0.000155,"Receiving objects: 24% (69/284) \r"], - [0.000093,"Receiving objects: 25% (71/284) \r"], - [0.000122,"Receiving objects: 26% (74/284) \r"], - [0.000230,"Receiving objects: 27% (77/284) \r"], - [0.000108,"Receiving objects: 28% (80/284) \r"], - [0.000653,"Receiving objects: 29% (83/284) \r"], - [0.096235,"Receiving objects: 30% (86/284) \r"], - [0.000445,"Receiving objects: 31% (89/284) \r"], - [0.000119,"Receiving objects: 32% (91/284) \r"], - [0.000228,"Receiving objects: 33% (94/284) \r"], - [0.000335,"Receiving objects: 34% (97/284) \r"], - [0.000552,"Receiving objects: 35% (100/284) \r"], - [0.000352,"Receiving objects: 36% (103/284) \r"], - [0.000163,"Receiving objects: 37% (106/284) \r"], - [0.000071,"Receiving objects: 38% (108/284) \r"], - [0.000047,"Receiving objects: 39% (111/284) \r"], - [0.000116,"Receiving objects: 40% (114/284) \r"], - [0.000194,"Receiving objects: 41% (117/284) \r"], - [0.000197,"Receiving objects: 42% (120/284) \r"], - [0.000069,"Receiving objects: 43% (123/284) \r"], - [0.000096,"Receiving objects: 44% (125/284) \r"], - [0.000073,"Receiving objects: 45% (128/284) \r"], - [0.000210,"Receiving objects: 46% (131/284) \r"], - [0.000157,"remote: Total 284 (delta 5), reused 0 (delta 0), pack-reused 270\u001b[K"], - [0.000542,"\r\n"], - [0.000050,"Receiving objects: 47% (134/284) \r"], - [0.000066,"Receiving objects: 48% (137/284) \r"], - [0.000123,"Receiving objects: 49% (140/284) \r"], - [0.000061,"Receiving objects: 50% (142/284) \r"], - [0.000095,"Receiving objects: 51% (145/284) \r"], - [0.000097,"Receiving objects: 52% (148/284) \r"], - [0.000095,"Receiving objects: 53% (151/284) \r"], - [0.000072,"Receiving objects: 54% (154/284) \r"], - [0.000156,"Receiving objects: 55% (157/284) \r"], - [0.000095,"Receiving objects: 56% (160/284) \r"], - [0.000093,"Receiving objects: 57% (162/284) \r"], - [0.000080,"Receiving objects: 58% (165/284) \r"], - [0.000080,"Receiving objects: 59% (168/284) \r"], - [0.000076,"Receiving objects: 60% (171/284) \r"], - [0.000207,"Receiving objects: 61% (174/284) \r"], - [0.000055,"Receiving objects: 62% (177/284) \r"], - [0.000062,"Receiving objects: 63% (179/284) \r"], - [0.000044,"Receiving objects: 64% (182/284) \r"], - [0.000044,"Receiving objects: 65% (185/284) \r"], - [0.000040,"Receiving objects: 66% (188/284) \r"], - [0.000069,"Receiving objects: 67% (191/284) \r"], - [0.000305,"Receiving objects: 68% (194/284) \r"], - [0.000043,"Receiving objects: 69% (196/284) \r"], - [0.000068,"Receiving objects: 70% (199/284) \r"], - [0.000041,"Receiving objects: 71% (202/284) \r"], - [0.000062,"Receiving objects: 72% (205/284) \r"], - [0.000041,"Receiving objects: 73% (208/284) \r"], - [0.000039,"Receiving objects: 74% (211/284) \r"], - [0.000073,"Receiving objects: 75% (213/284) \r"], - [0.000080,"Receiving objects: 76% (216/284) \r"], - [0.000065,"Receiving objects: 77% (219/284) \r"], - [0.000042,"Receiving objects: 78% (222/284) \r"], - [0.000052,"Receiving objects: 79% (225/284) \r"], - [0.000041,"Receiving objects: 80% (228/284) \r"], - [0.000040,"Receiving objects: 81% (231/284) \r"], - [0.000037,"Receiving objects: 82% (233/284) \r"], - [0.000069,"Receiving objects: 83% (236/284) \r"], - [0.000046,"Receiving objects: 84% (239/284) \r"], - [0.000058,"Receiving objects: 85% (242/284) \r"], - [0.000078,"Receiving objects: 86% (245/284) \r"], - [0.000122,"Receiving objects: 87% (248/284) \r"], - [0.000041,"Receiving objects: 88% (250/284) \r"], - [0.000040,"Receiving objects: 89% (253/284) \r"], - [0.000040,"Receiving objects: 90% (256/284) \r"], - [0.000066,"Receiving objects: 91% (259/284) \r"], - [0.000056,"Receiving objects: 92% (262/284) \r"], - [0.000041,"Receiving objects: 93% (265/284) \r"], - [0.000056,"Receiving objects: 94% (267/284) \r"], - [0.000074,"Receiving objects: 95% (270/284) \r"], - [0.000122,"Receiving objects: 96% (273/284) \r"], - [0.000203,"Receiving objects: 97% (276/284) \r"], - [0.000371,"Receiving objects: 98% (279/284) \r"], - [0.000077,"Receiving objects: 99% (282/284) \r"], - [0.000039,"Receiving objects: 100% (284/284) \r"], - [0.000050,"Receiving objects: 100% (284/284), 50.51 KiB | 0 bytes/s, done."], - [0.000023,"\r\n"], - [0.000660,"Resolving deltas: 0% (0/161) \r"], - [0.000555,"Resolving deltas: 9% (16/161) \r"], - [0.000345,"Resolving deltas: 15% (25/161) \r"], - [0.000078,"Resolving deltas: 16% (27/161) \r"], - [0.000412,"Resolving deltas: 28% (46/161) \r"], - [0.000166,"Resolving deltas: 31% (50/161) \r"], - [0.000195,"Resolving deltas: 32% (52/161) \r"], - [0.000137,"Resolving deltas: 33% (54/161) \r"], - [0.000072,"Resolving deltas: 34% (55/161) \r"], - [0.000281,"Resolving deltas: 36% (59/161) \r"], - [0.000649,"Resolving deltas: 46% (75/161) \r"], - [0.000149,"Resolving deltas: 47% (76/161) \r"], - [0.000141,"Resolving deltas: 48% (78/161) \r"], - [0.000231,"Resolving deltas: 52% (85/161) \r"], - [0.000861,"Resolving deltas: 63% (102/161) \r"], - [0.000082,"Resolving deltas: 65% (105/161) \r"], - [0.000432,"Resolving deltas: 70% (114/161) \r"], - [0.000049,"Resolving deltas: 72% (116/161) \r"], - [0.000341,"Resolving deltas: 77% (124/161) \r"], - [0.000392,"Resolving deltas: 88% (143/161) \r"], - [0.000257,"Resolving deltas: 91% (147/161) \r"], - [0.000102,"Resolving deltas: 93% (150/161) \r"], - [0.000091,"Resolving deltas: 95% (153/161) \r"], - [0.000100,"Resolving deltas: 96% (155/161) \r"], - [0.000200,"Resolving deltas: 97% (157/161) \r"], - [0.000137,"Resolving deltas: 98% (158/161) \r"], - [0.000242,"Resolving deltas: 100% (161/161) \r"], - [0.000888,"Resolving deltas: 100% (161/161), done.\r\n"], - [0.037819,"\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.136124," "], - [0.191701,"I"], - [0.168035,"n"], - [0.167854,"s"], - [0.048048,"t"], - [0.520221,"a"], - [0.151647,"l"], - [0.520136,"l"], - [0.104017," "], - [0.161096,"i"], - [0.198869,"t"], - [0.104051," "], - [0.488297,"v"], - [0.063554,"i"], - [0.168157,"a"], - [0.071924," "], - [0.288057,"p"], - [0.096139,"i"], - [0.087747,"p"], - [0.096259," "], - [0.520090,"t"], - [0.055846,"o"], - [0.111839," "], - [0.111932,"l"], - [0.144901,"e"], - [0.400161,"t"], - [0.102769," "], - [0.400823,"N"], - [0.175082,"a"], - [0.200823,"i"], - [0.424457,"l"], - [0.456122,"g"], - [0.126764,"u"], - [0.080173,"n"], - [0.103903," "], - [0.240336,"k"], - [0.111977,"n"], - [0.079795,"o"], - [0.135980,"w"], - [0.063946," "], - [0.288783,"a"], - [0.095719,"b"], - [0.095654,"o"], - [0.215781,"u"], - [0.103351,"t"], - [0.040120," "], - [0.191333,"i"], - [0.176763,"t"], - [0.279569," "], - [0.296763,"a"], - [0.134949,"s"], - [0.185139," "], - [1.000000,"e"], - [0.200819,"x"], - [0.278973,"t"], - [0.079736,"e"], - [0.128392,"n"], - [0.127861,"s"], - [0.144254,"i"], - [0.119599,"o"], - [0.120120,"n"], - [0.952490,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [0.471339,"p"], - [0.104285,"i"], - [0.136117,"p"], - [0.255642," "], - [0.184431,"i"], - [0.095453,"n"], - [0.120127,"s"], - [0.079854,"t"], - [0.120065,"a"], - [0.088096,"l"], - [0.144157,"l"], - [0.079723," "], - [0.168142,"-"], - [0.136013,"e"], - [0.063834," "], - [1.000000,"t"], - [0.071378,"u"], - [0.575501,"ning-box/"], - [0.946141,"\r\n"], - [0.428210,"\u001b[33mYou are using pip version 7.1.0, however version 8.1.0 is available."], - [0.000027,"\r\n"], - [0.000012,"You should consider upgrading via the 'pip install --upgrade pip' command.\u001b[0m"], - [0.000012,"\r\n"], - [0.004334,"Obtaining file:///root/tb_show/tuning-box"], - [0.000024,"\r\n"], - [0.436760,"Requirement already satisfied (use --upgrade to upgrade): pbr\u003e=1.6 in /usr/lib/python2.7/site-packages (from tuning-box==0.0.1.dev44)"], - [0.000032,"\r\n"], - [0.000366,"Requirement already satisfied (use --upgrade to upgrade): flask in /usr/lib/python2.7/site-packages (from tuning-box==0.0.1.dev44)"], - [0.000044,"\r\n"], - [0.001651,"Requirement already satisfied (use --upgrade to upgrade): flask-sqlalchemy in /usr/lib/python2.7/site-packages (from tuning-box==0.0.1.dev44)"], - [0.000024,"\r\n"], - [0.000928,"Requirement already satisfied (use --upgrade to upgrade): flask-restful in /usr/lib/python2.7/site-packages (from tuning-box==0.0.1.dev44)"], - [0.000023,"\r\n"], - [0.002747,"Requirement already satisfied (use --upgrade to upgrade): alembic in /usr/lib/python2.7/site-packages (from tuning-box==0.0.1.dev44)"], - [0.000024,"\r\n"], - [0.000951,"Requirement already satisfied (use --upgrade to upgrade): Werkzeug\u003e=0.7 in /usr/lib/python2.7/site-packages (from flask-\u003etuning-box==0.0.1.dev44)"], - [0.000025,"\r\n"], - [0.000417,"Requirement already satisfied (use --upgrade to upgrade): Jinja2\u003e=2.4 in /usr/lib/python2.7/site-packages (from flask-\u003etuning-box==0.0.1.dev44)"], - [0.000012,"\r\n"], - [0.000829,"Requirement already satisfied (use --upgrade to upgrade): itsdangerous\u003e=0.21 in /usr/lib/python2.7/site-packages (from flask-\u003etuning-box==0.0.1.dev44)"], - [0.000023,"\r\n"], - [0.000386,"Requirement already satisfied (use --upgrade to upgrade): SQLAlchemy\u003e=0.7 in /usr/lib64/python2.7/site-packages (from flask-sqlalchemy-\u003etuning-box==0.0.1.dev44)"], - [0.000012,"\r\n"], - [0.000602,"Requirement already satisfied (use --upgrade to upgrade): aniso8601\u003e=0.82 in /usr/lib/python2.7/site-packages (from flask-restful-\u003etuning-box==0.0.1.dev44)"], - [0.000022,"\r\n"], - [0.000629,"Requirement already satisfied (use --upgrade to upgrade): pytz in /usr/lib/python2.7/site-packages (from flask-restful-\u003etuning-box==0.0.1.dev44)"], - [0.000023,"\r\n"], - [0.000362,"Requirement already satisfied (use --upgrade to upgrade): six\u003e=1.3.0 in /usr/lib/python2.7/site-packages (from flask-restful-\u003etuning-box==0.0.1.dev44)"], - [0.000012,"\r\n"], - [0.000447,"Requirement already satisfied (use --upgrade to upgrade): Mako in /usr/lib/python2.7/site-packages (from alembic-\u003etuning-box==0.0.1.dev44)"], - [0.000012,"\r\n"], - [0.000832,"Requirement already satisfied (use --upgrade to upgrade): python-editor\u003e=0.3 in /usr/lib/python2.7/site-packages (from alembic-\u003etuning-box==0.0.1.dev44)"], - [0.000030,"\r\n"], - [0.000370,"Requirement already satisfied (use --upgrade to upgrade): MarkupSafe in /usr/lib64/python2.7/site-packages (from Jinja2\u003e=2.4-\u003eflask-\u003etuning-box==0.0.1.dev44)"], - [0.000013,"\r\n"], - [0.000433,"Requirement already satisfied (use --upgrade to upgrade): python-dateutil in /usr/lib/python2.7/site-packages (from aniso8601\u003e=0.82-\u003eflask-restful-\u003etuning-box==0.0.1.dev44)"], - [0.000013,"\r\n"], - [0.000692,"Installing collected packages: tuning-box"], - [0.000023,"\r\n"], - [0.000117," Running setup.py develop for tuning-box"], - [0.000012,"\r\n"], - [0.586730,"Successfully installed tuning-box-0.0.1.dev44\r\n"], - [0.021581,"\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.223239," "], - [1.000000,"N"], - [0.192045,"o"], - [0.110764,"w"], - [0.089566," "], - [0.470912,"l"], - [0.119570,"e"], - [0.205251,"t"], - [0.146829,"'"], - [0.128127,"s"], - [0.080414," "], - [0.256663,"r"], - [0.118918,"u"], - [0.080175,"n"], - [0.111818," "], - [0.327955,"m"], - [0.088015,"i"], - [0.312745,"g"], - [0.224238,"r"], - [0.103919,"a"], - [0.183926,"t"], - [0.063037,"i"], - [0.088723,"o"], - [0.120287,"n"], - [0.079344,"s"], - [0.088575," "], - [0.175182,"t"], - [0.096012,"o"], - [0.088367," "], - [0.263670,"c"], - [0.193707,"r"], - [0.126727,"e"], - [0.087599,"a"], - [0.167970,"t"], - [0.112417,"e"], - [0.095556," "], - [0.216271,"a"], - [0.151748,"l"], - [0.144817,"l"], - [0.063178," "], - [0.112314,"n"], - [0.087558,"e"], - [0.304904,"c"], - [0.094965,"e"], - [0.176229,"s"], - [0.143869,"s"], - [0.160223,"a"], - [0.175893,"r"], - [0.128610,"y"], - [0.143179," "], - [0.759902,"t"], - [0.103560,"a"], - [0.088637,"b"], - [0.111839,"l"], - [0.103882,"e"], - [0.104102,"s"], - [0.552261,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"n"], - [0.079522,"a"], - [0.135780,"i"], - [0.120103,"l"], - [0.521498,"g"], - [0.110751,"u"], - [0.135877,"n"], - [0.968446,"_"], - [0.192188,"s"], - [0.104396,"y"], - [1.000000,"ncdb "], - [0.685624,"\r\n"], - [0.384575,"2016-03-15 15:18:29.542 DEBUG [7f7db0016740] (settings) Looking for settings.yaml package config using old style __file__"], - [0.000231,"\r\n"], - [0.000627,"2016-03-15 15:18:29.543 DEBUG [7f7db0016740] (settings) Trying to read config file /usr/lib/python2.7/site-packages/nailgun/settings.yaml"], - [0.000145,"\r\n"], - [0.224744,"2016-03-15 15:18:29.768 DEBUG [7f7db0016740] (settings) Trying to read config file /etc/nailgun/settings.yaml"], - [0.000160,"\r\n"], - [0.322267,"INFO [alembic.runtime.migration] Context impl PostgresqlImpl.\r\n"], - [0.000559,"INFO [alembic.runtime.migration] Will assume transactional DDL.\r\n"], - [0.136278,"/usr/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/api.py:173: SAWarning: Unmanaged access of declarative attribute __tablename__ from non-mapped class ModelMixin"], - [0.000615,"\r\n"], - [0.000432," (desc.fget.__name__, cls.__name__))"], - [0.000079,"\r\n"], - [0.293840,"INFO [alembic.runtime.migration] Context impl PostgresqlImpl.\r\n"], - [0.000573,"INFO [alembic.runtime.migration] Will assume transactional DDL.\r\n"], - [0.007229,"INFO [alembic.runtime.migration] Running upgrade -\u003e f16eb4eff7c, Initial revision"], - [0.000169,"\r\n"], - [0.085441,"INFO [alembic.runtime.migration] Context impl PostgresqlImpl.\r\nINFO [alembic.runtime.migration] Will assume transactional DDL.\r\n"], - [0.013481,"INFO [alembic.runtime.migration] Context impl PostgresqlImpl.\r\nINFO [alembic.runtime.migration] Will assume transactional DDL.\r\n"], - [0.061363,"\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.159583," "], - [0.401096,"T"], - [0.199301,"h"], - [0.199847,"a"], - [0.080153,"t"], - [0.071877," "], - [0.176210,"\""], - [0.241099,"I"], - [0.167678,"n"], - [0.111116,"i"], - [0.136623,"t"], - [0.111125,"i"], - [0.200347,"a"], - [0.191910,"l"], - [0.176222," "], - [0.343701,"r"], - [0.079878,"e"], - [0.184106,"v"], - [0.071865,"i"], - [0.304220,"s"], - [0.095911,"i"], - [0.128012,"o"], - [0.127939,"n"], - [0.240475,"\""], - [0.111510," "], - [0.159962,"i"], - [0.088081,"s"], - [0.087959," "], - [0.232094,"o"], - [0.247779,"u"], - [0.079774,"r"], - [0.168966,"s"], - [0.111019,","], - [0.177064," "], - [0.254940,"l"], - [0.104099,"e"], - [0.176070,"t"], - [0.128517,"'"], - [0.119385,"s"], - [0.080286," "], - [0.311848,"c"], - [0.128272,"h"], - [0.063323,"e"], - [0.192326,"c"], - [0.127924,"k"], - [0.119970," "], - [0.241026,"t"], - [0.087142,"a"], - [0.079836,"b"], - [0.096074,"l"], - [0.081082,"e"], - [0.108477,"s"], - [1.000000,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"sudo -u postgres psql -c '\\dt' nailgun | grep tuning_box"], - [1.000000,"\r\n"], - [0.031278," public | \u001b[01;31m\u001b[Ktuning_box\u001b[m\u001b[K_alembic_version | table | nailgun\r\n public | \u001b[01;31m\u001b[Ktuning_box\u001b[m\u001b[K_component | table | nailgun\r\n public | \u001b[01;31m\u001b[Ktuning_box\u001b[m\u001b[K_environment | table | nailgun\r\n public | \u001b[01;31m\u001b[Ktuning_box\u001b[m\u001b[K_environment_components | table | nailgun\r\n public | \u001b[01;31m\u001b[Ktuning_box\u001b[m\u001b[K_environment_hierarchy_level | table | nailgun\r\n public | \u001b[01;31m\u001b[Ktuning_box\u001b[m\u001b[K_environment_hierarchy_level_value | table | nailgun\r\n public | \u001b[01;31m\u001b[Ktuning_box\u001b[m\u001b[K_environment_schema_values | table | nailgun\r\n public | \u001b[01;31m\u001b[Ktuning_box\u001b[m\u001b[K_namespace | table | nailgun\r\n public | \u001b[01;31m\u001b[Ktuning_box\u001b[m\u001b[K_schema | table | nailgun\r\n public | \u001b[01;31m\u001b[Ktuning_box\u001b[m\u001b[K_template | table | nailgun\r\n"], - [0.003631,"\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.432822," "], - [0.239837,"O"], - [0.158866,"k"], - [0.208190,","], - [0.128710," "], - [0.551960,"n"], - [0.079332,"o"], - [0.135814,"w"], - [0.121036," "], - [0.528139,"r"], - [0.103605,"e"], - [0.232231,"s"], - [0.120018,"t"], - [0.111056,"a"], - [0.112575,"r"], - [0.176199,"t"], - [0.071077," "], - [0.520313,"N"], - [0.207805,"a"], - [0.144140,"i"], - [0.158258,"l"], - [0.249598,"g"], - [0.136209,"u"], - [0.208629,"n"], - [0.079179," "], - [0.152681,"s"], - [0.171394,"e"], - [0.075887,"r"], - [0.248642,"v"], - [0.256251,"i"], - [0.151943,"c"], - [0.175923,"e"], - [1.000000,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [0.287430,"s"], - [0.158991,"e"], - [0.088830,"r"], - [0.183927,"v"], - [0.103867,"i"], - [0.103333,"c"], - [0.080265,"e"], - [0.095831," "], - [0.072066,"n"], - [0.127964,"a"], - [0.119937,"i"], - [0.112092,"l"], - [0.352389,"g"], - [0.079499,"u"], - [0.176486,"n"], - [0.096444," "], - [0.167076,"r"], - [0.080567,"e"], - [0.135802,"s"], - [0.087733,"t"], - [0.112487,"a"], - [0.104328,"r"], - [0.144024,"t"], - [0.456162,"\r\n"], - [0.033775,"Redirecting to /bin/systemctl restart nailgun.service\r\n"], - [1.000000,"\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.453047," "], - [0.167294,"A"], - [0.160460,"l"], - [0.144163,"l"], - [0.071234," "], - [0.128092,"s"], - [0.120339,"e"], - [0.095464,"t"], - [0.088588," "], - [0.167476,"t"], - [0.050091,"o"], - [0.157881," "], - [0.671993,"p"], - [0.185169,"l"], - [0.150624,"a"], - [0.176119,"y"], - [0.184825," "], - [0.335685,"w"], - [0.103714,"i"], - [0.104924,"t"], - [0.086916,"h"], - [0.088204," "], - [0.208856,"A"], - [0.127511,"P"], - [0.136020,"I"], - [0.104553," "], - [0.304012,"v"], - [0.087261,"i"], - [0.464119,"a"], - [0.088538," "], - [0.783213,"c"], - [0.119798,"u"], - [0.096230,"r"], - [0.135782,"l"], - [1.000000,","], - [0.095509," "], - [0.240735,"b"], - [0.071459,"u"], - [0.136455,"t"], - [0.063134," "], - [0.264874,"f"], - [0.216005,"i"], - [0.440424,"r"], - [0.159553,"s"], - [0.087475,"t"], - [0.080780," "], - [0.240308,"w"], - [0.119780,"e"], - [0.144201," "], - [0.312153,"n"], - [0.094697,"e"], - [0.161021,"e"], - [0.103503,"d"], - [0.104507," "], - [0.123998,"a"], - [0.074791," "], - [0.297297,"t"], - [0.086687,"o"], - [0.145094,"k"], - [0.095426,"e"], - [0.440015,"n"], - [1.000000,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [0.343076,"#"], - [0.091435," "], - [0.156523,"I"], - [0.256056," "], - [0.336168,"h"], - [0.103611,"a"], - [0.184251,"v"], - [0.079639,"e"], - [0.088196," "], - [1.000000,"n"], - [0.143542,"e"], - [0.224543,"c"], - [0.559257,"e"], - [0.199685,"s"], - [0.144742,"s"], - [0.160137,"a"], - [0.127181,"r"], - [0.184157,"y"], - [0.104110," "], - [1.000000,"O"], - [0.495640,"S"], - [0.248598,"_"], - [0.488516,"*"], - [0.143320," "], - [0.522328,"e"], - [0.262363,"n"], - [0.152776,"v"], - [0.111337,"i"], - [0.289362,"r"], - [0.085420,"o"], - [0.072914,"n"], - [0.215704,"m"], - [0.120563,"e"], - [0.120021,"n"], - [0.103859,"t"], - [0.087143," "], - [0.448936,"v"], - [0.055386,"a"], - [0.143075,"r"], - [0.120719,"i"], - [0.223768,"a"], - [0.279896,"b"], - [0.120017,"l"], - [0.104409,"e"], - [0.127642,"s"], - [0.156133," "], - [0.819720,"s"], - [0.176260,"e"], - [0.239511,"t"], - [0.097324," "], - [1.000000,"u"], - [0.040124,"p"], - [0.767911," "], - [0.439120,"("], - [0.576054,"O"], - [0.108039,"S"], - [0.116300,"_"], - [0.256229,"U"], - [0.118314,"S"], - [0.226439,"E"], - [0.110927,"R"], - [0.671644,"N"], - [0.144681,"A"], - [0.131190,"M"], - [0.136460,"E"], - [0.358663,","], - [0.068845," "], - [0.264170,"O"], - [0.106243,"S"], - [0.149654,"_"], - [0.688082,"P"], - [0.215902,"R"], - [0.103906,"O"], - [0.247933,"J"], - [0.128072,"E"], - [0.200023,"C"], - [0.800430,"T"], - [0.216218,"_"], - [0.280148,"N"], - [0.359229,"A"], - [0.248352,"M"], - [0.087234,"E"], - [0.240064,","], - [0.176917," "], - [0.447262,"O"], - [0.111947,"S"], - [0.136489,"_"], - [0.335545,"P"], - [0.184589,"A"], - [0.344016,"S"], - [0.176074,"S"], - [0.567669,"W"], - [0.063175,"O"], - [0.121211,"R"], - [0.271645,"D"], - [0.320306,","], - [0.095142," "], - [0.232490,"O"], - [0.128138,"S"], - [0.095251,"_"], - [0.177019,"A"], - [0.327877,"U"], - [0.175864,"T"], - [0.111921,"H"], - [0.520181,"_"], - [0.231994,"U"], - [0.122130,"R"], - [0.117281,"L"], - [0.320144,")"], - [1.000000,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"eval $(openstack token issue --format shell --prefix token_)"], - [1.000000,"\r\n"], - [0.744533,"\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.191366," "], - [0.239970,"N"], - [0.168330,"o"], - [0.096479,"w"], - [0.079555," "], - [0.120102,"l"], - [0.079955,"e"], - [0.103728,"t"], - [0.239977,"'"], - [0.095969,"s"], - [0.103860," "], - [0.232573,"c"], - [0.192305,"r"], - [0.111575,"e"], - [0.127909,"a"], - [0.111856,"t"], - [0.079886,"e"], - [0.120000," "], - [0.200196,"a"], - [0.063793," "], - [0.200480,"n"], - [0.127573,"a"], - [0.208139,"m"], - [0.143850,"e"], - [0.384422,"s"], - [0.367703,"p"], - [0.103876,"a"], - [0.128029,"c"], - [0.087999,"e"], - [0.119942,"."], - [0.112173," "], - [0.552193,"I"], - [0.087788," "], - [0.554915,"h"], - [0.125265,"a"], - [0.137062,"v"], - [0.103154,"e"], - [0.095853," "], - [0.612086,"a"], - [0.074195," "], - [0.235117,"J"], - [0.379428,"S"], - [0.002446,"O"], - [0.003271,"N"], - [0.004311," "], - [0.354710,"f"], - [0.160294,"i"], - [0.035932,"l"], - [0.058935,"e"], - [0.087149," "], - [1.000000,"t"], - [0.047601,"o"], - [0.080293," "], - [1.000000,"p"], - [0.054942,"o"], - [0.080141,"s"], - [0.080696,"t"], - [0.103254," "], - [0.728206,"t"], - [0.103791,"o"], - [0.120047," "], - [0.176053,"s"], - [0.119931,"e"], - [0.080834,"r"], - [0.199170,"v"], - [0.120463,"i"], - [0.087712,"c"], - [0.095761,"e"], - [1.000000,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [0.439351,"v"], - [0.079918,"i"], - [0.081782,"m"], - [0.086201," "], - [0.808223,"n"], - [0.095748,"a"], - [0.112203,"m"], - [0.103688,"e"], - [0.154606,"s"], - [0.366192,"p"], - [0.174991,"ace.json "], - [1.000000,"\r\n"], - [0.058036,"\u001b[?1049h\u001b[?1h\u001b="], - [0.002965,"\u001b[1;39r\u001b[34l\u001b[34h\u001b[?25h\u001b[23m\u001b[24m\u001b[0m\u001b[H\u001b[J\u001b[?25l\u001b[39;1H\"namespace.json\""], - [0.000659," 1L, 16C"], - [0.006890,"\u001b[1;1H\u001b[36m\u001b[46m{\u001b[0m\u001b[31m\"name\"\u001b[0m: \u001b[31m\"ns1\"\u001b[0m\u001b[36m\u001b[46m}\u001b[0m\r\n\u001b[1m\u001b[34m~ \u001b[3;1H~ \u001b[4;1H~ \u001b[5;1H~ \u001b[6;1H~ \u001b[7;1H~ \u001b[8;1H~ \u001b[9;1H~ \u001b[10;1H~ \u001b[11;1H~ \u001b[12;1H~ \u001b[13;1H~ "], - [0.000056,"\u001b[14;1H~ \u001b[15;1H~ \u001b[16;1H~ \u001b[17;1H~ \u001b[18;1H~ \u001b[19;1H~ \u001b[20;1H~ \u001b[21;1H~ \u001b[22;1H~ \u001b[23;1H~ \u001b[24;1H~ \u001b[25;1H~ \u001b[26;1H~ "], - [0.000117," \u001b[27;1H~ \u001b[28;1H~ \u001b[29;1H~ \u001b[30;1H~ \u001b[31;1H~ \u001b[32;1H~ \u001b[33;1H~ \u001b[34;1H~ \u001b[35;1H~ \u001b[36;1H~ \u001b[37;1H~ \u001b[38;1H~ \u001b[0m\u001b[39;141H1,1\u001b[11CAll\u001b[1;1H\u001b[34h\u001b[?25h"], - [1.000000,"\u001b[?25l\u001b[39;1H\u001b[K\u001b[39;1H:\u001b[34h\u001b[?25h"], - [0.183144,"q\u001b[?25l\u001b[34h\u001b[?25h"], - [1.000000,"\r\u001b[?25l\u001b[39;1H\u001b[K\u001b[39;1H\u001b[?1l\u001b\u003e\u001b[34h\u001b[?25h\u001b[?1049l"], - [0.000617,"\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.415824," "], - [0.183874,"Y"], - [0.384361,"e"], - [0.143724,"s"], - [0.152632,","], - [0.175485," "], - [0.143895,"n"], - [0.119894,"a"], - [0.104186,"m"], - [0.095902,"e"], - [0.176427,"s"], - [0.079413,"p"], - [0.144155,"a"], - [0.144501,"c"], - [0.071341,"e"], - [0.112140," "], - [0.079956,"i"], - [0.120162,"s"], - [0.079973," "], - [0.488325,"j"], - [0.079659,"u"], - [0.080636,"s"], - [0.095318,"t"], - [0.072591," "], - [0.111205,"a"], - [0.112245," "], - [0.191928,"n"], - [0.127861,"a"], - [0.136183,"m"], - [0.151951,"e"], - [1.000000,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [0.663621,"#"], - [0.431055," "], - [0.208260,"L"], - [0.199786,"e"], - [0.112714,"t"], - [0.119365,"'"], - [0.143851,"s"], - [0.079844," "], - [0.288442,"p"], - [0.071848,"o"], - [0.143697,"s"], - [0.136127,"t"], - [0.088005," "], - [0.063864,"i"], - [0.120474,"t"], - [1.000000,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"curl -H \"X-Auth-token: $token_id\" http://10.20.0.2:8000/api/config/"], - [1.000000,"namespaces --data @namespace.json -H \"Content-type: application/json\""], - [1.000000,"\r\n"], - [0.270396,"{\"id\": 1, \"name\": \"ns1\"}\r\n"], - [0.000955,"\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.087508," "], - [0.408540,"N"], - [0.208086,"o"], - [0.112083,"t"], - [0.087740,"e"], - [0.120409," "], - [0.216476,"t"], - [0.119330,"h"], - [0.104336,"a"], - [0.087823,"t"], - [0.079930," "], - [0.248200,"w"], - [0.112602,"e"], - [0.086993," "], - [0.961326,"u"], - [0.094898,"s"], - [0.112112,"e"], - [0.896873," "], - [0.215105,"N"], - [0.184228,"a"], - [0.079577,"i"], - [0.104630,"l"], - [0.424196,"g"], - [0.063122,"u"], - [0.200404,"n"], - [0.632110,"'"], - [0.063580,"s"], - [0.104079," "], - [0.264027,"e"], - [0.096138,"n"], - [0.135797,"d"], - [0.200102,"p"], - [0.071975,"o"], - [0.232188,"i"], - [0.095716,"n"], - [0.080122,"t"], - [0.224391," "], - [1.000000,"http://10.20.0.2:8000/api/"], - [0.398003," "], - [0.857568,"a"], - [0.087091,"n"], - [0.103073,"d"], - [0.079729," "], - [0.079959,"a"], - [0.104261," "], - [1.000000,"\""], - [0.736676,"c"], - [0.255247,"o"], - [0.095976,"n"], - [0.271989,"f"], - [0.111709,"i"], - [0.352239,"g"], - [0.111708,"/"], - [0.832359,"\""], - [0.160157," "], - [1.000000,"s"], - [0.095606,"u"], - [0.152006,"f"], - [0.160021,"f"], - [0.240028,"i"], - [0.384145,"x"], - [1.000000,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.144057," "], - [0.264723,"N"], - [0.175841,"o"], - [0.119125,"w"], - [0.088173," "], - [0.239825,"l"], - [0.087951,"e"], - [0.191941,"t"], - [0.183884,"'"], - [0.088171,"s"], - [0.064081," "], - [1.000000,"r"], - [0.071690,"e"], - [0.488314,"m"], - [0.096372,"e"], - [0.087535,"m"], - [0.600742,"b"], - [0.127079,"e"], - [0.095905,"r"], - [0.071996," "], - [0.208090,"t"], - [0.112071,"h"], - [0.180100,"a"], - [0.064558,"t"], - [0.075201," "], - [1.000000,"o"], - [0.087819,"u"], - [0.104013,"r"], - [0.063731," "], - [0.295917,"n"], - [0.120229,"a"], - [0.095126,"m"], - [0.104224,"e"], - [0.207893,"s"], - [0.096015,"p"], - [0.160120,"a"], - [0.144599,"c"], - [0.111144,"e"], - [0.112285," "], - [0.407121,"h"], - [0.096591,"a"], - [0.168976,"s"], - [0.095137," "], - [1.000000,"I"], - [0.095861,"D"], - [0.072039," "], - [0.744179,"1"], - [0.280154," "], - [0.192086,"a"], - [0.127672,"n"], - [0.096430,"d"], - [0.063483," "], - [0.249297,"c"], - [0.206888,"r"], - [0.119755,"e"], - [0.104194,"a"], - [0.103969,"t"], - [0.111899,"e"], - [0.080145," "], - [1.000000,"a"], - [0.098282," "], - [0.189626,"c"], - [0.119892,"o"], - [0.088052,"m"], - [0.168321,"p"], - [0.103726,"o"], - [1.000000,"n"], - [0.144484,"e"], - [0.055172,"n"], - [0.240469,"t"], - [1.000000,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [0.728155,"v"], - [0.087427,"i"], - [0.039653,"m"], - [0.064021," "], - [1.000000,"c"], - [0.079609,"o"], - [0.079768,"m"], - [0.168270,"p"], - [0.282834,"onent.json "], - [1.000000,"\r\n"], - [0.059001,"\u001b[?1049h\u001b[?1h\u001b="], - [0.002331,"\u001b[1;39r\u001b[34l\u001b[34h\u001b[?25h\u001b[23m\u001b[24m\u001b[0m\u001b[H\u001b[J\u001b[?25l\u001b[39;1H\"component.json\""], - [0.000892," 14L, 203C"], - [0.009578,"\u001b[1;1H\u001b[36m\u001b[46m{\u001b[0m\r\n \u001b[31m\"name\"\u001b[0m: \u001b[31m\"comp1\"\u001b[0m,\r\n \u001b[31m\"templates\"\u001b[0m: \u001b[36m[\r\n\u001b[0m \u001b[36m{\u001b[0m\u001b[5;7H\u001b[31m\"name\"\u001b[0m: \u001b[31m\"temp1\"\u001b[0m,\u001b[6;7H\u001b[31m\"content\"\u001b[0m: \u001b[36m{\u001b[0m\u001b[31m\"asd\"\u001b[0m: \u001b[31m\"ns1.a\"\u001b[0m\u001b[36m}\r\n\u001b[0m \u001b[36m}\r\n\u001b[0m \u001b[36m]\u001b[0m,\r\n \u001b[31m\"schemas\"\u001b[0m: \u001b[36m[{\u001b[0m\r\n \u001b[31m\"name\"\u001b[0m: \u001b[31m\"schema1\"\u001b[0m,\r\n \u001b[31m\"content\"\u001b[0m: \u001b[36m{}\u001b[0m,\r\n \u001b[31m\"namespace_id\"\u001b[0m: NS_ID\r\n \u001b[36m}]\u001b[0m\r\n\u001b[36m\u001b[46m}\u001b[0m\r\n\u001b[1m\u001b[34m~ \u001b[16;1H~ \u001b[17;1H~ \u001b[18;1H~ \u001b[19;1H~ \u001b[20;1H~ \u001b[21;1H~ \u001b[22;1H~ \u001b[23;1H~ \u001b[24;1H~ "], - [0.001060," \u001b[25;1H~ \u001b[26;1H~ \u001b[27;1H~ \u001b[28;1H~ \u001b[29;1H~ \u001b[30;1H~ \u001b[31;1H~ \u001b[32;1H~ \u001b[33;1H~ \u001b[34;1H~ \u001b[35;1H~ \u001b[36;1H~ \u001b[37;1H~ \u001b[38;1H~ \u001b[0m\u001b[39;141H1,1\u001b[11CAll\u001b[1;1H\u001b[34h\u001b[?25h"], - [0.726611,"\u001b[?25l\u001b[36m{\u001b[14;1H}\u001b[0m\u001b[39;141H2\u001b[2;1H\u001b[34h\u001b[?25h"], - [0.659242,"\u001b[?25l\u001b[39;141H3\u001b[3;1H\u001b[34h\u001b[?25h"], - [0.039278,"\u001b[?25l\u001b[39;141H4\u001b[4;1H\u001b[34h\u001b[?25h"], - [0.040228,"\u001b[?25l\u001b[39;141H5\u001b[5;1H\u001b[34h\u001b[?25h"], - [0.040272,"\u001b[?25l\u001b[39;141H6\u001b[6;1H\u001b[34h\u001b[?25h"], - [0.040570,"\u001b[?25l\u001b[39;141H7\u001b[7;1H\u001b[34h\u001b[?25h"], - [0.040319,"\u001b[?25l\u001b[39;141H8\u001b[8;1H\u001b[34h\u001b[?25h"], - [0.040410,"\u001b[?25l\u001b[39;141H9\u001b[9;1H\u001b[34h\u001b[?25h"], - [0.040160,"\u001b[?25l\u001b[39;141H10,1\u001b[10;1H\u001b[34h\u001b[?25h"], - [0.040100,"\u001b[?25l\u001b[39;142H1\u001b[11;1H\u001b[34h\u001b[?25h"], - [0.041074,"\u001b[?25l\u001b[39;142H2\u001b[12;1H\u001b[34h\u001b[?25h"], - [0.185387,"\u001b[?25l\u001b[39;142H3\u001b[13;1H\u001b[34h\u001b[?25h"], - [0.287608,"\u001b[?25l\u001b[39;142H2\u001b[12;1H\u001b[34h\u001b[?25h"], - [0.224531,"\u001b[?25l\u001b[39;144H5\u001b[12;5H\u001b[34h\u001b[?25h"], - [0.511830,"\u001b[?25l\u001b[39;144H6\u001b[12;6H\u001b[34h\u001b[?25h"], - [0.175875,"\u001b[?25l\u001b[39;144H18\u001b[12;18H\u001b[34h\u001b[?25h"], - [0.408280,"\u001b[?25l\u001b[39;144H21\u001b[12;21H\u001b[34h\u001b[?25h"], - [0.760562,"\u001b[?25l\u001b[39;1H\u001b[1m-- INSERT --\u001b[0m\u001b[39;13H\u001b[K\u001b[39;141H12,21\u001b[9CAll\u001b[12;21H\u001b[K\u001b[12;21H\u001b[34h\u001b[?25h"], - [0.912060,"\u001b[?25l1\u001b[39;145H2\u001b[12;22H\u001b[34h\u001b[?25h"], - [0.592289,"\u001b[39;1H\u001b[K\u001b[?25l\u001b[39;141H12,21\u001b[9CAll\u001b[12;21H\u001b[34h\u001b[?25h\u001b[?25l\u001b[39;142H1,18\u001b[11;18H\u001b[34h\u001b[?25h"], - [0.151125,"\u001b[?25l\u001b[39;142H0,21\u001b[10;21H\u001b[34h\u001b[?25h"], - [0.153747,"\u001b[?25l\u001b[9;15H\u001b[36m\u001b[46m{\u001b[13;3H}\u001b[0m\u001b[39;141H9,15 \u001b[9;15H\u001b[34h\u001b[?25h"], - [0.150535,"\u001b[?25l\u001b[36m{\u001b[13;3H}\u001b[0m\u001b[39;141H8,4 \u001b[8;4H\u001b[34h\u001b[?25h"], - [0.129282,"\u001b[?25l\u001b[4;5H\u001b[36m\u001b[46m{\u001b[7;5H}\u001b[0m\u001b[39;141H7,5\u001b[7;5H\u001b[34h\u001b[?25h"], - [0.119021,"\u001b[?25l\u001b[4;5H\u001b[36m{\u001b[7;5H}\u001b[0m\u001b[39;141H6,21\u001b[6;21H\u001b[34h\u001b[?25h"], - [0.151449,"\u001b[?25l\u001b[39;141H5\u001b[5;21H\u001b[34h\u001b[?25h"], - [0.449121,"\u001b[?25l\u001b[4;5H\u001b[36m\u001b[46m{\u001b[7;5H}\u001b[0m\u001b[39;141H4,5 \u001b[4;5H\u001b[34h\u001b[?25h"], - [1.000000,"\u001b[?25l\u001b[36m{\u001b[7;5H}\u001b[0m\u001b[39;141H5,21\u001b[5;21H\u001b[34h\u001b[?25h"], - [0.190351,"\u001b[?25l\u001b[39;141H6\u001b[6;21H\u001b[34h\u001b[?25h"], - [0.479938,"\u001b[?25l\u001b[39;1H\u001b[1m-- INSERT --\u001b[0m\u001b[39;141H\u001b[K\u001b[39;141H6,34\u001b[10CAll"], - [0.002007,"\u001b[6;18H\u001b[36m\u001b[46m{\u001b[14C}"], - [0.001257,"\u001b[0m\u001b[39;141H\u001b[K\u001b[39;141H6,34\u001b[10CAll\u001b[6;34H\u001b[34h\u001b[?25h"], - [0.334390,"\u001b[?25l\u001b[6;18H\u001b[36m{\u001b[14C}\u001b[0m\u001b[39;144H5\u001b[6;35H\u001b[34h\u001b[?25h"], - [0.166983,"\u001b[?25l\u001b[39;144H6\u001b[6;36H\u001b[34h\u001b[?25h"], - [0.232603,"\u001b[?25l#\u001b[39;144H7\u001b[6;37H\u001b[34h\u001b[?25h"], - [0.079577,"\u001b[?25l\u001b[39;144H8\u001b[6;38H\u001b[34h\u001b[?25h"], - [0.615692,"\u001b[?25lT\u001b[39;144H9\u001b[6;39H\u001b[34h\u001b[?25h"], - [0.512130,"\u001b[?25le\u001b[39;143H40\u001b[6;40H\u001b[34h\u001b[?25h"], - [0.159991,"\u001b[?25lm\u001b[39;144H1\u001b[6;41H\u001b[34h\u001b[?25h"], - [0.223624,"\u001b[?25lp\u001b[39;144H2\u001b[6;42H\u001b[34h\u001b[?25h"], - [0.135833,"\u001b[?25ll\u001b[39;144H3\u001b[6;43H\u001b[34h\u001b[?25h"], - [0.128622,"\u001b[?25la\u001b[39;144H4\u001b[6;44H\u001b[34h\u001b[?25h"], - [0.575950,"\u001b[?25lt\u001b[39;144H5\u001b[6;45H\u001b[34h\u001b[?25h"], - [0.087668,"\u001b[?25le\u001b[39;144H6\u001b[6;46H\u001b[34h\u001b[?25h"], - [0.064649,"\u001b[?25l\u001b[39;144H7\u001b[6;47H\u001b[34h\u001b[?25h"], - [0.279531,"\u001b[?25lw\u001b[39;144H8\u001b[6;48H\u001b[34h\u001b[?25h"], - [0.119919,"\u001b[?25li\u001b[39;144H9\u001b[6;49H\u001b[34h\u001b[?25h"], - [0.167865,"\u001b[?25ll\u001b[39;143H50\u001b[6;50H\u001b[34h\u001b[?25h"], - [0.136348,"\u001b[?25ll\u001b[39;144H1\u001b[6;51H\u001b[34h\u001b[?25h"], - [0.071588,"\u001b[?25l\u001b[39;144H2\u001b[6;52H\u001b[34h\u001b[?25h"], - [0.216342,"\u001b[?25lh\u001b[39;144H3\u001b[6;53H\u001b[34h\u001b[?25h"], - [0.087675,"\u001b[?25la\u001b[39;144H4\u001b[6;54H\u001b[34h\u001b[?25h"], - [0.472533,"\u001b[?25lv\u001b[39;144H5\u001b[6;55H\u001b[34h\u001b[?25h"], - [0.103649,"\u001b[?25le\u001b[39;144H6\u001b[6;56H\u001b[34h\u001b[?25h"], - [0.087611,"\u001b[?25l\u001b[39;144H7\u001b[6;57H\u001b[34h\u001b[?25h"], - [0.882261,"\u001b[?25lj\u001b[39;144H8\u001b[6;58H\u001b[34h\u001b[?25h"], - [0.070012,"\u001b[?25lu\u001b[39;144H9\u001b[6;59H\u001b[34h\u001b[?25h"], - [0.111947,"\u001b[?25ls\u001b[39;143H60\u001b[6;60H\u001b[34h\u001b[?25h"], - [0.104726,"\u001b[?25lt\u001b[39;144H1\u001b[6;61H\u001b[34h\u001b[?25h"], - [0.071262,"\u001b[?25l\u001b[39;144H2\u001b[6;62H\u001b[34h\u001b[?25h"], - [0.817329,"\u001b[?25lo\u001b[39;144H3\u001b[6;63H\u001b[34h\u001b[?25h"], - [0.078520,"\u001b[?25ln\u001b[39;144H4\u001b[6;64H\u001b[34h\u001b[?25h"], - [0.128509,"\u001b[?25le\u001b[39;144H5\u001b[6;65H\u001b[34h\u001b[?25h"], - [0.063663,"\u001b[?25l\u001b[39;144H6\u001b[6;66H\u001b[34h\u001b[?25h"], - [0.488212,"\u001b[?25lv\u001b[39;144H7\u001b[6;67H\u001b[34h\u001b[?25h"], - [0.120649,"\u001b[?25la\u001b[39;144H8\u001b[6;68H\u001b[34h\u001b[?25h"], - [0.199351,"\u001b[?25ll\u001b[39;144H9\u001b[6;69H\u001b[34h\u001b[?25h"], - [0.080699,"\u001b[?25lu\u001b[39;143H70\u001b[6;70H\u001b[34h\u001b[?25h"], - [0.119434,"\u001b[?25le\u001b[39;144H1\u001b[6;71H\u001b[34h\u001b[?25h"], - [0.096200,"\u001b[?25l\u001b[39;144H2\u001b[6;72H\u001b[34h\u001b[?25h"], - [0.136297,"\u001b[?25li\u001b[39;144H3\u001b[6;73H\u001b[34h\u001b[?25h"], - [0.088162,"\u001b[?25l\u0008\u001b[33min\u001b[0m\u001b[39;144H4\u001b[6;74H\u001b[34h\u001b[?25h"], - [0.119403,"\u001b[?25l\u001b[39;144H5\u001b[6;75H\u001b[34h\u001b[?25h"], - [0.255583,"\u001b[?25li\u001b[39;144H6\u001b[6;76H\u001b[34h\u001b[?25h"], - [0.216209,"\u001b[?25lt\u001b[39;144H7\u001b[6;77H\u001b[34h\u001b[?25h"], - [1.000000,"\u001b[39;1H\u001b[K\u001b[6;76H"], - [0.989837,"\u001b[?25l\u001b[39;141H6,76\u001b[10CAll\u001b[6;76H\u001b[34h\u001b[?25h\u001b[?25l\u001b[4;5H\u001b[36m\u001b[46m{\u001b[7;5H}\u001b[0m\u001b[39;141H7,5 \u001b[7;5H\u001b[34h\u001b[?25h"], - [0.164771,"\u001b[?25l\u001b[4;5H\u001b[36m{\u001b[7;5H}\u001b[0m\u001b[39;141H8,4\u001b[8;4H\u001b[34h\u001b[?25h"], - [0.144555,"\u001b[?25l\u001b[9;15H\u001b[36m\u001b[46m{\u001b[13;3H}\u001b[0m\u001b[39;141H9,15\u001b[9;15H\u001b[34h\u001b[?25h"], - [0.142852,"\u001b[?25l\u001b[36m{\u001b[13;3H}\u001b[0m\u001b[39;141H10,22\u001b[10;22H\u001b[34h\u001b[?25h"], - [0.151685,"\u001b[?25l\u001b[39;142H1,18\u001b[11;18H\u001b[34h\u001b[?25h"], - [0.809083,"\u001b[?25l\u001b[39;1H\u001b[1m-- INSERT --\u001b[0m\u001b[39;141H\u001b[K\u001b[39;141H11,19\u001b[9CAll\u001b[11;19H\u001b[34h\u001b[?25h"], - [0.295840,"\u001b[?25l\u001b[39;144H20\u001b[11;20H\u001b[34h\u001b[?25h"], - [0.415924,"\u001b[?25l\u001b[39;145H1\u001b[11;21H\u001b[34h\u001b[?25h"], - [0.215654,"\u001b[?25l#\u001b[39;145H2\u001b[11;22H\u001b[34h\u001b[?25h"], - [0.096744,"\u001b[?25l\u001b[39;145H3\u001b[11;23H\u001b[34h\u001b[?25h"], - [0.840412,"\u001b[?25lN\u001b[39;145H4\u001b[11;24H\u001b[34h\u001b[?25h"], - [0.172752,"\u001b[?25lo\u001b[39;145H5\u001b[11;25H\u001b[34h\u001b[?25h"], - [0.074182,"\u001b[?25l\u001b[39;145H6\u001b[11;26H\u001b[34h\u001b[?25h"], - [0.224534,"\u001b[?25ls\u001b[39;145H7\u001b[11;27H\u001b[34h\u001b[?25h"], - [0.175155,"\u001b[?25lc\u001b[39;145H8\u001b[11;28H\u001b[34h\u001b[?25h"], - [0.216091,"\u001b[?25lh\u001b[39;145H9\u001b[11;29H\u001b[34h\u001b[?25h"], - [0.151986,"\u001b[?25le\u001b[39;144H30\u001b[11;30H\u001b[34h\u001b[?25h"], - [0.157910,"\u001b[?25lm\u001b[39;145H1\u001b[11;31H\u001b[34h\u001b[?25h"], - [0.226858,"\u001b[?25la\u001b[39;145H2\u001b[11;32H\u001b[34h\u001b[?25h"], - [0.127072,"\u001b[?25l\u001b[39;145H3\u001b[11;33H\u001b[34h\u001b[?25h"], - [0.353099,"\u001b[?25lf\u001b[39;145H4\u001b[11;34H\u001b[34h\u001b[?25h"], - [0.407182,"\u001b[?25l\u001b[11;33H\u001b[K\u001b[39;145H3\u001b[11;33H\u001b[34h\u001b[?25h"], - [0.079979,"\u001b[?25ld\u001b[39;145H4\u001b[11;34H\u001b[34h\u001b[?25h"], - [0.088568,"\u001b[?25le\u001b[39;145H5\u001b[11;35H\u001b[34h\u001b[?25h"], - [0.087166,"\u001b[?25lf\u001b[39;145H6\u001b[11;36H\u001b[34h\u001b[?25h"], - [0.088241,"\u001b[?25li\u001b[39;145H7\u001b[11;37H\u001b[34h\u001b[?25h"], - [0.343859,"\u001b[?25ln\u001b[39;145H8\u001b[11;38H\u001b[34h\u001b[?25h"], - [0.088046,"\u001b[?25li\u001b[39;145H9\u001b[11;39H\u001b[34h\u001b[?25h"], - [0.200739,"\u001b[?25lt\u001b[39;144H40\u001b[11;40H\u001b[34h\u001b[?25h"], - [0.071064,"\u001b[?25li\u001b[39;145H1\u001b[11;41H\u001b[34h\u001b[?25h"], - [0.112325,"\u001b[?25lo\u001b[39;145H2\u001b[11;42H\u001b[34h\u001b[?25h"], - [0.071807,"\u001b[?25ln\u001b[39;145H3\u001b[11;43H\u001b[34h\u001b[?25h"], - [0.136720,"\u001b[?25l\u001b[39;145H4\u001b[11;44H\u001b[34h\u001b[?25h"], - [0.183316,"\u001b[?25lh\u001b[39;145H5\u001b[11;45H\u001b[34h\u001b[?25h"], - [0.079835,"\u001b[?25le\u001b[39;145H6\u001b[11;46H\u001b[34h\u001b[?25h"], - [0.089026,"\u001b[?25lr\u001b[39;145H7\u001b[11;47H\u001b[34h\u001b[?25h"], - [0.102982,"\u001b[?25le\u001b[39;145H8\u001b[11;48H\u001b[34h\u001b[?25h"], - [0.024573,"\u001b[?25l\u001b[39;145H9\u001b[11;49H\u001b[34h\u001b[?25h"], - [0.399736,"\u001b[?25ls\u001b[39;144H50\u001b[11;50H\u001b[34h\u001b[?25h"], - [0.103862,"\u001b[?25li\u001b[39;145H1\u001b[11;51H\u001b[34h\u001b[?25h"], - [0.185076,"\u001b[?25ln\u001b[39;145H2\u001b[11;52H\u001b[34h\u001b[?25h"], - [0.110940,"\u001b[?25lc\u001b[39;145H3\u001b[11;53H\u001b[34h\u001b[?25h"], - [0.103866,"\u001b[?25le\u001b[39;145H4\u001b[11;54H\u001b[34h\u001b[?25h"], - [0.088116,"\u001b[?25l\u001b[39;145H5\u001b[11;55H\u001b[34h\u001b[?25h"], - [1.000000,"\u001b[?25lv\u001b[39;145H6\u001b[11;56H\u001b[34h\u001b[?25h"], - [0.079592,"\u001b[?25la\u001b[39;145H7\u001b[11;57H\u001b[34h\u001b[?25h"], - [0.319642,"\u001b[?25ll\u001b[39;145H8\u001b[11;58H\u001b[34h\u001b[?25h"], - [0.080035,"\u001b[?25li\u001b[39;145H9\u001b[11;59H\u001b[34h\u001b[?25h"], - [0.384445,"\u001b[?25ld\u001b[39;144H60\u001b[11;60H\u001b[34h\u001b[?25h"], - [0.079351,"\u001b[?25la\u001b[39;145H1\u001b[11;61H\u001b[34h\u001b[?25h"], - [0.152946,"\u001b[?25lt\u001b[39;145H2\u001b[11;62H\u001b[34h\u001b[?25h"], - [0.086961,"\u001b[?25li\u001b[39;145H3\u001b[11;63H\u001b[34h\u001b[?25h"], - [0.072104,"\u001b[?25lo\u001b[39;145H4\u001b[11;64H\u001b[34h\u001b[?25h"], - [0.096334,"\u001b[?25ln\u001b[39;145H5\u001b[11;65H\u001b[34h\u001b[?25h"], - [0.071396,"\u001b[?25l\u001b[39;145H6\u001b[11;66H\u001b[34h\u001b[?25h"], - [0.128044,"\u001b[?25li\u001b[39;145H7\u001b[11;67H\u001b[34h\u001b[?25h"], - [0.079832,"\u001b[?25ls\u001b[39;145H8\u001b[11;68H\u001b[34h\u001b[?25h"], - [0.087900,"\u001b[?25l\u001b[39;145H9\u001b[11;69H\u001b[34h\u001b[?25h"], - [0.160477,"\u001b[?25ln\u001b[39;144H70\u001b[11;70H\u001b[34h\u001b[?25h"], - [0.080199,"\u001b[?25lo\u001b[39;145H1\u001b[11;71H\u001b[34h\u001b[?25h"], - [0.135539,"\u001b[?25lt\u001b[39;145H2\u001b[11;72H\u001b[34h\u001b[?25h"], - [0.096132,"\u001b[?25l\u001b[39;145H3\u001b[11;73H\u001b[34h\u001b[?25h"], - [0.248468,"\u001b[?25li\u001b[39;145H4\u001b[11;74H\u001b[34h\u001b[?25h"], - [0.087414,"\u001b[?25lm\u001b[39;145H5\u001b[11;75H\u001b[34h\u001b[?25h"], - [0.136043,"\u001b[?25lp\u001b[39;145H6\u001b[11;76H\u001b[34h\u001b[?25h"], - [0.096073,"\u001b[?25ll\u001b[39;145H7\u001b[11;77H\u001b[34h\u001b[?25h"], - [0.128488,"\u001b[?25le\u001b[39;145H8\u001b[11;78H\u001b[34h\u001b[?25h"], - [0.095403,"\u001b[?25lm\u001b[39;145H9\u001b[11;79H\u001b[34h\u001b[?25h"], - [0.096020,"\u001b[?25le\u001b[39;144H80\u001b[11;80H\u001b[34h\u001b[?25h"], - [0.127980,"\u001b[?25ln\u001b[39;145H1\u001b[11;81H\u001b[34h\u001b[?25h"], - [0.160260,"\u001b[?25lt\u001b[39;145H2\u001b[11;82H\u001b[34h\u001b[?25h"], - [0.175729,"\u001b[?25le\u001b[39;145H3\u001b[11;83H\u001b[34h\u001b[?25h"], - [0.336998,"\u001b[?25ld\u001b[39;145H4\u001b[11;84H\u001b[34h\u001b[?25h"], - [0.111689,"\u001b[?25l\u001b[39;145H5\u001b[11;85H\u001b[34h\u001b[?25h"], - [0.425570,"\u001b[?25le\u001b[39;145H6\u001b[11;86H\u001b[34h\u001b[?25h"], - [0.391828,"\u001b[?25l\u001b[11;85H\u001b[K\u001b[39;145H5\u001b[11;85H\u001b[34h\u001b[?25h"], - [0.311108,"\u001b[?25lu\u001b[39;145H6\u001b[11;86H\u001b[34h\u001b[?25h"], - [0.046932,"\u001b[?25le\u001b[39;145H7\u001b[11;87H\u001b[34h\u001b[?25h"], - [0.393048,"\u001b[?25l\u001b[11;86H\u001b[K\u001b[39;145H6\u001b[11;86H\u001b[34h\u001b[?25h"], - [0.182992,"\u001b[?25l\u001b[11;85H\u001b[K\u001b[39;145H5\u001b[11;85H\u001b[34h\u001b[?25h"], - [0.320529,"\u001b[?25ly\u001b[39;145H6\u001b[11;86H\u001b[34h\u001b[?25h"], - [0.103869,"\u001b[?25le\u001b[39;145H7\u001b[11;87H\u001b[34h\u001b[?25h"], - [0.527763,"\u001b[?25lt\u001b[39;145H8\u001b[11;88H\u001b[34h\u001b[?25h"], - [1.000000,"\u001b[39;1H\u001b[K\u001b[?25l\u001b[39;141H11,87\u001b[9CAll\u001b[11;87H\u001b[34h\u001b[?25h\u001b[?25l\u001b[39;1H1 change; before #3 22 seconds ago\u001b[39;141H\u001b[K\u001b[11;21H\u001b[K\u001b[39;141H11,18\u001b[9CAll\u001b[11;18H\u001b[34h\u001b[?25h"], - [0.169827,"\u001b[?25l\u001b[39;19H2 37\u001b[39;141H\u001b[K\u001b[6;18H\u001b[36m\u001b[46m{\u001b[14C}\u001b[0m\u001b[6;36H\u001b[K\u001b[39;141H6,33\u001b[10CAll\u001b[6;33H\u001b[34h\u001b[?25h"], - [0.574013,"\u001b[?25l\u001b[39;1H\u001b[K\u001b[39;1H:\u001b[34h\u001b[?25h"], - [0.168387,"w\u001b[?25l\u001b[34h\u001b[?25h"], - [0.095540,"q\u001b[?25l\u001b[34h\u001b[?25h"], - [1.000000,"\r\u001b[?25l\"component.json\""], - [0.003978," 14L, 199C written\r\r\r\n\u001b[?1l\u001b\u003e\u001b[34h\u001b[?25h\u001b[?1049l\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"curl -H \"X-Auth-token: $token_id\" http://10.20.0.2:8000/api/config/"], - [1.000000,"components --data @component.json -H \"Content-type: application/json\""], - [1.000000,"\r\n"], - [0.038830,"{\"templates\": [{\"content\": {\"asd\": \"ns1.a\"}, \"component_id\": 1, \"id\": 1, \"name\": \"temp1\"}], \"schemas\": [{\"content\": {}, \"component_id\": 1, \"namespace_id\": 1, \"id\": 1, \"name\": \"schema1\"}], \"id\": 1, \"name\": \"comp1\"}"], - [0.000024,"\r\n"], - [0.000681,"\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [0.144136,"#"], - [0.111205," "], - [0.657121,"N"], - [0.135165,"o"], - [0.087978,"w"], - [0.072766," "], - [0.255439,"w"], - [0.032452,"e"], - [0.167243," "], - [1.000000,"n"], - [0.079492,"e"], - [0.167681,"e"], - [0.119977,"d"], - [0.079682," "], - [0.168416,"t"], - [0.079625,"o"], - [0.056245," "], - [0.192583,"r"], - [0.095319,"e"], - [0.175872,"m"], - [0.080542,"e"], - [0.071501,"m"], - [1.000000,"b"], - [0.119579,"e"], - [0.097277,"r"], - [0.071082," "], - [0.679951,"I"], - [0.275121,"D"], - [0.348876,"s"], - [0.055958," "], - [0.248033,"o"], - [0.080056,"f"], - [0.079720," "], - [0.768192,"s"], - [0.216097,"c"], - [0.056707,"h"], - [0.159145,"e"], - [0.095956,"m"], - [0.200205,"a"], - [0.319410,","], - [0.552580," "], - [0.431885,"t"], - [0.071464,"e"], - [0.239731,"m"], - [0.103860,"p"], - [0.087755,"m"], - [0.024112,"l"], - [0.160028,"a"], - [0.432416,"t"], - [0.071645,"e"], - [0.175996," "], - [0.224089,"a"], - [0.344358,"n"], - [0.111459,"d"], - [0.064096," "], - [0.856293,"c"], - [0.119927,"o"], - [0.071661,"m"], - [0.176528,"p"], - [0.104982,"o"], - [0.238616,"n"], - [0.208223,"e"], - [0.168094,"n"], - [0.119857,"t"], - [0.560148,"."], - [1.000000,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.440466," "], - [1.000000,"L"], - [0.415841,"e"], - [0.088451,"t"], - [0.655553,"'"], - [0.127620,"s"], - [0.080030," "], - [0.224519,"c"], - [0.232149,"r"], - [0.119951,"e"], - [0.032053,"a"], - [0.136295,"t"], - [0.071754,"e"], - [0.063306," "], - [0.352802,"a"], - [0.119414,"n"], - [0.127087," "], - [0.128259,"e"], - [0.095897,"n"], - [0.152303,"v"], - [0.152279,"i"], - [0.288242,"r"], - [0.102990,"o"], - [0.080328,"n"], - [0.191929,"m"], - [0.103862,"e"], - [0.127964,"n"], - [0.103952,"t"], - [1.000000,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [0.503353,"v"], - [0.095211,"i"], - [0.040203,"m"], - [0.063704," "], - [0.224874,"en"], - [0.304131,"v"], - [0.519977,"ironment.json "], - [1.000000,"\r\n"], - [0.057816,"\u001b[?1049h\u001b[?1h\u001b="], - [0.002279,"\u001b[1;39r\u001b[34l\u001b[34h\u001b[?25h\u001b[23m\u001b[24m\u001b[0m\u001b[H\u001b[J\u001b[?25l\u001b[39;1H\"environment.json\""], - [0.000946," 5L, 80C"], - [0.008341,"\u001b[1;1H\u001b[36m\u001b[46m{\u001b[0m\r\n \u001b[31m\"name\"\u001b[0m: \u001b[31m\"env1\"\u001b[0m,\r\n \u001b[31m\"components\"\u001b[0m: \u001b[36m[\u001b[0mCOMP_ID\u001b[36m]\u001b[0m,\r\n \u001b[31m\"hierarchy_levels\"\u001b[0m: \u001b[36m[\u001b[0m\u001b[31m\"node\"\u001b[0m\u001b[36m]\u001b[0m\r\n\u001b[36m\u001b[46m}\u001b[0m\r\n\u001b[1m\u001b[34m~ \u001b[7;1H~ \u001b[8;1H~ \u001b[9;1H~ \u001b[10;1H~ \u001b[11;1H~ \u001b[12;1H~ \u001b[13;1H~ \u001b[14;1H~ \u001b[15;1H~ \u001b[16;1H~ \u001b[17;1H~ "], - [0.002447," \u001b[18;1H~ \u001b[19;1H~ \u001b[20;1H~ \u001b[21;1H~ \u001b[22;1H~ \u001b[23;1H~ \u001b[24;1H~ \u001b[25;1H~ \u001b[26;1H~ \u001b[27;1H~ \u001b[28;1H~ \u001b[29;1H~ "], - [0.000917," \u001b[30;1H~ \u001b[31;1H~ \u001b[32;1H~ \u001b[33;1H~ \u001b[34;1H~ \u001b[35;1H~ \u001b[36;1H~ \u001b[37;1H~ \u001b[38;1H~ \u001b[0m\u001b[39;141H1,1\u001b[11CAll\u001b[1;1H\u001b[34h\u001b[?25h"], - [0.991844,"\u001b[?25l\u001b[36m{\u001b[5;1H}\u001b[0m\u001b[39;141H2\u001b[2;1H\u001b[34h\u001b[?25h"], - [0.174768,"\u001b[?25l\u001b[39;141H3\u001b[3;1H\u001b[34h\u001b[?25h"], - [0.656785,"\u001b[?25l\u001b[39;143H3\u001b[3;3H\u001b[34h\u001b[?25h"], - [0.159036,"\u001b[?25l\u001b[39;143H4\u001b[3;4H\u001b[34h\u001b[?25h"], - [0.239859,"\u001b[?25l\u001b[39;143H14\u001b[3;14H\u001b[34h\u001b[?25h"], - [0.201284,"\u001b[?25l\u001b[3C\u001b[36m\u001b[46m[\u001b[7C]\u001b[0m\u001b[39;144H7\u001b[3;17H\u001b[34h\u001b[?25h"], - [0.447249,"\u001b[?25l\u001b[36m[\u001b[7C]\u001b[0m\u001b[39;144H8\u001b[3;18H\u001b[34h\u001b[?25h"], - [0.304156,"\u001b[?25l\u001b[39;1H\u001b[1m-- INSERT --\u001b[0m\u001b[39;13H\u001b[K\u001b[39;141H3,18\u001b[10CAll"], - [0.002032,"\u001b[3;18H\u001b[36m]\u001b[0m,\u001b[3;20H\u001b[K\u001b[3;17H\u001b[36m\u001b[46m[]\u0008\u001b[34h\u001b[?25h"], - [0.678200,"\u001b[?25l\u001b[0m\u001b[46m1\u001b[0m\u001b[36m]\u001b[0m,\u0008\u0008\u00081\u001b[36m\u001b[46m]\u001b[0m\u001b[39;144H9\u001b[3;19H\u001b[34h\u001b[?25h"], - [1.000000,"\u001b[39;1H\u001b[K\u001b[3;18H"], - [0.362872,"\u001b[?25l\u0008\u001b[36m[\u001b[0m1\u001b[36m]\u001b[0m\u001b[39;141H3,18\u001b[10CAll\u001b[3;18H\u001b[34h\u001b[?25h\u001b[?25l\u001b[39;141H4\u001b[4;18H\u001b[34h\u001b[?25h"], - [1.000000,"\u001b[?25l\u001b[39;1H\u001b[1m-- INSERT --\u001b[0m\u001b[39;141H\u001b[K\u001b[39;141H4,31\u001b[10CAll\u001b[4;23H\u001b[36m\u001b[46m[\u001b[6C]\u001b[0m\u001b[39;141H\u001b[K\u001b[39;141H4,31\u001b[10CAll\u001b[4;31H\u001b[34h\u001b[?25h"], - [0.263154,"\u001b[?25l\u001b[4;23H\u001b[36m[\u001b[6C]\u001b[0m\u001b[39;144H2\u001b[4;32H\u001b[34h\u001b[?25h"], - [0.175782,"\u001b[?25l\u001b[39;144H3\u001b[4;33H\u001b[34h\u001b[?25h"], - [0.215936,"\u001b[?25l#\u001b[39;144H4\u001b[4;34H\u001b[34h\u001b[?25h"], - [0.087957,"\u001b[?25l\u001b[39;144H5\u001b[4;35H\u001b[34h\u001b[?25h"], - [1.000000,"\u001b[?25lT\u001b[39;144H6\u001b[4;36H\u001b[34h\u001b[?25h"], - [0.159091,"\u001b[?25lh\u001b[39;144H7\u001b[4;37H\u001b[34h\u001b[?25h"], - [0.048048,"\u001b[?25le\u001b[39;144H8\u001b[4;38H\u001b[34h\u001b[?25h"], - [0.080179,"\u001b[?25lr\u001b[39;144H9\u001b[4;39H\u001b[34h\u001b[?25h"], - [0.119597,"\u001b[?25le\u001b[39;143H40\u001b[4;40H\u001b[34h\u001b[?25h"], - [0.064531,"\u001b[?25l\u001b[39;144H1\u001b[4;41H\u001b[34h\u001b[?25h"], - [0.240189,"\u001b[?25lc\u001b[39;144H2\u001b[4;42H\u001b[34h\u001b[?25h"], - [0.079663,"\u001b[?25la\u001b[39;144H3\u001b[4;43H\u001b[34h\u001b[?25h"], - [0.168167,"\u001b[?25ln\u001b[39;144H4\u001b[4;44H\u001b[34h\u001b[?25h"], - [0.096062,"\u001b[?25l\u001b[39;144H5\u001b[4;45H\u001b[34h\u001b[?25h"], - [0.239803,"\u001b[?25lb\u001b[39;144H6\u001b[4;46H\u001b[34h\u001b[?25h"], - [0.087836,"\u001b[?25le\u001b[39;144H7\u001b[4;47H\u001b[34h\u001b[?25h"], - [0.047596,"\u001b[?25l\u001b[39;144H8\u001b[4;48H\u001b[34h\u001b[?25h"], - [0.857290,"\u001b[?25l\u001b[39;144H9\u001b[4;49H\u001b[34h\u001b[?25h"], - [0.488072,"\u001b[?25l\u001b[39;144H8\u001b[4;48H\u001b[34h\u001b[?25h"], - [0.247801,"\u001b[?25la\u001b[39;144H9\u001b[4;49H\u001b[34h\u001b[?25h"], - [0.102694,"\u001b[?25ln\u001b[39;143H50\u001b[4;50H\u001b[34h\u001b[?25h"], - [0.112912,"\u001b[?25ly\u001b[39;144H1\u001b[4;51H\u001b[34h\u001b[?25h"], - [0.094996,"\u001b[?25l\u001b[39;144H2\u001b[4;52H\u001b[34h\u001b[?25h"], - [0.240863,"\u001b[?25ln\u001b[39;144H3\u001b[4;53H\u001b[34h\u001b[?25h"], - [1.000000,"\u001b[?25lu\u001b[39;144H4\u001b[4;54H\u001b[34h\u001b[?25h"], - [0.079539,"\u001b[?25lm\u001b[39;144H5\u001b[4;55H\u001b[34h\u001b[?25h"], - [0.208353,"\u001b[?25lb\u001b[39;144H6\u001b[4;56H\u001b[34h\u001b[?25h"], - [0.104052,"\u001b[?25le\u001b[39;144H7\u001b[4;57H\u001b[34h\u001b[?25h"], - [0.055756,"\u001b[?25lr\u001b[39;144H8\u001b[4;58H\u001b[34h\u001b[?25h"], - [0.072082,"\u001b[?25l\u001b[39;144H9\u001b[4;59H\u001b[34h\u001b[?25h"], - [0.120698,"\u001b[?25lo\u001b[39;143H60\u001b[4;60H\u001b[34h\u001b[?25h"], - [0.103370,"\u001b[?25lf\u001b[39;144H1\u001b[4;61H\u001b[34h\u001b[?25h"], - [0.072190,"\u001b[?25l\u001b[39;144H2\u001b[4;62H\u001b[34h\u001b[?25h"], - [0.135637,"\u001b[?25ll\u001b[39;144H3\u001b[4;63H\u001b[34h\u001b[?25h"], - [0.104345,"\u001b[?25le\u001b[39;144H4\u001b[4;64H\u001b[34h\u001b[?25h"], - [0.226020,"\u001b[?25lv\u001b[39;144H5\u001b[4;65H\u001b[34h\u001b[?25h"], - [0.118062,"\u001b[?25le\u001b[39;144H6\u001b[4;66H\u001b[34h\u001b[?25h"], - [0.231705,"\u001b[?25ll\u001b[39;144H7\u001b[4;67H\u001b[34h\u001b[?25h"], - [0.192072,"\u001b[?25ls\u001b[39;144H8\u001b[4;68H\u001b[34h\u001b[?25h"], - [0.080201,"\u001b[?25l\u001b[39;144H9\u001b[4;69H\u001b[34h\u001b[?25h"], - [0.543602,"\u001b[?25lh\u001b[39;143H70\u001b[4;70H\u001b[34h\u001b[?25h"], - [0.136406,"\u001b[?25le\u001b[39;144H1\u001b[4;71H\u001b[34h\u001b[?25h"], - [0.080340,"\u001b[?25lr\u001b[39;144H2\u001b[4;72H\u001b[34h\u001b[?25h"], - [0.103589,"\u001b[?25le\u001b[39;144H3\u001b[4;73H\u001b[34h\u001b[?25h"], - [0.119801,"\u001b[?25l,\u001b[39;144H4\u001b[4;74H\u001b[34h\u001b[?25h"], - [0.111673,"\u001b[?25l\u001b[39;144H5\u001b[4;75H\u001b[34h\u001b[?25h"], - [0.264165,"\u001b[?25lb\u001b[39;144H6\u001b[4;76H\u001b[34h\u001b[?25h"], - [0.143927,"\u001b[?25lu\u001b[39;144H7\u001b[4;77H\u001b[34h\u001b[?25h"], - [0.648349,"\u001b[?25lt\u001b[39;144H8\u001b[4;78H\u001b[34h\u001b[?25h"], - [0.055643,"\u001b[?25l\u001b[39;144H9\u001b[4;79H\u001b[34h\u001b[?25h"], - [0.384075,"\u001b[?25lw\u001b[39;143H80\u001b[4;80H\u001b[34h\u001b[?25h"], - [0.103747,"\u001b[?25le\u001b[39;144H1\u001b[4;81H\u001b[34h\u001b[?25h"], - [0.144121,"\u001b[?25l\u001b[31m'\u001b[0m\u001b[39;144H2\u001b[4;82H\u001b[34h\u001b[?25h"], - [0.151954,"\u001b[?25l\u001b[31mr\u001b[0m\u001b[39;144H3\u001b[4;83H\u001b[34h\u001b[?25h"], - [0.080040,"\u001b[?25l\u001b[31me\u001b[0m\u001b[39;144H4\u001b[4;84H\u001b[34h\u001b[?25h"], - [0.104158,"\u001b[?25l\u001b[31m \u001b[0m\u001b[39;144H5\u001b[4;85H\u001b[34h\u001b[?25h"], - [0.664173,"\u001b[?25l\u001b[31mi\u001b[0m\u001b[39;144H6\u001b[4;86H\u001b[34h\u001b[?25h"], - [0.071841,"\u001b[?25l\u001b[31mn\u001b[0m\u001b[39;144H7\u001b[4;87H\u001b[34h\u001b[?25h"], - [0.473241,"\u001b[?25l\u001b[31mt\u001b[0m\u001b[39;144H8\u001b[4;88H\u001b[34h\u001b[?25h"], - [0.086471,"\u001b[?25l\u001b[31me\u001b[0m\u001b[39;144H9\u001b[4;89H\u001b[34h\u001b[?25h"], - [0.144186,"\u001b[?25l\u001b[31mr\u001b[0m\u001b[39;143H90\u001b[4;90H\u001b[34h\u001b[?25h"], - [0.111947,"\u001b[?25l\u001b[31me\u001b[0m\u001b[39;144H1\u001b[4;91H\u001b[34h\u001b[?25h"], - [0.304552,"\u001b[?25l\u001b[31ms\u001b[0m\u001b[39;144H2\u001b[4;92H\u001b[34h\u001b[?25h"], - [0.207459,"\u001b[?25l\u001b[31mt\u001b[0m\u001b[39;144H3\u001b[4;93H\u001b[34h\u001b[?25h"], - [0.096265,"\u001b[?25l\u001b[31me\u001b[0m\u001b[39;144H4\u001b[4;94H\u001b[34h\u001b[?25h"], - [0.176237,"\u001b[?25l\u001b[31md\u001b[0m\u001b[39;144H5\u001b[4;95H\u001b[34h\u001b[?25h"], - [0.200594,"\u001b[?25l\u001b[31mo\u001b[0m\u001b[39;144H6\u001b[4;96H\u001b[34h\u001b[?25h"], - [0.118936,"\u001b[?25l\u001b[31mn\u001b[0m\u001b[39;144H7\u001b[4;97H\u001b[34h\u001b[?25h"], - [0.560797,"\u001b[?25l\u001b[4;96H\u001b[K\u001b[39;144H6\u001b[4;96H\u001b[34h\u001b[?25h"], - [0.135074,"\u001b[?25l\u001b[4;95H\u001b[K\u001b[39;144H5\u001b[4;95H\u001b[34h\u001b[?25h"], - [0.200500,"\u001b[?25l\u001b[31m \u001b[0m\u001b[39;144H6\u001b[4;96H\u001b[34h\u001b[?25h"], - [0.359999,"\u001b[?25l\u001b[31mo\u001b[0m\u001b[39;144H7\u001b[4;97H\u001b[34h\u001b[?25h"], - [0.095473,"\u001b[?25l\u001b[31mn\u001b[0m\u001b[39;144H8\u001b[4;98H\u001b[34h\u001b[?25h"], - [0.111912,"\u001b[?25l\u001b[31ml\u001b[0m\u001b[39;144H9\u001b[4;99H\u001b[34h\u001b[?25h"], - [0.208697,"\u001b[?25l\u001b[31my\u001b[0m\u001b[39;143H100\u001b[4;100H\u001b[34h\u001b[?25h"], - [0.071398,"\u001b[?25l\u001b[31m \u001b[0m\u001b[39;145H1\u001b[4;101H\u001b[34h\u001b[?25h"], - [0.184463,"\u001b[?25l\u001b[31mi\u001b[0m\u001b[39;145H2\u001b[4;102H\u001b[34h\u001b[?25h"], - [0.071685,"\u001b[?25l\u001b[31mn\u001b[0m\u001b[39;145H3\u001b[4;103H\u001b[34h\u001b[?25h"], - [0.079977,"\u001b[?25l\u001b[31m \u001b[0m\u001b[39;145H4\u001b[4;104H\u001b[34h\u001b[?25h"], - [1.000000,"\u001b[?25l\u001b[31mn\u001b[0m\u001b[39;145H5\u001b[4;105H\u001b[34h\u001b[?25h"], - [0.063018,"\u001b[?25l\u001b[31mo\u001b[0m\u001b[39;145H6\u001b[4;106H\u001b[34h\u001b[?25h"], - [0.128445,"\u001b[?25l\u001b[31md\u001b[0m\u001b[39;145H7\u001b[4;107H\u001b[34h\u001b[?25h"], - [0.063669,"\u001b[?25l\u001b[31me\u001b[0m\u001b[39;145H8\u001b[4;108H\u001b[34h\u001b[?25h"], - [1.000000,"\u001b[?25l\u001b[31ms\u001b[0m\u001b[39;145H9\u001b[4;109H\u001b[34h\u001b[?25h"], - [0.512061,"\u001b[?25l\u001b[31m.\u001b[0m\u001b[39;144H10\u001b[4;110H\u001b[34h\u001b[?25h"], - [0.765338,"\u001b[39;1H\u001b[K\u001b[4;109H"], - [0.354702,"\u001b[?25l\u001b[39;141H4,109\u001b[9CAll\u001b[4;109H\u001b[34h\u001b[?25h"], - [1.000000,"\u0007"], - [0.938275,"\u001b[?25l\u001b[39;1H1 change; before #2 24 seconds ago\u001b[39;141H\u001b[K\u001b[4;23H\u001b[36m\u001b[46m[\u001b[6C]\u001b[0m\u001b[4;33H\u001b[K\u001b[39;141H4,30\u001b[10CAll\u001b[4;30H\u001b[34h\u001b[?25h"], - [1.000000,"\u001b[?25l\u001b[39;1H\u001b[K\u001b[39;1H:\u001b[34h\u001b[?25h"], - [0.351944,"w\u001b[?25l\u001b[34h\u001b[?25h"], - [0.056688,"q\u001b[?25l\u001b[34h\u001b[?25h"], - [0.176285,"\r\u001b[?25l\"environment.json\""], - [0.006761," 5L, 74C written\r\r\r\n\u001b[?1l\u001b\u003e\u001b[34h\u001b[?25h\u001b[?1049l"], - [0.000567,"\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"curl -H \"X-Auth-token: $token_id\" http://10.20.0.2:8000/api/config/"], - [1.000000,"environments --data @environment.json -H \"Content-type: application/json\""], - [1.000000,"\r\n"], - [0.046707,"{\"hierarchy_levels\": [\"node\"], \"id\": 1, \"components\": [1]}\r\n"], - [0.001233,"\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.088324," "], - [0.670349,"A"], - [0.183752,"g"], - [0.112122,"a"], - [0.232193,"i"], - [0.071615,"n"], - [0.280011,","], - [0.079520," "], - [0.240899,"w"], - [0.095219,"e"], - [0.432796,"'"], - [0.191421,"l"], - [0.136004,"l"], - [0.096016," "], - [0.240059,"n"], - [0.087784,"e"], - [0.152247,"e"], - [0.111571,"d"], - [0.072923," "], - [0.175444,"t"], - [0.055748,"h"], - [0.152015,"a"], - [0.080632,"t"], - [0.087500," "], - [0.416929,"I"], - [0.091208,"D"], - [1.000000," "], - [0.160127,"("], - [0.240533,"a"], - [0.095627,"l"], - [0.119685,"l"], - [0.112008," "], - [0.312582,"I"], - [0.104051,"D"], - [0.247672,"s"], - [0.097704," "], - [0.150011,"a"], - [0.295116,"r"], - [0.064923,"e"], - [0.111932," "], - [0.495748,"1"], - [0.072136," "], - [0.208151,"o"], - [0.071870,"n"], - [0.096299," "], - [0.423867,"f"], - [0.167949,"r"], - [0.096362,"e"], - [0.200296,"s"], - [0.143392,"h"], - [0.143845," "], - [0.887365,"i"], - [0.087844,"n"], - [0.119796,"s"], - [0.112429,"t"], - [0.120185,"a"], - [0.055747,"l"], - [0.144043,"l"], - [0.680237,"a"], - [0.271869,"t"], - [0.087843,"i"], - [0.071992,"o"], - [0.103803,"n"], - [0.384065,")"], - [1.000000,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.095863," "], - [0.816002,"N"], - [0.127924,"o"], - [0.120716,"w"], - [0.055246," "], - [0.263858,"w"], - [0.072098,"e"], - [0.103768," "], - [0.304283,"h"], - [0.095865,"a"], - [0.176014,"v"], - [0.079780,"e"], - [0.088058," "], - [0.208226,"a"], - [0.503922,"n"], - [0.127942," "], - [0.400256,"e"], - [0.031864,"n"], - [0.928123,"v"], - [0.111788,"i"], - [0.208858,"r"], - [0.086956,"o"], - [0.087899,"n"], - [0.200164,"m"], - [0.095820,"e"], - [0.128176,"n"], - [0.087834,"t"], - [1.000000,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"curl -H \"X-Auth-token: $token_id\" http://10.20.0.2:8000/api/con"], - [0.000122,"f"], - [0.000169,"i"], - [0.000139,"g"], - [0.000134,"/"], - [0.000145,"e"], - [0.000134,"n"], - [0.000139,"v"], - [0.000138,"i"], - [0.000190,"r"], - [0.000155,"o"], - [0.000209,"n"], - [0.000145,"m"], - [0.000142,"e"], - [0.000146,"n"], - [0.000188,"t"], - [0.000159,"s"], - [1.000000,"/"], - [0.070853,"1"], - [1.000000,"\r\n"], - [0.029304,"{\"hierarchy_levels\": [\"node\"], \"id\": 1, \"components\": [1]}\r\n"], - [0.000492,"\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.209717," "], - [0.214728,"L"], - [0.215475,"e"], - [0.111899,"t"], - [0.128167,"'"], - [0.127716,"s"], - [0.064102," "], - [0.657755,"p"], - [0.078494,"u"], - [0.519917,"t"], - [0.090707," "], - [0.133799,"s"], - [0.111286,"o"], - [0.088153,"m"], - [0.064775,"e"], - [0.087367," "], - [0.263902,"d"], - [0.136118,"a"], - [0.095859,"t"], - [0.096041,"a"], - [0.063990," "], - [0.167912,"i"], - [0.064232,"n"], - [0.071807," "], - [0.192258,"i"], - [0.175736,"t"], - [1.000000,"'"], - [0.087539,"s"], - [0.080356," "], - [0.287443,"s"], - [0.166927,"c"], - [0.049081,"h"], - [0.168107,"e"], - [0.079735,"m"], - [0.144575,"a"], - [0.465022,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [0.136003,"\u0007"], - [1.000000,"curl -H \"X-Auth-token: $token_id\" http://10.20.0.2:8000/api/config/"], - [1.000000,"environments/ENV_ID/schema/SCH_ID/values --data '{\"a\": 1}' -X PUT -H \" \rContent-type: application/json\""], - [1.000000,"\r\n"], - [0.058439,"\u003c!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\"\u003e\r\n\u003ctitle\u003e404 Not Found\u003c/title\u003e\r\n\u003ch1\u003eNot Found\u003c/h1\u003e\r\n\u003cp\u003eThe requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.\u003c/p\u003e\r\n"], - [0.000808,"\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.519341," "], - [0.232309,"O"], - [0.191786,"o"], - [0.191925,"p"], - [0.256261,"s"], - [0.999960,","], - [0.111758," "], - [0.344120,"p"], - [0.119976,"l"], - [0.104207,"a"], - [0.519905,"c"], - [0.128395,"e"], - [0.359459,"h"], - [0.112033,"o"], - [0.215933,"l"], - [0.272194,"d"], - [0.144048,"e"], - [0.111714,"r"], - [0.136086,"s"], - [0.352613,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [0.464165,"curl -H \"X-Auth-token: $token_id\" http://10.20.0.2:8000/api/config/environments/"], - [0.5,"1"], - [0.5,"/schema/"], - [0.5,"1"], - [0.5,"/values --data '{\"a\": 1}' -X PUT -H \"Content-type: application/json\""], - [0.879998,"\r\n\r\r\n"], - [0.058150,"\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.544372," "], - [0.166946,"L"], - [0.192829,"o"], - [0.151400,"o"], - [0.096492,"k"], - [0.111522,"s"], - [0.071741," "], - [0.400319,"o"], - [0.512634,"k"], - [0.247444,","], - [0.031371," "], - [0.240257,"l"], - [0.112408,"e"], - [0.279698,"t"], - [0.288157,"'"], - [0.080505,"s"], - [0.079186," "], - [0.984290,"f"], - [0.063593,"e"], - [0.136005,"t"], - [0.119767,"c"], - [0.112036,"h"], - [0.031783," "], - [0.320446,"d"], - [0.144068,"a"], - [0.111808,"t"], - [0.135789,"a"], - [0.497533," "], - [0.727806,"v"], - [0.783699,"i"], - [0.343688,"a"], - [0.087724," "], - [0.992326,"t"], - [0.087915,"e"], - [0.103788,"m"], - [0.079861,"p"], - [0.096320,"l"], - [0.151818,"a"], - [0.175992,"t"], - [0.079705,"e"], - [0.144296," "], - [0.375822,"n"], - [0.080164,"o"], - [0.242919,"w"], - [0.301088,"."], - [0.801054,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"curl -H \"X-Auth-token: $token_id\" http://10.20.0.2:8000/api/config/"], - [1.000000,"environments/ENV_ID/templates/TEMP_ID/values"], - [0.980519,"\u0008"], - [0.143917,"\u0008"], - [0.128154,"\u0008"], - [0.135813,"\u0008"], - [0.135932,"\u0008"], - [0.119940,"\u0008"], - [0.136117,"\u0008"], - [0.624925,"\u0008\u001b[1P/values\u0008\u0008\u0008\u0008\u0008\u0008\u0008"], - [0.135650,"\u0008\u001b[1P/values\u0008\u0008\u0008\u0008\u0008\u0008\u0008"], - [0.112173,"\u0008\u001b[1P/values\u0008\u0008\u0008\u0008\u0008\u0008\u0008"], - [0.127703,"\u0008\u001b[1P/values\u0008\u0008\u0008\u0008\u0008\u0008\u0008"], - [0.143804,"\u0008\u001b[1P/values\u0008\u0008\u0008\u0008\u0008\u0008\u0008"], - [0.128125,"\u0008\u001b[1P/values\u0008\u0008\u0008\u0008\u0008\u0008\u0008"], - [0.136407,"\u0008\u001b[1P/values\u0008\u0008\u0008\u0008\u0008\u0008\u0008"], - [0.223600,"1/values\u0008\u0008\u0008\u0008\u0008\u0008\u0008"], - [0.479846,"\u0008"], - [0.660262,"\u0008"], - [0.039464,"\u0008"], - [0.040594,"\u0008"], - [0.039942,"\u0008"], - [0.041746,"\u0008"], - [0.040395,"\u0008"], - [0.040326,"\u0008"], - [0.040165,"\u0008"], - [0.040644,"\u0008"], - [0.168428,"\u0008"], - [0.151889,"\u0008"], - [0.352791,"\u0008\u001b[1P/templates/1/values\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008"], - [0.135807,"\u0008\u001b[1P/templates/1/values\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008"], - [0.128578,"\u0008\u001b[1P/templates/1/values\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008"], - [0.135426,"\u0008\u001b[1P/templates/1/values\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008"], - [0.143787,"\u0008\u001b[1P/templates/1/values\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008"], - [0.144111,"\u0008\u001b[1P/templates/1/values\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008"], - [0.248280,"1/templates/1/values\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008"], - [0.311409,"\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C"], - [1.000000,"\r\n"], - [0.018717,"{\"asd\": 1}\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"N"], - [0.175551,"o"], - [0.096462,"t"], - [0.079736,"e"], - [0.087691," "], - [0.216031,"t"], - [0.135900,"h"], - [0.063849,"a"], - [0.112384,"t"], - [0.055779," "], - [1.000000,"\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008\u0008"], - [0.223726,"\u001b[1@3"], - [0.672545,"\u0008\u001b[1P"], - [0.127493,"\u001b[1@#"], - [0.063943,"\u001b[1@ "], - [0.168026,"\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C"], - [0.648089,"w"], - [0.095778,"e"], - [1.000000,"'"], - [0.079557,"v"], - [0.088664,"e"], - [0.071222," "], - [0.464304,"p"], - [0.111647,"u"], - [0.680177,"t"], - [0.079749," "], - [1.000000,"{\"a\": 1}"], - [0.327501," "], - [0.767523,"i"], - [0.087911,"n"], - [0.071777," "], - [0.944292,"s"], - [0.112242,"c"], - [0.104449,"h"], - [0.111285,"e"], - [0.128236,"m"], - [0.185171,"a"], - [0.127602," "], - [1.000000,"a"], - [0.119774,"n"], - [0.104115,"d"], - [0.079675," "], - [0.784873,"t"], - [0.079538,"e"], - [0.055501,"m"], - [0.087971,"p"], - [0.096015,"l"], - [0.112165,"a"], - [0.608145,"t"], - [0.063629,"e"], - [0.120191," "], - [0.488283,"c"], - [0.168545,"o"], - [0.103328,"n"], - [0.519336,"t"], - [0.090191,"a"], - [0.182692,"i"], - [0.247601,"n"], - [0.360060,"e"], - [0.263997,"d"], - [0.063768," "], - [1.000000,"{"], - [0.296420,"\""], - [0.487182,"a"], - [0.111874,"s"], - [0.320587,"d"], - [0.327897,"\""], - [0.223738,":"], - [0.144995," "], - [1.000000,"\""], - [1.000000,"n"], - [0.149936,"s"], - [0.408155,"1"], - [0.431697,"."], - [0.111681,"a"], - [0.288092,"\""], - [0.743811,"}"], - [1.000000,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [0.599479,"#"], - [0.111853," "], - [0.600860,"S"], - [0.271664,"o"], - [0.119528," "], - [0.442939,"w"], - [0.101265,"e"], - [0.051764," "], - [0.362411,"r"], - [0.073701,"e"], - [0.424102,"t"], - [0.356400,"r"], - [0.091585,"i"], - [0.304107,"e"], - [0.345087,"v"], - [0.062924,"e"], - [0.456901,"d"], - [0.070972," "], - [1.000000,"{\"asd\": 1}"], - [1.000000,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "], - [1.000000,"#"], - [0.087862," "], - [1.000000,"T"], - [0.168083,"h"], - [0.104223,"a"], - [0.071335,"t"], - [0.200773,"'"], - [0.095699,"s"], - [0.079711," "], - [1.000000,"a"], - [0.151722,"l"], - [0.151799,"l"], - [0.040002," "], - [0.176351,"f"], - [0.096000,"o"], - [0.103900,"r"], - [0.104125," "], - [0.255998,"b"], - [0.095767,"a"], - [0.168783,"s"], - [0.105097,"i"], - [0.071846,"c"], - [0.072071," "], - [0.312183,"T"], - [0.224046,"u"], - [0.087818,"n"], - [0.416055,"i"], - [0.119740,"n"], - [0.207985,"g"], - [0.080126," "], - [0.239827,"B"], - [0.128171,"o"], - [0.135832,"x"], - [0.072098," "], - [0.193798,"o"], - [0.230205,"p"], - [0.176093,"e"], - [0.082809,"r"], - [0.189195,"a"], - [0.208004,"t"], - [0.072110,"i"], - [0.087878,"o"], - [0.079939,"n"], - [0.096165,"s"], - [0.176455,"."], - [0.889567,"\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# "]]} diff --git a/doc/source/records/02-api-update/component.json b/doc/source/records/02-api-update/component.json deleted file mode 100644 index aeeac0a..0000000 --- a/doc/source/records/02-api-update/component.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "comp1", - "resource_definitions": [ - { - "name": "resource1", - "content": {} - }, - { - "name": "slashed/resource", - "content": {} - } - ] -} diff --git a/doc/source/records/02-api-update/environment.json b/doc/source/records/02-api-update/environment.json deleted file mode 100644 index 863d689..0000000 --- a/doc/source/records/02-api-update/environment.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "env1", - "components": ["comp1"], - "hierarchy_levels": ["nodes"] -} diff --git a/doc/source/records/02-api-update/namespace.json b/doc/source/records/02-api-update/namespace.json deleted file mode 100644 index 1a4dd2a..0000000 --- a/doc/source/records/02-api-update/namespace.json +++ /dev/null @@ -1 +0,0 @@ -{"name": "ns1"} diff --git a/doc/source/records/02-api-update/record.json b/doc/source/records/02-api-update/record.json deleted file mode 100644 index 554d68c..0000000 --- a/doc/source/records/02-api-update/record.json +++ /dev/null @@ -1,13830 +0,0 @@ -{ - "version": 1, - "width": 150, - "height": 40, - "duration": 207.097114, - "command": "/bin/bash", - "title": "Tuning Box API update", - "env": { - "TERM": "screen", - "SHELL": "/bin/bash" - }, - "stdout": [ - [ - 0.044772, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "W" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "F" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "te" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "mo" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "yum install git python-pip python-alembic python-flask" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.164820, - "Loaded plugins: fastestmirror, priorities" - ], - [ - 0.000126, - "\r\n" - ], - [ - 0.019826, - "Loading mirror speeds from cached hostfile" - ], - [ - 0.000075, - "\r\n" - ], - [ - 0.194504, - " * mos9.0-security: mirror.seed-cz1.fuel-infra.org\r\n * mos9.0-updates: mirror.seed-cz1.fuel-infra.org\r\n" - ], - [ - 0.220661, - "Package python-alembic-0.8.2-1.el7~mos1.noarch already installed and latest version\r\n" - ], - [ - 0.022736, - "Resolving Dependencies\r\n" - ], - [ - 0.001242, - "--> Running transaction check\r\n" - ], - [ - 0.000404, - "---> Package git.x86_64 0:1.8.3.1-6.el7 will be installed\r\n" - ], - [ - 0.056910, - "--> Processing Dependency: perl-Git = 1.8.3.1-6.el7 for package: git-1.8.3.1-6.el7.x86_64\r\n" - ], - [ - 0.064844, - "--> Processing Dependency: perl(Term::ReadKey) for package: git-1.8.3.1-6.el7.x86_64\r\n" - ], - [ - 0.009622, - "--> Processing Dependency: perl(Error) for package: git-1.8.3.1-6.el7.x86_64\r\n" - ], - [ - 0.005184, - "--> Processing Dependency: perl(Git) for package: git-1.8.3.1-6.el7.x86_64\r\n" - ], - [ - 0.001692, - "--> Processing Dependency: libgnome-keyring.so.0()(64bit) for package: git-1.8.3.1-6.el7.x86_64\r\n" - ], - [ - 0.007570, - "---> Package python-flask.noarch 1:0.10.1-4.el7 will be installed\r\n" - ], - [ - 0.004780, - "--> Processing Dependency: python-itsdangerous for package: 1:python-flask-0.10.1-4.el7.noarch\r\n" - ], - [ - 0.002834, - "--> Processing Dependency: python-werkzeug for package: 1:python-flask-0.10.1-4.el7.noarch\r\n" - ], - [ - 0.003858, - "---> Package python-pip.noarch 0:7.1.0-1.el7~mos1 will be installed\r\n" - ], - [ - 0.001910, - "--> Running transaction check" - ], - [ - 0.000145, - "\r\n" - ], - [ - 0.000451, - "---> Package libgnome-keyring.x86_64 0:3.8.0-3.el7 will be installed" - ], - [ - 0.000214, - "\r\n" - ], - [ - 0.007001, - "---> Package perl-Error.noarch 1:0.17020-2.el7 will be installed" - ], - [ - 0.000178, - "\r\n" - ], - [ - 0.006202, - "---> Package perl-Git.noarch 0:1.8.3.1-6.el7 will be installed" - ], - [ - 0.000162, - "\r\n" - ], - [ - 0.004454, - "---> Package perl-TermReadKey.x86_64 0:2.30-20.el7 will be installed" - ], - [ - 0.000177, - "\r\n" - ], - [ - 0.003248, - "---> Package python-itsdangerous.noarch 0:0.23-2.el7 will be installed" - ], - [ - 0.000164, - "\r\n" - ], - [ - 0.000478, - "---> Package python-werkzeug.noarch 0:0.9.1-2.el7 will be installed" - ], - [ - 0.000193, - "\r\n" - ], - [ - 0.311830, - "--> Finished Dependency Resolution\r\n" - ], - [ - 0.154759, - "\r\nDependencies Resolved\r\n" - ], - [ - 0.009756, - "\r\n======================================================================================================================================================\r\n Package Arch Version Repository Size\r\n======================================================================================================================================================\r\nInstalling:\r\n git x86_64 1.8.3.1-6.el7 nailgun 4.4 M" - ], - [ - 0.000334, - "\r\n python-flask noarch 1:0.10.1-4.el7 nailgun 204 k\r\n python-pip noarch 7.1.0-1.el7~mos1 mos 1.5 M\r\nInstalling for dependencies:\r\n libgnome-keyring x86_64 3.8.0-3.el7 nailgun 109 k\r\n perl-Error noarch 1:0.17020-2.el7 nailgun 32 k\r\n perl-Git noarch 1.8.3.1-6.el7 nailgun 53 k\r\n perl-TermReadKey x86_64 2.30-20.el7 nailgun 31 k\r\n python-itsdangerous noarch 0.23-2.el7 nailgun 24 k\r\n python-werkzeug noarch 0.9.1-2.el7 nailgun 562 k\r\n\r\nTransaction Summary\r\n======================================================================================================================================================\r\nInstall 3 Packages (+6 Dependent packages)\r\n\r\n" - ], - [ - 0.003277, - "Total download size: 6.9 M\r\n" - ], - [ - 0.000373, - "Installed size: 33 M\r\n" - ], - [ - 0.000430, - "Is this ok [y/d/N]: " - ], - [ - 0.5, - "y" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.006967, - "Downloading packages:\r\n" - ], - [ - 0.120350, - "------------------------------------------------------------------------------------------------------------------------------------------------------\r\n" - ], - [ - 0.000918, - "Total 56 MB/s | 6.9 MB 00:00:00 \r\n" - ], - [ - 0.014992, - "Running transaction check\r\n" - ], - [ - 0.126968, - "Running transaction test\r\n" - ], - [ - 0.202189, - "Transaction test succeeded\r\n" - ], - [ - 0.000430, - "Running transaction\r\n" - ], - [ - 0.217882, - "\r Installing : 1:perl-Error-0.17020-2.el7.noarch [ ] 1/9" - ], - [ - 0.003775, - "\r Installing : 1:perl-Error-0.17020-2.el7.noarch [################ ] 1/9" - ], - [ - 0.001559, - "\r Installing : 1:perl-Error-0.17020-2.el7.noarch [##################### ] 1/9" - ], - [ - 0.001438, - "\r Installing : 1:perl-Error-0.17020-2.el7.noarch [####################### ] 1/9" - ], - [ - 0.001491, - "\r Installing : 1:perl-Error-0.17020-2.el7.noarch [######################### ] 1/9" - ], - [ - 0.000918, - "\r Installing : 1:perl-Error-0.17020-2.el7.noarch [########################## ] 1/9" - ], - [ - 0.000925, - "\r Installing : 1:perl-Error-0.17020-2.el7.noarch [########################### ] 1/9" - ], - [ - 0.000957, - "\r Installing : 1:perl-Error-0.17020-2.el7.noarch [############################ ] 1/9" - ], - [ - 0.000930, - "\r Installing : 1:perl-Error-0.17020-2.el7.noarch [############################# ] 1/9" - ], - [ - 0.000851, - "\r Installing : 1:perl-Error-0.17020-2.el7.noarch [############################## ] 1/9" - ], - [ - 0.001768, - "\r Installing : 1:perl-Error-0.17020-2.el7.noarch [########################################## ] 1/9" - ], - [ - 0.001125, - "\r Installing : 1:perl-Error-0.17020-2.el7.noarch [############################################## ] 1/9" - ], - [ - 0.000764, - "\r Installing : 1:perl-Error-0.17020-2.el7.noarch [############################################### ] 1/9" - ], - [ - 0.001695, - "\r Installing : 1:perl-Error-0.17020-2.el7.noarch [########################################################################################### ] 1/9" - ], - [ - 0.000864, - "\r Installing : 1:perl-Error-0.17020-2.el7.noarch [############################################################################################# ] 1/9" - ], - [ - 0.000774, - "\r Installing : 1:perl-Error-0.17020-2.el7.noarch 1/9 \r\n" - ], - [ - 0.123926, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [ ] 2/9" - ], - [ - 0.021116, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [# ] 2/9" - ], - [ - 0.007410, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [## ] 2/9" - ], - [ - 0.002262, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [### ] 2/9" - ], - [ - 0.007261, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [#### ] 2/9" - ], - [ - 0.005524, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [##### ] 2/9" - ], - [ - 0.003970, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [###### ] 2/9" - ], - [ - 0.007290, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [######## ] 2/9" - ], - [ - 0.001962, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [######### ] 2/9" - ], - [ - 0.004880, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [########### ] 2/9" - ], - [ - 0.002811, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [############# ] 2/9" - ], - [ - 0.005241, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [############## ] 2/9" - ], - [ - 0.002933, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [################ ] 2/9" - ], - [ - 0.008291, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [################# ] 2/9" - ], - [ - 0.014535, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [################### ] 2/9" - ], - [ - 0.002225, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [#################### ] 2/9" - ], - [ - 0.015535, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [###################### ] 2/9" - ], - [ - 0.003582, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [####################### ] 2/9" - ], - [ - 0.002962, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [######################## ] 2/9" - ], - [ - 0.005063, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [######################### ] 2/9" - ], - [ - 0.001974, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [########################## ] 2/9" - ], - [ - 0.006421, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [########################### ] 2/9" - ], - [ - 0.002440, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [############################ ] 2/9" - ], - [ - 0.003519, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [############################# ] 2/9" - ], - [ - 0.004649, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [############################### ] 2/9" - ], - [ - 0.004201, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [################################# ] 2/9" - ], - [ - 0.002743, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [################################### ] 2/9" - ], - [ - 0.003302, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [#################################### ] 2/9" - ], - [ - 0.002687, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [##################################### ] 2/9" - ], - [ - 0.002844, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [###################################### ] 2/9" - ], - [ - 0.001887, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [####################################### ] 2/9" - ], - [ - 0.005133, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [######################################## ] 2/9" - ], - [ - 0.002442, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [######################################### ] 2/9" - ], - [ - 0.003802, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [########################################## ] 2/9" - ], - [ - 0.003413, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [########################################### ] 2/9" - ], - [ - 0.007498, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [############################################ ] 2/9" - ], - [ - 0.004925, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [############################################# ] 2/9" - ], - [ - 0.008880, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [############################################## ] 2/9" - ], - [ - 0.003061, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [############################################### ] 2/9" - ], - [ - 0.002276, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [################################################ ] 2/9" - ], - [ - 0.001760, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [################################################# ] 2/9" - ], - [ - 0.003583, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [################################################## ] 2/9" - ], - [ - 0.004078, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [################################################### ] 2/9" - ], - [ - 0.001366, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [#################################################### ] 2/9" - ], - [ - 0.003302, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [##################################################### ] 2/9" - ], - [ - 0.009391, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [###################################################### ] 2/9" - ], - [ - 0.011562, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [####################################################### ] 2/9" - ], - [ - 0.009998, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [######################################################## ] 2/9" - ], - [ - 0.002055, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [######################################################### ] 2/9" - ], - [ - 0.001433, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [########################################################## ] 2/9" - ], - [ - 0.003468, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [########################################################### ] 2/9" - ], - [ - 0.003073, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [############################################################ ] 2/9" - ], - [ - 0.002758, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [############################################################# ] 2/9" - ], - [ - 0.002393, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [############################################################## ] 2/9" - ], - [ - 0.001915, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [############################################################### ] 2/9" - ], - [ - 0.009569, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [################################################################ ] 2/9" - ], - [ - 0.003414, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [################################################################# ] 2/9" - ], - [ - 0.002473, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [################################################################## ] 2/9" - ], - [ - 0.008745, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [################################################################### ] 2/9" - ], - [ - 0.004982, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [#################################################################### ] 2/9" - ], - [ - 0.001942, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [##################################################################### ] 2/9" - ], - [ - 0.002648, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [###################################################################### ] 2/9" - ], - [ - 0.005308, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [######################################################################## ] 2/9" - ], - [ - 0.005895, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [########################################################################## ] 2/9" - ], - [ - 0.001443, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [########################################################################### ] 2/9" - ], - [ - 0.003044, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [############################################################################# ] 2/9" - ], - [ - 0.004500, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [############################################################################### ] 2/9" - ], - [ - 0.016307, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [################################################################################ ] 2/9" - ], - [ - 0.009181, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [################################################################################# ] 2/9" - ], - [ - 0.005684, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [################################################################################## ] 2/9" - ], - [ - 0.007755, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [################################################################################### ] 2/9" - ], - [ - 0.008230, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [#################################################################################### ] 2/9" - ], - [ - 0.009124, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [##################################################################################### ] 2/9" - ], - [ - 0.004985, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [###################################################################################### ] 2/9" - ], - [ - 0.005035, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [####################################################################################### ] 2/9" - ], - [ - 0.006942, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [######################################################################################## ] 2/9" - ], - [ - 0.012212, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [######################################################################################### ] 2/9" - ], - [ - 0.007183, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [########################################################################################## ] 2/9" - ], - [ - 0.002843, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [########################################################################################### ] 2/9" - ], - [ - 0.004800, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch [############################################################################################ ] 2/9" - ], - [ - 0.001350, - "\r Installing : python-werkzeug-0.9.1-2.el7.noarch 2/9" - ], - [ - 0.000055, - " " - ], - [ - 0.000012, - "\r\n" - ], - [ - 0.066157, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [ ] 3/9" - ], - [ - 0.005077, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [### ] 3/9" - ], - [ - 0.010148, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [####################### ] 3/9" - ], - [ - 0.007473, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [########################################## ] 3/9" - ], - [ - 0.003071, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [################################################ ] 3/9" - ], - [ - 0.006129, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [######################################################### ] 3/9" - ], - [ - 0.029421, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [########################################################## ] 3/9" - ], - [ - 0.009392, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [########################################################### ] 3/9" - ], - [ - 0.002507, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [############################################################ ] 3/9" - ], - [ - 0.002362, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [############################################################# ] 3/9" - ], - [ - 0.001516, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [############################################################## ] 3/9" - ], - [ - 0.002312, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [############################################################### ] 3/9" - ], - [ - 0.002305, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [################################################################ ] 3/9" - ], - [ - 0.002480, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [################################################################# ] 3/9" - ], - [ - 0.002597, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [################################################################## ] 3/9" - ], - [ - 0.002185, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [################################################################### ] 3/9" - ], - [ - 0.002190, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [#################################################################### ] 3/9" - ], - [ - 0.002390, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [##################################################################### ] 3/9" - ], - [ - 0.004119, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [###################################################################### ] 3/9" - ], - [ - 0.003929, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [####################################################################### ] 3/9" - ], - [ - 0.002392, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [######################################################################## ] 3/9" - ], - [ - 0.002098, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [######################################################################### ] 3/9" - ], - [ - 0.002130, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [########################################################################## ] 3/9" - ], - [ - 0.001115, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [########################################################################### ] 3/9" - ], - [ - 0.002846, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [############################################################################ ] 3/9" - ], - [ - 0.001094, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [############################################################################# ] 3/9" - ], - [ - 0.002384, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [############################################################################## ] 3/9" - ], - [ - 0.003038, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [############################################################################### ] 3/9" - ], - [ - 0.003507, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [################################################################################ ] 3/9" - ], - [ - 0.003644, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [################################################################################# ] 3/9" - ], - [ - 0.001851, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [################################################################################## ] 3/9" - ], - [ - 0.002225, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [################################################################################### ] 3/9" - ], - [ - 0.002897, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [#################################################################################### ] 3/9" - ], - [ - 0.002586, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [##################################################################################### ] 3/9" - ], - [ - 0.002149, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [###################################################################################### ] 3/9" - ], - [ - 0.001115, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [####################################################################################### ] 3/9" - ], - [ - 0.001874, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [######################################################################################## ] 3/9" - ], - [ - 0.001951, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [######################################################################################### ] 3/9" - ], - [ - 0.001603, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [########################################################################################## ] 3/9" - ], - [ - 0.001915, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 [########################################################################################### ] 3/9" - ], - [ - 0.003636, - "\r Installing : libgnome-keyring-3.8.0-3.el7.x86_64 3/9" - ], - [ - 0.000048, - " " - ], - [ - 0.000013, - "\r\n" - ], - [ - 0.213098, - "\r Installing : python-itsdangerous-0.23-2.el7.noarch [ ] 4/9" - ], - [ - 0.009896, - "\r Installing : python-itsdangerous-0.23-2.el7.noarch [# ] 4/9" - ], - [ - 0.003758, - "\r Installing : python-itsdangerous-0.23-2.el7.noarch [########################### ] 4/9" - ], - [ - 0.003663, - "\r Installing : python-itsdangerous-0.23-2.el7.noarch [######################################################## ] 4/9" - ], - [ - 0.004279, - "\r Installing : python-itsdangerous-0.23-2.el7.noarch [##################################################################################### ] 4/9" - ], - [ - 0.003224, - "\r Installing : python-itsdangerous-0.23-2.el7.noarch [####################################################################################### ] 4/9" - ], - [ - 0.001648, - "\r Installing : python-itsdangerous-0.23-2.el7.noarch [######################################################################################### ] 4/9" - ], - [ - 0.002611, - "\r Installing : python-itsdangerous-0.23-2.el7.noarch 4/9" - ], - [ - 0.000075, - " " - ], - [ - 0.000071, - "\r\n" - ], - [ - 0.063769, - "\r Installing : perl-TermReadKey-2.30-20.el7.x86_64 [ ] 5/9" - ], - [ - 0.005579, - "\r Installing : perl-TermReadKey-2.30-20.el7.x86_64 [####################### ] 5/9" - ], - [ - 0.001918, - "\r Installing : perl-TermReadKey-2.30-20.el7.x86_64 [######################## ] 5/9" - ], - [ - 0.005394, - "\r Installing : perl-TermReadKey-2.30-20.el7.x86_64 [######################################################################### ] 5/9" - ], - [ - 0.001772, - "\r Installing : perl-TermReadKey-2.30-20.el7.x86_64 [########################################################################## ] 5/9" - ], - [ - 0.003341, - "\r Installing : perl-TermReadKey-2.30-20.el7.x86_64 [################################################################################### ] 5/9" - ], - [ - 0.002709, - "\r Installing : perl-TermReadKey-2.30-20.el7.x86_64 [########################################################################################### ] 5/9" - ], - [ - 0.001663, - "\r Installing : perl-TermReadKey-2.30-20.el7.x86_64 5/9 \r\n" - ], - [ - 0.077309, - "\r Installing : perl-Git-1.8.3.1-6.el7.noarch [ ] 6/9" - ], - [ - 0.004737, - "\r Installing : perl-Git-1.8.3.1-6.el7.noarch [################ ] 6/9" - ], - [ - 0.002630, - "\r Installing : perl-Git-1.8.3.1-6.el7.noarch [#################### ] 6/9" - ], - [ - 0.007317, - "\r Installing : perl-Git-1.8.3.1-6.el7.noarch [############################################################################################ ] 6/9" - ], - [ - 0.002074, - "\r Installing : perl-Git-1.8.3.1-6.el7.noarch [################################################################################################ ] 6/9" - ], - [ - 0.001877, - "\r Installing : perl-Git-1.8.3.1-6.el7.noarch [################################################################################################# ] 6/9" - ], - [ - 0.001693, - "\r Installing : perl-Git-1.8.3.1-6.el7.noarch 6/9 \r\n" - ], - [ - 0.068200, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [ ] 7/9" - ], - [ - 0.034944, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [# ] 7/9" - ], - [ - 0.027417, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [## ] 7/9" - ], - [ - 0.018185, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [### ] 7/9" - ], - [ - 0.017012, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [#### ] 7/9" - ], - [ - 0.009113, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [##### ] 7/9" - ], - [ - 0.008146, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [###### ] 7/9" - ], - [ - 0.011319, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [####### ] 7/9" - ], - [ - 0.007786, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [######## ] 7/9" - ], - [ - 0.007750, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [######### ] 7/9" - ], - [ - 0.007926, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [########## ] 7/9" - ], - [ - 0.011521, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [########### ] 7/9" - ], - [ - 0.005772, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############ ] 7/9" - ], - [ - 0.007509, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############# ] 7/9" - ], - [ - 0.008744, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############## ] 7/9" - ], - [ - 0.007306, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############### ] 7/9" - ], - [ - 0.007497, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################ ] 7/9" - ], - [ - 0.010357, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################# ] 7/9" - ], - [ - 0.006020, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################## ] 7/9" - ], - [ - 0.009343, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################### ] 7/9" - ], - [ - 0.006176, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [#################### ] 7/9" - ], - [ - 0.020059, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [##################### ] 7/9" - ], - [ - 0.015463, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [###################### ] 7/9" - ], - [ - 0.009730, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [####################### ] 7/9" - ], - [ - 0.011806, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [######################## ] 7/9" - ], - [ - 0.011016, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [######################### ] 7/9" - ], - [ - 0.006419, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [########################## ] 7/9" - ], - [ - 0.011560, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [########################### ] 7/9" - ], - [ - 0.034629, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################ ] 7/9" - ], - [ - 0.005754, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################# ] 7/9" - ], - [ - 0.009476, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################## ] 7/9" - ], - [ - 0.010211, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################### ] 7/9" - ], - [ - 0.086454, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################ ] 7/9" - ], - [ - 0.097887, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################# ] 7/9" - ], - [ - 0.033015, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################### ] 7/9" - ], - [ - 0.037376, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [#################################### ] 7/9" - ], - [ - 0.017179, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [##################################### ] 7/9" - ], - [ - 0.051455, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [###################################### ] 7/9" - ], - [ - 0.056214, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [####################################### ] 7/9" - ], - [ - 0.038981, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [######################################## ] 7/9" - ], - [ - 0.014736, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [######################################### ] 7/9" - ], - [ - 0.023419, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [########################################## ] 7/9" - ], - [ - 0.015800, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [########################################### ] 7/9" - ], - [ - 0.012743, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################################ ] 7/9" - ], - [ - 0.013548, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################################# ] 7/9" - ], - [ - 0.014062, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################################## ] 7/9" - ], - [ - 0.009018, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################################### ] 7/9" - ], - [ - 0.012935, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################################ ] 7/9" - ], - [ - 0.013396, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################################# ] 7/9" - ], - [ - 0.025151, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################################## ] 7/9" - ], - [ - 0.021500, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################################### ] 7/9" - ], - [ - 0.022887, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [#################################################### ] 7/9" - ], - [ - 0.016958, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [##################################################### ] 7/9" - ], - [ - 0.021495, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [###################################################### ] 7/9" - ], - [ - 0.015228, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [####################################################### ] 7/9" - ], - [ - 0.017083, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [######################################################## ] 7/9" - ], - [ - 0.023127, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [######################################################### ] 7/9" - ], - [ - 0.012304, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [########################################################## ] 7/9" - ], - [ - 0.025449, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [########################################################### ] 7/9" - ], - [ - 0.029496, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################################################ ] 7/9" - ], - [ - 0.018423, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################################################# ] 7/9" - ], - [ - 0.036277, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################################################## ] 7/9" - ], - [ - 0.028102, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################################################### ] 7/9" - ], - [ - 0.019830, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################################################ ] 7/9" - ], - [ - 0.019948, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################################################# ] 7/9" - ], - [ - 0.025145, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################################################## ] 7/9" - ], - [ - 0.023395, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################################################### ] 7/9" - ], - [ - 0.024818, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [##################################################################### ] 7/9" - ], - [ - 0.022533, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [###################################################################### ] 7/9" - ], - [ - 0.037544, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [####################################################################### ] 7/9" - ], - [ - 0.023297, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [######################################################################## ] 7/9" - ], - [ - 0.021518, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [######################################################################### ] 7/9" - ], - [ - 0.019694, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [########################################################################## ] 7/9" - ], - [ - 0.013451, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [########################################################################### ] 7/9" - ], - [ - 0.023830, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################################################################ ] 7/9" - ], - [ - 0.008739, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################################################################# ] 7/9" - ], - [ - 0.036166, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################################################################## ] 7/9" - ], - [ - 0.022422, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################################################################### ] 7/9" - ], - [ - 0.010420, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################################################################ ] 7/9" - ], - [ - 0.008767, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################################################################# ] 7/9" - ], - [ - 0.008799, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################################################################## ] 7/9" - ], - [ - 0.034464, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################################################################### ] 7/9" - ], - [ - 0.059097, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [#################################################################################### ] 7/9" - ], - [ - 0.064779, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [##################################################################################### ] 7/9" - ], - [ - 0.044983, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [###################################################################################### ] 7/9" - ], - [ - 0.012321, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [####################################################################################### ] 7/9" - ], - [ - 0.016411, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [######################################################################################## ] 7/9" - ], - [ - 0.015968, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [######################################################################################### ] 7/9" - ], - [ - 0.011880, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [########################################################################################## ] 7/9" - ], - [ - 0.011288, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [########################################################################################### ] 7/9" - ], - [ - 0.045456, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################################################################################ ] 7/9" - ], - [ - 0.007806, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################################################################################# ] 7/9" - ], - [ - 0.005854, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################################################################################## ] 7/9" - ], - [ - 0.010569, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [############################################################################################### ] 7/9" - ], - [ - 0.005943, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################################################################################ ] 7/9" - ], - [ - 0.007626, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################################################################################# ] 7/9" - ], - [ - 0.005385, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################################################################################## ] 7/9" - ], - [ - 0.012244, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [################################################################################################### ] 7/9" - ], - [ - 0.005546, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [#################################################################################################### ] 7/9" - ], - [ - 0.006956, - "\r Installing : git-1.8.3.1-6.el7.x86_64 [##################################################################################################### ] 7/9" - ], - [ - 0.008953, - "\r Installing : git-1.8.3.1-6.el7.x86_64 7/9" - ], - [ - 0.000137, - " " - ], - [ - 0.000043, - "\r\n" - ], - [ - 0.371294, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [ ] 8/9" - ], - [ - 0.035255, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [###### ] 8/9" - ], - [ - 0.006279, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [############ ] 8/9" - ], - [ - 0.003190, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [################# ] 8/9" - ], - [ - 0.002453, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [################## ] 8/9" - ], - [ - 0.002195, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [#################### ] 8/9" - ], - [ - 0.001803, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [###################### ] 8/9" - ], - [ - 0.003707, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [######################## ] 8/9" - ], - [ - 0.001931, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [######################### ] 8/9" - ], - [ - 0.001551, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [########################## ] 8/9" - ], - [ - 0.009385, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [############################# ] 8/9" - ], - [ - 0.003359, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [################################ ] 8/9" - ], - [ - 0.002713, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [################################## ] 8/9" - ], - [ - 0.002234, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [################################### ] 8/9" - ], - [ - 0.004258, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [#################################### ] 8/9" - ], - [ - 0.001667, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [##################################### ] 8/9" - ], - [ - 0.003427, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [###################################### ] 8/9" - ], - [ - 0.001909, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [####################################### ] 8/9" - ], - [ - 0.003754, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [######################################## ] 8/9" - ], - [ - 0.002525, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [############################################ ] 8/9" - ], - [ - 0.003421, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [################################################# ] 8/9" - ], - [ - 0.003946, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [##################################################### ] 8/9" - ], - [ - 0.003267, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [####################################################### ] 8/9" - ], - [ - 0.004013, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [########################################################### ] 8/9" - ], - [ - 0.002840, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [############################################################## ] 8/9" - ], - [ - 0.002420, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [############################################################### ] 8/9" - ], - [ - 0.004665, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [################################################################ ] 8/9" - ], - [ - 0.002779, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [################################################################# ] 8/9" - ], - [ - 0.001658, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [################################################################## ] 8/9" - ], - [ - 0.019189, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [################################################################### ] 8/9" - ], - [ - 0.023388, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [#################################################################### ] 8/9" - ], - [ - 0.045102, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [##################################################################### ] 8/9" - ], - [ - 0.004081, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [###################################################################### ] 8/9" - ], - [ - 0.001616, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [####################################################################### ] 8/9" - ], - [ - 0.002512, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [######################################################################## ] 8/9" - ], - [ - 0.002614, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [######################################################################### ] 8/9" - ], - [ - 0.003327, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [########################################################################## ] 8/9" - ], - [ - 0.002226, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [########################################################################### ] 8/9" - ], - [ - 0.001329, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [############################################################################ ] 8/9" - ], - [ - 0.006922, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [############################################################################# ] 8/9" - ], - [ - 0.001963, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [############################################################################## ] 8/9" - ], - [ - 0.008805, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [############################################################################### ] 8/9" - ], - [ - 0.009556, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [################################################################################ ] 8/9" - ], - [ - 0.007668, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [################################################################################# ] 8/9" - ], - [ - 0.006024, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [################################################################################## ] 8/9" - ], - [ - 0.002091, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [################################################################################### ] 8/9" - ], - [ - 0.007359, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [###################################################################################### ] 8/9" - ], - [ - 0.004211, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [####################################################################################### ] 8/9" - ], - [ - 0.001855, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [######################################################################################## ] 8/9" - ], - [ - 0.003916, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [######################################################################################### ] 8/9" - ], - [ - 0.004994, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [########################################################################################## ] 8/9" - ], - [ - 0.035755, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [########################################################################################### ] 8/9" - ], - [ - 0.015995, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch [############################################################################################ ] 8/9" - ], - [ - 0.003034, - "\r Installing : 1:python-flask-0.10.1-4.el7.noarch 8/9" - ], - [ - 0.000010, - " \r\n" - ], - [ - 0.081416, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [ ] 9/9" - ], - [ - 0.057036, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [# ] 9/9" - ], - [ - 0.007544, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [## ] 9/9" - ], - [ - 0.007657, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [### ] 9/9" - ], - [ - 0.008488, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [#### ] 9/9" - ], - [ - 0.002547, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [##### ] 9/9" - ], - [ - 0.006889, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [###### ] 9/9" - ], - [ - 0.008176, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [####### ] 9/9" - ], - [ - 0.002599, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [######## ] 9/9" - ], - [ - 0.014899, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [######### ] 9/9" - ], - [ - 0.006802, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [########## ] 9/9" - ], - [ - 0.012068, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [########### ] 9/9" - ], - [ - 0.002115, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############ ] 9/9" - ], - [ - 0.007121, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############# ] 9/9" - ], - [ - 0.009113, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############## ] 9/9" - ], - [ - 0.002031, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############### ] 9/9" - ], - [ - 0.009411, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################ ] 9/9" - ], - [ - 0.001026, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################# ] 9/9" - ], - [ - 0.002781, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################## ] 9/9" - ], - [ - 0.005795, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################### ] 9/9" - ], - [ - 0.007012, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [#################### ] 9/9" - ], - [ - 0.001280, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [##################### ] 9/9" - ], - [ - 0.010903, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [###################### ] 9/9" - ], - [ - 0.001960, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [####################### ] 9/9" - ], - [ - 0.005142, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [######################## ] 9/9" - ], - [ - 0.001939, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [######################### ] 9/9" - ], - [ - 0.001339, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [########################## ] 9/9" - ], - [ - 0.007669, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [########################### ] 9/9" - ], - [ - 0.006418, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############################ ] 9/9" - ], - [ - 0.003167, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############################# ] 9/9" - ], - [ - 0.002869, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############################## ] 9/9" - ], - [ - 0.007581, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############################### ] 9/9" - ], - [ - 0.005550, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################################ ] 9/9" - ], - [ - 0.009997, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################################# ] 9/9" - ], - [ - 0.015525, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################################## ] 9/9" - ], - [ - 0.017831, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################################### ] 9/9" - ], - [ - 0.003837, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [#################################### ] 9/9" - ], - [ - 0.002408, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [##################################### ] 9/9" - ], - [ - 0.012684, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [###################################### ] 9/9" - ], - [ - 0.004497, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [####################################### ] 9/9" - ], - [ - 0.019245, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [######################################## ] 9/9" - ], - [ - 0.005599, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [######################################### ] 9/9" - ], - [ - 0.008346, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [########################################## ] 9/9" - ], - [ - 0.004709, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [########################################### ] 9/9" - ], - [ - 0.003281, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############################################ ] 9/9" - ], - [ - 0.013198, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############################################# ] 9/9" - ], - [ - 0.003735, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############################################## ] 9/9" - ], - [ - 0.011630, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############################################### ] 9/9" - ], - [ - 0.006367, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################################################ ] 9/9" - ], - [ - 0.004962, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################################################# ] 9/9" - ], - [ - 0.005052, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################################################## ] 9/9" - ], - [ - 0.007098, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################################################### ] 9/9" - ], - [ - 0.009666, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [#################################################### ] 9/9" - ], - [ - 0.012268, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [##################################################### ] 9/9" - ], - [ - 0.029124, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [###################################################### ] 9/9" - ], - [ - 0.007197, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [####################################################### ] 9/9" - ], - [ - 0.015458, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [######################################################## ] 9/9" - ], - [ - 0.006996, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [######################################################### ] 9/9" - ], - [ - 0.005191, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [########################################################## ] 9/9" - ], - [ - 0.003762, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [########################################################### ] 9/9" - ], - [ - 0.012289, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############################################################ ] 9/9" - ], - [ - 0.005208, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############################################################# ] 9/9" - ], - [ - 0.003509, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############################################################## ] 9/9" - ], - [ - 0.007648, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############################################################### ] 9/9" - ], - [ - 0.008811, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################################################################ ] 9/9" - ], - [ - 0.010388, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################################################################# ] 9/9" - ], - [ - 0.008502, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################################################################## ] 9/9" - ], - [ - 0.035484, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################################################################### ] 9/9" - ], - [ - 0.029015, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [#################################################################### ] 9/9" - ], - [ - 0.010725, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [##################################################################### ] 9/9" - ], - [ - 0.005531, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [###################################################################### ] 9/9" - ], - [ - 0.013799, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [####################################################################### ] 9/9" - ], - [ - 0.001778, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [######################################################################## ] 9/9" - ], - [ - 0.025911, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [######################################################################### ] 9/9" - ], - [ - 0.039012, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [########################################################################## ] 9/9" - ], - [ - 0.007217, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [########################################################################### ] 9/9" - ], - [ - 0.002849, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############################################################################ ] 9/9" - ], - [ - 0.024759, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############################################################################# ] 9/9" - ], - [ - 0.012750, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############################################################################## ] 9/9" - ], - [ - 0.002581, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############################################################################### ] 9/9" - ], - [ - 0.033375, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################################################################################ ] 9/9" - ], - [ - 0.004617, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################################################################################# ] 9/9" - ], - [ - 0.005490, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################################################################################## ] 9/9" - ], - [ - 0.012608, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [################################################################################### ] 9/9" - ], - [ - 0.010065, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [#################################################################################### ] 9/9" - ], - [ - 0.006022, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [##################################################################################### ] 9/9" - ], - [ - 0.008270, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [###################################################################################### ] 9/9" - ], - [ - 0.020678, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [####################################################################################### ] 9/9" - ], - [ - 0.028927, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [######################################################################################## ] 9/9" - ], - [ - 0.028416, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [######################################################################################### ] 9/9" - ], - [ - 0.016196, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [########################################################################################## ] 9/9" - ], - [ - 0.018334, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [########################################################################################### ] 9/9" - ], - [ - 0.025059, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch [############################################################################################ ] 9/9" - ], - [ - 0.024840, - "\r Installing : python-pip-7.1.0-1.el7~mos1.noarch 9/9 \r\n" - ], - [ - 0.151436, - "\r Verifying : 1:python-flask-0.10.1-4.el7.noarch 1/9" - ], - [ - 0.000805, - " " - ], - [ - 0.000360, - "\r\n" - ], - [ - 0.022108, - "\r Verifying : perl-TermReadKey-2.30-20.el7.x86_64 2/9" - ], - [ - 0.000353, - " " - ], - [ - 0.000188, - "\r\n" - ], - [ - 0.018564, - "\r Verifying : perl-Git-1.8.3.1-6.el7.noarch 3/9" - ], - [ - 0.000344, - " " - ], - [ - 0.000187, - "\r\n" - ], - [ - 0.029983, - "\r Verifying : git-1.8.3.1-6.el7.x86_64 4/9" - ], - [ - 0.000362, - " " - ], - [ - 0.000184, - "\r\n" - ], - [ - 0.029580, - "\r Verifying : python-itsdangerous-0.23-2.el7.noarch 5/9" - ], - [ - 0.000843, - " " - ], - [ - 0.000323, - "\r\n" - ], - [ - 0.023226, - "\r Verifying : python-pip-7.1.0-1.el7~mos1.noarch 6/9" - ], - [ - 0.000523, - " " - ], - [ - 0.000341, - "\r\n" - ], - [ - 0.029222, - "\r Verifying : libgnome-keyring-3.8.0-3.el7.x86_64 7/9" - ], - [ - 0.000471, - " " - ], - [ - 0.000316, - "\r\n" - ], - [ - 0.025455, - "\r Verifying : 1:perl-Error-0.17020-2.el7.noarch 8/9" - ], - [ - 0.000810, - " \r\n" - ], - [ - 0.032011, - "\r Verifying : python-werkzeug-0.9.1-2.el7.noarch 9/9 \r\n" - ], - [ - 0.207423, - "\r\nInstalled:\r\n git.x86_64 0:1.8.3.1-6.el7 python-flask.noarch 1:0.10.1-4.el7 python-pip.noarch 0:7.1.0-1.el7~mos1 \r\n\r\nDependency Installed:\r\n libgnome-keyring.x86_64 0:3.8.0-3.el7 perl-Error.noarch 1:0.17020-2.el7 perl-Git.noarch 0:1.8.3.1-6.el7 perl-TermReadKey.x86_64 0:2.30-20.el7\r\n python-itsdangerous.noarch 0:0.23-2.el7 python-werkzeug.noarch 0:0.9.1-2.el7\r\n\r\n" - ], - [ - 0.000604, - "Complete!\r\n" - ], - [ - 0.034771, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "T" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "T" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "B" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "x" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - "-" - ], - [ - 0.05, - "re" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - "-" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "q" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "T" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "B" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "x" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "git clone https://git.openstack.org/openstack/tuning-box.git" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.004742, - "Cloning into 'tuning-box'..." - ], - [ - 0.000046, - "\r\n" - ], - [ - 0.5, - "remote: Counting objects: 453, done.\u001b[K\r\nremote: Compressing objects: 0% (1/228) \u001b[K\rremote: Compressing objects: 1% (3/228) \u001b[K\rremote: Compressing objects: 2% (5/228) \u001b[K\rremote: Compressing objects: 3% (7/228) \u001b[K\rremote: Compressing objects: 4% (10/228) \u001b[K\rremote: Compressing objects: 5% (12/228) \u001b[K\rremote: Compressing objects: 6% (14/228) \u001b[K\rremote: Compressing objects: 7% (16/228) \u001b[K\rremote: Compressing objects: 8% (19/228) \u001b[K\rremote: Compressing objects: 9% (21/228) \u001b[K\rremote: Compressing objects: 10% (23/228) \u001b[K\rremote: Compressing objects: 11% (26/228) \u001b[K\rremote: Compressing objects: 12% (28/228) \u001b[K\rremote: Compressing objects: 13% (30/228) \u001b[K\rremote: Compressing objects: 14% (32/228) \u001b[K\rremote: Compressing objects: 15% (35/228) \u001b[K\rremote: Compressing objects: 16% (37/228) \u001b[K\rremote: Compressing objects: 17% (39/228) \u001b[K\rremote: Compressing objects: 18% (42/228) \u001b[K\rremote: Compressing objects: 19% (44/228) \u001b[K\rremote: Compressing objects: 20% (46/228) \u001b[K\rremote: Compressing objects: 21% (48/228) \u001b[K\rremote: Compressing objects: 22% (51/228) \u001b[K\rremote: Compressing objects: 23% (53/228) \u001b[K\rremote: Compressing objects: 24% (55/228) \u001b[K\rremote: Compressing objects: 25% (57/228) \u001b[K\rremote: Compressing objects: 26% (60/228) \u001b[K\rremote: Compressing objects: 27% (62/228) \u001b[K\rremote: Compressing objects: 28% (64/228) \u001b[K\rremote: Compressing objects: 29% (67/228) \u001b[K\rremote: Compressing objects: 30% (69/228) \u001b[K\rremote: Compressing objects: 31% (71/228) \u001b[K\rremote: Compressing objects: 32% (73/228) \u001b[K\rremote: Compressing objects: 33% (76/228) \u001b[K\rremote: Compressing objects: 34% (78/228) \u001b[K\rremote: Compressing objects: 35% (80/228) \u001b[K\rremote: Compressing objects: 36% (83/228) \u001b[K\rremote: Compressing objects: 37% (85/228) \u001b[K\rremote: Compressing objects: 38% (87/228) \u001b[K\rremote: Compressing objects: 39% (89/228) \u001b[K\rremote: Compressing objects: 40% (92/228) \u001b[K\rremote: Compressing objects: 41% (94/228) \u001b[K\rremote: Compressing objects: 42% (96/228) \u001b[K\rremote: Compressing objects: 43% (99/228) \u001b[K\rremote: Compressing objects: 44% (101/228) \u001b[K\rremote: Compressing objects: 45% (103/228) \u001b[K\rremote: Compressing objects: 46% (105/228) \u001b[K\rremote: Compressing objects: 47% (108/228) \u001b[K\rremote: Compressing objects: 48% (110/228) \u001b[K\rremote: Compressing objects: 49% (112/228) \u001b[K\rremote: Compressing objects: 50% (114/228) \u001b[K\rremote: Compressing objects: 51% (117/228) \u001b[K\rremote: Compressing objects: 52% (119/228) \u001b[K\rremote: Compressing objects: 53% (121/228) \u001b[K\rremote: Compressing objects: 54% (124/228) \u001b[K\rremote: Compressing objects: 55% (126/228) \u001b[K\rremote: Compressing objects: 56% (128/228) \u001b[K\rremote: Compressing objects: 57% (130/228) \u001b[K\rremote: Compressing objects: 58% (133/228) \u001b[K\rremote: Compressing objects: 59% (135/228) \u001b[K\rremote: Compressing objects: 60% (137/228) \u001b[K\rremote: Compressing objects: 61% (140/228) \u001b[K\rremote: Compressing objects: 62% (142/228) \u001b[K\rremote: Compressing objects: 63% (144/228) \u001b[K\rremote: Compressing objects: 64% (146/228) \u001b[K\r" - ], - [ - 0.143648, - "remote: Compressing objects: 65% (149/228) \u001b[K\r" - ], - [ - 0.000060, - "remote: Compressing objects: 66% (151/228) \u001b[K\r" - ], - [ - 0.000041, - "remote: Compressing objects: 67% (153/228) \u001b[K\r" - ], - [ - 0.000413, - "remote: Compressing objects: 68% (156/228) \u001b[K\r" - ], - [ - 0.000035, - "remote: Compressing objects: 69% (158/228) \u001b[K\r" - ], - [ - 0.000017, - "remote: Compressing objects: 70% (160/228) \u001b[K\r" - ], - [ - 0.000018, - "remote: Compressing objects: 71% (162/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 72% (165/228) \u001b[K\r" - ], - [ - 0.000036, - "remote: Compressing objects: 73% (167/228) \u001b[K\r" - ], - [ - 0.000020, - "remote: Compressing objects: 74% (169/228) \u001b[K\r" - ], - [ - 0.000017, - "remote: Compressing objects: 75% (171/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 76% (174/228) \u001b[K\r" - ], - [ - 0.000026, - "remote: Compressing objects: 77% (176/228) \u001b[K\r" - ], - [ - 0.000019, - "remote: Compressing objects: 78% (178/228) \u001b[K\r" - ], - [ - 0.000017, - "remote: Compressing objects: 79% (181/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 80% (183/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 81% (185/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 82% (187/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 83% (190/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 84% (192/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 85% (194/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 86% (197/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 87% (199/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 88% (201/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 89% (203/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 90% (206/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 91% (208/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 92% (210/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 93% (213/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 94% (215/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 95% (217/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 96% (219/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 97% (222/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 98% (224/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 99% (226/228) \u001b[K\r" - ], - [ - 0.000016, - "remote: Compressing objects: 100% (228/228) \u001b[K\r" - ], - [ - 0.000018, - "remote: Compressing objects: 100% (228/228), done.\u001b[K" - ], - [ - 0.000944, - "\r\n" - ], - [ - 0.001422, - "Receiving objects: 0% (1/453) \r" - ], - [ - 0.000453, - "Receiving objects: 1% (5/453) \r" - ], - [ - 0.000464, - "Receiving objects: 2% (10/453) \r" - ], - [ - 0.000391, - "Receiving objects: 3% (14/453) \r" - ], - [ - 0.000580, - "Receiving objects: 4% (19/453) \r" - ], - [ - 0.000435, - "Receiving objects: 5% (23/453) \r" - ], - [ - 0.000438, - "Receiving objects: 6% (28/453) \r" - ], - [ - 0.000413, - "Receiving objects: 7% (32/453) \r" - ], - [ - 0.000423, - "Receiving objects: 8% (37/453) \r" - ], - [ - 0.000287, - "Receiving objects: 9% (41/453) \r" - ], - [ - 0.000337, - "Receiving objects: 10% (46/453) \r" - ], - [ - 0.000258, - "Receiving objects: 11% (50/453) \r" - ], - [ - 0.000274, - "Receiving objects: 12% (55/453) \r" - ], - [ - 0.000340, - "Receiving objects: 13% (59/453) \r" - ], - [ - 0.000351, - "Receiving objects: 14% (64/453) \r" - ], - [ - 0.000183, - "Receiving objects: 15% (68/453) \r" - ], - [ - 0.000202, - "Receiving objects: 16% (73/453) \r" - ], - [ - 0.000206, - "Receiving objects: 17% (78/453) \r" - ], - [ - 0.000300, - "Receiving objects: 18% (82/453) \r" - ], - [ - 0.000514, - "Receiving objects: 19% (87/453) \r" - ], - [ - 0.000186, - "Receiving objects: 20% (91/453) \r" - ], - [ - 0.000267, - "Receiving objects: 21% (96/453) \r" - ], - [ - 0.000151, - "Receiving objects: 22% (100/453) \r" - ], - [ - 0.136348, - "Receiving objects: 23% (105/453) \r" - ], - [ - 0.000593, - "Receiving objects: 24% (109/453) \r" - ], - [ - 0.000943, - "Receiving objects: 25% (114/453) \r" - ], - [ - 0.000534, - "Receiving objects: 26% (118/453) \r" - ], - [ - 0.000707, - "Receiving objects: 27% (123/453) \r" - ], - [ - 0.000438, - "Receiving objects: 28% (127/453) \r" - ], - [ - 0.000952, - "Receiving objects: 29% (132/453) \r" - ], - [ - 0.000223, - "Receiving objects: 30% (136/453) \r" - ], - [ - 0.000235, - "Receiving objects: 31% (141/453) \r" - ], - [ - 0.000179, - "Receiving objects: 32% (145/453) \r" - ], - [ - 0.000334, - "Receiving objects: 33% (150/453) \r" - ], - [ - 0.000180, - "Receiving objects: 34% (155/453) \r" - ], - [ - 0.000208, - "Receiving objects: 35% (159/453) \r" - ], - [ - 0.000180, - "Receiving objects: 36% (164/453) \r" - ], - [ - 0.000145, - "Receiving objects: 37% (168/453) \r" - ], - [ - 0.000149, - "Receiving objects: 38% (173/453) \r" - ], - [ - 0.000243, - "Receiving objects: 39% (177/453) \r" - ], - [ - 0.000168, - "Receiving objects: 40% (182/453) \r" - ], - [ - 0.000145, - "Receiving objects: 41% (186/453) \r" - ], - [ - 0.000145, - "Receiving objects: 42% (191/453) \r" - ], - [ - 0.000164, - "Receiving objects: 43% (195/453) \r" - ], - [ - 0.000311, - "Receiving objects: 44% (200/453) \r" - ], - [ - 0.000202, - "Receiving objects: 45% (204/453) \r" - ], - [ - 0.000155, - "Receiving objects: 46% (209/453) \r" - ], - [ - 0.000168, - "Receiving objects: 47% (213/453) \r" - ], - [ - 0.000147, - "Receiving objects: 48% (218/453) \r" - ], - [ - 0.000175, - "Receiving objects: 49% (222/453) \r" - ], - [ - 0.000502, - "Receiving objects: 50% (227/453) \r" - ], - [ - 0.000169, - "Receiving objects: 51% (232/453) \r" - ], - [ - 0.000178, - "Receiving objects: 52% (236/453) \r" - ], - [ - 0.000167, - "Receiving objects: 53% (241/453) \r" - ], - [ - 0.000152, - "Receiving objects: 54% (245/453) \r" - ], - [ - 0.000144, - "Receiving objects: 55% (250/453) \r" - ], - [ - 0.000199, - "Receiving objects: 56% (254/453) \r" - ], - [ - 0.000146, - "Receiving objects: 57% (259/453) \r" - ], - [ - 0.000152, - "Receiving objects: 58% (263/453) \r" - ], - [ - 0.000090, - "Receiving objects: 59% (268/453) \r" - ], - [ - 0.000069, - "Receiving objects: 60% (272/453) \r" - ], - [ - 0.000155, - "Receiving objects: 61% (277/453) \r" - ], - [ - 0.000151, - "Receiving objects: 62% (281/453) \r" - ], - [ - 0.000199, - "Receiving objects: 63% (286/453) \r" - ], - [ - 0.000231, - "Receiving objects: 64% (290/453) \r" - ], - [ - 0.000254, - "Receiving objects: 65% (295/453) \r" - ], - [ - 0.000149, - "Receiving objects: 66% (299/453) \r" - ], - [ - 0.000209, - "Receiving objects: 67% (304/453) \r" - ], - [ - 0.000176, - "Receiving objects: 68% (309/453) \r" - ], - [ - 0.000094, - "Receiving objects: 69% (313/453) \r" - ], - [ - 0.000031, - "Receiving objects: 70% (318/453) \r" - ], - [ - 0.000132, - "Receiving objects: 71% (322/453) \rReceiving objects: 72% (327/453) \rReceiving objects: 73% (331/453) \rReceiving objects: 74% (336/453) \r" - ], - [ - 0.000026, - "Receiving objects: 75% (340/453) \r" - ], - [ - 0.000196, - "Receiving objects: 76% (345/453) \rReceiving objects: 77% (349/453) \rReceiving objects: 78% (354/453) \rReceiving objects: 79% (358/453) \rReceiving objects: 80% (363/453) \rReceiving objects: 81% (367/453) \r" - ], - [ - 0.130694, - "remote: Total 453 (delta 283), reused 360 (delta 218)\u001b[K\r\n" - ], - [ - 0.000336, - "Receiving objects: 82% (372/453) \r" - ], - [ - 0.000355, - "Receiving objects: 83% (376/453) \r" - ], - [ - 0.000230, - "Receiving objects: 84% (381/453) \r" - ], - [ - 0.000310, - "Receiving objects: 85% (386/453) \r" - ], - [ - 0.000183, - "Receiving objects: 86% (390/453) \r" - ], - [ - 0.000201, - "Receiving objects: 87% (395/453) \r" - ], - [ - 0.000224, - "Receiving objects: 88% (399/453) \r" - ], - [ - 0.000239, - "Receiving objects: 89% (404/453) \r" - ], - [ - 0.000200, - "Receiving objects: 90% (408/453) \r" - ], - [ - 0.000215, - "Receiving objects: 91% (413/453) \r" - ], - [ - 0.000259, - "Receiving objects: 92% (417/453) \r" - ], - [ - 0.000268, - "Receiving objects: 93% (422/453) \r" - ], - [ - 0.000260, - "Receiving objects: 94% (426/453) \r" - ], - [ - 0.000213, - "Receiving objects: 95% (431/453) \r" - ], - [ - 0.000207, - "Receiving objects: 96% (435/453) \r" - ], - [ - 0.000452, - "Receiving objects: 97% (440/453) \r" - ], - [ - 0.000279, - "Receiving objects: 98% (444/453) \r" - ], - [ - 0.000333, - "Receiving objects: 99% (449/453) \r" - ], - [ - 0.000265, - "Receiving objects: 100% (453/453) \r" - ], - [ - 0.000228, - "Receiving objects: 100% (453/453), 84.90 KiB | 0 bytes/s, done." - ], - [ - 0.000184, - "\r\n" - ], - [ - 0.000757, - "Resolving deltas: 0% (0/283) \r" - ], - [ - 0.000455, - "Resolving deltas: 1% (3/283) \r" - ], - [ - 0.000296, - "Resolving deltas: 2% (6/283) \r" - ], - [ - 0.000224, - "Resolving deltas: 3% (9/283) \r" - ], - [ - 0.000250, - "Resolving deltas: 4% (13/283) \r" - ], - [ - 0.000461, - "Resolving deltas: 8% (25/283) \r" - ], - [ - 0.000431, - "Resolving deltas: 13% (38/283) \r" - ], - [ - 0.000261, - "Resolving deltas: 14% (40/283) \r" - ], - [ - 0.000277, - "Resolving deltas: 16% (47/283) \r" - ], - [ - 0.000180, - "Resolving deltas: 17% (49/283) \r" - ], - [ - 0.001385, - "Resolving deltas: 39% (113/283) \r" - ], - [ - 0.000513, - "Resolving deltas: 44% (126/283) \r" - ], - [ - 0.000256, - "Resolving deltas: 45% (129/283) \r" - ], - [ - 0.000239, - "Resolving deltas: 48% (137/283) \r" - ], - [ - 0.000289, - "Resolving deltas: 50% (142/283) \r" - ], - [ - 0.000468, - "Resolving deltas: 53% (150/283) \r" - ], - [ - 0.000399, - "Resolving deltas: 55% (158/283) \r" - ], - [ - 0.000375, - "Resolving deltas: 60% (172/283) \r" - ], - [ - 0.000255, - "Resolving deltas: 62% (177/283) \r" - ], - [ - 0.000274, - "Resolving deltas: 63% (181/283) \r" - ], - [ - 0.000121, - "Resolving deltas: 64% (183/283) \r" - ], - [ - 0.000502, - "Resolving deltas: 69% (197/283) \r" - ], - [ - 0.000213, - "Resolving deltas: 74% (210/283) \r" - ], - [ - 0.000118, - "Resolving deltas: 77% (218/283) \r" - ], - [ - 0.000148, - "Resolving deltas: 78% (222/283) \r" - ], - [ - 0.000115, - "Resolving deltas: 79% (224/283) \r" - ], - [ - 0.000197, - "Resolving deltas: 81% (230/283) \r" - ], - [ - 0.000374, - "Resolving deltas: 88% (251/283) \r" - ], - [ - 0.000228, - "Resolving deltas: 89% (254/283) \r" - ], - [ - 0.000263, - "Resolving deltas: 90% (256/283) \r" - ], - [ - 0.000109, - "Resolving deltas: 91% (260/283) \r" - ], - [ - 0.000072, - "Resolving deltas: 92% (263/283) \r" - ], - [ - 0.000075, - "Resolving deltas: 93% (264/283) \r" - ], - [ - 0.001321, - "Resolving deltas: 100% (283/283) \r" - ], - [ - 0.001063, - "Resolving deltas: 100% (283/283), done.\r\n" - ], - [ - 0.037118, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "O" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "S" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "I" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\" - ], - [ - 0.001039, - "[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "pip install -e tuning-box" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "\u001b[33mYou are using pip version 7.1.0, however version 8.1.1 is available.\r\nYou should consider upgrading via the 'pip install --upgrade pip' command.\u001b[0m\r\n" - ], - [ - 0.011382, - "Obtaining file:///root/tb_show/tuning-box\r\n" - ], - [ - 0.5, - "Requirement already satisfied (use --upgrade to upgrade): pbr>=1.6 in /usr/lib/python2.7/site-packages (from tuning-box==0.0.1.dev72)\r\n" - ], - [ - 0.000253, - "Requirement already satisfied (use --upgrade to upgrade): flask in /usr/lib/python2.7/site-packages (from tuning-box==0.0.1.dev72)\r\n" - ], - [ - 0.033701, - "Collecting flask-sqlalchemy (from tuning-box==0.0.1.dev72)\r\n" - ], - [ - 0.264709, - " Downloading Flask-SQLAlchemy-2.1.tar.gz (95kB)\r\n" - ], - [ - 0.001081, - "\u001b[?25l\r\u001b[K 4% |\u2588\u258d | 4.1kB 5.4MB/s eta 0:00:01" - ], - [ - 0.000729, - "\r\u001b[K 8% |\u2588\u2588\u258a | 8.2kB 6.7MB/s eta 0:00:01" - ], - [ - 0.000779, - "\r\u001b[K 12% |\u2588\u2588\u2588\u2588 | 12kB 5.2MB/s eta 0:00:01" - ], - [ - 0.001178, - "\r\u001b[K 17% |\u2588\u2588\u2588\u2588\u2588\u258c | 16kB 4.6MB/s eta 0:00:01" - ], - [ - 0.000724, - "\r\u001b[K 21% |\u2588\u2588\u2588\u2588\u2588\u2588\u2589 | 20kB 5.2MB/s eta 0:00:01" - ], - [ - 0.000681, - "\r\u001b[K 25% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258f | 24kB 5.3MB/s eta 0:00:01" - ], - [ - 0.000733, - "\r\u001b[K 29% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258b | 28kB 5.0MB/s eta 0:00:01" - ], - [ - 0.015260, - "\r\u001b[K 34% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 | 32kB 1.6MB/s eta 0:00:01" - ], - [ - 0.000621, - "\r\u001b[K 38% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258e | 36kB 1.7MB/s eta 0:00:01" - ], - [ - 0.000571, - "\r\u001b[K 42% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258b | 40kB 1.8MB/s eta 0:00:01" - ], - [ - 0.000383, - "\r\u001b[K 46% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 | 45kB 1.9MB/s eta 0:00:01" - ], - [ - 0.000846, - "\r\u001b[K 51% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258d | 49kB 1.8MB/s eta 0:00:01" - ], - [ - 0.000393, - "\r\u001b[K 55% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258a | 53kB 1.9MB/s eta 0:00:01" - ], - [ - 0.000367, - "\r\u001b[K 59% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258f | 57kB 2.0MB/s eta 0:00:01" - ], - [ - 0.000377, - "\r\u001b[K 64% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258c | 61kB 2.0MB/s eta 0:00:01" - ], - [ - 0.000832, - "\r\u001b[K 68% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2589 | 65kB 2.0MB/s eta 0:00:01" - ], - [ - 0.000382, - "\r\u001b[K 72% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258f | 69kB 2.0MB/s eta 0:00:01" - ], - [ - 0.000352, - "\r\u001b[K 76% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258b | 73kB 7.9MB/s eta 0:00:01" - ], - [ - 0.000385, - "\r\u001b[K 81% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 | 77kB 8.3MB/s eta 0:00:01" - ], - [ - 0.000784, - "\r\u001b[K 85% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258e | 81kB 7.9MB/s eta 0:00:01" - ], - [ - 0.000382, - "\r\u001b[K 89% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258a | 86kB 8.0MB/s eta 0:00:01" - ], - [ - 0.000350, - "\r\u001b[K 93% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 | 90kB 8.9MB/s eta 0:00:01" - ], - [ - 0.000411, - "\r\u001b[K 98% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258d| 94kB 8.9MB/s eta 0:00:01" - ], - [ - 0.022459, - "\r\u001b[K 100% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 98kB 1.5MB/s " - ], - [ - 0.000039, - "\r\n" - ], - [ - 0.041536, - "\u001b[?25h" - ], - [ - 0.448818, - "Collecting flask-restful (from tuning-box==0.0.1.dev72)" - ], - [ - 0.000195, - "\r\n" - ], - [ - 0.110265, - " Downloading Flask_RESTful-0.3.5-py2.py3-none-any.whl" - ], - [ - 0.000280, - "\r\n" - ], - [ - 0.077370, - "Requirement already satisfied (use --upgrade to upgrade): alembic in /usr/lib/python2.7/site-packages (from tuning-box==0.0.1.dev72)" - ], - [ - 0.000238, - "\r\n" - ], - [ - 0.002407, - "Requirement already satisfied (use --upgrade to upgrade): Werkzeug>=0.7 in /usr/lib/python2.7/site-packages (from flask->tuning-box==0.0.1.dev72)" - ], - [ - 0.000219, - "\r\n" - ], - [ - 0.000690, - "Requirement already satisfied (use --upgrade to upgrade): Jinja2>=2.4 in /usr/lib/python2.7/site-packages (from flask->tuning-box==0.0.1.dev72)" - ], - [ - 0.000206, - "\r\n" - ], - [ - 0.001729, - "Requirement already satisfied (use --upgrade to upgrade): itsdangerous>=0.21 in /usr/lib/python2.7/site-packages (from flask->tuning-box==0.0.1.dev72)" - ], - [ - 0.000175, - "\r\n" - ], - [ - 0.000533, - "Requirement already satisfied (use --upgrade to upgrade): SQLAlchemy>=0.7 in /usr/lib64/python2.7/site-packages (from flask-sqlalchemy->tuning-box==0.0.1.dev72)" - ], - [ - 0.000177, - "\r\n" - ], - [ - 0.038427, - "Collecting aniso8601>=0.82 (from flask-restful->tuning-box==0.0.1.dev72)" - ], - [ - 0.000139, - "\r\n" - ], - [ - 0.091079, - " Downloading aniso8601-1.1.0.tar.gz (49kB)\r\n" - ], - [ - 0.000775, - "\u001b[?25l\r\u001b[K 8% |\u2588\u2588\u258b | 4.1kB 7.9MB/s eta 0:00:01" - ], - [ - 0.000542, - "\r\u001b[K 16% |\u2588\u2588\u2588\u2588\u2588\u258e | 8.2kB 9.2MB/s eta 0:00:01" - ], - [ - 0.000597, - "\r\u001b[K 24% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 | 12kB 8.3MB/s eta 0:00:01" - ], - [ - 0.001124, - "\r\u001b[K 33% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258b | 16kB 5.7MB/s eta 0:00:01" - ], - [ - 0.000572, - "\r\u001b[K 41% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258e | 20kB 5.9MB/s eta 0:00:01" - ], - [ - 0.000703, - "\r\u001b[K 49% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 | 24kB 5.9MB/s eta 0:00:01" - ], - [ - 0.000595, - "\r\u001b[K 58% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258b | 28kB 6.4MB/s eta 0:00:01" - ], - [ - 0.000962, - "\r\u001b[K 66% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258f | 32kB 5.7MB/s eta 0:00:01" - ], - [ - 0.000568, - "\r\u001b[K 74% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2589 | 36kB 5.9MB/s eta 0:00:01" - ], - [ - 0.000447, - "\r\u001b[K 82% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258c | 40kB 6.3MB/s eta 0:00:01" - ], - [ - 0.000529, - "\r\u001b[K 91% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258f | 45kB 6.1MB/s eta 0:00:01" - ], - [ - 0.000551, - "\r\u001b[K 99% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2589| 49kB 5.9MB/s eta 0:00:01" - ], - [ - 0.007985, - "\r\u001b[K 100% |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 53kB 2.8MB/s " - ], - [ - 0.000198, - "\r\n" - ], - [ - 0.030745, - "\u001b[?25h" - ], - [ - 0.322165, - "Requirement already satisfied (use --upgrade to upgrade): pytz in /usr/lib/python2.7/site-packages (from flask-restful->tuning-box==0.0.1.dev72)" - ], - [ - 0.000045, - "\r\n" - ], - [ - 0.000759, - "Requirement already satisfied (use --upgrade to upgrade): six>=1.3.0 in /usr/lib/python2.7/site-packages (from flask-restful->tuning-box==0.0.1.dev72)" - ], - [ - 0.000022, - "\r\n" - ], - [ - 0.000525, - "Requirement already satisfied (use --upgrade to upgrade): Mako in /usr/lib/python2.7/site-packages (from alembic->tuning-box==0.0.1.dev72)" - ], - [ - 0.000082, - "\r\n" - ], - [ - 0.001232, - "Requirement already satisfied (use --upgrade to upgrade): python-editor>=0.3 in /usr/lib/python2.7/site-packages (from alembic->tuning-box==0.0.1.dev72)" - ], - [ - 0.000021, - "\r\n" - ], - [ - 0.000689, - "Requirement already satisfied (use --upgrade to upgrade): MarkupSafe in /usr/lib64/python2.7/site-packages (from Jinja2>=2.4->flask->tuning-box==0.0.1.dev72)" - ], - [ - 0.000023, - "\r\n" - ], - [ - 0.000698, - "Requirement already satisfied (use --upgrade to upgrade): python-dateutil in /usr/lib/python2.7/site-packages (from aniso8601>=0.82->flask-restful->tuning-box==0.0.1.dev72)" - ], - [ - 0.000031, - "\r\n" - ], - [ - 0.001093, - "Installing collected packages: flask-sqlalchemy, aniso8601, flask-restful, tuning-box" - ], - [ - 0.000028, - "\r\n" - ], - [ - 0.000684, - " Running setup.py install for flask-sqlalchemy" - ], - [ - 0.000029, - "\r\n" - ], - [ - 0.358927, - " Running setup.py install for aniso8601\r\n" - ], - [ - 0.449105, - " Running setup.py develop for tuning-box\r\n" - ], - [ - 0.5, - "Successfully installed aniso8601-1.1.0 flask-restful-0.3.5 flask-sqlalchemy-2.1 tuning-box\r\n" - ], - [ - 0.026350, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "V" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "D" - ], - [ - 0.05, - "B" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "T" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "B" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "x" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "sudo -u postgres psql -c '\\dt' nailgun | grep tuning_box" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.040846, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "R" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "nailgun_syncdb" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.483231, - "2016-03-25 19:44:43.861 DEBUG [7f89e5062740] (settings) Looking for settings.yaml package config using old style __file__\r\n" - ], - [ - 0.000163, - "2016-03-25 19:44:43.861 DEBUG [7f89e5062740] (settings) Trying to read config file /usr/lib/python2.7/site-packages/nailgun/settings.yaml\r\n" - ], - [ - 0.240477, - "2016-03-25 19:44:44.102 DEBUG [7f89e5062740] (settings) Trying to read config file /etc/nailgun/settings.yaml\r\n" - ], - [ - 0.413603, - "INFO [alembic.runtime.migration] Context impl PostgresqlImpl.\r\n" - ], - [ - 0.000011, - "INFO [alembic.runtime.migration] Will assume transactional DDL.\r\n" - ], - [ - 0.291610, - "/usr/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/api.py:173: SAWarning: Unmanaged access of declarative attribute __tablename__ from non-mapped class ModelMixin" - ], - [ - 0.000700, - "\r\n" - ], - [ - 0.000344, - " (desc.fget.__name__, cls.__name__))" - ], - [ - 0.000357, - "\r\n" - ], - [ - 0.5, - "INFO [alembic.runtime.migration] Context impl PostgresqlImpl." - ], - [ - 0.000083, - "\r\n" - ], - [ - 0.000227, - "INFO [alembic.runtime.migration] Will assume transactional DDL." - ], - [ - 0.000031, - "\r\n" - ], - [ - 0.028153, - "INFO [alembic.runtime.migration] Running upgrade -> f16eb4eff7c, Initial revision" - ], - [ - 0.000026, - "\r\n" - ], - [ - 0.184723, - "INFO [alembic.runtime.migration] Running upgrade f16eb4eff7c -> 3b2a0f134e45, Switch to new API" - ], - [ - 0.000041, - "\r\n" - ], - [ - 0.014131, - "INFO [alembic.runtime.migration] Running upgrade 3b2a0f134e45 -> 967a44dd16d5, Add server_default to resource_values.values" - ], - [ - 0.000030, - "\r\n" - ], - [ - 0.002713, - "INFO [alembic.runtime.migration] Running upgrade 967a44dd16d5 -> ad192a40fd68, Add overrides to resource_values" - ], - [ - 0.000042, - "\r\n" - ], - [ - 0.019321, - "INFO [alembic.runtime.migration] Running upgrade ad192a40fd68 -> d054eefc4c5b, Add unique constraint on component.name" - ], - [ - 0.000021, - "\r\n" - ], - [ - 0.035633, - "INFO [alembic.runtime.migration] Context impl PostgresqlImpl." - ], - [ - 0.000031, - "\r\n" - ], - [ - 0.000186, - "INFO [alembic.runtime.migration] Will assume transactional DDL." - ], - [ - 0.000036, - "\r\n" - ], - [ - 0.026289, - "INFO [alembic.runtime.migration] Context impl PostgresqlImpl." - ], - [ - 0.000030, - "\r\n" - ], - [ - 0.000136, - "INFO [alembic.runtime.migration] Will assume transactional DDL." - ], - [ - 0.000016, - "\r\n" - ], - [ - 0.092084, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "on" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "to" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "D" - ], - [ - 0.05, - "B" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "sudo -u postgres psql -c '\\dt' nailgun | grep tuning_box" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.036766, - " public | \u001b[01;31m\u001b[Ktuning_box\u001b[m\u001b[K_alembic_version | table | nailgun\r\n public | \u001b[01;31m\u001b[Ktuning_box\u001b[m\u001b[K_component | table | nailgun\r\n public | \u001b[01;31m\u001b[Ktuning_box\u001b[m\u001b[K_environment | table | nailgun\r\n public | \u001b[01;31m\u001b[Ktuning_box\u001b[m\u001b[K_environment_components | table | nailgun\r\n public | \u001b[01;31m\u001b[Ktuning_box\u001b[m\u001b[K_environment_hierarchy_level | table | nailgun\r\n public | \u001b[01;31m\u001b[Ktuning_box\u001b[m\u001b[K_environment_hierarchy_level_value | table | nailgun\r\n public | \u001b[01;31m\u001b[Ktuning_box\u001b[m\u001b[K_resource_definition | table | nailgun\r\n public | \u001b[01;31m\u001b[Ktuning_box\u001b[m\u001b[K_resource_values | table | nailgun\r\n" - ], - [ - 0.002426, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "T" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "bl" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "s " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "AP" - ], - [ - 0.05, - "I" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "x" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "service nailgun restart" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.034654, - "Redirecting to /bin/systemctl restart nailgun.service\r\n" - ], - [ - 0.5, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "T" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "AP" - ], - [ - 0.05, - "I" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "we" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "K" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "token_id=$(openstack token issue -c id -f value)" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "components" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.238953, - "[]\r\n" - ], - [ - 0.000629, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "[]\r\n" - ], - [ - 0.000551, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "x" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "." - ], - [ - 0.05, - " " - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "om" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "c" - ], - [ - 0.114493, - "a" - ], - [ - 0.359727, - "t" - ], - [ - 0.152655, - " " - ], - [ - 0.5, - "c" - ], - [ - 0.223539, - "o" - ], - [ - 0.002713, - "m" - ], - [ - 0.112956, - "p" - ], - [ - 0.133245, - "o" - ], - [ - 0.240182, - "nent.json " - ], - [ - 0.5, - "\r\n" - ], - [ - 0.002533, - "{" - ], - [ - 0.000470, - "\r\n" - ], - [ - 0.000383, - " \"name\": \"comp1\"," - ], - [ - 0.000445, - "\r\n" - ], - [ - 0.000380, - " \"resource_definitions\": [" - ], - [ - 0.000363, - "\r\n" - ], - [ - 0.000336, - " {" - ], - [ - 0.000374, - "\r\n" - ], - [ - 0.000312, - " \"name\": \"resource1\"," - ], - [ - 0.000361, - "\r\n" - ], - [ - 0.000125, - " \"content\": {}" - ], - [ - 0.000121, - "\r\n" - ], - [ - 0.000125, - " }," - ], - [ - 0.000114, - "\r\n" - ], - [ - 0.000109, - " {" - ], - [ - 0.000122, - "\r\n" - ], - [ - 0.000102, - " \"name\": \"slashed/resource\"," - ], - [ - 0.000144, - "\r\n" - ], - [ - 0.000146, - " \"content\": {}" - ], - [ - 0.000127, - "\r\n" - ], - [ - 0.000110, - " }" - ], - [ - 0.000112, - "\r\n" - ], - [ - 0.000108, - " ]" - ], - [ - 0.000134, - "\r\n" - ], - [ - 0.000119, - "}" - ], - [ - 0.000110, - "\r\n" - ], - [ - 0.000548, - "\u001bkroot@fuel:~/tb_show\u001b\\" - ], - [ - 0.000886, - "[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "ri" - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "components -H \"Content-type: application/json\" -d @component.json" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.241207, - "{\"resource_definitions\": [{\"content\": {}, \"component_id\": 1, \"id\": 1, \"name\": \"resource1\"}, {\"content\": {}, \"component_id\": 1, \"id\": 2, \"name\": \"slashed/resource\"}], \"id\": 1, \"name\": \"comp1\"}\r\n" - ], - [ - 0.000627, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "c" - ], - [ - 0.112812, - "a" - ], - [ - 0.405791, - "t " - ], - [ - 0.166045, - "e" - ], - [ - 0.129730, - "n" - ], - [ - 0.473846, - "v" - ], - [ - 0.112277, - "i" - ], - [ - 0.5, - "ronment.json " - ], - [ - 0.5, - "\r\n" - ], - [ - 0.001771, - "{" - ], - [ - 0.000040, - "\r\n" - ], - [ - 0.000031, - " \"name\": \"env1\"," - ], - [ - 0.000018, - "\r\n" - ], - [ - 0.000023, - " \"components\": [\"comp1\"]," - ], - [ - 0.000016, - "\r\n" - ], - [ - 0.000016, - " \"hierarchy_levels\": [\"nodes\"]" - ], - [ - 0.000015, - "\r\n" - ], - [ - 0.000015, - "}" - ], - [ - 0.000016, - "\r\n" - ], - [ - 0.000582, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments -H \"Content-type: application/json\" -d @environment.json" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.087928, - "{\"hierarchy_levels\": [\"nodes\"], \"id\": 1, \"components\": [1]}\r\n" - ], - [ - 0.000245, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "O" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "ou" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "d " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "ou" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "ce" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/resources/resource1/values" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.023991, - "" - ], - [ - 0.000171, - "\r\n" - ], - [ - 0.000086, - "Redirecting..." - ], - [ - 0.000123, - "\r\n" - ], - [ - 0.000055, - "

Redirecting...

" - ], - [ - 0.000053, - "\r\n" - ], - [ - 0.000073, - "

You should be redirected automatically to target URL: /api/config/environments/1/resources/1/values. If not click the link." - ], - [ - 0.001258, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "T" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "3" - ], - [ - 0.05, - "0" - ], - [ - 0.05, - "8" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "U" - ], - [ - 0.05, - "R" - ], - [ - 0.05, - "L" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "C" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "th" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "wi" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "am" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/resources/slashed/resource" - ], - [ - 0.000203, - "/" - ], - [ - 0.000448, - "values" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.032791, - "\r\nRedirecting...\r\n

Redirecting...

\r\n" - ], - [ - 0.000059, - "

You should be redirected automatically to target URL: /api/config/environments/1/resources/2/values. If not click the link." - ], - [ - 0.001307, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "I" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "j" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "in" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "/" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "/" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/resources/1/values" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.036335, - "{}" - ], - [ - 0.000137, - "\r\n" - ], - [ - 0.001357, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/nodes/node-1.domain.tld/resources/1/values" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.073193, - "{}\r\n" - ], - [ - 0.000438, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "th" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "gl" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/resources/1/values -H \"Content-type: application/json\" -X PUT -d '{\"global_key\": \"global_value\"}'" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.027539, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/nodes/node-1.domain.tld/resources/1/values -H \"Content-type: application/json\" -X PUT -d '{\"node_key\": \"node_value\"}'" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.047929, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "ve" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "ed" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - ":" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/resources/1/values" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.079455, - "{\"global_key\": \"global_value\"}\r\n" - ], - [ - 0.000522, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/resources/1/values?effective" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.032657, - "{\"global_key\": \"global_value\"}" - ], - [ - 0.000419, - "\r\n" - ], - [ - 0.001728, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "B" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "re" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "th" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "om" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - ":" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/nodes/node-1.domain.tld/resources/1/values" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.083752, - "{\"node_key\": \"node_value\"}\r\n" - ], - [ - 0.000787, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/nodes/node-1.domain.tld/" - ], - [ - 0.000028, - "r" - ], - [ - 0.000146, - "es" - ], - [ - 0.000058, - "o" - ], - [ - 0.000097, - "u" - ], - [ - 0.000091, - "r" - ], - [ - 0.000091, - "c" - ], - [ - 0.000091, - "e" - ], - [ - 0.000093, - "s" - ], - [ - 0.000102, - "/" - ], - [ - 0.000119, - "1" - ], - [ - 0.000094, - "/" - ], - [ - 0.000104, - "v" - ], - [ - 0.000096, - "a" - ], - [ - 0.000104, - "l" - ], - [ - 0.000095, - "u" - ], - [ - 0.000095, - "e" - ], - [ - 0.000127, - "s" - ], - [ - 0.000106, - "?" - ], - [ - 0.000126, - "e" - ], - [ - 0.000100, - "f" - ], - [ - 0.000098, - "f" - ], - [ - 0.000124, - "e" - ], - [ - 0.000059, - "c" - ], - [ - 0.000046, - "t" - ], - [ - 0.000046, - "i" - ], - [ - 0.000046, - "v" - ], - [ - 0.000047, - "e" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.038674, - "{\"node_key\": \"node_value\", \"global_key\": \"global_value\"}" - ], - [ - 0.000068, - "\r\n" - ], - [ - 0.001698, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "we" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "-" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "-" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "ci" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "in" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "F" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "m " - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "f " - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "de" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "hi" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "de" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/resources/1/overrides -H \"Content-type: application/json\" -X PUT -d '{\"global_key\": \"global_override\"}'" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.035845, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/nodes/node-1.domain.tld/resources/1/values?effect" - ], - [ - 0.000168, - "i" - ], - [ - 0.000081, - "v" - ], - [ - 0.000073, - "e" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.064415, - "{\"node_key\": \"node_value\", \"global_key\": \"global_override\"}\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "G" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "de" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "_" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "x" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s " - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/resources/1/values -H \"Content-type: application/json\" -X PUT -d '{\"global_key\": \"global_value_new\"}'" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.042649, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/nodes/node-1.domain.tld/resources/1/values?effective" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.041587, - "{\"node_key\": \"node_value\", \"global_key\": \"global_override\"}\r\n" - ], - [ - 0.001106, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "A" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "di" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "-" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "ev" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "de" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/nodes/node-1.domain.tld/resources/1/overrides -H \"Content-type: application/json\" -X PUT -d '{\"global_key\": \"node_overrid" - ], - [ - 0.000030, - "e" - ], - [ - 0.000296, - "\"}'" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.048814, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/nodes/node-1.domain.tld/resources/1/values?effective" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.043427, - "{\"node_key\": \"node_value\", \"global_key\": \"node_override\"}\r\n" - ], - [ - 0.001478, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/nodes/node-2.domain.tld/resources/1/values?effective" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.056189, - "{\"global_key\": \"global_override\"}\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "ha" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "-" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "A" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "-" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "de" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - ":" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/resources/1/values?effective" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.068332, - "{\"global_key\": \"global_override\"}\r\n" - ], - [ - 0.000757, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/" - ], - [ - 0.5, - "environments/1/nodes/node-1.dom" - ], - [ - 0.000067, - "a" - ], - [ - 0.000092, - "i" - ], - [ - 0.000082, - "n" - ], - [ - 0.000080, - "." - ], - [ - 0.000080, - "t" - ], - [ - 0.000080, - "l" - ], - [ - 0.000081, - "d" - ], - [ - 0.000081, - "/" - ], - [ - 0.000082, - "r" - ], - [ - 0.000090, - "e" - ], - [ - 0.000082, - "s" - ], - [ - 0.000105, - "o" - ], - [ - 0.000093, - "u" - ], - [ - 0.000092, - "r" - ], - [ - 0.000090, - "c" - ], - [ - 0.000085, - "e" - ], - [ - 0.000085, - "s" - ], - [ - 0.000085, - "/" - ], - [ - 0.000092, - "1" - ], - [ - 0.000086, - "/" - ], - [ - 0.000088, - "v" - ], - [ - 0.000088, - "a" - ], - [ - 0.000140, - "l" - ], - [ - 0.000091, - "u" - ], - [ - 0.000088, - "e" - ], - [ - 0.000097, - "s" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.038866, - "{\"node_key\": \"node_value\"}" - ], - [ - 0.000037, - "\r\n" - ], - [ - 0.001592, - "\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "T" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "A" - ], - [ - 0.05, - "P" - ], - [ - 0.05, - "I" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "C" - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "I" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "x" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "!" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~/tb_show\u001b\\[root@fuel tb_show]# " - ] - ] -} diff --git a/doc/source/records/02-api-update/script b/doc/source/records/02-api-update/script deleted file mode 100644 index 7ad894b..0000000 --- a/doc/source/records/02-api-update/script +++ /dev/null @@ -1,36 +0,0 @@ -yum install git python-pip python-alembic python-flask -git clone https://git.openstack.org/openstack/tuning-box.git -pip install -e tuning-box -sudo -u postgres psql -c '\dt' nailgun | grep tuning_box -nailgun_syncdb -sudo -u postgres psql -c '\dt' nailgun | grep tuning_box -service nailgun restart -token_id=$(openstack token issue -c id -f value) - -curl -H "X-Auth-Token: $token_id" http://10.20.0.2:8000/api/config/ -- components -- environments -- components -H "Content-type: application/json" -d @component.json -- environments -H "Content-type: application/json" -d @environment.json -- environments/1/resources/resource1/values -- environments/1/resources/slashed/resource/values -- environments/1/resources/1/values -- environments/1/nodes/node-1.domain.tld/resources/1/values -- environments/1/resources/1/values -H "Content-type: application/json" -X PUT -d '{"global_key": "global_value"}' -- environments/1/nodes/node-1.domain.tld/resources/1/values -H "Content-type: application/json" -X PUT -d '{"node_key": "node_value"}' -- environments/1/resources/1/values -- environments/1/resources/1/values?effective -- environments/1/nodes/node-1.domain.tld/resources/1/values -- environments/1/nodes/node-1.domain.tld/resources/1/values?effective -- environments/1/resources/1/overrides -H "Content-type: application/json" -X PUT -d '{"global_key": "global_override"}' -- environments/1/nodes/node-1.domain.tld/resources/1/values?effective -- environments/1/resources/1/values -H "Content-type: application/json" -X PUT -d '{"global_key": "global_value_new"}' -- environments/1/nodes/node-1.domain.tld/resources/1/values?effective -- environments/1/nodes/node-1.domain.tld/resources/1/overrides -H "Content-type: application/json" -X PUT -d '{"global_key": "node_override"}' -- environments/1/nodes/node-1.domain.tld/resources/1/values?effective -- environments/1/nodes/node-2.domain.tld/resources/1/values?effective -- environments/1/resources/1/values -- environments/1/resources/1/values?effective -- environments/1/nodes/node-1.domain.tld/resources/1/values - -curl -H "X-Auth-Token: $token_id" http://10.20.0.2:8000/api/config/ diff --git a/doc/source/records/03-cli/component.json b/doc/source/records/03-cli/component.json deleted file mode 100644 index aeeac0a..0000000 --- a/doc/source/records/03-cli/component.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "comp1", - "resource_definitions": [ - { - "name": "resource1", - "content": {} - }, - { - "name": "slashed/resource", - "content": {} - } - ] -} diff --git a/doc/source/records/03-cli/environment.json b/doc/source/records/03-cli/environment.json deleted file mode 100644 index cc145b6..0000000 --- a/doc/source/records/03-cli/environment.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "components": ["comp1"], - "hierarchy_levels": ["nodes"] -} diff --git a/doc/source/records/03-cli/record.json b/doc/source/records/03-cli/record.json deleted file mode 100644 index 175ad88..0000000 --- a/doc/source/records/03-cli/record.json +++ /dev/null @@ -1,9534 +0,0 @@ -{ - "version": 1, - "width": 150, - "height": 41, - "duration": 146.977380, - "command": "/bin/bash", - "title": "Tuning box CLI update", - "env": { - "TERM": "screen", - "SHELL": "/bin/bash" - }, - "stdout": [ - [ - 0.077519, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "H" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "." - ], - [ - 0.05, - " " - ], - [ - 0.05, - "T" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "C" - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "I" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "x" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "W" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "F" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.407167, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "F" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "rpm --import http://mirror.fuel-infra.org/mos-repos/centos/mos9.0-centos7/os/RPM-GPG-KEY-mos9.0" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.323808, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "yum-config-manager --add-repo http://mirror.fuel-infra.org/mos-repos/centos/mos9.0-centos7/os/x86_64/" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.183424, - "Loaded plugins: fastestmirror, priorities" - ], - [ - 0.000026, - "\r\n" - ], - [ - 0.014439, - "adding repo from: http://mirror.fuel-infra.org/mos-repos/centos/mos9.0-centos7/os/x86_64/" - ], - [ - 0.000016, - "\r\n" - ], - [ - 0.006770, - "\r\n" - ], - [ - 0.000023, - "[mirror.fuel-infra.org_mos-repos_centos_mos9.0-centos7_os_x86_64_]" - ], - [ - 0.000010, - "\r\n" - ], - [ - 0.000010, - "name=added from: http://mirror.fuel-infra.org/mos-repos/centos/mos9.0-centos7/os/x86_64/" - ], - [ - 0.000009, - "\r\n" - ], - [ - 0.000012, - "baseurl=http://mirror.fuel-infra.org/mos-repos/centos/mos9.0-centos7/os/x86_64/" - ], - [ - 0.000008, - "\r\n" - ], - [ - 0.000013, - "enabled=1" - ], - [ - 0.000009, - "\r\n" - ], - [ - 0.000009, - "\r\n" - ], - [ - 0.000020, - "\r\n" - ], - [ - 0.010234, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "S" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "T" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "B" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "x" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "q" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "T" - ], - [ - 0.05, - "B" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "yum-config-manager --add-repo http://packages.fuel-infra.org/review/FUEL-304811//repositories/centos/master-" - ], - [ - 0.000027, - "c" - ], - [ - 0.000049, - "e" - ], - [ - 0.000307, - "nto" - ], - [ - 0.000618, - "s" - ], - [ - 0.000199, - "7" - ], - [ - 0.000164, - "/" - ], - [ - 0.000063, - "o" - ], - [ - 0.000079, - "s" - ], - [ - 0.000114, - "/" - ], - [ - 0.000083, - "x" - ], - [ - 0.000264, - "86" - ], - [ - 0.001314, - "_" - ], - [ - 0.000224, - "6" - ], - [ - 0.000090, - "4" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.209536, - "Loaded plugins: fastestmirror, priorities\r\n" - ], - [ - 0.018735, - "adding repo from: http://packages.fuel-infra.org/review/FUEL-304811//repositories/centos/master-centos7/os/x86_64\r\n" - ], - [ - 0.007936, - "\r\n[packages.fuel-infra.org_review_FUEL-304811_repositories_centos_master-centos7_os_x86_64]\r\nname=added from: http://packages.fuel-infra.org/review/FUEL-304811//repositories/centos/master-centos7/os/x86_64\r\nbaseurl=http://packages.fuel-infra.org/review/FUEL-304811//repositories/centos/master-centos7/os/x86_64\r\nenabled=1\r\n\r\n\r\n" - ], - [ - 0.011297, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "T" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "B" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "x" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "yum install -y tuning-box" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.180042, - "Loaded plugins: fastestmirror, priorities\r\n" - ], - [ - 0.396632, - "\rmirror.fuel-infra.org_mos-repos_centos_mos9.0-centos7_os_x86_64_ | 3.6 kB 00:00:00 \r\n" - ], - [ - 0.5, - "\rpackages.fuel-infra.org_review_FUEL-304811_repositories_centos_master-centos7_os_x86_64 | 3.6 kB 00:00:00 " - ], - [ - 0.000397, - "\r\n" - ], - [ - 0.178028, - "\r(1/4): mirror.fuel-infra.org_mos-repos_centos_mos9.0-centos7_os_x86_64_/primary_db | 626 kB 00:00:00 \r\n" - ], - [ - 0.283072, - "\r(3/4): packages.fuel-infra.org_review_FUEL-304811_repositori 58% [============================= ] 0.0 B/s | 626 kB --:--:-- ETA \r" - ], - [ - 0.015116, - "\r(2/4): packages.fuel-infra.org_review_FUEL-304811_repositories_centos_master-centos7_os_x86_64/primary_db | 1.9 kB 00:00:00 \r\n" - ], - [ - 0.323632, - "\r(4/4): packages.fuel-infra.org_review_FUEL-304811_repositori 63% [===============================- ] 71 kB/s | 683 kB 00:00:05 ETA \r" - ], - [ - 0.336317, - "\r(4/4): packages.fuel-infra.org_review_FUEL-304811_repositori 83% [=========================================- ] 109 kB/s | 892 kB 00:00:01 ETA \r" - ], - [ - 0.014760, - "\r(3/4): packages.fuel-infra.org_review_FUEL-304811_repositories_centos_master-centos7_os_x86_64/group_gz | 220 kB 00:00:01 \r\n" - ], - [ - 0.035540, - "\r(4/4): mirror.fuel-infra.org_mos-repos_centos_mos9.0-centos7_os_x86_64_/group_gz | 220 kB 00:00:01 \r\n" - ], - [ - 0.028580, - "Loading mirror speeds from cached hostfile" - ], - [ - 0.000062, - "\r\n" - ], - [ - 0.192393, - " * mos9.0-security: mirror.seed-cz1.fuel-infra.org\r\n * mos9.0-updates: mirror.seed-cz1.fuel-infra.org\r\n" - ], - [ - 0.424214, - "Resolving Dependencies" - ], - [ - 0.000036, - "\r\n" - ], - [ - 0.010824, - "--> Running transaction check" - ], - [ - 0.000047, - "\r\n" - ], - [ - 0.000499, - "---> Package tuning-box.noarch 0:0.0.1-1.mos85.git.4c9e4eb will be installed" - ], - [ - 0.000042, - "\r\n" - ], - [ - 0.029793, - "--> Processing Dependency: python2-flask-sqlalchemy for package: tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch" - ], - [ - 0.000051, - "\r\n" - ], - [ - 0.5, - "--> Processing Dependency: python2-flask-restful for package: tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch" - ], - [ - 0.000053, - "\r\n" - ], - [ - 0.002597, - "--> Processing Dependency: python-flask for package: tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch" - ], - [ - 0.000028, - "\r\n" - ], - [ - 0.005535, - "--> Running transaction check" - ], - [ - 0.000022, - "\r\n" - ], - [ - 0.000235, - "---> Package python-flask.noarch 1:0.10.1-8.el7~mos1 will be installed" - ], - [ - 0.000020, - "\r\n" - ], - [ - 0.001115, - "--> Processing Dependency: python-itsdangerous for package: 1:python-flask-0.10.1-8.el7~mos1.noarch" - ], - [ - 0.000022, - "\r\n" - ], - [ - 0.002421, - "--> Processing Dependency: python-werkzeug for package: 1:python-flask-0.10.1-8.el7~mos1.noarch" - ], - [ - 0.000021, - "\r\n" - ], - [ - 0.002375, - "---> Package python2-flask-restful.noarch 0:0.3.5-2.el7~mos2 will be installed" - ], - [ - 0.000022, - "\r\n" - ], - [ - 0.001482, - "--> Processing Dependency: python-aniso8601 for package: python2-flask-restful-0.3.5-2.el7~mos2.noarch" - ], - [ - 0.000021, - "\r\n" - ], - [ - 0.001794, - "---> Package python2-flask-sqlalchemy.noarch 0:2.1-2.el7~mos2 will be installed" - ], - [ - 0.000022, - "\r\n" - ], - [ - 0.001119, - "--> Running transaction check" - ], - [ - 0.000021, - "\r\n" - ], - [ - 0.000169, - "---> Package python-itsdangerous.noarch 0:0.24-7.el7~mos1 will be installed" - ], - [ - 0.000020, - "\r\n" - ], - [ - 0.000209, - "---> Package python-werkzeug.noarch 0:0.10.4-5.el7~mos1 will be installed" - ], - [ - 0.000021, - "\r\n" - ], - [ - 0.000197, - "---> Package python2-aniso8601.noarch 0:1.1.0-3.el7~mos2 will be installed" - ], - [ - 0.000020, - "\r\n" - ], - [ - 0.234182, - "--> Finished Dependency Resolution" - ], - [ - 0.000039, - "\r\n" - ], - [ - 0.059773, - "\r\n" - ], - [ - 0.000040, - "Dependencies Resolved" - ], - [ - 0.000011, - "\r\n" - ], - [ - 0.004609, - "\r\n" - ], - [ - 0.000023, - "======================================================================================================================================================" - ], - [ - 0.000010, - "\r\n" - ], - [ - 0.000010, - " Package Arch Version Repository Size" - ], - [ - 0.000009, - "\r\n" - ], - [ - 0.000010, - "======================================================================================================================================================" - ], - [ - 0.000009, - "\r\n" - ], - [ - 0.000038, - "Installing:" - ], - [ - 0.000011, - "\r\n" - ], - [ - 0.000010, - " tuning-box noarch 0.0.1-1.mos85.git.4c9e4eb packages.fuel-infra.org_review_FUEL-304811_repositories_centos_master-centos7_os_x86_64 57 k" - ], - [ - 0.000008, - "\r\n" - ], - [ - 0.000008, - "Installing for dependencies:" - ], - [ - 0.000008, - "\r\n" - ], - [ - 0.000010, - " python-flask noarch 1:0.10.1-8.el7~mos1 mirror.fuel-infra.org_mos-repos_centos_mos9.0-centos7_os_x86_64_ 204 k" - ], - [ - 0.000008, - "\r\n" - ], - [ - 0.000057, - " python-itsdangerous noarch 0.24-7.el7~mos1 mirror.fuel-infra.org_mos-repos_centos_mos9.0-centos7_os_x86_64_ 24 k" - ], - [ - 0.000011, - "\r\n" - ], - [ - 0.000010, - " python-werkzeug noarch 0.10.4-5.el7~mos1 mirror.fuel-infra.org_mo" - ], - [ - 0.000012, - "s-repos_centos_mos9.0-centos7_os_x86_64_ 423 k" - ], - [ - 0.000013, - "\r\n" - ], - [ - 0.000309, - " python2-aniso8601 noarch 1.1.0-3.el7~mos2 mirror.fuel-infra.org_mos-repos_centos_mos9.0-centos7_os_x86_64_ 26 k" - ], - [ - 0.000047, - "\r\n" - ], - [ - 0.000044, - " python2-flask-restful noarch 0.3.5-2.el7~mos2 mirror.fuel-infra.org_mos-repos_centos_mos9.0-centos7_os_x86_64_ 115 k" - ], - [ - 0.000023, - "\r\n" - ], - [ - 0.000035, - " python2-flask-sqlalchemy" - ], - [ - 0.000034, - "\r\n" - ], - [ - 0.000065, - " noarch 2.1-2.el7~mos2 mirror.fuel-infra.org_mos-repos_centos_mos9.0-centos7_os_x86_64_ 106 k" - ], - [ - 0.000036, - "\r\n" - ], - [ - 0.000034, - "\r\n" - ], - [ - 0.000026, - "Transaction Summary" - ], - [ - 0.000031, - "\r\n" - ], - [ - 0.000069, - "======================================================================================================================================================" - ], - [ - 0.000034, - "\r\n" - ], - [ - 0.000168, - "Install 1 Package (+6 Dependent packages)" - ], - [ - 0.000018, - "\r\n" - ], - [ - 0.000012, - "\r\n" - ], - [ - 0.000612, - "Total download size: 957 k" - ], - [ - 0.000021, - "\r\n" - ], - [ - 0.000125, - "Installed size: 1.1 M" - ], - [ - 0.000019, - "\r\n" - ], - [ - 0.000128, - "Downloading packages:" - ], - [ - 0.000019, - "\r\n" - ], - [ - 0.115168, - "\r(1/7): python-flask-0.10.1-8.el7~mos1.noarch.rpm | 204 kB 00:00:00 " - ], - [ - 0.000050, - "\r\n" - ], - [ - 0.046944, - "\r(2/7): python-werkzeug-0.10.4-5.el7~mos1.noarch.rpm | 423 kB 00:00:00 \r\n" - ], - [ - 0.007874, - "\r(3/7): python2-aniso8601-1.1.0-3.el7~mos2.noarch.rpm | 26 kB 00:00:00 \r\n" - ], - [ - 0.010003, - "\r(4/7): python2-flask-restful-0.3.5-2.el7~mos2.noarch.rpm | 115 kB 00:00:00 \r\n" - ], - [ - 0.011890, - "\r(5/7): python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch.rpm | 106 kB 00:00:00 " - ], - [ - 0.000027, - "\r\n" - ], - [ - 0.239810, - "\r(6/7): python-itsdangerous-0.24-7.el7~mos1.noarch.rpm 91% [=============================================- ] 0.0 B/s | 875 kB --:--:-- ETA \r" - ], - [ - 0.195183, - "\r(6/7): python-itsdangerous-0.24-7.el7~mos1.noarch.rpm | 24 kB 00:00:00 " - ], - [ - 0.000069, - "\r\n" - ], - [ - 0.302247, - "\r(7/7): tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch.rpm 98% [================================================= ] 74 kB/s | 944 kB 00:00:00 ETA \r" - ], - [ - 0.005076, - "\r(7/7): tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch.rpm | 57 kB 00:00:00 " - ], - [ - 0.000432, - "\r\n" - ], - [ - 0.027031, - "------------------------------------------------------------------------------------------------------------------------------------------------------\r\nTotal 1.0 MB/s | 957 kB 00:00:00 \r\n" - ], - [ - 0.006784, - "Running transaction check\r\n" - ], - [ - 0.008657, - "Running transaction test\r\n" - ], - [ - 0.294031, - "Transaction test succeeded" - ], - [ - 0.000045, - "\r\n" - ], - [ - 0.001768, - "Running transaction" - ], - [ - 0.000040, - "\r\n" - ], - [ - 0.190269, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [ ] 1/7" - ], - [ - 0.005350, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [############## ] 1/7" - ], - [ - 0.002207, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [################ ] 1/7" - ], - [ - 0.006929, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [################# ] 1/7" - ], - [ - 0.001639, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [################## ] 1/7" - ], - [ - 0.002148, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [########################## ] 1/7" - ], - [ - 0.001998, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [################################ ] 1/7" - ], - [ - 0.002007, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [##################################### ] 1/7" - ], - [ - 0.001568, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [###################################### ] 1/7" - ], - [ - 0.001816, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [############################################# ] 1/7" - ], - [ - 0.001816, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [################################################# ] 1/7" - ], - [ - 0.003359, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [############################################################# ] 1/7" - ], - [ - 0.002687, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [############################################################## ] 1/7" - ], - [ - 0.002167, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [############################################################### ] 1/7" - ], - [ - 0.002768, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [################################################################ ] 1/7" - ], - [ - 0.002896, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [##################################################################### ] 1/7" - ], - [ - 0.002896, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [######################################################################### ] 1/7" - ], - [ - 0.002696, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [############################################################################ ] 1/7" - ], - [ - 0.002522, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [############################################################################# ] 1/7" - ], - [ - 0.002832, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [################################################################################# ] 1/7" - ], - [ - 0.001680, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [################################################################################## ] 1/7" - ], - [ - 0.000937, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch [##################################################################################### ] 1/7" - ], - [ - 0.001803, - "\r Installing : python2-aniso8601-1.1.0-3.el7~mos2.noarch 1/7" - ], - [ - 0.000108, - " " - ], - [ - 0.000034, - "\r\n" - ], - [ - 0.160397, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [ ] 2/7" - ], - [ - 0.017816, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [# ] 2/7" - ], - [ - 0.002402, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [## ] 2/7" - ], - [ - 0.008668, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [### ] 2/7" - ], - [ - 0.003760, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [#### ] 2/7" - ], - [ - 0.002538, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [##### ] 2/7" - ], - [ - 0.006221, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [###### ] 2/7" - ], - [ - 0.010978, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [####### ] 2/7" - ], - [ - 0.001964, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [######## ] 2/7" - ], - [ - 0.003653, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [######### ] 2/7" - ], - [ - 0.006664, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [############ ] 2/7" - ], - [ - 0.002523, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [############# ] 2/7" - ], - [ - 0.004568, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [############### ] 2/7" - ], - [ - 0.003010, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [################# ] 2/7" - ], - [ - 0.002836, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [#################### ] 2/7" - ], - [ - 0.001824, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [##################### ] 2/7" - ], - [ - 0.002585, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [###################### ] 2/7" - ], - [ - 0.007300, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [####################### ] 2/7" - ], - [ - 0.008275, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [########################## ] 2/7" - ], - [ - 0.012749, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [############################# ] 2/7" - ], - [ - 0.002761, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [############################## ] 2/7" - ], - [ - 0.001974, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [############################### ] 2/7" - ], - [ - 0.002032, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [################################ ] 2/7" - ], - [ - 0.001870, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [################################# ] 2/7" - ], - [ - 0.004947, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [################################## ] 2/7" - ], - [ - 0.004086, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [#################################### ] 2/7" - ], - [ - 0.002946, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [##################################### ] 2/7" - ], - [ - 0.002862, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [###################################### ] 2/7" - ], - [ - 0.008199, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [######################################## ] 2/7" - ], - [ - 0.005530, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [########################################### ] 2/7" - ], - [ - 0.003527, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [############################################## ] 2/7" - ], - [ - 0.007416, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [############################################### ] 2/7" - ], - [ - 0.003316, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [################################################# ] 2/7" - ], - [ - 0.002114, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [################################################## ] 2/7" - ], - [ - 0.003326, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [################################################### ] 2/7" - ], - [ - 0.003267, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [##################################################### ] 2/7" - ], - [ - 0.002300, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [###################################################### ] 2/7" - ], - [ - 0.005736, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [######################################################## ] 2/7" - ], - [ - 0.004876, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [######################################################### ] 2/7" - ], - [ - 0.005424, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [############################################################ ] 2/7" - ], - [ - 0.006965, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [############################################################### ] 2/7" - ], - [ - 0.004996, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [################################################################## ] 2/7" - ], - [ - 0.005184, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [#################################################################### ] 2/7" - ], - [ - 0.007244, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [###################################################################### ] 2/7" - ], - [ - 0.008797, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [####################################################################### ] 2/7" - ], - [ - 0.009057, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [######################################################################## ] 2/7" - ], - [ - 0.003927, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [######################################################################### ] 2/7" - ], - [ - 0.005800, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [########################################################################## ] 2/7" - ], - [ - 0.007932, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [########################################################################### ] 2/7" - ], - [ - 0.005174, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [############################################################################ ] 2/7" - ], - [ - 0.007290, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [############################################################################# ] 2/7" - ], - [ - 0.005083, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [############################################################################## ] 2/7" - ], - [ - 0.003048, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [############################################################################### ] 2/7" - ], - [ - 0.002824, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [################################################################################ ] 2/7" - ], - [ - 0.009696, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [################################################################################# ] 2/7" - ], - [ - 0.005501, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [################################################################################### ] 2/7" - ], - [ - 0.002107, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [#################################################################################### ] 2/7" - ], - [ - 0.002803, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [##################################################################################### ] 2/7" - ], - [ - 0.003414, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch [###################################################################################### ] 2/7" - ], - [ - 0.001344, - "\r Installing : python-werkzeug-0.10.4-5.el7~mos1.noarch 2/7 \r\n" - ], - [ - 0.059770, - "\r Installing : python-itsdangerous-0.24-7.el7~mos1.noarch [ ] 3/7" - ], - [ - 0.006514, - "\r Installing : python-itsdangerous-0.24-7.el7~mos1.noarch [# ] 3/7" - ], - [ - 0.002476, - "\r Installing : python-itsdangerous-0.24-7.el7~mos1.noarch [########################## ] 3/7" - ], - [ - 0.002481, - "\r Installing : python-itsdangerous-0.24-7.el7~mos1.noarch [##################################################### ] 3/7" - ], - [ - 0.001675, - "\r Installing : python-itsdangerous-0.24-7.el7~mos1.noarch [################################################################################ ] 3/7" - ], - [ - 0.001733, - "\r Installing : python-itsdangerous-0.24-7.el7~mos1.noarch [################################################################################## ] 3/7" - ], - [ - 0.001090, - "\r Installing : python-itsdangerous-0.24-7.el7~mos1.noarch [#################################################################################### ] 3/7" - ], - [ - 0.001773, - "\r Installing : python-itsdangerous-0.24-7.el7~mos1.noarch 3/7" - ], - [ - 0.000047, - " " - ], - [ - 0.000013, - "\r\n" - ], - [ - 0.064540, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [ ] 4/7" - ], - [ - 0.011572, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [###### ] 4/7" - ], - [ - 0.003265, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [########### ] 4/7" - ], - [ - 0.001724, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [################ ] 4/7" - ], - [ - 0.001222, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [################# ] 4/7" - ], - [ - 0.001430, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [################### ] 4/7" - ], - [ - 0.001034, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [##################### ] 4/7" - ], - [ - 0.002337, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [###################### ] 4/7" - ], - [ - 0.001150, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [####################### ] 4/7" - ], - [ - 0.000961, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [######################## ] 4/7" - ], - [ - 0.002949, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [######################### ] 4/7" - ], - [ - 0.002670, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [############################ ] 4/7" - ], - [ - 0.001614, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [############################## ] 4/7" - ], - [ - 0.001226, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [################################ ] 4/7" - ], - [ - 0.001034, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [################################# ] 4/7" - ], - [ - 0.003059, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [################################## ] 4/7" - ], - [ - 0.001111, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [################################### ] 4/7" - ], - [ - 0.002580, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [#################################### ] 4/7" - ], - [ - 0.003441, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [##################################### ] 4/7" - ], - [ - 0.000834, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [###################################### ] 4/7" - ], - [ - 0.001864, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [########################################## ] 4/7" - ], - [ - 0.002663, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [############################################## ] 4/7" - ], - [ - 0.001599, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [################################################### ] 4/7" - ], - [ - 0.001382, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [#################################################### ] 4/7" - ], - [ - 0.001845, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [######################################################## ] 4/7" - ], - [ - 0.001292, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [########################################################## ] 4/7" - ], - [ - 0.001005, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [########################################################### ] 4/7" - ], - [ - 0.002348, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [############################################################ ] 4/7" - ], - [ - 0.001487, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [############################################################# ] 4/7" - ], - [ - 0.000771, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [############################################################## ] 4/7" - ], - [ - 0.001740, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [############################################################### ] 4/7" - ], - [ - 0.009366, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [################################################################ ] 4/7" - ], - [ - 0.011804, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [################################################################# ] 4/7" - ], - [ - 0.026245, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [################################################################## ] 4/7" - ], - [ - 0.003219, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [################################################################### ] 4/7" - ], - [ - 0.001753, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [#################################################################### ] 4/7" - ], - [ - 0.001680, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [##################################################################### ] 4/7" - ], - [ - 0.002312, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [###################################################################### ] 4/7" - ], - [ - 0.001604, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [####################################################################### ] 4/7" - ], - [ - 0.000742, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [######################################################################## ] 4/7" - ], - [ - 0.005643, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [######################################################################### ] 4/7" - ], - [ - 0.007418, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [########################################################################## ] 4/7" - ], - [ - 0.003209, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [############################################################################ ] 4/7" - ], - [ - 0.004505, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [############################################################################# ] 4/7" - ], - [ - 0.003308, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [############################################################################## ] 4/7" - ], - [ - 0.001423, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [############################################################################### ] 4/7" - ], - [ - 0.005224, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [################################################################################# ] 4/7" - ], - [ - 0.003192, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [################################################################################## ] 4/7" - ], - [ - 0.001600, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [################################################################################### ] 4/7" - ], - [ - 0.003253, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [#################################################################################### ] 4/7" - ], - [ - 0.002803, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [##################################################################################### ] 4/7" - ], - [ - 0.022067, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [###################################################################################### ] 4/7" - ], - [ - 0.011462, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch [####################################################################################### ] 4/7" - ], - [ - 0.002621, - "\r Installing : 1:python-flask-0.10.1-8.el7~mos1.noarch 4/7" - ], - [ - 0.000038, - " " - ], - [ - 0.000011, - "\r\n" - ], - [ - 0.085216, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [ ] 5/7" - ], - [ - 0.011928, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [####### ] 5/7" - ], - [ - 0.002674, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [############# ] 5/7" - ], - [ - 0.001791, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [##################### ] 5/7" - ], - [ - 0.001891, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [######################## ] 5/7" - ], - [ - 0.001505, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [########################### ] 5/7" - ], - [ - 0.005304, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [############################## ] 5/7" - ], - [ - 0.001666, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [############################### ] 5/7" - ], - [ - 0.006577, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [################################ ] 5/7" - ], - [ - 0.002626, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [################################# ] 5/7" - ], - [ - 0.006138, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [####################################### ] 5/7" - ], - [ - 0.003813, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [########################################### ] 5/7" - ], - [ - 0.003127, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [############################################ ] 5/7" - ], - [ - 0.003376, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [############################################# ] 5/7" - ], - [ - 0.005514, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [############################################### ] 5/7" - ], - [ - 0.003521, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [################################################## ] 5/7" - ], - [ - 0.002825, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [################################################### ] 5/7" - ], - [ - 0.001200, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [##################################################### ] 5/7" - ], - [ - 0.001992, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [####################################################### ] 5/7" - ], - [ - 0.001186, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [########################################################## ] 5/7" - ], - [ - 0.002828, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [############################################################ ] 5/7" - ], - [ - 0.001046, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [############################################################## ] 5/7" - ], - [ - 0.001447, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [################################################################ ] 5/7" - ], - [ - 0.001144, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [################################################################### ] 5/7" - ], - [ - 0.002307, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [#################################################################### ] 5/7" - ], - [ - 0.004582, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [######################################################################## ] 5/7" - ], - [ - 0.001930, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [############################################################################ ] 5/7" - ], - [ - 0.004333, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [############################################################################# ] 5/7" - ], - [ - 0.002359, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [############################################################################### ] 5/7" - ], - [ - 0.002655, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [################################################################################ ] 5/7" - ], - [ - 0.003461, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch [################################################################################# ] 5/7" - ], - [ - 0.005684, - "\r Installing : python2-flask-restful-0.3.5-2.el7~mos2.noarch 5/7" - ], - [ - 0.000191, - " \r\n" - ], - [ - 0.062063, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [ ] 6/7" - ], - [ - 0.009536, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [############ ] 6/7" - ], - [ - 0.002589, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [######################### ] 6/7" - ], - [ - 0.001545, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [####################################### ] 6/7" - ], - [ - 0.002418, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [######################################## ] 6/7" - ], - [ - 0.000923, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [######################################### ] 6/7" - ], - [ - 0.000978, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [########################################## ] 6/7" - ], - [ - 0.001446, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [########################################### ] 6/7" - ], - [ - 0.003241, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [################################################ ] 6/7" - ], - [ - 0.002725, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [####################################################### ] 6/7" - ], - [ - 0.006926, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [######################################################## ] 6/7" - ], - [ - 0.001830, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [######################################################### ] 6/7" - ], - [ - 0.002672, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [########################################################### ] 6/7" - ], - [ - 0.002245, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [############################################################## ] 6/7" - ], - [ - 0.003592, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [############################################################### ] 6/7" - ], - [ - 0.002233, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [################################################################ ] 6/7" - ], - [ - 0.003205, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [######################################################################## ] 6/7" - ], - [ - 0.000950, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [######################################################################### ] 6/7" - ], - [ - 0.001078, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [############################################################################ ] 6/7" - ], - [ - 0.001014, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [############################################################################# ] 6/7" - ], - [ - 0.000990, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [############################################################################### ] 6/7" - ], - [ - 0.002365, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch [################################################################################ ] 6/7" - ], - [ - 0.002277, - "\r Installing : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch 6/7 \r\n" - ], - [ - 0.054684, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [ ] 7/7" - ], - [ - 0.009724, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [# ] 7/7" - ], - [ - 0.001327, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [##### ] 7/7" - ], - [ - 0.002199, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [###### ] 7/7" - ], - [ - 0.003574, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [######### ] 7/7" - ], - [ - 0.002062, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [########## ] 7/7" - ], - [ - 0.001278, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [########### ] 7/7" - ], - [ - 0.001506, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [############ ] 7/7" - ], - [ - 0.004135, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [############### ] 7/7" - ], - [ - 0.004208, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [################ ] 7/7" - ], - [ - 0.002727, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [################## ] 7/7" - ], - [ - 0.001718, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [################### ] 7/7" - ], - [ - 0.001868, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [#################### ] 7/7" - ], - [ - 0.002238, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [##################### ] 7/7" - ], - [ - 0.001058, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [###################### ] 7/7" - ], - [ - 0.000969, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [####################### ] 7/7" - ], - [ - 0.001868, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [########################## ] 7/7" - ], - [ - 0.001860, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [############################ ] 7/7" - ], - [ - 0.000888, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [############################# ] 7/7" - ], - [ - 0.001226, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [############################## ] 7/7" - ], - [ - 0.001978, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [#################################### ] 7/7" - ], - [ - 0.001106, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [####################################### ] 7/7" - ], - [ - 0.001323, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [########################################### ] 7/7" - ], - [ - 0.000836, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [############################################### ] 7/7" - ], - [ - 0.001904, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [#################################################### ] 7/7" - ], - [ - 0.002869, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [####################################################### ] 7/7" - ], - [ - 0.004652, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [######################################################### ] 7/7" - ], - [ - 0.008683, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [########################################################## ] 7/7" - ], - [ - 0.001030, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [########################################################### ] 7/7" - ], - [ - 0.001746, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [############################################################### ] 7/7" - ], - [ - 0.003928, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [################################################################ ] 7/7" - ], - [ - 0.002902, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [################################################################## ] 7/7" - ], - [ - 0.003484, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [################################################################### ] 7/7" - ], - [ - 0.003227, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [#################################################################### ] 7/7" - ], - [ - 0.003300, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [##################################################################### ] 7/7" - ], - [ - 0.009236, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [############################################################################# ] 7/7" - ], - [ - 0.003018, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [############################################################################## ] 7/7" - ], - [ - 0.003334, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch [################################################################################### ] 7/7" - ], - [ - 0.001994, - "\r Installing : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch 7/7 \r\n" - ], - [ - 0.083241, - "\r Verifying : python-itsdangerous-0.24-7.el7~mos1.noarch 1/7 \r\n" - ], - [ - 0.026316, - "\r Verifying : tuning-box-0.0.1-1.mos85.git.4c9e4eb.noarch 2/7 \r\n" - ], - [ - 0.024605, - "\r Verifying : 1:python-flask-0.10.1-8.el7~mos1.noarch 3/7 \r\n" - ], - [ - 0.025000, - "\r Verifying : python-werkzeug-0.10.4-5.el7~mos1.noarch 4/7 \r\n" - ], - [ - 0.031135, - "\r Verifying : python2-flask-restful-0.3.5-2.el7~mos2.noarch 5/7 \r\n" - ], - [ - 0.025831, - "\r Verifying : python2-aniso8601-1.1.0-3.el7~mos2.noarch 6/7 \r\n" - ], - [ - 0.019690, - "\r Verifying : python2-flask-sqlalchemy-2.1-2.el7~mos2.noarch 7/7 \r\n" - ], - [ - 0.172866, - "\r\nInstalled:\r\n tuning-box.noarch 0:0.0.1-1.mos85.git.4c9e4eb \r\n\r\nDependency Installed:\r\n python-flask.noarch 1:0.10.1-8.el7~mos1 python-itsdangerous.noarch 0:0.24-7.el7~mos1 python-werkzeug.noarch 0:0.10.4-5.el7~mos1 \r\n python2-aniso8601.noarch 0:1.1.0-3.el7~mos2 python2-flask-restful.noarch 0:0.3.5-2.el7~mos2 python2-flask-sqlalchemy.noarch 0:2.1-2.el7~mos2 \r\n\r\n" - ], - [ - 0.001149, - "Complete!\r\n" - ], - [ - 0.051289, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "A" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "nailgun_syncdb" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "2016-03-16 13:18:29.803 DEBUG [7f9e771af740] (settings) Looking for settings.yaml package config using old style __file__\r\n" - ], - [ - 0.000303, - "2016-03-16 13:18:29.803 DEBUG [7f9e771af740] (settings) Trying to read config file /usr/lib/python2.7/site-packages/nailgun/settings.yaml\r\n" - ], - [ - 0.246010, - "2016-03-16 13:18:30.049 DEBUG [7f9e771af740] (settings) Trying to read config file /etc/nailgun/settings.yaml\r\n" - ], - [ - 0.400935, - "INFO [alembic.runtime.migration] Context impl PostgresqlImpl." - ], - [ - 0.000310, - "\r\n" - ], - [ - 0.000225, - "INFO [alembic.runtime.migration] Will assume transactional DDL." - ], - [ - 0.000127, - "\r\n" - ], - [ - 0.156011, - "/usr/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/api.py:173: SAWarning: Unmanaged access of declarative attribute __tablename__ from non-mapped class ModelMixin" - ], - [ - 0.000082, - "\r\n" - ], - [ - 0.000026, - " (desc.fget.__name__, cls.__name__))" - ], - [ - 0.000025, - "\r\n" - ], - [ - 0.5, - "INFO [alembic.runtime.migration] Context impl PostgresqlImpl.\r\n" - ], - [ - 0.000011, - "INFO [alembic.runtime.migration] Will assume transactional DDL.\r\n" - ], - [ - 0.050546, - "INFO [alembic.runtime.migration] Running upgrade -> f16eb4eff7c, Initial revision\r\n" - ], - [ - 0.203799, - "INFO [alembic.runtime.migration] Running upgrade f16eb4eff7c -> 3b2a0f134e45, Switch to new API\r\n" - ], - [ - 0.015929, - "INFO [alembic.runtime.migration] Running upgrade 3b2a0f134e45 -> 967a44dd16d5, Add server_default to resource_values.values\r\n" - ], - [ - 0.001981, - "INFO [alembic.runtime.migration] Running upgrade 967a44dd16d5 -> ad192a40fd68, Add overrides to resource_values\r\n" - ], - [ - 0.022770, - "INFO [alembic.runtime.migration] Running upgrade ad192a40fd68 -> d054eefc4c5b, Add unique constraint on component.name\r\n" - ], - [ - 0.006183, - "INFO [alembic.runtime.migration] Running upgrade d054eefc4c5b -> 9ae15c85fa92, Remove fake root hierarchy level values\r\n" - ], - [ - 0.479668, - "INFO [alembic.runtime.migration] Context impl PostgresqlImpl.\r\n" - ], - [ - 0.000286, - "INFO [alembic.runtime.migration] Will assume transactional DDL.\r\n" - ], - [ - 0.020099, - "INFO [alembic.runtime.migration] Context impl PostgresqlImpl.\r\nINFO [alembic.runtime.migration] Will assume transactional DDL.\r\n" - ], - [ - 0.081611, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "service nailgun restart" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.021764, - "Redirecting to /bin/systemctl restart nailgun.service\r\n" - ], - [ - 0.5, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "F" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "C" - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "I" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "T" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "B" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "x" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "K" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.310632, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "x" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "enti" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "export OS_USERNAME=admin OS_PASSWORD=admin OS_PROJECT_NAME=admin OS_AUTH_URL=http://10.20.0.2:5000" - ], - [ - 0.5, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "C" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "openstack service create --name tuning-box config" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "+-------------+----------------------------------+" - ], - [ - 0.000022, - "\r\n" - ], - [ - 0.000012, - "| Field | Value |" - ], - [ - 0.000026, - "\r\n" - ], - [ - 0.000011, - "+-------------+----------------------------------+" - ], - [ - 0.000009, - "\r\n" - ], - [ - 0.000011, - "| description | None |" - ], - [ - 0.000009, - "\r\n" - ], - [ - 0.000011, - "| enabled | True |" - ], - [ - 0.000009, - "\r\n" - ], - [ - 0.000010, - "| id | c57a53abe91f45a1861628d202923f2d |" - ], - [ - 0.000008, - "\r\n" - ], - [ - 0.000010, - "| name | tuning-box |" - ], - [ - 0.000008, - "\r\n" - ], - [ - 0.000010, - "| type | config |" - ], - [ - 0.000008, - "\r\n" - ], - [ - 0.000016, - "+-------------+----------------------------------+" - ], - [ - 0.000009, - "\r\n" - ], - [ - 0.032934, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "openstack endpoint create --publicurl http://10.20.0.2:8000/api/config --region RegionOne tuning-box" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "+--------------+----------------------------------+\r\n| Field | Value |\r\n+--------------+----------------------------------+\r\n| id | b266897410ea47269b96e3f8ce933ce1 |\r\n| publicurl | http://10.20.0.2:8000/api/config |\r\n| region | RegionOne |\r\n| service_id | c57a53abe91f45a1861628d202923f2d |" - ], - [ - 0.000318, - "\r\n| service_name | tuning-box |\r\n| service_type | config |\r\n+--------------+----------------------------------+\r\n" - ], - [ - 0.036134, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "openstack catalog list" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "+------------+----------+-----------------------------------------------+" - ], - [ - 0.000276, - "\r\n" - ], - [ - 0.000135, - "| Name | Type | Endpoints |" - ], - [ - 0.000129, - "\r\n" - ], - [ - 0.000044, - "+------------+----------+-----------------------------------------------+" - ], - [ - 0.000041, - "\r\n" - ], - [ - 0.000026, - "| ostf | ostf | RegionOne |" - ], - [ - 0.000024, - "\r\n" - ], - [ - 0.000037, - "| | | publicURL: http://10.20.0.2:8000/ostf |" - ], - [ - 0.000025, - "\r\n" - ], - [ - 0.000024, - "| | | internalURL: http://10.20.0.2:8000/ostf |" - ], - [ - 0.000035, - "\r\n" - ], - [ - 0.000024, - "| | | adminURL: http://10.20.0.2:8000/ostf |" - ], - [ - 0.000050, - "\r\n" - ], - [ - 0.000026, - "| | | |" - ], - [ - 0.000024, - "\r\n" - ], - [ - 0.000036, - "| nailgun | fuel | RegionOne |" - ], - [ - 0.000025, - "\r\n" - ], - [ - 0.000023, - "| | | publicURL: http://10.20.0.2:8000/api |" - ], - [ - 0.000037, - "\r\n" - ], - [ - 0.000025, - "| | | internalURL: http://10.20.0.2:8000/api |" - ], - [ - 0.000024, - "\r\n" - ], - [ - 0.000036, - "| | | adminURL: http://10.20.0.2:8000/api |" - ], - [ - 0.000026, - "\r\n" - ], - [ - 0.000024, - "| | | |" - ], - [ - 0.000037, - "\r\n" - ], - [ - 0.000025, - "| tuning-box | config | RegionOne " - ], - [ - 0.000045, - " |" - ], - [ - 0.000032, - "\r\n" - ], - [ - 0.000025, - "| | | publicURL: http://10.20.0.2:8000/api/config |" - ], - [ - 0.000037, - "\r\n" - ], - [ - 0.000028, - "| | | |" - ], - [ - 0.000025, - "\r\n" - ], - [ - 0.000038, - "| keystone | identity | RegionOne |" - ], - [ - 0.000026, - "\r\n" - ], - [ - 0.000025, - "| | | publicURL: http://10.20.0.2:5000/v2.0 |" - ], - [ - 0.000037, - "\r\n" - ], - [ - 0.000026, - "| | | internalURL: http://10.20.0.2:5000/v2.0 |" - ], - [ - 0.000024, - "\r\n" - ], - [ - 0.000038, - "| | | adminURL: http://10.20.0.2:35357/v2.0 |" - ], - [ - 0.000026, - "\r\n" - ], - [ - 0.000025, - "| | | |" - ], - [ - 0.000037, - "\r\n" - ], - [ - 0.000033, - "+------------+----------+-----------------------------------------------+" - ], - [ - 0.000026, - "\r\n" - ], - [ - 0.026254, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "A" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "un" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "-" - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "x" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "U" - ], - [ - 0.05, - "R" - ], - [ - 0.05, - "L" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "U" - ], - [ - 0.05, - "R" - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.415704, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "T" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "x" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n" - ], - [ - 0.001086, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.383229, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "T" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "x" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "C" - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "I" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "token_id=$(openstack token issue -c id -f value) \r\n" - ], - [ - 0.5, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/components -H \"Content-type: application/json\" -d @component.json" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.231257, - "{\"resource_definitions\": [{\"content\": {}, \"component_id\": 1, \"id\": 1, \"name\": \"resource1\"}, {\"content\": {}, \"component_id\": 1, \"id\": 2, \"name\": \"slashed/resource\"}], \"id\": 1, \"name\": \"comp1\"}\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "curl -H \"X-Auth-Token: $token_id\" http://10.20.0.2:8000/api/config/environments -H \"Content-type: application/json\" -d @environment.json" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.218474, - "{\"hierarchy_levels\": [\"nodes\"], \"id\": 1, \"components\": [1]}\r\n" - ], - [ - 0.000284, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "C" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "component.json" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "environment.json" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "." - ], - [ - 0.05, - " " - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "1" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "fuel2 config get --env 1 --resource resource1 --format yaml" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "{}" - ], - [ - 0.000295, - "\r\n" - ], - [ - 0.020874, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "." - ], - [ - 0.05, - " " - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "l" - ], - [ - 0.049078, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "echo '{\"a\": 1, \"b\": null}' | fuel2 config set --env 1 --resource resource1 --format json" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "fuel2 config get --env 1 --resource resource1 --format yaml" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "a: 1\r\nb: null\r\n" - ], - [ - 0.024848, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "D" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "." - ], - [ - 0.05, - " " - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "fuel2 config get --env 1 --resource resource1 --format yaml --level nodes=1" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "a: 1\r\nb: null\r\n" - ], - [ - 0.016466, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "A" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "echo '{\"a\": 2}' | fuel2 config set --env 1 --resource resource1 --format json --level nodes=1" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "fuel2 config get --env 1 --resource resource1 --format yaml" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "a: 1" - ], - [ - 0.000042, - "\r\n" - ], - [ - 0.000014, - "b: null" - ], - [ - 0.000011, - "\r\n" - ], - [ - 0.020601, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "N" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.423721, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "A" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "." - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "fuel2 config get --env 1 --resource resource1 --format yaml --level nodes=1" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "a: 2" - ], - [ - 0.000050, - "\r\n" - ], - [ - 0.000015, - "b: null" - ], - [ - 0.000020, - "\r\n" - ], - [ - 0.024877, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "W" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "L" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.351146, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "W" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "fuel2 config override --env 1 --resource resource1 --key b --value s --type str" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "fuel2 config get --env 1 --resource resource1 --format yaml" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "a: 1\r\nb: s\r\n" - ], - [ - 0.018667, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "fuel2 config get --env 1 --resource resource1 --format yaml --level nodes=1" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "a: 2" - ], - [ - 0.000023, - "\r\n" - ], - [ - 0.000012, - "b: s" - ], - [ - 0.000009, - "\r\n" - ], - [ - 0.019710, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "A" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "b" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "I" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - ":" - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "echo '{\"a\": 1, \"b\": \"s3\"}' | fuel2 config set --env 1 --resource resource1 --format json" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "fuel2 config get --env 1 --resource resource1 --format yaml" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "a: 1\r\nb: s\r\n" - ], - [ - 0.016639, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "fuel2 config get --env 1 --resource resource1 --format yaml --level nodes=1" - ], - [ - 0.5, - "\r\n" - ], - [ - 0.5, - "a: 2" - ], - [ - 0.000947, - "\r\nb: s\r\n" - ], - [ - 0.027318, - "\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "S" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "f" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "y" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "p" - ], - [ - 0.05, - "d" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "m" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "v" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "l" - ], - [ - 0.05, - "u" - ], - [ - 0.05, - "e" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ], - [ - 0.5, - "#" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "T" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "'" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "," - ], - [ - 0.05, - " " - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "k" - ], - [ - 0.05, - "s" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "f" - ], - [ - 0.05, - "o" - ], - [ - 0.05, - "r" - ], - [ - 0.05, - " " - ], - [ - 0.05, - "w" - ], - [ - 0.05, - "a" - ], - [ - 0.05, - "t" - ], - [ - 0.05, - "c" - ], - [ - 0.05, - "h" - ], - [ - 0.05, - "i" - ], - [ - 0.05, - "n" - ], - [ - 0.05, - "g" - ], - [ - 0.05, - "." - ], - [ - 0.05, - "\r\n\u001bkroot@fuel:~\u001b\\[root@fuel ~]# " - ] - ] -} diff --git a/doc/source/records/03-cli/script b/doc/source/records/03-cli/script deleted file mode 100644 index 9c8e9df..0000000 --- a/doc/source/records/03-cli/script +++ /dev/null @@ -1,34 +0,0 @@ -rpm --import http://mirror.fuel-infra.org/mos-repos/centos/mos9.0-centos7/os/RPM-GPG-KEY-mos9.0 -yum-config-manager --add-repo http://mirror.fuel-infra.org/mos-repos/centos/mos9.0-centos7/os/x86_64/ -yum-config-manager --add-repo http://packages.fuel-infra.org/review/FUEL-304811//repositories/centos/master-centos7/os/x86_64 -yum install -y tuning-box -nailgun_syncdb -service nailgun restart - -export OS_USERNAME=admin OS_PASSWORD=admin OS_PROJECT_NAME=admin OS_AUTH_URL=http://10.20.0.2:5000 -openstack service create --name tuning-box config -openstack endpoint create --publicurl http://10.20.0.2:8000/api/config --region RegionOne tuning-box -openstack catalog list - -token_id=$(openstack token issue -c id -f value) - -curl -H "X-Auth-Token: $token_id" http://10.20.0.2:8000/api/config/components -H "Content-type: application/json" -d @component.json -curl -H "X-Auth-Token: $token_id" http://10.20.0.2:8000/api/config/environments -H "Content-type: application/json" -d @environment.json - -fuel2 config get --env 1 --resource resource1 --format yaml - -echo '{"a": 1, "b": null}' | fuel2 config set --env 1 --resource resource1 --format json -fuel2 config get --env 1 --resource resource1 --format yaml -fuel2 config get --env 1 --resource resource1 --format yaml --level nodes=1 - -echo '{"a": 2}' | fuel2 config set --env 1 --resource resource1 --format json --level nodes=1 -fuel2 config get --env 1 --resource resource1 --format yaml -fuel2 config get --env 1 --resource resource1 --format yaml --level nodes=1 - -fuel2 config override --env 1 --resource resource1 --key b --value s --type str -fuel2 config get --env 1 --resource resource1 --format yaml -fuel2 config get --env 1 --resource resource1 --format yaml --level nodes=1 - -echo '{"a": 1, "b": "s3"}' | fuel2 config set --env 1 --resource resource1 --format json -fuel2 config get --env 1 --resource resource1 --format yaml -fuel2 config get --env 1 --resource resource1 --format yaml --level nodes=1 diff --git a/doc/source/records/prettify.py b/doc/source/records/prettify.py deleted file mode 100644 index 8e047a8..0000000 --- a/doc/source/records/prettify.py +++ /dev/null @@ -1,90 +0,0 @@ -import collections -import decimal -import json -import os -import shutil -import sys - -def remove_bs(data): - new_stdout = [] - for i, e in enumerate(data["stdout"]): - if '\b' in e[1]: - c = e[1].count('\b') - for j, e1 in enumerate(reversed(new_stdout)): - if len(e1[1]) <= c: - c -= len(e1[1]) - if not c: - break - else: - e1[1] = e1[1][:-c] - j += 1 - break - new_stdout[-j-1:] = [] - else: - new_stdout.append(e) - data["stdout"] = new_stdout - - -def speedup_typing(data, delay): - delay = decimal.Decimal(delay) - it = iter(data["stdout"]) - try: - e = next(it) - while True: - while not e[1].endswith("]# "): - e = next(it) - e = next(it) - if e[1] != "#": - continue - while True: - e = next(it) - e[0] = delay - if '\r' in e[1]: - break - except StopIteration: - pass - - -def set_max_delay(data, delay): - delay = decimal.Decimal(delay) - for e in data["stdout"]: - if e[0] > delay: - e[0] = delay - - -def correct_duration(data): - data["duration"] = sum(e[0] for e in data["stdout"]) - - -def main(fname): - with open(fname) as f: - data = json.load(f, object_pairs_hook=collections.OrderedDict, parse_float=decimal.Decimal) - - remove_bs(data) - speedup_typing(data, '0.05') - set_max_delay(data, '0.5') - correct_duration(data) - - shutil.copy(fname, fname + ".tmp") - with open(fname + ".tmp", "w") as f: - data = json.dump(data, f, indent=2, cls=Encoder) - os.rename(fname + ".tmp", fname) - - -class DecIntWrapper(int): - def __init__(self, d): - self.d = d - - def __str__(self): - return str(self.d) - - -class Encoder(json.JSONEncoder): - def default(self, o): - if isinstance(o, decimal.Decimal): - #import pdb; pdb.set_trace() - return DecIntWrapper(o) - return json.JSONEncoder.default(o) - -if __name__ == '__main__': - main(sys.argv[1]) diff --git a/doc/source/usage.rst b/doc/source/usage.rst deleted file mode 100644 index b1c4e46..0000000 --- a/doc/source/usage.rst +++ /dev/null @@ -1,7 +0,0 @@ -======== -Usage -======== - -To use tuning_box in a project:: - - import tuning_box \ No newline at end of file diff --git a/examples/etc/tuningbox/tuningbox_config.py b/examples/etc/tuningbox/tuningbox_config.py deleted file mode 100644 index 9918c7a..0000000 --- a/examples/etc/tuningbox/tuningbox_config.py +++ /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. - -LOG_LEVEL = 'DEBUG' -PROPAGATE_EXCEPTIONS = True - -SQLALCHEMY_DATABASE_URI = \ - 'postgresql://tuningbox:tuningbox@localhost/tuningbox' - -AUTH = { - 'auth_host': '127.0.0.1', - 'auth_protocol': 'http', - 'auth_version': 'v2.0', - 'admin_user': 'tuningbox', - 'admin_password': 'tuningbox', - 'admin_tenant_name': 'services' -} diff --git a/examples/etc/tuningbox/uwsgi_tuningbox.yaml b/examples/etc/tuningbox/uwsgi_tuningbox.yaml deleted file mode 100644 index e27feaf..0000000 --- a/examples/etc/tuningbox/uwsgi_tuningbox.yaml +++ /dev/null @@ -1,8 +0,0 @@ -uwsgi: - socket: :8082 - protocol: http - module: tuning_box.app:build_app() - pythonpath: %d../../.. - env: TUNINGBOX_SETTINGS=%d/tuningbox_config.py -# logto: /var/log/tuningbox/tuningbox.log -# pid: /var/run/tuningbox.pid diff --git a/examples/lib/systemd/system/tuningbox.service b/examples/lib/systemd/system/tuningbox.service deleted file mode 100644 index a1bb91a..0000000 --- a/examples/lib/systemd/system/tuningbox.service +++ /dev/null @@ -1,12 +0,0 @@ -[Unit] -Name=Tunigbox service -ConditionPathExists=/etc/tuningbox/uwsgi_tuningbox.yaml - -[Service] -ExecStart=/usr/sbin/uwsgi -y /etc/tuningbox/uwsgi_tuningbox.yaml -ExecReload=/usr/sbin/uwsgi --reload /var/run/tuningbox.pid -ExecStop=/usr/sbin/uwsgi --stop /var/run/tuningbox.pid -ExecStopPost=/usr/bin/rm -f /var/run/tuningbox.pid - -[Install] -WantedBy=multi-user.target \ No newline at end of file diff --git a/openstack-common.conf b/openstack-common.conf deleted file mode 100644 index 9e4442a..0000000 --- a/openstack-common.conf +++ /dev/null @@ -1,6 +0,0 @@ -[DEFAULT] - -# The list of modules to copy from oslo-incubator.git - -# The base module to hold the copy of openstack.common -base=tuning_box \ No newline at end of file diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 4760b3e..0000000 --- a/requirements.txt +++ /dev/null @@ -1,13 +0,0 @@ -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. - -pbr>=1.6 -flask -flask-sqlalchemy -flask-restful -alembic -cliff -requests -keystonemiddleware>=4.0.0,!=4.1.0,!=4.5.0 -six>=1.9.0 \ No newline at end of file diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index eaaa64b..0000000 --- a/setup.cfg +++ /dev/null @@ -1,98 +0,0 @@ -[metadata] -name = tuning_box -summary = Tuning Box - configuration storage for your clouds -description-file = - README.rst -author = OpenStack -author-email = openstack-dev@lists.openstack.org -home-page = http://www.openstack.org/ -classifier = - Environment :: OpenStack - Intended Audience :: Information Technology - Intended Audience :: System Administrators - License :: OSI Approved :: Apache Software License - Operating System :: POSIX :: Linux - Programming Language :: Python - Programming Language :: Python :: 2 - Programming Language :: Python :: 2.7 - Programming Language :: Python :: 3 - Programming Language :: Python :: 3.4 - -[files] -packages = - tuning_box - -[build_sphinx] -source-dir = doc/source -build-dir = doc/build -all_files = 1 - -[upload_sphinx] -upload-dir = doc/build/html - -[compile_catalog] -directory = tuning_box/locale -domain = tuning_box - -[update_catalog] -domain = tuning_box -output_dir = tuning_box/locale -input_file = tuning_box/locale/tuning_box.pot - -[extract_messages] -keywords = _ gettext ngettext l_ lazy_gettext -mapping_file = babel.cfg -output_file = tuning_box/locale/tuning_box.pot - -[entry_points] -nailgun.extensions = - tuning_box = tuning_box.nailgun:Extension -tuning_box.cli = - get = tuning_box.cli.resources:Get - set = tuning_box.cli.resources:Set - del = tuning_box.cli.resources:Delete - override = tuning_box.cli.resources:Override - rm_override = tuning_box.cli.resources:DeleteOverride - env_create = tuning_box.cli.environments:CreateEnvironment - env_list = tuning_box.cli.environments:ListEnvironments - env_show = tuning_box.cli.environments:ShowEnvironment - env_delete = tuning_box.cli.environments:DeleteEnvironment - env_update = tuning_box.cli.environments:UpdateEnvironment - comp_create = tuning_box.cli.components:CreateComponent - comp_list = tuning_box.cli.components:ListComponents - comp_show = tuning_box.cli.components:ShowComponent - comp_delete = tuning_box.cli.components:DeleteComponent - comp_update = tuning_box.cli.components:UpdateComponent - def_create = tuning_box.cli.resource_definitions:CreateResourceDefinition - def_list = tuning_box.cli.resource_definitions:ListResourceDefinitions - def_show = tuning_box.cli.resource_definitions:ShowResourceDefinition - def_delete = tuning_box.cli.resource_definitions:DeleteResourceDefinition - def_update = tuning_box.cli.resource_definitions:UpdateResourceDefinition - lvl_list = tuning_box.cli.hierarchy_levels:ListHierarchyLevels - lvl_show = tuning_box.cli.hierarchy_levels:ShowHierarchyLevel -fuelclient = - config_get = tuning_box.fuelclient:Get - config_set = tuning_box.fuelclient:Set - config_del = tuning_box.fuelclient:Delete - config_override = tuning_box.fuelclient:Override - config_rm_override = tuning_box.fuelclient:DeleteOverride - config_env_create = tuning_box.fuelclient:CreateEnvironment - config_env_list = tuning_box.fuelclient:ListEnvironments - config_env_show = tuning_box.fuelclient:ShowEnvironment - config_env_delete = tuning_box.fuelclient:DeleteEnvironment - config_env_update = tuning_box.fuelclient:UpdateEnvironment - config_comp_create = tuning_box.fuelclient:CreateComponent - config_comp_list = tuning_box.fuelclient:ListComponents - config_comp_show = tuning_box.fuelclient:ShowComponent - config_comp_delete = tuning_box.fuelclient:DeleteComponent - config_comp_update = tuning_box.fuelclient:UpdateComponent - config_def_create = tuning_box.fuelclient:CreateResourceDefinition - config_def_list = tuning_box.fuelclient:ListResourceDefinitions - config_def_show = tuning_box.fuelclient:ShowResourceDefinition - config_def_delete = tuning_box.fuelclient:DeleteResourceDefinition - config_def_update = tuning_box.fuelclient:UpdateResourceDefinition - config_lvl_list = tuning_box.fuelclient:ListHierarchyLevels - config_lvl_show = tuning_box.fuelclient:ShowHierarchyLevel -console_scripts = - tuningbox_db_upgrade = tuning_box.migration:upgrade - tuningbox_db_downgrade = tuning_box.migration:downgrade diff --git a/setup.py b/setup.py deleted file mode 100644 index 056c16c..0000000 --- a/setup.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT -import setuptools - -# In python < 2.7.4, a lazy loading of package `pbr` will break -# setuptools if some other modules registered functions in `atexit`. -# solution from: http://bugs.python.org/issue15881#msg170215 -try: - import multiprocessing # noqa -except ImportError: - pass - -setuptools.setup( - setup_requires=['pbr'], - pbr=True) diff --git a/specs/tuning-box.spec b/specs/tuning-box.spec deleted file mode 100644 index 162e665..0000000 --- a/specs/tuning-box.spec +++ /dev/null @@ -1,52 +0,0 @@ -%define name tuning-box -%{!?version: %define version 0.1.0} -%{!?release: %define release 1} - -Name: %{name} -Version: %{version} -Release: %{release} -Source0: %{name}-%{version}.tar.gz -Summary: Fuel ConfigDB extension package -URL: http://openstack.org -License: Apache -Group: Development/Libraries -Prefix: %{_prefix} -BuildRequires: git -BuildRequires: python-setuptools -BuildRequires: python2-devel -BuildArch: noarch - -Requires: fuel-nailgun -Requires: python-alembic -Requires: python-flask -Requires: python2-flask-sqlalchemy -Requires: python2-flask-restful - -%description -This package provides extension to the Nailgun API. This extension allows to -manage deployment information and facilitates the exchange of such information -between Nailgun and 3rd-party deployment and configuration management services -(e.g. Puppet Master). - -%prep -%setup -cq -n %{name}-%{version} - -%build -cd %{_builddir}/%{name}-%{version} && PBR_VERSION=%{version} %{__python} setup.py build - -%install -cd %{_builddir}/%{name}-%{version} && PBR_VERSION=%{version} %{__python} setup.py install --single-version-externally-managed -O1 --root=$RPM_BUILD_ROOT - -%clean -rm -rf $RPM_BUILD_ROOT - -%files -%defattr(-,root,root) -%{python_sitelib}/tuning_box/ -%{python_sitelib}/tuning_box-%{version}*.egg-info/ -/usr/bin/tuningbox_db_downgrade -/usr/bin/tuningbox_db_upgrade - -%changelog -* Fri Mar 18 2016 Oleg Gelbukh 9.0.0 -- Initial version of package spec diff --git a/test-requirements.txt b/test-requirements.txt deleted file mode 100644 index 6ac4598..0000000 --- a/test-requirements.txt +++ /dev/null @@ -1,18 +0,0 @@ -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. - -hacking<0.11,>=0.10.0 - -coverage>=3.6 -discover -python-subunit>=0.0.18 -sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2 -oslo.db[fixtures,mysql,postgresql] -oslosphinx>=2.5.0 # Apache-2.0 -oslotest>=1.10.0 # Apache-2.0 -testrepository>=0.0.18 -testscenarios>=0.4 -testtools>=1.4.0 -requests-mock -python-fuelclient \ No newline at end of file diff --git a/tools/test-setup.sh b/tools/test-setup.sh deleted file mode 100755 index ab662a4..0000000 --- a/tools/test-setup.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash -xe - -# This script will be run by OpenStack CI before unit tests are run, -# it sets up the test system as needed. -# Developers should setup their test systems in a similar way. - -# This setup needs to be run as a user that can run sudo. - -# The root password for the MySQL database; pass it in via -# MYSQL_ROOT_PW. -DB_ROOT_PW=${MYSQL_ROOT_PW:-insecure_slave} - -# This user and its password are used by the tests, if you change it, -# your tests might fail. -DB_USER=openstack_citest -DB_PW=openstack_citest - -sudo -H mysqladmin -u root password $DB_ROOT_PW - -# It's best practice to remove anonymous users from the database. If -# a anonymous user exists, then it matches first for connections and -# other connections from that host will not work. -sudo -H mysql -u root -p$DB_ROOT_PW -h localhost -e " - DELETE FROM mysql.user WHERE User=''; - FLUSH PRIVILEGES; - GRANT ALL PRIVILEGES ON *.* - TO '$DB_USER'@'%' identified by '$DB_PW' WITH GRANT OPTION;" - -# Now create our database. -mysql -u $DB_USER -p$DB_PW -h 127.0.0.1 -e " - SET default_storage_engine=MYISAM; - DROP DATABASE IF EXISTS openstack_citest; - CREATE DATABASE openstack_citest CHARACTER SET utf8;" - -# Same for PostgreSQL - -# Setup user -root_roles=$(sudo -H -u postgres psql -t -c " - SELECT 'HERE' from pg_roles where rolname='$DB_USER'") -if [[ ${root_roles} == *HERE ]];then - sudo -H -u postgres psql -c "ALTER ROLE $DB_USER WITH SUPERUSER LOGIN PASSWORD '$DB_PW'" -else - sudo -H -u postgres psql -c "CREATE ROLE $DB_USER WITH SUPERUSER LOGIN PASSWORD '$DB_PW'" -fi - -# Store password for tests -cat << EOF > $HOME/.pgpass -*:*:*:$DB_USER:$DB_PW -EOF -chmod 0600 $HOME/.pgpass - -# Now create our database -psql -h 127.0.0.1 -U $DB_USER -d template1 -c "DROP DATABASE IF EXISTS openstack_citest" -createdb -h 127.0.0.1 -U $DB_USER -l C -T template0 -E utf8 openstack_citest diff --git a/tox.ini b/tox.ini deleted file mode 100644 index 2d6ff27..0000000 --- a/tox.ini +++ /dev/null @@ -1,37 +0,0 @@ -[tox] -minversion = 1.6 -envlist = py34,py27,pep8 -skipsdist = True - -[testenv] -usedevelop = True -install_command = pip install -U {opts} {packages} -setenv = - VIRTUAL_ENV={envdir} - PYTHONWARNINGS=ignore:Unmanaged access of declarative attribute __tablename__ from non-mapped class ModelMixin - OS_TEST_DBAPI_ADMIN_CONNECTION=mysql+pymysql://openstack_citest:openstack_citest@localhost/;postgresql://openstack_citest:openstack_citest@localhost/postgres;sqlite:///testdb -deps = -r{toxinidir}/test-requirements.txt -commands = python setup.py test --slowest --testr-args='{posargs}' - -[testenv:pep8] -commands = flake8 - -[testenv:venv] -commands = {posargs} - -[testenv:cover] -commands = python setup.py test --coverage --testr-args='{posargs}' - -[testenv:docs] -commands = python setup.py build_sphinx - -[testenv:debug] -commands = oslo_debug_helper {posargs} - -[flake8] -# E123, E125 skipped as they are invalid PEP-8. - -show-source = True -ignore = E123,E125 -builtins = _ -exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build diff --git a/tuning_box/__init__.py b/tuning_box/__init__.py deleted file mode 100644 index 062cd8a..0000000 --- a/tuning_box/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- - -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import pbr.version -import pkg_resources - - -__version__ = pbr.version.VersionInfo( - 'tuning_box').version_string() - - -def get_migrations_dir(): - return pkg_resources.resource_filename('tuning_box', 'migrations') diff --git a/tuning_box/app.py b/tuning_box/app.py deleted file mode 100644 index d533512..0000000 --- a/tuning_box/app.py +++ /dev/null @@ -1,161 +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 flask -import flask_restful -from sqlalchemy import exc as sa_exc - -from tuning_box import converters -from tuning_box import db -from tuning_box import errors -from tuning_box.library import components -from tuning_box.library import environments -from tuning_box.library import hierarchy_levels -from tuning_box.library import resource_definitions -from tuning_box.library import resource_overrides -from tuning_box.library import resource_values -from tuning_box import logger -from tuning_box.middleware import keystone - -# These handlers work if PROPAGATE_EXCEPTIONS is off (non-Nailgun case) -api_errors = { - 'IntegrityError': {'status': 409}, # sqlalchemy IntegrityError - 'TuningboxIntegrityError': {'status': 409}, - 'KeysOperationError': {'status': 409}, - 'RequestValidationError': {'status': 409}, - 'TuningboxNotFound': {'status': 404} -} -api = flask_restful.Api(errors=api_errors) - -# Components -api.add_resource(components.ComponentsCollection, '/components') -api.add_resource(components.Component, '/components/') - -# Resource definitions -api.add_resource( - resource_definitions.ResourceDefinitionsCollection, - '/resource_definitions', -) -api.add_resource( - resource_definitions.ResourceDefinition, - '/resource_definitions/' -) -api.add_resource( - resource_definitions.ResourceDefinitionKeys, - '/resource_definitions//' - 'keys/' -) - -# Resource values -api.add_resource( - resource_values.ResourceValues, - '/environments//resources/' - '/values' -) -api.add_resource( - resource_values.ResourceValuesKeys, - '/environments//resources/' - '/values/' - 'keys/' -) - -# Resource overrides -api.add_resource( - resource_overrides.ResourceOverrides, - '/environments//' - 'resources//overrides' -) -api.add_resource( - resource_overrides.ResourceOverridesKeys, - '/environments//' - 'resources//overrides/' - 'keys/' -) - -# Environments -api.add_resource(environments.EnvironmentsCollection, '/environments') -api.add_resource( - environments.Environment, - '/environments/' -) - -# Hierarchy levels -api.add_resource( - hierarchy_levels.EnvironmentHierarchyLevelsCollection, - '/environments//hierarchy_levels' -) -api.add_resource( - hierarchy_levels.EnvironmentHierarchyLevels, - '/environments//hierarchy_levels/' - '' -) - - -def handle_request_validation_error(exc): - response = flask.jsonify(msg=exc.args[0]) - response.status_code = 409 - return response - - -def handle_integrity_error(exc): - response = flask.jsonify(msg=exc.args[0]) - response.status_code = 409 - return response - - -def handle_object_not_found(exc): - response = flask.jsonify(msg=exc.args[0]) - response.status_code = 404 - return response - - -def handle_keys_operation_error(exc): - response = flask.jsonify(msg=exc.args[0]) - response.status_code = 409 - return response - - -def build_app(configure_logging=True, with_keystone=True): - app = flask.Flask(__name__) - app.url_map.converters.update(converters.ALL) - api.init_app(app) # init_app spoils Api object if app is a blueprint - app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False # silence warning - # TUNINGBOX_SETTINGS is the path to the file with tuning_box configuration - app.config.from_envvar('TUNINGBOX_SETTINGS', silent=True) - # These handlers work if PROPAGATE_EXCEPTIONS is on (Nailgun case) - app.register_error_handler(sa_exc.IntegrityError, handle_integrity_error) - app.register_error_handler(errors.TuningboxIntegrityError, - handle_integrity_error) - app.register_error_handler(errors.TuningboxNotFound, - handle_object_not_found) - app.register_error_handler(errors.RequestValidationError, - handle_request_validation_error) - app.register_error_handler(errors.KeysOperationError, - handle_keys_operation_error) - db.db.init_app(app) - if configure_logging: - log_level = app.config.get('LOG_LEVEL', 'DEBUG') - logger.init_logger(app, log_level) - if with_keystone: - app.wsgi_app = keystone.KeystoneMiddleware(app) - return app - - -def main(): - import logging - logging.basicConfig(level=logging.DEBUG) - - app = build_app() - app.run() - -if __name__ == '__main__': - main() diff --git a/tuning_box/cli/__init__.py b/tuning_box/cli/__init__.py deleted file mode 100644 index 6dfdb40..0000000 --- a/tuning_box/cli/__init__.py +++ /dev/null @@ -1,27 +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 cliff import app -from cliff import commandmanager - -import tuning_box - - -class TuningBoxApp(app.App): - def __init__(self, client, **kwargs): - super(TuningBoxApp, self).__init__( - description='Tuning Box - configuration storage for your cloud', - version=tuning_box.__version__, - command_manager=commandmanager.CommandManager('tuning_box.cli'), - **kwargs - ) - self.client = client diff --git a/tuning_box/cli/base.py b/tuning_box/cli/base.py deleted file mode 100644 index 4158f4a..0000000 --- a/tuning_box/cli/base.py +++ /dev/null @@ -1,165 +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 abc -import json -import yaml - -from cliff import command -from cliff import lister -from cliff import show -from fuelclient.cli import error as fc_error -from fuelclient.common import data_utils -import six - - -def level_converter(value): - levels = [] - for part in value.split(','): - spl = part.split("=", 1) - if len(spl) != 2: - raise TypeError("Levels list should be in format " - "level1=value1,level2=value2") - levels.append(tuple(spl)) - return levels - -try: - text_type = unicode -except NameError: - text_type = str - - -def format_output(output, format_): - if format_ == 'plain': - if output is None: - return '' - if isinstance(output, text_type): - if text_type is str: - return output - else: - return output.encode('utf-8') - format_ = 'json' - # numbers, booleans, lists and dicts will be represented as JSON - if format_ == 'json': - return json.dumps(output) - if format_ == 'yaml': - # Usage of safe_dump here is crucial since PyYAML emits - # "!!python/unicode" objects from unicode strings by defaul - return yaml.safe_dump(output, default_flow_style=False) - raise RuntimeError("Unknown format '{}'".format(format_)) - - -class BaseCommand(command.Command): - - def get_client(self): - return self.app.client - - def _parse_comma_separated(self, parsed_args, param_name, cast_to): - param = getattr(parsed_args, param_name) - if param is None or param == '[]': - return [] - result = six.moves.map(six.text_type.strip, - six.text_type(param).split(',')) - return list(six.moves.map(cast_to, result)) - - def read_json(self): - return json.load(self.app.stdin) - - def read_yaml(self): - docs_gen = yaml.safe_load_all(self.app.stdin) - doc = next(docs_gen) - guard = object() - if next(docs_gen, guard) is not guard: - self.app.stderr.write("Warning: will use only first " - "document from YAML stream") - return doc - - -class BaseOneCommand(BaseCommand): - - @abc.abstractproperty - def base_url(self): - """Base url for request operations""" - - @abc.abstractproperty - def entity_name(self): - """Name of the TuningBox entity""" - - def get_parser(self, *args, **kwargs): - parser = super(BaseOneCommand, self).get_parser(*args, **kwargs) - parser.add_argument( - 'id', - type=int, - help='Id of the {0}'.format(self.entity_name)) - return parser - - def get_url(self, parsed_args): - return '{0}/{1}'.format(self.base_url, parsed_args.id) - - def get_deletion_message(self, parsed_args): - return '{0} with id {1} was deleted\n'.format( - self.entity_name.capitalize(), parsed_args.id) - - def get_update_message(self, parsed_args): - return '{0} with id {1} was updated\n'.format( - self.entity_name.capitalize(), parsed_args.id) - - -class BaseDeleteCommand(BaseOneCommand): - """Deletes entity with the specified id.""" - - def take_action(self, parsed_args): - result = self.get_client().delete(self.get_url(parsed_args)) - if result is None: - result = self.get_deletion_message(parsed_args) - self.app.stdout.write(six.text_type(result)) - - -class BaseListCommand(BaseCommand, lister.Lister): - - def take_action(self, parsed_args): - result = self.get_client().get(self.base_url) - try: - data = data_utils.get_display_data_multi(self.columns, result) - return self.columns, data - except fc_error.BadDataException: - return zip(*result.items()) - - -class BaseShowCommand(BaseOneCommand, show.ShowOne): - - def take_action(self, parsed_args): - result = self.get_client().get(self.get_url(parsed_args)) - try: - data = data_utils.get_display_data_single(self.columns, result) - return self.columns, data - except fc_error.BadDataException: - return zip(*result.items()) - - -class FormattedCommand(BaseCommand): - format_choices = ('json', 'yaml', 'plain') - - def get_parser(self, *args, **kwargs): - parser = super(FormattedCommand, self).get_parser(*args, **kwargs) - parser.add_argument( - '-f', '--format', - choices=self.format_choices, - default='json', - help="Desired format for return value", - ) - return parser - - def run(self, parsed_args): - res = self.take_action(parsed_args) - self.app.stdout.write(format_output(res, parsed_args.format)) - return 0 diff --git a/tuning_box/cli/components.py b/tuning_box/cli/components.py deleted file mode 100644 index e3a3fca..0000000 --- a/tuning_box/cli/components.py +++ /dev/null @@ -1,89 +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 cliff import show -import six - -from tuning_box.cli import base - - -class ComponentsCommand(base.BaseCommand): - entity_name = 'component' - base_url = '/components' - columns = ('id', 'name', 'resource_definitions') - - -class ListComponents(ComponentsCommand, base.BaseListCommand): - pass - - -class ShowComponent(ComponentsCommand, base.BaseShowCommand): - pass - - -class DeleteComponent(ComponentsCommand, base.BaseDeleteCommand): - pass - - -class CreateComponent(ComponentsCommand, show.ShowOne): - - def get_parser(self, *args, **kwargs): - parser = super(CreateComponent, self).get_parser( - *args, **kwargs) - parser.add_argument( - '-n', '--name', - type=str, - help="Component name" - ) - return parser - - def take_action(self, parsed_args): - result = self.get_client().post( - self.base_url, {'name': parsed_args.name, - 'resource_definitions': []}) - return zip(*result.items()) - - -class UpdateComponent(ComponentsCommand, base.BaseOneCommand): - - def get_parser(self, *args, **kwargs): - parser = super(UpdateComponent, self).get_parser( - *args, **kwargs) - parser.add_argument( - '-n', '--name', - type=str, - help="Component name" - ) - parser.add_argument( - '-r', '--resource-definitions', - dest='resources', - type=str, - help="Comma separated resource definitions IDs. " - "Set parameter to [] if you want to pass empty list", - ) - return parser - - def take_action(self, parsed_args): - data = {} - if parsed_args.name is not None: - data['name'] = parsed_args.name - if parsed_args.resources is not None: - data['resource_definitions'] = [] - res_def_ids = self._parse_comma_separated( - parsed_args, 'resources', int) - for res_def_id in res_def_ids: - data['resource_definitions'].append({'id': res_def_id}) - - result = self.get_client().patch(self.get_url(parsed_args), data) - if result is None: - result = self.get_update_message(parsed_args) - self.app.stdout.write(six.text_type(result)) diff --git a/tuning_box/cli/environments.py b/tuning_box/cli/environments.py deleted file mode 100644 index 03e2f2a..0000000 --- a/tuning_box/cli/environments.py +++ /dev/null @@ -1,100 +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 cliff import show -import six - -from tuning_box.cli import base - - -class EnvironmentsCommand(base.BaseCommand): - entity_name = 'environment' - base_url = '/environments' - columns = ('id', 'components', 'hierarchy_levels') - - -class ListEnvironments(EnvironmentsCommand, base.BaseListCommand): - pass - - -class ShowEnvironment(EnvironmentsCommand, base.BaseShowCommand): - pass - - -class DeleteEnvironment(EnvironmentsCommand, base.BaseDeleteCommand): - pass - - -class CreateEnvironment(EnvironmentsCommand, show.ShowOne): - - def get_parser(self, *args, **kwargs): - parser = super(CreateEnvironment, self).get_parser( - *args, **kwargs) - parser.add_argument( - '-i', '--components', - type=str, - help="Comma separated components IDs", - ) - parser.add_argument( - '-l', '--levels', - type=str, - help="Comma separated levels names", - ) - return parser - - def take_action(self, parsed_args): - levels = self._parse_comma_separated( - parsed_args, 'levels', six.text_type) - components = self._parse_comma_separated( - parsed_args, 'components', int) - - result = self.get_client().post( - self.base_url, - {'hierarchy_levels': levels, 'components': components} - ) - return zip(*result.items()) - - -class UpdateEnvironment(EnvironmentsCommand, base.BaseOneCommand): - - def get_parser(self, *args, **kwargs): - parser = super(UpdateEnvironment, self).get_parser( - *args, **kwargs) - parser.add_argument( - '-i', '--components', - dest='components', - type=str, - help="Comma separated components IDs. " - "Set parameter to [] if you want to pass empty list", - ) - parser.add_argument( - '-l', '--levels', - type=str, - dest='levels', - help="Comma separated levels names " - "Set parameter to [] if you want to pass empty list", - ) - return parser - - def take_action(self, parsed_args): - data = {} - if parsed_args.levels is not None: - data['hierarchy_levels'] = self._parse_comma_separated( - parsed_args, 'levels', six.text_type) - if parsed_args.components is not None: - data['components'] = self._parse_comma_separated( - parsed_args, 'components', int) - - result = self.get_client().patch(self.get_url(parsed_args), data) - if result is None: - result = self.get_update_message(parsed_args) - self.app.stdout.write(six.text_type(result)) diff --git a/tuning_box/cli/errors.py b/tuning_box/cli/errors.py deleted file mode 100644 index fae79a4..0000000 --- a/tuning_box/cli/errors.py +++ /dev/null @@ -1,23 +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. - - -class TuningBoxCliError(Exception): - pass - - -class IncompatibleParams(TuningBoxCliError): - pass - - -class UnsupportedDataType(TuningBoxCliError): - pass diff --git a/tuning_box/cli/hierarchy_levels.py b/tuning_box/cli/hierarchy_levels.py deleted file mode 100644 index 1c473ee..0000000 --- a/tuning_box/cli/hierarchy_levels.py +++ /dev/null @@ -1,71 +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 cliff import lister -from cliff import show -from fuelclient.cli import error as fc_error -from fuelclient.common import data_utils - -from tuning_box.cli import base - - -class HierarchyLevelsCommand(base.BaseCommand): - columns = ('id', 'name', 'parent', 'values') - - def get_parser(self, *args, **kwargs): - parser = super(HierarchyLevelsCommand, self).get_parser( - *args, **kwargs) - parser.add_argument( - '-e', '--env', - type=int, - required=True, - help="ID of environment to get data from", - ) - return parser - - def get_base_url(self, parsed_args): - return '/environments/{}/hierarchy_levels'.format(parsed_args.env) - - -class ListHierarchyLevels(HierarchyLevelsCommand, lister.Lister): - - def take_action(self, parsed_args): - result = self.get_client().get(self.get_base_url(parsed_args)) - try: - data = data_utils.get_display_data_multi(self.columns, result) - return self.columns, data - except fc_error.BadDataException: - return zip(*result.items()) - - -class ShowHierarchyLevel(HierarchyLevelsCommand, show.ShowOne): - - def get_parser(self, *args, **kwargs): - parser = super(ShowHierarchyLevel, self).get_parser(*args, **kwargs) - parser.add_argument( - 'name', - type=str, - help='Hierarchy level name' - ) - return parser - - def get_url(self, parsed_args): - base_url = self.get_base_url(parsed_args) - return base_url + '/{0}'.format(parsed_args.name) - - def take_action(self, parsed_args): - result = self.get_client().get(self.get_url(parsed_args)) - try: - data = data_utils.get_display_data_single(self.columns, result) - return self.columns, data - except fc_error.BadDataException: - return zip(*result.items()) diff --git a/tuning_box/cli/resource_definitions.py b/tuning_box/cli/resource_definitions.py deleted file mode 100644 index 4537539..0000000 --- a/tuning_box/cli/resource_definitions.py +++ /dev/null @@ -1,150 +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 json -import yaml - -from cliff import show -import six - -from tuning_box.cli import base -from tuning_box.cli import errors - - -class ResourceDefinitionsCommand(base.BaseCommand): - entity_name = 'resource_definition' - base_url = '/resource_definitions' - columns = ('id', 'name', 'component_id', 'content') - - -class ListResourceDefinitions(ResourceDefinitionsCommand, - base.BaseListCommand): - pass - - -class ShowResourceDefinition(ResourceDefinitionsCommand, - base.BaseShowCommand): - pass - - -class DeleteResourceDefinition(ResourceDefinitionsCommand, - base.BaseDeleteCommand): - pass - - -class ModifyResourceDefinitionCommand(ResourceDefinitionsCommand): - - def get_parser(self, *args, **kwargs): - parser = super(ModifyResourceDefinitionCommand, self).get_parser( - *args, **kwargs) - parser.add_argument( - '-n', '--name', - dest='name', - type=str, - help="Resource definition name" - ) - parser.add_argument( - '-i', '--component-id', - dest='component_id', - type=int, - help="Component Id" - ) - parser.add_argument( - '-p', '--content', - dest='content', - type=str, - help="Content to be set" - ) - parser.add_argument( - '-t', '--type', - choices=('json', 'yaml'), - help="Content type" - ) - parser.add_argument( - '-d', '--data-format', - dest='data_format', - choices=('json', 'yaml'), - help="Format of data passed to stdin to be set to content" - ) - return parser - - def verify_arguments(self, parsed_args): - if parsed_args.content is not None: - if parsed_args.data_format is not None: - raise errors.IncompatibleParams( - "You shouldn't specify --data-format if you pass " - "content in command line, specify --type instead." - ) - elif parsed_args.type is None: - raise errors.IncompatibleParams( - "You should specify --type if you pass " - "content in command line." - ) - elif parsed_args.data_format is None: - raise errors.IncompatibleParams( - "You should specify --data-format for stdin data if you " - "don't pass content in command line." - ) - elif parsed_args.type is not None: - raise errors.IncompatibleParams( - "--type and --data-format parameters can't " - "be used together." - ) - - def get_content(self, parsed_args): - type_ = parsed_args.type - if type_ == 'json': - return json.loads(parsed_args.content) - elif type_ == 'yaml': - return yaml.safe_load(parsed_args.content) - elif type_ is None: - data_format = parsed_args.data_format - if data_format == 'json': - return self.read_json() - elif data_format == 'yaml': - return self.read_yaml() - raise errors.UnsupportedDataType( - "Unsupported format: {0}".format(data_format) - ) - raise errors.UnsupportedDataType("Unsupported type: {0}".format(type_)) - - -class CreateResourceDefinition(ModifyResourceDefinitionCommand, show.ShowOne): - - def take_action(self, parsed_args): - self.verify_arguments(parsed_args) - data = { - 'name': parsed_args.name, - 'component_id': parsed_args.component_id, - 'content': self.get_content(parsed_args) - } - result = self.get_client().post(self.base_url, data) - return zip(*result.items()) - - -class UpdateResourceDefinition(ModifyResourceDefinitionCommand, - base.BaseOneCommand): - - def take_action(self, parsed_args): - data = {} - if parsed_args.name is not None: - data['name'] = parsed_args.name - if parsed_args.component_id is not None: - data['component_id'] = parsed_args.component_id - if (parsed_args.content is not None - or parsed_args.data_format is not None): - data['content'] = self.get_content(parsed_args) - - result = self.get_client().patch(self.get_url(parsed_args), data) - if result is None: - result = self.get_update_message(parsed_args) - self.app.stdout.write(six.text_type(result)) diff --git a/tuning_box/cli/resources.py b/tuning_box/cli/resources.py deleted file mode 100644 index 28e7f39..0000000 --- a/tuning_box/cli/resources.py +++ /dev/null @@ -1,257 +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 json -import six -import yaml - -from cliff import show -from fuelclient.cli import error as fc_error -from fuelclient.common import data_utils - -from tuning_box.cli.base import BaseCommand -from tuning_box.cli.base import level_converter -from tuning_box.library.resource_values import ResourceValues - - -class ResourcesCommand(BaseCommand): - def get_parser(self, *args, **kwargs): - parser = super(ResourcesCommand, self).get_parser(*args, **kwargs) - parser.add_argument( - '-e', '--env', - type=int, - required=True, - help="ID of environment to get data from", - ) - parser.add_argument( - '-l', '--level', - type=level_converter, - default=[], - help=("Level to get data from. Should be in format " - "parent_level=parent1,level=value2"), - ) - parser.add_argument( - '-r', '--resource', - type=str, - required=True, - help="Name or ID of resource to get data from", - ) - return parser - - def get_resource_url(self, parsed_args, last_part='values'): - return '/environments/{}/{}resources/{}/{}'.format( - parsed_args.env, - ''.join('{}/{}/'.format(*e) for e in parsed_args.level), - parsed_args.resource, - last_part, - ) - - -class Get(show.ShowOne, ResourcesCommand): - - def get_parser(self, *args, **kwargs): - parser = super(Get, self).get_parser(*args, **kwargs) - parser.add_argument( - '-k', '--key', - type=str, - help="Name of key to get from the resource. For fetching nested " - "key value use '{0}' as delimiter. Example: " - "k1{0}k2{0}k3".format(ResourceValues.KEYS_PATH_DELIMITER), - ) - parser.add_argument( - '-s', '--show-lookup', - dest='show_lookup', - help="Show lookup path for the value in the result", - action='store_true' - ) - return parser - - def take_action(self, parsed_args): - params = {'effective': True} - if parsed_args.show_lookup: - params['show_lookup'] = True - if parsed_args.key: - params['key'] = parsed_args.key - response = self.get_client().get( - self.get_resource_url(parsed_args), - params=params - ) - if parsed_args.key: - result = {parsed_args.key: response} - else: - result = response - columns = sorted(result) - try: - data = data_utils.get_display_data_single(columns, result) - return columns, data - except fc_error.BadDataException: - return zip(*response.items()) - - -class Set(ResourcesCommand): - - url_last_part = 'values' - entity_name = 'ResourceValue' - - def get_parser(self, *args, **kwargs): - parser = super(Set, self).get_parser(*args, **kwargs) - parser.add_argument( - '-k', '--key', - type=str, - help="Name of key to get from the resource. For set nested " - "key value use '{0}' as delimiter. Example: " - "k1{0}k2{0}k3".format(ResourceValues.KEYS_PATH_DELIMITER), - ) - parser.add_argument( - '-v', '--value', - type=str, - help="Value for a key to set in the resource", - ) - parser.add_argument( - '-t', '--type', - choices=('null', 'int', 'str', 'json', 'yaml', 'bool'), - help="Type of value passed in --value", - ) - parser.add_argument( - '-f', '--format', - choices=('json', 'yaml'), - help="Format of data passed to stdin", - ) - return parser - - def verify_arguments(self, parsed_args): - if parsed_args.value is not None: # have value - if parsed_args.format is not None: - raise Exception("You shouldn't specify --format if you pass " - "value in command line, specify --type " - "instead.") - if parsed_args.type == 'null': - raise Exception("You shouldn't specify a value for 'null' type" - " because there can be only one.") - if parsed_args.type is None: - raise Exception("Please specify type of value passed in " - "--value argument to properly represent it" - " in the storage.") - elif parsed_args.type != 'null': # have no value - if parsed_args.type is not None: - raise Exception("--type specifies type for value provided in " - "--value but there is not --value argument") - if parsed_args.format is None: - raise Exception("Please specify format of data passed to stdin" - " to replace the key.") - - def get_value_to_set(self, parsed_args): - type_ = parsed_args.type - if type_ == 'null': - return None - elif type_ == 'bool': - if parsed_args.value.lower() in ('1', 'true'): - return True - elif parsed_args.value.lower() in ('0', 'false'): - return False - else: - raise Exception( - "Bad value for 'bool' type: '{}'. Should be one of '0', " - "'1', 'false', 'true'.".format(parsed_args.value)) - elif type_ == 'int': - return int(parsed_args.value) - elif type_ == 'str': - return parsed_args.value - elif type_ == 'json': - return json.loads(parsed_args.value) - elif type_ == 'yaml': - return yaml.safe_load(parsed_args.value) - elif type_ is None: - if parsed_args.format == 'json': - return json.load(self.app.stdin) - elif parsed_args.format == 'yaml': - docs_gen = yaml.safe_load_all(self.app.stdin) - doc = next(docs_gen) - guard = object() - if next(docs_gen, guard) is not guard: - self.app.stderr.write("Warning: will use only first " - "document from YAML stream") - return doc - assert False, "Shouldn't get here" - - def get_update_message(self, parsed_args): - if parsed_args.key is None: - message = '{0} was set\n'.format(self.entity_name) - else: - message = '{0} for key {1} was set\n'.format( - self.entity_name, parsed_args.key) - return message - - def take_action(self, parsed_args): - self.verify_arguments(parsed_args) - value = self.get_value_to_set(parsed_args) - - client = self.get_client() - resource_url = self.get_resource_url(parsed_args, self.url_last_part) - if parsed_args.key: - keys_path = parsed_args.key.split( - ResourceValues.KEYS_PATH_DELIMITER) - keys_path.append(value) - resource_url += '/keys/set' - result = client.patch(resource_url, [keys_path]) - else: - result = client.put(resource_url, value) - if result is None: - result = self.get_update_message(parsed_args) - self.app.stdout.write(six.text_type(result)) - - -class Delete(ResourcesCommand): - - url_last_part = 'values' - entity_name = 'ResourceValue' - - def get_parser(self, *args, **kwargs): - parser = super(Delete, self).get_parser(*args, **kwargs) - parser.add_argument( - '-k', '--key', - type=str, - help="Name of key to delete from the resource. For nested " - "key deletion use '{0}' as delimiter. Example: " - "k1{0}k2{0}k3".format(ResourceValues.KEYS_PATH_DELIMITER), - required=True - ) - return parser - - def get_deletion_message(self, parsed_args): - return '{0} for key {1} was deleted\n'.format( - self.entity_name, parsed_args.key) - - def get_resource_url(self, parsed_args, last_part='values'): - url = super(Delete, self).get_resource_url( - parsed_args, last_part=last_part) - return url + '/keys/delete' - - def take_action(self, parsed_args): - client = self.get_client() - resource_url = self.get_resource_url(parsed_args, self.url_last_part) - keys_path = parsed_args.key.split( - ResourceValues.KEYS_PATH_DELIMITER) - result = client.patch(resource_url, [keys_path]) - if result is None: - result = self.get_deletion_message(parsed_args) - self.app.stdout.write(six.text_type(result)) - - -class Override(Set): - url_last_part = 'overrides' - entity_name = 'ResourceOverride' - - -class DeleteOverride(Delete): - url_last_part = 'overrides' - entity_name = 'ResourceOverride' diff --git a/tuning_box/client.py b/tuning_box/client.py deleted file mode 100644 index b57717e..0000000 --- a/tuning_box/client.py +++ /dev/null @@ -1,54 +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 requests - - -class HTTPClient(object): - def __init__(self, base_url): - self.base_url = base_url - self.session = self.get_session() - - def get_session(self): - session = requests.Session() - session.headers.update(self.default_headers()) - return session - - def default_headers(self): - return { - "Content-Type": "application/json", - "Accept": "application/json", - } - - def request(self, method, url, **kwargs): - full_url = self.base_url + url - resp = self.session.request(method, full_url, **kwargs) - if resp.headers.get('Content-Type') == 'application/json' and \ - resp.content: - return resp.json() - else: - return None - - def get(self, url, params=None): - return self.request('GET', url, params=params) - - def put(self, url, body): - return self.request('PUT', url, json=body) - - def post(self, url, body): - return self.request('POST', url, json=body) - - def patch(self, url, body): - return self.request('PATCH', url, json=body) - - def delete(self, url): - return self.request('DELETE', url) diff --git a/tuning_box/converters.py b/tuning_box/converters.py deleted file mode 100644 index a5fa766..0000000 --- a/tuning_box/converters.py +++ /dev/null @@ -1,77 +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 itertools - -from werkzeug import routing -from werkzeug import urls - -from tuning_box.library import resource_keys_operation - - -class Levels(routing.BaseConverter): - """Converter that maps nested levels to list of tuples. - - For example, "level1/value1/level2/value2/" is mapped to - [("level1", "value1"), ("level2", "value2")]. - - Note that since it can be empty it includes following "/": - - Rule('/smth/values') - - will parse "/smth/values" and "/smth/level1/value1/values". - """ - - regex = "([^/]+/[^/]+/)*" - - def to_python(self, value): - spl = value.split('/') - return list(zip(spl[::2], spl[1::2])) - - def to_url(self, value): - parts = itertools.chain.from_iterable(value) - quoted_parts = (urls.url_quote(p, charset=self.map.charset, safe='') - for p in parts) - return ''.join(p + '/' for p in quoted_parts) - - -class IdOrName(routing.BaseConverter): - """Converter that matches either int or URL part including "/" as string""" - - regex = '[^/].*?' - - def to_python(self, value): - try: - return int(value) - except ValueError: - return value - - def to_url(self, value): - return super(IdOrName, self).to_url(str(value)) - - -class KeysOperation(routing.BaseConverter): - """Converter that matches keys operations - - Allowed operations: add, delete, erase - """ - - regex = '(' + ')|('.join( - resource_keys_operation.KeysOperationMixin.OPERATIONS - ) + ')' - - -ALL = { - 'levels': Levels, - 'id_or_name': IdOrName, - 'keys_operation': KeysOperation -} diff --git a/tuning_box/db.py b/tuning_box/db.py deleted file mode 100644 index 6ee5f49..0000000 --- a/tuning_box/db.py +++ /dev/null @@ -1,280 +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 functools -import json -import re - -import flask_sqlalchemy -import sqlalchemy -import sqlalchemy.event -import sqlalchemy.ext.declarative as sa_decl -from sqlalchemy.orm import exc as orm_exc -from sqlalchemy import types - -from tuning_box import errors - -try: - from importlib import reload -except ImportError: - pass # in 2.x reload is builtin - -db = flask_sqlalchemy.SQLAlchemy(session_options={'autocommit': True}) -pk_type = db.Integer -pk = functools.partial(db.Column, pk_type, primary_key=True) - - -def with_transaction(f): - @functools.wraps(f) - def inner(*args, **kwargs): - with db.session.begin(): - return f(*args, **kwargs) - - return inner - - -def fk(cls, **kwargs): - ondelete = kwargs.pop('ondelete', None) - return db.Column(pk_type, db.ForeignKey(cls.id, ondelete=ondelete), - **kwargs) - - -class BaseQuery(flask_sqlalchemy.BaseQuery): - def get_by_id_or_name(self, id_or_name, fail_on_none=True): - if isinstance(id_or_name, int): - result = self.get(id_or_name) - else: - result = self.filter_by(name=id_or_name).one_or_none() - if fail_on_none and result is None: - raise errors.TuningboxNotFound( - "Object not found by name or id {0}".format(id_or_name) - ) - return result - - # one_or_none is not present in sqlalchemy < 1.0.9 - def one_or_none(self): - ret = list(self) - l = len(ret) - if l == 1: - return ret[0] - elif l == 0: - return None - else: - raise orm_exc.MultipleResultsFound( - "Multiple rows were found for one_or_none()") - - -def _tablename(cls_name): - def repl(match): - res = match.group().lower() - if match.start(): - res = "_" + res - return res - - return ModelMixin.table_prefix + re.sub("[A-Z]", repl, cls_name) - - -class ModelMixin(object): - query_class = BaseQuery - id = db.Column(pk_type, primary_key=True) - - try: - table_prefix = ModelMixin.table_prefix # keep prefix during reload - except NameError: - table_prefix = "" # first import, not reload - - @sa_decl.declared_attr - def __tablename__(cls): - return _tablename(cls.__name__) - - def __repr__(self): - args = [] - for attr in self.__repr_attrs__: - value = getattr(self, attr) - if attr == 'content' and value is not None and len(value) > 15: - value = value[:10] + '<...>' - args.append('{}={!r}'.format(attr, value)) - return '{}({})'.format(type(self).__name__, ','.join(args)) - - -class Json(types.TypeDecorator): - impl = db.Text - - def process_bind_param(self, value, dialect): - return json.dumps(value) - - def process_result_value(self, value, dialect): - return json.loads(value) - - -# Component registry - - -class Component(ModelMixin, db.Model): - name = db.Column(db.String(128), unique=True) - - __repr_attrs__ = ('id', 'name') - - -class ResourceDefinition(ModelMixin, db.Model): - name = db.Column(db.String(128)) - component_id = fk(Component, ondelete='CASCADE') - component = db.relationship( - Component, - backref=sqlalchemy.orm.backref('resource_definitions', - cascade='all, delete-orphan') - ) - - content = db.Column(Json) - - __repr_attrs__ = ('id', 'name', 'component', 'content') - -# Environment data storage - - -class Environment(ModelMixin, db.Model): - @sa_decl.declared_attr - def environment_components_table(cls): - return db.Table( - _tablename('environment_components'), - db.Column('environment_id', pk_type, - db.ForeignKey(cls.id, ondelete='CASCADE')), - db.Column('component_id', pk_type, - db.ForeignKey(Component.id, ondelete='CASCADE')), - ) - - @sa_decl.declared_attr - def components(cls): - return db.relationship( - Component, secondary=cls.environment_components_table) - - __repr_attrs__ = ('id',) - - -class EnvironmentHierarchyLevel(ModelMixin, db.Model): - environment_id = fk(Environment, ondelete='CASCADE') - environment = db.relationship( - Environment, - backref=sqlalchemy.orm.backref('hierarchy_levels', - cascade="all, delete-orphan") - ) - name = db.Column(db.String(128)) - - @sa_decl.declared_attr - def parent_id(cls): - return db.Column(pk_type, db.ForeignKey(cls.id)) - - @sa_decl.declared_attr - def parent(cls): - return db.relationship(cls, - backref=db.backref('child', uselist=False), - remote_side=cls.id) - - __table_args__ = ( - db.UniqueConstraint('environment_id', 'name'), - db.UniqueConstraint('environment_id', 'parent_id'), - ) - __repr_attrs__ = ('id', 'environment', 'parent', 'name') - - @classmethod - def get_for_environment(cls, environment): - query = cls.query.filter_by(environment=environment, parent=None) - root_level = query.one_or_none() - if not root_level: - return [] - env_levels = [root_level] - while env_levels[-1].child: - env_levels.append(env_levels[-1].child) - return env_levels - - values = db.relationship('EnvironmentHierarchyLevelValue') - - -class EnvironmentHierarchyLevelValue(ModelMixin, db.Model): - level_id = fk(EnvironmentHierarchyLevel, ondelete='CASCADE') - level = db.relationship(EnvironmentHierarchyLevel) - value = db.Column(db.String(128)) - - __table_args__ = ( - db.UniqueConstraint('level_id', 'value'), - ) - - __repr_attrs__ = ('id', 'level', 'value') - - -class ResourceValues(ModelMixin, db.Model): - environment_id = fk(Environment, ondelete='CASCADE') - environment = db.relationship(Environment) - resource_definition_id = fk(ResourceDefinition, ondelete='CASCADE') - resource_definition = db.relationship(ResourceDefinition) - level_value_id = fk(EnvironmentHierarchyLevelValue, ondelete='CASCADE') - level_value = db.relationship('EnvironmentHierarchyLevelValue') - values = db.Column(Json, server_default='{}') - overrides = db.Column(Json, server_default='{}') - - __table_args__ = ( - db.UniqueConstraint(environment_id, resource_definition_id, - level_value_id), - ) - __repr_attrs__ = ('id', 'environment', 'resource_definition', - 'level_value', 'values') - - -def get_or_create(cls, **attrs): - with db.session.begin(nested=True): - item = cls.query.filter_by(**attrs).one_or_none() - if not item: - item = cls(**attrs) - db.session.add(item) - # TODO(yorik-sar): handle constraints failure in case of - # race condition - return item - - -def fix_sqlite(): - engine = db.engine - - @sqlalchemy.event.listens_for(engine, "connect") - def _connect(dbapi_connection, connection_record): - dbapi_connection.isolation_level = None - - @sqlalchemy.event.listens_for(engine, "begin") - def _begin(conn): - conn.execute("BEGIN") - - -def prefix_tables(module, prefix): - ModelMixin.table_prefix = prefix - reload(module) - - -def unprefix_tables(module): - ModelMixin.table_prefix = "" - reload(module) - - -def get_or_404(cls, ident): - result = cls.query.get(ident) - if result is None: - raise errors.TuningboxNotFound( - "{0} not found by id {1}".format(cls.__name__, ident) - ) - return result - - -def find_or_404(cls, **attrs): - item = cls.query.filter_by(**attrs).one_or_none() - if not item: - raise errors.TuningboxNotFound( - "{0} not found by {1}".format(cls.__name__, attrs) - ) - return item diff --git a/tuning_box/errors.py b/tuning_box/errors.py deleted file mode 100644 index 65e8324..0000000 --- a/tuning_box/errors.py +++ /dev/null @@ -1,47 +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. - - -class BaseTuningboxError(Exception): - pass - - -class TuningboxIntegrityError(BaseTuningboxError): - pass - - -class TuningboxNotFound(BaseTuningboxError): - pass - - -class RequestValidationError(BaseTuningboxError): - pass - - -class KeysOperationError(BaseTuningboxError): - pass - - -class UnknownKeysOperation(KeysOperationError): - pass - - -class KeysPathNotExisted(KeysOperationError): - pass - - -class KeysPathInvalid(KeysOperationError): - pass - - -class KeysPathUnreachable(KeysOperationError): - pass diff --git a/tuning_box/fuelclient.py b/tuning_box/fuelclient.py deleted file mode 100644 index 757e80d..0000000 --- a/tuning_box/fuelclient.py +++ /dev/null @@ -1,174 +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 __future__ import absolute_import - -from cliff import command -from fuelclient import client as fc_client - -from tuning_box import cli -from tuning_box.cli import base as cli_base -from tuning_box.cli import components -from tuning_box.cli import environments -from tuning_box.cli import hierarchy_levels -from tuning_box.cli import resource_definitions -from tuning_box.cli import resources -from tuning_box import client as tb_client - - -class FuelHTTPClient(tb_client.HTTPClient): - if hasattr(fc_client, 'DefaultAPIClient'): - # Handling python-fuelclient version >= 10.0 - fc_api = fc_client.DefaultAPIClient - else: - # Handling python-fuelclient version <= 9.0 - fc_api = fc_client.APIClient - - def __init__(self): - service_catalog = self.fc_api.keystone_client.service_catalog - base_url = service_catalog.url_for( - service_type='config', - endpoint_type='publicURL', - ) - super(FuelHTTPClient, self).__init__(base_url) - - def default_headers(self): - headers = super(FuelHTTPClient, self).default_headers() - if self.fc_api.auth_token: - headers['X-Auth-Token'] = self.fc_api.auth_token - return headers - - -class FuelBaseCommand(cli_base.BaseCommand): - def get_client(self): - return FuelHTTPClient() - - -class Get(FuelBaseCommand, resources.Get): - pass - - -class Set(FuelBaseCommand, resources.Set): - pass - - -class Delete(FuelBaseCommand, resources.Delete): - pass - - -class Override(FuelBaseCommand, resources.Override): - pass - - -class DeleteOverride(FuelBaseCommand, resources.DeleteOverride): - pass - - -class CreateEnvironment(FuelBaseCommand, environments.CreateEnvironment): - pass - - -class ListEnvironments(FuelBaseCommand, environments.ListEnvironments): - pass - - -class ShowEnvironment(FuelBaseCommand, environments.ShowEnvironment): - pass - - -class DeleteEnvironment(FuelBaseCommand, environments.DeleteEnvironment): - pass - - -class UpdateEnvironment(FuelBaseCommand, environments.UpdateEnvironment): - pass - - -class CreateComponent(FuelBaseCommand, components.CreateComponent): - pass - - -class ListComponents(FuelBaseCommand, components.ListComponents): - pass - - -class ShowComponent(FuelBaseCommand, components.ShowComponent): - pass - - -class DeleteComponent(FuelBaseCommand, components.DeleteComponent): - pass - - -class UpdateComponent(FuelBaseCommand, components.UpdateComponent): - pass - - -class CreateResourceDefinition( - FuelBaseCommand, - resource_definitions.CreateResourceDefinition -): - pass - - -class ListResourceDefinitions( - FuelBaseCommand, - resource_definitions.ListResourceDefinitions -): - pass - - -class ShowResourceDefinition( - FuelBaseCommand, - resource_definitions.ShowResourceDefinition -): - pass - - -class DeleteResourceDefinition( - FuelBaseCommand, - resource_definitions.DeleteResourceDefinition -): - pass - - -class UpdateResourceDefinition( - FuelBaseCommand, - resource_definitions.UpdateResourceDefinition -): - pass - - -class ListHierarchyLevels( - FuelBaseCommand, - hierarchy_levels.ListHierarchyLevels -): - pass - - -class ShowHierarchyLevel( - FuelBaseCommand, - hierarchy_levels.ShowHierarchyLevel -): - pass - - -class Config(command.Command): - def get_parser(self, *args, **kwargs): - parser = super(Config, self).get_parser(*args, **kwargs) - parser.add_argument('args', nargs='*') - return parser - - def take_action(self, parsed_args): - client = FuelHTTPClient() - app = cli.TuningBoxApp(client) - app.run(parsed_args.args) diff --git a/tuning_box/library/__init__.py b/tuning_box/library/__init__.py deleted file mode 100644 index dbf51dd..0000000 --- a/tuning_box/library/__init__.py +++ /dev/null @@ -1,100 +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 sqlalchemy.orm import exc as sa_exc - -from tuning_box import db -from tuning_box import errors -from tuning_box.library import hierarchy_levels - - -def load_objects(model, ids): - if ids is None: - return None - result = [] - for obj_id in ids: - obj = model.query.filter_by(id=obj_id).one_or_none() - if obj is None: - raise errors.TuningboxNotFound( - "{0} not found by identifier: " - "{1}".format(model.__tablename__, obj_id) - ) - result.append(obj) - return result - - -def load_objects_by_id_or_name(model, identifiers): - if identifiers is None: - return None - result = [] - for identifier in identifiers: - obj = model.query.get_by_id_or_name( - identifier, fail_on_none=False) - if obj is None: - raise errors.TuningboxNotFound( - "{0} not found by identifier: " - "{1}".format(model.__tablename__, identifier) - ) - result.append(obj) - return result - - -def get_resource_definition(id_or_name, environment_id): - query = db.ResourceDefinition.query.join(db.Component). \ - join(db.Environment.environment_components_table). \ - filter_by(environment_id=environment_id) - - if isinstance(id_or_name, int): - query = query.filter(db.ResourceDefinition.id == id_or_name) - else: - query = query.filter(db.ResourceDefinition.name == id_or_name) - - result = query.all() - - if not result: - raise errors.TuningboxNotFound( - "{0} not found by {1} in environment {2}".format( - db.ResourceDefinition.__tablename__, - id_or_name, - environment_id - ) - ) - elif len(result) > 1: - raise sa_exc.MultipleResultsFound - - return result[0] - - -def get_resource_values(environment, levels, res_def): - level_value = hierarchy_levels.get_environment_level_value( - environment, levels) - res_values = db.ResourceValues.query.filter_by( - environment_id=environment.id, - resource_definition_id=res_def.id, - level_value=level_value, - ).all() - - if not res_values: - raise errors.TuningboxNotFound( - "Resource values not found by environment {0}, " - "resource definition {1} for levels {2}".format( - environment.id, res_def.id, levels - ) - ) - elif len(res_values) > 1: - raise errors.TuningboxIntegrityError( - "Found more than one resource values for environment {0}, " - "resource definition {1} for levels {2}".format( - environment.id, res_def.id, levels - ) - ) - return res_values[0] diff --git a/tuning_box/library/components.py b/tuning_box/library/components.py deleted file mode 100644 index 0f43204..0000000 --- a/tuning_box/library/components.py +++ /dev/null @@ -1,77 +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 flask -import flask_restful -from flask_restful import fields - -from tuning_box import db -from tuning_box import library -from tuning_box.library import resource_definitions - -component_fields = { - 'id': fields.Integer, - 'name': fields.String, - 'resource_definitions': fields.List(fields.Nested( - resource_definitions.resource_definition_fields - )) -} - - -class ComponentsCollection(flask_restful.Resource): - method_decorators = [flask_restful.marshal_with(component_fields)] - - def get(self): - return db.Component.query.order_by(db.Component.id).all() - - @db.with_transaction - def post(self): - component = db.Component(name=flask.request.json['name']) - component.resource_definitions = [] - for res_def_data in flask.request.json.get('resource_definitions', []): - res_def = db.ResourceDefinition( - name=res_def_data['name'], content=res_def_data.get('content')) - component.resource_definitions.append(res_def) - db.db.session.add(component) - return component, 201 - - -class Component(flask_restful.Resource): - method_decorators = [flask_restful.marshal_with(component_fields)] - - def get(self, component_id): - return db.get_or_404(db.Component, component_id) - - @db.with_transaction - def _perform_update(self, component_id): - component = db.get_or_404(db.Component, component_id) - update_by = flask.request.json - component.name = update_by.get('name', component.name) - res_definitions = update_by.get('resource_definitions') - if res_definitions is not None: - ids = [data['id'] for data in res_definitions] - resources = library.load_objects(db.ResourceDefinition, ids) - component.resource_definitions = resources - - def put(self, component_id): - return self.patch(component_id) - - def patch(self, component_id): - self._perform_update(component_id) - return None, 204 - - @db.with_transaction - def delete(self, component_id): - component = db.get_or_404(db.Component, component_id) - db.db.session.delete(component) - return None, 204 diff --git a/tuning_box/library/environments.py b/tuning_box/library/environments.py deleted file mode 100644 index 35c6d45..0000000 --- a/tuning_box/library/environments.py +++ /dev/null @@ -1,142 +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 flask -import flask_restful -from flask_restful import fields - -from tuning_box import db -from tuning_box import errors -from tuning_box import library - -environment_fields = { - 'id': fields.Integer, - 'components': fields.List(fields.Integer(attribute='id')), - 'hierarchy_levels': fields.List(fields.String(attribute='name')), -} - - -def prepare_env_for_output(env): - # Proper order of levels can't be provided by ORM backref - hierarchy_levels = db.EnvironmentHierarchyLevel.get_for_environment(env) - return {'id': env.id, 'components': env.components, - 'hierarchy_levels': hierarchy_levels} - - -class EnvironmentsCollection(flask_restful.Resource): - method_decorators = [flask_restful.marshal_with(environment_fields)] - - def get(self): - envs = db.Environment.query.order_by(db.Environment.id).all() - result = [] - for env in envs: - result.append(prepare_env_for_output(env)) - return result, 200 - - def _check_components(self, components): - identities = set() - duplicates = set() - id_names = ('id', 'name') - for component in components: - for id_name in id_names: - value = getattr(component, id_name) - - if value not in identities: - identities.add(value) - else: - duplicates.add(value) - if duplicates: - raise errors.TuningboxIntegrityError( - "Components duplicates: {0}".format(duplicates)) - - @db.with_transaction - def post(self): - component_ids = flask.request.json['components'] - components = [db.Component.query.get_by_id_or_name(i) - for i in component_ids] - self._check_components(components) - - hierarchy_levels = [] - level = None - for name in flask.request.json['hierarchy_levels']: - level = db.EnvironmentHierarchyLevel(name=name, parent=level) - hierarchy_levels.append(level) - - environment = db.Environment(components=components, - hierarchy_levels=hierarchy_levels) - if 'id' in flask.request.json: - environment.id = flask.request.json['id'] - db.db.session.add(environment) - return prepare_env_for_output(environment), 201 - - -class Environment(flask_restful.Resource): - method_decorators = [flask_restful.marshal_with(environment_fields)] - - def get(self, environment_id): - env = db.get_or_404(db.Environment, environment_id) - return prepare_env_for_output(env), 200 - - def _update_components(self, environment, components): - if components is not None: - new_components = library.load_objects_by_id_or_name( - db.Component, components) - environment.components = new_components - - def _update_hierarchy_levels(self, environment, hierarchy_levels_names): - if hierarchy_levels_names is not None: - old_hierarchy_levels = db.EnvironmentHierarchyLevel.query.filter( - db.EnvironmentHierarchyLevel.environment_id == environment.id - ).all() - - new_hierarchy_levels = [] - - for level_name in hierarchy_levels_names: - level = db.get_or_create( - db.EnvironmentHierarchyLevel, - name=level_name, - environment=environment - ) - new_hierarchy_levels.append(level) - - parent_id = None - for level in new_hierarchy_levels: - level.parent_id = parent_id - parent_id = level.id - for old_level in old_hierarchy_levels: - if old_level not in new_hierarchy_levels: - db.db.session.delete(old_level) - environment.hierarchy_levels = new_hierarchy_levels - - @db.with_transaction - def _perform_update(self, environment_id): - environment = db.get_or_404(db.Environment, environment_id) - update_by = flask.request.json - - components = update_by.get('components') - self._update_components(environment, components) - - hierarchy_levels = update_by.get('hierarchy_levels') - self._update_hierarchy_levels(environment, hierarchy_levels) - - def put(self, environment_id): - return self.patch(environment_id) - - def patch(self, environment_id): - self._perform_update(environment_id) - return None, 204 - - @db.with_transaction - def delete(self, environment_id): - environment = db.get_or_404(db.Environment, environment_id) - db.db.session.delete(environment) - return None, 204 diff --git a/tuning_box/library/hierarchy_levels.py b/tuning_box/library/hierarchy_levels.py deleted file mode 100644 index 3660d9c..0000000 --- a/tuning_box/library/hierarchy_levels.py +++ /dev/null @@ -1,110 +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 flask -from flask import current_app as app - -import flask_restful -from flask_restful import fields - -from tuning_box import db -from tuning_box import errors - - -def iter_environment_level_values(environment, levels): - app.logger.debug("Getting environment level values. Env: %s, " - "levels: %s", environment.id, levels) - env_levels = db.EnvironmentHierarchyLevel.get_for_environment(environment) - app.logger.debug("Environment levels got. Env: %s, levels: %s", - environment.id, [l.name for l in env_levels]) - - if len(env_levels) < len(levels): - raise errors.TuningboxNotFound( - "Levels {0} can't be matched with " - "environment {1} levels: {2}".format( - [l[0] for l in levels], - environment.id, - [l.name for l in env_levels] - ) - ) - level_pairs = zip(env_levels, levels) - for env_level, (level_name, level_value) in level_pairs: - if env_level.name != level_name: - raise errors.TuningboxNotFound( - "Unexpected level name '{0}'. Expected '{1}'.".format( - level_name, env_level.name) - ) - - level_value_db = db.get_or_create( - db.EnvironmentHierarchyLevelValue, - level=env_level, - value=level_value, - ) - yield level_value_db - - -def get_environment_level_value(environment, levels): - level_value = None - for level_value in iter_environment_level_values(environment, levels): - pass - return level_value - - -environment_hierarchy_level_fields = { - 'id': fields.Integer, - 'name': fields.String, - 'environment_id': fields.Integer, - 'parent': fields.String(attribute='parent.name'), - 'values': fields.List(fields.String(attribute='value')) -} - - -class EnvironmentHierarchyLevelsCollection(flask_restful.Resource): - method_decorators = [ - flask_restful.marshal_with(environment_hierarchy_level_fields) - ] - - def get(self, environment_id): - env = db.get_or_404(db.Environment, environment_id) - return db.EnvironmentHierarchyLevel.get_for_environment(env) - - -class EnvironmentHierarchyLevels(flask_restful.Resource): - method_decorators = [ - flask_restful.marshal_with(environment_hierarchy_level_fields) - ] - - def _get_query_params(self, environment_id, id_or_name): - params = {'environment_id': environment_id} - if isinstance(id_or_name, int): - params['id'] = id_or_name - else: - params['name'] = id_or_name - return params - - def get(self, environment_id, id_or_name): - params = self._get_query_params(environment_id, id_or_name) - level = db.find_or_404(db.EnvironmentHierarchyLevel, **params) - return level - - @db.with_transaction - def _do_update(self, environment_id, id_or_name): - params = self._get_query_params(environment_id, id_or_name) - level = db.find_or_404(db.EnvironmentHierarchyLevel, **params) - level.name = flask.request.json.get('name', level.name) - - def put(self, environment_id, id_or_name): - return self.patch(environment_id, id_or_name) - - def patch(self, environment_id, id_or_name): - self._do_update(environment_id, id_or_name) - return None, 204 diff --git a/tuning_box/library/resource_definitions.py b/tuning_box/library/resource_definitions.py deleted file mode 100644 index c1b4138..0000000 --- a/tuning_box/library/resource_definitions.py +++ /dev/null @@ -1,108 +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 flask -import flask_restful -from flask_restful import fields - -from tuning_box import db -from tuning_box.library import resource_keys_operation - -resource_definition_fields = { - 'id': fields.Integer, - 'name': fields.String, - 'component_id': fields.Integer(default=None), - 'content': fields.Raw, -} - - -class ResourceDefinitionsCollection(flask_restful.Resource): - method_decorators = [ - flask_restful.marshal_with(resource_definition_fields) - ] - - def get(self): - query = db.ResourceDefinition.query - if 'component_id' in flask.request.args: - component_id = flask.request.args.get('component_id') - component_id = component_id or None - query = query.filter( - db.ResourceDefinition.component_id == component_id - ) - return query.all() - - @db.with_transaction - def post(self): - data = dict() - for field_name in resource_definition_fields.keys(): - data[field_name] = flask.request.json.get(field_name, None) - resource_definition = db.ResourceDefinition(**data) - db.db.session.add(resource_definition) - return resource_definition, 201 - - -class ResourceDefinition(flask_restful.Resource): - method_decorators = [ - flask_restful.marshal_with(resource_definition_fields)] - - def get(self, resource_definition_id): - return db.get_or_404(db.ResourceDefinition, resource_definition_id) - - @db.with_transaction - def _perform_update(self, resource_definition_id): - res_definition = db.get_or_404( - db.ResourceDefinition, resource_definition_id) - update_by = flask.request.json - skip_fields = ('id', ) - - for field_name in resource_definition_fields.keys(): - - if field_name in skip_fields: - continue - if field_name in update_by: - setattr( - res_definition, field_name, - update_by.get(field_name) - ) - - def put(self, resource_definition_id): - return self.patch(resource_definition_id) - - def patch(self, resource_definition_id): - self._perform_update(resource_definition_id) - return None, 204 - - @db.with_transaction - def delete(self, resource_definition_id): - res_definition = db.get_or_404( - db.ResourceDefinition, resource_definition_id) - db.db.session.delete(res_definition) - return None, 204 - - -class ResourceDefinitionKeys(flask_restful.Resource, - resource_keys_operation.KeysOperationMixin): - - @db.with_transaction - def _do_update(self, resource_definition_id, operation): - res_definition = db.get_or_404( - db.ResourceDefinition, resource_definition_id) - result = self.perform_operation(operation, res_definition.content, - flask.request.json) - res_definition.content = result - - def put(self, resource_definition_id, operation): - return self.patch(resource_definition_id, operation) - - def patch(self, resource_definition_id, operation): - self._do_update(resource_definition_id, operation) - return None, 204 diff --git a/tuning_box/library/resource_keys_operation.py b/tuning_box/library/resource_keys_operation.py deleted file mode 100644 index 6bc5d69..0000000 --- a/tuning_box/library/resource_keys_operation.py +++ /dev/null @@ -1,208 +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 copy - -import flask - -from tuning_box import db -from tuning_box import errors -from tuning_box import library - - -class KeysOperationMixin(object): - - OPERATION_GET = 'get' - OPERATION_SET = 'set' - OPERATION_DELETE = 'delete' - - OPERATIONS = (OPERATION_GET, OPERATION_SET, OPERATION_DELETE) - - def _check_out_of_index(self, cur_point, key, keys_path): - if isinstance(cur_point, (list, tuple)) and key >= len(cur_point): - raise errors.KeysPathNotExisted( - "Keys path doesn't exist {0}. " - "Failed on the key {1}".format(keys_path, key) - ) - - def _check_key_existed(self, cur_point, key, keys_path): - if isinstance(cur_point, dict) and key not in cur_point: - raise errors.KeysPathNotExisted( - "Keys path doesn't exist {0}. " - "Failed on the key {1}".format(keys_path, key) - ) - - def _check_path_is_reachable(self, cur_point, key, keys_path): - if not isinstance(cur_point, (list, tuple, dict)): - raise errors.KeysPathUnreachable( - "Leaf value {0} found on key {1} " - "in keys path {2}".format(cur_point, key, keys_path) - ) - - def _cast_key(self, key, cur_point): - """Casts indexes of lists and tuples to integer. - - Keys paths can be passed as part of url or as command line - parameter: k1.k2.0.k4. So we need to cast list and tuple - indexes to integers - - :param key: key - :param cur_point: data structure where key should be set - :return: - """ - if isinstance(cur_point, (list, tuple)): - key = int(key) - return key - - def do_get(self, storage, keys_paths): - """Gets values from storage by keys paths. - - Keys path is list of keys paths. If we have keys_paths - [['a', 'b']], then storage['a']['b'] will be get as result. - - :param storage: original data - :param keys_paths: lists of keys paths to be set - :returns: value from storage specified by keys_paths - """ - - # Removing show lookup information from the data - show_lookup = 'show_lookup' in flask.request.args - effective = 'effective' in flask.request.args - - if effective and show_lookup: - storage_copy = copy.deepcopy(storage) - for k in storage_copy.iterkeys(): - storage_copy[k] = storage[k][0] - else: - storage_copy = storage - - result = [] - for keys_path in keys_paths: - cur_point = storage_copy - if not keys_path: - continue - - try: - for key in keys_path[:-1]: - key = self._cast_key(key, cur_point) - cur_point = cur_point[key] - key = keys_path[-1] - key = self._cast_key(key, cur_point) - self._check_path_is_reachable(cur_point, key, keys_path) - - if effective and show_lookup: - result.append([cur_point[key], storage[keys_path[0]][1]]) - else: - result.append(cur_point[key]) - - except (KeyError, IndexError): - raise errors.KeysPathNotExisted( - "Keys path doesn't exist {0}. " - "Failed on the key {1}".format(keys_path, key) - ) - return result - - def do_set(self, storage, keys_paths): - """Sets values from keys paths to storage. - - Keys path is list of keys paths. If we have keys_paths - [['a', 'b', 'val']], then storage['a']['b'] will be set to 'val'. - Last value in the keys path is value to be set. - - :param storage: original data - :param keys_paths: lists of keys paths to be set - :returns: result of merging keys_paths and storage - """ - - storage_copy = copy.deepcopy(storage) - for keys_path in keys_paths: - cur_point = storage_copy - if len(keys_path) < 2: - raise errors.KeysPathInvalid( - "Keys path {0} invalid. Keys path should contain " - "at least one key and value".format(keys_path) - ) - - for key in keys_path[:-2]: - key = self._cast_key(key, cur_point) - self._check_path_is_reachable(cur_point, key, keys_path) - self._check_out_of_index(cur_point, key, keys_path) - self._check_key_existed(cur_point, key, keys_path) - cur_point = cur_point[key] - - assign_to = self._cast_key(keys_path[-2], cur_point) - self._check_path_is_reachable(cur_point, assign_to, keys_path) - self._check_out_of_index(cur_point, assign_to, keys_path) - cur_point[assign_to] = keys_path[-1] - - return storage_copy - - def do_delete(self, storage, keys_paths): - """Deletes keys paths from storage. - - Keys path is list of keys paths. If we have keys_paths - [['a', 'b']], then storage['a']['b'] will be removed. - - :param storage: data - :param keys_paths: lists of keys paths to be deleted - :returns: result of keys_paths deletion from storage - """ - - storage_copy = copy.deepcopy(storage) - for keys_path in keys_paths: - cur_point = storage_copy - if not keys_path: - continue - - try: - for key in keys_path[:-1]: - key = self._cast_key(key, cur_point) - cur_point = cur_point[key] - key = keys_path[-1] - key = self._cast_key(key, cur_point) - self._check_path_is_reachable(cur_point, key, keys_path) - del cur_point[key] - except (KeyError, IndexError): - raise errors.KeysPathNotExisted( - "Keys path doesn't exist {0}. " - "Failed on the key {1}".format(keys_path, key) - ) - return storage_copy - - def perform_operation(self, operation, storage, keys_paths): - if operation == self.OPERATION_SET: - return self.do_set(storage, keys_paths) - elif operation == self.OPERATION_DELETE: - return self.do_delete(storage, keys_paths) - elif operation == self.OPERATION_GET: - return self.do_get(storage, keys_paths) - else: - raise errors.UnknownKeysOperation( - "Unknown operation: {0}. " - "Allowed operations: {1}".format(operation, self.OPERATIONS) - ) - - -class ResourceKeysMixin(KeysOperationMixin): - - @db.with_transaction - def _do_update(self, environment_id, levels, - resource_id_or_name, operation, storage_name): - - environment = db.Environment.query.get_or_404(environment_id) - res_def = library.get_resource_definition( - resource_id_or_name, environment_id) - - res_values = library.get_resource_values(environment, levels, res_def) - result = self.perform_operation( - operation, getattr(res_values, storage_name), flask.request.json) - setattr(res_values, storage_name, result) diff --git a/tuning_box/library/resource_overrides.py b/tuning_box/library/resource_overrides.py deleted file mode 100644 index 34a7a82..0000000 --- a/tuning_box/library/resource_overrides.py +++ /dev/null @@ -1,69 +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 flask -import flask_restful - -from tuning_box import db -from tuning_box import library -from tuning_box.library import hierarchy_levels -from tuning_box.library import resource_keys_operation - - -class ResourceOverrides(flask_restful.Resource): - - @db.with_transaction - def put(self, environment_id, levels, resource_id_or_name): - environment = db.Environment.query.get_or_404(environment_id) - res_def = library.get_resource_definition( - resource_id_or_name, environment_id) - - level_value = hierarchy_levels.get_environment_level_value( - environment, levels) - esv = db.get_or_create( - db.ResourceValues, - environment=environment, - resource_definition=res_def, - level_value=level_value, - ) - esv.overrides = flask.request.json - return None, 204 - - @db.with_transaction - def get(self, environment_id, resource_id_or_name, levels): - environment = db.Environment.query.get_or_404(environment_id) - res_def = library.get_resource_definition( - resource_id_or_name, environment_id) - - level_value = hierarchy_levels.get_environment_level_value( - environment, levels) - res_values = db.ResourceValues.query.filter_by( - resource_definition=res_def, - environment=environment, - level_value=level_value, - ).one_or_none() - if not res_values: - return {} - return res_values.overrides - - -class ResourceOverridesKeys(flask_restful.Resource, - resource_keys_operation.ResourceKeysMixin): - - def put(self, environment_id, levels, resource_id_or_name, operation): - return self.patch(environment_id, levels, - resource_id_or_name, operation) - - def patch(self, environment_id, levels, resource_id_or_name, operation): - self._do_update(environment_id, levels, resource_id_or_name, - operation, 'overrides') - return None, 204 diff --git a/tuning_box/library/resource_values.py b/tuning_box/library/resource_values.py deleted file mode 100644 index f2a8d4b..0000000 --- a/tuning_box/library/resource_values.py +++ /dev/null @@ -1,168 +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 flask -from flask import current_app as app -import flask_restful -import six -from sqlalchemy import or_ - -from tuning_box import db -from tuning_box import errors -from tuning_box import library -from tuning_box.library import hierarchy_levels -from tuning_box.library import resource_keys_operation -from tuning_box.library.resource_keys_operation import KeysOperationMixin - - -class ResourceValues(flask_restful.Resource, KeysOperationMixin): - - KEYS_PATH_DELIMITER = '.' - - @db.with_transaction - def put(self, environment_id, levels, resource_id_or_name): - environment = db.Environment.query.get_or_404(environment_id) - res_def = library.get_resource_definition( - resource_id_or_name, environment_id) - - level_value = hierarchy_levels.get_environment_level_value( - environment, levels) - esv = db.get_or_create( - db.ResourceValues, - environment=environment, - resource_definition=res_def, - level_value=level_value, - ) - esv.values = flask.request.json - return None, 204 - - def _calculate_effective_values(self, result, level_value, - resource_values_idx, show_lookup, - lookup_path): - level_value_id = getattr(level_value, 'id', None) - if level_value_id in resource_values_idx: - resource_value = resource_values_idx[level_value_id] - if show_lookup: - values = ((k, (v, lookup_path)) for k, v in - six.iteritems(resource_value.values)) - overrides = ((k, (v, lookup_path)) for k, v in - six.iteritems(resource_value.overrides)) - else: - values = resource_value.values - overrides = resource_value.overrides - result.update(values) - result.update(overrides) - - @db.with_transaction - def get(self, environment_id, resource_id_or_name, levels): - app.logger.debug("Getting resource value. Env: %s, " - "resource: %s, levels: %s", environment_id, - resource_id_or_name, levels) - - effective = 'effective' in flask.request.args - show_lookup = 'show_lookup' in flask.request.args - - if show_lookup and not effective: - raise errors.RequestValidationError( - "Lookup path tracing can be done only for effective values") - - environment = db.Environment.query.get_or_404(environment_id) - res_def = library.get_resource_definition( - resource_id_or_name, environment_id) - - level_values = list(hierarchy_levels.iter_environment_level_values( - environment, levels)) - - level_values_ids = [l.id for l in level_values] - app.logger.debug("Got level values ids: %s", level_values_ids) - - if effective: - app.logger.debug("Getting effective resource value. Env: %s, " - "resource: %s, levels: %s", environment_id, - resource_id_or_name, levels) - resource_values = db.ResourceValues.query.filter( - or_( - db.ResourceValues.level_value_id.in_(level_values_ids), - db.ResourceValues.level_value_id.is_(None) - ), - db.ResourceValues.resource_definition == res_def, - db.ResourceValues.environment == environment - ).all() - app.logger.debug("Processing values for resource: %s, env: %s. " - "Loaded resource values: %s", - res_def.id, environment.id, len(resource_values)) - # Creating index of resource_values by level_value_id - resource_values_idx = {r.level_value_id: r - for r in resource_values} - app.logger.debug("Resource values index size: %s", - len(resource_values_idx)) - - result = {} - lookup_path = '/' - self._calculate_effective_values( - result, None, resource_values_idx, show_lookup, - lookup_path) - - for level_value in level_values: - name = level_value.level.name - value = level_value.value - lookup_path += name + '/' + value + '/' - - self._calculate_effective_values( - result, level_value, resource_values_idx, show_lookup, - lookup_path) - - app.logger.debug("Effective values got for resource: " - "%s, env: %s", res_def.id, environment.id) - else: - if not level_values: - level_value = None - else: - level_value = level_values[-1] - resource_values = db.ResourceValues.query.filter_by( - resource_definition=res_def, - environment=environment, - level_value=level_value, - ).one_or_none() - app.logger.debug("Values got for resource: " - "%s, env: %s", res_def.id, environment.id) - if resource_values: - result = resource_values.values - else: - result = {} - return self._extract_keys_paths(result) - - def _extract_keys_paths(self, data): - if 'key' not in flask.request.args: - return data - keys_path = flask.request.args['key'].split(self.KEYS_PATH_DELIMITER) - app.logger.debug("Extracting data by keys paths: %s", keys_path) - result = self.do_get(data, [keys_path]) - # Single keys path is passed as GET request parameter, so we need - # only first result - result = result[0] - app.logger.debug("Extracted data by keys paths: %s is: %s", - keys_path, result) - return result - - -class ResourceValuesKeys(flask_restful.Resource, - resource_keys_operation.ResourceKeysMixin): - - def put(self, environment_id, levels, resource_id_or_name, operation): - return self.patch(environment_id, levels, - resource_id_or_name, operation) - - def patch(self, environment_id, levels, resource_id_or_name, operation): - self._do_update(environment_id, levels, resource_id_or_name, - operation, 'values') - return None, 204 diff --git a/tuning_box/logger.py b/tuning_box/logger.py deleted file mode 100644 index 5081b0c..0000000 --- a/tuning_box/logger.py +++ /dev/null @@ -1,27 +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 logging - - -def get_formatter(): - date_format = "%Y-%m-%d %H:%M:%S" - log_format = "%(asctime)s.%(msecs)03d %(levelname)s " \ - "(%(module)s) %(message)s" - return logging.Formatter(fmt=log_format, datefmt=date_format) - - -def init_logger(app, log_level): - handler = logging.StreamHandler() - handler.setFormatter(get_formatter()) - app.logger.addHandler(handler) - app.logger.setLevel(log_level) diff --git a/tuning_box/middleware/__init__.py b/tuning_box/middleware/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tuning_box/middleware/keystone.py b/tuning_box/middleware/keystone.py deleted file mode 100644 index 1a7d54c..0000000 --- a/tuning_box/middleware/keystone.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 keystonemiddleware import auth_token - - -class KeystoneMiddleware(auth_token.AuthProtocol): - - def __init__(self, app): - self.app = app.wsgi_app - auth_settings = app.config.get('AUTH') - super(KeystoneMiddleware, self).__init__(self.app, auth_settings) diff --git a/tuning_box/migration.py b/tuning_box/migration.py deleted file mode 100644 index 96d2fa1..0000000 --- a/tuning_box/migration.py +++ /dev/null @@ -1,39 +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 alembic import command as alembic_command -from alembic import config as alembic_config - -import tuning_box -from tuning_box import app -from tuning_box import db - - -def get_alembic_config(engine): - config = alembic_config.Config() - config.set_main_option('sqlalchemy.url', str(engine.url)) - config.set_main_option( - 'script_location', tuning_box.get_migrations_dir()) - config.set_main_option('version_table', 'alembic_version') - return config - - -def upgrade(): - with app.build_app(with_keystone=False).app_context(): - config = get_alembic_config(db.db.engine) - alembic_command.upgrade(config, 'head') - - -def downgrade(): - with app.build_app(with_keystone=False).app_context(): - config = get_alembic_config(db.db.engine) - alembic_command.downgrade(config, 'base') diff --git a/tuning_box/migrations/env.py b/tuning_box/migrations/env.py deleted file mode 100644 index 01cdee6..0000000 --- a/tuning_box/migrations/env.py +++ /dev/null @@ -1,76 +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 logging.config - -from alembic import context -import sqlalchemy - -from tuning_box import db - -config = context.config -if config.get_main_option('table_prefix') is None: - config.set_main_option('table_prefix', '') -if config.config_file_name: - logging.config.fileConfig(config.config_file_name) -target_metadata = db.db.metadata - - -def run_migrations_offline(): - """Run migrations in 'offline' mode. - - This configures the context with just a URL - and not an Engine, though an Engine is acceptable - here as well. By skipping the Engine creation - we don't even need a DBAPI to be available. - - Calls to context.execute() here emit the given string to the - script output. - - """ - context.configure( - url=config.get_main_option('sqlalchemy.url'), - version_table=config.get_main_option('version_table'), - literal_binds=True, - ) - - with context.begin_transaction(): - context.run_migrations() - - -def run_migrations_online(): - """Run migrations in 'online' mode. - - In this scenario we need to create an Engine - and associate a connection with the context. - - """ - connectable = sqlalchemy.engine_from_config( - config.get_section(config.config_ini_section), - prefix='sqlalchemy.', - poolclass=sqlalchemy.pool.NullPool, - ) - - with connectable.connect() as connection: - context.configure( - connection=connection, - target_metadata=target_metadata, - version_table=config.get_main_option('version_table'), - ) - - with context.begin_transaction(): - context.run_migrations() - -if context.is_offline_mode(): - run_migrations_offline() -else: - run_migrations_online() diff --git a/tuning_box/migrations/script.py.mako b/tuning_box/migrations/script.py.mako deleted file mode 100644 index 7f993a7..0000000 --- a/tuning_box/migrations/script.py.mako +++ /dev/null @@ -1,41 +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. - -"""${message} - -Revision ID: ${up_revision} -Revises:${" " if down_revision else ""}${down_revision | comma,n} -Create Date: ${create_date} - -""" - -# revision identifiers, used by Alembic. -revision = ${repr(up_revision)} -down_revision = ${repr(down_revision)} -branch_labels = ${repr(branch_labels)} -depends_on = ${repr(depends_on)} - -from alembic import context -from alembic import op -import sqlalchemy as sa - -import tuning_box.db -${imports if imports else ""} - -def upgrade(): - table_prefix = context.config.get_main_option('table_prefix') - ${upgrades if upgrades else "pass"} - - -def downgrade(): - table_prefix = context.config.get_main_option('table_prefix') - ${downgrades if downgrades else "pass"} diff --git a/tuning_box/migrations/versions/0c586adad733_cascade_deletion.py b/tuning_box/migrations/versions/0c586adad733_cascade_deletion.py deleted file mode 100644 index c9ef644..0000000 --- a/tuning_box/migrations/versions/0c586adad733_cascade_deletion.py +++ /dev/null @@ -1,174 +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. - -"""Cascade deletion - -Revision ID: 0c586adad733 -Revises: 9ae15c85fa92 -Create Date: 2016-08-11 10:05:51.127370 - -""" - -# revision identifiers, used by Alembic. -revision = '0c586adad733' -down_revision = '9ae15c85fa92' -branch_labels = None -depends_on = None - -from alembic import context -from alembic import op - - -def upgrade(): - table_prefix = context.config.get_main_option('table_prefix') - - # Environment components - with op.batch_alter_table(table_prefix + 'environment_components') \ - as batch: - batch.drop_constraint( - table_prefix + 'environment_components_component_id_fkey', - 'foreignkey' - ) - batch.create_foreign_key( - table_prefix + 'environment_components_component_id_fkey', - table_prefix + 'component', - ['component_id'], ['id'], ondelete='CASCADE' - ) - - batch.drop_constraint( - table_prefix + 'environment_components_environment_id_fkey', - 'foreignkey' - ) - batch.create_foreign_key( - table_prefix + 'environment_components_environment_id_fkey', - table_prefix + 'environment', - ['environment_id'], ['id'], ondelete='CASCADE' - ) - - # Resource values - with op.batch_alter_table(table_prefix + 'resource_values') \ - as batch: - batch.drop_constraint( - table_prefix + 'environment_schema_values_environment_id_fkey', - 'foreignkey' - ) - batch.create_foreign_key( - table_prefix + 'resource_values_environment_id_fkey', - table_prefix + 'environment', - ['environment_id'], ['id'], ondelete='CASCADE' - ) - - batch.drop_constraint( - table_prefix + 'resource_values_resource_definition_id_fkey', - 'foreignkey' - ) - batch.create_foreign_key( - table_prefix + 'resource_values_resource_definition_id_fkey', - table_prefix + 'resource_definition', - ['resource_definition_id'], ['id'], ondelete='CASCADE' - ) - - batch.drop_constraint( - table_prefix + 'environment_schema_values_level_value_id_fkey', - 'foreignkey' - ) - batch.create_foreign_key( - table_prefix + 'environment_resource_values_level_value_id_fkey', - table_prefix + 'environment_hierarchy_level_value', - ['level_value_id'], ['id'], ondelete='CASCADE' - ) - - # Resource definition - with op.batch_alter_table(table_prefix + 'resource_definition') \ - as batch: - batch.drop_constraint( - table_prefix + 'schema_component_id_fkey', - 'foreignkey' - ) - batch.create_foreign_key( - table_prefix + 'resource_definition_component_id_fkey', - table_prefix + 'component', - ['component_id'], ['id'], ondelete='CASCADE' - ) - - -def downgrade(): - table_prefix = context.config.get_main_option('table_prefix') - - # Resource definition - with op.batch_alter_table(table_prefix + 'resource_definition') \ - as batch: - batch.drop_constraint( - table_prefix + 'resource_definition_component_id_fkey', - 'foreignkey' - ) - batch.create_foreign_key( - table_prefix + 'schema_component_id_fkey', - table_prefix + 'component', - ['component_id'], ['id'] - ) - - # Resource values - with op.batch_alter_table(table_prefix + 'resource_values') \ - as batch: - batch.drop_constraint( - table_prefix + 'environment_resource_values_level_value_id_fkey', - 'foreignkey' - ) - batch.create_foreign_key( - table_prefix + 'environment_schema_values_level_value_id_fkey', - table_prefix + 'environment_hierarchy_level_value', - ['level_value_id'], ['id'] - ) - - batch.drop_constraint( - table_prefix + 'resource_values_resource_definition_id_fkey', - 'foreignkey' - ) - batch.create_foreign_key( - table_prefix + 'resource_values_resource_definition_id_fkey', - table_prefix + 'resource_definition', - ['resource_definition_id'], ['id'] - ) - - batch.drop_constraint( - table_prefix + 'resource_values_environment_id_fkey', - 'foreignkey' - ) - batch.create_foreign_key( - table_prefix + 'environment_schema_values_environment_id_fkey', - table_prefix + 'environment', - ['environment_id'], ['id'] - ) - - # Environment components - with op.batch_alter_table(table_prefix + 'environment_components') \ - as batch: - batch.drop_constraint( - table_prefix + 'environment_components_environment_id_fkey', - 'foreignkey' - ) - batch.create_foreign_key( - table_prefix + 'environment_components_environment_id_fkey', - table_prefix + 'environment', - ['environment_id'], ['id'] - ) - - batch.drop_constraint( - table_prefix + 'environment_components_component_id_fkey', - 'foreignkey' - ) - batch.create_foreign_key( - table_prefix + 'environment_components_component_id_fkey', - table_prefix + 'component', - ['component_id'], ['id'] - ) diff --git a/tuning_box/migrations/versions/3b2a0f134e45_switch_to_new_api.py b/tuning_box/migrations/versions/3b2a0f134e45_switch_to_new_api.py deleted file mode 100644 index 837dbc2..0000000 --- a/tuning_box/migrations/versions/3b2a0f134e45_switch_to_new_api.py +++ /dev/null @@ -1,102 +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. - -"""Switch to new API - -Revision ID: 3b2a0f134e45 -Revises: f16eb4eff7c -Create Date: 2016-03-17 16:30:11.989340 - -""" - -# revision identifiers, used by Alembic. -revision = '3b2a0f134e45' -down_revision = 'f16eb4eff7c' -branch_labels = None -depends_on = None - -from alembic import context -from alembic import op -import sqlalchemy as sa - -import tuning_box.db - - -def upgrade(): - table_prefix = context.config.get_main_option('table_prefix') - op.drop_table(table_prefix + 'template') - table_name = table_prefix + 'environment_schema_values' - with op.batch_alter_table(table_name) as batch: - batch.drop_constraint(table_name + '_schema_id_fkey', 'foreignkey') - batch.alter_column( - 'schema_id', - new_column_name='resource_definition_id', - existing_type=sa.Integer(), - ) - op.rename_table(table_name, table_prefix + 'resource_values') - op.rename_table(table_prefix + 'schema', - table_prefix + 'resource_definition') - with op.batch_alter_table(table_prefix + 'resource_definition') as batch: - batch.drop_column('namespace_id') - op.drop_table(table_prefix + 'namespace') - table_name = table_prefix + 'resource_values' - with op.batch_alter_table(table_name) as batch: - batch.create_foreign_key( - table_name + '_resource_definition_id_fkey', - table_prefix + 'resource_definition', - ['resource_definition_id'], - ['id'], - ) - - -def downgrade(): - table_prefix = context.config.get_main_option('table_prefix') - table_name = table_prefix + 'resource_values' - with op.batch_alter_table(table_name) as batch: - batch.drop_constraint(table_name + '_resource_definition_id_fkey', - 'foreignkey') - op.create_table( - table_prefix + 'namespace', - sa.Column('id', sa.Integer(), nullable=False, primary_key=True), - sa.Column('name', sa.String(length=128), nullable=True), - ) - table_name = table_prefix + 'schema' - op.rename_table(table_prefix + 'resource_definition', table_name) - with op.batch_alter_table(table_name) as batch: - batch.add_column( - sa.Column('namespace_id', sa.Integer(), nullable=True)) - table_name = table_prefix + 'environment_schema_values' - op.rename_table(table_prefix + 'resource_values', table_name) - with op.batch_alter_table(table_name) as batch: - batch.alter_column( - 'resource_definition_id', - new_column_name='schema_id', - existing_type=sa.Integer(), - ) - batch.create_foreign_key( - table_name + '_schema_id_fkey', - table_prefix + 'schema', - ['schema_id'], - ['id'], - ) - table_name = table_prefix + 'template' - op.create_table( - table_name, - sa.Column('id', sa.Integer(), nullable=False, primary_key=True), - sa.Column('name', sa.String(length=128), nullable=True), - sa.Column('component_id', sa.Integer(), nullable=True), - sa.Column('content', tuning_box.db.Json(), nullable=True), - sa.ForeignKeyConstraint( - ['component_id'], [table_prefix + 'component.id'], - name=table_name + '_component_id_fkey', - ), - ) diff --git a/tuning_box/migrations/versions/967a44dd16d5_add_server_default_to_resource_values_values.py b/tuning_box/migrations/versions/967a44dd16d5_add_server_default_to_resource_values_values.py deleted file mode 100644 index 0b6fd87..0000000 --- a/tuning_box/migrations/versions/967a44dd16d5_add_server_default_to_resource_values_values.py +++ /dev/null @@ -1,52 +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. - -"""Add server_default to resource_values.values - -Revision ID: 967a44dd16d5 -Revises: 3b2a0f134e45 -Create Date: 2016-03-25 21:12:28.939719 - -""" - -# revision identifiers, used by Alembic. -revision = '967a44dd16d5' -down_revision = '3b2a0f134e45' -branch_labels = None -depends_on = None - -from alembic import context -from alembic import op - -import tuning_box.db - - -def upgrade(): - table_prefix = context.config.get_main_option('table_prefix') - table_name = table_prefix + 'resource_values' - with op.batch_alter_table(table_name) as batch: - batch.alter_column( - 'values', - server_default='{}', - existing_type=tuning_box.db.Json(), - ) - - -def downgrade(): - table_prefix = context.config.get_main_option('table_prefix') - table_name = table_prefix + 'resource_values' - with op.batch_alter_table(table_name) as batch: - batch.alter_column( - 'values', - server_default=None, - existing_type=tuning_box.db.Json(), - ) diff --git a/tuning_box/migrations/versions/9ae15c85fa92_remove_fake_root_hierarchy_level_values.py b/tuning_box/migrations/versions/9ae15c85fa92_remove_fake_root_hierarchy_level_values.py deleted file mode 100644 index 34f0a99..0000000 --- a/tuning_box/migrations/versions/9ae15c85fa92_remove_fake_root_hierarchy_level_values.py +++ /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. - -"""Remove fake root hierarchy level values - -Revision ID: 9ae15c85fa92 -Revises: d054eefc4c5b -Create Date: 2016-04-12 20:22:06.323291 - -""" - -# revision identifiers, used by Alembic. -revision = '9ae15c85fa92' -down_revision = 'd054eefc4c5b' -branch_labels = None -depends_on = None - -from alembic import context -from alembic import op -import sqlalchemy as sa -from sqlalchemy.ext import automap - - -def _get_autobase(table_prefix, bind): - metadata = sa.MetaData(bind=bind) - table_name = table_prefix + 'environment_hierarchy_level_value' - metadata.reflect(only=[table_name]) - AutoBase = automap.automap_base(metadata=metadata) - - def classname_for_table(base, refl_table_name, table): - assert refl_table_name.startswith(table_prefix) - noprefix_name = refl_table_name[len(table_prefix):] - uname = u"".join(s.capitalize() for s in noprefix_name.split('_')) - if not isinstance(uname, str): - return uname.encode('utf-8') - else: - return uname - - AutoBase.prepare(classname_for_table=classname_for_table) - return AutoBase - - -def _get_ehlv_class(): - table_prefix = context.config.get_main_option('table_prefix') - bind = op.get_bind() - AutoBase = _get_autobase(table_prefix, bind) - return AutoBase.classes.EnvironmentHierarchyLevelValue - - -def _get_session(): - return sa.orm.Session(bind=op.get_bind(), autocommit=True) - - -def upgrade(): - EHLV = _get_ehlv_class() - session = _get_session() - with session.begin(): - fake_roots = session.query(EHLV) \ - .filter_by(level_id=None, parent_id=None, value=None) \ - .all() - if fake_roots: - fake_root_ids = [r.id for r in fake_roots] - session.query(EHLV) \ - .filter(EHLV.parent_id.in_(fake_root_ids)) \ - .update({EHLV.parent_id: None}, synchronize_session=False) - for r in fake_roots: - session.delete(r) - - -def downgrade(): - EHLV = _get_ehlv_class() - session = _get_session() - with session.begin(): - fake_root = EHLV(level_id=None, parent_id=None, value=None) - session.add(fake_root) - session.flush() - session.query(EHLV) \ - .filter(EHLV.parent_id == None, # noqa - EHLV.id != fake_root.id) \ - .update({EHLV.parent_id: fake_root.id}, - synchronize_session=False) diff --git a/tuning_box/migrations/versions/a86472389a70_remove_hierarchy_for_level_values.py b/tuning_box/migrations/versions/a86472389a70_remove_hierarchy_for_level_values.py deleted file mode 100644 index e339681..0000000 --- a/tuning_box/migrations/versions/a86472389a70_remove_hierarchy_for_level_values.py +++ /dev/null @@ -1,78 +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. - -"""Remove hierarchy for level values - -Revision ID: a86472389a70 -Revises: 0c586adad733 -Create Date: 2016-08-18 14:00:03.197693 - -""" - -# revision identifiers, used by Alembic. -revision = 'a86472389a70' -down_revision = '0c586adad733' -branch_labels = None -depends_on = None - -from alembic import context -from alembic import op -import sqlalchemy as sa - - -def upgrade(): - table_prefix = context.config.get_main_option('table_prefix') - table_name = table_prefix + 'environment_hierarchy_level_value' - with op.batch_alter_table(table_name) as batch: - batch.drop_column('parent_id') - - batch.drop_constraint( - table_name + '_level_id_fkey', - type_='foreignkey' - ) - batch.create_foreign_key( - table_name + '_level_id_fkey', - table_prefix + 'environment_hierarchy_level', - ['level_id'], ['id'], ondelete='CASCADE' - ) - - batch.create_unique_constraint( - table_name + '_level_id_value_unique', - ['level_id', 'value'] - ) - - -def downgrade(): - table_prefix = context.config.get_main_option('table_prefix') - table_name = table_prefix + 'environment_hierarchy_level_value' - with op.batch_alter_table(table_name) as batch: - batch.drop_constraint( - table_name + '_level_id_value_unique', - type_='unique' - ) - - batch.drop_constraint( - table_name + '_level_id_fkey', - type_='foreignkey' - ) - batch.create_foreign_key( - table_name + '_level_id_fkey', - table_prefix + 'environment_hierarchy_level', - ['level_id'], ['id'] - ) - - batch.add_column(sa.Column('parent_id', sa.Integer(), nullable=True)) - batch.create_foreign_key( - table_name + '_parent_id_fkey', - table_name, - ['parent_id'], ['id'] - ) diff --git a/tuning_box/migrations/versions/ad192a40fd68_add_overrides_to_resource_values.py b/tuning_box/migrations/versions/ad192a40fd68_add_overrides_to_resource_values.py deleted file mode 100644 index febce4b..0000000 --- a/tuning_box/migrations/versions/ad192a40fd68_add_overrides_to_resource_values.py +++ /dev/null @@ -1,46 +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. - -"""Add overrides to resource_values - -Revision ID: ad192a40fd68 -Revises: 967a44dd16d5 -Create Date: 2016-03-25 21:26:19.170101 - -""" - -# revision identifiers, used by Alembic. -revision = 'ad192a40fd68' -down_revision = '967a44dd16d5' -branch_labels = None -depends_on = None - -from alembic import context -from alembic import op -import sqlalchemy as sa - -import tuning_box.db - - -def upgrade(): - table_prefix = context.config.get_main_option('table_prefix') - op.add_column(table_prefix + 'resource_values', sa.Column( - 'overrides', - tuning_box.db.Json(), - server_default='{}', - nullable=True, - )) - - -def downgrade(): - table_prefix = context.config.get_main_option('table_prefix') - op.drop_column(table_prefix + 'resource_values', 'overrides') diff --git a/tuning_box/migrations/versions/adf671eddeb4_level_cascade_deletion.py b/tuning_box/migrations/versions/adf671eddeb4_level_cascade_deletion.py deleted file mode 100644 index 0007f7f..0000000 --- a/tuning_box/migrations/versions/adf671eddeb4_level_cascade_deletion.py +++ /dev/null @@ -1,59 +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. - -"""Level cascade deletion on environment removal - -Revision ID: adf671eddeb4 -Revises: a86472389a70 -Create Date: 2016-08-19 16:39:46.745113 - -""" - -# revision identifiers, used by Alembic. -revision = 'adf671eddeb4' -down_revision = 'a86472389a70' -branch_labels = None -depends_on = None - -from alembic import context -from alembic import op - - -def upgrade(): - table_prefix = context.config.get_main_option('table_prefix') - table_name = table_prefix + 'environment_hierarchy_level' - - with op.batch_alter_table(table_name) as batch: - batch.drop_constraint( - table_prefix + 'environment_hierarchy_level_environment_id_fkey', - type_='foreignkey' - ) - batch.create_foreign_key( - table_prefix + 'environment_hierarchy_level_environment_id_fkey', - table_prefix + 'environment', - ['environment_id'], ['id'], ondelete='CASCADE' - ) - - -def downgrade(): - table_prefix = context.config.get_main_option('table_prefix') - table_name = table_prefix + 'environment_hierarchy_level' - with op.batch_alter_table(table_name) as batch: - batch.drop_constraint( - table_prefix + 'environment_hierarchy_level_environment_id_fkey', - type_='foreignkey' - ) - batch.create_foreign_key( - table_prefix + 'environment_hierarchy_level_environment_id_fkey', - table_prefix + 'environment', - ['environment_id'], ['id'] - ) diff --git a/tuning_box/migrations/versions/d054eefc4c5b_add_unique_constraint_on_component_name.py b/tuning_box/migrations/versions/d054eefc4c5b_add_unique_constraint_on_component_name.py deleted file mode 100644 index 9b3f4b6..0000000 --- a/tuning_box/migrations/versions/d054eefc4c5b_add_unique_constraint_on_component_name.py +++ /dev/null @@ -1,48 +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. - -"""Add unique constraint on component.name - -Revision ID: d054eefc4c5b -Revises: ad192a40fd68 -Create Date: 2016-03-25 21:34:54.487361 - -""" - -# revision identifiers, used by Alembic. -revision = 'd054eefc4c5b' -down_revision = 'ad192a40fd68' -branch_labels = None -depends_on = None - -from alembic import context -from alembic import op - - -def upgrade(): - table_prefix = context.config.get_main_option('table_prefix') - table_name = table_prefix + 'component' - with op.batch_alter_table(table_name) as batch: - batch.create_unique_constraint( - table_name + '_component_name_unique', - ['name'], - ) - - -def downgrade(): - table_prefix = context.config.get_main_option('table_prefix') - table_name = table_prefix + 'component' - with op.batch_alter_table(table_name) as batch: - batch.drop_constraint( - table_name + '_component_name_unique', - type_='unique', - ) diff --git a/tuning_box/migrations/versions/f16eb4eff7c_initial_revision.py b/tuning_box/migrations/versions/f16eb4eff7c_initial_revision.py deleted file mode 100644 index bef617a..0000000 --- a/tuning_box/migrations/versions/f16eb4eff7c_initial_revision.py +++ /dev/null @@ -1,169 +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. - -"""Initial revision - -Revision ID: f16eb4eff7c -Revises: -Create Date: 2016-03-02 17:10:04.750584 - -""" - -# revision identifiers, used by Alembic. -revision = 'f16eb4eff7c' -down_revision = None -branch_labels = None -depends_on = None - -from alembic import context -from alembic import op -import sqlalchemy as sa - -import tuning_box.db - - -def upgrade(): - table_prefix = context.config.get_main_option('table_prefix') - op.create_table( - table_prefix + 'component', - sa.Column('id', sa.Integer(), nullable=False, primary_key=True), - sa.Column('name', sa.String(length=128), nullable=True), - ) - op.create_table( - table_prefix + 'environment', - sa.Column('id', sa.Integer(), nullable=False, primary_key=True), - ) - op.create_table( - table_prefix + 'namespace', - sa.Column('id', sa.Integer(), nullable=False, primary_key=True), - sa.Column('name', sa.String(length=128), nullable=True), - ) - table_name = table_prefix + 'environment_components' - op.create_table( - table_name, - sa.Column('environment_id', sa.Integer(), nullable=True), - sa.Column('component_id', sa.Integer(), nullable=True), - sa.ForeignKeyConstraint( - ['component_id'], [table_prefix + 'component.id'], - name=table_name + '_component_id_fkey', - ), - sa.ForeignKeyConstraint( - ['environment_id'], [table_prefix + 'environment.id'], - name=table_name + '_environment_id_fkey', - ), - ) - table_name = table_prefix + 'environment_hierarchy_level' - op.create_table( - table_name, - sa.Column('id', sa.Integer(), nullable=False, primary_key=True), - sa.Column('environment_id', sa.Integer(), nullable=True), - sa.Column('name', sa.String(length=128), nullable=True), - sa.Column('parent_id', sa.Integer(), nullable=True), - sa.ForeignKeyConstraint( - ['environment_id'], [table_prefix + 'environment.id'], - name=table_name + '_environment_id_fkey', - ), - sa.ForeignKeyConstraint( - ['parent_id'], [table_prefix + 'environment_hierarchy_level.id'], - name=table_name + '_parent_id_fkey', - ), - sa.UniqueConstraint( - 'environment_id', 'name', - name=table_name + '_environment_id_name_key', - ), - sa.UniqueConstraint( - 'environment_id', 'parent_id', - name=table_name[:-4] + '_environment_id_parent_id_key', - ), - ) - table_name = table_prefix + 'schema' - op.create_table( - table_name, - sa.Column('id', sa.Integer(), nullable=False, primary_key=True), - sa.Column('name', sa.String(length=128), nullable=True), - sa.Column('component_id', sa.Integer(), nullable=True), - sa.Column('namespace_id', sa.Integer(), nullable=True), - sa.Column('content', tuning_box.db.Json(), nullable=True), - sa.ForeignKeyConstraint( - ['component_id'], [table_prefix + 'component.id'], - name=table_name + '_component_id_fkey'), - sa.ForeignKeyConstraint( - ['namespace_id'], [table_prefix + 'namespace.id'], - name=table_name + '_namespace_id_fkey'), - ) - table_name = table_prefix + 'template' - op.create_table( - table_name, - sa.Column('id', sa.Integer(), nullable=False, primary_key=True), - sa.Column('name', sa.String(length=128), nullable=True), - sa.Column('component_id', sa.Integer(), nullable=True), - sa.Column('content', tuning_box.db.Json(), nullable=True), - sa.ForeignKeyConstraint( - ['component_id'], [table_prefix + 'component.id'], - name=table_name + '_component_id_fkey', - ), - ) - table_name = table_prefix + 'environment_hierarchy_level_value' - op.create_table( - table_name, - sa.Column('id', sa.Integer(), nullable=False, primary_key=True), - sa.Column('level_id', sa.Integer(), nullable=True), - sa.Column('parent_id', sa.Integer(), nullable=True), - sa.Column('value', sa.String(length=128), nullable=True), - sa.ForeignKeyConstraint( - ['level_id'], [table_prefix + 'environment_hierarchy_level.id'], - name=table_name + '_level_id_fkey', - ), - sa.ForeignKeyConstraint( - ['parent_id'], [table_name + '.id'], - name=table_name + '_parent_id_fkey', - ), - ) - table_name = table_prefix + 'environment_schema_values' - op.create_table( - table_name, - sa.Column('id', sa.Integer(), nullable=False, primary_key=True), - sa.Column('environment_id', sa.Integer(), nullable=True), - sa.Column('schema_id', sa.Integer(), nullable=True), - sa.Column('level_value_id', sa.Integer(), nullable=True), - sa.Column('values', tuning_box.db.Json(), nullable=True), - sa.ForeignKeyConstraint( - ['environment_id'], [table_prefix + 'environment.id'], - name=table_name + '_environment_id_fkey', - ), - sa.ForeignKeyConstraint( - ['level_value_id'], - [table_prefix + 'environment_hierarchy_level_value.id'], - name=table_name + '_level_value_id_fkey', - ), - sa.ForeignKeyConstraint( - ['schema_id'], [table_prefix + 'schema.id'], - name=table_name + '_schema_id_fkey', - ), - sa.UniqueConstraint( - 'environment_id', 'schema_id', 'level_value_id', - name=table_name[:-6] + 'environment_id_schema_id_leve_key', - ), - ) - - -def downgrade(): - table_prefix = context.config.get_main_option('table_prefix') - op.drop_table(table_prefix + 'environment_schema_values') - op.drop_table(table_prefix + 'environment_hierarchy_level_value') - op.drop_table(table_prefix + 'template') - op.drop_table(table_prefix + 'schema') - op.drop_table(table_prefix + 'environment_hierarchy_level') - op.drop_table(table_prefix + 'environment_components') - op.drop_table(table_prefix + 'namespace') - op.drop_table(table_prefix + 'environment') - op.drop_table(table_prefix + 'component') diff --git a/tuning_box/nailgun.py b/tuning_box/nailgun.py deleted file mode 100644 index 1965098..0000000 --- a/tuning_box/nailgun.py +++ /dev/null @@ -1,87 +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 __future__ import absolute_import - -import itertools -import threading - -from nailgun.db import sqlalchemy as nailgun_sa -from nailgun import extensions -import web - -import tuning_box -from tuning_box import app as tb_app -from tuning_box import db as tb_db - - -class App2WebPy(web.application): - def __init__(self): - web.application.__init__(self) - self.__name__ = self - self.app = None - self.lock = threading.Lock() - - def create_app(self): - raise NotImplementedError - - def get_app(self): - with self.lock: - if not self.app: - self.app = self.create_app() - return self.app - - def handle(self): - written_data = [] - - def write(data): - assert start_response.called - written_data.append(data) - - def start_response(status, headers, exc_info=None): - assert not start_response.called - assert not exc_info - start_response.called = True - web.ctx.status = status - web.ctx.headers.extend(headers) - return write - - start_response.called = False - - app = self.get_app() - environ = dict(web.ctx.environ) - environ["SCRIPT_NAME"] = environ["PATH_INFO"][:-len(web.ctx.path)] - environ["PATH_INFO"] = environ["REQUEST_URI"] = web.ctx.path - result = app(environ, start_response) - return itertools.chain(written_data, result) - - -class TB2WebPy(App2WebPy): - def create_app(self): - # Nailgun API already contains keystone middleware - app = tb_app.build_app(with_keystone=False) - tb_db.prefix_tables(tb_db, Extension.table_prefix()) - app.config["PROPAGATE_EXCEPTIONS"] = True - app.config["SQLALCHEMY_DATABASE_URI"] = nailgun_sa.db_str - return app - - -class Extension(extensions.BaseExtension): - name = 'tuning_box' - version = tuning_box.__version__ - description = 'Plug tuning_box endpoints into Nailgun itself' - - urls = [{'uri': '/config', 'handler': TB2WebPy()}] - - @classmethod - def alembic_migrations_path(cls): - return tuning_box.get_migrations_dir() diff --git a/tuning_box/tests/__init__.py b/tuning_box/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tuning_box/tests/base.py b/tuning_box/tests/base.py deleted file mode 100644 index b977297..0000000 --- a/tuning_box/tests/base.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright 2010-2011 OpenStack Foundation -# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from oslotest import base - -from tuning_box import db - - -class TestCase(base.BaseTestCase): - - """Test case base class for all unit tests.""" - - -class PrefixedTestCaseMixin(object): - def setUp(self): - db.prefix_tables(db, 'test_prefix_') - self.addCleanup(db.unprefix_tables, db) - super(PrefixedTestCaseMixin, self).setUp() diff --git a/tuning_box/tests/cli/__init__.py b/tuning_box/tests/cli/__init__.py deleted file mode 100644 index 8363955..0000000 --- a/tuning_box/tests/cli/__init__.py +++ /dev/null @@ -1,99 +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 requests_mock.contrib import fixture as req_fixture -import six -import testscenarios - -from tuning_box import cli -from tuning_box.cli import base as cli_base -from tuning_box import client as tb_client -from tuning_box.tests import base - - -class FormatOutputTest(testscenarios.WithScenarios, base.TestCase): - scenarios = [ - (s[0], dict(zip(('output', 'format_', 'expected_result'), s[1]))) - for s in [ - ('none,plain', (None, 'plain', '')), - ('none,json', (None, 'json', 'null')), - # TODO(yorik-sar): look into why YAML return those elipsis - ('none,yaml', (None, 'yaml', 'null\n...\n')), - ('str,plain', (u"a string", 'plain', 'a string')), - ('str,json', (u"a string", 'json', '"a string"')), - ('str,yaml', (u"a string", 'yaml', 'a string\n...\n')), - ('int,plain', (42, 'plain', '42')), - ('int,json', (42, 'json', '42')), - ('int,yaml', (42, 'yaml', '42\n...\n')), - ('float,plain', (1.2, 'plain', '1.2')), - ('float,json', (1.2, 'json', '1.2')), - ('float,yaml', (1.2, 'yaml', '1.2\n...\n')), - ('list,plain', ([1, 2], 'plain', '[1, 2]')), - ('list,json', ([1, 2], 'json', '[1, 2]')), - ('list,yaml', ([1, 2], 'yaml', '- 1\n- 2\n')), - ('dict,plain', ({'a': 1}, 'plain', '{"a": 1}')), - ('dict,json', ({'a': 1}, 'json', '{"a": 1}')), - ('dict,yaml', ({'a': 1}, 'yaml', 'a: 1\n')), - ] - ] - - output = None - format_ = None - expected_result = None - - def test_format_output(self): - res = cli_base.format_output(self.output, self.format_) - self.assertEqual(self.expected_result, res) - - -class SafeTuningBoxApp(cli.TuningBoxApp): - def __init__(self, client): - super(SafeTuningBoxApp, self).__init__( - client=client, - **self.get_std_streams() - ) - - @staticmethod - def get_std_streams(): - if bytes is str: - io_cls = six.BytesIO - else: - io_cls = six.StringIO - return {k: io_cls() for k in ('stdin', 'stdout', 'stderr')} - - def build_option_parser(self, description, version, argparse_kwargs=None): - parser = super(SafeTuningBoxApp, self).build_option_parser( - description, version, argparse_kwargs) - parser.set_defaults(debug=True) - return parser - - def get_fuzzy_matches(self, cmd): - # Turn off guessing, we need exact failures in tests - return [] - - def run(self, argv): - try: - super(SafeTuningBoxApp, self).run(argv) - except SystemExit as e: - # We should check exit code only if system exit was called. - exit_code = e.code - assert exit_code == 0 - - -class _BaseCLITest(base.TestCase): - BASE_URL = 'http://somehost/prefix' - - def setUp(self): - super(_BaseCLITest, self).setUp() - client = tb_client.HTTPClient(self.BASE_URL) - self.req_mock = self.useFixture(req_fixture.Fixture()) - self.cli = SafeTuningBoxApp(client=client) diff --git a/tuning_box/tests/cli/test_components.py b/tuning_box/tests/cli/test_components.py deleted file mode 100644 index 3a309c4..0000000 --- a/tuning_box/tests/cli/test_components.py +++ /dev/null @@ -1,145 +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 testscenarios - -from tuning_box.tests.cli import _BaseCLITest - - -class TestCreateComponent(testscenarios.WithScenarios, _BaseCLITest): - scenarios = [ - (s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1]))) - for s in [ - ('json', ('/components', - 'comp create --name comp_name --format json', - '{\n "a": "b"\n}')), - ('yaml', ('/components', - 'comp create -n comp_name -f yaml', - 'a: b\n')), - ] - ] - - mock_url = None - args = None - expected_result = None - - def test_post(self): - self.req_mock.post( - self.BASE_URL + self.mock_url, - headers={'Content-Type': 'application/json'}, - json={'a': 'b'}, - ) - self.cli.run(self.args.split()) - self.assertEqual(self.expected_result, self.cli.stdout.getvalue()) - - -class TestListComponents(testscenarios.WithScenarios, _BaseCLITest): - - scenarios = [ - (s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1]))) - for s in [ - ('json', ('/components', 'comp list -f json', '[]')), - ('yaml', ('/components', 'comp list --format yaml', '[]\n')), - ] - ] - mock_url = None - args = None - expected_result = None - - def test_get(self): - self.req_mock.get( - self.BASE_URL + self.mock_url, - headers={'Content-Type': 'application/json'}, - json=[], - ) - self.cli.run(self.args.split()) - self.assertEqual(self.expected_result, self.cli.stdout.getvalue()) - - -class TestShowComponent(testscenarios.WithScenarios, _BaseCLITest): - - scenarios = [ - (s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1]))) - for s in [ - ('yaml', ('/components/9', 'comp show 9 -f yaml', - 'id: 1\nname: n\nresource_definitions: []\n')), - ] - ] - mock_url = None - args = None - expected_result = None - - def test_get(self): - self.req_mock.get( - self.BASE_URL + self.mock_url, - headers={'Content-Type': 'application/json'}, - json={'id': 1, 'name': 'n', 'resource_definitions': []}, - ) - self.cli.run(self.args.split()) - self.assertEqual(self.expected_result, self.cli.stdout.getvalue()) - - -class TestDeleteComponent(testscenarios.WithScenarios, _BaseCLITest): - - scenarios = [ - (s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1]))) - for s in [ - ('', ('/components/9', 'comp delete 9', - 'Component with id 9 was deleted\n')), - ] - ] - mock_url = None - args = None - expected_result = None - - def test_delete(self): - self.req_mock.delete( - self.BASE_URL + self.mock_url, - headers={'Content-Type': 'application/json'} - ) - self.cli.run(self.args.split()) - self.assertEqual(self.expected_result, self.cli.stdout.getvalue()) - - -class TestUpdateComponent(testscenarios.WithScenarios, _BaseCLITest): - - scenarios = [ - (s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1]))) - for s in [ - ('no_data', ('/components/9', 'comp update 9', '{}')), - ('s_name', ('/components/9', - 'comp update 9 -n comp_name', '{}')), - ('l_name', ('/components/9', - 'comp update 9 --name comp_name', '{}')), - ('s_r_defs', ('/components/9', - 'comp update 9 -r 1,2 ', '{}')), - ('l_r_ders', ('/components/9', - 'comp update 9 --resource-definitions 1,2', '{}')), - ('empty_s_r_defs', ('/components/9', - 'comp update 9 -r [] -n comp_name', '{}')), - ('empty_l_r_defs', ('/components/9', - 'comp update 9 --resource-definitions []', - '{}')) - ] - ] - mock_url = None - args = None - expected_result = None - - def test_update(self): - self.req_mock.patch( - self.BASE_URL + self.mock_url, - headers={'Content-Type': 'application/json'}, - json={} - ) - self.cli.run(self.args.split()) - self.assertEqual(self.expected_result, self.cli.stdout.getvalue()) diff --git a/tuning_box/tests/cli/test_environments.py b/tuning_box/tests/cli/test_environments.py deleted file mode 100644 index 34f230d..0000000 --- a/tuning_box/tests/cli/test_environments.py +++ /dev/null @@ -1,153 +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 testscenarios - -from tuning_box.tests.cli import _BaseCLITest - - -class TestCreateEnvironment(testscenarios.WithScenarios, _BaseCLITest): - scenarios = [ - (s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1]))) - for s in [ - ('json', ('/environments', - 'env create -l lvl1 -i 1 -f json', - '{\n "a": "b"\n}')), - ('yaml', ('/environments', - 'env create -l lvl1,lvl2 -i 1 -f yaml', - 'a: b\n')), - ('multi', ('/environments', - 'env create -l lvl1,lvl2 -i 1,2,3 -f yaml', - 'a: b\n')), - ('no_data', ('/environments', - 'env create -f yaml', - 'a: b\n')) - - ] - ] - - mock_url = None - args = None - expected_result = None - - def test_post(self): - self.req_mock.post( - self.BASE_URL + self.mock_url, - headers={'Content-Type': 'application/json'}, - json={'a': 'b'}, - ) - self.cli.run(self.args.split()) - self.assertEqual(self.expected_result, self.cli.stdout.getvalue()) - - -class TestListEnvironments(testscenarios.WithScenarios, _BaseCLITest): - - scenarios = [ - (s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1]))) - for s in [ - ('json', ('/environments', 'env list -f json', '[]')), - ('yaml', ('/environments', 'env list -f yaml', '[]\n')) - ] - ] - mock_url = None - args = None - expected_result = None - - def test_get(self): - self.req_mock.get( - self.BASE_URL + self.mock_url, - headers={'Content-Type': 'application/json'}, - json={}, - ) - self.cli.run(self.args.split()) - self.assertEqual(self.expected_result, self.cli.stdout.getvalue()) - - -class TestShowEnvironment(testscenarios.WithScenarios, _BaseCLITest): - - scenarios = [ - (s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1]))) - for s in [ - ('json', ('/environments/9', 'env show 9 -f json -c id', - '{\n "id": 1\n}')), - ('yaml', ('/environments/9', 'env show 9 -f yaml -c id', - 'id: 1\n')) - ] - ] - mock_url = None - args = None - expected_result = None - - def test_get(self): - self.req_mock.get( - self.BASE_URL + self.mock_url, - headers={'Content-Type': 'application/json'}, - json={'id': 1}, - ) - self.cli.run(self.args.split()) - self.assertEqual(self.expected_result, self.cli.stdout.getvalue()) - - -class TestDeleteEnvironment(testscenarios.WithScenarios, _BaseCLITest): - - scenarios = [ - (s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1]))) - for s in [ - ('json', ('/environments/9', 'env delete 9', - 'Environment with id 9 was deleted\n')) - ] - ] - mock_url = None - args = None - expected_result = None - - def test_delete(self): - self.req_mock.delete( - self.BASE_URL + self.mock_url, - headers={'Content-Type': 'application/json'} - ) - self.cli.run(self.args.split()) - self.assertEqual(self.expected_result, self.cli.stdout.getvalue()) - - -class TestUpdateEnvironment(testscenarios.WithScenarios, _BaseCLITest): - - scenarios = [ - (s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1]))) - for s in [ - ('no_data', ('/environments/9', 'env update 9', '{}')), - ('level', ('/environments/9', 'env update 9 -l lvl1', '{}')), - ('levels', ('/environments/9', - 'env update 9 -l lvl1,lvl2', - '{}')), - ('component', ('/environments/9', - 'env update 9 -l lvl1,lvl2 -i 1', - '{}')), - ('components', ('/environments/9', - 'env update 9 -l lvl1,lvl2 -i 1,2', - '{}')), - ('erase', ('/environments/9', 'env update 9 -l [] -i 1,2', '{}')), - ('erase', ('/environments/9', 'env update 9 -l [] -i []', '{}')), - ] - ] - mock_url = None - args = None - expected_result = None - - def test_update(self): - self.req_mock.patch( - self.BASE_URL + self.mock_url, - headers={'Content-Type': 'application/json'}, - json={} - ) - self.cli.run(self.args.split()) - self.assertEqual(self.expected_result, self.cli.stdout.getvalue()) diff --git a/tuning_box/tests/cli/test_help.py b/tuning_box/tests/cli/test_help.py deleted file mode 100644 index 16fff20..0000000 --- a/tuning_box/tests/cli/test_help.py +++ /dev/null @@ -1,20 +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 tuning_box.tests.cli import _BaseCLITest - - -class TestApp(_BaseCLITest): - def test_help(self): - self.cli.run(["--help"]) - self.assertEqual('', self.cli.stderr.getvalue()) - self.assertNotIn('Could not', self.cli.stdout.getvalue()) diff --git a/tuning_box/tests/cli/test_hierarchy_levels.py b/tuning_box/tests/cli/test_hierarchy_levels.py deleted file mode 100644 index 29c8b9d..0000000 --- a/tuning_box/tests/cli/test_hierarchy_levels.py +++ /dev/null @@ -1,67 +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 testscenarios - -from tuning_box.tests.cli import _BaseCLITest - - -class TestHierarchyLevels(testscenarios.WithScenarios, _BaseCLITest): - - scenarios = [ - (s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1]))) - for s in [ - ('json', ('/environments/9/hierarchy_levels', - 'lvl list -e 9 -f json', '[]')), - ('yaml', ('/environments/9/hierarchy_levels', - 'lvl list -e 9 -f yaml', '[]\n')) - ] - ] - mock_url = None - args = None - expected_result = None - - def test_get(self): - self.req_mock.get( - self.BASE_URL + self.mock_url, - headers={'Content-Type': 'application/json'}, - json={}, - ) - self.cli.run(self.args.split()) - self.assertEqual(self.expected_result, self.cli.stdout.getvalue()) - - -class TestShowHierarchyLevel(testscenarios.WithScenarios, _BaseCLITest): - - scenarios = [ - (s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1]))) - for s in [ - ('json', ('/environments/9/hierarchy_levels/n', - 'lvl show -e 9 -f json -c id n', - '{\n "id": 1\n}')), - ('yaml', ('/environments/9/hierarchy_levels/nn', - 'lvl show -e 9 -f yaml -c id nn', - 'id: 1\n')) - ] - ] - mock_url = None - args = None - expected_result = None - - def test_get(self): - self.req_mock.get( - self.BASE_URL + self.mock_url, - headers={'Content-Type': 'application/json'}, - json={'id': 1}, - ) - self.cli.run(self.args.split()) - self.assertEqual(self.expected_result, self.cli.stdout.getvalue()) diff --git a/tuning_box/tests/cli/test_resource_definitions.py b/tuning_box/tests/cli/test_resource_definitions.py deleted file mode 100644 index 56dbab8..0000000 --- a/tuning_box/tests/cli/test_resource_definitions.py +++ /dev/null @@ -1,150 +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 testscenarios -import yaml - -from tuning_box.tests.cli import _BaseCLITest - - -class TestCreateResourceDefinition(testscenarios.WithScenarios, _BaseCLITest): - scenarios = [ - (s[0], - dict(zip(('args', 'expected_body', 'stdin'), s[1]))) - for s in [ - ('json', ('def create -n n -i 1 -d json -f yaml', - 'content: {}\ncomponent_id: 1\nid: 1\nname: n\n', - '{"a": 3}')), - ('yaml', ('def create -n n -i 1 -d yaml -f yaml', - 'content: {}\ncomponent_id: 1\nid: 1\nname: n\n', - 'a: b\n')), - ] - ] - - args = None - expected_body = None - stdin = None - - def test_post(self): - url = self.BASE_URL + '/resource_definitions' - self.req_mock.post( - url, - headers={'Content-Type': 'application/json'}, - json={'id': 1, 'component_id': 1, 'name': 'n', 'content': {}} - ) - if self.stdin: - self.cli.stdin.write(self.stdin) - self.cli.stdin.seek(0) - self.cli.run(self.args.split()) - self.assertEqual( - yaml.safe_load(self.expected_body), - yaml.safe_load(self.cli.stdout.getvalue()) - ) - - -class TestListResourceDefinitions(testscenarios.WithScenarios, _BaseCLITest): - - scenarios = [ - (s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1]))) - for s in [ - ('json', ('/resource_definitions', 'def list -f json', '[]')), - ('yaml', ('/resource_definitions', 'def list --format yaml', - '[]\n')), - ] - ] - mock_url = None - args = None - expected_result = None - - def test_get(self): - self.req_mock.get( - self.BASE_URL + self.mock_url, - headers={'Content-Type': 'application/json'}, - json=[], - ) - self.cli.run(self.args.split()) - self.assertEqual(self.expected_result, self.cli.stdout.getvalue()) - - -class TestShowComponent(testscenarios.WithScenarios, _BaseCLITest): - - scenarios = [ - (s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1]))) - for s in [ - ('yaml', ('/resource_definitions/9', 'def show 9 -f yaml', - 'id: 1\nname: n\ncomponent_id: 2\ncontent: {}\n')), - ] - ] - mock_url = None - args = None - expected_result = None - - def test_get(self): - self.req_mock.get( - self.BASE_URL + self.mock_url, - headers={'Content-Type': 'application/json'}, - json={'id': 1, 'name': 'n', 'component_id': 2, 'content': {}}, - ) - self.cli.run(self.args.split()) - self.assertEqual(self.expected_result, self.cli.stdout.getvalue()) - - -class TestDeleteComponent(testscenarios.WithScenarios, _BaseCLITest): - - scenarios = [ - (s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1]))) - for s in [ - ('', ('/resource_definitions/9', 'def delete 9', - 'Resource_definition with id 9 was deleted\n')), - ] - ] - mock_url = None - args = None - expected_result = None - - def test_delete(self): - self.req_mock.delete( - self.BASE_URL + self.mock_url, - headers={'Content-Type': 'application/json'} - ) - self.cli.run(self.args.split()) - self.assertEqual(self.expected_result, self.cli.stdout.getvalue()) - - -class TestUpdateResourceDefinition(testscenarios.WithScenarios, _BaseCLITest): - - scenarios = [ - (s[0], dict(zip(('args', 'expected_result', 'stdin'), s[1]))) - for s in [ - ('no_data', ('def update 9', '{}')), - ('name', ('def update 9 -n comp_name', '{}', False)), - ('component_id', ('def update 9 -i 1', '{}', False)), - ('content', ('def update 9 -p "a" -t yaml', '{}', False)), - ('stdin_content', ('def update 9 -d yaml', '{}', 'a: b')), - ('stdin_content', ('def update 9 -d yaml', '{}', 'a: b')), - ] - ] - args = None - expected_result = None - stdin = None - - def test_update(self): - self.req_mock.patch( - self.BASE_URL + '/resource_definitions/9', - headers={'Content-Type': 'application/json'}, - json={} - ) - if self.stdin: - self.cli.stdin.write(self.stdin) - self.cli.stdin.seek(0) - self.cli.run(self.args.split()) - self.assertEqual(self.expected_result, self.cli.stdout.getvalue()) diff --git a/tuning_box/tests/cli/test_resources.py b/tuning_box/tests/cli/test_resources.py deleted file mode 100644 index 007ebb7..0000000 --- a/tuning_box/tests/cli/test_resources.py +++ /dev/null @@ -1,268 +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 testscenarios - -from tuning_box.cli import base as cli_base -from tuning_box.tests import base -from tuning_box.tests.cli import _BaseCLITest - - -class TestLevelsConverter(testscenarios.WithScenarios, base.TestCase): - scenarios = [ - (s[0], dict(zip(('input', 'expected_result', 'expected_error'), s[1]))) - for s in [ - ('empty', ('', None, TypeError)), - ('one', ('lvl=val', [('lvl', 'val')])), - ('two', ('lvl1=val1,lvl2=val2', [('lvl1', 'val1'), - ('lvl2', 'val2')])), - ('no_eq', ('val', None, TypeError)), - ('no_eq2', ('lvl1=val2,val', None, TypeError)), - ('two_eq', ('lvl1=foo=baz', [('lvl1', 'foo=baz')])), - ] - ] - - input = None - expected_result = None - expected_error = None - - def test_levels(self): - if self.expected_error: - self.assertRaises( - self.expected_error, cli_base.level_converter, self.input) - else: - res = cli_base.level_converter(self.input) - self.assertEqual(self.expected_result, res) - - -class TestGet(testscenarios.WithScenarios, _BaseCLITest): - scenarios = [ - (s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1]))) - for s in [ - ('global,json', ( - '/environments/1/resources/1/values?effective', - 'get --env 1 --resource 1 --format=json', - '{\n "hello": "world"\n}', - )), - ('global,lookup', ( - '/environments/1/resources/1/values?effective', - 'get --env 1 --resource 1 --format=json --show-lookup', - '{\n "hello": "world"\n}', - )), - ('lowlevel,json', ( - '/environments/1/lvl1/value1/resources/1/values?effective', - 'get --env 1 --level lvl1=value1 --resource 1 --format=json', - '{\n "hello": "world"\n}', - )), - ('global,yaml', ( - '/environments/1/resources/1/values?effective', - 'get --env 1 --resource 1 --format yaml', - 'hello: world\n', - )), - ('lowlevel,yaml', ( - '/environments/1/lvl1/value1/resources/1/values?effective', - 'get --env 1 --level lvl1=value1 --resource 1 --format yaml', - 'hello: world\n', - )), - ('key,json', ( - '/environments/1/resources/1/values?effective&key=k', - 'get --env 1 --resource 1 --key k --format json', - '{\n "k": {\n "hello": "world"\n }\n}' - )), - ('key,lookup', ( - '/environments/1/resources/1/values?effective&key=k', - 'get --env 1 --resource 1 --key k --format json -s', - '{\n "k": {\n "hello": "world"\n }\n}' - )), - ('key,yaml', ( - '/environments/1/resources/1/values?effective&key=k', - 'get --env 1 --resource 1 --key k --format yaml', - "k:\n hello: world\n" - )), - ('no_key,json', ( - '/environments/1/resources/1/values?key=k&effective', - 'get --env 1 --resource 1 --key k --format json', - '{\n "k": {\n "hello": "world"\n }\n}' - )), - ('no_key,yaml', ( - '/environments/1/resources/1/values?key=no.key&effective', - 'get --env 1 --resource 1 --key no.key --format yaml', - "no.key:\n hello: world\n" - )) - ] - ] - - mock_url = None - args = None - expected_result = None - - def test_get(self): - self.req_mock.get( - self.BASE_URL + self.mock_url, - headers={'Content-Type': 'application/json'}, - json={'hello': 'world'}, - ) - self.cli.run(self.args.split()) - self.assertEqual(self.expected_result, self.cli.stdout.getvalue()) - - -class TestSetWithStdin(testscenarios.WithScenarios, _BaseCLITest): - scenarios = [ - (s[0], - dict(zip(('args', 'expected_body', 'stdin'), s[1]))) - for s in [ - ('json', ('--format json', {'a': 3}, '{"a": 3}')), - ('yaml', ('--format yaml', {'a': 3}, 'a: 3')) - ] - ] - - args = None - expected_body = None - stdin = None - - url_last_part = 'values' - cmd = 'set' - - def test_set(self): - url = self.BASE_URL + '/environments/1/lvl1/value1/resources/1/' + \ - self.url_last_part - self.req_mock.put(url) - args = [self.cmd] + ("--env 1 --level lvl1=value1 --resource 1 " + - self.args).split() - if self.stdin: - self.cli.stdin.write(self.stdin) - self.cli.stdin.seek(0) - self.cli.run(args) - req_history = self.req_mock.request_history - self.assertEqual('PUT', req_history[-1].method) - self.assertEqual(self.expected_body, req_history[-1].json()) - - -class TestSet(testscenarios.WithScenarios, _BaseCLITest): - scenarios = [ - (s[0], - dict(zip(('args', 'expected_body'), s[1]))) - for s in [ - ('json', ('--type json --value "aaa"', 'aaa')), - ('yaml', ('--type yaml --value "aaa"', 'aaa')) - ] - ] - - args = None - expected_body = None - - url_last_part = 'values' - cmd = 'set' - - def test_set(self): - url = self.BASE_URL + '/environments/1/lvl1/value1/resources/1/' + \ - self.url_last_part - self.req_mock.put(url) - args = [self.cmd] + ("--env 1 --level lvl1=value1 --resource 1 " + - self.args).split() - self.cli.run(args) - req_history = self.req_mock.request_history - self.assertEqual('PUT', req_history[-1].method) - self.assertEqual(self.expected_body, req_history[-1].json()) - - -class TestSetKeys(testscenarios.WithScenarios, _BaseCLITest): - scenarios = [ - (s[0], - dict(zip(('args', 'expected_body', 'stdin'), s[1]))) - for s in [ - ('key,json', ('--key c --format json', [['c', {'a': 3}]], - '{"a": 3}')), - ('key,yaml', ('--key c --format yaml', [['c', {'a': 3}]], - 'a: 3')), - ('key,null', ('--key c --type null', [['c', None]])), - ('key,str', ('--key c --type str --value 4', [['c', '4']])) - ] - ] - - args = None - expected_body = None - stdin = None - - url_last_part = 'values' - cmd = 'set' - - def test_set(self): - url = self.BASE_URL + '/environments/1/lvl1/value1/resources/1/' + \ - self.url_last_part + '/keys/set' - self.req_mock.patch(url) - args = [self.cmd] + ("--env 1 --level lvl1=value1 --resource 1 " + - self.args).split() - if self.stdin: - self.cli.stdin.write(self.stdin) - self.cli.stdin.seek(0) - self.cli.run(args) - req_history = self.req_mock.request_history - self.assertEqual('PATCH', req_history[-1].method) - self.assertEqual(self.expected_body, req_history[-1].json()) - - -class TestDelete(testscenarios.WithScenarios, _BaseCLITest): - scenarios = [ - (s[0], - dict(zip(('args', 'expected_body'), s[1]))) - for s in [ - ('k1', ('-k k1', "ResourceValue for key k1 was deleted\n")), - ('xx', ('-k xx', "ResourceValue for key xx was deleted\n")), - ('x.x', ('-k x.x', "ResourceValue for key x.x was deleted\n")), - ('x.0', ('-k x.0', "ResourceValue for key x.0 was deleted\n")) - ] - ] - - args = None - expected_body = None - url_last_part = 'values' - cmd = 'del' - - def test_delete(self): - url = self.BASE_URL + '/environments/1/lvl1/value1/resources/1/' + \ - self.url_last_part + '/keys/delete' - self.req_mock.patch(url) - args = [self.cmd] + ("--env 1 --level lvl1=value1 --resource 1 " + - self.args).split() - self.cli.run(args) - self.assertEqual(self.expected_body, self.cli.stdout.getvalue()) - - -class TestOverride(TestSet): - url_last_part = 'overrides' - cmd = 'override' - - -class TestDeleteOverride(testscenarios.WithScenarios, _BaseCLITest): - scenarios = [ - (s[0], - dict(zip(('args', 'expected_body'), s[1]))) - for s in [ - ('k1', ('-k k1', "ResourceOverride for key k1 was deleted\n")), - ('xx', ('-k xx', "ResourceOverride for key xx was deleted\n")), - ] - ] - - args = None - expected_body = None - url_last_part = 'overrides' - cmd = 'rm override' - - def test_delete(self): - url = self.BASE_URL + '/environments/1/lvl1/value1/resources/1/' + \ - self.url_last_part + '/keys/delete' - self.req_mock.patch(url) - args = [self.cmd] + ("--env 1 --level lvl1=value1 --resource 1 " + - self.args).split() - self.cli.run(args) - self.assertEqual(self.expected_body, self.cli.stdout.getvalue()) diff --git a/tuning_box/tests/library/__init__.py b/tuning_box/tests/library/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tuning_box/tests/library/test_components.py b/tuning_box/tests/library/test_components.py deleted file mode 100644 index 9a8871e..0000000 --- a/tuning_box/tests/library/test_components.py +++ /dev/null @@ -1,204 +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 copy - -from tuning_box import db -from tuning_box.library import components -from tuning_box.tests.test_app import BaseTest - - -class TestComponents(BaseTest): - - @property - def _component_json(self): - return { - 'id': 7, - 'name': 'component1', - 'resource_definitions': [{ - 'id': 5, - 'name': 'resdef1', - 'component_id': 7, - 'content': {'key': 'nsname.key'}, - }], - } - - def test_get_components_empty(self): - res = self.client.get('/components') - self.assertEqual(res.status_code, 200) - self.assertEqual(res.json, []) - - def test_get_components(self): - self._fixture() - res = self.client.get('/components') - self.assertEqual(200, res.status_code) - self.assertEqual(self._component_json, res.json[0]) - - def test_get_one_component(self): - self._fixture() - res = self.client.get('/components/7') - self.assertEqual(200, res.status_code) - self.assertEqual(self._component_json, res.json) - - def test_get_one_component_404(self): - res = self.client.get('/components/7') - self.assertEqual(res.status_code, 404) - - def test_post_component(self): - self._fixture() # Just for namespace - json = self._component_json - del json['id'] - del json['resource_definitions'][0]['id'] - del json['resource_definitions'][0]['component_id'] - json['name'] = 'component2' - res = self.client.post('/components', data=json) - self.assertEqual(201, res.status_code) - json['id'] = res.json['id'] - json['resource_definitions'][0]['component_id'] = json['id'] - json['resource_definitions'][0]['id'] = 6 - self.assertEqual(res.json, json) - self._assert_db_effect(db.Component, res.json['id'], - components.component_fields, json) - - def test_post_component_conflict(self): - self._fixture() # Just for namespace - json = self._component_json - del json['id'] - del json['resource_definitions'][0]['id'] - del json['resource_definitions'][0]['component_id'] - res = self.client.post('/components', data=json) - self.assertEqual(res.status_code, 409) - self._assert_not_in_db(db.Component, 8) - - def test_post_component_conflict_propagate_exc(self): - self.app.config["PROPAGATE_EXCEPTIONS"] = True - self._fixture() # Just for namespace - json = self._component_json - del json['id'] - del json['resource_definitions'][0]['id'] - del json['resource_definitions'][0]['component_id'] - res = self.client.post('/components', data=json) - self.assertEqual(res.status_code, 409) - self._assert_not_in_db(db.Component, 8) - - def test_post_component_no_resdef_content(self): - self._fixture() # Just for namespace - json = self._component_json - del json['id'] - del json['resource_definitions'][0]['id'] - del json['resource_definitions'][0]['component_id'] - del json['resource_definitions'][0]['content'] - json['name'] = 'component2' - res = self.client.post('/components', data=json) - self.assertEqual(res.status_code, 201) - json['id'] = res.json['id'] - json['resource_definitions'][0]['component_id'] = json['id'] - json['resource_definitions'][0]['id'] = 6 - json['resource_definitions'][0]['content'] = None - self.assertEqual(json, res.json) - self._assert_db_effect(db.Component, res.json['id'], - components.component_fields, json) - - def test_delete_component(self): - self._fixture() - res = self.client.delete('/components/7') - self.assertEqual(res.status_code, 204) - self.assertEqual(res.data, b'') - self._assert_not_in_db(db.Component, 7) - - with self.app.app_context(): - actual_res_defs = db.ResourceDefinition.query.all() - self.assertEqual([], actual_res_defs) - - def test_delete_component_404(self): - res = self.client.delete('/components/7') - self.assertEqual(res.status_code, 404) - - def test_put_component_404(self): - res = self.client.put('/components/7') - self.assertEqual(res.status_code, 404) - - def test_put_component(self): - self._fixture() - component_url = '/components/7' - initial_data = self._component_json - new_name = 'new_{0}'.format(initial_data['name']) - - # Updating name - res = self.client.put(component_url, data={'name': new_name}) - self.assertEqual(204, res.status_code) - actual_component = self.client.get(component_url).json - self.assertEqual(new_name, actual_component['name']) - self.assertItemsEqual(initial_data['resource_definitions'], - actual_component['resource_definitions']) - - # Updating resource_definitions - res = self.client.put(component_url, - data={'resource_definitions': []}) - self.assertEqual(204, res.status_code) - actual_component = self.client.get(component_url).json - self.assertEqual([], actual_component['resource_definitions']) - - # Restoring resource_definitions and name - res_def = { - 'name': 'resdef1', - 'component_id': 7, - 'content': {'key': 'nsname.key'} - } - res = self.client.post( - '/resource_definitions', - data=res_def - ) - self.assertEqual(201, res.status_code) - - res = self.client.put( - component_url, - data={'name': initial_data['name']} - ) - self.assertEqual(204, res.status_code) - actual_component = self.client.get(component_url).json - self.assertEqual(initial_data['name'], - actual_component['name']) - self.assertItemsEqual( - (d['name'] for d in initial_data['resource_definitions']), - (d['name'] for d in actual_component['resource_definitions']) - ) - - def test_put_component_resource_not_found(self): - self._fixture() - component_url = '/components/7' - initial_data = self._component_json - - resource_definition = copy.deepcopy( - initial_data['resource_definitions'][0]) - resource_definition['id'] = None - - res = self.client.put( - component_url, - data={'resource_definitions': [resource_definition]} - ) - self.assertEqual(404, res.status_code) - - def test_put_component_ignore_changing_id(self): - self._fixture() - component_url = '/components/7' - initial_data = self._component_json - new_name = 'new_{0}'.format(initial_data['name']) - - res = self.client.put(component_url, - data={'name': new_name, 'id': None, - 'fake': 'xxxx'}) - self.assertEqual(204, res.status_code) - actual_component = self.client.get(component_url).json - self.assertEqual(new_name, actual_component['name']) - self.assertItemsEqual(initial_data['resource_definitions'], - actual_component['resource_definitions']) diff --git a/tuning_box/tests/library/test_environments.py b/tuning_box/tests/library/test_environments.py deleted file mode 100644 index 58735b0..0000000 --- a/tuning_box/tests/library/test_environments.py +++ /dev/null @@ -1,322 +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 tuning_box import db -from tuning_box import library -from tuning_box.library import environments -from tuning_box.tests.test_app import BaseTest - - -class TestEnvironments(BaseTest): - - collection_url = '/environments' - object_url = collection_url + '/{0}' - - def test_get_environments_empty(self): - res = self.client.get(self.collection_url) - self.assertEqual(res.status_code, 200) - self.assertEqual(res.json, []) - - def test_get_environments(self): - self._fixture() - res = self.client.get(self.collection_url) - self.assertEqual(200, res.status_code) - self.assertEqual(1, len(res.json)) - self.assertEqual( - {'id': 9, 'components': [7], 'hierarchy_levels': ['lvl1', 'lvl2']}, - res.json[0] - ) - - def test_get_one_environment(self): - self._fixture() - env_id = 9 - res = self.client.get(self.object_url.format(env_id)) - self.assertEqual(200, res.status_code) - self.assertEqual( - {'id': 9, 'components': [7], 'hierarchy_levels': ['lvl1', 'lvl2']}, - res.json - ) - - def test_post_environment_hierarchy_levels_order(self): - self._fixture() - levels = ['lvla', 'lvlb'] - data = {'components': [7], 'hierarchy_levels': levels} - res = self.client.post(self.collection_url, data=data) - self.assertEqual(201, res.status_code) - self.assertEqual(levels, res.json['hierarchy_levels']) - - def test_get_one_environment_404(self): - env_id = 9 - res = self.client.get(self.object_url.format(env_id)) - self.assertEqual(res.status_code, 404) - - def test_post_environment(self): - self._fixture() - json = {'components': [7], 'hierarchy_levels': ['lvla', 'lvlb']} - res = self.client.post(self.collection_url, data=json) - self.assertEqual(res.status_code, 201) - json['id'] = res.json['id'] - self.assertEqual(json, res.json) - self._assert_db_effect( - db.Environment, res.json['id'], - environments.environment_fields, json) - - def test_post_environment_preserve_id(self): - self._fixture() - json = { - 'id': 42, - 'components': [7], - 'hierarchy_levels': ['lvla', 'lvlb'], - } - res = self.client.post(self.collection_url, data=json) - self.assertEqual(201, res.status_code) - self.assertEqual(json, res.json) - self._assert_db_effect( - db.Environment, 42, environments.environment_fields, json) - - def test_post_environment_preserve_id_conflict(self): - self._fixture() - json = { - 'id': 9, - 'components': [7], - 'hierarchy_levels': ['lvla', 'lvlb'], - } - res = self.client.post(self.collection_url, data=json) - self.assertEqual(res.status_code, 409) - - def test_post_environment_preserve_id_conflict_propagate_exc(self): - self.app.config["PROPAGATE_EXCEPTIONS"] = True - self._fixture() - json = { - 'id': 9, - 'components': [7], - 'hierarchy_levels': ['lvla', 'lvlb'], - } - res = self.client.post(self.collection_url, data=json) - self.assertEqual(res.status_code, 409) - - def test_post_environment_by_component_name(self): - self._fixture() - json = { - 'components': ['component1'], - 'hierarchy_levels': ['lvla', 'lvlb'], - } - res = self.client.post(self.collection_url, data=json) - self.assertEqual(res.status_code, 201) - json['id'] = res.json['id'] - json['components'] = [7] - self.assertEqual(json, res.json) - self._assert_db_effect( - db.Environment, res.json['id'], - environments.environment_fields, json) - - def test_post_components_duplication(self): - self._fixture() - json = { - 'components': ['component1', 7], - 'hierarchy_levels': ['lvl'], - } - res = self.client.post(self.collection_url, data=json) - self.assertEqual(409, res.status_code) - - def test_post_components_no_duplication(self): - self._fixture() - components_url = '/components' - res = self.client.get(components_url) - self.assertEqual(200, res.status_code) - component = res.json[0] - - # Creating component with name equal to id of existed component - res = self.client.post( - components_url, - data={ - 'name': component['id'], - 'resource_definitions': [] - } - ) - self.assertEqual(201, res.status_code) - new_component = res.json - - # Checking no components duplication detected - json = { - 'components': [component['id'], new_component['name']], - 'hierarchy_levels': ['lvl'], - } - res = self.client.post(self.collection_url, data=json) - self.assertEqual(201, res.status_code) - - def test_post_environment_404(self): - self._fixture() - json = {'components': [8], 'hierarchy_levels': ['lvla', 'lvlb']} - res = self.client.post(self.collection_url, data=json) - self.assertEqual(res.status_code, 404) - self._assert_not_in_db(db.Environment, 10) - - def test_post_environment_by_component_name_404(self): - self._fixture() - json = { - 'components': ['component2'], - 'hierarchy_levels': ['lvla', 'lvlb'], - } - res = self.client.post(self.collection_url, data=json) - self.assertEqual(res.status_code, 404) - self._assert_not_in_db(db.Environment, 10) - - def test_delete_environment(self): - self._fixture() - env_id = 9 - env_url = self.object_url.format(env_id) - res = self.client.get(env_url) - self.assertEqual(200, res.status_code) - levels = ['lvl1', 'lvl2'] - self.assertEqual(levels, res.json['hierarchy_levels']) - - res = self.client.delete(env_url) - self.assertEqual(204, res.status_code) - self.assertEqual(res.data, b'') - self._assert_not_in_db(db.Environment, 9) - - with self.app.app_context(): - for name in levels: - obj = db.EnvironmentHierarchyLevel.query.filter( - db.EnvironmentHierarchyLevel.name == name - ).first() - self.assertIsNone(obj) - - def test_delete_environment_404(self): - env_id = 9 - res = self.client.delete(self.object_url.format(env_id)) - self.assertEqual(res.status_code, 404) - - def test_put_environment_404(self): - env_id = 7 - res = self.client.put(self.object_url.format(env_id)) - self.assertEqual(res.status_code, 404) - - def test_put_environment_components(self): - self._fixture() - environment_url = '/environments/9' - initial = self.client.get(environment_url).json - - # Updating components - res = self.client.put(environment_url, - data={'components': []}) - self.assertEqual(204, res.status_code) - actual = self.client.get(environment_url).json - self.assertEqual([], actual['components']) - - # Restoring components - res = self.client.put( - environment_url, - data={'components': initial['components']} - ) - self.assertEqual(204, res.status_code) - actual = self.client.get(environment_url).json - self.assertEqual(initial, actual) - - def test_put_environment_component_not_found(self): - self._fixture() - env_id = 9 - res = self.client.put( - self.object_url.format(env_id), - data={'components': [None]} - ) - self.assertEqual(404, res.status_code) - - def check_hierarchy_levels(self, hierarchy_levels_names): - with self.app.app_context(): - hierarchy_levels = library.load_objects_by_id_or_name( - db.EnvironmentHierarchyLevel, hierarchy_levels_names) - parent_id = None - for level in hierarchy_levels: - self.assertEqual(parent_id, level.parent_id) - parent_id = level.id - - def test_put_environment_hierarchy_levels(self): - self._fixture() - env_id = 9 - environment_url = self.object_url.format(env_id) - initial = self.client.get(environment_url).json - - # Updating hierarchy levels - res = self.client.put(environment_url, - data={'hierarchy_levels': []}) - self.assertEqual(204, res.status_code) - actual = self.client.get(environment_url).json - self.assertEqual([], actual['hierarchy_levels']) - - # Restoring levels - res = self.client.put( - environment_url, - data={'hierarchy_levels': initial['hierarchy_levels']} - ) - self.assertEqual(204, res.status_code) - actual = self.client.get(environment_url).json - self.assertEqual(initial, actual) - self.check_hierarchy_levels(actual['hierarchy_levels']) - - def test_put_environment_hierarchy_levels_remove_level(self): - self._fixture() - env_id = 9 - environment_url = self.object_url.format(env_id) - initial = self.client.get(environment_url).json - expected_levels = initial['hierarchy_levels'][1:] - - # Updating hierarchy levels - res = self.client.put( - environment_url, - data={'hierarchy_levels': expected_levels} - ) - self.assertEqual(204, res.status_code) - actual = self.client.get(environment_url).json - self.assertEqual(expected_levels, actual['hierarchy_levels']) - self.check_hierarchy_levels(actual['hierarchy_levels']) - - def test_put_environment_hierarchy_levels_reverse(self): - self._fixture() - env_id = 9 - env_url = self.object_url.format(env_id) - initial = self.client.get(env_url).json - expected_levels = initial['hierarchy_levels'] - expected_levels.reverse() - - # Updating hierarchy levels - res = self.client.put( - env_url, - data={'hierarchy_levels': expected_levels} - ) - self.assertEqual(204, res.status_code) - actual = self.client.get(env_url).json - self.assertEqual(expected_levels, actual['hierarchy_levels']) - self.check_hierarchy_levels(actual['hierarchy_levels']) - - def test_put_environment_hierarchy_levels_with_new_level(self): - self._fixture() - env_id = 9 - env_url = self.object_url.format(env_id) - initial = self.client.get(env_url).json - expected_levels = ['root'] + initial['hierarchy_levels'] - - res = self.client.put( - env_url, - data={'hierarchy_levels': expected_levels} - ) - self.assertEqual(204, res.status_code) - - res = self.client.get('/environments/9/hierarchy_levels') - self.assertEqual(200, res.status_code) - - res = self.client.get(env_url) - self.assertEqual(200, res.status_code) - actual = res.json - self.assertEqual(expected_levels, actual['hierarchy_levels']) - self.check_hierarchy_levels(actual['hierarchy_levels']) diff --git a/tuning_box/tests/library/test_hierarchy_levels.py b/tuning_box/tests/library/test_hierarchy_levels.py deleted file mode 100644 index 30f7e34..0000000 --- a/tuning_box/tests/library/test_hierarchy_levels.py +++ /dev/null @@ -1,149 +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 six - -from tuning_box import db -from tuning_box import errors -from tuning_box.library import hierarchy_levels -from tuning_box.tests.test_app import BaseTest - - -class TestLevelsHierarchy(BaseTest): - - collection_url = '/environments/{0}/hierarchy_levels' - object_url = collection_url + '/{1}' - - def test_get_environment_level_value_root(self): - self._fixture() - with self.app.app_context(), db.db.session.begin(): - level_value = hierarchy_levels.get_environment_level_value( - db.Environment(id=9), - [], - ) - self.assertIsNone(level_value) - - def test_get_environment_level_value_deep(self): - self._fixture() - with self.app.app_context(), db.db.session.begin(): - level_value = hierarchy_levels.get_environment_level_value( - db.Environment(id=9), - [('lvl1', 'val1'), ('lvl2', 'val2')], - ) - self.assertIsNotNone(level_value) - self.assertEqual(level_value.level.name, 'lvl2') - self.assertEqual(level_value.value, 'val2') - level = level_value.level.parent - self.assertIsNotNone(level) - self.assertEqual(level.name, 'lvl1') - self.assertIsNone(level.parent) - - def test_get_environment_level_values(self): - self._fixture() - env_id = 9 - with self.app.app_context(), db.db.session.begin(): - # Creating level values - hierarchy_levels.get_environment_level_value( - db.Environment(id=env_id), - [('lvl1', 'val11'), ('lvl2', 'val21')], - ) - hierarchy_levels.get_environment_level_value( - db.Environment(id=env_id), - [('lvl1', 'val11'), ('lvl2', 'val22')], - ) - hierarchy_levels.get_environment_level_value( - db.Environment(id=env_id), - [('lvl1', 'val12'), ('lvl2', 'val23')], - ) - - res = self.client.get(self.collection_url.format(9)) - lvl1 = res.json[0] - self.assertItemsEqual(['val11', 'val12'], lvl1['values']) - - lvl2 = res.json[1] - self.assertItemsEqual(['val21', 'val22', 'val23'], lvl2['values']) - - def test_get_environment_level_value_bad_level(self): - self._fixture() - with self.app.app_context(), db.db.session.begin(): - exc = self.assertRaises( - errors.TuningboxNotFound, - hierarchy_levels.get_environment_level_value, - db.Environment(id=9), - [('lvlx', 'val1')], - ) - self.assertEqual( - six.text_type(exc), - "Unexpected level name 'lvlx'. Expected 'lvl1'.", - ) - - def test_get_hierarchy_levels(self): - self._fixture() - environment_id = 9 - expected_levels = ['lvl1', 'lvl2'] - res = self.client.get(self.collection_url.format(environment_id)) - self.assertEqual(200, res.status_code) - self.assertEqual(expected_levels, [d['name'] for d in res.json]) - - def test_get_hierarchy_levels_not_found(self): - environment_id = 9 - res = self.client.get(self.collection_url.format(environment_id)) - self.assertEqual(404, res.status_code) - - def test_get_hierarchy_level(self): - self._fixture() - environment_id = 9 - levels = ['lvl1', 'lvl2'] - for level in levels: - res = self.client.get(self.object_url.format(environment_id, - level)) - self.assertEqual(200, res.status_code) - self.assertEqual(level, res.json['name']) - - res = self.client.get(self.object_url.format(environment_id, - res.json['id'])) - self.assertEqual(200, res.status_code) - self.assertEqual(level, res.json['name']) - - def test_get_hierarchy_level_not_found(self): - levels = ['lvl1', 'lvl2'] - for level in levels: - res = self.client.get(self.object_url.format(9, level)) - self.assertEqual(404, res.status_code) - - def test_put_hierarchy_level(self): - self._fixture() - environment_id = 9 - level = 'lvl1' - new_name = 'new_{0}'.format(level) - res = self.client.put(self.object_url.format(environment_id, level), - data={'name': new_name}) - self.assertEqual(204, res.status_code) - - res = self.client.get(self.object_url.format(environment_id, new_name)) - self.assertEqual(200, res.status_code) - self.assertEqual(new_name, res.json['name']) - - def test_put_hierarchy_level_not_found(self): - self._fixture() - environment_id = 9 - res = self.client.put(self.object_url.format(environment_id, 'xx'), - data={'name': 'new_name'}) - self.assertEqual(404, res.status_code) - - res = self.client.put(self.object_url.format(1, 'lvl1'), - data={'name': 'new_name'}) - self.assertEqual(404, res.status_code) - - res = self.client.put(self.object_url.format(1, 'xx'), - data={'name': 'new_name'}) - self.assertEqual(404, res.status_code) diff --git a/tuning_box/tests/library/test_library.py b/tuning_box/tests/library/test_library.py deleted file mode 100644 index 64dbf6a..0000000 --- a/tuning_box/tests/library/test_library.py +++ /dev/null @@ -1,111 +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 tuning_box.app import db -from tuning_box import errors -from tuning_box import library -from tuning_box.tests.test_app import BaseTest - - -class TestLibrary(BaseTest): - - def add_res_def_to_another_env(self, res_name): - component_data = { - 'name': 'component2', - 'resource_definitions': [{ - 'name': res_name, - 'content': {'key': 'value'} - }] - } - res = self.client.post('/components', data=component_data) - self.assertEqual(201, res.status_code) - component_id = res.json['id'] - - env_data = { - 'components': [component_id], - 'hierarchy_levels': [], - } - res = self.client.post('/environments', data=env_data) - self.assertEqual(201, res.status_code) - - def test_get_resource_definition(self): - self._fixture() - res_name = 'resdef1' - res_id = 5 - environment_id = 9 - component_id = 7 - - # Creating resource definition with the same name in another - # environment - self.add_res_def_to_another_env(res_name) - res = self.client.get('/resource_definitions') - self.assertEqual(200, res.status_code) - self.assertTrue(all(res_def['name'] == res_name - for res_def in res.json)) - - with self.app.app_context(): - self.assertRaises(errors.TuningboxNotFound, - library.get_resource_definition, res_id, None) - self.assertRaises(errors.TuningboxNotFound, - library.get_resource_definition, res_name, None) - self.assertRaises(errors.TuningboxNotFound, - library.get_resource_definition, '', - environment_id) - self.assertRaises(errors.TuningboxNotFound, - library.get_resource_definition, None, None) - self.assertRaises(errors.TuningboxNotFound, - library.get_resource_definition, None, - environment_id) - - actual_res = library.get_resource_definition(res_id, - environment_id) - self.assertEqual(res_id, actual_res.id) - self.assertEqual(res_name, actual_res.name) - self.assertEqual(component_id, actual_res.component_id) - - actual_res = library.get_resource_definition(res_id, - environment_id) - self.assertEqual(res_id, actual_res.id) - self.assertEqual(res_name, actual_res.name) - self.assertEqual(component_id, actual_res.component_id) - - def test_get_resource_values(self): - self._fixture() - res_def_id = 5 - environment_id = 9 - values = {'k': 'v'} - levels = (('lvl1', 'val1'), ('lvl2', 'val2')) - self._add_resource_values(environment_id, res_def_id, levels, values) - - with self.app.app_context(), db.db.session.begin(): - - environment = db.Environment.query.get(environment_id) - res_def = db.ResourceDefinition.query.get(res_def_id) - res_values = library.get_resource_values( - environment, levels, res_def) - self.assertEqual(values, res_values.values) - - def test_get_resource_values_not_found(self): - self._fixture() - res_def_id = 5 - environment_id = 9 - levels = (('lvl1', 'val1'), ('lvl2', 'val2')) - with self.app.app_context(), db.db.session.begin(): - environment = db.Environment.query.get(environment_id) - res_def = db.ResourceDefinition.query.get(res_def_id) - self.assertRaises(errors.TuningboxNotFound, - library.get_resource_values, environment, - levels, res_def) - # Test for empty levels - self.assertRaises(errors.TuningboxNotFound, - library.get_resource_values, environment, - (), res_def) diff --git a/tuning_box/tests/library/test_resource_definitions.py b/tuning_box/tests/library/test_resource_definitions.py deleted file mode 100644 index 8436787..0000000 --- a/tuning_box/tests/library/test_resource_definitions.py +++ /dev/null @@ -1,213 +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 tuning_box import db -from tuning_box.library import resource_definitions -from tuning_box.tests.test_app import BaseTest - - -class TestResourceDefinitions(BaseTest): - - collection_url = '/resource_definitions' - object_url = '/resource_definitions/{0}' - object_keys_url = object_url + '/keys/{1}' - - @property - def _resource_json(self): - return { - 'id': 5, - 'name': 'resdef1', - 'component_id': 7, - 'content': {'key': 'nsname.key'}, - } - - def test_post_resource_definition(self): - data = self._resource_json - data['component_id'] = None - - res = self.client.post(self.collection_url, data=data) - self.assertEqual(201, res.status_code) - data['id'] = res.json['id'] - - self.assertEqual(data, res.json) - self._assert_db_effect( - db.ResourceDefinition, - res.json['id'], - resource_definitions.resource_definition_fields, - data - ) - - def test_get_resource_definitions_empty(self): - res = self.client.get(self.collection_url) - self.assertEqual(res.status_code, 200) - self.assertEqual(res.json, []) - - def test_get_definitions(self): - self._fixture() - res = self.client.get(self.collection_url) - self.assertEqual(200, res.status_code) - self.assertEqual(1, len(res.json)) - self.assertEqual(self._resource_json, res.json[0]) - - def test_get_definitions_filtration(self): - self._fixture() - - resource_data = { - 'name': 'resdef2', - 'content': {'key': 'service.key'}, - } - - res = self.client.post(self.collection_url, data=resource_data) - self.assertEqual(201, res.status_code) - resource_data = res.json - - component_id = self._resource_json['component_id'] - res = self.client.get(self.collection_url, - query_string={'component_id': component_id}) - self.assertEqual(200, res.status_code) - self.assertNotIn(resource_data['id'], (d['id'] for d in res.json)) - - res = self.client.get(self.collection_url + '?component_id=') - self.assertEqual(200, res.status_code) - self.assertFalse(any(d['component_id'] for d in res.json)) - self.assertIn(resource_data['id'], (d['id'] for d in res.json)) - - res = self.client.get(self.collection_url) - self.assertEqual(200, res.status_code) - self.assertIn(resource_data['id'], (d['id'] for d in res.json)) - self.assertIn(self._resource_json['id'], (d['id'] for d in res.json)) - - def test_get_one_resource_definition(self): - self._fixture() - res_id = self._resource_json['id'] - res = self.client.get(self.object_url.format(res_id)) - self.assertEqual(200, res.status_code) - self.assertEqual(self._resource_json, res.json) - - def test_get_one_resource_definition_404(self): - res_id = self._resource_json['id'] - res = self.client.get( - self.object_url.format(res_id)) - self.assertEqual(res.status_code, 404) - - def test_delete_resource_definition(self): - self._fixture() - res_id = self._resource_json['id'] - res = self.client.delete(self.object_url.format(res_id)) - self.assertEqual(res.status_code, 204) - self.assertEqual(res.data, b'') - self._assert_not_in_db(db.ResourceDefinition, res_id) - - def test_delete_resource_definition_404(self): - res_id = self._resource_json['id'] - res = self.client.delete(self.object_url.format(res_id)) - self.assertEqual(res.status_code, 404) - - def test_put_resource_definition_404(self): - res_id = self._resource_json['id'] - res = self.client.delete(self.object_url.format(res_id)) - self.assertEqual(res.status_code, 404) - - def test_put_resource_definition(self): - self._fixture() - res_id = self._resource_json['id'] - - data = self._resource_json - data['name'] = 'new_{0}'.format(data['name']) - data['component_id'] = None - data['content'] = {'x': 'y'} - - res = self.client.put(self.object_url.format(res_id), - data=data) - self.assertEqual(204, res.status_code) - actual_res_def = self.client.get(self.object_url.format(res_id)).json - self.assertEqual(data, actual_res_def) - - # Restoring resource_definition values - res = self.client.put( - self.object_url.format(res_id), - data=self._resource_json - ) - self.assertEqual(204, res.status_code) - actual_res_def = self.client.get(self.object_url.format(res_id)).json - self.assertEqual(self._resource_json, actual_res_def) - - def test_put_resource_definition_ignore_changing_id(self): - self._fixture() - res_id = self._resource_json['id'] - - data = self._resource_json - data['id'] = None - res = self.client.put(self.object_url.format(res_id), data=data) - self.assertEqual(204, res.status_code) - actual_res_def = self.client.get(self.object_url.format(res_id)).json - self.assertEqual(self._resource_json, actual_res_def) - - def test_put_resource_definition_set_operation_error(self): - self.app.config["PROPAGATE_EXCEPTIONS"] = True - self._fixture() - res_id = self._resource_json['id'] - - data = [['a', 'b', 'c', 'value']] - res = self.client.put(self.object_keys_url.format(res_id, 'set'), - data=data) - self.assertEqual(409, res.status_code) - - def test_put_resource_definition_set(self): - self._fixture() - res_id = self._resource_json['id'] - - data = [['key', 'key_value'], ['key_x', 'key_x_value']] - res = self.client.put( - self.object_keys_url.format(res_id, 'set'), - data=data - ) - self.assertEqual(204, res.status_code) - - res = self.client.get(self.object_url.format(res_id)) - self.assertEqual(200, res.status_code) - actual = res.json - self.assertEqual({'key': 'key_value', 'key_x': 'key_x_value'}, - actual['content']) - - def test_put_resource_definition_delete(self): - self._fixture() - res_id = self._resource_json['id'] - - data = [['key']] - res = self.client.put( - self.object_keys_url.format(res_id, 'delete'), - data=data - ) - self.assertEqual(204, res.status_code) - - res = self.client.get(self.object_url.format(res_id)) - self.assertEqual(200, res.status_code) - actual = res.json - self.assertEqual({}, actual['content']) - - def test_put_resource_definition_delete_no_key(self): - self.app.config["PROPAGATE_EXCEPTIONS"] = True - self._fixture() - res_id = self._resource_json['id'] - - data = [['fake_key']] - res = self.client.put( - self.object_keys_url.format(res_id, 'delete'), - data=data - ) - self.assertEqual(409, res.status_code) - - res = self.client.get(self.object_url.format(res_id)) - self.assertEqual(200, res.status_code) - actual = res.json - self.assertEqual(self._resource_json['content'], actual['content']) diff --git a/tuning_box/tests/library/test_resource_key_operations.py b/tuning_box/tests/library/test_resource_key_operations.py deleted file mode 100644 index 4632045..0000000 --- a/tuning_box/tests/library/test_resource_key_operations.py +++ /dev/null @@ -1,370 +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 tuning_box import errors -from tuning_box.library import resource_keys_operation -from tuning_box.tests.test_app import BaseTest - - -class TestResourceKeysOperations(BaseTest): - - processor = resource_keys_operation.KeysOperationMixin() - object_url = '/environments/{0}/{1}resources/{2}/values' - object_keys_url = object_url + '/keys/{3}' - - def test_unknown_operation(self): - self.assertRaises(errors.UnknownKeysOperation, - self.processor.perform_operation, - 'fake_operation', {}, []) - - def test_set_new(self): - keys = [['a', {}]] - data = {} - result = self.processor.do_set(data, keys) - self.assertEqual({'a': {}}, result) - - keys = [['a', {}], ['a', 'b', []]] - data = {} - result = self.processor.do_set(data, keys) - self.assertEqual({'a': {'b': []}}, result) - - keys = [['a', 0, 'b', 'c_updated']] - data = {'a': [{'b': 'c'}]} - result = self.processor.do_set(data, keys) - self.assertEqual({'a': [{'b': 'c_updated'}]}, result) - - keys = [['a', 'b']] - data = {'a': {'b': 'c'}} - result = self.processor.do_set(data, keys) - self.assertEqual({'a': 'b'}, result) - - def test_set_empty(self): - keys = [['a', 'b', '']] - data = {'a': {'b': 'value'}} - result = self.processor.do_set(data, keys) - self.assertEqual({'a': {'b': ''}}, result) - - def test_set_not_modifies_storage(self): - keys = [['a', 'c', 'value_c']] - data = {'a': {'b': 'value_b'}} - result = self.processor.do_set(data, keys) - self.assertEqual({'a': {'b': 'value_b'}}, data) - self.assertEqual({'a': {'c': 'value_c', 'b': 'value_b'}}, result) - - def test_set_invalid_keys_path(self): - self.assertRaises(errors.KeysPathInvalid, self.processor.do_set, - {}, [[]]) - self.assertRaises(errors.KeysPathInvalid, self.processor.do_set, - {}, [['a']]) - - def test_set_key_path_not_existed(self): - keys = [['a', 'b', 'c']] - data = {} - self.assertRaises(errors.KeysPathNotExisted, self.processor.do_set, - data, keys) - - keys = [['a', 1, 'b']] - data = {'a': [{'b': 'c'}]} - self.assertRaises(errors.KeysPathNotExisted, self.processor.do_set, - data, keys) - - def test_set_key_path_unreachable(self): - keys = [['a', 'b', 'c', 'd', 'e']] - data = {'a': {'b': 'c'}} - self.assertRaises(errors.KeysPathUnreachable, self.processor.do_set, - data, keys) - - keys = [['a', 'k1', 'v1']] - data = {'a': 'v'} - self.assertRaises(errors.KeysPathUnreachable, self.processor.do_set, - data, keys) - - def test_delete_key_path_not_existed(self): - keys = [['a', 'b']] - data = {} - self.assertRaises(errors.KeysPathNotExisted, self.processor.do_delete, - data, keys) - - keys = [[1]] - data = ['a'] - self.assertRaises(errors.KeysPathNotExisted, self.processor.do_delete, - data, keys) - - def test_delete_key_path_unreachable(self): - keys = [['a', 'b', 'value_b']] - data = {'a': {'b': 'value_b'}} - self.assertRaises(errors.KeysPathUnreachable, self.processor.do_delete, - data, keys) - - keys = [['a', 'b', 'value_c']] - data = {'a': {'b': 'value_b'}} - self.assertRaises(errors.KeysPathUnreachable, self.processor.do_delete, - data, keys) - - def test_delete(self): - keys = [['a']] - data = {'a': 'val_a', 'b': {'a': 'val_b_a'}} - result = self.processor.do_delete(data, keys) - self.assertEqual({'b': {'a': 'val_b_a'}}, result) - - keys = [[0]] - data = ['a'] - result = self.processor.do_delete(data, keys) - self.assertEqual([], result) - - keys = [['a', 0, 'b']] - data = {'a': [{'b': 'val_a_0_b', 'c': 'val_a_0_c'}, 'd']} - result = self.processor.do_delete(data, keys) - self.assertEqual({'a': [{'c': 'val_a_0_c'}, 'd']}, result) - - keys = [['a', 'b'], ['a']] - data = {'a': {'b': 'val_a_b', 'c': 'val_a_c'}, 'b': 'val_b'} - result = self.processor.do_delete(data, keys) - self.assertEqual({'b': 'val_b'}, result) - - def test_delete_not_modifies_storage(self): - keys = [['a', 'b']] - data = {'a': {'b': 'value_b'}} - result = self.processor.do_delete(data, keys) - self.assertEqual({'a': {'b': 'value_b'}}, data) - self.assertEqual({'a': {}}, result) - - def test_put_resource_values_delete(self): - self._fixture() - environment_id = 9 - res_def_id = 5 - levels = (('lvl1', 'val1'), ('lvl2', 'val2')) - values = {'key_0': 'val_0', 'key_1': 'val_1'} - self._add_resource_values(environment_id, res_def_id, levels, values) - - obj_url = self.object_url.format( - environment_id, - self.get_levels_path(levels), - res_def_id - ) - obj_keys_url = obj_url + '/keys/delete' - - data = [['key_0']] - res = self.client.put(obj_keys_url, data=data) - self.assertEqual(204, res.status_code) - - res = self.client.get(obj_url) - self.assertEqual(200, res.status_code) - actual = res.json - self.assertEqual({'key_1': 'val_1'}, actual) - - def test_put_resource_values_delete_nested_keys(self): - self._fixture() - environment_id = 9 - res_def_id = 5 - levels = (('lvl1', 'val1'), ('lvl2', 'val2')) - values = {'k0': [{'k1': 'v01'}, 'b'], 'k2': {'k3': 'v23'}} - self._add_resource_values(environment_id, res_def_id, levels, values) - - obj_url = self.object_url.format( - environment_id, - self.get_levels_path(levels), - res_def_id - ) - obj_keys_url = obj_url + '/keys/delete' - - data = [['k0', '0'], ['k2', 'k3']] - res = self.client.put(obj_keys_url, data=data) - self.assertEqual(204, res.status_code) - - res = self.client.get(obj_url) - self.assertEqual(200, res.status_code) - actual = res.json - self.assertEqual({'k0': ['b'], 'k2': {}}, actual) - - def test_put_resource_values_not_found(self): - self.app.config["PROPAGATE_EXCEPTIONS"] = True - self._fixture() - - res = self.client.put( - '/environments/9/lvl1/val1/resources/5/values/keys/set', - data={} - ) - self.assertEqual(404, res.status_code) - - def test_put_resource_values_set_operation_error(self): - self.app.config["PROPAGATE_EXCEPTIONS"] = True - self._fixture() - - environment_id = 9 - res_def_id = 5 - levels = (('lvl1', 'val1'), ('lvl2', 'val2')) - values = {'key': 'val'} - self._add_resource_values(environment_id, res_def_id, levels, values) - - data = [['a', 'b', 'c', 'value']] - obj_keys_url = self.object_keys_url.format( - environment_id, - self.get_levels_path(levels), - res_def_id, - 'set' - ) - - res = self.client.put(obj_keys_url, data=data) - self.assertEqual(409, res.status_code) - - def test_put_resource_values_delete_operation_error(self): - self.app.config["PROPAGATE_EXCEPTIONS"] = True - self._fixture() - environment_id = 9 - res_def_id = 5 - levels = (('lvl1', 'val1'), ('lvl2', 'val2')) - values = {'key_0': 'val_0', 'key_1': 'val_1'} - self._add_resource_values(environment_id, res_def_id, levels, values) - - obj_keys_url = self.object_keys_url.format( - environment_id, - self.get_levels_path(levels), - res_def_id, - 'delete' - ) - data = [['fake_key']] - res = self.client.put(obj_keys_url, data=data) - self.assertEqual(409, res.status_code) - - data = [['key_0', 'val_0']] - res = self.client.put(obj_keys_url, data=data) - self.assertEqual(409, res.status_code) - - def test_put_resource_values_set(self): - self._fixture() - environment_id = 9 - res_def_id = 5 - levels = (('lvl1', 'val1'), ('lvl2', 'val2')) - values = {'key': 'val'} - self._add_resource_values(environment_id, res_def_id, levels, values) - - obj_url = self.object_url.format( - environment_id, - self.get_levels_path(levels), - res_def_id - ) - obj_keys_url = obj_url + '/keys/set' - - data = [['key', 'key_value'], ['key_x', 'key_x_value']] - res = self.client.put(obj_keys_url, data=data) - self.assertEqual(204, res.status_code) - - res = self.client.get(obj_url) - self.assertEqual(200, res.status_code) - actual = res.json - self.assertEqual({'key': 'key_value', 'key_x': 'key_x_value'}, - actual) - - def test_put_resource_values_set_no_levels(self): - self._fixture() - environment_id = 9 - res_def_id = 5 - values = {'key': 'val'} - self._add_resource_values(environment_id, res_def_id, (), values) - - obj_url = '/environments/{0}/resources/{1}/values'.format( - environment_id, res_def_id) - obj_keys_url = obj_url + '/keys/set' - - data = [['key', 'key_value'], ['key_x', 'key_x_value']] - res = self.client.put(obj_keys_url, data=data) - self.assertEqual(204, res.status_code) - - res = self.client.get(obj_url) - self.assertEqual(200, res.status_code) - actual = res.json - self.assertEqual({'key': 'key_value', 'key_x': 'key_x_value'}, - actual) - - def test_put_resource_values_delete_by_name(self): - self._fixture() - environment_id = 9 - res_def_id = 5 - res_def_name = 'resdef1' - levels = (('lvl1', 'val1'), ('lvl2', 'val2')) - values = {'key_0': 'val_0', 'key_1': 'val_1'} - self._add_resource_values(environment_id, res_def_id, levels, values) - - obj_url = self.object_url.format( - environment_id, - self.get_levels_path(levels), - res_def_name - ) - obj_keys_url = obj_url + '/keys/delete' - - data = [['key_0']] - res = self.client.put(obj_keys_url, data=data) - self.assertEqual(204, res.status_code) - - obj_url = self.object_url.format( - environment_id, - self.get_levels_path(levels), - res_def_id - ) - - res = self.client.get(obj_url) - self.assertEqual(200, res.status_code) - actual = res.json - self.assertEqual({'key_1': 'val_1'}, actual) - - def test_put_resource_values_set_consistency(self): - self.app.config["PROPAGATE_EXCEPTIONS"] = True - self._fixture() - environment_id = 9 - res_def_id = 5 - levels = (('lvl1', 'val1'), ('lvl2', 'val2')) - values = {'k0': {'k1': 'v01'}} - self._add_resource_values(environment_id, res_def_id, levels, values) - - obj_url = self.object_url.format( - environment_id, - self.get_levels_path(levels), - res_def_id - ) - obj_keys_url = obj_url + '/keys/set' - - # One keys path is invalid - data = [['kk0', 'v'], ['k0', 'k1', 'k2', 'val']] - res = self.client.put(obj_keys_url, data=data) - self.assertEqual(409, res.status_code) - - # Checking no changes in the resource value - res = self.client.get(obj_url) - self.assertEqual(200, res.status_code) - actual = res.json - self.assertEqual(values, actual) - - def test_put_resource_values_set_nested_keys(self): - self.app.config["PROPAGATE_EXCEPTIONS"] = True - self._fixture() - environment_id = 9 - res_def_id = 5 - levels = (('lvl1', 'val1'), ('lvl2', 'val2')) - values = {'k0': {'k1': 'v01'}} - self._add_resource_values(environment_id, res_def_id, levels, values) - - obj_url = self.object_url.format( - environment_id, - self.get_levels_path(levels), - res_def_id - ) - obj_keys_url = obj_url + '/keys/set' - - data = [['k0', 'k1', 'k2', 'val']] - res = self.client.put(obj_keys_url, data=data) - self.assertEqual(409, res.status_code) - - res = self.client.get(obj_url) - self.assertEqual(200, res.status_code) - actual = res.json - self.assertEqual(values, actual) diff --git a/tuning_box/tests/library/test_resource_overrides.py b/tuning_box/tests/library/test_resource_overrides.py deleted file mode 100644 index 290a4ea..0000000 --- a/tuning_box/tests/library/test_resource_overrides.py +++ /dev/null @@ -1,311 +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 tuning_box import db -from tuning_box.tests.test_app import BaseTest - - -class TestResourceOverrides(BaseTest): - - object_url = '/environments/{0}/{1}resources/{2}/overrides' - object_keys_url = object_url + '/keys/{3}' - - def test_put_resource_values_overrides_root(self): - self._fixture() - res = self.client.put('/environments/9/resources/5/overrides', - data={'k': 'v'}) - self.assertEqual(res.status_code, 204) - self.assertEqual(res.data, b'') - with self.app.app_context(): - resource_values = db.ResourceValues.query.filter_by( - environment_id=9, resource_definition_id=5).one_or_none() - self.assertIsNotNone(resource_values) - self.assertEqual(resource_values.overrides, {'k': 'v'}) - self.assertIsNone(resource_values.level_value) - - def test_put_resource_values_overrides_deep(self): - self._fixture() - res = self.client.put( - '/environments/9/lvl1/val1/lvl2/val2/resources/5/overrides', - data={'k': 'v'}, - ) - self.assertEqual(res.status_code, 204) - self.assertEqual(res.data, b'') - with self.app.app_context(): - resource_values = db.ResourceValues.query.filter_by( - environment_id=9, resource_definition_id=5).one_or_none() - self.assertIsNotNone(resource_values) - self.assertEqual(resource_values.overrides, {'k': 'v'}) - level_value = resource_values.level_value - self.assertIsNotNone(level_value) - self.assertEqual(level_value.level.name, 'lvl2') - self.assertEqual(level_value.value, 'val2') - level = level_value.level.parent - self.assertIsNotNone(level) - self.assertEqual(level.name, 'lvl1') - self.assertIsNone(level.parent) - - def test_get_resource_values_local_override(self): - self._fixture() - self.client.put('/environments/9/lvl1/1/resources/5/values', - data={'key': 'value1'}) - res = self.client.put('/environments/9/lvl1/1/resources/5/overrides', - data={'key': 'value2'}) - self.assertEqual(res.status_code, 204) - self.assertEqual(res.data, b'') - res = self.client.get( - '/environments/9/lvl1/1/resources/5/values?effective', - ) - self.assertEqual(res.status_code, 200) - self.assertEqual(res.json, {'key': 'value2'}) - - def test_get_resource_values_level_override(self): - self._fixture() - self.client.put('/environments/9/resources/5/values', - data={'key': 'value', 'key1': 'value'}) - self.client.put('/environments/9/lvl1/1/resources/5/values', - data={'key': 'value1'}) - res = self.client.put('/environments/9/lvl1/2/resources/5/values', - data={'key1': 'value2'}) - self.assertEqual(res.status_code, 204) - self.assertEqual(res.data, b'') - res = self.client.get( - '/environments/9/lvl1/1/resources/5/values?effective', - ) - self.assertEqual(res.status_code, 200) - self.assertEqual(res.json, {'key': 'value1', 'key1': 'value'}) - - def test_get_resource_values_level_and_local_override(self): - self._fixture() - self.client.put('/environments/9/resources/5/values', - data={'key': 'value', 'key1': 'value'}) - self.client.put('/environments/9/lvl1/1/resources/5/values', - data={'key': 'value1'}) - res = self.client.put('/environments/9/lvl1/1/resources/5/overrides', - data={'key1': 'value2'}) - self.assertEqual(res.status_code, 204) - self.assertEqual(res.data, b'') - res = self.client.get( - '/environments/9/lvl1/1/resources/5/values?effective', - ) - self.assertEqual(res.status_code, 200) - self.assertEqual(res.json, {'key': 'value1', 'key1': 'value2'}) - - def test_put_resource_overrides_by_name(self): - self._fixture() - env_id = 9 - res_id = 5 - res_name = 'resdef1' - levels = (('lvl1', 'val1'), ('lvl2', 'val2')) - data = {'k': 'v'} - - obj_name_url = self.object_url.format( - env_id, - self.get_levels_path(levels), - res_name - ) - res = self.client.put(obj_name_url, data=data) - self.assertEqual(204, res.status_code) - - obj_id_url = self.object_url.format( - env_id, - self.get_levels_path(levels), - res_id - ) - res = self.client.get(obj_id_url) - self.assertEqual(200, res.status_code) - self.assertEqual(data, res.json) - - def test_get_resource_overrides_by_name(self): - self._fixture() - env_id = 9 - res_id = 5 - res_name = 'resdef1' - levels = (('lvl1', 'val1'), ('lvl2', 'val2')) - - obj_id_url = self.object_url.format( - env_id, - self.get_levels_path(levels), - res_id - ) - data = {'key': 'value'} - self.client.put(obj_id_url, data=data) - - obj_name_url = self.object_url.format( - env_id, - self.get_levels_path(levels), - res_name - ) - res = self.client.get(obj_name_url) - self.assertEqual(200, res.status_code) - self.assertEqual(data, res.json) - - def test_put_resource_overrides_set_operation_error(self): - self.app.config["PROPAGATE_EXCEPTIONS"] = True - self._fixture() - - environment_id = 9 - res_def_id = 5 - levels = (('lvl1', 'val1'), ('lvl2', 'val2')) - overrides = {'key': 'val_overridden'} - self._add_resource_overrides(environment_id, res_def_id, levels, - overrides) - - data = [['a', 'b', 'c', 'value']] - obj_keys_url = self.object_keys_url.format( - environment_id, - self.get_levels_path(levels), - res_def_id, - 'set' - ) - - res = self.client.put(obj_keys_url, data=data) - self.assertEqual(409, res.status_code) - - def test_put_resource_overrides_set(self): - self._fixture() - environment_id = 9 - res_def_id = 5 - levels = (('lvl1', 'val1'), ('lvl2', 'val2')) - overrides = {'key': 'val_overridden'} - self._add_resource_overrides(environment_id, res_def_id, levels, - overrides) - - obj_url = self.object_url.format( - environment_id, - self.get_levels_path(levels), - res_def_id - ) - obj_keys_url = obj_url + '/keys/set' - - data = [['key', 'key_over'], ['key_x', 'key_x_over']] - res = self.client.put(obj_keys_url, data=data) - self.assertEqual(204, res.status_code) - - res = self.client.get(obj_url) - self.assertEqual(200, res.status_code) - actual = res.json - self.assertEqual({'key': 'key_over', 'key_x': 'key_x_over'}, - actual) - - def test_put_resource_overrides_set_no_levels(self): - self._fixture() - environment_id = 9 - res_def_id = 5 - values = {'key': 'val'} - self._add_resource_overrides(environment_id, res_def_id, (), values) - - obj_url = '/environments/{0}/resources/{1}/overrides'.format( - environment_id, res_def_id) - obj_keys_url = obj_url + '/keys/set' - - data = [['key', 'key_value'], ['key_x', 'key_x_value']] - res = self.client.put(obj_keys_url, data=data) - self.assertEqual(204, res.status_code) - - res = self.client.get(obj_url) - self.assertEqual(200, res.status_code) - actual = res.json - self.assertEqual({'key': 'key_value', 'key_x': 'key_x_value'}, - actual) - - def test_put_resource_overrides_delete(self): - self._fixture() - environment_id = 9 - res_def_id = 5 - levels = (('lvl1', 'val1'), ('lvl2', 'val2')) - overrides = {'key_0': 'val_0', 'key_1': 'val_1'} - self._add_resource_overrides(environment_id, res_def_id, levels, - overrides) - - obj_url = self.object_url.format( - environment_id, - self.get_levels_path(levels), - res_def_id - ) - obj_keys_url = obj_url + '/keys/delete' - - data = [['key_0']] - res = self.client.put(obj_keys_url, data=data) - self.assertEqual(204, res.status_code) - - res = self.client.get(obj_url) - self.assertEqual(200, res.status_code) - actual = res.json - self.assertEqual({'key_1': 'val_1'}, actual) - - def test_put_resource_overrides_delete_operation_error(self): - self.app.config["PROPAGATE_EXCEPTIONS"] = True - self._fixture() - environment_id = 9 - res_def_id = 5 - levels = (('lvl1', 'val1'), ('lvl2', 'val2')) - overrides = {'key_0': 'val_0', 'key_1': 'val_1'} - self._add_resource_overrides(environment_id, res_def_id, levels, - overrides) - - obj_keys_url = self.object_keys_url.format( - environment_id, - self.get_levels_path(levels), - res_def_id, - 'delete' - ) - data = [['fake_key']] - res = self.client.put(obj_keys_url, data=data) - self.assertEqual(409, res.status_code) - - data = [['key_0', 'val_0']] - res = self.client.put(obj_keys_url, data=data) - self.assertEqual(409, res.status_code) - - def test_get_resource_overrides_effective_with_lookup(self): - self._fixture() - res = self.client.put('/environments/9/resources/5/values', - data={'key0': 'root_value_0', - 'key1': 'root_value_1', - 'key2': 'root_value_2', - 'key3': 'root_value_3'}) - self.assertEqual(res.status_code, 204) - res = self.client.put('/environments/9/lvl1/1/resources/5/values', - data={'key0': 'lvl1_value_0'}) - self.assertEqual(res.status_code, 204) - - # Override key0 on level1 - res = self.client.put('/environments/9/lvl1/1/resources/5/overrides', - data={'key0': 'lvl1_overrides_0'}) - self.assertEqual(res.status_code, 204) - - # Override key1 on level1/level2 - res = self.client.put( - '/environments/9/lvl1/1/lvl2/2/resources/5/values', - data={'key1': 'lvl2_value_1', 'key2': 'lvl2_value_2'} - ) - self.assertEqual(res.status_code, 204) - res = self.client.put( - '/environments/9/lvl1/1/lvl2/2/resources/5/overrides', - data={'key1': 'lvl2_overrides_1'} - ) - self.assertEqual(res.status_code, 204) - - # Checking lookup info - res = self.client.get( - '/environments/9/lvl1/1/lvl2/2/resources/5/values', - query_string={'effective': 1, 'show_lookup': 1} - ) - self.assertEqual(res.status_code, 200) - expected = { - 'key0': ['lvl1_overrides_0', '/lvl1/1/'], - 'key1': ['lvl2_overrides_1', '/lvl1/1/lvl2/2/'], - 'key2': ['lvl2_value_2', '/lvl1/1/lvl2/2/'], - 'key3': ['root_value_3', '/'] - } - self.assertEqual(expected, res.json) diff --git a/tuning_box/tests/library/test_resource_values.py b/tuning_box/tests/library/test_resource_values.py deleted file mode 100644 index 7e9e7d1..0000000 --- a/tuning_box/tests/library/test_resource_values.py +++ /dev/null @@ -1,360 +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 uuid - -import six - -from tuning_box import db -from tuning_box.tests.test_app import BaseTest - - -class TestResourceValues(BaseTest): - - object_url = '/environments/{0}/{1}resources/{2}/values' - - def test_put_resource_values_root(self): - self._fixture() - res = self.client.put('/environments/9/resources/5/values', - data={'k': 'v'}) - self.assertEqual(res.status_code, 204) - self.assertEqual(res.data, b'') - with self.app.app_context(): - resource_values = db.ResourceValues.query.filter_by( - environment_id=9, resource_definition_id=5).one_or_none() - self.assertIsNotNone(resource_values) - self.assertEqual(resource_values.values, {'k': 'v'}) - self.assertIsNone(resource_values.level_value) - - def test_put_resource_values_deep(self): - self._fixture() - res = self.client.put( - '/environments/9/lvl1/val1/lvl2/val2/resources/5/values', - data={'k': 'v'}, - ) - self.assertEqual(res.status_code, 204) - self.assertEqual(res.data, b'') - with self.app.app_context(): - resource_values = db.ResourceValues.query.filter_by( - environment_id=9, resource_definition_id=5).one_or_none() - self.assertIsNotNone(resource_values) - self.assertEqual(resource_values.values, {'k': 'v'}) - level_value = resource_values.level_value - self.assertEqual(level_value.level.name, 'lvl2') - self.assertEqual(level_value.value, 'val2') - level = level_value.level.parent - self.assertIsNotNone(level) - self.assertEqual(level.name, 'lvl1') - self.assertIsNone(level.parent) - - def test_put_resource_values_bad_level(self): - self.app.config["PROPAGATE_EXCEPTIONS"] = True - self._fixture() - res = self.client.put('/environments/9/lvlx/1/resources/5/values', - data={'k': 'v'}) - self.assertEqual(res.status_code, 404) - self.assertEqual( - {"msg": "Unexpected level name 'lvlx'. Expected 'lvl1'."}, - res.json - ) - with self.app.app_context(): - resource_values = db.ResourceValues.query.filter_by( - environment_id=9, resource_definition_id=5).one_or_none() - self.assertIsNone(resource_values) - - def test_get_resource_values(self): - self._fixture() - res = self.client.put('/environments/9/resources/5/values', - data={'key': 'value'}) - self.assertEqual(res.status_code, 204) - self.assertEqual(res.data, b'') - res = self.client.get( - '/environments/9/lvl1/1/resources/5/values', - ) - self.assertEqual(res.status_code, 200) - self.assertEqual(res.json, {}) - - def test_get_resource_values_by_name(self): - self._fixture() - env_id = 9 - res_name = 'resdef1' - object_url = self.object_url.format( - env_id, '', res_name - ) - res = self.client.get(object_url) - self.assertEqual(200, res.status_code) - self.assertEqual({}, res.json) - - def test_get_resource_values_effective(self): - self._fixture() - res = self.client.put('/environments/9/resources/5/values', - data={'key': 'value'}) - self.assertEqual(204, res.status_code) - self.assertEqual(res.data, b'') - res = self.client.get( - '/environments/9/lvl1/1/resources/5/values?effective', - ) - self.assertEqual(200, res.status_code) - self.assertEqual(res.json, {'key': 'value'}) - - def test_get_resource_values_by_name_with_query(self): - self._fixture() - env_id = 9 - res_name = 'resdef1' - obj_url = self.object_url.format(env_id, '', res_name) - expected = {'key': 'value'} - self.client.put(obj_url, data=expected) - res = self.client.get(obj_url + '?effective') - self.assertEqual(200, res.status_code) - self.assertEqual(expected, res.json) - - def test_put_resource_values_by_name(self): - self._fixture() - env_id = 9 - res_name = 'resdef1' - obj_url = self.object_url.format( - env_id, '', res_name - ) - expected = {'key': 'value'} - res = self.client.put(obj_url, data=expected) - self.assertEqual(res.status_code, 204) - res = self.client.get(obj_url) - self.assertEqual(res.status_code, 200) - self.assertEqual(expected, res.json) - - def test_put_resource_values_levels_mismatch(self): - self.app.config["PROPAGATE_EXCEPTIONS"] = True - self._fixture() - env_id = 9 - res_def_id = 5 - levels = (('lvl1', 'val1'), ('lvl2', 'val2'), ('lvl3', 'val3')) - values = {'key': 'val'} - - res = self._add_resource_values( - env_id, res_def_id, levels, values, expect_code=404) - self.assertEqual( - {'msg': "Levels [u'lvl1', u'lvl2', u'lvl3'] can't be matched with " - "environment 9 levels: [u'lvl1', u'lvl2']"}, - res.json - ) - - def test_put_resource_values_levels_mismatch_for_empty_levels(self): - self.app.config["PROPAGATE_EXCEPTIONS"] = True - self._fixture() - env_id = 9 - res_def_id = 5 - levels = (('lvl1', 'val1'), ('lvl2', 'val2'), ('lvl3', 'val3')) - values = {'key': 'val'} - - env_url = '/environments/{0}'.format(env_id) - res = self.client.put(env_url, data={'hierarchy_levels': []}) - self.assertEqual(204, res.status_code) - - res = self.client.get(env_url) - self.assertEqual(200, res.status_code) - self.assertEqual([], res.json['hierarchy_levels']) - - res = self._add_resource_values( - env_id, res_def_id, levels, values, expect_code=404) - self.assertEqual( - {'msg': "Levels [u'lvl1', u'lvl2', u'lvl3'] can't be matched with " - "environment 9 levels: []"}, - res.json - ) - - def test_get_resource_values_effective_with_lookup(self): - self._fixture() - res = self.client.put('/environments/9/resources/5/values', - data={'key0': 'root_value_0', - 'key1': 'root_value_1', - 'key2': 'root_value_2', - 'key3': 'root_value_3'}) - self.assertEqual(res.status_code, 204) - - # Set key0 value on level1 - res = self.client.put('/environments/9/lvl1/1/resources/5/values', - data={'key0': 'lvl1_value_0'}) - self.assertEqual(res.status_code, 204) - - # Set key1, key2 values on level1/level2 - res = self.client.put( - '/environments/9/lvl1/1/lvl2/2/resources/5/values', - data={'key1': 'lvl2_value_1', 'key2': 'lvl2_value_2'} - ) - self.assertEqual(res.status_code, 204) - - # Checking lookup info - res = self.client.get( - '/environments/9/lvl1/1/lvl2/2/resources/5/values?' - 'effective&show_lookup', - ) - self.assertEqual(res.status_code, 200) - expected = { - 'key0': ['lvl1_value_0', '/lvl1/1/'], - 'key1': ['lvl2_value_1', '/lvl1/1/lvl2/2/'], - 'key2': ['lvl2_value_2', '/lvl1/1/lvl2/2/'], - 'key3': ['root_value_3', '/'] - } - self.assertEqual(expected, res.json) - - def generate_values(self, size): - result = {} - for i in six.moves.range(size): - result[six.text_type(uuid.uuid4())] = i - return result - - def test_get_resource_values_effective_lot_of_data(self): - self._fixture() - env_id = 9 - res_id = 5 - keys_on_root = 10000 - keys_on_lvl1 = 15000 - keys_on_lvl2 = 20000 - values_on_level = 100 - - # Adding values on the root level - self._add_resource_values( - env_id, res_id, (), self.generate_values(keys_on_root)) - - # Adding values on the level lvl1 and lvl2 - lvl_1_values = self.generate_values(keys_on_lvl1) - lvl_2_values = self.generate_values(keys_on_lvl2) - for lvl_val in six.moves.range(values_on_level): - lvl_val = six.text_type(lvl_val) - self._add_resource_values( - env_id, res_id, (('lvl1', lvl_val),), lvl_1_values) - self._add_resource_values( - env_id, res_id, (('lvl1', lvl_val), ('lvl2', lvl_val)), - lvl_2_values) - - with self.app.app_context(): - res_vals_count = db.ResourceValues.query.count() - self.assertEqual(1 + values_on_level * 2, res_vals_count) - - # Check keys num on root level - obj_url = self.object_url.format( - env_id, self.get_levels_path(()), - res_id - ) - res = self.client.get(obj_url) - self.assertEqual(keys_on_root, len(res.json)) - - res = self.client.get(obj_url, query_string={'effective': 1}) - self.assertEqual(keys_on_root, len(res.json)) - - # Check keys num on lvl1 - obj_url = self.object_url.format( - env_id, self.get_levels_path((('lvl1', '1'),)), - res_id - ) - res = self.client.get(obj_url) - self.assertEqual(keys_on_lvl1, len(res.json)) - - res = self.client.get(obj_url, query_string={'effective': 1}) - self.assertEqual(keys_on_root + keys_on_lvl1, len(res.json)) - - # Check keys num on lvl2 - obj_url = self.object_url.format( - env_id, self.get_levels_path((('lvl1', '1'), ('lvl2', '2'))), - res_id - ) - res = self.client.get(obj_url) - self.assertEqual(keys_on_lvl2, len(res.json)) - - res = self.client.get(obj_url, query_string={'effective': 1}) - self.assertEqual(keys_on_root + keys_on_lvl1 + keys_on_lvl2, - len(res.json)) - - def test_resource_values_get_nested_keys(self): - self.app.config["PROPAGATE_EXCEPTIONS"] = True - self._fixture() - environment_id = 9 - res_def_id = 5 - levels = (('lvl1', 'val1'), ('lvl2', 'val2')) - values = {'k0': 'v0', 'k1': {'k2': 'v12', 'k3': 'v13', - 'k4': [{'k5': 'v1405'}, 'v141']}, - 'k6': [{'k7': [{'k8': 'v60708'}]}]} - self._add_resource_values(environment_id, res_def_id, levels, values) - - obj_url = self.object_url.format( - environment_id, - self.get_levels_path(levels), - res_def_id - ) - res = self.client.get(obj_url, query_string={'key': 'k0'}) - self.assertEqual(200, res.status_code) - self.assertEqual('v0', res.json) - - # Getting nested key - res = self.client.get(obj_url, query_string={'key': 'k1.k2'}) - self.assertEqual(200, res.status_code) - self.assertEqual('v12', res.json) - - # Getting nested key from the list - res = self.client.get(obj_url, query_string={'key': 'k1.k4.0'}) - self.assertEqual(200, res.status_code) - self.assertEqual({'k5': 'v1405'}, res.json) - - # Getting nested key from nested lists - res = self.client.get(obj_url, query_string={'key': 'k6.0.k7.0.k8'}) - self.assertEqual(200, res.status_code) - self.assertEqual('v60708', res.json) - - # Getting nested key effective value - res = self.client.get(obj_url, - query_string={'key': 'k0', 'effective': 1}) - self.assertEqual(200, res.status_code) - self.assertEqual('v0', res.json) - - res = self.client.get(obj_url, - query_string={'key': 'k1.k2', 'effective': 1}) - self.assertEqual(200, res.status_code) - self.assertEqual('v12', res.json) - - # Getting nested key value with lookup - res = self.client.get( - obj_url, - query_string={'key': 'k0', 'effective': 1, 'show_lookup': 1} - ) - self.assertEqual(200, res.status_code) - self.assertEqual(['v0', '/lvl1/val1/lvl2/val2/'], res.json) - - res = self.client.get( - obj_url, - query_string={'key': 'k1.k2', 'effective': 1, 'show_lookup': 1} - ) - self.assertEqual(200, res.status_code) - self.assertEqual(['v12', '/lvl1/val1/lvl2/val2/'], res.json) - - def test_resource_values_get_nested_keys_not_found(self): - self.app.config["PROPAGATE_EXCEPTIONS"] = True - self._fixture() - environment_id = 9 - res_def_id = 5 - levels = (('lvl1', 'val1'), ('lvl2', 'val2')) - values = {'k0': 'v0'} - self._add_resource_values(environment_id, res_def_id, levels, values) - - obj_url = self.object_url.format( - environment_id, - self.get_levels_path(levels), - res_def_id - ) - res = self.client.get(obj_url, query_string={'key': 'k0'}) - self.assertEqual(200, res.status_code) - self.assertEqual('v0', res.json) - - res = self.client.get(obj_url, query_string={'key': 'k1'}) - self.assertEqual(409, res.status_code) - - res = self.client.get(obj_url, query_string={'key': 'k1.k2'}) - self.assertEqual(409, res.status_code) diff --git a/tuning_box/tests/test_app.py b/tuning_box/tests/test_app.py deleted file mode 100644 index da465ab..0000000 --- a/tuning_box/tests/test_app.py +++ /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. - -import itertools -import json - -from flask import testing -import flask_restful -from werkzeug import wrappers - -from tuning_box import app -from tuning_box import db -from tuning_box.tests import base - - -class JSONResponse(wrappers.BaseResponse): - @property - def json(self): - return json.loads(self.data.decode(self.charset)) - - -class Client(testing.FlaskClient): - def __init__(self, app): - super(Client, self).__init__(app, response_wrapper=JSONResponse) - - def open(self, *args, **kwargs): - data = kwargs.get('data') - if data is not None: - kwargs['data'] = json.dumps(data) - kwargs['content_type'] = 'application/json' - return super(Client, self).open(*args, **kwargs) - - -class BaseTest(base.TestCase): - - def setUp(self): - super(BaseTest, self).setUp() - self.app = app.build_app(configure_logging=False, - with_keystone=False) - self.app.config["SQLALCHEMY_DATABASE_URI"] = 'sqlite:///' - with self.app.app_context(): - db.fix_sqlite() - db.db.create_all() - self.client = Client(self.app) - - def _fixture(self): - with self.app.app_context(), db.db.session.begin(): - component = db.Component( - id=7, - name='component1', - resource_definitions=[db.ResourceDefinition( - id=5, - name='resdef1', - content={'key': 'nsname.key'}, - )], - ) - db.db.session.add(component) - environment = db.Environment(id=9, components=[component]) - hierarchy_levels = [ - db.EnvironmentHierarchyLevel(name="lvl1"), - db.EnvironmentHierarchyLevel(name="lvl2"), - ] - hierarchy_levels[1].parent = hierarchy_levels[0] - environment.hierarchy_levels = hierarchy_levels - db.db.session.add(environment) - - def _levels_to_url(self, levels): - levels_url = '/'.join(itertools.chain.from_iterable(levels)) - if levels_url: - levels_url += '/' - return levels_url - - def _add_resource_values(self, environment_id, res_def_id, - levels, values, expect_code=204): - res = self.client.put( - '/environments/{0}/{1}resources/{2}/values'.format( - environment_id, - self._levels_to_url(levels), - res_def_id - ), - data=values - ) - self.assertEqual(expect_code, res.status_code) - return res - - def _add_resource_overrides(self, environment_id, res_def_id, - levels, overrides): - res = self.client.put( - '/environments/{0}/{1}resources/{2}/overrides'.format( - environment_id, - self._levels_to_url(levels), - res_def_id - ), - data=overrides - ) - self.assertEqual(res.status_code, 204) - - def _assert_db_effect(self, model, key, fields, expected): - with self.app.app_context(): - obj = model.query.get(key) - self.assertIsNotNone(obj) - marshalled = flask_restful.marshal(obj, fields) - self.assertEqual(expected, marshalled) - - def _assert_not_in_db(self, model, key): - with self.app.app_context(): - obj = model.query.get(key) - self.assertIsNone(obj) - - def get_levels_path(self, levels): - if levels: - return '/'.join(itertools.chain.from_iterable(levels)) + '/' - else: - return '' - - -class TestApp(BaseTest): - pass - - -class TestAppPrefixed(base.PrefixedTestCaseMixin, TestApp): - pass diff --git a/tuning_box/tests/test_converters.py b/tuning_box/tests/test_converters.py deleted file mode 100644 index 6c217b6..0000000 --- a/tuning_box/tests/test_converters.py +++ /dev/null @@ -1,85 +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 werkzeug import routing - -from tuning_box import converters -from tuning_box.tests import base - - -class TestLevels(base.TestCase): - def setUp(self): - super(TestLevels, self).setUp() - self.map = routing.Map([ - routing.Rule('/smth/values', endpoint='l'), - ], converters={'levels': converters.Levels}) - self.mapad = self.map.bind('example.org', '/') - - def test_empty(self): - route, kwargs = self.mapad.match('/smth/values') - self.assertEqual(kwargs['levels'], []) - - def test_one(self): - route, kwargs = self.mapad.match('/smth/level1/value1/values') - self.assertEqual(kwargs['levels'], [('level1', 'value1')]) - - def test_multi(self): - route, kwargs = self.mapad.match( - '/smth/level1/value1/level2/value2/values') - self.assertEqual(kwargs['levels'], - [('level1', 'value1'), ('level2', 'value2')]) - - def test_reverse_empty(self): - res = self.mapad.build('l', {'levels': []}) - self.assertEqual(res, '/smth/values') - - def test_reverse_one(self): - res = self.mapad.build('l', {'levels': [('level1', 'value1')]}) - self.assertEqual(res, '/smth/level1/value1/values') - - def test_reverse_multi(self): - res = self.mapad.build( - 'l', {'levels': [('level1', 'value1'), ('level2', 'value2')]}) - self.assertEqual(res, '/smth/level1/value1/level2/value2/values') - - -class TestIdOrName(base.TestCase): - def setUp(self): - super(TestIdOrName, self).setUp() - self.map = routing.Map([ - routing.Rule('/', endpoint='i'), - ], converters={'id_or_name': converters.IdOrName}) - self.mapad = self.map.bind('example.org', '/') - - def test_int(self): - route, kwargs = self.mapad.match('/1') - self.assertEqual(kwargs['id_or_name'], 1) - - def test_name(self): - route, kwargs = self.mapad.match('/name') - self.assertEqual(kwargs['id_or_name'], 'name') - - def test_name_with_slashes(self): - route, kwargs = self.mapad.match('/name/with/slashes') - self.assertEqual(kwargs['id_or_name'], 'name/with/slashes') - - def test_reverse_int(self): - res = self.mapad.build('i', {'id_or_name': 1}) - self.assertEqual(res, '/1') - - def test_reverse_name(self): - res = self.mapad.build('i', {'id_or_name': 'name'}) - self.assertEqual(res, '/name') - - def test_reverse_name_with_slashes(self): - res = self.mapad.build('i', {'id_or_name': 'name/with/slashes'}) - self.assertEqual(res, '/name/with/slashes') diff --git a/tuning_box/tests/test_db.py b/tuning_box/tests/test_db.py deleted file mode 100644 index b071db2..0000000 --- a/tuning_box/tests/test_db.py +++ /dev/null @@ -1,269 +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 - -# oslo_db internals refuse to work properly if this is not set -# actual file name in that URL doesn't matter, it'll be generated by oslo.db - -os.environ.setdefault("OS_TEST_DBAPI_ADMIN_CONNECTION", "sqlite:///testdb") - -from alembic import command as alembic_command -from alembic import script as alembic_script -import flask -from oslo_db.sqlalchemy import test_base -from oslo_db.sqlalchemy import test_migrations -import sqlalchemy as sa -import testscenarios - -from tuning_box import db -from tuning_box import errors -from tuning_box import migration -from tuning_box.tests import base - - -class _DBTestCase(base.TestCase): - def setUp(self): - super(_DBTestCase, self).setUp() - self.app = flask.Flask('test') - self.app.config["SQLALCHEMY_DATABASE_URI"] = 'sqlite:///' - self.app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False # no warning - db.db.init_app(self.app) - with self.app.app_context(): - db.fix_sqlite() - db.db.create_all() - - -class TestDB(_DBTestCase): - def test_create_all(self): - pass - - def test_get_or_create_get(self): - with self.app.app_context(), db.db.session.begin(): - db.db.session.add(db.Component(name="nsname")) - res = db.get_or_create(db.Component, name="nsname") - self.assertEqual(res.name, "nsname") - - def test_get_or_create_create(self): - with self.app.app_context(), db.db.session.begin(): - res = db.get_or_create(db.Component, name="nsname") - self.assertIsNotNone(res.id) - self.assertEqual(res.name, "nsname") - - -class TestGetByIdOrName(_DBTestCase): - def setUp(self): - super(TestGetByIdOrName, self).setUp() - ctx = self.app.app_context() - ctx.push() - self.addCleanup(ctx.pop) - self.component = db.Component(name="compname") - db.db.session.add(self.component) - db.db.session.flush() - - def test_by_id(self): - res = db.Component.query.get_by_id_or_name(self.component.id) - self.assertEqual(self.component, res) - - def test_by_name(self): - res = db.Component.query.get_by_id_or_name(self.component.name) - self.assertEqual(self.component, res) - - def test_by_id_fail(self): - self.assertRaises( - errors.TuningboxNotFound, - db.Component.query.get_by_id_or_name, - self.component.id + 1, - ) - - def test_by_name_fail(self): - self.assertRaises( - errors.TuningboxNotFound, - db.Component.query.get_by_id_or_name, - self.component.name + "_", - ) - - -class TestDBPrefixed(base.PrefixedTestCaseMixin, TestDB): - pass - - -class TestEnvironmentHierarchyLevel(_DBTestCase): - def setUp(self): - super(TestEnvironmentHierarchyLevel, self).setUp() - with self.app.app_context(), db.db.session.begin(): - session = db.db.session - environment = db.Environment() - session.add(environment) - session.flush() - self.environment_id = environment.id - - def _create_levels(self, num): - session = db.db.session - last_lvl = None - for i in range(num): - lvl = db.EnvironmentHierarchyLevel( - environment_id=self.environment_id, - parent=last_lvl, - name="lvl%s" % (i,), - ) - session.add(lvl) - last_lvl = lvl - session.flush() - - def _test_get_for_environment(self, num, expected): - with self.app.app_context(), db.db.session.begin(): - self._create_levels(num) - env = db.Environment(id=self.environment_id) - res = db.EnvironmentHierarchyLevel.get_for_environment(env) - level_names = [level.name for level in res] - self.assertEqual(level_names, expected) - - def test_get_for_environment_empty(self): - self._test_get_for_environment(0, []) - - def test_get_for_environment_one(self): - self._test_get_for_environment(1, ['lvl0']) - - def test_get_for_environment_three(self): - self._test_get_for_environment(3, ['lvl0', 'lvl1', 'lvl2']) - - -class TestEnvironmentHierarchyLevelPrefixed(base.PrefixedTestCaseMixin, - TestEnvironmentHierarchyLevel): - pass - - -class _RealDBTest(testscenarios.WithScenarios, - base.TestCase, - test_base.DbTestCase): - scenarios = [ - ('sqlite', {'FIXTURE': test_base.DbFixture}), - # ('mysql', {'FIXTURE': test_base.MySQLOpportunisticFixture}), - ('postgres', {'FIXTURE': test_base.PostgreSQLOpportunisticFixture}), - ] - - def get_alembic_config(self, engine): - return migration.get_alembic_config(engine) - - -class _RealDBPrefixedTest(base.PrefixedTestCaseMixin, - _RealDBTest): - def get_alembic_config(self, engine): - config = super(_RealDBPrefixedTest, self).get_alembic_config( - engine) - config.set_main_option('version_table', 'test_prefix_alembic_version') - config.set_main_option('table_prefix', 'test_prefix_') - return config - - -class TestMigrationsSync(_RealDBTest, - test_migrations.ModelsMigrationsSync): - def get_metadata(self): - return db.db.metadata - - def get_engine(self): - return self.engine - - def db_sync(self, engine): - config = self.get_alembic_config(engine) - alembic_command.upgrade(config, 'head') - - -class TestMigrationsSyncPrefixed(_RealDBPrefixedTest, - TestMigrationsSync): - def include_object(self, object_, name, type_, reflected, compare_to): - # ModelsMigrationsSync doesn't pass any config to MigrationContext - # so alembic assumes 'alembic_version' table by default, not our - # prefixed table - if type_ == 'table' and name == 'test_prefix_alembic_version': - return False - - return super(TestMigrationsSyncPrefixed, self).include_object( - object_, name, type_, reflected, compare_to) - - -class TestRemoveFakeRootMigration(_RealDBTest): - revision = '9ae15c85fa92' - prefix = '' - - def setUp(self): - super(TestRemoveFakeRootMigration, self).setUp() - self.alembic_config = self.get_alembic_config(self.engine) - script_dir = alembic_script.ScriptDirectory.from_config( - self.alembic_config) - self.migration_module = script_dir.get_revision(self.revision).module - self.down_revision = self.migration_module.down_revision - self.session = sa.orm.Session(bind=self.engine) - self.addCleanup(self.session.close) - - def test_upgrade(self): - alembic_command.upgrade(self.alembic_config, self.down_revision) - abase = self.migration_module._get_autobase(self.prefix, self.engine) - clss = abase.classes - env = clss.Environment() - env_level = clss.EnvironmentHierarchyLevel(environment=env, name='lvl') - self.session.add(env_level) - fake_root_1 = clss.EnvironmentHierarchyLevelValue( - level_id=None, value=None, parent_id=None) - self.session.add(fake_root_1) - self.session.flush() - child_1 = clss.EnvironmentHierarchyLevelValue( - level_id=env_level.id, value="1", parent_id=fake_root_1.id) - self.session.add(child_1) - fake_root_2 = clss.EnvironmentHierarchyLevelValue( - level_id=None, value=None, parent_id=None) - self.session.add(fake_root_2) - self.session.flush() - child_2 = clss.EnvironmentHierarchyLevelValue( - level_id=env_level.id, value="2", parent_id=fake_root_2.id) - self.session.add(child_2) - self.session.commit() - alembic_command.upgrade(self.alembic_config, self.revision) - ehlvs = self.session.query(clss.EnvironmentHierarchyLevelValue).all() - for ehlv in ehlvs: - self.assertIsNotNone(ehlv.level_id) - self.assertIsNone(ehlv.parent_id) - - def test_downgrade(self): - alembic_command.upgrade(self.alembic_config, self.revision) - abase = self.migration_module._get_autobase(self.prefix, self.engine) - clss = abase.classes - env = clss.Environment() - env_level = clss.EnvironmentHierarchyLevel(environment=env, name='lvl') - self.session.add(env_level) - self.session.flush() - child_1 = clss.EnvironmentHierarchyLevelValue( - level_id=env_level.id, value="1", parent_id=None) - self.session.add(child_1) - child_2 = clss.EnvironmentHierarchyLevelValue( - level_id=env_level.id, value="2", parent_id=None) - self.session.add(child_2) - self.session.commit() - alembic_command.downgrade(self.alembic_config, self.down_revision) - fake_root = self.session.query(clss.EnvironmentHierarchyLevelValue) \ - .filter_by(parent_id=None) \ - .one() - self.assertIsNone(fake_root.level_id) - self.assertIsNone(fake_root.value) - children = self.session.query(clss.EnvironmentHierarchyLevelValue) \ - .filter_by(parent_id=fake_root.id) \ - .all() - self.assertItemsEqual(["1", "2"], [c.value for c in children]) - for child in children: - self.assertEqual(fake_root.id, child.parent_id) - self.assertEqual(env_level.id, child.level_id) - - -class TestRemoveFakeRootMigrationPrefixed(_RealDBPrefixedTest, - TestRemoveFakeRootMigration): - prefix = 'test_prefix_'