From 942c19a6a8d768c94e827cf078032b6ffcf7bdec Mon Sep 17 00:00:00 2001 From: Andreas Jaeger Date: Wed, 18 Dec 2019 10:05:09 +0100 Subject: [PATCH] Retire repository Fuel (from openstack namespace) and fuel-ccp (in x namespace) repositories are unused and ready to retire. This change removes all content from the repository and adds the usual README file to point out that the repository is retired following the process from https://docs.openstack.org/infra/manual/drivers.html#retiring-a-project See also http://lists.openstack.org/pipermail/openstack-discuss/2019-December/011647.html Depends-On: https://review.opendev.org/699362 Change-Id: I9c48f2cfa39e04a629e20cb320caca8fd69758fd --- .coveragerc | 7 - .gitignore | 57 - .mailmap | 3 - .testr.conf | 9 - CONTRIBUTING.rst | 17 - HACKING.rst | 4 - LICENSE | 175 - MAINTAINERS | 32 - MANIFEST.in | 7 - README.rst | 298 +- TODO | 7 - alembic.ini | 41 - babel.cfg | 1 - bindep.txt | 10 - doc/source/conf.py | 75 - doc/source/contributing.rst | 4 - doc/source/index.rst | 24 - doc/source/installation.rst | 12 - doc/source/readme.rst | 1 - .../records/01-first-show/component.json | 14 - .../records/01-first-show/environment.json | 5 - .../records/01-first-show/namespace.json | 1 - doc/source/records/01-first-show/record.json | 2017 --- .../records/02-api-update/component.json | 13 - .../records/02-api-update/environment.json | 5 - .../records/02-api-update/namespace.json | 1 - doc/source/records/02-api-update/record.json | 13830 ---------------- doc/source/records/02-api-update/script | 36 - doc/source/records/03-cli/component.json | 13 - doc/source/records/03-cli/environment.json | 4 - doc/source/records/03-cli/record.json | 9534 ----------- doc/source/records/03-cli/script | 34 - doc/source/records/prettify.py | 90 - doc/source/usage.rst | 7 - examples/etc/tuningbox/tuningbox_config.py | 26 - examples/etc/tuningbox/uwsgi_tuningbox.yaml | 8 - examples/lib/systemd/system/tuningbox.service | 12 - openstack-common.conf | 6 - requirements.txt | 13 - setup.cfg | 98 - setup.py | 29 - specs/tuning-box.spec | 52 - test-requirements.txt | 18 - tools/test-setup.sh | 54 - tox.ini | 37 - tuning_box/__init__.py | 24 - tuning_box/app.py | 161 - tuning_box/cli/__init__.py | 27 - tuning_box/cli/base.py | 165 - tuning_box/cli/components.py | 89 - tuning_box/cli/environments.py | 100 - tuning_box/cli/errors.py | 23 - tuning_box/cli/hierarchy_levels.py | 71 - tuning_box/cli/resource_definitions.py | 150 - tuning_box/cli/resources.py | 257 - tuning_box/client.py | 54 - tuning_box/converters.py | 77 - tuning_box/db.py | 280 - tuning_box/errors.py | 47 - tuning_box/fuelclient.py | 174 - tuning_box/library/__init__.py | 100 - tuning_box/library/components.py | 77 - tuning_box/library/environments.py | 142 - tuning_box/library/hierarchy_levels.py | 110 - tuning_box/library/resource_definitions.py | 108 - tuning_box/library/resource_keys_operation.py | 208 - tuning_box/library/resource_overrides.py | 69 - tuning_box/library/resource_values.py | 168 - tuning_box/logger.py | 27 - tuning_box/middleware/__init__.py | 0 tuning_box/middleware/keystone.py | 21 - tuning_box/migration.py | 39 - tuning_box/migrations/env.py | 76 - tuning_box/migrations/script.py.mako | 41 - .../versions/0c586adad733_cascade_deletion.py | 174 - .../3b2a0f134e45_switch_to_new_api.py | 102 - ...erver_default_to_resource_values_values.py | 52 - ...remove_fake_root_hierarchy_level_values.py | 90 - ...89a70_remove_hierarchy_for_level_values.py | 78 - ...40fd68_add_overrides_to_resource_values.py | 46 - .../adf671eddeb4_level_cascade_deletion.py | 59 - ...add_unique_constraint_on_component_name.py | 48 - .../versions/f16eb4eff7c_initial_revision.py | 169 - tuning_box/nailgun.py | 87 - tuning_box/tests/__init__.py | 0 tuning_box/tests/base.py | 32 - tuning_box/tests/cli/__init__.py | 99 - tuning_box/tests/cli/test_components.py | 145 - tuning_box/tests/cli/test_environments.py | 153 - tuning_box/tests/cli/test_help.py | 20 - tuning_box/tests/cli/test_hierarchy_levels.py | 67 - .../tests/cli/test_resource_definitions.py | 150 - tuning_box/tests/cli/test_resources.py | 268 - tuning_box/tests/library/__init__.py | 0 tuning_box/tests/library/test_components.py | 204 - tuning_box/tests/library/test_environments.py | 322 - .../tests/library/test_hierarchy_levels.py | 149 - tuning_box/tests/library/test_library.py | 111 - .../library/test_resource_definitions.py | 213 - .../library/test_resource_key_operations.py | 370 - .../tests/library/test_resource_overrides.py | 311 - .../tests/library/test_resource_values.py | 360 - tuning_box/tests/test_app.py | 131 - tuning_box/tests/test_converters.py | 85 - tuning_box/tests/test_db.py | 269 - 105 files changed, 8 insertions(+), 33982 deletions(-) delete mode 100644 .coveragerc delete mode 100644 .gitignore delete mode 100644 .mailmap delete mode 100644 .testr.conf delete mode 100644 CONTRIBUTING.rst delete mode 100644 HACKING.rst delete mode 100644 LICENSE delete mode 100644 MAINTAINERS delete mode 100644 MANIFEST.in delete mode 100644 TODO delete mode 100644 alembic.ini delete mode 100644 babel.cfg delete mode 100644 bindep.txt delete mode 100755 doc/source/conf.py delete mode 100644 doc/source/contributing.rst delete mode 100644 doc/source/index.rst delete mode 100644 doc/source/installation.rst delete mode 100644 doc/source/readme.rst delete mode 100644 doc/source/records/01-first-show/component.json delete mode 100644 doc/source/records/01-first-show/environment.json delete mode 100644 doc/source/records/01-first-show/namespace.json delete mode 100644 doc/source/records/01-first-show/record.json delete mode 100644 doc/source/records/02-api-update/component.json delete mode 100644 doc/source/records/02-api-update/environment.json delete mode 100644 doc/source/records/02-api-update/namespace.json delete mode 100644 doc/source/records/02-api-update/record.json delete mode 100644 doc/source/records/02-api-update/script delete mode 100644 doc/source/records/03-cli/component.json delete mode 100644 doc/source/records/03-cli/environment.json delete mode 100644 doc/source/records/03-cli/record.json delete mode 100644 doc/source/records/03-cli/script delete mode 100644 doc/source/records/prettify.py delete mode 100644 doc/source/usage.rst delete mode 100644 examples/etc/tuningbox/tuningbox_config.py delete mode 100644 examples/etc/tuningbox/uwsgi_tuningbox.yaml delete mode 100644 examples/lib/systemd/system/tuningbox.service delete mode 100644 openstack-common.conf delete mode 100644 requirements.txt delete mode 100644 setup.cfg delete mode 100644 setup.py delete mode 100644 specs/tuning-box.spec delete mode 100644 test-requirements.txt delete mode 100755 tools/test-setup.sh delete mode 100644 tox.ini delete mode 100644 tuning_box/__init__.py delete mode 100644 tuning_box/app.py delete mode 100644 tuning_box/cli/__init__.py delete mode 100644 tuning_box/cli/base.py delete mode 100644 tuning_box/cli/components.py delete mode 100644 tuning_box/cli/environments.py delete mode 100644 tuning_box/cli/errors.py delete mode 100644 tuning_box/cli/hierarchy_levels.py delete mode 100644 tuning_box/cli/resource_definitions.py delete mode 100644 tuning_box/cli/resources.py delete mode 100644 tuning_box/client.py delete mode 100644 tuning_box/converters.py delete mode 100644 tuning_box/db.py delete mode 100644 tuning_box/errors.py delete mode 100644 tuning_box/fuelclient.py delete mode 100644 tuning_box/library/__init__.py delete mode 100644 tuning_box/library/components.py delete mode 100644 tuning_box/library/environments.py delete mode 100644 tuning_box/library/hierarchy_levels.py delete mode 100644 tuning_box/library/resource_definitions.py delete mode 100644 tuning_box/library/resource_keys_operation.py delete mode 100644 tuning_box/library/resource_overrides.py delete mode 100644 tuning_box/library/resource_values.py delete mode 100644 tuning_box/logger.py delete mode 100644 tuning_box/middleware/__init__.py delete mode 100644 tuning_box/middleware/keystone.py delete mode 100644 tuning_box/migration.py delete mode 100644 tuning_box/migrations/env.py delete mode 100644 tuning_box/migrations/script.py.mako delete mode 100644 tuning_box/migrations/versions/0c586adad733_cascade_deletion.py delete mode 100644 tuning_box/migrations/versions/3b2a0f134e45_switch_to_new_api.py delete mode 100644 tuning_box/migrations/versions/967a44dd16d5_add_server_default_to_resource_values_values.py delete mode 100644 tuning_box/migrations/versions/9ae15c85fa92_remove_fake_root_hierarchy_level_values.py delete mode 100644 tuning_box/migrations/versions/a86472389a70_remove_hierarchy_for_level_values.py delete mode 100644 tuning_box/migrations/versions/ad192a40fd68_add_overrides_to_resource_values.py delete mode 100644 tuning_box/migrations/versions/adf671eddeb4_level_cascade_deletion.py delete mode 100644 tuning_box/migrations/versions/d054eefc4c5b_add_unique_constraint_on_component_name.py delete mode 100644 tuning_box/migrations/versions/f16eb4eff7c_initial_revision.py delete mode 100644 tuning_box/nailgun.py delete mode 100644 tuning_box/tests/__init__.py delete mode 100644 tuning_box/tests/base.py delete mode 100644 tuning_box/tests/cli/__init__.py delete mode 100644 tuning_box/tests/cli/test_components.py delete mode 100644 tuning_box/tests/cli/test_environments.py delete mode 100644 tuning_box/tests/cli/test_help.py delete mode 100644 tuning_box/tests/cli/test_hierarchy_levels.py delete mode 100644 tuning_box/tests/cli/test_resource_definitions.py delete mode 100644 tuning_box/tests/cli/test_resources.py delete mode 100644 tuning_box/tests/library/__init__.py delete mode 100644 tuning_box/tests/library/test_components.py delete mode 100644 tuning_box/tests/library/test_environments.py delete mode 100644 tuning_box/tests/library/test_hierarchy_levels.py delete mode 100644 tuning_box/tests/library/test_library.py delete mode 100644 tuning_box/tests/library/test_resource_definitions.py delete mode 100644 tuning_box/tests/library/test_resource_key_operations.py delete mode 100644 tuning_box/tests/library/test_resource_overrides.py delete mode 100644 tuning_box/tests/library/test_resource_values.py delete mode 100644 tuning_box/tests/test_app.py delete mode 100644 tuning_box/tests/test_converters.py delete mode 100644 tuning_box/tests/test_db.py 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_'