From ed8fed7aa2ef01b4041118e0efc07183853d4cb8 Mon Sep 17 00:00:00 2001 From: Alex Schultz Date: Wed, 2 May 2018 10:39:11 -0600 Subject: [PATCH] Retire tripleo-incubator This project is no logner maintained or used as part of TripleO. Change-Id: I0c9d052d2b3e3a3e656342042461b330c74139f0 Related-Bug: #1768590 Depends-On: https://review.openstack.org/#/c/565836/ --- .gitignore | 33 - .gitreview | 4 - CONTRIBUTING.rst | 20 - HACKING.rst | 70 -- LICENSE | 202 ----- README.rst | 19 +- cloudprompt | 5 - doc/ext/__init__.py | 0 doc/ext/extract_docs.py | 32 - doc/source/CONTRIBUTING.rst | 1 - doc/source/HACKING.rst | 1 - doc/source/README.rst | 1 - doc/source/conf.py | 50 -- doc/source/deploying.rst | 494 ------------ doc/source/index.rst | 53 -- doc/source/overview.svg | 1 - doc/source/puppet.rst | 133 ---- doc/source/resources.rst | 29 - doc/source/selinux-guide.rst | 283 ------- doc/source/troubleshooting.rst | 101 --- doc/source/userguide.rst | 39 - images/baremetal-bootstrap.dia | Bin 3477 -> 0 bytes images/baremetal-build-and-test-cycle.dia | Bin 4865 -> 0 bytes images/baremetal-build-images.dia | Bin 2806 -> 0 bytes images/baremetal-deploy.odp | Bin 20808 -> 0 bytes images/baremetal-discovery.odp | Bin 20760 -> 0 bytes images/nova-baremetal-deploy-process.dia | Bin 4205 -> 0 bytes images/tripleo-concept.odp | Bin 19223 -> 0 bytes images/tripleo-concept.svg | 469 ------------ images/tripleo-overview.dia | Bin 2138 -> 0 bytes images/tripleo-overview.png | Bin 45161 -> 0 bytes overcloudrc | 8 - overcloudrc-user | 8 - .../TripleO architecture overview.odp | Bin 66699 -> 0 bytes run-bashate.sh | 5 - scripts/acquire-image | 103 --- scripts/assert-admin-users | 60 -- scripts/assert-user | 101 --- scripts/assert-users | 69 -- scripts/boot-seed-vm | 228 ------ scripts/build-images | 144 ---- scripts/cleanup-env | 106 --- scripts/configure-vm | 159 ---- scripts/create-nodes | 77 -- scripts/devtest.sh | 387 ---------- scripts/devtest_end.sh | 36 - scripts/devtest_overcloud.sh | 716 ------------------ scripts/devtest_overcloud_images.sh | 124 --- scripts/devtest_ramdisk.sh | 63 -- scripts/devtest_seed.sh | 437 ----------- scripts/devtest_setup.sh | 353 --------- scripts/devtest_testenv.sh | 288 ------- scripts/devtest_undercloud.sh | 448 ----------- scripts/devtest_update_network.sh | 66 -- scripts/devtest_variables.sh | 215 ------ scripts/extract-docs | 60 -- scripts/extract-docs.awk | 57 -- scripts/get-vm-mac | 20 - scripts/install-dependencies | 84 -- scripts/load-image | 164 ---- scripts/load-images | 130 ---- scripts/os-adduser | 128 ---- scripts/os-make-password | 60 -- scripts/outage-bot | 60 -- scripts/overcloud_disk_images.yaml | 18 - scripts/overcloud_puppet_disk_images.yaml | 19 - scripts/pull-tools | 90 --- scripts/refresh-env | 44 -- scripts/register-endpoint | 188 ----- scripts/select-cloud | 134 ---- scripts/send-irc | 49 -- scripts/set-os-type | 49 -- scripts/set-pip-vars | 80 -- scripts/set-source-vars | 170 ----- scripts/set-usergroup-membership | 65 -- scripts/setup-baremetal | 115 --- scripts/setup-clienttools | 38 - scripts/setup-endpoints | 176 ----- scripts/setup-env | 1 - scripts/setup-network | 74 -- scripts/setup-overcloud-passwords | 99 --- scripts/setup-seed-vm | 133 ---- scripts/setup-undercloud-passwords | 96 --- scripts/takeovernode | 73 -- scripts/undercloud-debug | 74 -- scripts/update-admin-ssh-keys | 91 --- scripts/user-config | 5 - scripts/wait_for | 179 ----- scripts/wait_for_hypervisor_stats | 67 -- scripts/wait_for_stack_ready | 43 -- scripts/write-tripleorc | 133 ---- seedrc | 8 - setup.cfg | 30 - setup.py | 22 - templates/domain.xml | 37 - templates/net.xml | 6 - test-requirements.txt | 2 - tox.ini | 24 - tripleo-cloud/README.md | 41 - tripleo-cloud/ssh-keys/GheRivero | 1 - tripleo-cloud/ssh-keys/Ng | 3 - tripleo-cloud/ssh-keys/SpamapS | 2 - tripleo-cloud/ssh-keys/StevenK | 2 - tripleo-cloud/ssh-keys/bnemec | 1 - tripleo-cloud/ssh-keys/derekh | 1 - tripleo-cloud/ssh-keys/dmanchad | 1 - tripleo-cloud/ssh-keys/dprince | 1 - tripleo-cloud/ssh-keys/emacchi | 1 - tripleo-cloud/ssh-keys/greghaynes | 1 - tripleo-cloud/ssh-keys/jog0 | 1 - tripleo-cloud/ssh-keys/kforde | 1 - tripleo-cloud/ssh-keys/slagle | 1 - tripleo-cloud/ssh-keys/sshnaidm | 1 - tripleo-cloud/ssh-keys/tchaypo | 2 - tripleo-cloud/tripleo-cd-admins | 8 - tripleo-cloud/tripleo-cd-users | 7 - undercloudrc | 8 - 117 files changed, 8 insertions(+), 9512 deletions(-) delete mode 100644 .gitignore delete mode 100644 .gitreview delete mode 100644 CONTRIBUTING.rst delete mode 100644 HACKING.rst delete mode 100644 LICENSE delete mode 100644 cloudprompt delete mode 100644 doc/ext/__init__.py delete mode 100644 doc/ext/extract_docs.py delete mode 100644 doc/source/CONTRIBUTING.rst delete mode 100644 doc/source/HACKING.rst delete mode 100644 doc/source/README.rst delete mode 100644 doc/source/conf.py delete mode 100644 doc/source/deploying.rst delete mode 100644 doc/source/index.rst delete mode 100644 doc/source/overview.svg delete mode 100644 doc/source/puppet.rst delete mode 100644 doc/source/resources.rst delete mode 100644 doc/source/selinux-guide.rst delete mode 100644 doc/source/troubleshooting.rst delete mode 100644 doc/source/userguide.rst delete mode 100644 images/baremetal-bootstrap.dia delete mode 100644 images/baremetal-build-and-test-cycle.dia delete mode 100644 images/baremetal-build-images.dia delete mode 100644 images/baremetal-deploy.odp delete mode 100644 images/baremetal-discovery.odp delete mode 100644 images/nova-baremetal-deploy-process.dia delete mode 100644 images/tripleo-concept.odp delete mode 100644 images/tripleo-concept.svg delete mode 100644 images/tripleo-overview.dia delete mode 100644 images/tripleo-overview.png delete mode 100644 overcloudrc delete mode 100644 overcloudrc-user delete mode 100644 presentations/TripleO architecture overview.odp delete mode 100755 run-bashate.sh delete mode 100755 scripts/acquire-image delete mode 100755 scripts/assert-admin-users delete mode 100755 scripts/assert-user delete mode 100755 scripts/assert-users delete mode 100755 scripts/boot-seed-vm delete mode 100755 scripts/build-images delete mode 100755 scripts/cleanup-env delete mode 100755 scripts/configure-vm delete mode 100755 scripts/create-nodes delete mode 100755 scripts/devtest.sh delete mode 100755 scripts/devtest_end.sh delete mode 100755 scripts/devtest_overcloud.sh delete mode 100755 scripts/devtest_overcloud_images.sh delete mode 100755 scripts/devtest_ramdisk.sh delete mode 100755 scripts/devtest_seed.sh delete mode 100755 scripts/devtest_setup.sh delete mode 100755 scripts/devtest_testenv.sh delete mode 100755 scripts/devtest_undercloud.sh delete mode 100755 scripts/devtest_update_network.sh delete mode 100755 scripts/devtest_variables.sh delete mode 100755 scripts/extract-docs delete mode 100644 scripts/extract-docs.awk delete mode 100755 scripts/get-vm-mac delete mode 100755 scripts/install-dependencies delete mode 100755 scripts/load-image delete mode 100755 scripts/load-images delete mode 100755 scripts/os-adduser delete mode 100755 scripts/os-make-password delete mode 100755 scripts/outage-bot delete mode 100644 scripts/overcloud_disk_images.yaml delete mode 100644 scripts/overcloud_puppet_disk_images.yaml delete mode 100755 scripts/pull-tools delete mode 100644 scripts/refresh-env delete mode 100755 scripts/register-endpoint delete mode 100755 scripts/select-cloud delete mode 100755 scripts/send-irc delete mode 100755 scripts/set-os-type delete mode 100755 scripts/set-pip-vars delete mode 100755 scripts/set-source-vars delete mode 100755 scripts/set-usergroup-membership delete mode 100755 scripts/setup-baremetal delete mode 100755 scripts/setup-clienttools delete mode 100755 scripts/setup-endpoints delete mode 120000 scripts/setup-env delete mode 100755 scripts/setup-network delete mode 100755 scripts/setup-overcloud-passwords delete mode 100755 scripts/setup-seed-vm delete mode 100755 scripts/setup-undercloud-passwords delete mode 100755 scripts/takeovernode delete mode 100755 scripts/undercloud-debug delete mode 100755 scripts/update-admin-ssh-keys delete mode 100755 scripts/user-config delete mode 100755 scripts/wait_for delete mode 100755 scripts/wait_for_hypervisor_stats delete mode 100755 scripts/wait_for_stack_ready delete mode 100755 scripts/write-tripleorc delete mode 100644 seedrc delete mode 100644 setup.cfg delete mode 100644 setup.py delete mode 100644 templates/domain.xml delete mode 100644 templates/net.xml delete mode 100644 test-requirements.txt delete mode 100644 tox.ini delete mode 100644 tripleo-cloud/README.md delete mode 100644 tripleo-cloud/ssh-keys/GheRivero delete mode 100644 tripleo-cloud/ssh-keys/Ng delete mode 100644 tripleo-cloud/ssh-keys/SpamapS delete mode 100644 tripleo-cloud/ssh-keys/StevenK delete mode 100644 tripleo-cloud/ssh-keys/bnemec delete mode 100644 tripleo-cloud/ssh-keys/derekh delete mode 100644 tripleo-cloud/ssh-keys/dmanchad delete mode 100644 tripleo-cloud/ssh-keys/dprince delete mode 100644 tripleo-cloud/ssh-keys/emacchi delete mode 100644 tripleo-cloud/ssh-keys/greghaynes delete mode 100644 tripleo-cloud/ssh-keys/jog0 delete mode 100644 tripleo-cloud/ssh-keys/kforde delete mode 100644 tripleo-cloud/ssh-keys/slagle delete mode 100644 tripleo-cloud/ssh-keys/sshnaidm delete mode 100644 tripleo-cloud/ssh-keys/tchaypo delete mode 100644 tripleo-cloud/tripleo-cd-admins delete mode 100644 tripleo-cloud/tripleo-cd-users delete mode 100644 undercloudrc diff --git a/.gitignore b/.gitignore deleted file mode 100644 index cd79b033..00000000 --- a/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -*.swp -*~ -*.qcow2 - -.DS_Store - -*.egg -*.egg-info -*.pyc - -doc/source/devtest*.rst -openstack-tools -scripts/ceilometer -scripts/cinder -scripts/generate-keystone-pki -scripts/glance -scripts/heat -scripts/init-keystone -scripts/ironic -scripts/keystone -scripts/nova -scripts/neutron -scripts/openstack -scripts/os-apply-config -scripts/register-nodes -scripts/setup-neutron -scripts/swift - -.tox -doc/build - -AUTHORS -ChangeLog diff --git a/.gitreview b/.gitreview deleted file mode 100644 index 8a0590e3..00000000 --- a/.gitreview +++ /dev/null @@ -1,4 +0,0 @@ -[gerrit] -host=review.openstack.org -port=29418 -project=openstack/tripleo-incubator.git diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst deleted file mode 100644 index 8b929e41..00000000 --- a/CONTRIBUTING.rst +++ /dev/null @@ -1,20 +0,0 @@ -Contributing -============ - -If you would like to contribute to the development of OpenStack, -you must follow the steps in documented at: - - http://docs.openstack.org/infra/manual/developers.html#development-workflow - -Once those steps have been completed, changes to OpenStack -should be submitted for review via the Gerrit tool, following -the workflow documented at: - - http://docs.openstack.org/infra/manual/developers.html#development-workflow - -Pull requests submitted through GitHub will not be seen. - -Bugs should be filed on Launchpad, not GitHub: - - https://bugs.launchpad.net/tripleo - diff --git a/HACKING.rst b/HACKING.rst deleted file mode 100644 index bc735063..00000000 --- a/HACKING.rst +++ /dev/null @@ -1,70 +0,0 @@ -TripleO Style Guidelines -======================== - -- Step 1: Read the OpenStack Style Guidelines [1]_ -- Step 2: Read Bashate [2]_ -- Step 3: See specific guidelines below - -TripleO Specific Guidelines ---------------------------- - -There is plenty of code that does not adhere to these conventions currently. -However it is useful to have conventions as consistently formatted code is -easier to read and less likely to hide bugs. New code should adhere to these -conventions, and developers should consider sensible adjustment of existing -code when working nearby. - -Formatting -~~~~~~~~~~ -Please follow conventions described in OpenStack style guidelines [1]_ and Bashate [2]_. - -- Order lists whenever possible, whether in code or data. If the order doesn't - matter, use a case-insensitive alphabetical sort. This makes them easier to - compare with ``diff``-like tools. - - "a" < "B" < "c" - - "a" < "ab" - - "2" < "10" - -Bash -~~~~ -As well as those rules described in Bashate [2]_: - -- The interpreter is ``/bin/bash``. -- Provide a shebang ``#!/bin/bash`` if you intend your script to be run rather than sourced. -- Use ``set -e`` and ``set -o pipefail`` to exit early on errors. -- Use ``set -u`` to catch typos in variable names. -- Use ``$()`` not `````` for subshell commands. -- Double quote substitutions by default. It's OK to omit quotes if it's - important that the result be multiple words. EG given VAR="a b": - - ``echo "${VAR}"`` - Quote variables. - ``echo "$(echo a b)"`` - Quote subshells. - ``echo "$(echo "${VAR}")"`` - In subshells, the inner quotes must not be escaped. - ``function print_b() { echo "$2"; }; print_b ${VAR}`` - You must omit quotes for a variable to be passed as multiple arguments. - ``ARRAY=(${VAR}); echo "${#ARRAY[@]}" = 2`` - You must omit quotes to form a multi-element array. - -- Avoid repeated/copy-pasted code. Make it a function, or a shared script, etc. - -Script Input -~~~~~~~~~~~~ -- Avoid environment variables as input. Prefer command-line arguments. -- If passing structured data, use JSON. -- Avoid passing substantial amounts of bare data (eg JSON) on the command - line. It is preferred to place the data in a file and pass the filename. - Using process substitution ``<()`` can help with this. - -Variables -~~~~~~~~~ -- Within a shell script, variables that are defined for local use should be - lower_cased. Variables that are passed in or come from outside the script - should be UPPER_CASED. - -References ----------- -.. [1] http://docs.openstack.org/developer/hacking/ -.. [2] http://git.openstack.org/cgit/openstack-dev/bashate/tree/README.rst diff --git a/LICENSE b/LICENSE deleted file mode 100644 index d6456956..00000000 --- a/LICENSE +++ /dev/null @@ -1,202 +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. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. diff --git a/README.rst b/README.rst index f36ece50..d98af48c 100644 --- a/README.rst +++ b/README.rst @@ -1,13 +1,10 @@ -======================== -Team and repository tags -======================== +This project is no longer maintained. -.. image:: http://governance.openstack.org/badges/tripleo-incubator.svg - :target: http://governance.openstack.org/reference/tags/index.html +The contents of this repository are still available in the Git +source code management system. To see the contents of this +repository before it reached its end of life, please check out the +previous commit with "git checkout HEAD^1". -.. Change things from this point on - -This Repo is Deprecated -======================= - -Please see the `current TripleO docs `_. +For any further questions, please email +openstack-dev@lists.openstack.org or join #openstack-dev on +Freenode. diff --git a/cloudprompt b/cloudprompt deleted file mode 100644 index 0d1130c2..00000000 --- a/cloudprompt +++ /dev/null @@ -1,5 +0,0 @@ -# Add OS_CLOUDNAME to PS1 -if [ -z "${OS_CLOUDPROMPT_ENABLED:-}" ]; then - export PS1=\${OS_CLOUDNAME:+"(\$OS_CLOUDNAME)"}$PS1 - export OS_CLOUDPROMPT_ENABLED=1 -fi diff --git a/doc/ext/__init__.py b/doc/ext/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/doc/ext/extract_docs.py b/doc/ext/extract_docs.py deleted file mode 100644 index 50e68fa0..00000000 --- a/doc/ext/extract_docs.py +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import os - -from sphinx import errors - - -def builder_inited(app): - app.info('In: ' + os.path.abspath('.')) - source_dir = app.srcdir - build_dir = app.outdir - app.info('Generating devtest from %s into %s' % (source_dir, build_dir)) - ret = os.system('scripts/extract-docs') - if ret: - raise errors.ExtensionError( - "Error generating %s/devtest.rst" % build_dir) - - -def setup(app): - app.connect('builder-inited', builder_inited) diff --git a/doc/source/CONTRIBUTING.rst b/doc/source/CONTRIBUTING.rst deleted file mode 100644 index ac7b6bcf..00000000 --- a/doc/source/CONTRIBUTING.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../../CONTRIBUTING.rst diff --git a/doc/source/HACKING.rst b/doc/source/HACKING.rst deleted file mode 100644 index a2bcf4fd..00000000 --- a/doc/source/HACKING.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../../HACKING.rst diff --git a/doc/source/README.rst b/doc/source/README.rst deleted file mode 100644 index a6210d3d..00000000 --- a/doc/source/README.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../../README.rst diff --git a/doc/source/conf.py b/doc/source/conf.py deleted file mode 100644 index baac6506..00000000 --- a/doc/source/conf.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- - -import os -import sys - -sys.path.insert(0, os.path.abspath('../..')) -sys.path.insert(0, os.path.abspath('../')) -sys.path.insert(0, os.path.abspath('./')) - -# -- General configuration ---------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.intersphinx', - 'oslosphinx', - 'ext.extract_docs' -] - -# The suffix of source filenames. -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'TripleO' -copyright = u'2013, OpenStack Foundation' - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# -- Options for HTML output -------------------------------------------------- - -# 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} diff --git a/doc/source/deploying.rst b/doc/source/deploying.rst deleted file mode 100644 index 40b831d0..00000000 --- a/doc/source/deploying.rst +++ /dev/null @@ -1,494 +0,0 @@ -Deploying TripleO -================= - -Components ----------- - -Essential Components -^^^^^^^^^^^^^^^^^^^^ - -Essential components make up the self-deploying infrastructure that is -the heart of TripleO. - -- Baremetal machine deployment (Nova Baremetal, soon to be 'Ironic') - -- Baremetal volume management (Cinder - not available yet) - -- Cluster orchestration (Heat) - -- Machine image creation (Diskimage-builder) - -- In-instance configuration management - (os-apply-config+os-refresh-config, and/or Chef/Puppet/Salt) - -- Image management (Glance) - -- Network management (Neutron) - -- Authentication and service catalog (Keystone) - -Additional Components -^^^^^^^^^^^^^^^^^^^^^ - -These components add value to the TripleO story, making it safer to -upgrade and evolve an environment, but are secondary to the core thing -itself. - -- Continuous integration (Zuul/Jenkins) - -- Monitoring and alerting (Ceilometer/nagios/etc) - -Dependencies ------------- - -Each component can only be deployed once its dependencies are available. - -TripleO is built on a Linux platform, so a Linux environment is required -both to create images and as the OS that will run on the machines. If -you have no Linux machines at all, you can download a live CD from a -number of vendors, which will permit you to run diskimage-builder to get -going. - -Diskimage-builder -^^^^^^^^^^^^^^^^^ - -An internet connection is also required to download the various packages -used in preparing each image. - -The machine images built *can* depend on Heat metadata, or they can just -contain configured Chef/Puppet/Salt credentials, depending on how much -of TripleO is in use. Avoiding Heat is useful when doing a incremental -adoption of TripleO (see later in this document). - -Baremetal machine deployment -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Baremetal deployments are delivered via Nova. Additionally, the network -must be configured so that the baremetal host machine can receive TFTP -from any physical machine that is being booted. - -Nova -^^^^ - -Nova depends on Keystone, Glance and Neutron. In future Cinder will be -one of the dependencies. - -There are three ways the service can be deployed: - -- Via diskimage-builder built machine images, configured via a running - Heat cluster. This is the normal TripleO deployment. - -- Via the special bootstrap node image, which is built by - diskimage-builder and contains a full working stack - nova, glance, - keystone and neutron, configured by statically generated Heat - metadata. This approach is used to get TripleO up and running. - -- By hand - e.g. using devstack, or manually/chef/puppet/packages on a - dedicated machine. This can be useful for incremental adoption of - TripleO. - -Cinder -^^^^^^ - -Cinder is needed for persistent storage on bare metal machines. That -aspect of TripleO is not yet available : when an instance is deleted, -the storage is deleted with it. - -Neutron -^^^^^^^ - -Neutron depends on Keystone. The same three deployment options exist as -for Nova. The Neutron network node(s) must be the only DHCP servers on -the network. - -Glance -^^^^^^ - -Glance depends on Keystone. The same three deployment options exist as -for Nova. - -Keystone -^^^^^^^^ - -Keystone has no external dependencies. The same three deployment options -exist as for Nova. - -Heat -^^^^ - -Heat depends on Nova, Cinder and Keystone. The same three deployment -options exist as for Nova. - -In-instance configuration -^^^^^^^^^^^^^^^^^^^^^^^^^ - -The os-apply-config and os-refresh-config tools depend on Heat to -provide cluster configuration metadata. They can be used before Heat is -functional if a statically prepared metadata file is placed in the Heat -path : this is how the bootstrap node works. - -os-apply-config and os-refresh-config can be used in concert with -Chef/Puppet/Salt, or not used at all, if you configure your services via -Chef/Puppet/Salt. - -The reference TripleO elements do not depend on Chef/Puppet/Salt, to -avoid conflicting when organisations with an investment in -Chef/Puppet/Salt start using TripleO. - -Deploying TripleO incrementally -------------------------------- - -The general sequence is: - -- Examine the current state of TripleO and assess where non-automated - solutions will be needed for your environment. E.g. at the time of - writing VLAN support requires baking the VLAN configuration into your - built disk images. - -- Decide how much of TripleO you will adopt. See `Example deployments (possible today)`_ - below. - -- Install diskimage-builder somewhere and use it to build the disk - images your configuration will require. - -- Bring up the aspects of TripleO you will be using, starting with a - boot-stack node (which you can run in a KVM VM in your datacentre), - using that to bring up an actual machine and transfer bare metal - services onto it, and then continuing up the stack. - -Current caveats / workarounds ------------------------------ - -These are all documented in README.rst and in the -`TripleO bugtracker`_. - -.. _`TripleO bugtracker`: https://launchpad.net/tripleo - -No API driven persistent storage -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Every 'nova boot' will reset the data on the machine it deploys to. To -do incremental image based updates they have to be done within the -runnning image. 'takeovernode' can do that, but as yet we have not -written rules to split out persistent data into another partition - so -some assembly required. - -VLANs for physical nodes require customised images (rather than just metadata). -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -If you require VLANs you should create a diskimage-builder element to -add the vlan package and vlan configuration to /etc/network/interfaces -as a first-boot rule. - -New seed image creation returns tmpfs space errors (systems with < 9GB of RAM) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Creating a new seed image takes up to 4.5GB of space inside a /tmp/imageXXXXX -directory. tmpfs can take up to 50% of RAM and systems with less than 9GB of -RAM will fail in this step. When using ``diskimage-builder`` directly, you can -prevent the space errors by: - -- avoiding tmpfs with ``--no-tmpfs`` or -- specifying a minimum tmpfs size required with ``--min-tmpfs`` (which can be used - in conjunction with setting the environment variable ``TMP_DIR`` to override the - default temporary directory) - -If you are using ``boot-seed-vm``, set the environment variable ``DIB_NO_TMPFS=1``. - -Example deployments (possible today) ------------------------------------- - -Baremetal only -^^^^^^^^^^^^^^ - -In this scenario you make use of the baremetal driver to deploy -unspecialised machine images, and perform specialisation using -Chef/Puppet/Salt - whatever configuration management toolchain you -prefer. The baremetal host system is installed manually, but a TripleO -image is used to deploy it. - -It scales within any one broadcast domain to the capacity of the single -baremetal host. - -Prerequisites -~~~~~~~~~~~~~ - -- A boot-stack image setup to run in KVM. - -- A vanilla image. - -- A userdata script to configure new instances to run however you want. - -- A machine installed with your OS of choice in your datacentre. - -- Physical machines configured to netboot in preference to local boot. - -- A list of the machines + their IPMI details + mac addresses. - -- A network range larger than the maximum number of concurrent deploy - operations to run in parallel. - -- A network to run the instances on large enough to supply one ip per - instance. - -HOWTO -~~~~~ - -- Build the images you need (add any local elements you need to the - commands) - -- Copy ``tripleo-image-elements/elements/seed-stack-config/config.json`` to - ``tripleo-image-elements/elements/seed-stack-config/local.json`` and - change the virtual power manager to 'nova...impi.IPMI'. - https://bugs.launchpad.net/tripleo/+bug/1178547:: - - disk-image-create -o bootstrap vm boot-stack local-config ubuntu - disk-image-create -o ubuntu ubuntu - - The ``local-config`` element will copy your ssh key and your HTTP proxy - settings in the disk image during the creation process. - - The ``stackuser`` element will create a user ``stack`` with the password ``stack``. - - ``disk-image-create`` will create a image with a very small disk size - that at to be resized for example by cloud-init. You can use - ``DIB_IMAGE_SIZE`` to increase this initial size, in GB. - -- Setup a VM using bootstrap.qcow2 on your existing machine, with eth1 - bridged into your datacentre LAN. - -- Run up that VM, which will create a self contained nova baremetal - install. - -- Reconfigure the networking within the VM to match your physical - network. https://bugs.launchpad.net/tripleo/+bug/1178397 - https://bugs.launchpad.net/tripleo/+bug/1178099 - -- If you had exotic hardware needs, replace the deploy images that the - bootstack creates. https://bugs.launchpad.net/tripleo/+bug/1178094 - -- Enroll your vanilla image into the glance of that install. Be sure to - use ``tripleo-incubator/scripts/load-image`` as that will extract the - kernel and ramdisk and register them appropriately with glance. - -- Enroll your other datacentre machines into that nova baremetal - install. A script that takes your machine inventory and prints out - something like:: - - nova baremetal-node-create --pm_user XXX --pm_address YYY --pm_password ZZZ COMPUTEHOST 24 98304 2048 MAC - - can be a great help - and can be run from outside the environment. - -- Setup admin users with SSH keypairs etc. e.g.:: - - nova keypair-add --pub-key .ssh/authorized_keys default - -- Boot them using the ubuntu.qcow2 image, with appropriate user data to - connect to your Chef/Puppet/Salt environments. - -Baremetal with Heat -^^^^^^^^^^^^^^^^^^^ - -In this scenario you use the baremetal driver to deploy specialised -machine images which are orchestrated by Heat. - -Prerequisites. -~~~~~~~~~~~~~~ - -- A boot-stack image setup to run in KVM. - -- A vanilla image with cfn-tools installed. - -- A seed machine installed with your OS of choice in your datacentre. - -HOWTO -~~~~~ - -- Build the images you need (add any local elements you need to the - commands):: - - disk-image-create -o bootstrap vm boot-stack ubuntu heat-api - disk-image-create -o ubuntu ubuntu cfn-tools - -- Setup a VM using bootstrap.qcow2 on your existing machine, with eth1 - bridged into your datacentre LAN. - -- Run up that VM, which will create a self contained nova baremetal - install. - -- Enroll your vanilla image into the glance of that install. - -- Enroll your other datacentre machines into that nova baremetal - install. - -- Setup admin users with SSH keypairs etc. - -- Create a Heat stack with your application topology. Be sure to use - the image id of your cfn-tools customised image. - -GRE Neutron OpenStack managed by Heat -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -In this scenario we build on Baremetal with Heat to deploy a full -OpenStack orchestrated by Heat, with specialised disk images for -different OpenStack node roles. - -Prerequisites. -~~~~~~~~~~~~~~ - -- A boot-stack image setup to run in KVM. - -- A vanilla image with cfn-tools installed. - -- A seed machine installed with your OS of choice in your datacentre. - -- At least 4 machines in your datacentre, one of which manually installed with - a recent Linux (libvirt 1.0+ or newer required). - -- L2 network with private address range - -- L3 accessible management network (via the L2 default router) - -- VLAN with public IP ranges on it - -Needed data -~~~~~~~~~~~ - -- a JSON file describing your baremetal machines in a format described - in :ref:`devtest-environment-configuration` (see: nodes), making sure to - include all MAC addresses for all network interface cards as well as the - IPMI (address, user, password) details for them. - -- 2 spare contiguous ip addresses on your L2 network for seed deployment. - -- 1 spare ip address for your seed VM, and one spare for talking to it on it's - bridge (seedip, seediplink) - -- 3 spare ip addresses for your undercloud tenant network + neutron services. - -- Public IP address to be your undercloud endpoint - -- Public IP address to be your overcloud endpoint - -Install Seed -~~~~~~~~~~~~ - -Follow the 'devtest' guide but edit the seed config.json to: - -- change the dnsmasq range to the seed deployment range - -- change the heat endpoint details to refer to your seed ip address - -- change the ctlplane ip and cidr to match your seed ip address - -- change the power manager line nova.virt.baremetal.ipmi.IPMI and - remove the virtual subsection. - -- setup proxy arp (this and the related bits are used to avoid messing about - with the public NIC and bridging: you may choose to use that approach - instead...):: - - sudo sysctl net/ipv4/conf/all/proxy_arp=1 - arp -s -i -D pub - ip addr add /32 dev brbm - ip route add /32 dev brbm src - -- setup ec2 metadata support:: - - iptables -t nat -A PREROUTING -d 169.254.169.254/32 -i -p tcp -m tcp --dport 80 -j DNAT --to-destination :8775 - -- setup DHCP relay:: - - sudo apt-get install dhcp-helper - - and configure it with ``-s `` - Note that isc-dhcp-relay fails to forward responses correctly, so dhcp-helper is preferred - ( https://bugs.launchpad.net/ubuntu/+bug/1233953 ). - - Also note that dnsmasq may have to be stopped as they both listen to ``*:dhcps`` - ( https://bugs.launchpad.net/ubuntu/+bug/1233954 ). - - Disable the ``filter-bootps`` cronjob (``./etc/cron.d/filter-bootp``) inside the seed vm and reset the table:: - - sudo iptables -F FILTERBOOTPS - - edit /etc/init/novabm-dnsmasq.conf:: - - exec dnsmasq --conf-file= \ - --keep-in-foreground \ - --port=0 \ - --dhcp-boot=pxelinux.0,, \ - --bind-interfaces \ - --pid-file=/var/run/dnsmasq.pid \ - --interface=br-ctlplane \ - --dhcp-range=,, - -- When you setup the seed, use instead of 192.0.2.1, and you may need to edit seedrc. - -- For setup-neutron: - setup-neutron ctlplane - -- Validate networking: - - - From outside the seed host you should be able to ping - - From the seed VM you should be able to ping - - From outside the seed host you should be able to get a response from the dnsmasq running on - -- Create your deployment ramdisk with baremetal in mind:: - - $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST -a \ - $NODE_ARCH -o $TRIPLEO_ROOT/undercloud boot-stack nova-baremetal \ - os-collect-config stackuser $DHCP_DRIVER -p linux-image-generic mellanox \ - serial-console --offline - -- If your hardware has something other than eth0 plugged into the network, - fix your file injection template - - ``/opt/stack/nova/nova/virt/baremetal/net-static.ubuntu.template`` inside the - seed vm, replacing the enumerated interface values with the right interface - to use (e.g. auto eth2... iface eth2 inet static..) - -Deploy Undercloud -~~~~~~~~~~~~~~~~~ - -Use ``heat stack-create`` per the devtest documentation to boot your undercloud. -But use the ``undercloud-bm.yaml`` file rather ``than undercloud-vm.yaml``. - -Once it's booted: - -- ``modprobe 8021q`` - -- edit ``/etc/network/interfaces`` and define your vlan - -- delete the default route on your internal network - -- add a targeted route to your management l3 range via the internal network router - -- add a targeted route to ``169.254.169.254`` via - -- ``ifup`` the vlan interface - -- fix your resolv.conf - -- configure the undercloud per devtest. - -- upgrade your quotas:: - - nova quota-update --cores node_size*machine_count --instances machine_count --ram node_size*machine_count admin-tenant-id - - -Deploy Overcloud -~~~~~~~~~~~~~~~~ - -Follow devtest again, but modify the images you build per the undercloud notes, and for machines you put public services on, follow the undercloud notes to fix them up. - -Example deployments (future) ----------------------------- - -WARNING: Here be draft notes. - -VM seed + bare metal under cloud -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -- need to be aware nova metadata wont be available after booting as the - default rule assumes this host never initiates requests - ( https://bugs.launchpad.net/tripleo/+bug/1178487 ). diff --git a/doc/source/index.rst b/doc/source/index.rst deleted file mode 100644 index 52b450ee..00000000 --- a/doc/source/index.rst +++ /dev/null @@ -1,53 +0,0 @@ -TripleO Incubator -================= - -Getting Started ---------------- -.. toctree:: - :maxdepth: 1 - - README - userguide - devtest - HACKING - -Detailed notes ---------------- - -.. tip:: - - The following docs each contain detailed notes about one of the scripts corresponding to one of the high-level stages of a TripleO deployment. You should be familiar with the content in the `Getting Started`_ section above before diving into these docs. - -.. toctree:: - :maxdepth: 1 - - devtest_variables - devtest_setup - devtest_testenv - devtest_update_network - devtest_ramdisk - devtest_seed - devtest_undercloud - devtest_overcloud - devtest_overcloud_images - devtest_end - -Further Information -------------------- -.. toctree:: - :maxdepth: 1 - - deploying - puppet - resources - troubleshooting - CONTRIBUTING - selinux-guide - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/doc/source/overview.svg b/doc/source/overview.svg deleted file mode 100644 index 140ca2dc..00000000 --- a/doc/source/overview.svg +++ /dev/null @@ -1 +0,0 @@ -
Base image
[Not supported by viewer]
os-collect-config
(o-c-c)
[Not supported by viewer]
TE_DATAFILE
(testenv.json)
[Not supported by viewer]
source
templates
[Not supported by viewer]
merged
templates
[Not supported by viewer]
Deployment flavor images
(compute, control)
[Not supported by viewer]
Bootstack-create or stack-updateMake
os-apply-config templates
[Not supported by viewer]
TripleO-image-elements
(t-i-e)
[Not supported by viewer]
pre-install.d
install.d
post-install.d
[Not supported by viewer]
HEAT_ENV
(under/
overcloud-env.json)
[Not supported by viewer]
Image buildingos-apply-configutilitydiskimage-builder(d-i-b)os-refresh-config(o-r-c)
metadata
(cfn.json)
[Not supported by viewer]
os-apply-config element (o-a-c)
[Not supported by viewer]
os-refresh-config
scripts, L51-99
[Not supported by viewer]
os-refresh-config
scripts, L0-49
[Not supported by viewer]
os-apply-configutility
os-apply-config templates
[Not supported by viewer]
RunninginstancesFS
Heat
[Not supported by viewer]
diff --git a/doc/source/puppet.rst b/doc/source/puppet.rst deleted file mode 100644 index 70567c14..00000000 --- a/doc/source/puppet.rst +++ /dev/null @@ -1,133 +0,0 @@ -TripleO Overcloud deployment with Puppet -======================================== - -Intro ------ - -This document outlines how to deploy a TripleO overcloud using Puppet -for configuration. TripleO currently supports using Puppet for configuration -using Heat metadata directly via the normal os-collect-config/os-refresh-config -agents. No puppet-master or puppet DB infrastructure is required. - -Building Images ---------------- -When building TripleO images for use with Puppet the following elements -should be installed: - -- ``hosts`` -- ``os-net-config`` -- ``os-collect-config`` -- ``heat-config-puppet`` -- ``puppet-modules`` -- ``hiera`` - -The ``hosts`` and ``os-net-config`` are normal TripleO image elements and are still -used to deploy basic physical networking configuration required to bootstrap -the node. - -The ``os-collect-config``, and ``heat-config-puppet`` elements provide mechanism -to run ``puppet apply`` commands that have been configured via Heat software -deployment configurations. - -The ``puppet-modules`` element installs all of the required ``stackforge -puppet-*`` modules. This element has two modes of operation: package or source -installs. The package mode assumes that all of the required modules exist in -a single distribution provided package. The source mode deploys the puppet -modules from Git at image build time and automatically links them into -``/etc/puppet/modules``. The source mode makes use of source repositories so -you can, for example, pin to a specific ``puppetlabs-mysql`` module version by setting:: - - DIB_REPOREF_puppetlabs_mysql= - -The ``hiera`` element provides a way to configure the hiera.yaml and hieradata -files on each node directly via Heat metadata. The ``tripleo-heat-templates`` -are used to drive this configuration. - -When building images for use with Puppet it is important to note that -regardless of whether you use source or package mode to install these core -elements the actual OpenStack service packages (Nova, Neutron, Keystone, etc) -will need to be installed via normal distro packages. This is required in -order to work with the stackforge puppet modules. - -The OpenStack service packages can be installed at DIB time via the -p -option or at deployment time when Puppet is executed on each node. - -Heat Templates --------------- - -When deploying an overcloud with Heat only the newer -``overcloud-without-mergepy.yaml`` supports Puppet. To enable Puppet simply use -the ``overcloud-resource-registry-puppet.yaml`` instead of the normal -``overcloud-resource-registry.yaml`` with your Heat ``stack-create`` command. - -Running Devtest Overcloud with Delorean on Fedora -------------------------------------------------- - -This section describes the variables required in order to run -``devtest_overcloud.sh`` with Puppet. It assumes you have a fully working -TripleO undercloud (or seed) which has been preconfigured to work -in your environment. - -.. note:: - - The following instructions assume this pre-existing config from a normal devtest Fedora setup:: - - export NODE_DIST='fedora selinux-permissive' - export DIB_RELEASE=21 - export RDO_RELEASE=kilo - - # Enable packages for all elements by default - export DIB_DEFAULT_INSTALLTYPE=package - - # Do not manage /etc/hosts via cloud-init - export DIB_CLOUD_INIT_ETC_HOSTS='' - - # Set ROOT_DISK == NODE_DISK (no ephemeral partition) - export ROOT_DISK=40 - export NODE_DISK=40 - - By default TripleO uses puppet for configuration only. Packages (RPMs, etc) - are typically installed at image build time. - - If you wish to have packages installed at deploy time via Puppet it - is important to have a working undercloud nameserver. You can configure - this by adding the appropriate undercloud.nameserver setting - settings to your undercoud-env.json file. Alternately, If going directly - from the seed to the overcloud then you'll need to set seed.nameserver - in your testenv.json. If you wish to install packages at deploy - time you will also need to set EnablePackageInstall to true in your - overcloud-resource-registry-puppet.yaml (see below for instructions - on how to override your Heat resource registry). - -1) Git clone the tripleo-puppet-elements [1]_ project into your $TRIPLEO_ROOT. This is currently a non-standard image elements repository and needs to be manually cloned in order to build Puppet images. - -2) Add tripleo-puppet-elements to your ELEMENTS_PATH:: - - export ELEMENTS_PATH=$ELEMENTS_PATH:$TRIPLEO_ROOT/tripleo-puppet-elements/elements:$TRIPLEO_ROOT/heat-templates/hot/software-config/elements - -3) Set a variable so that a custom puppet image gets built and loaded into Glance:: - - export OVERCLOUD_DISK_IMAGES_CONFIG=$TRIPLEO_ROOT/tripleo-incubator/scripts/overcloud_puppet_disk_images.yaml - -4) Override the tripleo-heat-templates resource registry:: - - export RESOURCE_REGISTRY_PATH="$TRIPLEO_ROOT/tripleo-heat-templates/overcloud-resource-registry-puppet.yaml" - -5) Configure your Delorean repo URL. This is used to fetch more recently built upstream packages for your OpenStack services:: - - export DELOREAN_REPO_URL="http://trunk.rdoproject.org/f21/current/" - - For more information on Delorean see [2]_ - -6) Enable the use of stackforge modules from Git. This is to work around the fact that the Fedora RPM doesn't have support for all the required modules yet:: - - export DIB_INSTALLTYPE_puppet_modules=source - -7) Source your undercloud environment RC file (perhaps via the select-cloud script). Then execute devtest_overcloud.sh:: - - devtest_overcloud.sh - -References ----------- -.. [1] http://git.openstack.org/openstack/tripleo-puppet-elements/ -.. [2] https://github.com/openstack-packages/delorean diff --git a/doc/source/resources.rst b/doc/source/resources.rst deleted file mode 100644 index 7f334122..00000000 --- a/doc/source/resources.rst +++ /dev/null @@ -1,29 +0,0 @@ -Tripleo team resources -====================== - -- Launchpad team (lets you get our ssh keys etc easily): - - :: - - https://launchpad.net/~tripleo - -- Demo and staging PPAs (for custom binaries): - - :: - - apt-add-repository ppa:tripleo/demo - apt-add-repository ppa:tripleo/demo-staging - -- Git repositories: - - :: - - https://git.openstack.org/cgit/?q=tripleo - https://git.openstack.org/cgit/?q=tuskar - https://git.openstack.org/cgit/openstack/diskimage-builder - -- IRC: duh. - - :: - - irc://irc.freenode.net/#tripleo diff --git a/doc/source/selinux-guide.rst b/doc/source/selinux-guide.rst deleted file mode 100644 index 62accc8f..00000000 --- a/doc/source/selinux-guide.rst +++ /dev/null @@ -1,283 +0,0 @@ -SELinux Developer Guide -======================= - - -Do I have a SELinux problem? ----------------------------- - -At the moment SELinux is set to run in permissive mode in TripleO. This means -that problems are logged but not blocked. To see if you have a SELinux problem -that needs to be fixed, examine /var/log/audit/audit.log in your local -development environment or from the TripleO-CI log archive. You may need to -examine the log files for multiple nodes (undercloud and/or overcloud). - -Any line that has "denied" is a problem. This guide will talk about common -problems and how to fix them. - - -Workflow --------- - -All changes are assumed to have been tested locally before a patch is submitted -upstream for review. Testing should include inspecting the local audit.log to -see that no new SELinux errors were logged. - -If an error was logged, it should be fixed using the guidelines described below. - -If no errors were logged, then the change is submitted for review. In addition -to getting the change to pass CI, the audit.log archived from the CI runs should -be inspected to see no new SELinux errors were logged. Problems should be fixed -until the audit.log is clear of new errors. - -The archived audit.log file can be found in the logs directory for each -individual instance that is brought up. For example the seed instance log files -can be seen here: - -http://logs.openstack.org/03/115303/1/check-tripleo/check-tripleo-novabm-overcloud-f20-nonha/e5bef5c/logs/seed_logs/ - -audit.log is audit.txt.gz. - -ps -efZ output can be found in host_info.txt.gz. - - -Updating SELinux file security contexts ---------------------------------------- - -The targeted policy expects directories and files to be placed in certain -locations. For example, nova normally has files under /var/log/nova and -/var/lib/nova. Its executables are placed under /usr/bin. - -:: - - [user@server files]$ pwd - /etc/selinux/targeted/contexts/files - [user@server files]$ grep nova * - file_contexts:/var/lib/nova(/.*)? system_u:object_r:nova_var_lib_t:s0 - file_contexts:/var/log/nova(/.*)? system_u:object_r:nova_log_t:s0 - file_contexts:/var/run/nova(/.*)? system_u:object_r:nova_var_run_t:s0 - file_contexts:/usr/bin/nova-api -- system_u:object_r:nova_api_exec_t:s0 - file_contexts:/usr/bin/nova-cert -- system_u:object_r:nova_cert_exec_t:s0 - -TripleO diverges from what the target policy expects and places files and -executables in different locations. When a file or directory is not properly -labeled the service may fail to startup. A SELinux AVC denial is logged to -/var/log/audit.log when SELinux detects that a service doesn't have permission -to access a file or directory. - -When the ephemeral element is active, upstream TripleO places /var/log and -/var/lib under the ephemeral mount point, /mnt/state. The directories and files -on these locations may not have the correct file security contexts if they were -installed outside of yum. - -The directories and files in the ephemeral disk must be updated to have the -correct security context. Here is an example for nova: - -https://github.com/openstack/tripleo-image-elements/blob/master/elements/nova/os-refresh-config/configure.d/20-nova-selinux#L6 - -:: - - semanage fcontext -a -t nova_var_lib_t "/mnt/state/var/lib/nova(/.*)?" - restorecon -Rv /mnt/state/var/lib/nova - semanage fcontext -a -t nova_log_t "/mnt/state/var/log/nova(/.*)?" - restorecon -Rv /mnt/state/var/log/nova - -For nova we use semanage to relabel /mnt/state/var/lib/nova with the type -nova_var_lib_t and /mnt/state/var/log/nova with the type nova_var_log_t. Then -we call restorecon to apply the labels. - -To see a file's security context run "ls -lZ ". - -:: - - [user@server]# ls -lZ /mnt/state/var/lib - drwxr-xr-x. root root system_u:object_r:file_t:s0 boot-stack - drwxrwx---. ceilometer ceilometer system_u:object_r:file_t:s0 ceilometer - drwxr-xr-x. root root system_u:object_r:file_t:s0 cinder - drwxrwx---. glance glance system_u:object_r:glance_var_lib_t:s0 glance - drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql - drwxrwx---. neutron neutron system_u:object_r:neutron_var_lib_t:s0 neutron - drwxrwxr-x. nova nova system_u:object_r:nova_var_lib_t:s0 nova - drwxrwx---. rabbitmq rabbitmq system_u:object_r:rabbitmq_var_lib_t:s0 rabbitmq - -TripleO installs many components under /opt/stack/venvs/. Executables under -/opt/stack/venvs//bin need to be relabeled. For these we do a path -substitution to tell SELinux policy that /usr/bin and -/opt/stack/venvs//bin are equivalent. When the image is relabeled -during image build or during first boot, SELinux will relabel the files under -/opt/stack/stack/venvs//bin as if they were installed under /usr/bin. - -An example of a path substitution for nova: - -https://github.com/openstack/tripleo-image-elements/blob/master/elements/nova/install.d/nova-source-install/74-nova - -:: - - add-selinux-path-substitution /usr/bin $NOVA_VENV_DIR/bin - - -Allowing port access --------------------- - -Services are granted access to a prespecified set of ports by the -selinux-policy. A list of ports for a service can be seen using - -:: - - semanage port -l | grep http - -You can grant a service access to additional ports by using semanage. - -:: - - semanage port -a -t http_port_t -p tcp 9876 - -If the port you are adding is a standard or default port, then it would be -appropriate to also file a bug against upstream SELinux to ask for the policy -to include it by default. - - -Using SELinux booleans ----------------------- - -Sometimes a problem can be fixed by toggling a SELinux boolean to allow certain -actions. - -Currently we enable two booleans in TripleO. - -https://github.com/openstack/tripleo-image-elements/blob/master/elements/keepalived/os-refresh-config/configure.d/20-keepalived-selinux - -:: - - setsebool -P domain_kernel_load_modules 1 - -https://github.com/openstack/tripleo-image-elements/blob/master/elements/haproxy/os-refresh-config/configure.d/20-haproxy-selinux - -:: - - setsebool -P haproxy_connect_any 1 - -domain_kernel_load_modules is used with the keepalived element to allow -keepalive to load kernel modules. - -haproxy_connect_any is used with the haproxy element to allow it to proxy any -port. - -When a boolean is enabled, it should be enabled within the element that requires -it. - -"semanage boolean -l" lists the booleans that are available in the current -policy. - -When would you know to use a boolean? Generating a custom policy for the denials -you are seeing will tell you whether a boolean can be used to fix the denials. - -For example, when I generated a custom policy for the haproxy denials I was -seeing in audit.log, the custom policy stated that haproxy_connect_any could be -used to fix the denials. - -:: - - #!!!! This avc can be allowed using the boolean 'haproxy_connect_any' - allow haproxy_t glance_registry_port_t:tcp_socket name_bind; - - #!!!! This avc can be allowed using the boolean 'haproxy_connect_any' - allow haproxy_t neutron_port_t:tcp_socket name_bind; - -How to generate a custom policy is discussed in the next section. - - -Generating a custom policy --------------------------- - -If relabeling or toggling a boolean doesn't solve your problem, the next step is -to generate a custom policy used as an hotfix to allow the actions that SELinux -denied. - -To generate a custom policy, use this command - -:: - - ausearch -m AVC | audit2allow -M - -.. note:: Not all AVCs should be allowed from an ausearch. In fact, most of - them are likely leaked file descriptors, mislabeled files, and bugs in code. - -The custom policies are stored under -tripleo-image-elements/elements/selinux/custom-policies. We use a single policy -file for each component (one for nova, keystone, etc..). It is organized as per -component to mirror how the policies are organized upstream. When you generate -your custom policy, instead of dropping in a new file, you may need to edit an -existing policy file to include the new changes. - -Each custom policy file must contain comments referencing the upstream bugs -(Launchpad and upstream SELinux) that the policy is intended to fix. The -comments help with housekeeping. When a bug is fixed upstream, a developer can -then quickly search for the bug number and delete the appropriate lines from the -custom policy file that are no longer needed. - -Example: https://review.openstack.org/#/c/107233/3/elements/selinux/custom-policies/tripleo-selinux-ssh.te - - -Filing bugs for SELinux policy updates --------------------------------------- - -The custom policy is meant to be used as a temporary solution until the -underlying problem is addressed. Most of the time, the upstream SELinux policy -needs to be updated to incorporate the rules suggested by the custom policy. To -ensure that that upstream policy is updated, we need to file a bug against the -selinux-policy package. - -For Fedora, use this link to create a bug - -https://bugzilla.redhat.com/enter_bug.cgi?component=selinux-policy&product=Fedora - -For RHEL 7, use this link to create a bug, and file against the -openstack-selinux component, not the selinux-policy component because it is -released less frequently. - -https://bugzilla.redhat.com/enter_bug.cgi?product=Red%20Hat%20OpenStack - -Under "Version-Release number" include the package and version of the affected -component. - -:: - - Example: - selinux-policy-3.12.1-179.fc20.noarch - selinux-policy-targeted-3.12.1-179.fc20.noarch - openssh-6.4p1-5.fc20.i686 - openssh-clients-6.4p1-5.fc20.i686 - openssh-server-6.4p1-5.fc20.i686 - -Include the ps -efZ output from the affected system. And most importantly -attach the /var/log/audit/audit.log to the bug. - -Also file a bug in Launchpad, referencing the bugzilla. When you commit the -custom policy into github, the commit message should reference the Launchpad -bug ID. The Launchpad bug should also be tagged with "selinux" to make SELinux -bugs easier to find. - -Setting SELinux to enforcing mode ---------------------------------- - -By default in TripleO, SELinux runs in permissive mode. This is set in the -NODE_DIST environment variable in the devtest scripts. - -:: - - export NODE_DIST="fedora selinux-permissive" - -To set SELinux to run in enforcing mode, remove the selinux-permissive element -by adding this line to your ~/.devtestrc file. - -:: - - export NODE_DIST="fedora" - - -Additional Resources --------------------- - -1. http://openstack.redhat.com/SELinux_issues -2. http://docs.fedoraproject.org/en-US/Fedora/19/html/Security_Guide/ch09.html - diff --git a/doc/source/troubleshooting.rst b/doc/source/troubleshooting.rst deleted file mode 100644 index 063f227b..00000000 --- a/doc/source/troubleshooting.rst +++ /dev/null @@ -1,101 +0,0 @@ -Troubleshooting tips -==================== - -VM won't boot -------------- - -Make sure the partition table is correct. See -https://bugs.launchpad.net/nova/+bug/1088652. - -Baremetal ---------- - -If you get a no hosts found error in the schedule/nova logs, check: - -:: - - mysql nova -e 'select * from compute_nodes;' - -After adding a bare metal node, the bare metal backend writes an entry -to the compute nodes table, but it takes about 5 seconds to go from A to -B. - -Be sure that the hostname in nova\_bm.bm\_nodes (service\_host) is the -same than the one used by nova. If no value has been specified using the -flag "host=" in nova.conf, the default one is: - -:: - - python -c "import socket; print socket.getfqdn()" - -You can override this value when populating the bm database using the -h -flag: - -:: - - scripts/populate-nova-bm-db.sh -i "xx:xx:xx:xx:xx:xx" -j "yy:yy:yy:yy:yy:yy" -h "nova_hostname" add - - -DHCP Server Work Arounds ------------------------- - -If you don't control the DHCP server on your flat network you will need -to at least have someone put the MAC address of the server your trying -to provision in there DHCP server. - -:: - - host bm-compute001 { - hardware ethernet 78:e7:d1:XX:XX:XX ; - next-server 10.0.1.2 ; - filename "pxelinux.0"; - } - -Write down the MAC address for the IPMI management interface and the NIC -your booting from. You will also need to know the IP address of both. -Most DHCP server won't expire the IP leased to quickly so if your lucky -you will get the same IP each time you reboot. With that information -bare-metal can generate the correct pxelinux.cfg/. (???? Commands to -tell nova?) - -In the provisional environment I have there was another problem. The -DHCP Server was already modified to point to a next-server. A quick work -around was to redirect the connections using iptables. - -:: - - modprobe nf_nat_tftp - - baremetal_installer="/" - iptables -t nat -A PREROUTING -i eth2 -p udp --dport 69 -j DNAT --to ${baremetal_installer}:69 - iptables -t nat -A PREROUTING -i eth2 -p tcp --dport 10000 -j DNAT --to ${baremetal_installer}:10000 - iptables -A FORWARD -p udp -i eth2 -o eth2 -d ${baremetal_installer} --dport 69 -j ACCEPT - iptables -A FORWARD -p tcp -i eth2 -o eth2 -d ${baremetal_installer} --dport 10000 -j ACCEPT - iptables -t nat -A POSTROUTING -j MASQUERADE - -Notice the additional rules for port 10000. It is for the bare-metal -interface (???) You should have matching reverse DNS too. We experienced -problems connecting to port 10000 (????). That may be very unique to my -environment btw. - -Image Build Race Condition --------------------------- - -Multiple times we experienced a failure to build a good bootable image. -This is because of a race condition hidden in the code currently. Just -remove the failed image and try to build it again. - -Once you have a working image check the Nova DB to make sure the it is -not flagged as removed (???) - -Virtual Machines ----------------- - -VM's booting terribly slowly in KVM? ------------------------------------- - -Check the console, if the slowdown happens right after probing for -consoles - wait 2m or so and you should see a serial console as the next -line output after the vga console. If so you're likely running into -https://bugzilla.redhat.com/show\_bug.cgi?id=750773. Remove the serial -device from your machine definition in libvirt, and it should fix it. diff --git a/doc/source/userguide.rst b/doc/source/userguide.rst deleted file mode 100644 index 48c612cd..00000000 --- a/doc/source/userguide.rst +++ /dev/null @@ -1,39 +0,0 @@ -Using TripleO -============= - -Learning --------- - -Learning how TripleO all works is essential. Working through :doc:`devtest` is -highly recommended. - -Overview --------- - -.. image:: overview.svg - -Setup ------ - -The script `install-dependencies` from incubator will install the basic tools -needed to build and deploy images via TripleO. What it won't do is larger scale -tasks like configuring a Ubuntu/Fedora/etc mirror, a pypi mirror, squid or -similar HTTP caches etc. If you are deploying rarely, these things are -optional. - -However, if you are building lots of images, having a local mirror of the -things you are installing can be extremely advantageous. - -Operating ---------- - -The general design of TripleO is intended to produce small unix-like tools -that can be used to drive arbitrary cloud deployments. It is expected that -you will either wrap them in higher order tools (such as CM tools, custom UI's -or even just targeted scripts). TripleO is building a dedicated API to unify -all these small tools for common case deployments, called Tuskar, but that is -not yet ready for prime time. We'll start using it ourselves as it becomes -ready. - -Take the time to learn the plumbing - nova, nova-bm or ironic, glance, keystone -etc. diff --git a/images/baremetal-bootstrap.dia b/images/baremetal-bootstrap.dia deleted file mode 100644 index 5a82835a3288430f41dc0ce015a7231925202e46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3477 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 D*JZnn diff --git a/images/baremetal-build-and-test-cycle.dia b/images/baremetal-build-and-test-cycle.dia deleted file mode 100644 index fdb0ef2dd36b1aed55474f0a8a7732c1cd621481..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4865 zcmV+c6aMTUiwFP!000021MOW|Z{x_de)q2+Jix^bK$mM@qI3tD34+eW^xOcMJR7t` z+e}lWK+)~-Jmk0M6e%x~NQoj@a?4!;dXZeN!z!`9@9g~3pMRUD!PmH0CVBSZoFIH2 z#Mv~TCE4wV^MC#Nw+ns#=Z|N9nkCU6;m>Um%>($2Y-!(pIKL~)#UC#(A08f1`nZhB zyg+GkkCyS}f1)&vE@9B+`Ny*$cs;=^DkJ;Z>eHw!i{$#gjDswi#~;qGqv@C1BEQdO z=k=)7xM`l|MesFBKb-$?Q@zeFSJPas&9h_fMRXfq7jg8ZeQFFZWBN?Jh>Oi>=Zk!q zz>xBBu{ES+9{cyJF{@Ea7?j<9{Nd-gEaT#b`m$CZzRcHjv8{s2c~smc*|sd$pS0c# ziUc$EC5aXcQ^lV4<#2J=#}$_zS6p#iamn&(kr!nVCFQor>pV~6D66I3MCmf_FK9W9 zQn<% zc71bP*Nv$^+FfKD#cKK=U${D0eZfF1#eIApMAI_)`tCnZjptX>yvVkdk5Trin!m!P?Y(-& zB{g8~yEwVMD|bxJ?cQ^t1(gyrjC(Ewm@eM85R52Ze~|&gEU4TU+h6^D|Giq4k7>LqAkOaRt1o5?3maMS5V4DBHd|MIwr&P8 z&dpH9zm@v{U}H?%7gE^-YvVRdh!*2v2jRBeUU^nF39_FDH_<#vAK`kUY#9gcl;|S} z6#d(59yfodFXxPOl+vhZ9Ee|Ovbeg-i{y8>qoQ;txNMjS2a5s4!`_e1ge>o`tt}Ow z_Xer@!&-fMrB7MlU95>-`=m+h`YBmXbI`dy{Ui9CWJ!b8MfL;Dw&vA%6hc1mw%pRf z+B7kSjL}Mj%-H|vi9y7kzK{zM-bu$7!Cg0<0x zFlNXIa=U=H{pvt0p-M}P;s0`&;6@GaP-5>bcuN&?hULwgUnlLakGOU%u!|?fUwYvF>0v9j2o(kOWxMIy5F|_BsK+j zIxV?7q@+$UM`At&IDTvlx$*NyW;-OGB2XrIEacOdThWw zF*qNE$ndo)Ietb8Q6VA7XiX*;1e7ZxSx7Mgm5!Zoddh%p>yn@X%C81pAIuo0K?!EU zVZMq&#(;iJ3>AihIVFY5d==vJRlbva6(28ut9ZE_%c*lgbx8D)oH-y2SfNf{tU~4& zlp@VJ4=H=6G4nC@*E@2&BgZ>(yd&o%!w+garZR|0K|^AW88@%RN>PgyKv^77Y-9-k zzR$?{xEt-s%afNUFHc@4NnUz1@?sbP$WZGSJ7V;_7E44e7Pw0wAvkcCc&G96arfDC zm*+0eU7ow%M+DuB5kbFT1Te<{qo`xV&|k#KI*NWl8B$<&S@}MW?&IhO#nIbuULQ$6 zsYrTvEd2XCx{Y6fA$}@2#G{}g!6E1FQIKF{^FJ6efPfrPO|-J58H9a7rV>akbZ zqDF7&vQlc$WU(;Dx}P{3D6s*Hws6R3MmT_x(pV}?RDY4PA_5&RFJ?`fIcA5XFLAuM zik1twMfM2VR3i`Vm6Y!23wC*z&*RHk{587#YyOa>c{E#IPNx^wj~B}bEwbCgT81^M zJw0?BLPk2)ND6zvq&Ujqu7zO%r<)s-m%w3EG(Gg`V}7nOz%P8DQ0)Gjjx8Ac>j$W&&W35j(_O6D|;um6&|WbsL- zS$iBdhY*FSqME9{&Aw`-`Rg@uhRTBZ&iN| zNgHd7RQwz*%6!qJ_psqbNKsQp&`*3_x; z&j=DmF)Pb(EI{{{NE>Xz3yib`mA2=-bshhHRW0Z6MK)!=GOK6P@PYw6(U+%kv;-4j z+@2A(od>aNG@5JG6HjXry0W*%@{ohu__J?TfseD<73eqlL;Dihz?rYoIJ@1w7%^1D z-tForVVY+doFO>w%Pr1%`blsHFtKuSmwD|52wr}?>5gpqW%l&TeEpZnb`$@NOX>n; z|N8thpx9q*bN-}!Y{D=(Tz6HDE1a3K@mE{qY$G&qnq^2hK!iSN%~d%ra0YGi^@}=G zUFnXDlJ8HOJZ5+I>-!{~1&NJGd}oc`_hm7S-{<{;aj=&Gh#2S-3Nqn^r|#x>T5TbHU3#Dh5lVh48#| z9A28mi!^@>K+nCliMRH4PS5@)nlC0n886}R-^HG_j>B41A~5|`RZr?^>u9v42h$ei zj_oSSU)fbeBirTd^bM;4+t$snl3ctttb{kL-XVc4qpxvL#LN4%^c3ZsqCizv%3D^W zQdH+Ch8e-Y0`9=NiYH6$))&Z;z*L7eexVqhSlL8z+bs|gN~OyX1V_ve z8k&8hDxU-O!3!U}a2mYWh(GXyf)~<7@S-b%(cw=GemZ8nB0t9f1~_G@&Tzse);!Y! zlMwW8PWrlAI^tK$BAbS?8l3ENj`xnmh-gVS8tt{)q1r>4hcc&7wt+_SAShFB3T0%t z+hE{1>*zZGC8&}DIK~749K%S1{$+8@X);OE@|uPTM2!s;?-@oAXH;~;xo0b72uXMp z^C;F4#oB?W1B&TZ2s{Rg4X=fJK5TA1paf7ttI!|;#-y!@p$KzrDr=Gn?i9!xR@gKQ z*9f)SOeAdI09q%**#-74De>Ut!K)*9=>gy++-1W3l9!EuHN1e28pj2EwrImv@7c$E z7^JyPlhxKyd&;pI28gF^BD21`l`1^zN+6@dJu1;vl-Yfs-50!m}!AeQ9$5=V1W4f0YurJS*>_az&*< zk_E{!Pa~`3dtN;TuQK3Oj`+Jvzrf#Wh9DiGdX$H5>qaYAx9$F0cfQ1u!aH;78G-}0 zt((=Uwc_UG#e9a~d(03lqoNG1^Sp#lqD3%;h0T1fplhNsAhLoX?Q;c>o-0U)R||vr zQ6k;WdMVhJD+qcC`MhrYwwG-!<4n2L7*4y(7zjP3y#{6bbGdvb;xPv-)=s zrD*`hb-Y|g#beEG%kV78rs@3*Mpa!|viPC?$^S0@;Jw+dsY@V56(E!J&g|o{7aLqJ zibL+STYLS$L2RiDY(cC;E)eb8D(hQduKpX=iML>nsCoTz`g{&jMR&DQnqaQ__B-$# zb|{D4FXNRJmIrw;y^C$&wT!_wo8PBpa*^e;xav1nw;Ovg$vlra<}sU(3xGvEiye{0 z2A2xEHo>aSVk--b62xp*%#*jl9GhSUF|NdsoSNPodn+otjo~f>?h0zVESuG?#H0)! zlJYM2HJ&fvz2_~*yhS9EwwZvpzuq93hz+k2f6jR^&inS*6dXfrtlS9uq-co@DF2oW z07S9VT%y)hHjND#**QRmZ1)VRH^2D|BA-FjErVz?3+TA*DcJC8?Vwi=Yv6nufS z6q1BYA)~aM2qc+?_nbKI7uL4Orbs_hI^;VW9?~@zP^%5;TT^)Kaf>}>KzA^P-?BRx z8(fV$?2vUrECIMAEL>^B$b<-lwPqHsT($+*z31mPWt&Q7{qDA}#?GM@6+KXS zpmGURZm_27Lyg(s@*Gp)nExyqeDpCJmyFtsgMt%^1w)*FXOXnVjA!W=4?P0MQ>MXPqQJDV}u z#~d?F_KuRq5L45d^xCG^Hl1ploDb;O$l6N+k6{)MF74yCpP22%Y7?)R)1qW$^%WsQ zA`w@dO(-&O&UICjjGe|2S{K=XJ#cwD{e7T&b7tpKdtwQ`8rcJvTj0Vjpl4?(Asbvu zXx1JMG&;zDRumd!CKPT|+o8XIjN)4`i~Da@$J|lkyTbZ>o?-bspX}oT0cmcMS)5Jd zDx+s{f1M`FyO(F(9=)RC`>Y2vh}(yn`f|Vl2|d<(v{*Y`YoF|LEPwh(@HxqnCYQ3= zf7G_QvoV&;!wajW7I z67NLheZ;l-M%`%7UY@-?dwKRcP4*(A zu@|xQ0ia3|mh5=!WyNYyi{+NRB;s7~5U?GKcgbF(ZnS4F&t9IrJbS${d)1$9dllQ_ z{l8kjd;^`)O^1FLGTTB}j1;pCR=`XUay_A^bx|EztdYZ3@)*+GCal^9zgSrLdYJs? z=*8X`$01RUjX1}T_DMdUZF`O2mwXm4TjLo!Z^G^|jlp%weXgUCwhj(#^pU)+h8=YG z_7mC^=IBUTeZ;i|J30XS4p?grc^rD6zE&5veWV)GG1{Y%+cA|*`0JnS#0M8IGK3Xq zTcLeA0%I;qfhaOeaT_Axl<}$w2q(nq?!sv4vUag`joU*dXxh8Wg2J7(Ku`KQtj%_X z^65@K-RX$wPVA60O-|N-*^HPgwWCuJA6&KwXV7V0Iia>wk&W>JNb$PtnHo6Pr`&#h zz@~LfoRUfjr#;u{de3#^)0vKw&SYDd-y~U-rjNl>*S)i+u6tF}y#UP5Rg?3x{081V zKIb?+Kk4)A`msuWdW*+ne~-^BoYjS*z6^O>4X@> z2o+TqBaU5G=r=8|=^hT*?h31Y4UV2qff?}h6t9kZb-ZJdJ{eFpwOMl|-PbPg!G)e+ zFEgj@LyS$_AQPex4RPI}@`S4w`fr!7UhwMv(Hm>8x@OxJ+lwNf-B;k_s}|gA?-KFw ng4hyGU$tI+^U?i diff --git a/images/baremetal-build-images.dia b/images/baremetal-build-images.dia deleted file mode 100644 index 974137cee8b555596f9e36b9a9f6afb07b5f1467..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2806 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 diff --git a/images/baremetal-discovery.odp b/images/baremetal-discovery.odp deleted file mode 100644 index c5ba40147eb83bf322cbe0c59c73e67a287aa76a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20760 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 diff --git a/images/nova-baremetal-deploy-process.dia b/images/nova-baremetal-deploy-process.dia deleted file mode 100644 index f215fe73b5aad75e16ebfd3252b870dc952573b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4205 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 DYqcB) diff --git a/images/tripleo-concept.odp b/images/tripleo-concept.odp deleted file mode 100644 index 061723fc19682835548de4b5bccb53b39e2946fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19223 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 b1 - - - - TripleO Concept - - - - - - image/svg+xml - - TripleO Concept - - - Clint Byrum - - - - - HP Cloud Services - - - - 2013-03-06 - - - - - - - - - - - - - - - Software - - - - Configuration - - - - State - - - - Orchestration - - - - Provisioning - - - - - - - Packages - - - - - - Puppet/Chef - - - - - - Juju - - - - MaaS - - - - - - Nova - - - - - - diskimage-builder - - - - - - os-apply-config - - - - - - os-refresh-config - - - - - - Heat - - - diff --git a/images/tripleo-overview.dia b/images/tripleo-overview.dia deleted file mode 100644 index 98a46713dece90830e8b1fc6f97a83b6ce26da3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2138 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 diff --git a/overcloudrc b/overcloudrc deleted file mode 100644 index 040ad32b..00000000 --- a/overcloudrc +++ /dev/null @@ -1,8 +0,0 @@ -export NOVA_VERSION=1.1 -export OS_PASSWORD=$(os-apply-config -m $TE_DATAFILE --type raw --key overcloud.password) -export OS_AUTH_URL=$(os-apply-config -m $TE_DATAFILE --type raw --key overcloud.endpoint) -export OS_USERNAME=admin -export OS_TENANT_NAME=admin -export COMPUTE_API_VERSION=1.1 -export OS_NO_CACHE=True -export OS_CLOUDNAME=overcloud diff --git a/overcloudrc-user b/overcloudrc-user deleted file mode 100644 index 517a918f..00000000 --- a/overcloudrc-user +++ /dev/null @@ -1,8 +0,0 @@ -export NOVA_VERSION=1.1 -export OS_PASSWORD=$OVERCLOUD_DEMO_PASSWORD -export OS_AUTH_URL=$(os-apply-config -m $TE_DATAFILE --type raw --key overcloud.endpoint) -export OS_USERNAME=demo -export OS_TENANT_NAME=demo -export COMPUTE_API_VERSION=1.1 -export OS_NO_CACHE=True -export OS_CLOUDNAME=overcloud-user diff --git a/presentations/TripleO architecture overview.odp b/presentations/TripleO architecture overview.odp deleted file mode 100644 index edcc4c0084fe439aa7456643b8d3b51be1bd493f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66699 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 L1cKd<-&g+!Ix^0Z diff --git a/run-bashate.sh b/run-bashate.sh deleted file mode 100755 index 6bcca1ad..00000000 --- a/run-bashate.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - - -# We could ignore the E012 bashate rule until the bug will be fixed in it. -find scripts -type f -not -name '*.awk' -print0 | xargs -0 grep -HL '^#!/usr/bin/env python' | xargs bashate -v -i E012 - diff --git a/scripts/acquire-image b/scripts/acquire-image deleted file mode 100755 index 9690fb05..00000000 --- a/scripts/acquire-image +++ /dev/null @@ -1,103 +0,0 @@ -#!/bin/bash - -set -eu -set -o pipefail - -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -function show_options () { - echo "Usage: $SCRIPT_NAME --download BASE_URL [options] IMAGE_SET" - echo - echo "Acquire an image from cache/download it." - echo - echo "A BASE_URL needs to be supplied and the image will be downloaded only if" - echo "the local copy is different. With -c, locally built images are not refreshed" - echo "while we can do cache invalidation for downloaded images, we don't have cache" - echo "invalidation logic yet for building images - -c allows direct control." - echo - echo "What constitutes an image is determined by the images key of the" - echo "IMAGE_SET metadata file. This is a json file with the following structure:" - echo - echo " {\"images\": [" - echo " \"image1_control.qcow2\"," - echo " \"image2_compute.qcow2\"," - echo " \"image3_compute_ha.qcow2\"," - echo " ..." - echo " ]}" - echo - echo "Options:" - echo " -c -- re-use existing images rather than rebuilding." - echo " --download BASE_URL -- download images from BASE_URL/\$imagename." - echo " -h, --help -- this text." - echo - exit $1 -} - -DOWNLOAD_BASE= -USE_CACHE= - -TEMP=$(getopt -o ch -l download:,help -n $SCRIPT_NAME -- "$@") -if [ $? != 0 ] ; then show_options 1; fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - --download) DOWNLOAD_BASE=$2; shift 2;; - -c) USE_CACHE=1; shift 1;; - -h | --help) show_options 0;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -IMAGE_SET=${1:-''} -shift || true - -if [ -z "$IMAGE_SET" -o -z "$DOWNLOAD_BASE" ]; then - show_options 1 -fi - -IMAGE_BASENAME=$(basename "${IMAGE_SET}") -IMAGE_DIRNAME=$(dirname "${IMAGE_SET}") -METADATA_PATH=$DOWNLOAD_BASE/$IMAGE_BASENAME -CACHE_URL="$TRIPLEO_ROOT/diskimage-builder/elements/cache-url/bin/cache-url" - - -if [ image_exists -a -n "$USE_CACHE" ]; then - exit 0 -fi - -set +e -"${CACHE_URL}" ${METADATA_PATH} ${IMAGE_SET} -RES=$? -set -e -if [ 0 -ne "$RES" -a 44 -ne "$RES" ]; then - exit $RES -elif [ 44 -ne "$RES" ]; then - IMG_LIST=$(jq '.images' ${IMAGE_SET}) - for pos in $(seq 0 $(( $(jq length <<< $IMG_LIST) -1 )) ); do - COMPONENT_NAME=$(jq -r ".[$pos]" <<< $IMG_LIST) - "${CACHE_URL}" ${DOWNLOAD_BASE}/${COMPONENT_NAME} "${IMAGE_DIRNAME}"/${COMPONENT_NAME} - done - exit 0 -else - echo "Error to retrieve the IMAGE_SET meta file." - exit 1 -fi - -function image_exists() { - if [ ! -e "${IMAGE_SET}" ]; then - return 1 - fi - IMG_LIST=$(jq '.images' ${IMAGE_SET}) - for pos in $(seq 0 $(($(jq length <<< $IMG_LIST) -1))); do - COMPONENT_NAME=$(jq -r ".[$pos]" <<< $IMG_LIST) - if [ ! -e "${IMAGE_DIRNAME}"/${COMPONENT_NAME} ]; then - return 1 - fi - done - return 0 -} diff --git a/scripts/assert-admin-users b/scripts/assert-admin-users deleted file mode 100755 index c30a8eae..00000000 --- a/scripts/assert-admin-users +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash -# -# Copyright 2013 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -eu - -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -function show_options { - echo "Usage: $SCRIPT_NAME [options] LISTFILE" - echo - echo "Ensure that every user listed in LISTFILE has an admin account." - echo "Admin accounts are made by creating a user $USER-admin for every" - echo "user in LISTFILE." - echo - echo "Options:" - echo " -h -- this help" - echo - exit $1 -} - -TEMP=`getopt -o h -n $SCRIPT_NAME -- "$@"` -if [ $? != 0 ]; then - echo "Terminating..." >&2 - exit 1 -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -h) show_options 0;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -LISTFILE=${1:-''} -EXTRA_ARGS=${2:-''} - -if [ -z "$LISTFILE" -o -n "$EXTRA_ARGS" ]; then - show_options 1 -fi - -assert-users -t admin <(awk 'BEGIN { FS = "," }{ print $1 "-admin," $2 "," $3 }' < $LISTFILE) diff --git a/scripts/assert-user b/scripts/assert-user deleted file mode 100755 index 237ab24c..00000000 --- a/scripts/assert-user +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/bash -# -# Copyright 2013 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -eu - -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -function show_options { - echo "Usage: $SCRIPT_NAME [options]" - echo - echo "Ensure that a given user exists." - echo - echo "Options:" - echo " -h -- this help" - echo " -e -- email" - echo " -n -- name" - echo " -t -- tenant" - echo " -u -- usercode" - echo - exit $1 -} - -EMAIL='' -NAME='' -TENANT='' -USERCODE='' - -TEMP=`getopt -o hu:e:n:t: -n $SCRIPT_NAME -- "$@"` -if [ $? != 0 ]; then - echo "Terminating..." >&2; - exit 1; -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -h) show_options 0;; - -e) EMAIL=$2; shift 2 ;; - -n) NAME=$2; shift 2 ;; - -t) TENANT=$2; shift 2 ;; - -u) USERCODE=$2; shift 2 ;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -EXTRA_ARGS=${1:-''} - -if [ -z "$EMAIL" -o -z "$NAME" -o -z "$TENANT" -o -z "$USERCODE" -o -n "$EXTRA_ARGS" ]; then - show_options 1 -fi - -echo "Checking for user $USERCODE" -#TODO: fix after bug 1392035 in the keystone client library -USER_ID=$(openstack user list | awk '{print tolower($0)}' |grep " ${USERCODE,,} " |awk '{print$2}') -if [ -z "$USER_ID" ]; then - PASSWORD='' - if [ -e os-asserted-users ]; then - PASSWORD=$(awk "\$1==\"$USERCODE\" { print \$2 }" < os-asserted-users) - fi - if [ -z "$PASSWORD" ]; then - PASSWORD=$(os-make-password) - echo "$USERCODE $PASSWORD" >> os-asserted-users - fi - USER_ID=$(openstack user create --pass "$PASSWORD" - --email "$EMAIL" $USERCODE | awk '$2=="id" {print $4}') -fi -#TODO: fix after bug 1392035 in the keystone client library -TENANT_ID=$(openstack project list | awk '{print tolower($0)}' |grep " ${TENANT,,} " |awk '{print$2}') -if [ -z "$TENANT_ID" ]; then - TENANT_ID=$(openstack project create $TENANT | awk '$2=="id" {print $4}') -fi -if [ "$TENANT" = "admin" ]; then - ROLE="admin" -else - ROLE="_member_" -fi -ROLE_ID=$(openstack role show $ROLE | awk '$2=="id" {print $4}') -if openstack user role list --project $TENANT_ID $USER_ID | grep "${ROLE_ID}.*${ROLE}.*${USER_ID}" ; then - echo "User already has role '$ROLE'" -else - openstack role add --project $TENANT_ID --user $USER_ID $ROLE_ID -fi -echo "User $USERCODE configured." diff --git a/scripts/assert-users b/scripts/assert-users deleted file mode 100755 index 5ea0d089..00000000 --- a/scripts/assert-users +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash -# -# Copyright 2013 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -eu - -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -function show_options { - echo "Usage: $SCRIPT_NAME [options] LISTFILE" - echo - echo "Ensure that every user listed in LISTFILE has a cloud account." - echo - echo "Options:" - echo " -h -- this help" - echo " -t -- Choose a tenant. Defaults to the usercode" - echo - exit $1 -} - -TENANT='' - -TEMP=`getopt -o ht: -n $SCRIPT_NAME -- "$@"` -if [ $? != 0 ]; then - echo "Terminating..." >&2; - exit 1; -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -h) show_options 0;; - -t) TENANT=$2; shift 2 ;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -LISTFILE=${1:-''} -EXTRA_ARGS=${2:-''} - -if [ -z "$LISTFILE" -o -n "$EXTRA_ARGS" ]; then - show_options 1 -fi - -while IFS=, read -ra DETAILS; do - if [ -z "$TENANT" ] ; then - USER_TENANT=${DETAILS[0]} - else - USER_TENANT=$TENANT - fi - assert-user -u ${DETAILS[0]} -e ${DETAILS[1]} -t $USER_TENANT -n "${DETAILS[2]}" -done < $LISTFILE diff --git a/scripts/boot-seed-vm b/scripts/boot-seed-vm deleted file mode 100755 index a8e9449b..00000000 --- a/scripts/boot-seed-vm +++ /dev/null @@ -1,228 +0,0 @@ -#!/bin/bash -# -# Copyright 2013 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -e -set -o pipefail - -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -PATH=$PATH:/usr/sbin:/sbin - -# Some defaults -ARCH=i386 -export IMAGE_NAME=seed -export DIB_IMAGE_SIZE=30 -BUILD_ONLY= -CREATE_IMAGE=yes -ALWAYS_ELEMENTS="vm cloud-init-nocloud local-config boot-stack seed-stack-config nova-ironic" -DIB_COMMON_ELEMENTS=${DIB_COMMON_ELEMENTS:-''} -SEED_DIB_EXTRA_ARGS=${SEED_DIB_EXTRA_ARGS:-'rabbitmq-server'} - -if [ "${USE_MARIADB:-}" = 1 ] ; then - SEED_DIB_EXTRA_ARGS="$SEED_DIB_EXTRA_ARGS mariadb-rpm" -fi - -if [[ "$DIB_COMMON_ELEMENTS $SEED_DIB_EXTRA_ARGS" != *enable-serial-console* ]]; then - SEED_DIB_EXTRA_ARGS="$SEED_DIB_EXTRA_ARGS remove-serial-console" -fi -export VM_IP="" - -function show_options { - echo "Usage: $SCRIPT_NAME [options] [ ...]" - echo - echo "Create and start a VM by combining the specified elements" - echo "with common default elements, assuming many things about" - echo "the local operating environment." - echo "See ../scripts/devtest.sh" - echo - echo "The environment variable TE_DATAFILE must be set, pointing at a test" - echo "environment JSON file. If seed-ip is present in the JSON then that is" - echo "used for the VM IP address, otherwise it is discovered by probing the" - echo "ARP table and then saved back into the JSON file." - echo - echo "If host-ip (and possibly ssh-user) is set in the JSON then those details" - echo "are used to construct a remote libvirt URL and spawn the VM remotely." - echo "Note that seed-ip *must* be present when doing this. When spawning remotely" - echo "the image is copied to that host via rsync, and a remote virsh URI is used." - echo "However SSH access with rsync write access to /var/lib/libvirt/images/," - echo "permission to chattr, and the ability to run virsh as the selected user are" - echo "requirements." - echo - echo "Options:" - echo " -a i386|amd64 -- set the architecture of the VM (i386)" - echo " --build-only -- build the needed images but don't deploy them." - echo " -o name -- set the name of the VM and image file" - echo " (seed) - must match that from setup-seed-vm" - echo " -s size -- set the image size (30 GB)" - echo " -c -- use a image cache for seed image" - echo " -i -- image file was built elsewhere, don't" - echo " create" - echo - exit $1 -} - -TEMP=$(getopt -o hcia:o:s: -l build-only -n $SCRIPT_NAME -- "$@") -if [ $? != 0 ]; then - echo "Terminating..." >&2; - exit 1; -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -a) export ARCH=$2; shift 2 ;; - --build-only) BUILD_ONLY="1"; shift 1;; - -o) export IMAGE_NAME=$2; shift 2 ;; - -s) export DIB_IMAGE_SIZE=$2; shift 2 ;; - -h) show_options 0;; - -c) export IMAGE_CACHE_USE=1; shift ;; - -i) export CREATE_IMAGE=; shift ;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -for arg; do - SEED_DIB_EXTRA_ARGS="$SEED_DIB_EXTRA_ARGS $arg"; -done - -SEED_ARCH= - -case $ARCH in - i386) SEED_ARCH='i686'; ;; - amd64|x86_64) SEED_ARCH='x86_64'; ;; - *) echo "Unsupported arch $ARCH!" ; exit 1 ;; -esac - -if [ -z "$TE_DATAFILE" ]; then - echo "Error: TE_DATAFILE not set." - show_options 1 -fi - -HOST_IP=$(os-apply-config -m $TE_DATAFILE --key host-ip --type netaddress --key-default '') -REMOTE_OPERATIONS=$(os-apply-config -m $TE_DATAFILE --key remote-operations --type raw --key-default '') -if [ -n "$HOST_IP" ]; then - SSH_USER=$(os-apply-config -m $TE_DATAFILE --key ssh-user --type raw --key-default '') - if [ -n "$SSH_USER" ]; then - SSH_USER="${SSH_USER}@" - fi - VM_HOST=${SSH_USER}${HOST_IP} - echo $VM_HOST -fi - -ENV_NUM=$(os-apply-config -m $TE_DATAFILE --key env-num --type int --key-default 0) - -if [ $CREATE_IMAGE ]; then - - ELEMENTS_PATH=${ELEMENTS_PATH:-$SCRIPT_HOME/../../tripleo-image-elements/elements} - export ELEMENTS_PATH - - DIB_PATH=${DIB_PATH:-$SCRIPT_HOME/../../diskimage-builder} - DIB=$(which disk-image-create || echo $DIB_PATH/bin/disk-image-create) - - if [ ! -e $DIB ]; then - echo "Error: unable to locate disk-image-create" - exit 1 - fi - -fi - -# Shutdown any running VM - writing to the image file of a running VM is a -# great way to get a corrupt image file. -if [ -z "$BUILD_ONLY" ]; then - if [ -n "$REMOTE_OPERATIONS" ]; then - ssh -o StrictHostKeyChecking=no -o PasswordAuthentication=no ${VM_HOST} virsh destroy ${IMAGE_NAME}_$ENV_NUM || true - # Ensure any existing VM's in the test environment are shutdown, so devtest always starts at a consistent point. - for NUM in $(seq 0 14) ; do - ssh -o StrictHostKeyChecking=no -o PasswordAuthentication=no ${VM_HOST} virsh destroy baremetalbrbm${ENV_NUM}_${NUM} || true - done - else - virsh destroy $IMAGE_NAME || true - for NUM in $(seq 0 14) ; do - virsh destroy baremetal_${NUM} || true - done - fi -fi - -if [ $CREATE_IMAGE ]; then - - IMAGE_CACHE_FILE=$TRIPLEO_ROOT/seed - - # Create the image if it doesn't exist or we're not using image cache - if [ ! -e "$IMAGE_CACHE_FILE.qcow2" -o -z "$IMAGE_CACHE_USE" ] ; then - $DIB -x -u -a $ARCH $ALWAYS_ELEMENTS $DIB_COMMON_ELEMENTS $SEED_DIB_EXTRA_ARGS -o $IMAGE_CACHE_FILE 2>&1 | tee $IMAGE_CACHE_FILE.log - else - echo "Using cached seed image : $IMAGE_CACHE_FILE.qcow2" - fi - if [ -n "$BUILD_ONLY" ]; then - exit 0 - fi - - if [ -n "$REMOTE_OPERATIONS" ]; then - # rsync could be used here which may have been more efficient but using a - # custom command "copyseed" should be easier to restrict. Also we can - # take multiple steps on the server in this single command meaning we - # don't have to open up the ssh access even further. - dd if=$IMAGE_CACHE_FILE.qcow2 | ssh -o StrictHostKeyChecking=no -o PasswordAuthentication=no ${VM_HOST} copyseed $ENV_NUM - else - sudo cp $IMAGE_CACHE_FILE.qcow2 /var/lib/libvirt/images/$IMAGE_NAME.qcow2 - sudo chattr +C /var/lib/libvirt/images/$IMAGE_NAME.qcow2 || true - fi -fi - -function poll_vm { - if [ -z "$VM_IP" ]; then - MAC=$(sudo virsh dumpxml $IMAGE_NAME | grep "mac address" | head -1 | awk -F "'" '{print $2}') - VM_IP=$(arp -n | grep $MAC | awk '{print $1}') - fi - [ -z $VM_IP ] && return 1 - ping -c 1 $VM_IP || return 1 - return 0 -} -export -f poll_vm - -if [ -n "$REMOTE_OPERATIONS" ]; then - ssh -o StrictHostKeyChecking=no -o PasswordAuthentication=no ${VM_HOST} virsh start ${IMAGE_NAME}_$ENV_NUM - VM_IP=$(os-apply-config -m $TE_DATAFILE --key seed-ip --type netaddress --key-default '') -else - sudo virsh start $IMAGE_NAME -fi - -echo "Waiting for $IMAGE_NAME VM to boot." -wait_for -w 100 --delay 1 -- poll_vm -poll_vm - -echo -echo "Booted. Found IP: $VM_IP." - -# hostkeys are generated by cloud-init as part of the boot sequence - can -# take a few seconds. -echo "Waiting for SSH hostkey." -wait_for -w 30 --delay 1 -- "ssh-keyscan $VM_IP 2>&1 | grep \"$VM_IP.*OpenSSH\"" - -# Remove the hostkey, new instance == new key. -ssh-keygen -R $(os-apply-config -m $TE_DATAFILE --key baremetal-network.seed.ip --type netaddress --key-default '192.0.2.1') || true - -echo "element(s): $ALWAYS_ELEMENTS $DIB_COMMON_ELEMENTS $SEED_DIB_EXTRA_ARGS booted and ready." -echo "SEED_IP=$VM_IP" -echo -echo "to login: ssh root@$VM_IP" -NEW_JSON=$(jq '.["seed-ip"]="'${VM_IP}'"' $TE_DATAFILE) -echo "$NEW_JSON" > $TE_DATAFILE diff --git a/scripts/build-images b/scripts/build-images deleted file mode 100755 index 74691c03..00000000 --- a/scripts/build-images +++ /dev/null @@ -1,144 +0,0 @@ -#!/usr/bin/env python -# Copyright 2015 Red Hat, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -import argparse -import logging -import os -import subprocess -import sys -import yaml - -logger = logging.getLogger(__name__) -env = os.environ.copy() - - -# YAML FILE FORMAT -# disk_images: -# - -# imagename: overcloud-compute -# arch: amd64 -# type: qcow2 -# elements: -# - overcloud-compute -# packages: -# - vim -# options: -def parse_opts(argv): - parser = argparse.ArgumentParser( - description='Create a set of disk images using a YAML/JSON config file' - ' format.') - parser.add_argument('-c', '--config-file', metavar='CONFIG_FILE', - help="""path to the configuration file.""", - default='disk_images.yaml') - parser.add_argument('-o', '--output-directory', metavar='DIRECTORY', - help="""output directory for images. """ - """Defaults to $TRIPLEO_ROOT""", - default=env.get('TRIPLEO_ROOT')) - parser.add_argument('-s', '--skip', action='store_true', - help="""skip build if cached image exists. """ - """Or set USE_CACHE ENV variable to 1.""", - default=False) - parser.add_argument('-d', '--debug', dest="debug", action='store_true', - help="Print debugging output.", required=False) - parser.add_argument('-v', '--verbose', dest="verbose", - action='store_true', help="Print verbose output.", - required=False) - - opts = parser.parse_args(argv[1:]) - - return opts - - -def configure_logger(verbose=False, debug=False): - LOG_FORMAT = '[%(asctime)s] [%(levelname)s] %(message)s' - DATE_FORMAT = '%Y/%m/%d %I:%M:%S %p' - log_level = logging.WARN - - if debug: - log_level = logging.DEBUG - elif verbose: - log_level = logging.INFO - - logging.basicConfig(format=LOG_FORMAT, datefmt=DATE_FORMAT, - level=log_level) - - -def main(argv=sys.argv): - opts = parse_opts(argv) - configure_logger(opts.verbose, opts.debug) - logger.info('Using config file at: %s' % opts.config_file) - - if os.path.exists(opts.config_file): - with open(opts.config_file) as cf: - disk_images = yaml.load(cf.read()).get("disk_images") - logger.debug('disk_images JSON: %s' % str(disk_images)) - else: - logger.error('No config file exists at: %s' % opts.config_file) - return 1 - - if not opts.output_directory: - logger.error('Please specify --output-directory.') - return 1 - - for image in disk_images: - arch = image.get('arch', 'amd64') - img_type = image.get('type', 'qcow2') - skip_base = image.get('skip_base', 'false') - docker_target = image.get('docker_target') - imagename = image.get('imagename') - logger.info('imagename: %s' % imagename) - image_path = '%s/%s.%s' % (opts.output_directory, imagename, img_type) - if opts.skip or env.get('USE_CACHE', '0') == '1': - logger.info('looking for image at path: %s' % image_path) - if os.path.exists(image_path): - logger.warn('Image file exists for image name: %s' % imagename) - logger.warn('Skipping image build') - continue - elements = image.get('elements', []) - options = image.get('options', []) - packages = image.get('packages', []) - cmd = ['disk-image-create', '-a', arch, '-o', image_path, '-t', - img_type] - - if packages: - cmd.append('-p') - cmd.append(','.join(packages)) - - if docker_target: - cmd.append('--docker-target') - cmd.append(docker_target) - - if skip_base == True: - cmd.append('-n') - - if options: - cmd.extend(options) - - # NODE_DIST provides a distro specific element hook - node_dist = image.get('distro') or env.get('NODE_DIST') - if node_dist: - cmd.append(node_dist) - - cmd.extend(elements) - - logger.info('Running %s' % cmd) - retval = subprocess.call(cmd) - if retval != 0: - logger.error('Failed to build image: %s' % imagename) - return 1 - -if __name__ == '__main__': - sys.exit(main(sys.argv)) diff --git a/scripts/cleanup-env b/scripts/cleanup-env deleted file mode 100755 index 07162b0b..00000000 --- a/scripts/cleanup-env +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright 2013 Red Hat -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -SCRIPT_NAME=$(basename $0) - -LIBVIRT_VOL_POOL=${LIBVIRT_VOL_POOL:-"default"} - -function show_options { - echo "Usage: $SCRIPT_NAME [-n NUM]" - echo - echo "Cleanup vm state left behind by previous runs" - echo - echo " -b -- Baremetal bridge name(s)." - echo " The create-nodes script names nodes and" - echo " volumes based on the attached" - echo " bridge name(s). This parameter provides" - echo " a way to cleanup nodes attached to the" - echo " associated bridge name(s). NOTE: when" - echo " cleaning up environments with multiple" - echo " bridges all bridge names must be" - echo " specified." - echo " -n -- Test environment number to clean up." - echo " -a -- Clean up all environments." - echo " Will delete all libvirt defined domains" - echo " that start with baremetal* and seed*" - echo " and their storage" - echo - echo "If provided, NUM is the environment number to be cleaned up." - echo "If not provided, the default environment will be cleaned." - echo "" - echo "If both baremetal bridge names and NUM (-n) are provided the NUM" - echo "is appended to the bridge names when searching for VMs to delete." - exit 1 -} - -NUM= -BRIDGE_NAMES=brbm -CLEANUP_ALL= - -TEMP=$(getopt -o h,b:,n:,a -n $SCRIPT_NAME -- "$@") -if [ $? != 0 ]; then - show_options; -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -h) show_options ;; - -b) BRIDGE_NAMES="$2" ; shift 2 ;; - -n) NUM="$2" ; shift 2 ;; - -a) CLEANUP_ALL=1 ; shift ;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; show_options ;; - esac -done - -SEED_NAME=seed -BAREMETAL_PREFIX="baremetal" -NUMBERED_BRIDGE_NAMES= - -if [ -n "$NUM" ]; then - SEED_NAME="seed_${NUM}" -fi -for NAME in $BRIDGE_NAMES; do - NUMBERED_BRIDGE_NAMES="$NUMBERED_BRIDGE_NAMES$NAME${NUM}_" -done -# remove the last underscore -NUMBERED_BRIDGE_NAMES=${NUMBERED_BRIDGE_NAMES%_} - -if [ -z "$CLEANUP_ALL" ]; then - BAREMETAL_PREFIX="baremetal${NUMBERED_BRIDGE_NAMES}" -fi - -for NAME in $(sudo virsh list --name | grep "^\($SEED_NAME\|${BAREMETAL_PREFIX}\)"); do - sudo virsh destroy $NAME -done - -for NAME in $(sudo virsh list --name --all | grep "^\($SEED_NAME\|${BAREMETAL_PREFIX}\)"); do - if [ $NAME == $SEED_NAME ]; then - # handle seeds differently since their storage is not managed by libvirt - sudo virsh undefine --managed-save $NAME - sudo rm /var/lib/libvirt/images/$NAME.qcow2 - else - sudo virsh undefine --managed-save --remove-all-storage $NAME - fi -done - -for NAME in $(sudo virsh vol-list $LIBVIRT_VOL_POOL 2>/dev/null | grep /var/ | awk '{print $1}' | grep "^\($SEED_NAME\|${BAREMETAL_PREFIX}\)"); do - sudo virsh vol-delete --pool $LIBVIRT_VOL_POOL $NAME -done diff --git a/scripts/configure-vm b/scripts/configure-vm deleted file mode 100755 index 8b5851f7..00000000 --- a/scripts/configure-vm +++ /dev/null @@ -1,159 +0,0 @@ -#!/usr/bin/env python - -import argparse -import math -import os.path -import random - -import libvirt - -templatedir = os.path.join( - os.path.dirname( - os.path.dirname( - os.path.abspath(__file__))), 'templates') - -MAX_NUM_MACS = math.trunc(0xff/2) - - -def generate_baremetal_macs(count=1): - """Generate an Ethernet MAC address suitable for baremetal testing.""" - # NOTE(dprince): We generate our own bare metal MAC address's here - # instead of relying on libvirt so that we can ensure the - # locally administered bit is set low. (The libvirt default is - # to set the 2nd MSB high.) This effectively allows our - # fake baremetal VMs to more accurately behave like real hardware - # and fixes issues with bridge/DHCP configurations which rely - # on the fact that bridges assume the MAC address of the lowest - # attached NIC. - # MACs generated for a given machine will also be in sequential - # order, which matches how most BM machines are laid out as well. - # Additionally we increment each MAC by two places. - macs = [] - - if count > MAX_NUM_MACS: - raise ValueError("The MAX num of MACS supported is %i." % MAX_NUM_MACS) - - base_nums = [0x00, - random.randint(0x00, 0xff), - random.randint(0x00, 0xff), - random.randint(0x00, 0xff), - random.randint(0x00, 0xff)] - base_mac = ':'.join(map(lambda x: "%02x" % x, base_nums)) - - start = random.randint(0x00, 0xff) - if (start + (count * 2)) > 0xff: - # leave room to generate macs in sequence - start = 0xff - count * 2 - for num in range(0, count*2, 2): - mac = start + num - macs.append(base_mac + ":" + ("%02x" % mac)) - return macs - -def main(): - parser = argparse.ArgumentParser( - description="Configure a kvm virtual machine for the seed image.") - parser.add_argument('--name', default='seed', - help='the name to give the machine in libvirt.') - parser.add_argument('--image', - help='Use a custom image file (must be qcow2).') - parser.add_argument('--diskbus', default='sata', - help='Choose an alternate bus type for the disk') - parser.add_argument('--baremetal-interface', nargs='+', default=['brbm'], - help='The interface which bare metal nodes will be connected to.') - parser.add_argument('--engine', default='kvm', - help='The virtualization engine to use') - parser.add_argument('--arch', default='i686', - help='The architecture to use') - parser.add_argument('--memory', default='2097152', - help="Maximum memory for the VM in KB.") - parser.add_argument('--cpus', default='1', - help="CPU count for the VM.") - parser.add_argument('--bootdev', default='hd', - help="What boot device to use (hd/network).") - parser.add_argument('--seed', default=False, action='store_true', - help='Create a seed vm with two interfaces.') - parser.add_argument('--ovsbridge', default="", - help='Place the seed public interface on this ovs bridge.') - parser.add_argument('--libvirt-nic-driver', default='virtio', - help='The libvirt network driver to use') - parser.add_argument('--enable-serial-console', action="store_true", - help='Enable a serial console') - parser.add_argument('--uri', default='qemu:///system', - help='The server uri with which to connect.') - args = parser.parse_args() - with file(templatedir + '/domain.xml', 'rb') as f: - source_template = f.read() - imagefile = '/var/lib/libvirt/images/seed.qcow2' - if args.image: - imagefile = args.image - imagefile = os.path.realpath(imagefile) - params = { - 'name': args.name, - 'imagefile': imagefile, - 'engine': args.engine, - 'arch': args.arch, - 'memory': args.memory, - 'cpus': args.cpus, - 'bootdev': args.bootdev, - 'network': '', - 'enable_serial_console': '', - } - if args.image is not None: - params['imagefile'] = args.image - - # Configure the bus type for the target disk device - params['diskbus'] = args.diskbus - nicparams = { - 'nicdriver': args.libvirt_nic_driver, - 'ovsbridge': args.ovsbridge, - } - if args.seed: - if args.ovsbridge: - params['network'] = """ - - - - - """ % nicparams - else: - params['network'] = """ - - - - - """ % nicparams - - macs = generate_baremetal_macs(len(args.baremetal_interface)) - - params['bm_network'] = "" - for bm_interface, mac in zip(args.baremetal_interface, macs): - bm_interface_params = { - 'bminterface': bm_interface, - 'bmmacaddress': mac, - 'nicdriver': args.libvirt_nic_driver, - } - params['bm_network'] += """ - - - - - - """ % bm_interface_params - - if args.enable_serial_console: - params['enable_serial_console'] = """ - - - - - - - """ - - libvirt_template = source_template % params - conn=libvirt.open(args.uri) - a = conn.defineXML(libvirt_template) - print ("Created machine %s with UUID %s" % (args.name, a.UUIDString())) - -if __name__ == '__main__': - main() diff --git a/scripts/create-nodes b/scripts/create-nodes deleted file mode 100755 index fe1b2719..00000000 --- a/scripts/create-nodes +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/bash -set -eu - -CPU=$1 -MEM=$(( 1024 * $2 )) -# extra G to allow fuzz for partition table : flavor size and registered size -# need to be different to actual size. -DISK=$3 -LIBVIRT_DISK_BUS_TYPE=${LIBVIRT_DISK_BUS_TYPE:-"sata"} -NODE_DISK=$(( $DISK + 1)) - - -case $4 in - i386) ARCH='i686' ;; - amd64|x86_64) ARCH='x86_64' ;; - *) echo "Unsupported arch $4!" ; exit 1 ;; -esac - -TOTAL=$(($5 - 1)) -SSH_USER=$6 -HOSTIP=$7 -TE_DATAFILE=$8 -BRIDGE_NAMES=${9:-""} - -LIBVIRT_NIC_DRIVER=${LIBVIRT_NIC_DRIVER:-"virtio"} -LIBVIRT_VOL_POOL=${LIBVIRT_VOL_POOL:-"default"} -LIBVIRT_VOL_POOL_TARGET=${LIBVIRT_VOL_POOL_TARGET:-"/var/lib/libvirt/images"} - -# define the $LIBVIRT_VOL_POOL storage pool if its not there yet -if ! $(virsh pool-list --all --persistent | grep -q $LIBVIRT_VOL_POOL) ; then - if [ ! -d $LIBVIRT_VOL_POOL_TARGET ]; then - sudo mkdir -p $LIBVIRT_VOL_POOL_TARGET ; - fi - (virsh pool-define-as --name $LIBVIRT_VOL_POOL dir --target $LIBVIRT_VOL_POOL_TARGET ; \ - virsh pool-autostart $LIBVIRT_VOL_POOL; virsh pool-start $LIBVIRT_VOL_POOL) >&2 -fi -PREALLOC= -if [ "${TRIPLEO_OS_FAMILY:-}" = "debian" ]; then - PREALLOC="--prealloc-metadata" -fi - -# Create empty json file if it doesn't exist -[ -s $TE_DATAFILE ] || echo "{}" > $TE_DATAFILE -JSON=$(jq .nodes=[] $TE_DATAFILE) - -EXTRAOPTS= -if [[ ${DIB_COMMON_ELEMENTS:-} == *enable-serial-console* ]]; then - EXTRAOPTS="--enable-serial-console" -fi - -for idx in $(seq 0 $TOTAL) ; do - vm_name="baremetal${BRIDGE_NAMES// /_}_$idx" - (virsh list --all --name | grep -q "^$vm_name\$") && continue - virsh vol-create-as $LIBVIRT_VOL_POOL $vm_name.qcow2 ${NODE_DISK}G --format qcow2 $PREALLOC >&2 - volume_path=$(virsh vol-path --pool $LIBVIRT_VOL_POOL $vm_name.qcow2) - # Pre-touch the VM to set +C, as it can only be set on empty files. - sudo touch "$volume_path" - sudo chattr +C "$volume_path" || true - BAREMETAL_INTERFACE= - if [ -n "$BRIDGE_NAMES" ]; then - BAREMETAL_INTERFACE="--baremetal-interface $BRIDGE_NAMES" - fi - configure-vm $EXTRAOPTS \ - --bootdev network \ - --name $vm_name \ - --image "$volume_path" \ - --diskbus $LIBVIRT_DISK_BUS_TYPE \ - --arch $ARCH \ - --cpus $CPU \ - --memory $MEM \ - --libvirt-nic-driver $LIBVIRT_NIC_DRIVER $BAREMETAL_INTERFACE >&2 - mac=$(get-vm-mac $vm_name) - JSON=$(jq ".nodes=(.nodes + [{mac:[\"$mac\"], cpu:\"$CPU\", memory:\"$2\", disk:\"$DISK\", arch:\"$4\", pm_user:\"$SSH_USER\", pm_addr:\"$HOSTIP\", pm_password:.[\"ssh-key\"], pm_type:\"pxe_ssh\"}])" <<< $JSON) - -done -jq . <<< $JSON > $TE_DATAFILE - diff --git a/scripts/devtest.sh b/scripts/devtest.sh deleted file mode 100755 index 15d04350..00000000 --- a/scripts/devtest.sh +++ /dev/null @@ -1,387 +0,0 @@ -#!/bin/bash -# -# Demo script for Tripleo - the dev/test story. -# This can be run for CI purposes, by passing --trash-my-machine to it. -# Without that parameter, the script is a no-op. - -# Set PS4 as early as possible if it is still at the default, so that -# we have a useful trace output for everything when running devtest.sh -# with bash -x ./devtest.sh -if [ "$PS4" = "+ " ]; then - export PS4='$(basename ${BASH_SOURCE})@${LINENO}: ' -fi -set -eu -set -o pipefail -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -function show_options { - echo "Usage: $SCRIPT_NAME [options]" - echo - echo "Test the core TripleO story." - echo - echo "Options:" - echo " --trash-my-machine -- make nontrivial destructive changes to the machine." - echo " For details read the source." - echo " -c -- re-use existing source/images if they exist." - echo " --existing-environment -- use an existing test environment. The JSON file" - echo " for it may be overridden via the TE_DATAFILE" - echo " environment variable." - echo " --bm-networks NETFILE -- You are supplying your own network layout." - echo " The schema for baremetal-network can be found in" - echo " the devtest_setup documentation." - echo - echo " --nodes NODEFILE -- You are supplying your own list of hardware." - echo " The schema for nodes can be found in the devtest_setup" - echo " documentation." - echo " --no-undercloud -- Use the seed as the baremetal cloud to deploy the" - echo " overcloud from." - echo " --build-only -- Builds images but doesn't attempt to run them." - echo " --no-mergepy -- Use the standalone Heat templates (default)." - echo " --debug-logging -- Enable debug logging in the undercloud and overcloud." - echo " This enables build time debug logs by setting the" - echo " OS_DEBUG_LOGGING env var and also sets the Debug" - echo " heat parameter." - echo " --heat-env-undercloud ENVFILE" - echo " -- heat environment file for the undercloud." - echo " --heat-env-overcloud ENVFILE" - echo " -- heat environment file for the overcloud." - echo - echo "Note that this script just chains devtest_variables, devtest_setup," - echo "devtest_testenv, devtest_ramdisk, devtest_seed, devtest_undercloud," - echo "devtest_overcloud, devtest_end. If you want to run less than all of them just" - echo "run the steps you want in order after sourcing ~/.devtestrc and" - echo "devtest_variables.sh" - echo - exit $1 -} - -BUILD_ONLY= -DEBUG_LOGGING= -NODES_ARG= -NO_UNDERCLOUD= -NETS_ARG= -CONTINUE= -HEAT_ENV_UNDERCLOUD= -HEAT_ENV_OVERCLOUD= -USE_CACHE=0 -export TRIPLEO_CLEANUP=1 -DEVTEST_START=$(date +%s) #nodocs - -TEMP=$(getopt -o h,c -l build-only,no-mergepy,debug-logging,existing-environment,help,trash-my-machine,nodes:,bm-networks:,no-undercloud,heat-env-overcloud:,heat-env-undercloud: -n $SCRIPT_NAME -- "$@") -if [ $? != 0 ]; then - echo "Terminating..." >&2 - exit 1 -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - --build-only) BUILD_ONLY=--build-only; shift 1;; - --no-mergepy) - USE_MERGEPY=0 - echo "Warning: --no-mergepy is the default now, option is DEPRECATED" >&2 - shift 1 - ;; - --debug-logging) - DEBUG_LOGGING=--debug-logging - export OS_DEBUG_LOGGING="1" - shift 1 - ;; - --trash-my-machine) CONTINUE=--trash-my-machine; shift 1;; - --existing-environment) TRIPLEO_CLEANUP=0; shift 1;; - --nodes) NODES_ARG="--nodes $2"; shift 2;; - --bm-networks) NETS_ARG="--bm-networks $2"; shift 2;; - --no-undercloud) NO_UNDERCLOUD="true"; shift 1;; - --heat-env-undercloud) HEAT_ENV_UNDERCLOUD="--heat-env $2"; shift 2;; - --heat-env-overcloud) HEAT_ENV_OVERCLOUD="--heat-env $2"; shift 2;; - -c) USE_CACHE=1; shift 1;; - -h|--help) show_options 0;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -if [ -z "$CONTINUE" ]; then - echo "Not running - this script is destructive and requires --trash-my-machine to run." >&2 - exit 1 -fi - -export USE_CACHE -export USE_MERGEPY - -# Source environment variables from .devtestrc, allowing defaults to be setup -# specific to users environments -if [ -e ~/.devtestrc ] ; then - echo "sourcing ~/.devtestrc" - source ~/.devtestrc -fi - -### --include -## devtest -## ======= - -## (There are detailed instructions available below, the overview and -## configuration sections provide background information). - -## Overview: -## * Define a VM that is your seed node -## * Define N VMs to pretend to be your cluster -## * Create a seed VM -## * Create an undercloud -## * Create an overcloud -## * Deploy a sample workload in the overcloud -## * Add environment variables to be included to ~/.devtestrc, e.g. http_proxy -## * Go to town testing deployments on them. -## * For troubleshooting see :doc:`troubleshooting` -## * For generic deployment information see :doc:`deploying` - -## This document is extracted from devtest.sh, our automated bring-up story for -## CI/experimentation. - -## More details about the TripleO project and its goals can be found in the -## :doc:`README ` - -## .. tip:: - -## https://wiki.openstack.org/wiki/TripleO#Notes_for_new_developers contains -## notes on setting up a development environment. It's primarily aimed at -## people who intend to become contributors for tripleo, but many of its -## notes (such as those relating to setting up local mirrors for apt and -## pypi) will probably be helpful for everyone. - -## .. note:: - -## See :ref:`tested_platforms` for an overview of which releases of which -## distros are tested in our CI system. We suggest you read that section -## before proceeding, to make sure you're running on a platform that we have -## extensively tested. - -## Permissions -## ----------- - -## These scripts are designed to be run under your normal user account. The -## scripts make use of sudo when elevated privileges are needed. You will -## either need to run this attended, entering your password when sudo needs -## it, or enable passwordless sudo for your user. Another option is to extend -## the timeout of sudo sessions so that passwordless sudo will be allowed -## enough time on the controlling terminal to complete the devtest run. If -## there are any circumstances where running as a normal user, and not root, -## fails, this is considered a critical bug. - -## Sudo -## ~~~~ - -## In order to set the sudo session timeout higher, add this to /etc/sudoers:: -## -## Defaults timestamp_timeout=240 # 4 hours -## -## This will result in 4 hour timeouts for sudo session credentials. To -## reset the timeout run:: -## -## sudo -k; sudo -v -## - -## In order to set a user to full passwordless operation add this (typically -## near the end of /etc/sudoers):: -## -## username ALL = NOPASSWD: ALL -## - -## Initial Checkout -## ---------------- - -## #. Choose a base location to put all of the source code. - -## .. note:: - -## exports are ephemeral - they will not survive across new shell sessions -## or reboots. If you put these export commands in ``~/.devtestrc``, you -## can simply ``source ~/.devtestrc`` to reload them. Alternatively, you -## can ``$TRIPLEO_ROOT/tripleo-incubator/scripts/write-tripleorc`` and then -## source the generated tripleorc file. - -## :: - -## export TRIPLEO_ROOT=~/tripleo - -## .. note:: - -## This will be used by devtest.sh and other scripts to store the -## additional tools, images, packages, tarballs and everything else -## needed by the deployment process. The tripleo-incubator tools must -## be cloned within your ``$TRIPLEO_ROOT``. - -## #. Create the directory and clone tripleo-incubator within ``$TRIPLEO_ROOT`` - -## :: - -## mkdir -p $TRIPLEO_ROOT -## cd $TRIPLEO_ROOT -## git clone https://git.openstack.org/openstack/tripleo-incubator -## cd tripleo-incubator - -## Optional: stable branch -## ----------------------- - -## Note that every effort is made to keep the published set of these instructions -## updated for use with only the master branches of the TripleO projects. There is -## **NO** guaranteed stability in master. There is also no guaranteed stable -## upgrade path from release to release or from one stable branch to a later -## stable branch. The stable branches are a point in time and make no -## guarantee about deploying older or newer branches of OpenStack projects -## correctly. - -## If you wish to use the stable branches, you should instead checkout and clone -## the stable branch of tripleo-incubator you want, and then build the -## instructions yourself. For instance, to create a local branch named -## ``foo`` based on the upstream branch ``stable/foo``:: - -## git checkout -b foo origin/stable/foo -## tox -edocs -## # View doc/build/html/devtest.html in your browser and proceed from there - -## Next Steps: -## ----------- - -## When run as a standalone script, devtest.sh runs the following commands -## to configure the devtest environment, bootstrap a seed, deploy under and -## overclouds. Many of these commands are also part of our documentation. -## Readers may choose to either run the commands given here, or instead follow -## the documentation for each command and walk through it step by step to see -## what is going on. This choice can be made on a case by case basis - for -## instance, if bootstrapping is not interesting, run that as devtest does, -## then step into the undercloud setup for granular details of bringing up a -## baremetal cloud. - -### --end - -#FIXME: This is a little weird. Perhaps we should identify whatever state we're -# accumulating and store it in files or something, rather than using -# source? - -### --include - -## #. See :doc:`devtest_variables` for documentation. Assuming you're still at -## the root of your checkout:: - -## source scripts/devtest_variables.sh -source $SCRIPT_HOME/devtest_variables.sh #nodocs - -## #. See :doc:`devtest_setup` for documentation. -## $CONTINUE should be set to '--trash-my-machine' to have it execute -## unattended. -## :: - -devtest_setup.sh $CONTINUE - -## #. See :doc:`devtest_testenv` for documentation. This step creates the -## seed VM, as well as "baremetal" VMs for the under/overclouds. Details -## of the created VMs are written to ``$TE_DATAFILE``. - -## .. warning:: - -## You should only run this step once, the first time the environment -## is being set up. Unless you remove the VMs and need to recreate -## them, you should skip this step on subsequent runs. Running this -## script with existing VMs will result in information about the existing -## nodes being removed from ``$TE_DATAFILE`` - -## :: - -if [ "$TRIPLEO_CLEANUP" = "1" ]; then #nodocs -#XXX: When updating, also update the header in devtest_testenv.sh #nodocs -devtest_testenv.sh $TE_DATAFILE $NODES_ARG $NETS_ARG -fi #nodocs - -## #. See :doc:`devtest_ramdisk` for documentation:: - -DEVTEST_RD_START=$(date +%s) #nodocs -devtest_ramdisk.sh -DEVTEST_RD_END=$(date +%s) #nodocs - -## #. See :doc:`devtest_seed` for documentation. If you are not deploying an -## undercloud, (see below) then you will want to add --all-nodes to your -## invocation of devtest_seed.sh,which will register all your nodes directly -## with the seed cloud.:: - -## devtest_seed.sh -## export no_proxy=${no_proxy:-},192.0.2.1 -## source $TRIPLEO_ROOT/tripleo-incubator/seedrc - -### --end -DEVTEST_SD_START=$(date +%s) -if [ -z "$NO_UNDERCLOUD" ]; then - ALLNODES="" -else - ALLNODES="--all-nodes" -fi -devtest_seed.sh $BUILD_ONLY $ALLNODES $DEBUG_LOGGING -DEVTEST_SD_END=$(date +%s) -export no_proxy=${no_proxy:-},$(os-apply-config --type netaddress -m $TE_DATAFILE --key baremetal-network.seed.ip --key-default '192.0.2.1') -if [ -z "$BUILD_ONLY" ]; then - source $TRIPLEO_ROOT/tripleo-incubator/seedrc -fi -### --include - -## #. See :doc:`devtest_undercloud` for documentation. The undercloud doesn't -## have to be built - the seed is entirely capable of deploying any -## baremetal workload - but a production deployment would quite probably -## want to have a heat deployed (and thus reconfigurable) deployment -## infrastructure layer). -## If you are only building images you won't need to update your no_proxy -## line or source the undercloudrc file. - -## :: - -## devtest_undercloud.sh $TE_DATAFILE -## export no_proxy=$no_proxy,$(os-apply-config --type raw -m $TE_DATAFILE --key undercloud.endpointhost) -## source $TRIPLEO_ROOT/tripleo-incubator/undercloudrc -### --end -DEVTEST_UC_START=$(date +%s) -if [ -z "$NO_UNDERCLOUD" ]; then - devtest_undercloud.sh $TE_DATAFILE $BUILD_ONLY $DEBUG_LOGGING $HEAT_ENV_UNDERCLOUD - if [ -z "$BUILD_ONLY" ]; then - export no_proxy=$no_proxy,$(os-apply-config --type raw -m $TE_DATAFILE --key undercloud.endpointhost) - source $TRIPLEO_ROOT/tripleo-incubator/undercloudrc - fi -fi -DEVTEST_UC_END=$(date +%s) -### --include - -## #. See :doc:`devtest_overcloud` for documentation. -## If you are only building images you won't need to update your no_proxy -## line or source the overcloudrc file. - -## :: - -## devtest_overcloud.sh -### --end -DEVTEST_OC_START=$(date +%s) -devtest_overcloud.sh $BUILD_ONLY $DEBUG_LOGGING $HEAT_ENV_OVERCLOUD -DEVTEST_OC_END=$(date +%s) -if [ -z "$BUILD_ONLY" ]; then -### --include -export no_proxy=$no_proxy,$(os-apply-config --type raw -m $TE_DATAFILE --key overcloud.endpointhost) -source $TRIPLEO_ROOT/tripleo-incubator/overcloudrc -fi #nodocs - -## #. See :doc:`devtest_end` for documentation:: - -devtest_end.sh - -### --end - -DEVTEST_END=$(date +%s) #nodocs -DEVTEST_PERF_LOG="${TRIPLEO_ROOT}/devtest_perf.log" #nodocs -TIMESTAMP=$(date "+[%Y-%m-%d %H:%M:%S]") #nodocs -echo "${TIMESTAMP} Run comment : ${DEVTEST_PERF_COMMENT:-"No Comment"}" >> ${DEVTEST_PERF_LOG} #nodocs -echo "${TIMESTAMP} Total runtime: $((DEVTEST_END - DEVTEST_START)) s" | tee -a ${DEVTEST_PERF_LOG} #nodocs -echo "${TIMESTAMP} ramdisk : $((DEVTEST_RD_END - DEVTEST_RD_START)) s" | tee -a ${DEVTEST_PERF_LOG} #nodocs -echo "${TIMESTAMP} seed : $((DEVTEST_SD_END - DEVTEST_SD_START)) s" | tee -a ${DEVTEST_PERF_LOG} #nodocs -echo "${TIMESTAMP} undercloud : $((DEVTEST_UC_END - DEVTEST_UC_START)) s" | tee -a ${DEVTEST_PERF_LOG} #nodocs -echo "${TIMESTAMP} overcloud : $((DEVTEST_OC_END - DEVTEST_OC_START)) s" | tee -a ${DEVTEST_PERF_LOG} #nodocs -echo "${TIMESTAMP} DIB_COMMON_ELEMENTS=${DIB_COMMON_ELEMENTS}" >> ${DEVTEST_PERF_LOG} #nodocs - diff --git a/scripts/devtest_end.sh b/scripts/devtest_end.sh deleted file mode 100755 index dd87ba01..00000000 --- a/scripts/devtest_end.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -set -eu -set -o pipefail - -### --include -## devtest_end -## ============ - -## #. Save your devtest environment:: - -## write-tripleorc --overwrite $TRIPLEO_ROOT/tripleorc - -### --end -if [ -e tripleorc ]; then - echo "Resetting existing $PWD/tripleorc with new values" - tripleorc_path=$PWD/tripleorc -else - tripleorc_path=$TRIPLEO_ROOT/tripleorc -fi -write-tripleorc --overwrite $tripleorc_path - -echo "devtest.sh completed." -echo source $tripleorc_path to restore all values -echo "" - -### --include -## #. If you need to recover the environment, you can source tripleorc. -## :: - -## source $TRIPLEO_ROOT/tripleorc - - -## The End! -## -### --end diff --git a/scripts/devtest_overcloud.sh b/scripts/devtest_overcloud.sh deleted file mode 100755 index 231c9d46..00000000 --- a/scripts/devtest_overcloud.sh +++ /dev/null @@ -1,716 +0,0 @@ -#!/bin/bash - -set -eu -set -o pipefail - -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -BUILD_ONLY= -DEBUG_LOGGING= -HEAT_ENV= -DISK_IMAGES_CONFIG=${OVERCLOUD_DISK_IMAGES_CONFIG:-''} -COMPUTE_FLAVOR="baremetal" -CONTROL_FLAVOR="baremetal" -BLOCKSTORAGE_FLAVOR="baremetal" -SWIFTSTORAGE_FLAVOR="baremetal" -WITH_STEPS= - -function show_options { - echo "Usage: $SCRIPT_NAME [options]" - echo - echo "Deploys a KVM cloud via heat." - echo - echo "Options:" - echo " -h -- this help" - echo " -c -- re-use existing source/images if they exist." - echo " --build-only -- build the needed images but don't deploy them." - echo " --no-mergepy -- use the standalone Heat templates (default)." - echo " --with-steps -- Deploy in steps, asking for confirmation between each." - echo " --debug-logging -- Turn on debug logging in the built overcloud." - echo " Sets both OS_DEBUG_LOGGING and the heat Debug parameter." - echo " --heat-env -- path to a JSON heat environment file." - echo " Defaults to \$TRIPLEO_ROOT/overcloud-env.json." - echo " --compute-flavor -- Nova flavor to use for compute nodes." - echo " Defaults to 'baremetal'." - echo " --control-flavor -- Nova flavor to use for control nodes." - echo " Defaults to 'baremetal'." - echo " --block-storage-flavor -- Nova flavor to use for block " - echo " storage nodes." - echo " Defaults to 'baremetal'." - echo " --swift-storage-flavor -- Nova flavor to use for swift " - echo " storage nodes." - echo " Defaults to 'baremetal'." - echo - exit $1 -} - -TEMP=$(getopt -o c,h -l build-only,no-mergepy,with-steps,debug-logging,heat-env:,compute-flavor:,control-flavor:,block-storage-flavor:,swift-storage-flavor:,help -n $SCRIPT_NAME -- "$@") -if [ $? != 0 ] ; then - echo "Terminating..." >&2; - exit 1; -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -c) USE_CACHE=1; shift 1;; - --build-only) BUILD_ONLY="1"; shift 1;; - --no-mergepy) - USE_MERGEPY=0 - echo "Warning: --no-mergepy is the default now, option is DEPRECATED" >&2 - shift 1 - ;; - --with-steps) WITH_STEPS="1"; shift 1;; - --debug-logging) - DEBUG_LOGGING="1" - export OS_DEBUG_LOGGING="1" - shift 1 - ;; - --heat-env) HEAT_ENV="$2"; shift 2;; - --disk-images-config) DISK_IMAGES_CONFIG="$2"; shift 2;; - --compute-flavor) COMPUTE_FLAVOR="$2"; shift 2;; - --control-flavor) CONTROL_FLAVOR="$2"; shift 2;; - --block-storage-flavor) BLOCKSTORAGE_FLAVOR="$2"; shift 2;; - --swift-storage-flavor) SWIFTSTORAGE_FLAVOR="$2"; shift 2;; - -h | --help) show_options 0;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -set -x - -### --include -## devtest_overcloud -## ================= - -## #. Build images. There are two helper scripts which can be -## used to build images. The first method uses environment -## variables to create a specific image for each overcloud -## role. This method works best if you are using tripleo-image-elements -## for configuration (which requires per role image customization). -## See :doc:`devtest_overcloud_images` for documentation. -## This method is currently the default. - - -## Another option is to make use of the build-images script which -## dynamically creates a set of images using a YAML (or JSON) config -## file (see the build-images script for details and the expected config -## file format). This method is typically preferred when using -## tripleo-puppet-elements (Puppet) for configuration which -## allows the contents and number of images used to deploy an -## overcloud to be more flexibly defined. Example: - -## build-images -d -c $DISK_IMAGES_CONFIG - -### --end -USE_CACHE=${USE_CACHE:-0} -if [ -n "$DISK_IMAGES_CONFIG" ]; then - USE_CACHE=$USE_CACHE build-images -d -c $DISK_IMAGES_CONFIG -else - USE_CACHE=$USE_CACHE devtest_overcloud_images.sh - # use a default disk images YAML file to load images - DISK_IMAGES_CONFIG="$TRIPLEO_ROOT/tripleo-incubator/scripts/overcloud_disk_images.yaml" -fi -if [ -n "$BUILD_ONLY" ]; then - echo "--build-only is deprecated. Please use devtest_overcloud_images.sh instead." - exit 0 -fi - - -OS_PASSWORD=${OS_PASSWORD:?"OS_PASSWORD is not set. Undercloud credentials are required"} - -# Parameters for tripleo-cd - see the tripleo-cd element. -# NOTE(rpodolyaka): retain backwards compatibility by accepting both positional -# arguments and environment variables. Positional arguments -# take precedence over environment variables -NeutronPublicInterface=${1:-${NeutronPublicInterface:-'nic1'}} -NeutronPublicInterfaceIP=${2:-${NeutronPublicInterfaceIP:-''}} -NeutronPublicInterfaceRawDevice=${3:-${NeutronPublicInterfaceRawDevice:-''}} -NeutronPublicInterfaceDefaultRoute=${4:-${NeutronPublicInterfaceDefaultRoute:-''}} -FLOATING_START=${5:-${FLOATING_START:-'192.0.2.45'}} -FLOATING_END=${6:-${FLOATING_END:-'192.0.2.64'}} -FLOATING_CIDR=${7:-${FLOATING_CIDR:-'192.0.2.0/24'}} -ADMIN_USERS=${8:-${ADMIN_USERS:-''}} -USERS=${9:-${USERS:-''}} -STACKNAME=${10:-overcloud} -# If set, the base name for a .crt and .key file for SSL. This will trigger -# inclusion of openstack-ssl in the build and pass the contents of the files to heat. -# Note that PUBLIC_API_URL ($12) must also be set for SSL to actually be used. -SSLBASE=${11:-''} -OVERCLOUD_SSL_CERT=${SSLBASE:+$(<$SSLBASE.crt)} -OVERCLOUD_SSL_KEY=${SSLBASE:+$(<$SSLBASE.key)} -PUBLIC_API_URL=${12:-''} -TE_DATAFILE=${TE_DATAFILE:?"TE_DATAFILE must be defined before calling this script!"} - -# A client-side timeout in minutes for creating or updating the overcloud -# Heat stack. -OVERCLOUD_STACK_TIMEOUT=${OVERCLOUD_STACK_TIMEOUT:-60} - -# The private instance fixed IP network range -OVERCLOUD_FIXED_RANGE_CIDR=${OVERCLOUD_FIXED_RANGE_CIDR:-"10.0.0.0/8"} -OVERCLOUD_FIXED_RANGE_GATEWAY=${OVERCLOUD_FIXED_RANGE_GATEWAY:-"10.0.0.1"} -OVERCLOUD_FIXED_RANGE_NAMESERVER=${OVERCLOUD_FIXED_RANGE_NAMESERVER:-"8.8.8.8"} - -NODE_ARCH=$(os-apply-config -m $TE_DATAFILE --key arch --type raw) - -### --include - -## #. Load all images into Glance (based on the provided disk images config). -## This captures all the Glance IDs into a Heat env file which maps -## them to the appropriate parameter names. This allows us some -## amount of flexability how many images to use for the overcloud -## deployment. -## :: - -OVERCLOUD_IMAGE_IDS_ENV=${OVERCLOUD_IMAGE_IDS_ENV:-"${TRIPLEO_ROOT}/overcloud-images-env.yaml"} -load-images -d --remove -c $DISK_IMAGES_CONFIG -o $OVERCLOUD_IMAGE_IDS_ENV - -## #. For running an overcloud in VM's. For Physical machines, set to kvm: -## :: - -OVERCLOUD_LIBVIRT_TYPE=${OVERCLOUD_LIBVIRT_TYPE:-"qemu"} - -## #. Set the public interface of overcloud network node:: -## :: - -NeutronPublicInterface=${NeutronPublicInterface:-'nic1'} - -## #. Set the NTP server for the overcloud:: -## :: - -OVERCLOUD_NTP_SERVER=${OVERCLOUD_NTP_SERVER:-''} - -## #. If you want to permit VM's access to bare metal networks, you need -## to define flat-networks and bridge mappings in Neutron. We default -## to creating one called datacentre, which we use to grant external -## network access to VMs:: -## :: - -OVERCLOUD_FLAT_NETWORKS=${OVERCLOUD_FLAT_NETWORKS:-'datacentre'} -OVERCLOUD_BRIDGE_MAPPINGS=${OVERCLOUD_BRIDGE_MAPPINGS:-'datacentre:br-ex'} -OVERCLOUD_HYPERVISOR_PHYSICAL_BRIDGE=${OVERCLOUD_HYPERVISOR_PHYSICAL_BRIDGE:-'br-ex'} -OVERCLOUD_HYPERVISOR_PUBLIC_INTERFACE=${OVERCLOUD_HYPERVISOR_PUBLIC_INTERFACE:-'nic1'} -OVERCLOUD_VIRTUAL_INTERFACE=${OVERCLOUD_VIRTUAL_INTERFACE:-'br-ex'} - -## #. If you are using SSL, your compute nodes will need static mappings to your -## endpoint in ``/etc/hosts`` (because we don't do dynamic undercloud DNS yet). -## set this to the DNS name you're using for your SSL certificate - the heat -## template looks up the controller address within the cloud:: - -OVERCLOUD_NAME=${OVERCLOUD_NAME:-''} - -## #. Detect if we are deploying with a VLAN for API endpoints / floating IPs. -## This is done by looking for a 'public' network in Neutron, and if found -## we pull out the VLAN id and pass that into Heat, as well as using a VLAN -## enabled Heat template. -## :: - -if (neutron net-list | grep -q public); then - VLAN_ID=$(neutron net-show public | awk '/provider:segmentation_id/ { print $4 }') - NeutronPublicInterfaceTag="$VLAN_ID" - # This should be in the heat template, but see - # https://bugs.launchpad.net/heat/+bug/1336656 - # note that this will break if there are more than one subnet, as if - # more reason to fix the bug is needed :). - PUBLIC_SUBNET_ID=$(neutron net-show public | awk '/subnets/ { print $4 }') - VLAN_GW=$(neutron subnet-show $PUBLIC_SUBNET_ID | awk '/gateway_ip/ { print $4}') - BM_VLAN_CIDR=$(neutron subnet-show $PUBLIC_SUBNET_ID | awk '/cidr/ { print $4}') - NeutronPublicInterfaceDefaultRoute="${VLAN_GW}" - export CONTROLEXTRA=overcloud-vlan-port.yaml -else - VLAN_ID= - NeutronPublicInterfaceTag= -fi - -## #. TripleO explicitly models key settings for OpenStack, as well as settings -## that require cluster awareness to configure. To configure arbitrary -## additional settings, provide a JSON string with them in the structure -## required by the template ExtraConfig parameter. - -OVERCLOUD_EXTRA_CONFIG=${OVERCLOUD_EXTRA_CONFIG:-''} - -## #. Choose whether to deploy or update. Use stack-update to update:: - -## HEAT_OP=stack-create - -### --end - -if heat stack-show $STACKNAME > /dev/null; then - HEAT_OP=stack-update - if (heat stack-show $STACKNAME | grep -q FAILED); then - echo "Updating a failed stack; this is a new ability and may cause problems." >&2 - fi -else - HEAT_OP=stack-create -fi - -### --include - -## #. Wait for the BM cloud to register BM nodes with the scheduler:: - -expected_nodes=$(( $OVERCLOUD_COMPUTESCALE + $OVERCLOUD_CONTROLSCALE + $OVERCLOUD_BLOCKSTORAGESCALE )) -wait_for -w $((60 * $expected_nodes)) --delay 10 -- wait_for_hypervisor_stats $expected_nodes - -## #. Set password for Overcloud SNMPd, same password needs to be set in Undercloud Ceilometer - -UNDERCLOUD_CEILOMETER_SNMPD_PASSWORD=$(os-apply-config -m $TE_DATAFILE --key undercloud.ceilometer_snmpd_password --type raw --key-default '') -if [ -z "$UNDERCLOUD_CEILOMETER_SNMPD_PASSWORD" ]; then #nodocs - UNDERCLOUD_CEILOMETER_SNMPD_PASSWORD=$(os-make-password) -fi #nodocs - -## #. Create unique credentials:: - -### --end -# NOTE(tchaypo): We used to write these passwords in $CWD; so check to see -# if the file exists there first. As well as providing backwards -# compatibility, this allows for people to run multiple test environments on -# the same machine - just make sure to have a different directory for -# running the scripts for each different environment you wish to use. -# -# If we can't find the file in $CWD we look in the new default location. -if [ -e tripleo-overcloud-passwords ]; then - echo "Re-using existing passwords in $PWD/tripleo-overcloud-passwords" - # Add any new passwords since the file was generated - setup-overcloud-passwords tripleo-overcloud-passwords - source tripleo-overcloud-passwords -else -### --include - setup-overcloud-passwords $TRIPLEO_ROOT/tripleo-overcloud-passwords - source $TRIPLEO_ROOT/tripleo-overcloud-passwords -fi #nodocs - -## #. We need an environment file to store the parameters we're gonig to give -## heat.:: - -HEAT_ENV=${HEAT_ENV:-"${TRIPLEO_ROOT}/overcloud-env.json"} - -## #. Read the heat env in for updating.:: - -if [ -e "${HEAT_ENV}" ]; then -### --end - if [ "$(stat -c %a ${HEAT_ENV})" != "600" ]; then - echo "Error: Heat environment cache \"${HEAT_ENV}\" not set to permissions of 0600." -# We should exit 1 so all the users from before the permissions -# requirement dont have their HEAT_ENV files ignored in a nearly silent way - exit 1 - fi -### --include - ENV_JSON=$(cat "${HEAT_ENV}") -else - ENV_JSON='{"parameters":{}}' -fi - -## #. Set parameters we need to deploy a KVM cloud.:: - -NeutronControlPlaneID=$(neutron net-show ctlplane | grep ' id ' | awk '{print $4}') -ENV_JSON=$(jq '.parameters = { -"MysqlInnodbBufferPoolSize": 100 -} + .parameters + { -"AdminPassword": "'"${OVERCLOUD_ADMIN_PASSWORD}"'", -"AdminToken": "'"${OVERCLOUD_ADMIN_TOKEN}"'", -"CeilometerPassword": "'"${OVERCLOUD_CEILOMETER_PASSWORD}"'", -"CeilometerMeteringSecret": "'"${OVERCLOUD_CEILOMETER_SECRET}"'", -"CinderPassword": "'"${OVERCLOUD_CINDER_PASSWORD}"'", -"CloudName": "'"${OVERCLOUD_NAME}"'", -"GlancePassword": "'"${OVERCLOUD_GLANCE_PASSWORD}"'", -"HeatPassword": "'"${OVERCLOUD_HEAT_PASSWORD}"'", -"HeatStackDomainAdminPassword": "'"${OVERCLOUD_HEAT_STACK_DOMAIN_PASSWORD}"'", -"HypervisorNeutronPhysicalBridge": "'"${OVERCLOUD_HYPERVISOR_PHYSICAL_BRIDGE}"'", -"HypervisorNeutronPublicInterface": "'"${OVERCLOUD_HYPERVISOR_PUBLIC_INTERFACE}"'", -"NeutronBridgeMappings": "'"${OVERCLOUD_BRIDGE_MAPPINGS}"'", -"NeutronControlPlaneID": "'${NeutronControlPlaneID}'", -"NeutronFlatNetworks": "'"${OVERCLOUD_FLAT_NETWORKS}"'", -"NeutronPassword": "'"${OVERCLOUD_NEUTRON_PASSWORD}"'", -"NeutronPublicInterface": "'"${NeutronPublicInterface}"'", -"NeutronPublicInterfaceTag": "'"${NeutronPublicInterfaceTag}"'", -"NovaComputeLibvirtType": "'"${OVERCLOUD_LIBVIRT_TYPE}"'", -"NovaPassword": "'"${OVERCLOUD_NOVA_PASSWORD}"'", -"NtpServer": "'"${OVERCLOUD_NTP_SERVER}"'", -"SwiftHashSuffix": "'"${OVERCLOUD_SWIFT_HASH}"'", -"SwiftPassword": "'"${OVERCLOUD_SWIFT_PASSWORD}"'", -"SSLCertificate": "'"${OVERCLOUD_SSL_CERT}"'", -"SSLKey": "'"${OVERCLOUD_SSL_KEY}"'", -"OvercloudComputeFlavor": "'"${COMPUTE_FLAVOR}"'", -"OvercloudControlFlavor": "'"${CONTROL_FLAVOR}"'", -"OvercloudBlockStorageFlavor": "'"${BLOCKSTORAGE_FLAVOR}"'", -"OvercloudSwiftStorageFlavor": "'"${SWIFTSTORAGE_FLAVOR}"'" -}' <<< $ENV_JSON) - -### --end -if [ "$DEBUG_LOGGING" = "1" ]; then - ENV_JSON=$(jq '.parameters = .parameters + { - "Debug": "True", - }' <<< $ENV_JSON) -fi -### --include - - -## #. We enable the automatic relocation of L3 routers in Neutron by default, -## alternatively you can use the L3 agents high availability mechanism -## (only works with three or more controller nodes) or the distributed virtul -## routing mechanism (deploying routers on compute nodes). Set the environment -## variable ``OVERCLOUD_L3`` to ``relocate``, ``ha`` or ``dvr``. -## :: - -OVERCLOUD_L3=${OVERCLOUD_L3:-'relocate'} - -## #. If enabling distributed virtual routing on the overcloud, some values need -## to be set so that Neutron DVR will work. -## :: - -if [ ${OVERCLOUD_DISTRIBUTED_ROUTERS:-'False'} == "True" -o $OVERCLOUD_L3 == "dvr" ]; then - ENV_JSON=$(jq '.parameters = {} + .parameters + { - "NeutronDVR": "True", - "NeutronTunnelTypes": "vxlan", - "NeutronNetworkType": "vxlan", - "NeutronMechanismDrivers": "openvswitch,l2population", - "NeutronAllowL3AgentFailover": "False", - }' <<< $ENV_JSON) -fi - - -if [ ${OVERCLOUD_L3_HA:-'False'} == "True" -o $OVERCLOUD_L3 == "ha" ]; then - ENV_JSON=$(jq '.parameters = {} + .parameters + { - "NeutronL3HA": "True", - "NeutronAllowL3AgentFailover": "False", - }' <<< $ENV_JSON) -fi - -### --end -# Options we haven't documented as such -ENV_JSON=$(jq '.parameters = { -"ControlVirtualInterface": "'${OVERCLOUD_VIRTUAL_INTERFACE}'" -} + .parameters + { -"NeutronPublicInterfaceDefaultRoute": "'${NeutronPublicInterfaceDefaultRoute}'", -"NeutronPublicInterfaceIP": "'${NeutronPublicInterfaceIP}'", -"NeutronPublicInterfaceRawDevice": "'${NeutronPublicInterfaceRawDevice}'", -"SnmpdReadonlyUserPassword": "'${UNDERCLOUD_CEILOMETER_SNMPD_PASSWORD}'", -}' <<< $ENV_JSON) - -RESOURCE_REGISTRY= -RESOURCE_REGISTRY_PATH=${RESOURCE_REGISTRY_PATH:-"$TRIPLEO_ROOT/tripleo-heat-templates/overcloud-resource-registry.yaml"} -STEPFILE_PATH=${STEPFILE_PATH:-"$TRIPLEO_ROOT/tripleo-heat-templates/environments/overcloud-steps.yaml"} - -if [ "$USE_MERGEPY" -eq 0 ]; then - RESOURCE_REGISTRY="-e $RESOURCE_REGISTRY_PATH" - ENV_JSON=$(jq '.parameters = .parameters + { - "ControllerCount": '${OVERCLOUD_CONTROLSCALE}', - "ComputeCount": '${OVERCLOUD_COMPUTESCALE}' - }' <<< $ENV_JSON) - if [ -e "$TRIPLEO_ROOT/tripleo-heat-templates/cinder-storage.yaml" ]; then - ENV_JSON=$(jq '.parameters = .parameters + { - "BlockStorageCount": '${OVERCLOUD_BLOCKSTORAGESCALE}' - }' <<< $ENV_JSON) - fi - if [ "$WITH_STEPS" = "1" ]; then - RESOURCE_REGISTRY="$RESOURCE_REGISTRY -e $STEPFILE_PATH" - fi -fi - -CUSTOM_HEAT_ENVIRONMENT= -OVERCLOUD_CUSTOM_HEAT_ENV=${OVERCLOUD_CUSTOM_HEAT_ENV:-''} -if [ -n "$OVERCLOUD_CUSTOM_HEAT_ENV" ]; then - for NAME in $OVERCLOUD_CUSTOM_HEAT_ENV; do - CUSTOM_HEAT_ENVIRONMENT="$CUSTOM_HEAT_ENVIRONMENT -e $NAME" - done -fi - -### --include - -## #. Save the finished environment file.:: - -jq . > "${HEAT_ENV}" <<< $ENV_JSON -chmod 0600 "${HEAT_ENV}" - -## #. Add Keystone certs/key into the environment file.:: - -generate-keystone-pki --heatenv $HEAT_ENV - -## #. Deploy an overcloud:: - -## heat $HEAT_OP -e "$HEAT_ENV" \ -## -f $TRIPLEO_ROOT/tripleo-heat-templates/overcloud.yaml \ -## -P "ExtraConfig=${OVERCLOUD_EXTRA_CONFIG}" \ -## overcloud - -### --end - -if [ "$USE_MERGEPY" -eq 1 ]; then - make -C $TRIPLEO_ROOT/tripleo-heat-templates overcloud.yaml \ - COMPUTESCALE=$OVERCLOUD_COMPUTESCALE,${OVERCLOUD_COMPUTE_BLACKLIST:-} \ - CONTROLSCALE=$OVERCLOUD_CONTROLSCALE,${OVERCLOUD_CONTROL_BLACKLIST:-} \ - BLOCKSTORAGESCALE=$OVERCLOUD_BLOCKSTORAGESCALE - OVERCLOUD_TEMPLATE=$TRIPLEO_ROOT/tripleo-heat-templates/overcloud.yaml -else - OVERCLOUD_TEMPLATE=$TRIPLEO_ROOT/tripleo-heat-templates/overcloud-without-mergepy.yaml -fi - -# create stack with a 6 hour timeout, and allow wait_for_stack_ready -# to impose a realistic timeout. -heat $HEAT_OP -e "$HEAT_ENV" \ - -e $OVERCLOUD_IMAGE_IDS_ENV \ - $RESOURCE_REGISTRY \ - $CUSTOM_HEAT_ENVIRONMENT \ - -t 360 \ - -f "$OVERCLOUD_TEMPLATE" \ - -P "ExtraConfig=${OVERCLOUD_EXTRA_CONFIG}" \ - $STACKNAME - -### --include - -## You can watch the console via ``virsh``/``virt-manager`` to observe the PXE -## boot/deploy process. After the deploy is complete, the machines will reboot -## and be available. - -## #. While we wait for the stack to come up, build an end user disk image and -## register it with glance.:: - -USER_IMG_NAME="user.qcow2" -### --end -USE_CIRROS=${USE_CIRROS:-0} -if [ "$USE_CIRROS" != "0" ]; then - USER_IMG_NAME="user-cirros.qcow2" -fi - -TEST_IMAGE_DIB_EXTRA_ARGS=${TEST_IMAGE_DIB_EXTRA_ARGS:-''} -if [ ! -e $TRIPLEO_ROOT/$USER_IMG_NAME -o "$USE_CACHE" == "0" ] ; then - if [ "$USE_CIRROS" == "0" ] ; then -### --include - $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST vm $TEST_IMAGE_DIB_EXTRA_ARGS \ - -a $NODE_ARCH -o $TRIPLEO_ROOT/user 2>&1 | tee $TRIPLEO_ROOT/dib-user.log -### --end - else - VERSION=$($TRIPLEO_ROOT/diskimage-builder/elements/cache-url/bin/cache-url \ - http://download.cirros-cloud.net/version/released >(cat) 1>&2) - IMAGE_ID=cirros-${VERSION}-${NODE_ARCH/amd64/x86_64}-disk.img - MD5SUM=$($TRIPLEO_ROOT/diskimage-builder/elements/cache-url/bin/cache-url \ - http://download.cirros-cloud.net/${VERSION}/MD5SUMS >(cat) 1>&2 | awk "/$IMAGE_ID/ {print \$1}") - $TRIPLEO_ROOT/diskimage-builder/elements/cache-url/bin/cache-url \ - http://download.cirros-cloud.net/${VERSION}/${IMAGE_ID} $TRIPLEO_ROOT/$USER_IMG_NAME - pushd $TRIPLEO_ROOT - echo "$MD5SUM *$USER_IMG_NAME" | md5sum --check - - popd - fi -fi - -# If --with-steps is specified, we step through the deployment, waiting -# for user confirmation before proceeding, based on the heat hooks defined -# in tripleo-heat-templates/overcloud-steps.yaml -STEP_SLEEPTIME=${STEP_SLEEPTIME:-30} -STEP_NESTED_DEPTH=${STEP_NESTED_DEPTH:-5} -if [ "$WITH_STEPS" = "1" ]; then - set +x - while $(heat stack-show overcloud | grep stack_status | grep -q IN_PROGRESS) - do - HEADER_DONE=0 - HEADER_STR="| resource_name" - while read -r -u 3 line - do - if [[ $line =~ ^"$HEADER_STR" && $HEADER_DONE -eq 0 ]]; then - echo $line - HEADER_DONE=1 - fi - if [[ $line == *"paused until Hook"* ]]; then - echo -e "Hit hook, event:\n$line" - # Prompt for confirmation before continuing - read -p "To clear hook and continue, press \"y\"" -n 1 -r - echo - if [[ $REPLY =~ ^[Yy]$ ]]; then - HOOK_RSRC=$(echo $line | cut -d "|" -f2) - HOOK_STACK=$(echo $line | cut -d "|" -f7) - heat hook-clear $HOOK_STACK $HOOK_RSRC - fi - fi - done 3< <(heat hook-poll overcloud --nested-depth $STEP_NESTED_DEPTH) - echo "Waiting for hook to be reached" - sleep $STEP_SLEEPTIME - done - set -x -fi - -### --include -## #. Get the overcloud IP from the heat stack -## :: - -echo "Waiting for the overcloud stack to be ready" #nodocs -wait_for_stack_ready -w $(($OVERCLOUD_STACK_TIMEOUT * 60)) 10 $STACKNAME -OVERCLOUD_ENDPOINT=$(heat output-show $STACKNAME KeystoneURL|sed 's/^"\(.*\)"$/\1/') -OVERCLOUD_IP=$(echo $OVERCLOUD_ENDPOINT | awk -F '[/:]' '{print $4}') -### --end -# If we're forcing a specific public interface, we'll want to advertise that as -# the public endpoint for APIs. -if [ -n "$NeutronPublicInterfaceIP" ]; then - OVERCLOUD_IP=$(echo ${NeutronPublicInterfaceIP} | sed -e s,/.*,,) - OVERCLOUD_ENDPOINT="http://$OVERCLOUD_IP:5000/v2.0" -fi - -### --include - -## #. We don't (yet) preserve ssh keys on rebuilds. -## :: - -ssh-keygen -R $OVERCLOUD_IP - -## #. Export the overcloud endpoint and credentials to your test environment. -## :: - -NEW_JSON=$(jq '.overcloud.password="'${OVERCLOUD_ADMIN_PASSWORD}'" | .overcloud.endpoint="'${OVERCLOUD_ENDPOINT}'" | .overcloud.endpointhost="'${OVERCLOUD_IP}'"' $TE_DATAFILE) -echo $NEW_JSON > $TE_DATAFILE - -## #. Source the overcloud configuration:: - -source $TRIPLEO_ROOT/tripleo-incubator/overcloudrc - -## #. Exclude the overcloud from proxies:: - -set +u #nodocs -export no_proxy=$no_proxy,$OVERCLOUD_IP -set -u #nodocs - -## #. If we updated the cloud we don't need to do admin setup again - skip down to `Wait for Nova Compute`_. - - -if [ "stack-create" = "$HEAT_OP" ]; then #nodocs - -## #. Perform admin setup of your overcloud. -## :: - - init-keystone -o $OVERCLOUD_IP -t $OVERCLOUD_ADMIN_TOKEN \ - -e admin@example.com -p $OVERCLOUD_ADMIN_PASSWORD \ - ${SSLBASE:+-s $PUBLIC_API_URL} --no-pki-setup - # Creating these roles to be used by tenants using swift - openstack role create swiftoperator - openstack role create ResellerAdmin - setup-endpoints $OVERCLOUD_IP \ - --cinder-password $OVERCLOUD_CINDER_PASSWORD \ - --glance-password $OVERCLOUD_GLANCE_PASSWORD \ - --heat-password $OVERCLOUD_HEAT_PASSWORD \ - --neutron-password $OVERCLOUD_NEUTRON_PASSWORD \ - --nova-password $OVERCLOUD_NOVA_PASSWORD \ - --swift-password $OVERCLOUD_SWIFT_PASSWORD \ - --ceilometer-password $OVERCLOUD_CEILOMETER_PASSWORD \ - ${SSLBASE:+--ssl $PUBLIC_API_URL} - openstack role create heat_stack_user - user-config - BM_NETWORK_GATEWAY=$(OS_CONFIG_FILES=$TE_DATAFILE os-apply-config --key baremetal-network.gateway-ip --type raw --key-default '192.0.2.1') - OVERCLOUD_NAMESERVER=$(os-apply-config -m $TE_DATAFILE --key overcloud.nameserver --type netaddress --key-default "$OVERCLOUD_FIXED_RANGE_NAMESERVER") - NETWORK_JSON=$(mktemp) - jq "." < $NETWORK_JSON -{ - "float": { - "cidr": "$OVERCLOUD_FIXED_RANGE_CIDR", - "name": "default-net", - "nameserver": "$OVERCLOUD_NAMESERVER", - "segmentation_id": "$NeutronPublicInterfaceTag", - "physical_network": "datacentre", - "gateway": "$OVERCLOUD_FIXED_RANGE_GATEWAY" - }, - "external": { - "name": "ext-net", - "provider:network_type": "flat", - "provider:physical_network": "datacentre", - "cidr": "$FLOATING_CIDR", - "allocation_start": "$FLOATING_START", - "allocation_end": "$FLOATING_END", - "gateway": "$BM_NETWORK_GATEWAY" - } -} -EOF - setup-neutron -n $NETWORK_JSON - rm $NETWORK_JSON - -## #. If you want a demo user in your overcloud (probably a good idea). -## :: - - os-adduser -p $OVERCLOUD_DEMO_PASSWORD demo demo@example.com - -## #. Workaround https://bugs.launchpad.net/diskimage-builder/+bug/1211165. -## :: - - nova flavor-delete m1.tiny - nova flavor-create m1.tiny 1 512 2 1 - -## #. Register the end user image with glance. -## :: - - glance image-create --name user --visibility public --disk-format qcow2 \ - --container-format bare --file $TRIPLEO_ROOT/$USER_IMG_NAME - -fi #nodocs - -## #. _`Wait for Nova Compute` -## :: - -wait_for -w 300 --delay 10 -- nova service-list --binary nova-compute 2\>/dev/null \| grep 'enabled.*\ up\ ' - -## #. Wait for L2 Agent On Nova Compute -## :: - -wait_for -w 300 --delay 10 -- neutron agent-list -f csv -c alive -c agent_type -c host \| grep "\":-).*Open vSwitch agent.*-novacompute\"" #nodocs -## wait_for 30 10 neutron agent-list -f csv -c alive -c agent_type -c host \| grep "\":-).*Open vSwitch agent.*-novacompute\"" - -## #. Log in as a user. -## :: - -source $TRIPLEO_ROOT/tripleo-incubator/overcloudrc-user - -## #. If you just created the cloud you need to add your keypair to your user. -## :: - -if [ "stack-create" = "$HEAT_OP" ] ; then #nodocs - user-config - -## #. So that you can deploy a VM. -## :: - - IMAGE_ID=$(nova image-show user | awk '/ id / {print $4}') - nova boot --key-name default --flavor m1.tiny --block-device source=image,id=$IMAGE_ID,dest=volume,size=3,shutdown=preserve,bootindex=0 demo - -## #. Add an external IP for it. -## :: - - wait_for -w 50 --delay 5 -- neutron port-list -f csv -c id --quote none \| grep id - PORT=$(neutron port-list -f csv -c id --quote none | tail -n1) - FLOATINGIP=$(neutron floatingip-create ext-net \ - --port-id "${PORT//[[:space:]]/}" \ - | awk '$2=="floating_ip_address" {print $4}') - -## #. And allow network access to it. -## :: - - neutron security-group-rule-create default --protocol icmp \ - --direction ingress --port-range-min 8 - neutron security-group-rule-create default --protocol tcp \ - --direction ingress --port-range-min 22 --port-range-max 22 - -### --end -else - FLOATINGIP=$(neutron floatingip-list \ - --quote=none -f csv -c floating_ip_address | tail -n 1) - nova stop demo - sleep 5 - nova start demo -fi -### --include - -## #. After which, you should be able to ping it -## :: - -wait_for -w 300 --delay 10 -- ping -c 1 $FLOATINGIP - -### --end - -if [ -n "$ADMIN_USERS" ]; then - source $TRIPLEO_ROOT/tripleo-incubator/overcloudrc - assert-admin-users "$ADMIN_USERS" - assert-users "$ADMIN_USERS" -fi - -if [ -n "$USERS" ] ; then - source $TRIPLEO_ROOT/tripleo-incubator/overcloudrc - assert-users "$USERS" -fi diff --git a/scripts/devtest_overcloud_images.sh b/scripts/devtest_overcloud_images.sh deleted file mode 100755 index bbe86f44..00000000 --- a/scripts/devtest_overcloud_images.sh +++ /dev/null @@ -1,124 +0,0 @@ -#!/bin/bash - -set -eu -set -o pipefail -SCRIPT_NAME=$(basename $0) - -function show_options { - echo "Usage: $SCRIPT_NAME [options]" - echo - echo "Builds overcloud images using defined environment variables." - echo - echo "Options:" - echo " -h -- this help" - echo " -c -- re-use existing source/images if they exist." - exit $1 -} - -TEMP=$(getopt -o c,h,help -n $SCRIPT_NAME -- "$@") -if [ $? != 0 ] ; then - echo "Terminating..." >&2; - exit 1; -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -c) USE_CACHE=1; shift 1;; - -h | --help) show_options 0;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -USE_CACHE=${USE_CACHE:-0} -DIB_COMMON_ELEMENTS=${DIB_COMMON_ELEMENTS:-'stackuser'} -OVERCLOUD_CONTROL_DIB_ELEMENTS=${OVERCLOUD_CONTROL_DIB_ELEMENTS:-'ntp hosts baremetal boot-stack cinder-api ceilometer-collector ceilometer-api ceilometer-agent-central ceilometer-agent-notification ceilometer-alarm-notifier ceilometer-alarm-evaluator os-collect-config horizon neutron-network-node dhcp-all-interfaces swift-proxy swift-storage keepalived haproxy sysctl'} -OVERCLOUD_CONTROL_DIB_EXTRA_ARGS=${OVERCLOUD_CONTROL_DIB_EXTRA_ARGS:-'rabbitmq-server cinder-tgt'} -OVERCLOUD_COMPUTE_DIB_ELEMENTS=${OVERCLOUD_COMPUTE_DIB_ELEMENTS:-'ntp hosts baremetal nova-compute nova-kvm neutron-openvswitch-agent os-collect-config dhcp-all-interfaces sysctl'} -OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS=${OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS:-''} - -OVERCLOUD_BLOCKSTORAGE_DIB_ELEMENTS=${OVERCLOUD_BLOCKSTORAGE_DIB_ELEMENTS:-'ntp hosts baremetal os-collect-config dhcp-all-interfaces sysctl'} -OVERCLOUD_BLOCKSTORAGE_DIB_EXTRA_ARGS=${OVERCLOUD_BLOCKSTORAGE_DIB_EXTRA_ARGS:-'cinder-tgt'} -SSL_ELEMENT=${SSLBASE:+openstack-ssl} -TE_DATAFILE=${TE_DATAFILE:?"TE_DATAFILE must be defined before calling this script!"} - -if [ "${USE_MARIADB:-}" = 1 ] ; then - OVERCLOUD_CONTROL_DIB_EXTRA_ARGS="$OVERCLOUD_CONTROL_DIB_EXTRA_ARGS mariadb-rpm" - OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS="$OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS mariadb-dev-rpm" - OVERCLOUD_BLOCKSTORAGE_DIB_EXTRA_ARGS="$OVERCLOUD_BLOCKSTORAGE_DIB_EXTRA_ARGS mariadb-dev-rpm" -fi - -NODE_ARCH=$(os-apply-config -m $TE_DATAFILE --key arch --type raw) - -### --include -## devtest_overcloud_images -## ======================== -## Build images with environment variables. This script works best -## when using tripleo-image-elements for Overcloud configuration. - -## #. Undercloud UI needs SNMPd for monitoring of every Overcloud node -## :: - -if [ "$USE_UNDERCLOUD_UI" -ne 0 ] ; then - OVERCLOUD_CONTROL_DIB_EXTRA_ARGS="$OVERCLOUD_CONTROL_DIB_EXTRA_ARGS snmpd" - OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS="$OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS snmpd" - OVERCLOUD_BLOCKSTORAGE_DIB_EXTRA_ARGS="$OVERCLOUD_BLOCKSTORAGE_DIB_EXTRA_ARGS snmpd" -fi - -## #. Create your overcloud control plane image. - -## ``$OVERCLOUD_*_DIB_EXTRA_ARGS`` (CONTROL, COMPUTE, BLOCKSTORAGE) are -## meant to be used to pass additional build-time specific arguments to -## ``disk-image-create``. - -## ``$SSL_ELEMENT`` is used when building a cloud with SSL endpoints - it should be -## set to openstack-ssl in that situation. -## :: - -if [ ! -e $TRIPLEO_ROOT/overcloud-control.qcow2 -o "$USE_CACHE" == "0" ] ; then - $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST \ - -a $NODE_ARCH -o $TRIPLEO_ROOT/overcloud-control \ - $OVERCLOUD_CONTROL_DIB_ELEMENTS \ - $DIB_COMMON_ELEMENTS $OVERCLOUD_CONTROL_DIB_EXTRA_ARGS ${SSL_ELEMENT:-} 2>&1 | \ - tee $TRIPLEO_ROOT/dib-overcloud-control.log -fi - -## #. Create your block storage image if some block storage nodes are to be used. This -## is the image the undercloud deploys for the additional cinder-volume nodes. -## :: - -if [ ${OVERCLOUD_BLOCKSTORAGESCALE:-0} -gt 0 ]; then - if [ ! -e $TRIPLEO_ROOT/overcloud-cinder-volume.qcow2 -o "$USE_CACHE" == "0" ]; then - $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST \ - -a $NODE_ARCH -o $TRIPLEO_ROOT/overcloud-cinder-volume \ - $OVERCLOUD_BLOCKSTORAGE_DIB_ELEMENTS $DIB_COMMON_ELEMENTS \ - $OVERCLOUD_BLOCKSTORAGE_DIB_EXTRA_ARGS 2>&1 | \ - tee $TRIPLEO_ROOT/dib-overcloud-cinder-volume.log - fi -fi - -## If enabling distributed virtual routing for Neutron on the overcloud the compute node -## must have the ``neutron-router`` element installed. -## :: - -OVERCLOUD_DISTRIBUTED_ROUTERS=${OVERCLOUD_DISTRIBUTED_ROUTERS:-'False'} -OVERCLOUD_L3=${OVERCLOUD_L3:-'relocate'} -if [ $OVERCLOUD_DISTRIBUTED_ROUTERS == "True" -o $OVERCLOUD_L3 == "dvr" ]; then - OVERCLOUD_COMPUTE_DIB_ELEMENTS="$OVERCLOUD_COMPUTE_DIB_ELEMENTS neutron-router" -fi - -## #. Create your overcloud compute image. This is the image the undercloud -## deploys to host the overcloud Nova compute hypervisor components. -## :: - -if [ ! -e $TRIPLEO_ROOT/overcloud-compute.qcow2 -o "$USE_CACHE" == "0" ]; then - $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST \ - -a $NODE_ARCH -o $TRIPLEO_ROOT/overcloud-compute \ - $OVERCLOUD_COMPUTE_DIB_ELEMENTS $DIB_COMMON_ELEMENTS \ - $OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS 2>&1 | \ - tee $TRIPLEO_ROOT/dib-overcloud-compute.log -fi -### --end diff --git a/scripts/devtest_ramdisk.sh b/scripts/devtest_ramdisk.sh deleted file mode 100755 index 06a02b2d..00000000 --- a/scripts/devtest_ramdisk.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash - -set -eu -set -o pipefail -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -function show_options { - echo "Usage: $SCRIPT_NAME [options]" - echo - echo "Build a baremetal deployment ramdisk." - echo - echo "Options:" - echo " -h -- this help" - echo - exit $1 -} - -TEMP=$(getopt -o h -l help -n $SCRIPT_NAME -- "$@") -if [ $? != 0 ]; then - echo "Terminating..." >&2; - exit 1; -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -h | --help) show_options 0;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -set -x -USE_CACHE=${USE_CACHE:-0} -DIB_COMMON_ELEMENTS=${DIB_COMMON_ELEMENTS:-'stackuser'} - -### --include -## devtest_ramdisk -## =============== - -## Deploy Ramdisk creation -## ----------------------- - - -## #. Create a deployment ramdisk + kernel. These are used by the seed cloud and -## the undercloud for deployment to bare metal. -## :: - -### --end -NODE_ARCH=$(os-apply-config -m $TE_DATAFILE --key arch) -if [ ! -e $TRIPLEO_ROOT/$DEPLOY_NAME.kernel -o \ - ! -e $TRIPLEO_ROOT/$DEPLOY_NAME.initramfs -o \ - "$USE_CACHE" == "0" ] ; then -### --include - $TRIPLEO_ROOT/diskimage-builder/bin/ramdisk-image-create -a $NODE_ARCH \ - $NODE_DIST $DEPLOY_IMAGE_ELEMENT -o $TRIPLEO_ROOT/$DEPLOY_NAME \ - $DIB_COMMON_ELEMENTS 2>&1 | \ - tee $TRIPLEO_ROOT/dib-deploy.log -### --end -fi diff --git a/scripts/devtest_seed.sh b/scripts/devtest_seed.sh deleted file mode 100755 index ed9cc3f9..00000000 --- a/scripts/devtest_seed.sh +++ /dev/null @@ -1,437 +0,0 @@ -#!/bin/bash - -set -eu -set -o pipefail -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -PATH=$PATH:/usr/sbin:/sbin - -function show_options { - echo "Usage: $SCRIPT_NAME [options]" - echo - echo "Deploys a baremetal cloud via virsh." - echo - echo "Options:" - echo " -h -- this help" - echo " -c -- re-use existing source/images if they exist." - echo " --build-only -- build the needed images but don't deploy them." - echo " --debug-logging -- Turn on debug logging in the seed. Sets both the" - echo " OS_DEBUG_LOGGING env var and the debug environment" - echo " json values." - echo " --all-nodes -- use all the nodes in the testenv rather than" - echo " just the first one." - echo - exit $1 -} - -BUILD_ONLY= -DEBUG_LOGGING= - -TEMP=$(getopt -o c,h -l all-nodes,build-only,debug-logging,help -n $SCRIPT_NAME -- "$@") -if [ $? != 0 ]; then - echo "Terminating..." >&2 - exit 1 -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - --all-nodes) ALL_NODES="true"; shift 1;; - -c) SEED_USE_CACHE=1; shift 1;; - --build-only) BUILD_ONLY="--build-only"; shift 1;; - --debug-logging) - DEBUG_LOGGING="seed-debug-logging" - export OS_DEBUG_LOGGING="1" - shift 1 - ;; - -h | --help) show_options 0;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -set -x -USE_CACHE=${USE_CACHE:-0} - -# SEED_USE_CACHE can be set independently of the global USE_CACHE -# This is useful if you want to rebuild your seed, but reuse the -# cached overcloud images. Do this via SEED_USE_CACHE=0 with -# the global USE_CACHE=1. Note this is only overriding the local -# USE_CACHE variable, not what is set in the environment. -USE_CACHE=${SEED_USE_CACHE:-$USE_CACHE} - -### --include -## devtest_seed -## ============ - - - -## #. Create and start your seed VM. This script invokes diskimage-builder with -## suitable paths and options to create and start a VM that contains an -## all-in-one OpenStack cloud with the baremetal driver enabled, and -## preconfigures it for a development environment. Note that the seed has -## minimal variation in it's configuration: the goal is to bootstrap with -## a known-solid config. -## :: - -cd $TRIPLEO_ROOT/tripleo-image-elements/elements/seed-stack-config - -## #. Ironic and Nova-Baremetal require different metadata to operate. -## :: - -# Unsets .nova.baremetal as it's unused. -# TODO replace "baremetal": {} with del(.baremetal) when jq 1.3 is widely available. -# Sets: -# - ironic.virtual_power_ssh_key. -# - nova.compute_driver to ironic.nova.virt.ironic.driver.IronicDriver. -# - nova.compute_manager to avoid race conditions on ironic startup. -jq -s ' - .[1] as $config - | .[0] - | . + { - "ironic": (.ironic + { - "virtual_power_ssh_key": $config["ssh-key"], - }), - "nova": (.nova + { - "baremetal": {}, - "compute_driver": "nova.virt.ironic.driver.IronicDriver", - "compute_manager": "ironic.nova.compute.manager.ClusteredComputeManager", - "scheduler_host_manager": "nova.scheduler.ironic_host_manager.IronicHostManager", - }) - }' config.json $TE_DATAFILE > tmp_local.json - -# Add Keystone certs/key into the environment file -generate-keystone-pki --heatenv tmp_local.json -s - -# Get details required to set-up a callback heat call back from the seed from os-collect-config. -HOST_IP=$(os-apply-config -m $TE_DATAFILE --key host-ip --type netaddress --key-default '192.168.122.1') -COMP_IP=$(ip route get "$HOST_IP" | awk '/'"$HOST_IP"'/ {print $NF}') - -SEED_COMP_PORT="${SEED_COMP_PORT:-27410}" -SEED_IMAGE_ID="${SEED_IMAGE_ID:-seedImageID}" - -# Firewalld interferes with our seed completion signal -if systemctl status firewalld; then - if ! sudo firewall-cmd --list-ports | grep "$SEED_COMP_PORT/tcp"; then - echo 'Firewalld is running and the seed completion port is not open.' - echo 'To continue you must either stop firewalld or open the port with:' - echo "sudo firewall-cmd --add-port=$SEED_COMP_PORT/tcp" - exit 1 - fi -fi - -# Apply custom BM network settings to the seeds local.json config -# Because the seed runs under libvirt and usually isn't in routing tables for -# access to the networks behind it, we setup masquerading for the bm networks, -# which permits outbound access from the machines we've deployed. -# If the seed is not the router (e.g. real machines are being used) then these -# rules are harmless. -BM_NETWORK_CIDR=$(os-apply-config -m $TE_DATAFILE --key baremetal-network.cidr --type raw --key-default '192.0.2.0/24') -BM_VLAN_SEED_TAG=$(os-apply-config -m $TE_DATAFILE --key baremetal-network.seed.public_vlan.tag --type netaddress --key-default '') -BM_VLAN_SEED_IP=$(os-apply-config -m $TE_DATAFILE --key baremetal-network.seed.public_vlan.ip --type netaddress --key-default '') -if [ -n "$BM_VLAN_SEED_IP" ]; then - BM_VLAN_SEED_IP_ADDR=$(python -c "import netaddr; print netaddr.IPNetwork('$BM_VLAN_SEED_IP').ip") - BM_VLAN_SEED_IP_CIDR=$(python -c "import netaddr; print '%s/%s' % (netaddr.IPNetwork('$BM_VLAN_SEED_IP').network, netaddr.IPNetwork('$BM_VLAN_SEED_IP').prefixlen)") - echo "{ \"ovs\": {\"public_interface_tag\": \"${BM_VLAN_SEED_TAG}\", \"public_interface_tag_ip\": \"${BM_VLAN_SEED_IP}\"}, \"masquerade\": [\"${BM_VLAN_SEED_IP}\"] }" > bm-vlan.json -else - echo "{ \"ovs\": {}, \"masquerade\": [] }" > bm-vlan.json -fi -BM_BRIDGE_ROUTE=$(jq -r '.["baremetal-network"].seed.physical_bridge_route // {}' $TE_DATAFILE) -BM_CTL_ROUTE_PREFIX=$(jq -r '.["baremetal-network"].seed.physical_bridge_route.prefix // ""' $TE_DATAFILE) -BM_CTL_ROUTE_VIA=$(jq -r '.["baremetal-network"].seed.physical_bridge_route.via // ""' $TE_DATAFILE) -jq -s ' - .[1]["baremetal-network"] as $bm - | ($bm.seed.ip // "192.0.2.1") as $bm_seed_ip - | .[2] as $bm_vlan - | .[3] as $bm_bridge_route - | .[0] - | . + { - "local-ipv4": $bm_seed_ip, - "completion-signal": ("http://'"${COMP_IP}"':'"${SEED_COMP_PORT}"'"), - "instance-id": "'"${SEED_IMAGE_ID}"'", - "bootstack": (.bootstack + { - "public_interface_ip": ($bm_seed_ip + "/'"${BM_NETWORK_CIDR##*/}"'"), - "masquerade_networks": ([$bm.cidr // "192.0.2.0/24"] + $bm_vlan.masquerade) - }), - "heat": (.heat + { - "watch_server_url": ("http://" + $bm_seed_ip + ":8003"), - "waitcondition_server_url": ("http://" + $bm_seed_ip + ":8000/v1/waitcondition"), - "metadata_server_url": ("http://" + $bm_seed_ip + ":8000") - }), - "neutron": (.neutron + { - "ovs": (.neutron.ovs + $bm_vlan.ovs + {"local_ip": $bm_seed_ip } + { - "physical_bridge_route": $bm_bridge_route - }) - }) -}' tmp_local.json $TE_DATAFILE bm-vlan.json <(echo "$BM_BRIDGE_ROUTE") > local.json -rm tmp_local.json -rm bm-vlan.json - -### --end -# If running in a CI environment then the user and ip address should be read -# from the json describing the environment -REMOTE_OPERATIONS=$(os-apply-config -m $TE_DATAFILE --key remote-operations --type raw --key-default '') -if [ -n "$REMOTE_OPERATIONS" ] ; then - SSH_USER=$(os-apply-config -m $TE_DATAFILE --key ssh-user --type raw --key-default 'root') - sed -i "s/\"192.168.122.1\"/\"$HOST_IP\"/" local.json - sed -i "s/\"user\": \".*\?\",/\"user\": \"$SSH_USER\",/" local.json -fi -### --include - -NODE_ARCH=$(os-apply-config -m $TE_DATAFILE --key arch --type raw) - -## #. If you are only building disk images, there is no reason to boot the -## seed VM. Instead, pass ``--build-only`` to tell boot-seed-vm not to boot -## the vm it builds. - -## If you want to use a previously built image rather than building a new -## one, passing ``-c`` will boot the existing image rather than creating -## a new one. - -## :: - -cd $TRIPLEO_ROOT -## boot-seed-vm -a $NODE_ARCH $NODE_DIST neutron-dhcp-agent -### --end -if [ "$USE_CACHE" == "0" ] ; then - CACHE_OPT= -else - CACHE_OPT="-c" -fi -boot-seed-vm $CACHE_OPT $BUILD_ONLY -a $NODE_ARCH $NODE_DIST $DEBUG_LOGGING neutron-dhcp-agent 2>&1 | \ - tee $TRIPLEO_ROOT/dib-seed.log - -if [ -n "${BUILD_ONLY}" ]; then - exit 0 -fi -### --include - -## #. If you're just building images, you're done with this script. Move on -## to :doc:`devtest_undercloud` - -## ``boot-seed-vm`` will start a VM containing your SSH key for the root user. -## -## The IP address of the VM's eth0 is printed out at the end of boot-seed-vm, or -## you can query the testenv json which is updated by boot-seed-vm:: - -SEED_IP=$(os-apply-config -m $TE_DATAFILE --key seed-ip --type netaddress) - -## #. Add a route to the baremetal bridge via the seed node (we do this so that -## your host is isolated from the networking of the test environment. -## We only add this route if the baremetal seed IP is used as the -## gateway (the route is typically not required if you are using -## a pre-existing baremetal network) -## :: - -# These are not persistent, if you reboot, re-run them. - -BM_NETWORK_SEED_IP=$(os-apply-config -m $TE_DATAFILE --key baremetal-network.seed.ip --type raw --key-default '192.0.2.1') -BM_NETWORK_GATEWAY=$(os-apply-config -m $TE_DATAFILE --key baremetal-network.gateway-ip --type raw --key-default '192.0.2.1') -if [ $BM_NETWORK_GATEWAY = $BM_NETWORK_SEED_IP -o $BM_NETWORK_GATEWAY = ${BM_VLAN_SEED_IP_ADDR:-''} ]; then - ROUTE_DEV=$(os-apply-config -m $TE_DATAFILE --key seed-route-dev --type netdevice --key-default virbr0) - sudo ip route replace $BM_NETWORK_CIDR dev $ROUTE_DEV via $SEED_IP - if [ -n "$BM_VLAN_SEED_IP" ]; then - sudo ip route replace $BM_VLAN_SEED_IP_CIDR via $SEED_IP - fi -fi - -## #. Mask the seed API endpoint out of your proxy settings -## :: - -set +u #nodocs -export no_proxy=$no_proxy,$BM_NETWORK_SEED_IP -set -u #nodocs - -## #. If you downloaded a pre-built seed image you will need to log into it -## and customise the configuration within it. See footnote [#f1]_.) -## -## #. Setup a prompt clue so you can tell what cloud you have configured. -## (Do this once). -## :: -## -## source $TRIPLEO_ROOT/tripleo-incubator/cloudprompt - -## #. Source the client configuration for the seed cloud. -## :: - -source $TRIPLEO_ROOT/tripleo-incubator/seedrc - -## #. Perform setup of your seed cloud. -## :: - -echo "Waiting for seed node to configure br-ctlplane..." #nodocs - -# Listen on SEED_COMP_PORT for a callback from os-collect-config. This is -# similar to how Heat waits, but Heat does not run on the seed. -timeout 480 sh -c 'printf "HTTP/1.0 200 OK\r\n\r\n\r\n" | nc -l '"$COMP_IP"' '"$SEED_COMP_PORT"' | grep '"$SEED_IMAGE_ID" - -# Wait for network -wait_for -w 20 --delay 1 -- ping -c 1 $BM_NETWORK_SEED_IP - -# If ssh-keyscan fails to connect, it returns 0. So grep to see if it succeeded -ssh-keyscan -t rsa $BM_NETWORK_SEED_IP | tee -a ~/.ssh/known_hosts | grep -q "^$BM_NETWORK_SEED_IP ssh-rsa " - -init-keystone -o $BM_NETWORK_SEED_IP -t unset -e admin@example.com -p unset --no-pki-setup -setup-endpoints $BM_NETWORK_SEED_IP --glance-password unset --heat-password unset --neutron-password unset --nova-password unset --ironic-password unset -openstack role create heat_stack_user -# Creating these roles to be used by tenants using swift -openstack role create swiftoperator -openstack role create ResellerAdmin - -echo "Waiting for nova to initialise..." -wait_for -w 500 --delay 10 -- nova list -user-config - -echo "Waiting for Nova Compute to be available" -wait_for -w 300 --delay 10 -- nova service-list --binary nova-compute 2\>/dev/null \| grep 'enabled.*\ up\ ' -echo "Waiting for neutron API and L2 agent to be available" -wait_for -w 300 --delay 10 -- neutron agent-list -f csv -c alive -c agent_type -c host \| grep "\":-).*Open vSwitch agent.*\"" #nodocs - -BM_NETWORK_SEED_RANGE_START=$(os-apply-config -m $TE_DATAFILE --key baremetal-network.seed.range-start --type raw --key-default '192.0.2.2') -BM_NETWORK_SEED_RANGE_END=$(os-apply-config -m $TE_DATAFILE --key baremetal-network.seed.range-end --type raw --key-default '192.0.2.20') - -if [ -n "$BM_VLAN_SEED_TAG" ]; then - # With a public VLAN, the gateway address is on the public LAN. - CTL_GATEWAY= -else - CTL_GATEWAY=$BM_NETWORK_GATEWAY -fi - -SEED_NAMESERVER=$(os-apply-config -m $TE_DATAFILE --key seed.nameserver --type netaddress --key-default "${SEED_NAMESERVER:-}") -NETWORK_JSON=$(mktemp) -jq "." < $NETWORK_JSON -{ - "physical": { - "gateway": "$CTL_GATEWAY", - "metadata_server": "$BM_NETWORK_SEED_IP", - "cidr": "$BM_NETWORK_CIDR", - "allocation_start": "$BM_NETWORK_SEED_RANGE_START", - "allocation_end": "$BM_NETWORK_SEED_RANGE_END", - "name": "ctlplane", - "nameserver": "$SEED_NAMESERVER" - } -} -EOF -if [ -n "$BM_CTL_ROUTE_PREFIX" -a -n "$BM_CTL_ROUTE_VIA" ]; then - EXTRA_ROUTE="{\"destination\": \"$BM_CTL_ROUTE_PREFIX\", \"nexthop\": \"$BM_CTL_ROUTE_VIA\"}" - TMP_NETWORK=$(mktemp) - jq ".[\"physical\"][\"extra_routes\"]=[$EXTRA_ROUTE]" < $NETWORK_JSON > $TMP_NETWORK - mv $TMP_NETWORK $NETWORK_JSON -fi -setup-neutron -n $NETWORK_JSON -rm $NETWORK_JSON -# Is there a public network as well? If so configure it. -if [ -n "$BM_VLAN_SEED_TAG" ]; then - BM_VLAN_SEED_START=$(jq -r '.["baremetal-network"].seed.public_vlan.start' $TE_DATAFILE) - BM_VLAN_SEED_END=$(jq -r '.["baremetal-network"].seed.public_vlan.finish' $TE_DATAFILE) - BM_VLAN_SEED_TAG=$(jq -r '.["baremetal-network"].seed.public_vlan.tag' $TE_DATAFILE) - - PUBLIC_NETWORK_JSON=$(mktemp) - jq "." < $PUBLIC_NETWORK_JSON -{ - "physical": { - "gateway": "$BM_NETWORK_GATEWAY", - "metadata_server": "$BM_NETWORK_SEED_IP", - "cidr": "$BM_VLAN_SEED_IP_CIDR", - "allocation_start": "$BM_VLAN_SEED_START", - "allocation_end": "$BM_VLAN_SEED_END", - "name": "public", - "nameserver": "$SEED_NAMESERVER", - "segmentation_id": "$BM_VLAN_SEED_TAG", - "physical_network": "ctlplane", - "enabled_dhcp": false - } -} -EOF - setup-neutron -n $PUBLIC_NETWORK_JSON - rm $PUBLIC_NETWORK_JSON -fi - -## #. Nova quota runs up with the defaults quota so overide the default to -## allow unlimited cores, instances and ram. -## :: - -nova quota-update --cores -1 --instances -1 --ram -1 $(openstack project show admin | awk '$2=="id" {print $4}') - - -## #. Register "bare metal" nodes with nova and setup Nova baremetal flavors. -## When using VMs Nova will PXE boot them as though they use physical -## hardware. -## If you want to create the VM yourself see footnote [#f2]_ for details -## on its requirements. -## If you want to use real baremetal see footnote [#f3]_ for details. -## If you are building an undercloud, register only the first node. -## :: - -if [ -z "${ALL_NODES:-}" ]; then #nodocs - setup-baremetal --service-host seed --nodes <(jq '[.nodes[0]]' $TE_DATAFILE) -else #nodocs - -## Otherwise, if you are skipping the undercloud, you should register all -## the nodes.:: - - setup-baremetal --service-host seed --nodes <(jq '.nodes' $TE_DATAFILE) -fi #nodocs - -## If you need to collect the MAC address separately, see ``scripts/get-vm-mac``. - -## .. rubric:: Footnotes -## -## .. [#f1] Customize a downloaded seed image. -## -## If you downloaded your seed VM image, you may need to configure it. -## Setup a network proxy, if you have one (e.g. 192.168.2.1 port 8080) -## :: -## -## # Run within the image! -## echo << EOF >> ~/.profile -## export no_proxy=192.0.2.1 -## export http_proxy=http://192.168.2.1:8080/ -## EOF -## -## Add an ~/.ssh/authorized_keys file. The image rejects password authentication -## for security, so you will need to ssh out from the VM console. Even if you -## don't copy your authorized_keys in, you will still need to ensure that -## /home/stack/.ssh/authorized_keys on your seed node has some kind of -## public SSH key in it, or the openstack configuration scripts will error. -## -## You can log into the console using the username 'stack' password 'stack'. -## -## .. [#f2] Requirements for the "baremetal node" VMs -## -## If you don't use create-nodes, but want to create your own VMs, here are some -## suggestions for what they should look like. -## -## * each VM should have 1 NIC -## * eth0 should be on brbm -## * record the MAC addresses for the NIC of each VM. -## * give each VM no less than 2GB of disk, and ideally give them -## more than NODE_DISK, which defaults to 20GB -## * 1GB RAM is probably enough (512MB is not enough to run an all-in-one -## OpenStack), and 768M isn't enough to do repeated deploys with. -## * if using KVM, specify that you will install the virtual machine via PXE. -## This will avoid KVM prompting for a disk image or installation media. -## -## .. [#f3] Notes when using real bare metal -## -## If you want to use real bare metal see the following. -## -## * When calling setup-baremetal you can set the MAC, IP address, user, -## and password parameters which should all be space delemited lists -## that correspond to the MAC addresses and power management commands -## your real baremetal machines require. See scripts/setup-baremetal -## for details. -## -## * If you see over-mtu packets getting dropped when iscsi data is copied -## over the control plane you may need to increase the MTU on your brbm -## interfaces. Symptoms that this might be the cause include: -## :: -## -## iscsid: log shows repeated connection failed errors (and reconnects) -## dmesg shows: -## openvswitch: vnet1: dropped over-mtu packet: 1502 > 1500 -## -### --end diff --git a/scripts/devtest_setup.sh b/scripts/devtest_setup.sh deleted file mode 100755 index 34faed2d..00000000 --- a/scripts/devtest_setup.sh +++ /dev/null @@ -1,353 +0,0 @@ -#!/bin/bash -# -# Idempotent one-time setup for devtest. -# This can be run for CI purposes, by passing --trash-my-machine to it. -# Without that parameter, the script will error. -set -eux -set -o pipefail -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -function show_options { - echo "Usage: $SCRIPT_NAME [options]" - echo - echo "Setup the TripleO devtest environment." - echo - echo "Options:" - echo " --trash-my-machine -- make nontrivial destructive changes to the machine." - echo " For details read the source." - echo " -c -- re-use existing source/images if they exist." - echo - exit $1 -} - -CONTINUE=0 -USE_CACHE=${USE_CACHE:-0} - -TEMP=`getopt -o h,c -l trash-my-machine -n $SCRIPT_NAME -- "$@"` -if [ $? != 0 ]; then - echo "Terminating..." >&2; - exit 1; -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - --trash-my-machine) CONTINUE=1; shift 1;; - -c) USE_CACHE=1; shift 1;; - -h) show_options 0;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -if [ "0" = "$CONTINUE" ]; then - echo "Not running - this script is destructive and requires --trash-my-machine to run." >&2 - exit 1 -fi - -### --include -## devtest_setup -## ============= - -## Configuration -## ------------- - -## The seed instance expects to run with its eth0 connected to the outside world, -## via whatever IP range you choose to setup. You can run NAT, or not, as you -## choose. This is how we connect to it to run scripts etc - though you can -## equally log in on its console if you like. - -## We use flat networking with all machines on one broadcast domain for dev-test. - -## The eth1 of your seed instance should be connected to your bare metal cloud -## LAN. The seed VM uses this network to bringing up nodes, and does its own -## DHCP etc, so do not connect it to a network -## shared with other DHCP servers or the like. The instructions in this document -## create a bridge device ('brbm') on your machine to emulate this with virtual -## machine 'bare metal' nodes. - - -## NOTE: We recommend using an apt/HTTP proxy and setting the http_proxy -## environment variable accordingly in order to speed up the image build -## times. See footnote [#f3]_ to set up Squid proxy. - -## NOTE: Likewise, setup a pypi mirror and use the pypi element, or use the -## pip-cache element. (See diskimage-builder documentation for both of -## these). Add the relevant element name to the DIB_COMMON_ELEMENTS -## variable. - -## .. _devtest-environment-configuration: - -## Devtest test environment configuration -## -------------------------------------- - -## Devtest uses a JSON file to describe the test environment that OpenStack will -## run within. The JSON file path is given by $TE_DATAFILE. The JSON file contains -## the following keys: - -## #. arch: The CPU arch which Nova-BM nodes will be registered with. -## This must be consistent when VM's are created (in devtest_testenv.sh) -## and when disk images are created (in devtest_seed / undercloud / -## overcloud. The images are controlled by this testenv key, and VMs -## are created by the same code that sets this key in the test environment -## description, so you should only need to change/set it once, when creating -## the test environment. We use 32-bit by default for the reduced memory -## footprint. If you are running on real hardware, or want to test with -## 64-bit arch, replace i386 => amd64 in all the commands below. You will of -## course need amd64 capable hardware to do this. - -## #. host-ip: The IP address of the host which will run the seed VM using virsh. - -## #. seed-ip: The IP address of the seed VM (if known). If not known, it is -## looked up locally in the ARP table. - -## #. ssh-key: The private part of an SSH key to be used when performing virsh -## commands on $host-ip. - -## #. ssh-user: The SSH username to use when performing virsh commands on -## $host-ip. - -## #. nodes: A list of node metadata. Each node has "memory" in MiB, "cpu" in -## threads, "arch" (one of i386/amd64/etc), "disk" in GiB, a list of MAC -## addresses for the node, and "pm_type", "pm_user", "pm_addr", and -## "pm_password" fields. Future iterations may add more Ironic power and -## deploy driver selections here. - -## See the `os-cloud-config documentation -## `_ -## for a sample - -## #. baremetal-network: A mapping of metadata describing the bare metal cloud -## network. This is a flat network which is used to bring up nodes via -## DHCP and transfer images. By default the rfc5735 TEST-NET-1 range - -## 192.0.2.0/24 is used. The following fields are available (along -## with the default values for each field): -## :: - -## { -## "cidr": "192.0.2.0/24", -## "gateway-ip": "192.0.2.1", -## "seed": { -## "ip": "192.0.2.1", -## "range-start": "192.0.2.2", -## "range-end": "192.0.2.20", -## "physical_bridge_route": (null), -## "public_vlan": (null) -## }, -## "undercloud": { -## "range-start": "192.0.2.21", -## "range-end": "192.0.2.40", -## "public_vlan": (null) -## } -## } - -## The physical_bridge_route and public_vlan keys default to absent, which -## is suitable for a flat networking environment. When exterior access will -## be on a vlan they should be filled out. For instance, if TEST-NET-2 were -## our exterior subnet on VLAN 10, we might have the following as our -## baremetal network, to use a baremetal router on .1, the seed on .2, and a -## handful of addresses for both the seed and the undercloud dhcp pools. We -## would also expect a route to the IPMI network to allow control of machines. -## The gateway IP and physical_bridge_route if specified are also put into the -## initial network definitions created by the _seed script, and so are -## accessible via DHCP to the undercloud instances (and likewise overcloud). -## :: - -## { -## "cidr": "192.0.2.0/25", -## "gateway-ip": "198.51.100.1", -## "seed": { -## "ip": "192.0.2.1", -## "range-start": "192.0.2.2", -## "range-end": "192.0.2.20", -## "physical_bridge_route": { -## "prefix": "192.0.2.0/24", -## "via": "192.0.2.126" -## }, -## "public_vlan": { -## "tag": 10, -## "ip": "198.51.100.2/24", -## "start": "198.51.100.3", -## "finish": "198.51.100.10" -## } -## }, -## "undercloud": { -## "range-start": "192.0.2.21", -## "range-end": "192.0.2.40", -## "public_vlan": { -## "start": "198.51.100.11", -## "finish": "198.51.100.20" -## } -## } -## } - -## #. power_manager: The class path for a Nova Baremetal power manager. -## Note that this is specific to operating with Nova Baremetal and is ignored -## for use with Ironic. However, since this describes the test environment, -## not the code under test, it should always be present while we support -## using Nova Baremetal. - -## #. seed-route-dev: What device to route traffic for the initial undercloud -## network. As our test network is unrouteable we require an explicit device -## to avoid accidentally routing it onto live networks. Defaults to virbr0. - -## #. remote-operations: Whether to operate on the local machine only, or -## perform remote operations when starting VMs and copying disk images. -## A non-empty string means true, the default is '', which means false. - -## #. remote-host: If the test environment is on a remote host, this may be -## set to the host name of the remote host. It is intended to help -## provide valuable debug information about where devtest is hosted. - -## #. env-num: An opaque key used by the test environment hosts for identifying -## which environment seed images are being copied into. - -## #. undercloud: an object with metadata for connecting to the undercloud in -## the environment. - -## #. undercloud.password: The password for the currently deployed undercloud. - -## #. undercloud.endpoint: The Keystone endpoint URL for the undercloud. - -## #. undercloud.endpointhost: The host of the endpoint - used for noproxy settings. - -## #. overcloud: an object with metadata for connecting to the overcloud in -## the environment. - -## #. overcloud.password: The admin password for the currently deployed overcloud. - -## #. overcloud.endpoint: The Keystone endpoint URL for the overcloud. - -## #. overcloud.endpointhost: The host of the endpoint - used for noproxy settings. - -## XXX: We're currently migrating to that structure - some code still uses -## environment variables instead. - -## Detailed instructions -## --------------------- - -## **(Note: all of the following commands should be run on your host machine, not inside the seed VM)** - -## #. Before you start, check to see that your machine supports hardware -## virtualization, otherwise performance of the test environment will be poor. -## We are currently bringing up an LXC based alternative testing story, which -## will mitigate this, though the deployed instances will still be full virtual -## machines and so performance will be significantly less there without -## hardware virtualization. - -## #. As you step through the instructions several environment -## variables are set in your shell. These variables will be lost if -## you exit out of your shell. After setting variables, use -## scripts/write-tripleorc to write out the variables to a file that -## can be sourced later to restore the environment. - -## #. Also check ssh server is running on the host machine and port 22 is open for -## connections from virbr0 - VirtPowerManager will boot VMs by sshing into the -## host machine and issuing libvirt/virsh commands. The user these instructions -## use is your own, but you can also setup a dedicated user if you choose. - -### --end -if [ "$USE_CACHE" == "0" ] ; then - if [ -z "${ZUUL_REF:-''}" ]; then - cd $TRIPLEO_ROOT/tripleo-incubator ; git pull - fi -fi - -if [ "$NODE_DIST" == 'unsupported' ]; then - echo 'Unsupported OS distro.' - exit 1 -fi -### --include - -## #. Install required system packages -## :: - -if [ "$USE_CACHE" = "0" ] ; then #nodocs - install-dependencies -fi #nodocs - -## #. Clone/update the other needed tools which are not available as packages. -## The DIB_REPOLOCATION_* and DIB_REPOREF_* environment variables will be used, -## if set, to select the diskimage_builder, tripleo_image_elements and -## tripleo_heat_templates to check out. Setting TRIPLEO_ADDITIONAL_PULL_TOOLS -## to full git URLs will also allow you to add extra repositories to be cloned -## or updated by the pull-tools script. -## :: - -if [ "$USE_CACHE" = "0" ] ; then #nodocs - pull-tools -fi #nodocs - -## #. Install client tools -## :: - -if [ "$USE_CACHE" = "0" ] ; then #nodocs - setup-clienttools -fi #nodocs - -## #. Ensure current user can manage libvirt resources -## :: - -set-usergroup-membership - -## .. rubric:: Footnotes -## .. [#f3] Setting Up Squid Proxy -## -## * Install squid proxy -## :: -## -## apt-get install squid -## -## * Set `/etc/squid3/squid.conf` to the following -## :: -## -## acl localhost src 127.0.0.1/32 ::1 -## acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1 -## acl localnet src 10.0.0.0/8 # RFC1918 possible internal network -## acl localnet src 172.16.0.0/12 # RFC1918 possible internal network -## acl localnet src 192.168.0.0/16 # RFC1918 possible internal network -## acl SSL_ports port 443 -## acl Safe_ports port 80 # http -## acl Safe_ports port 21 # ftp -## acl Safe_ports port 443 # https -## acl Safe_ports port 70 # gopher -## acl Safe_ports port 210 # wais -## acl Safe_ports port 1025-65535 # unregistered ports -## acl Safe_ports port 280 # http-mgmt -## acl Safe_ports port 488 # gss-http -## acl Safe_ports port 591 # filemaker -## acl Safe_ports port 777 # multiling http -## acl CONNECT method CONNECT -## http_access allow manager localhost -## http_access deny manager -## http_access deny !Safe_ports -## http_access deny CONNECT !SSL_ports -## http_access allow localnet -## http_access allow localhost -## http_access deny all -## http_port 3128 -## maximum_object_size 1024 MB -## cache_dir aufs /var/spool/squid3 5000 24 256 -## coredump_dir /var/spool/squid3 -## refresh_pattern ^ftp: 1440 20% 10080 -## refresh_pattern ^gopher: 1440 0% 1440 -## refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 -## refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880 -## refresh_pattern . 0 20% 4320 -## refresh_all_ims on -## -## * Restart squid -## :: -## -## sudo service squid3 restart -## -## * Set http_proxy environment variable -## :: -## -## http_proxy=http://your_ip_or_localhost:3128/ -## -## -### --end diff --git a/scripts/devtest_testenv.sh b/scripts/devtest_testenv.sh deleted file mode 100755 index 7ebbfb82..00000000 --- a/scripts/devtest_testenv.sh +++ /dev/null @@ -1,288 +0,0 @@ -#!/bin/bash -# -# Test environment creation for devtest. -# This creates the bridge and VM's - -set -eu -set -o pipefail -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -function show_options { - echo "Usage: $SCRIPT_NAME [options] {JSON-filename}" - echo - echo "Setup a TripleO devtest environment." - echo - echo "Options:" - echo " -b -- Name of an already existing OVS bridge to use for " - echo " the public interface of the seed." - - echo " -h -- This help." - echo " -n -- Test environment number to add the seed to." - echo " -s -- SSH private key path to inject into the JSON." - echo " If not supplied, defaults to ~/.ssh/id_rsa_virt_power" - echo " --nodes NODEFILE -- You are supplying your own list of hardware." - echo " A sample nodes definition can be found in the os-cloud-config" - echo " usage documentation." - echo - echo " --bm-networks NETFILE -- You are supplying your own network layout." - echo " The schema for baremetal-network can be found in" - echo " the devtest_setup documentation." - echo " --baremetal-bridge-names BRIDGE_NAMES -- Name(s) of baremetal bridges" - echo " to create and attach to each VM." - echo " This should be a space delimited string" - echo " that contains 'brbm' as the first" - echo " entry so that it seed's ctlplane" - echo " network (also attached to brbm)" - echo " can provision instances." - echo " --keep-vms -- Prevent cleanup of virsh instances for" - echo " undercloud and overcloud" - echo "JSON-filename -- the path to write the environment description to." - echo - echo "Note: This adds a unique key to your authorised_keys file to permit " - echo "virtual-power-managment calls to be made." - echo - exit $1 -} - -NODES_PATH= -NETS_PATH= -NUM= -OVSBRIDGE= -BRIDGE_NAMES=brbm -SSH_KEY=~/.ssh/id_rsa_virt_power -KEEP_VMS= - -TEMP=$(getopt -o h,n:,b:,s: -l nodes:,bm-networks:,baremetal-bridge-names:,keep-vms -n $SCRIPT_NAME -- "$@") -if [ $? != 0 ]; then - echo "Terminating..." >&2 - exit 1 -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - --nodes) NODES_PATH="$2"; shift 2;; - --bm-networks) NETS_PATH="$2"; shift 2;; - --keep-vms) KEEP_VMS=1; shift;; - --baremetal-bridge-names) BRIDGE_NAMES="$2" ; shift 2 ;; - -b) OVSBRIDGE="$2" ; shift 2 ;; - -h) show_options 0;; - -n) NUM="$2" ; shift 2 ;; - -s) SSH_KEY="$2" ; shift 2 ;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -### --include -## devtest_testenv -## =============== - -#XXX: When updating, sync with the call in devtest.sh #nodocs - -## .. note:: - -## This script is usually called from ``devtest.sh`` as -## ``devtest_testenv.sh $TE_DATAFILE`` so we should declare -## a JSONFILE variable (which equals to the first positional -## argument) explicitly. -## :: - -## JSONFILE=${JSONFILE:-$TE_DATAFILE} - -### --end -JSONFILE=${1:-''} -EXTRA_ARGS=${2:-''} - -if [ -z "$JSONFILE" -o -n "$EXTRA_ARGS" ]; then - show_options 1 -fi - -### --include - -## #. Set HW resources for VMs used as 'baremetal' nodes. NODE_CPU is cpu count, -## NODE_MEM is memory (MB), NODE_DISK is disk size (GB), NODE_ARCH is -## architecture (i386, amd64). NODE_ARCH is used also for the seed VM. -## A note on memory sizing: TripleO images in raw form are currently -## ~2.7Gb, which means that a tight node will end up with a thrashing page -## cache during glance -> local + local -> raw operations. This significantly -## impairs performance. Of the four minimum VMs for TripleO simulation, two -## are nova baremetal nodes (seed and undercloud) and these need to be 3G or -## larger. The hypervisor host in the overcloud also needs to be a decent size -## or it cannot host more than one VM. The NODE_DISK is set to support -## building 5 overcloud nodes when not using Ironic. If you are building a -## larger overcloud than this without using Ironic you may need to increase -## NODE_DISK. - -## NODE_CNT specifies how many VMs to define using virsh. NODE_CNT -## defaults to 15, or 0 if NODES_PATH is provided. - -### --end -## This number is intentionally higher than required as the -## definitions are cheap (until the VM is activated the only cost -## is a small amount of disk space) but growing this number in our -## CI environment is expensive. -### --include - -## 32bit VMs -## :: - -## NODE_CPU=1 NODE_MEM=3072 NODE_DISK=40 NODE_ARCH=i386 - - -### --end - -if [ -n "$NODES_PATH" ]; then - NODE_CNT=${NODE_CNT:-0} -else - NODE_CNT=${NODE_CNT:-15} -fi - -NODE_CPU=${NODE_CPU:-1} NODE_MEM=${NODE_MEM:-3072} NODE_DISK=${NODE_DISK:-40} NODE_ARCH=${NODE_ARCH:-i386} - - - -### --include -## For 64bit it is better to create VMs with more memory and storage because of -## increased memory footprint (we suggest 4GB):: - -## NODE_CPU=1 NODE_MEM=4096 NODE_DISK=40 NODE_ARCH=amd64 - - -## #. Configure a network for your test environment. -## This configures an openvswitch bridge and teaches libvirt about it. -## :: - -setup-network -n "$NUM" -b "$BRIDGE_NAMES" - -## #. Configure a seed VM. This VM has a disk image manually configured by -## later scripts, and hosts the statically configured seed which is used -## to bootstrap a full dynamically configured baremetal cloud. The seed VM -## specs can be configured with the environment variables SEED_CPU and -## SEED_MEM (MB). It defaults to the NODE_CPU and NODE_MEM values, since -## the seed is equivalent to an undercloud in resource requirements. -## :: - -NUMBERED_BRIDGE_NAMES= -SEED_ARGS="-a $NODE_ARCH" -if [ -n "$NUM" ]; then - SEED_ARGS="$SEED_ARGS -o seed_${NUM}" -fi -if [ -n "$OVSBRIDGE" ]; then - SEED_ARGS="$SEED_ARGS -p $OVSBRIDGE" -fi -for NAME in $BRIDGE_NAMES; do - NUMBERED_BRIDGE_NAMES="$NUMBERED_BRIDGE_NAMES$NAME${NUM} " -done -# remove the last space -NUMBERED_BRIDGE_NAMES=${NUMBERED_BRIDGE_NAMES% } - -SEED_CPU=${SEED_CPU:-${NODE_CPU}} -SEED_MEM=${SEED_MEM:-${NODE_MEM}} - -## #. Clean up any prior environment. Unless the --keep-vms argument is -## passed to the script, VMs for the undercloud and overcloud are -## destroyed -## :: - -if [ -z "$KEEP_VMS" ]; then - if [ -n "$NUM" ]; then - cleanup-env -n $NUM -b "$BRIDGE_NAMES" - else - cleanup-env -b "$BRIDGE_NAMES" - fi -fi - -#Now start creating the new environment -setup-seed-vm $SEED_ARGS -c ${SEED_CPU} -m $((1024 * ${SEED_MEM})) - -## #. What user will be used to ssh to run virt commands to control our -## emulated baremetal machines. -## :: - -SSH_USER=$(whoami) - -## #. What IP address to ssh to for virsh operations. -## :: - -HOSTIP=${HOSTIP:-192.168.122.1} - -## #. If a static SEEDIP is in use, define it here. If not defined it will be -## looked up in the ARP table by the seed MAC address during seed deployment. -## :: - -if [ -n "$NETS_PATH" ]; then - # if the value is not set try the default 192.0.2.1. - SEEDIP=$(jq '.["seed"]["ip"] // "192.0.2.1"' -r $NETS_PATH) -else - SEEDIP=${SEEDIP:-''} -fi - - -## #. Set the default bare metal power manager. By default devtest uses -## nova.virt.baremetal.virtual_power_driver.VirtualPowerManager to -## support a fully virtualized TripleO test environment. You may -## optionally customize this setting if you are using real baremetal -## hardware with the devtest scripts. This setting controls the -## power manager used in both the seed VM and undercloud for Nova Baremetal. -## :: - -POWER_MANAGER=${POWER_MANAGER:-'nova.virt.baremetal.virtual_power_driver.VirtualPowerManager'} - -## #. Ensure we can ssh into the host machine to turn VMs on and off. -## The private key we create will be embedded in the seed VM, and delivered -## dynamically by heat to the undercloud VM. -## :: - -# generate ssh authentication keys if they don't exist -if [ ! -f $SSH_KEY ]; then - ssh-keygen -t rsa -N "" -C virtual-power-key -f $SSH_KEY -fi - -# make the local id_rsa_virt_power.pub be in ``.ssh/authorized_keys`` before -# that is copied into images via ``local-config`` -if ! grep -qF "$(cat ${SSH_KEY}.pub)" ~/.ssh/authorized_keys; then - cat ${SSH_KEY}.pub >> ~/.ssh/authorized_keys - chmod 0600 ~/.ssh/authorized_keys -fi - -## #. Wrap this all up into JSON. -## :: - -jq "." < $JSONFILE -{ - "arch":"$NODE_ARCH", - "host-ip":"$HOSTIP", - "power_manager":"$POWER_MANAGER", - "seed-ip":"$SEEDIP", - "ssh-key":"$(cat $SSH_KEY|sed 's,$,\\n,'|tr -d '\n')", - "ssh-user":"$SSH_USER" -} -EOF - -## #. If you have an existing bare metal cloud network to use, use it. See -## `baremetal-network` section in :ref:`devtest-environment-configuration` -## for more details -## :: - -devtest_update_network.sh ${NETS_PATH:+--bm-networks $NETS_PATH} $JSONFILE - -## #. If you have an existing set of nodes to use, use them. -## :: - -if [ -n "$NODES_PATH" ]; then - JSON=$(jq -s '.[0].nodes=.[1] | .[0]' $JSONFILE $NODES_PATH) - echo "${JSON}" > $JSONFILE -else - -## #. Create baremetal nodes for the test cluster. If the required number of -## VMs changes in future, you can run cleanup-env and then recreate with -## more nodes. -## :: - -create-nodes $NODE_CPU $NODE_MEM $NODE_DISK $NODE_ARCH $NODE_CNT $SSH_USER $HOSTIP $JSONFILE "$NUMBERED_BRIDGE_NAMES" -### --end -fi diff --git a/scripts/devtest_undercloud.sh b/scripts/devtest_undercloud.sh deleted file mode 100755 index 3ae63cd6..00000000 --- a/scripts/devtest_undercloud.sh +++ /dev/null @@ -1,448 +0,0 @@ -#!/bin/bash - -set -eu -set -o pipefail - -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -BUILD_ONLY= -DEBUG_LOGGING= -HEAT_ENV= -FLAVOR="baremetal" - -function show_options { - echo "Usage: $SCRIPT_NAME [options]" - echo - echo "Deploys a baremetal cloud via heat." - echo - echo "Options:" - echo " -h -- this help" - echo " -c -- re-use existing source/images if they exist." - echo " --build-only -- build the needed images but don't deploy them." - echo " --debug-logging -- Turn on debug logging in the undercloud. Sets" - echo " both OS_DEBUG_LOGGING and the heat Debug parameter." - echo " --heat-env -- path to a JSON heat environment file." - echo " Defaults to \$TRIPLEO_ROOT/undercloud-env.json." - echo " --flavor -- flavor to use for the undercloud. Defaults" - echo " to 'baremetal'." - echo - exit $1 -} - -TEMP=$(getopt -o c,h -l build-only,debug-logging,heat-env:,flavor:,help -n $SCRIPT_NAME -- "$@") -if [ $? != 0 ]; then - echo "Terminating..." >&2 - exit 1 -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -c) USE_CACHE=1; shift 1;; - --build-only) BUILD_ONLY="1"; shift 1;; - --debug-logging) - DEBUG_LOGGING="1" - export OS_DEBUG_LOGGING="1" - shift 1 - ;; - --heat-env) HEAT_ENV="$2"; shift 2;; - --flavor) FLAVOR="$2"; shift 2;; - -h | --help) show_options 0;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -set -x -USE_CACHE=${USE_CACHE:-0} -TE_DATAFILE=${1:?"A test environment description is required as \$1."} -UNDERCLOUD_DIB_EXTRA_ARGS=${UNDERCLOUD_DIB_EXTRA_ARGS:-'rabbitmq-server'} - -if [ "${USE_MARIADB:-}" = 1 ] ; then - UNDERCLOUD_DIB_EXTRA_ARGS="$UNDERCLOUD_DIB_EXTRA_ARGS mariadb-rpm" -fi - -### --include -## devtest_undercloud -## ================== - -## #. Add extra elements for Undercloud UI -## :: - -if [ "$USE_UNDERCLOUD_UI" -ne 0 ] ; then - UNDERCLOUD_DIB_EXTRA_ARGS="$UNDERCLOUD_DIB_EXTRA_ARGS ceilometer-collector \ - ceilometer-api ceilometer-agent-central ceilometer-agent-notification \ - ceilometer-undercloud-config horizon nova-ironic" -fi - -## #. Specifiy a client-side timeout in minutes for creating or updating the -## undercloud Heat stack. -## :: - -UNDERCLOUD_STACK_TIMEOUT=${UNDERCLOUD_STACK_TIMEOUT:-60} - -## #. Create your undercloud image. This is the image that the seed nova -## will deploy to become the baremetal undercloud. $UNDERCLOUD_DIB_EXTRA_ARGS is -## meant to be used to pass additional arguments to disk-image-create. -## :: - -NODE_ARCH=$(os-apply-config -m $TE_DATAFILE --key arch --type raw) -if [ ! -e $TRIPLEO_ROOT/undercloud.qcow2 -o "$USE_CACHE" == "0" ] ; then #nodocs - $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST \ - -a $NODE_ARCH -o $TRIPLEO_ROOT/undercloud \ - ntp baremetal boot-stack os-collect-config dhcp-all-interfaces \ - neutron-dhcp-agent $DIB_COMMON_ELEMENTS $UNDERCLOUD_DIB_EXTRA_ARGS 2>&1 | \ - tee $TRIPLEO_ROOT/dib-undercloud.log -### --end -fi -if [ -n "$BUILD_ONLY" ]; then - exit 0 -fi -### --include - -## #. If you wanted to build the image and run it elsewhere, you can stop at -## this point and head onto the overcloud image building. - -## #. Load the undercloud image into Glance: -## :: - -UNDERCLOUD_ID=$(load-image -d $TRIPLEO_ROOT/undercloud.qcow2) - - -## #. Set the public interface of the undercloud network node: -## :: - -NeutronPublicInterface=${NeutronPublicInterface:-'nic1'} - -## #. Set the NTP server for the undercloud:: -## :: - -UNDERCLOUD_NTP_SERVER=${UNDERCLOUD_NTP_SERVER:-''} - -## #. Create secrets for the cloud. The secrets will be written to a file -## ($TRIPLEO_ROOT/tripleo-undercloud-passwords by default) -## that you need to source into your shell environment. -## -## .. note:: -## -## You can also make or change these later and -## update the heat stack definition to inject them - as long as you also -## update the keystone recorded password. -## -## .. note:: -## -## There will be a window between updating keystone and -## instances where they will disagree and service will be down. Instead -## consider adding a new service account and changing everything across -## to it, then deleting the old account after the cluster is updated. -## -## :: - -### --end - -# NOTE(tchaypo): We used to write these passwords in $CWD; so check to see if the -# file exists there first. As well as providing backwards compatibility, this -# allows for people to run multiple test environments on the same machine - just -# make sure to have a different directory for running the scripts for each -# different environment you wish to use. -# -if [ -e tripleo-undercloud-passwords ]; then - echo "Re-using existing passwords in $PWD/tripleo-undercloud-passwords" - # Add any new passwords since the file was generated - setup-undercloud-passwords tripleo-undercloud-passwords - source tripleo-undercloud-passwords -else -### --include - setup-undercloud-passwords $TRIPLEO_ROOT/tripleo-undercloud-passwords - source $TRIPLEO_ROOT/tripleo-undercloud-passwords -fi #nodocs - -## #. Export UNDERCLOUD_CEILOMETER_SNMPD_PASSWORD to your environment -## so it can be applied to the SNMPd of all Overcloud nodes. - -NEW_JSON=$(jq '.undercloud.ceilometer_snmpd_password="'${UNDERCLOUD_CEILOMETER_SNMPD_PASSWORD}'"' $TE_DATAFILE) -echo $NEW_JSON > $TE_DATAFILE - -## #. Pull out needed variables from the test environment definition. -## :: - -POWER_MANAGER=$(os-apply-config -m $TE_DATAFILE --key power_manager --type raw) -POWER_KEY=$(os-apply-config -m $TE_DATAFILE --key ssh-key --type raw) -POWER_HOST=$(os-apply-config -m $TE_DATAFILE --key host-ip --type raw) -POWER_USER=$(os-apply-config -m $TE_DATAFILE --key ssh-user --type raw) - -## #. Wait for the BM cloud to register BM nodes with the scheduler:: - -wait_for -w 60 --delay 1 -- wait_for_hypervisor_stats - - -## #. We need an environment file to store the parameters we're going to give -## heat.:: - -HEAT_ENV=${HEAT_ENV:-"${TRIPLEO_ROOT}/undercloud-env.json"} - -## #. Read the heat env in for updating.:: - -if [ -e "${HEAT_ENV}" ]; then -### --end - if [ "$(stat -c %a ${HEAT_ENV})" != "600" ]; then - echo "Error: Heat environment cache \"${HEAT_ENV}\" not set to permissions of 0600." -# We should exit 1 so all the users from before the permissions -# requirement dont have their HEAT_ENV files ignored in a nearly silent way - exit 1 - fi -### --include - ENV_JSON=$(cat "${HEAT_ENV}") -else - ENV_JSON='{"parameters":{}}' -fi - -## #. Detect if we are deploying with a VLAN for API endpoints / floating IPs. -## This is done by looking for a 'public' network in Neutron, and if found -## we pull out the VLAN id and pass that into Heat, as well as using a VLAN -## enabled Heat template. -## :: - -if (neutron net-list | grep -q public); then - VLAN_ID=$(neutron net-show public | awk '/provider:segmentation_id/ { print $4 }') -else - VLAN_ID= -fi - -## #. Nova-baremetal and Ironic require different Heat templates -## and different options. -## :: - -if [ -n "$VLAN_ID" ]; then - HEAT_UNDERCLOUD_TEMPLATE="undercloud-vm-ironic-vlan.yaml" - ENV_JSON=$(jq .parameters.NeutronPublicInterfaceTag=\"${VLAN_ID}\" <<< $ENV_JSON) -# This should be in the heat template, but see -# https://bugs.launchpad.net/heat/+bug/1336656 -# note that this will break if there are more than one subnet, as if -# more reason to fix the bug is needed :). -PUBLIC_SUBNET_ID=$(neutron net-show public | awk '/subnets/ { print $4 }') -VLAN_GW=$(neutron subnet-show $PUBLIC_SUBNET_ID | awk '/gateway_ip/ { print $4}') -BM_VLAN_CIDR=$(neutron subnet-show $PUBLIC_SUBNET_ID | awk '/cidr/ { print $4}') - ENV_JSON=$(jq .parameters.NeutronPublicInterfaceDefaultRoute=\"${VLAN_GW}\" <<< $ENV_JSON) -else - HEAT_UNDERCLOUD_TEMPLATE="undercloud-vm-ironic.yaml" -fi -ENV_JSON=$(jq .parameters.IronicPassword=\"${UNDERCLOUD_IRONIC_PASSWORD}\" <<< $ENV_JSON) -REGISTER_SERVICE_OPTS="--ironic-password $UNDERCLOUD_IRONIC_PASSWORD" - -STACKNAME_UNDERCLOUD=${STACKNAME_UNDERCLOUD:-'undercloud'} - -## #. Choose whether to deploy or update. Use stack-update to update:: -## HEAT_OP=stack-create -## :: - -if heat stack-show $STACKNAME_UNDERCLOUD > /dev/null; then - HEAT_OP=stack-update - if (heat stack-show $STACKNAME_UNDERCLOUD | grep -q FAILED); then - echo "Updating a failed stack. this is a new ability and may cause problems." >&2 - fi -else - HEAT_OP=stack-create -fi - -## #. Set parameters we need to deploy a baremetal undercloud:: - -ENV_JSON=$(jq '.parameters = { -"MysqlInnodbBufferPoolSize": 100 -} + .parameters + { -"AdminPassword": "'"${UNDERCLOUD_ADMIN_PASSWORD}"'", -"AdminToken": "'"${UNDERCLOUD_ADMIN_TOKEN}"'", -"SnmpdReadonlyUserPassword": "'"${UNDERCLOUD_CEILOMETER_SNMPD_PASSWORD}"'", -"GlancePassword": "'"${UNDERCLOUD_GLANCE_PASSWORD}"'", -"HeatPassword": "'"${UNDERCLOUD_HEAT_PASSWORD}"'", -"NovaPassword": "'"${UNDERCLOUD_NOVA_PASSWORD}"'", -"NeutronPassword": "'"${UNDERCLOUD_NEUTRON_PASSWORD}"'", -"NeutronPublicInterface": "'"${NeutronPublicInterface}"'", -"undercloudImage": "'"${UNDERCLOUD_ID}"'", -"BaremetalArch": "'"${NODE_ARCH}"'", -"PowerSSHPrivateKey": "'"${POWER_KEY}"'", -"NtpServer": "'"${UNDERCLOUD_NTP_SERVER}"'", -"Flavor": "'"${FLAVOR}"'" -}' <<< $ENV_JSON) - - -### --end -if [ "$DEBUG_LOGGING" = "1" ]; then - ENV_JSON=$(jq '.parameters = .parameters + { - "Debug": "True", - }' <<< $ENV_JSON) -fi -### --include - -#Add Ceilometer to env only if USE_UNDERCLOUD_UI is specified - -if [ "$USE_UNDERCLOUD_UI" -ne 0 ] ; then - ENV_JSON=$(jq '.parameters = .parameters + { - "CeilometerPassword": "'"${UNDERCLOUD_CEILOMETER_PASSWORD}"'" - }' <<< $ENV_JSON) -fi - -## #. Save the finished environment file.:: - -jq . > "${HEAT_ENV}" <<< $ENV_JSON -chmod 0600 "${HEAT_ENV}" - -## #. Add Keystone certs/key into the environment file.:: - -generate-keystone-pki --heatenv $HEAT_ENV - -## #. Deploy an undercloud. -## :: - -make -C $TRIPLEO_ROOT/tripleo-heat-templates $HEAT_UNDERCLOUD_TEMPLATE - -heat $HEAT_OP -e $HEAT_ENV \ - -t 360 \ - -f $TRIPLEO_ROOT/tripleo-heat-templates/$HEAT_UNDERCLOUD_TEMPLATE \ - $STACKNAME_UNDERCLOUD - -## You can watch the console via ``virsh``/``virt-manager`` to observe the PXE -## boot/deploy process. After the deploy is complete, it will reboot into the -## image. -## -## #. Get the undercloud IP from ``nova list`` -## :: - -echo "Waiting for the undercloud stack to be ready" #nodocs -# Make time out 60 mins as like the Heat stack-create default timeout. -wait_for_stack_ready -w $(($UNDERCLOUD_STACK_TIMEOUT * 60 )) 10 undercloud -UNDERCLOUD_CTL_IP=$(nova list | grep ctlplane | sed -e "s/.*=\\([0-9.]*\\).*/\1/") - -## #. If we're deploying with a public VLAN we must use it, not the control plane -## network (which we may not even have access to) to ping and configure thing. -## :: - -if [ -n "$VLAN_ID" ]; then - UNDERCLOUD_IP=$(heat output-show undercloud PublicIP|sed 's/^"\(.*\)"$/\1/') -else - UNDERCLOUD_IP=$UNDERCLOUD_CTL_IP -fi - -## #. We don't (yet) preserve ssh keys on rebuilds. -## :: - -ssh-keygen -R $UNDERCLOUD_IP -ssh-keygen -R $UNDERCLOUD_CTL_IP - -## #. Exclude the undercloud from proxies: -## :: - -set +u #nodocs -export no_proxy=$no_proxy,$UNDERCLOUD_IP -set -u #nodocs - -## #. Export the undercloud endpoint and credentials to your test environment. -## :: - -UNDERCLOUD_ENDPOINT="http://$UNDERCLOUD_IP:5000/v2.0" -NEW_JSON=$(jq '.undercloud.password="'${UNDERCLOUD_ADMIN_PASSWORD}'" | .undercloud.endpoint="'${UNDERCLOUD_ENDPOINT}'" | .undercloud.endpointhost="'${UNDERCLOUD_IP}'"' $TE_DATAFILE) -echo $NEW_JSON > $TE_DATAFILE - -## #. Source the undercloud configuration: -## :: - -source $TRIPLEO_ROOT/tripleo-incubator/undercloudrc - -## #. Perform setup of your undercloud. -## :: - -init-keystone -o $UNDERCLOUD_CTL_IP -t $UNDERCLOUD_ADMIN_TOKEN \ - -e admin@example.com -p $UNDERCLOUD_ADMIN_PASSWORD \ - --public $UNDERCLOUD_IP --no-pki-setup - -# Creating these roles to be used by tenants using swift -openstack role create swiftoperator -openstack role create ResellerAdmin - - -# Create service endpoints and optionally include Ceilometer for UI support -ENDPOINT_LIST="--glance-password $UNDERCLOUD_GLANCE_PASSWORD - --heat-password $UNDERCLOUD_HEAT_PASSWORD - --neutron-password $UNDERCLOUD_NEUTRON_PASSWORD - --nova-password $UNDERCLOUD_NOVA_PASSWORD - --tuskar-password $UNDERCLOUD_TUSKAR_PASSWORD" - -if [ "$USE_UNDERCLOUD_UI" -ne 0 ] ; then - ENDPOINT_LIST="$ENDPOINT_LIST --ceilometer-password $UNDERCLOUD_CEILOMETER_PASSWORD" -fi - -setup-endpoints $UNDERCLOUD_CTL_IP $ENDPOINT_LIST $REGISTER_SERVICE_OPTS \ - --public $UNDERCLOUD_IP -openstack role create heat_stack_user - -user-config - -BM_NETWORK_CIDR=$(os-apply-config -m $TE_DATAFILE --key baremetal-network.cidr --type raw --key-default '192.0.2.0/24') -if [ -n "$VLAN_ID" ]; then - # No ctl plane gateway - public net gateway is needed. - # XXX (lifeless) - Neutron still configures one, first position in the subnet. - BM_NETWORK_GATEWAY= -else - # Use a control plane gateway. - BM_NETWORK_GATEWAY=$(os-apply-config -m $TE_DATAFILE --key baremetal-network.gateway-ip --type raw --key-default '192.0.2.1') -fi -BM_NETWORK_UNDERCLOUD_RANGE_START=$(os-apply-config -m $TE_DATAFILE --key baremetal-network.undercloud.range-start --type raw --key-default '192.0.2.21') -BM_NETWORK_UNDERCLOUD_RANGE_END=$(os-apply-config -m $TE_DATAFILE --key baremetal-network.undercloud.range-end --type raw --key-default '192.0.2.40') - -UNDERCLOUD_NAMESERVER=$(os-apply-config -m $TE_DATAFILE --key undercloud.nameserver --type netaddress --key-default "${UNDERCLOUD_NAMESERVER:-}") - -NETWORK_JSON=$(mktemp) -jq "." < $NETWORK_JSON -{ - "physical": { - "gateway": "$BM_NETWORK_GATEWAY", - "metadata_server": "$UNDERCLOUD_CTL_IP", - "cidr": "$BM_NETWORK_CIDR", - "allocation_start": "$BM_NETWORK_UNDERCLOUD_RANGE_START", - "allocation_end": "$BM_NETWORK_UNDERCLOUD_RANGE_END", - "name": "ctlplane", - "nameserver": "$UNDERCLOUD_NAMESERVER" - } -} -EOF -setup-neutron -n $NETWORK_JSON -rm $NETWORK_JSON - -if [ -n "$VLAN_ID" ]; then - BM_VLAN_START=$(jq -r '.["baremetal-network"].undercloud.public_vlan.start' $TE_DATAFILE) - BM_VLAN_END=$(jq -r '.["baremetal-network"].undercloud.public_vlan.finish' $TE_DATAFILE) - PUBLIC_NETWORK_JSON=$(mktemp) - jq "." < $PUBLIC_NETWORK_JSON -{ - "physical": { - "gateway": "$VLAN_GW", - "metadata_server": "$UNDERCLOUD_CTL_IP", - "cidr": "$BM_VLAN_CIDR", - "allocation_start": "$BM_VLAN_START", - "allocation_end": "$BM_VLAN_END", - "name": "public", - "nameserver": "$UNDERCLOUD_NAMESERVER", - "segmentation_id": "$VLAN_ID", - "physical_network": "ctlplane", - "enable_dhcp": false - } -} -EOF - setup-neutron -n $PUBLIC_NETWORK_JSON -fi - -## #. Nova quota runs up with the defaults quota so overide the default to -## allow unlimited cores, instances and ram. -## :: - -nova quota-update --cores -1 --instances -1 --ram -1 $(openstack project show admin | awk '$2=="id" {print $4}') - -## #. Register two baremetal nodes with your undercloud. -## :: - -setup-baremetal --service-host undercloud --nodes <(jq '.nodes - [.nodes[0]]' $TE_DATAFILE) - -### --end diff --git a/scripts/devtest_update_network.sh b/scripts/devtest_update_network.sh deleted file mode 100755 index fb5e2264..00000000 --- a/scripts/devtest_update_network.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash - -set -eu -set -o pipefail -SCRIPT_NAME=$(basename $0) - -function show_options { - echo "Usage: $SCRIPT_NAME --bm-networks NETFILE {JSON-filename}" - echo - echo "Reads the baremetal-network description in NETFILE and writes it into JSON-filename" - echo - echo "For instance, to read the file named bm-networks.json and update testenv.json:" - echo " ${SCRIPT_NAME} --bm-networks bm-networks.json testenv.json " - echo - echo "Options:" - echo " -h -- This help." - echo " --bm-networks NETFILE -- You are supplying your own network layout." - echo " The schema for baremetal-network can be found in" - echo " the devtest_setup documentation." - echo " For backwards compatibility, this argument is optional;" - echo " but if it's not provided this script does nothing." - echo - echo "JSON-filename -- the path to write the environment description to." - echo - exit $1 -} - -NETS_PATH= - -TEMP=$(getopt -o h -l help,bm-networks: -n $SCRIPT_NAME -- "$@") -if [ $? != 0 ]; then - echo "Terminating..." >&2 - exit 1 -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - --bm-networks) NETS_PATH="$2"; shift 2;; - -h|--help) show_options 0;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -### --include -## devtest_update_network -## ====================== - -## This script updates the baremetal networks definition in the -## ``$TE_DATAFILE``. -### --end - -JSONFILE=${1:-''} -EXTRA_ARGS=${2:-''} - -if [ -z "$JSONFILE" -o -n "$EXTRA_ARGS" ]; then - show_options 1 -fi - -if [ -n "$NETS_PATH" ]; then - JSON=$(jq -s '.[0]["baremetal-network"]=.[1] | .[0]' $JSONFILE $NETS_PATH) - echo "${JSON}" > $JSONFILE -fi diff --git a/scripts/devtest_variables.sh b/scripts/devtest_variables.sh deleted file mode 100755 index e63bdbf0..00000000 --- a/scripts/devtest_variables.sh +++ /dev/null @@ -1,215 +0,0 @@ -#!/bin/bash -# -# Variable definition for devtest. - -### --include -## devtest_variables -## ================= - -## #. The devtest scripts require access to the libvirt system URI. -## If running against a different libvirt URI you may encounter errors. -## Export ``LIBVIRT_DEFAULT_URI`` to prevent devtest using qemu:///system -## Check that the default libvirt connection for your user is qemu:///system. -## If it is not, set an environment variable to configure the connection. -## This configuration is necessary for consistency, as later steps assume -## qemu:///system is being used. -## :: - -export LIBVIRT_DEFAULT_URI=${LIBVIRT_DEFAULT_URI:-"qemu:///system"} - -## #. The VMs created by devtest will use a virtio network device by -## default. This can be overridden to use a different network driver for -## interfaces instead, such as ``e1000`` if required. -## :: - -export LIBVIRT_NIC_DRIVER=${LIBVIRT_NIC_DRIVER:-"virtio"} - -## #. By default the node volumes will be created in a volume pool named -## 'default'. This variable can be used to specify a custom volume -## pool. This is useful in scenarios where the default volume pool cannot -## accommodate the storage requirements of the nodes. - -## Note that this variable only changes the volume pool for the nodes. -## Seed image will still end up in /var/lib/libvirt/images. -## :: - -export LIBVIRT_VOL_POOL=${LIBVIRT_VOL_POOL:-"default"} - -## #. The tripleo-incubator tools must be available at -## ``$TRIPLEO_ROOT/tripleo-incubator``. See the :doc:`devtest` documentation -## which describes how to set that up correctly. -## :: - -export TRIPLEO_ROOT=${TRIPLEO_ROOT:-} #nodocs - -### --end -## NOTE(gfidente): Keep backwards compatibility by setting TRIPLEO_ROOT -## to ~/.cache/tripleo if the var is found empty and the dir exists. -if [ -z "$TRIPLEO_ROOT" -a -d ~/.cache/tripleo ]; then - echo "WARNING: Defaulting TRIPLEO_ROOT to ~/.cache/tripleo" - echo " Other environment variables are based on \$TRIPLEO_ROOT so" - echo " if you intend changing it, please source devtest_variables.sh" - echo " again afterwards." - TRIPLEO_ROOT=~/.cache/tripleo -fi - -if [ -z "$TRIPLEO_ROOT" -o ! -d $TRIPLEO_ROOT/tripleo-incubator/scripts ]; then - echo 'WARNING: Cannot find $TRIPLEO_ROOT/tripleo-incubator/scripts' - echo ' To use devtest you must export the TRIPLEO_ROOT variable and have cloned tripleo-incubator within that directory.' - echo ' Check http://docs.openstack.org/developer/tripleo-incubator/devtest.html#initial-checkout for instructions.' -fi -### --include -if [ -n "$TRIPLEO_ROOT" ]; then - export PATH=$TRIPLEO_ROOT/tripleo-incubator/scripts:$TRIPLEO_ROOT/dib-utils/bin:$TRIPLEO_ROOT/diskimage-builder/bin:$PATH -fi - -## #. It's possible to deploy the Undercloud without a UI and its dependent elements. -## The dependent image elements in Undercloud are Horizon, Tuskar-UI (not included -## yet, Tuskar UI element is not finished) and Ceilometer. In Overcloud it is -## SNMPd image element on every node. -## :: - -export USE_UNDERCLOUD_UI=${USE_UNDERCLOUD_UI:-1} - -## #. Set a list of image elements that should be included in all image builds. -## Note that stackuser is only for debugging support - it is not suitable for -## a production network. This is also the place to include elements such as -## pip-cache or pypi-openstack if you intend to use them. -## :: - -export DIB_COMMON_ELEMENTS=${DIB_COMMON_ELEMENTS:-"stackuser common-venv use-ephemeral"} - -## #. If you have a specific Ubuntu mirror you want to use when building -## images. -## :: - -# export DIB_COMMON_ELEMENTS="${DIB_COMMON_ELEMENTS} apt-sources" -# export DIB_APT_SOURCES=/path/to/a/sources.list to use. - -## #. Choose the deploy image element to be used. `deploy-kexec` will relieve you of -## the need to wait for long hardware POST times, however it has known stability -## issues (please see https://bugs.launchpad.net/diskimage-builder/+bug/1240933). -## If stability is preferred over speed, use the `deploy-ironic` image -## element. -## :: - -export DEPLOY_IMAGE_ELEMENT=${DEPLOY_IMAGE_ELEMENT:-deploy-ironic} -export DEPLOY_NAME=deploy-ramdisk-ironic - -## #. A messaging backend is required for the seed, undercloud, and overcloud -## control node. It is not required for overcloud computes. The backend is -## set through the ``*EXTRA_ARGS``. -## rabbitmq-server is enabled by default. Another option is qpidd. -## For overclouds we also use ``*EXTRA_ARGS`` to choose a cinder backend, set -## to cinder-tgt by default. -## :: - -export SEED_DIB_EXTRA_ARGS=${SEED_DIB_EXTRA_ARGS:-"rabbitmq-server"} -export UNDERCLOUD_DIB_EXTRA_ARGS=${UNDERCLOUD_DIB_EXTRA_ARGS:-"rabbitmq-server"} -export OVERCLOUD_CONTROL_DIB_EXTRA_ARGS=${OVERCLOUD_CONTROL_DIB_EXTRA_ARGS:-'rabbitmq-server cinder-tgt'} - -## #. The block storage nodes are deployed with the cinder-tgt backend by -## default too. Alternatives are cinder-lio and cinder-volume-nfs. Make sure -## to check the README files of these elements to configure them as needed. -## :: - -export OVERCLOUD_BLOCKSTORAGE_DIB_EXTRA_ARGS=${OVERCLOUD_BLOCKSTORAGE_DIB_EXTRA_ARGS:-'cinder-tgt'} - -## #. Set distribution used for VMs (fedora, opensuse, ubuntu). If unset, this -## will match TRIPLEO_OS_DISTRO, which is automatically gathered by devtest -## and represent your build host distro (where the devtest code runs). -## -## For Fedora, set SELinux permissive mode(currently the default when using Fedora):: -## -## export NODE_DIST="fedora selinux-permissive" - -## For openSUSE, use:: -## -## export NODE_DIST="opensuse" - -## For Ubuntu, use:: -## -## export NODE_DIST="ubuntu" - -### --end -source $(dirname ${BASH_SOURCE[0]:-$0})/set-os-type -if [ -z "${NODE_DIST:-}" ]; then - if [ "$TRIPLEO_OS_DISTRO" = "fedora" ]; then - export NODE_DIST="fedora selinux-permissive" - else - export NODE_DIST=$TRIPLEO_OS_DISTRO - fi -fi -### --include - -## #. Set the number of baremetal nodes to create in the virtual test -## environment. -## :: - -# Node definitions are cheap but redeploying testenv's is not. -# Set NODE_CNT high enough for typical CI and Dev deployments for the -# foreseeable future -export NODE_CNT=${NODE_CNT:-15} - -## #. Set size of root partition on our disk (GB). The remaining disk space -## will be used for the persistent ephemeral disk to store node state. -## :: - -export ROOT_DISK=${ROOT_DISK:-10} - -## #. Set the disk bus type. The default value is 'sata'. But if the VM is going -## to be migrated or saved to disk, then 'scsi' would be more appropriate -## for libvirt. -## :: - -export LIBVIRT_DISK_BUS_TYPE=${LIBVIRT_DISK_BUS_TYPE:-"sata"} - -## #. Set number of compute, control and block storage nodes for the overcloud. -## Only a value of 1 for OVERCLOUD_CONTROLSCALE is currently supported. -## :: - -export OVERCLOUD_COMPUTESCALE=${OVERCLOUD_COMPUTESCALE:-1} -export OVERCLOUD_CONTROLSCALE=${OVERCLOUD_CONTROLSCALE:-1} -export OVERCLOUD_BLOCKSTORAGESCALE=${OVERCLOUD_BLOCKSTORAGESCALE:-0} - -## #. These optional variables can be set to remove dead nodes. See the merge.py -## help for details of use. These example lines would remove Compute1 and -## Compute3, and Control2 and Control4. -## :: - -## export OVERCLOUD_COMPUTE_BLACKLIST=1,3 -## export OVERCLOUD_CONTROL_BLACKLIST=2,4 - -## #. You need to make the tripleo image elements accessible to diskimage-builder: -## :: - -export ELEMENTS_PATH=${ELEMENTS_PATH:-"$TRIPLEO_ROOT/tripleo-image-elements/elements"} - -## #. Set the datafile to use to describe the 'hardware' in the devtest -## environment. If this file already exists, you should skip running -## devtest_testenv.sh as it writes to the file -## :: - -export TE_DATAFILE=${TE_DATAFILE:-"$TRIPLEO_ROOT/testenv.json"} - -## #. By default Percona XtraDB Cluster is used when installing MySQL database, -## set ``USE_MARIADB=1`` if you want use MariaDB instead, MariaDB is used by -## default on Fedora based distributions because MariaDB packages are included -## directly in distribution -## :: - - -if [[ $NODE_DIST =~ .*(fedora|rhel|centos).* ]] ; then - export USE_MARIADB=${USE_MARIADB:-1} -else - export USE_MARIADB=0 -fi - - -## #. You can choose between using the old-style merge.py script for putting -## together or the newer way of doing it directly via Heat. -## :: - -export USE_MERGEPY=${USE_MERGEPY:-0} - -### --end diff --git a/scripts/extract-docs b/scripts/extract-docs deleted file mode 100755 index d421f513..00000000 --- a/scripts/extract-docs +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash -# -# Copyright 2013 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -eu - -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - - -function show_options { - echo "Usage: $SCRIPT_NAME [options]" - echo - echo "Extract documentation from our demonstration scripts." - echo - echo "This will create devtest.rst from devtest.sh." - echo - echo "Options:" - echo " -h -- Show this help screen." - echo - exit 0 -} - -TEMP=`getopt -o h -l help -n $SCRIPT_NAME -- "$@"` -if [ $? != 0 ]; then - echo "Terminating..." >&2 - exit 1 -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -h | --help) show_options;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -EXTRA=${1:-""} - -for script in $(ls $SCRIPT_HOME/../scripts/devtest*.sh) ; do - bname=${script##*/} - noext=${bname%.sh} - awk -f $SCRIPT_HOME/extract-docs.awk $script > $SCRIPT_HOME/../doc/source/$noext.rst -done diff --git a/scripts/extract-docs.awk b/scripts/extract-docs.awk deleted file mode 100644 index b52c9810..00000000 --- a/scripts/extract-docs.awk +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2013 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# - -################# -# -# Read a shell script with embedded comments and: -# - discard undesired portions -# - strip leading '## ' from lines -# - indent other non-empty lines by 8 spaces -# - output the result to a nominated file -# This allows a script to have copious documentation but also be presented as a -# markdown / ReST file. -# - -/^### --include/ { - for (;;) { - if ((getline line) <= 0) - unexpected_eof() - if (line ~ /^### --end/) - break - if (match(line, ".* #nodocs$")) - continue - if (substr(line, 0, 3) == "## ") { - line = substr(line, 4) - } else if (line != "") { - line = " "line - } - print line > "/dev/stdout" - } -} - - -function unexpected_eof() { - printf("%s:%d: unexpected EOF or error\n", FILENAME, FNR) > "/dev/stderr" - exit 1 -} - - -END { - if (curfile) - close(curfile) -} - -# vim:sw=4:sts=4:expandtab:textwidth=79 diff --git a/scripts/get-vm-mac b/scripts/get-vm-mac deleted file mode 100755 index fafd92ef..00000000 --- a/scripts/get-vm-mac +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh -set -eu - -PATH=$PATH:/usr/sbin:/sbin - -if [ "$#" -lt 1 ]; then - echo "Usage: $(basename $0) " - exit 1 -fi - -VMNAME="$1" - -vms=$(sudo virsh list --all | grep "$VMNAME" | awk '{ print $2 }') - -macs="" -for vm in $vms ; do - macs="$(sudo virsh dumpxml $vm | grep "mac address" | head -1 | awk -F "'" '{ print $2 }') $macs" -done - -echo $macs diff --git a/scripts/install-dependencies b/scripts/install-dependencies deleted file mode 100755 index a6231de8..00000000 --- a/scripts/install-dependencies +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/bash -set -eu - -## This script should die: https://bugs.launchpad.net/tripleo/+bug/1195046. - -# generate ssh key directory if it doesn't exist -if [ ! -d ~/.ssh ]; then - install --mode 700 -d ~/.ssh -fi - -# generate ssh authentication keys if they don't exist -if [ ! -f ~/.ssh/id_rsa ]; then - ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa -fi - -# Ensure the local id_rsa.pub is in .ssh/authorized_keys before that is copied -# into images via local-config. We are opening up ssh access to the host with -# a key that the user might not want, we should find another way to place the -# key onto the image. See https://bugs.launchpad.net/tripleo/+bug/1280052 for -# more details. -if ! grep "$(cat ~/.ssh/id_rsa.pub)" ~/.ssh/authorized_keys >/dev/null; then - echo "Adding public key to ~/.ssh/authorized_keys" - cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys -fi - -# Make sure permissions are correct for ssh authorized_keys file. -chmod 0600 ~/.ssh/authorized_keys - -# packages -if [ "$TRIPLEO_OS_DISTRO" = "unsupported" ]; then - echo This script has not been tested outside of Fedora, RHEL/CentOS, and Ubuntu variants. - echo Make sure you have installed all the needed dependencies or subsequent steps will fail. -fi - -if [ "$TRIPLEO_OS_FAMILY" = "debian" ]; then - if $(grep -Eqs 'Ubuntu 12.04' /etc/lsb-release); then - #adding Ubuntu Cloud Archive Repository only if not present : bug https://bugs.launchpad.net/tripleo/+bug/1212237 - #Ubuntu 12.04 has a too-old libvirt-bin but a newer one is present in the Ubuntu cloud archive. - sudo -E apt-get update - DEBIAN_FRONTEND=noninteractive sudo -E apt-get install --yes ubuntu-cloud-keyring - (grep -Eqs "precise-updates/grizzly" /etc/apt/sources.list.d/cloud-archive.list) || echo 'deb http://ubuntu-cloud.archive.canonical.com/ubuntu precise-updates/grizzly main - ' | sudo tee -a /etc/apt/sources.list.d/cloud-archive.list - #adding precise-backports universe repository for jq package - if ! command -v add-apt-repository; then - DEBIAN_FRONTEND=noninteractive sudo -E apt-get install --yes python-software-properties - fi - sudo add-apt-repository "deb http://us.archive.ubuntu.com/ubuntu/ precise-backports universe" - fi - # packages - sudo -E apt-get update - DEBIAN_FRONTEND=noninteractive sudo -E apt-get install --yes python-lxml python-libvirt libvirt-bin qemu-utils qemu-system qemu-kvm git python-pip python-dev gcc python-virtualenv openvswitch-switch libssl-dev curl python-yaml parted lsb-release libxml2-dev libxslt1-dev jq openssh-server libffi-dev kpartx python-netaddr - - if [ -f /lib/systemd/system/libvirtd.service ]; then - sudo service libvirtd restart - else - sudo service libvirt-bin restart - fi -fi - -if [ "$TRIPLEO_OS_FAMILY" = "redhat" ]; then - sudo -E yum install -y python-lxml libvirt-python libvirt qemu-img qemu-kvm git python-pip openssl-devel python-devel gcc audit python-virtualenv openvswitch python-yaml net-tools redhat-lsb-core libxslt-devel jq openssh-server libffi-devel which glusterfs-api python-netaddr - - sudo service libvirtd restart - sudo service openvswitch restart - sudo chkconfig openvswitch on -fi - -if [ "$TRIPLEO_OS_FAMILY" = "suse" ]; then - # Need these in path for sudo service & usermod to work - PATH=/sbin:/usr/sbin:$PATH - # TODO: this is a bit fragile, and assumes openSUSE, not SLES - suse_version=$(awk '/VERSION/ { print $3 }' /etc/SuSE-release) - if [ ! -f /etc/zypp/repos.d/Cloud_OpenStack_Master.repo ]; then - # Add Cloud:OpenStack:Master (Project that follows master branch with daily updates) - sudo -E zypper -n ar -f http://download.opensuse.org/repositories/Cloud:/OpenStack:/Master/openSUSE_$suse_version/Cloud:OpenStack:Master.repo - sudo -E zypper -n --gpg-auto-import-keys ref - fi - sudo -E zypper --non-interactive install \ - python-lxml libvirt-python libvirt qemu-tools kvm git python-pip libopenssl-devel \ - python-devel gcc audit python-virtualenv openvswitch-switch python-PyYAML net-tools \ - lsb-release libxslt-devel jq libffi-devel python-netaddr - sudo service libvirtd restart - sudo service openvswitch-switch restart -fi diff --git a/scripts/load-image b/scripts/load-image deleted file mode 100755 index a4ed1bca..00000000 --- a/scripts/load-image +++ /dev/null @@ -1,164 +0,0 @@ -#!/bin/bash -# -# Copyright 2013 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -e - -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -# save stdout for later then make fd 1 stderr -exec 3>&1 >&2 - -function show_options { - echo "Usage: $SCRIPT_NAME [options] " - echo - echo "Load an image into Glance for use with Nova BareMetal driver" - echo - echo "Options:" - echo " -d -- delete duplicate images from glance before loading" - echo " -h -- print this help" - echo - exit 0 -} - -function cleanup { - rm -rf $TMP_IMAGE_DIR -} - -function remove_image { - NAME=$1 - UUIDS=$(glance image-list | awk "/$NAME/ {print \$2}") - for UUID in $UUIDS; do - echo "Removing image $1 ($UUID) from glance" - glance image-delete $UUID - done -} - -function load_image { - FILE=$(readlink -f $1) - DIR=$(dirname ${FILE}) - GLANCE_IMAGE_NAME=$(basename ${FILE%.*}) - RAMDISK="${DIR}/${GLANCE_IMAGE_NAME}.initrd" - KERNEL="${DIR}/${GLANCE_IMAGE_NAME}.vmlinuz" - - if [ ! -e "$FILE" ]; then - echo "Error: specified file $FILE not found" - exit 1 - fi - - CURRENT_CHECKSUM=$(nova image-show $GLANCE_IMAGE_NAME 2> /dev/null | awk '/ checksum / {print $4}') - NEW_CHECKSUM=$(md5sum $FILE | awk '{print $1}') - if [ "$CURRENT_CHECKSUM" = "$NEW_CHECKSUM" ]; then - echo "$FILE checksum matches glance checksum, not creating duplicate image." - nova image-show $GLANCE_IMAGE_NAME | awk '/ id / {print $4}' >&3 - return - fi - - if [ ! -e "$KERNEL" -o ! -e "$RAMDISK" ] ; then - DIGK=$(which disk-image-get-kernel || echo $DIB_PATH/bin/disk-image-get-kernel) - if [ ! -e $DIGK ]; then - echo "Error: unable to locate disk-image-get-kernel" - exit 1 - fi - - echo "Warning: Kernel ($KERNEL) or initrd ($RAMDISK) for specified file $FILE not found." - echo " Trying to extract them with disk-image-get-kernel now." - echo " Please add the \"baremetal\" element to your image-build." - export TMP_IMAGE_DIR=$(mktemp -t -d --tmpdir=${TMP_DIR:-/tmp} image.XXXXXXXX) - [ $? -eq 0 ] || die "Failed to create tmp directory" - trap cleanup EXIT - - $DIGK -d ${TMP_IMAGE_DIR} -o 'tmp' -i $FILE - KERNEL=$TMP_IMAGE_DIR/tmp-vmlinuz - RAMDISK=$TMP_IMAGE_DIR/tmp-initrd - fi - - if [ "$REMOVE_OLD_IMAGES" ]; then - remove_image "${GLANCE_IMAGE_NAME}-vmlinuz" - remove_image "${GLANCE_IMAGE_NAME}-initrd" - remove_image "${GLANCE_IMAGE_NAME}" - fi - - kernel_id=$(glance image-create \ - --name "${GLANCE_IMAGE_NAME}-vmlinuz" \ - --visibility public \ - --disk-format aki \ - --container-format aki \ - --file "$KERNEL" \ - | grep ' id ' | awk '{print $4}') - ramdisk_id=$(glance image-create \ - --name "${GLANCE_IMAGE_NAME}-initrd" \ - --visibility public \ - --disk-format ari \ - --container-format ari \ - --file "$RAMDISK" \ - | grep ' id ' | awk '{print $4}') - - # >&3 sends to the original stdout as this is what we are after - glance image-create --name $GLANCE_IMAGE_NAME \ - --visibility public \ - --disk-format qcow2 \ - --container-format bare \ - --property kernel_id=$kernel_id \ - --property ramdisk_id=$ramdisk_id \ - --file $FILE | awk '/ id / { print $4 }' >&3 - - cleanup - trap EXIT -} - - -TEMP=`getopt -o hd -n $SCRIPT_NAME -- "$@"` -if [ $? != 0 ]; then - echo "Terminating..." >&2; - exit 1; -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -d) export REMOVE_OLD_IMAGES=1 ; shift ;; - -h) show_options;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -for arg; do - FILES="$FILES $arg"; -done - -if [ ! "$FILES" ]; then - show_options -fi - -which glance >/dev/null || ( echo "Error: unable to locate glance"; exit 1 ) - -DIB_PATH=${DIB_PATH:-$SCRIPT_HOME/../../diskimage-builder} - -# Attempt to get the OS credentials, or die. -[ -z "$OS_AUTH_URL" ] && [ -z "$OS_USERNAME" ] && [ -z "$OS_PASSWORD" ] && \ - ( ( [ -e ~/stackrc ] && source ~/stackrc ) \ - || ( echo "Error: OS credentials not found. Please save them to ~/stackrc." && exit 1 ) ) - - -# Load the images now -for FILE in $FILES; do - load_image $FILE -done diff --git a/scripts/load-images b/scripts/load-images deleted file mode 100755 index 462172f7..00000000 --- a/scripts/load-images +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/env python -# Copyright 2015 Red Hat, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -import argparse -import logging -import os -import subprocess -import sys -import yaml - -logger = logging.getLogger(__name__) -env = os.environ.copy() - - -# YAML FILE FORMAT (same format as build-images but only uses the name/type) -# disk_images: -# - -# type: qcow2 -# imagename: overcloud -# heat_parameters: -# - controllerImage -# - NovaImage -def parse_opts(argv): - parser = argparse.ArgumentParser( - description='Load images into Glance using a YAML/JSON config file' - ' format.') - parser.add_argument('-c', '--config-file', metavar='CONFIG_FILE', - help="""path to the configuration file.""", - default='disk_images.yaml') - parser.add_argument('-i', '--images-directory', metavar='DIRECTORY', - help="""images directory for images. """ - """Defaults to $TRIPLEO_ROOT""", - default=env.get('TRIPLEO_ROOT')) - parser.add_argument('-o', '--output-heat-env', metavar='PATH', - help="""Output path for a heat environment that - contains Glance image IDs set to the - respective heat input name specified in the - config file. """) - parser.add_argument('-r', '--remove', action='store_true', - help="""remove duplicate image names from glance.""", - default=False) - parser.add_argument('-d', '--debug', dest="debug", action='store_true', - help="Print debugging output.", required=False) - parser.add_argument('-v', '--verbose', dest="verbose", - action='store_true', help="Print verbose output.", - required=False) - - opts = parser.parse_args(argv[1:]) - - return opts - - -def configure_logger(verbose=False, debug=False): - LOG_FORMAT = '[%(asctime)s] [%(levelname)s] %(message)s' - DATE_FORMAT = '%Y/%m/%d %I:%M:%S %p' - log_level = logging.WARN - - if debug: - log_level = logging.DEBUG - elif verbose: - log_level = logging.INFO - - logging.basicConfig(format=LOG_FORMAT, datefmt=DATE_FORMAT, - level=log_level) - - -def main(argv=sys.argv): - opts = parse_opts(argv) - configure_logger(opts.verbose, opts.debug) - logger.info('Using config file at: %s' % opts.config_file) - - if os.path.exists(opts.config_file): - with open(opts.config_file) as cf: - disk_images = yaml.load(cf.read()).get("disk_images") - logger.debug('disk_images JSON: %s' % str(disk_images)) - else: - logger.error('No config file exists at: %s' % opts.config_file) - return 1 - - if not opts.images_directory: - logger.error('Please specify --images-directory.') - return 1 - - heat_parameters = {'parameters': {}} - - for image in disk_images: - img_type = image.get('type', 'qcow2') - imagename = image.get('imagename') - image_path = '%s/%s.%s' % (opts.images_directory, imagename, img_type) - if os.path.exists(image_path): - logger.info('image path: %s' % image_path) - cmd = ['load-image'] - if opts.remove: - cmd.append('-d') - cmd.append(image_path) - logger.info('Running %s' % cmd) - retval = subprocess.call(cmd) - proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, env=env) - stdout, stderr = proc.communicate() - if proc.returncode != 0: - logger.error('Failed to load image: %s' % imagename) - return 1 - if image.get('heat_parameters'): - for name in image.get('heat_parameters'): - heat_parameters['parameters'][name] = stdout.strip() - - else: - logger.warn('No image file exists for image name: %s' % image_path) - continue - - if opts.output_heat_env: - with open(opts.output_heat_env, 'w') as of: - of.write(yaml.dump(heat_parameters)) - -if __name__ == '__main__': - sys.exit(main(sys.argv)) diff --git a/scripts/os-adduser b/scripts/os-adduser deleted file mode 100755 index 5be55f4e..00000000 --- a/scripts/os-adduser +++ /dev/null @@ -1,128 +0,0 @@ -#!/bin/bash -# -# Copyright 2013 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -eu - -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -GROUP="" -PASSWORD="" - -function show_options { - echo "Usage: $SCRIPT_NAME [options] " - echo - echo "Create a well formed user in a cloud." - echo "A tenant with the same name as the user is automatically created unless" - echo "it already exists." - echo - echo "The admin user is added to the tenant in the admin role." - echo - echo "Options:" - echo " -p, --password -- the password for the user." - echo - echo "For instance: $SCRIPT_NAME joe joe@example.com" - echo "would create a tenant 'joe', a user 'joe' with email joe@example.com" - echo "and a random password." - exit $1 -} - -TEMP=`getopt -o p: -l password: -n $SCRIPT_NAME -- "$@"` -if [ $? != 0 ]; then - echo "Terminating..." >&2 - exit 1 -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -p | --password) export PASSWORD="$2"; shift 2 ;; - -h) show_options 0;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -NAME=${1:-""} -EMAIL=${2:-""} - -if [ -z "$NAME" -o -z "$EMAIL" ]; then - show_options 1 -fi - -PASSWORD=${PASSWORD:-$(os-make-password)} - -ADMIN_ROLE=$(openstack role show admin| awk '$2=="id" {print $4}') -if [ -z "$ADMIN_ROLE" ]; then - echo "Could not find admin role" >&2 - exit 1 -fi -MEMBER_ROLE=$(openstack role show _member_| awk '$2=="id" {print $4}') -# Role _member_ is implicitly created by Keystone only while creating a new user -# If no users were created, need to create a role explicitly -if [ -z "$MEMBER_ROLE" ]; then - MEMBER_ROLE=$(openstack role create _member_ | awk '$2=="id" {print $4}') - echo "Created role _member_ with id ${MEMBER_ROLE}" >&2 -fi -ADMIN_USER_ID=$(openstack user show admin | awk '$2=="id" {print $4}') -if [ -z "$ADMIN_USER_ID" ]; then - echo "Could not find admin user" >&2 - exit 1 -fi - -if ! openstack project show $NAME 1>/dev/null 2>&1 ; then - USER_TENANT_ID=$(openstack project create $NAME | awk '$2=="id" {print $4}') - if [ -z "$USER_TENANT_ID" ]; then - echo "Failed to create tenant $NAME" >&2 - exit 1 - fi -else - USER_TENANT_ID=$(openstack project show $NAME 2>/dev/null| awk '$2=="id" {print $4}') - if [ -z "$USER_TENANT_ID" ]; then - echo "Failed to retrieve existing tenant $NAME" >&2 - exit 1 - fi -fi - -USER_ID=$(openstack user show $NAME | awk '$2=="id" {print $4}') -if [ -z "$USER_ID" ]; then - USER_ID=$(openstack user create \ - --password "$PASSWORD" \ - --email $EMAIL $NAME | awk '$2=="id" {print $4}') - if [ -z "$USER_ID" ]; then - echo "Failed to create user $NAME" >&2 - exit 1 - else - echo "Created user $NAME with password '$PASSWORD'" - fi -else - echo "User $NAME with id $USER_ID already exists" -fi - -if openstack role list --user $USER_ID --project $USER_TENANT_ID | grep -q "\s$MEMBER_ROLE\s"; then - echo "Role $MEMBER_ROLE is already granted for user $USER_ID with tenant $USER_TENANT_ID" -else - openstack role add --user $USER_ID --project $USER_TENANT_ID $MEMBER_ROLE -fi - -if openstack role list --user $ADMIN_USER_ID --project $USER_TENANT_ID | grep -q "\s$ADMIN_ROLE\s"; then - echo "Role $ADMIN_ROLE is already granted for user $ADMIN_USER_ID with tenant $USER_TENANT_ID" -else - openstack role add --user $ADMIN_USER_ID --project $USER_TENANT_ID $ADMIN_ROLE -fi diff --git a/scripts/os-make-password b/scripts/os-make-password deleted file mode 100755 index 8764355a..00000000 --- a/scripts/os-make-password +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash -# -# Copyright 2013 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -eu -set -o pipefail - -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -function show_options { - echo "Usage: $SCRIPT_NAME" - echo - echo "Create a random password." - echo - echo "This outputs a random password." - echo - echo "The password is made by taking a uuid and passing it though sha1sum." - echo "We may change this in future to gain more entropy." - echo - exit $1 -} - -TEMP=`getopt -o h -n $SCRIPT_NAME -- "$@"` -if [ $? != 0 ]; then - echo "Terminating..." >&2; - exit 1; -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -h) show_options 0;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -EXTRA=${1:-""} - -if [ -n "$EXTRA" ]; then - show_options 1 -fi - -uuidgen | sha1sum | awk '{print $1}' diff --git a/scripts/outage-bot b/scripts/outage-bot deleted file mode 100755 index dde1427b..00000000 --- a/scripts/outage-bot +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright 2014 Red Hat -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# -# Script to spam tripleo-cd-admin on #tripleo while there is a outage of -# the tripleo-ci cloud. Send messages to irc with irc messages from -# https://etherpad.openstack.org/p/cloud-outage, each time the irc message -# changes or every 30 minutes if no changes occurs. - - -if [ -z "$1" ] ; then - echo "Supply channel name" - exit 1 -fi - -SCRIPTDIR=$(dirname $0) -CURRENT=/var/tmp/outage-bot.current -LAST=/var/tmp/outage-bot.last -NEXTMESSAGE=0 -CHANNEL=$1 - -touch $LAST - -function sendmessage { - PEOPLE=$(cut -d , -f 1 $SCRIPTDIR/../tripleo-cloud/tripleo-cd-admins | xargs echo) - $SCRIPTDIR/send-irc $CHANNEL CLOUDOUTAGE "$PEOPLE $(sed -e 's/^ircmessage: \?//g' $CURRENT | xargs -0 -I LINE echo -n " --" LINE)" - NEXTMESSAGE=$(( $(date +%s) + 1800 )) -} - -while true ; do - sleep 60 - curl https://etherpad.openstack.org/p/cloud-outage/export/txt | grep "^ircmessage:" > $CURRENT - - if [ ! -s $CURRENT ] ; then - continue - fi - - if ! diff $CURRENT $LAST &> /dev/null ; then - sendmessage - fi - - if [ $NEXTMESSAGE -lt $(date +%s) ] ; then - sendmessage - fi - - cp $CURRENT $LAST -done diff --git a/scripts/overcloud_disk_images.yaml b/scripts/overcloud_disk_images.yaml deleted file mode 100644 index b384b121..00000000 --- a/scripts/overcloud_disk_images.yaml +++ /dev/null @@ -1,18 +0,0 @@ -# A default disk images YAML file that will load images -# created with devtest_overcloud_images.sh. The -# heat_parameters sections are used to output a heat -# environment file that maps heat parameter -# names to the Glance image IDs from each upload. -disk_images: - - - imagename: overcloud-control - heat_parameters: - - controllerImage - - - imagename: overcloud-compute - heat_parameters: - - NovaImage - - - imagename: overcloud-cinder-volume - heat_parameters: - - BlockStorageImage diff --git a/scripts/overcloud_puppet_disk_images.yaml b/scripts/overcloud_puppet_disk_images.yaml deleted file mode 100644 index 1dd9150e..00000000 --- a/scripts/overcloud_puppet_disk_images.yaml +++ /dev/null @@ -1,19 +0,0 @@ -# A puppet images YAML file that will build and -# load a single puppet base image to be used for -# all roles. -# -# The heat_parameter section is used to output a heat -# environment file that maps heat parameter -# names to the Glance image IDs. -disk_images: - - - imagename: overcloud - arch: amd64 - type: qcow2 - elements: - - hosts baremetal dhcp-all-interfaces os-collect-config heat-config-puppet heat-config-script puppet-modules hiera overcloud-compute overcloud-controller stackuser os-net-config delorean-repo rdo-release - heat_parameters: - - controllerImage - - NovaImage - - CephStorageImage - - BlockStorageImage diff --git a/scripts/pull-tools b/scripts/pull-tools deleted file mode 100755 index a6f29a91..00000000 --- a/scripts/pull-tools +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash -# -# Copyright 2013 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -eu - -# This is a cheap mr/cm-alike. Perhaps we should use mr/cm. - -TRIPLEO_ADDITIONAL_PULL_TOOLS=${TRIPLEO_ADDITIONAL_PULL_TOOLS:-} -TOOLS="https://git.openstack.org/openstack/diskimage-builder -https://git.openstack.org/openstack/dib-utils -https://git.openstack.org/openstack/heat-templates -https://git.openstack.org/openstack/tripleo-image-elements -https://git.openstack.org/openstack/tripleo-puppet-elements -https://git.openstack.org/openstack/tripleo-heat-templates -https://git.openstack.org/openstack/tripleo-incubator -https://git.openstack.org/openstack-infra/tripleo-ci -https://git.openstack.org/openstack/os-cloud-config ${TRIPLEO_ADDITIONAL_PULL_TOOLS}" - -ZUUL_REF=${ZUUL_REF:-''} - -if [ -n "$ZUUL_REF" ]; then - echo "SKIPPING pull-tools as ZUUL_REF is present." - exit 0 -fi - -# Create a manifest of tools that are in use -GIT_MANIFEST=$TRIPLEO_ROOT/dib-manifest-git-pull_tools -rm -f $GIT_MANIFEST - -for TOOL in $TOOLS; do - TOOL_BASE=$(basename $TOOL) - echo pulling/updating $TOOL_BASE - LOCATION_OVERRIDE=DIB_REPOLOCATION_${TOOL_BASE//[^A-Za-z0-9]/_} - LOCATION=${!LOCATION_OVERRIDE:-$TOOL} - REF=master - REF_OVERRIDE=DIB_REPOREF_${TOOL_BASE//[^A-Za-z0-9]/_} - REF=${!REF_OVERRIDE:-$REF} - if [ ! -d $TRIPLEO_ROOT/$TOOL_BASE ] ; then - cd $TRIPLEO_ROOT - git clone $LOCATION - pushd $TOOL_BASE - git checkout $REF # for a branch or SHA1 - popd - else - cd $TRIPLEO_ROOT/$TOOL_BASE - if echo "/$(git symbolic-ref -q HEAD)" | grep -q "/${REF}\$" ; then - if ! git pull --ff-only ; then - echo "***************************************************" - echo "* Perhaps you want to 'git rebase origin/$REF'? *" - echo "***************************************************" - exit 1 - fi - else - echo "***************************************" - echo "* $TOOL_BASE is not on branch $REF; skipping pull *" - echo "***************************************" - fi - fi - echo -n $TRIPLEO_ROOT/$TOOL_BASE: - cd $TRIPLEO_ROOT/$TOOL_BASE - git --no-pager log -1 --pretty=oneline - - # Write the manifest entry - # Make a best guess at the branch to get the remote in use - if ! branch=$(git symbolic-ref -q HEAD) ; then - # We are on a non-symbolic reference - try the first branch containing this ref - branch=$(git branch --contains HEAD | grep -v '(no branch)' | head -1 | tr -d ' ') - else - # Strip the leading refs/heads - branch=${branch##refs/heads/} - fi - [[ -z "$(git config branch.${branch}.remote)" ]] ||\ - branch_remote=$(git config remote.$(git config branch.${branch}.remote).url) - branch_remote=${branch_remote:-"unknown"} - echo "$TOOL_BASE git $TRIPLEO_ROOT/$TOOL_BASE $branch_remote $(git rev-parse HEAD)" >> $GIT_MANIFEST -done diff --git a/scripts/refresh-env b/scripts/refresh-env deleted file mode 100644 index 0b9ce82a..00000000 --- a/scripts/refresh-env +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash -# -# Copyright 2013-2014 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -__tripleo_refresh_env() { - export TRIPLEO_ROOT=$1 - - export PATH=$TRIPLEO_ROOT/tripleo-incubator/scripts:$PATH - source $(dirname $BASH_SOURCE)/set-os-type - export NODE_DIST=${NODE_DIST:-"$TRIPLEO_OS_DISTRO"} - pull-tools - setup-clienttools - export ELEMENTS_PATH=$TRIPLEO_ROOT/tripleo-image-elements/elements - - echo "Make sure to source your stackrc file" -} - -# Setup/update your undercloud environment to run devtest_overcloud.sh -# -if [ -z "${1:-}" ] ; then - echo "Usage:" - echo "source refresh-env TRIPLEO_ROOT" - echo "Ex:" - echo "source refresh-env ~/tripleo" -else - if [ -d "$1/tripleo-incubator/scripts" ] ; then - __tripleo_refresh_env $1 - else - echo "TRIPLEO_ROOT must contain tripleo-incubator/scripts" - fi -fi diff --git a/scripts/register-endpoint b/scripts/register-endpoint deleted file mode 100755 index 190e2efe..00000000 --- a/scripts/register-endpoint +++ /dev/null @@ -1,188 +0,0 @@ -#!/bin/bash -# -# Copyright 2013 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -eu - -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -DESCRIPTION="" -ADMIN_URL="" -INTERNAL_URL="" -REGION="regionOne" # NB: This is the default keystone uses. -DEBUG="" - -function show_options { - echo "Usage: $SCRIPT_NAME [options] " - echo - echo "Register a service and create an endpoint for it." - echo "The script assumes that the service tenant is called 'service' and " - echo "the admin role is called 'admin'." - echo - echo "Supported types are ec2, image, orchestration, identity," - echo "network, compute, baremetal, dashboard and metering." - echo - echo "Options:" - echo " -d, --description -- the description for the service." - echo " -a, --admin -- the admin URL prefix for this endpoint. If" - echo " not supplied, defaults to the internal url." - echo " -i, --internal -- the internal URL prefix for this endpoint." - echo " If not supplied, defaults to the public url." - echo " -r, --region -- Override the default region 'regionOne'." - echo " --debug -- Debug API calls made." - echo - echo "For instance: $SCRIPT_NAME nova compute https://api.cloud.com/nova/" - echo "would create a nova service and register" - echo "https://api.cloud.com/nova/v2/\$(tenant_id)s for all three endpoints." - exit 0 -} - -TEMP=`getopt -o d:a:i:r: -l debug,description:,admin:,internal:,region: -n $SCRIPT_NAME -- "$@"` -if [ $? != 0 ]; then - echo "Terminating..." >&2; - exit 1; -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -d | --description) export DESCRIPTION="$2"; shift 2 ;; - --debug) export DEBUG="--debug"; shift 1 ;; - -a | --admin) export ADMIN_URL="$2"; shift 2 ;; - -i | --internal) export INTERNAL_URL="$2"; shift 2 ;; - -r | --region) export REGION="$2"; shift 2 ;; - -h) show_options;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -NAME=${1:-""} -TYPE=${2:-""} -PUBLIC_URL=${3:-""} -EXTRA=${4:-""} - -if [ -z "NAME" -o -z "$TYPE" -o -z "$PUBLIC_URL" -o -n "$EXTRA" ]; then - show_options -fi - -ADMIN_SUFFIX= -case "$TYPE" in - ec2) - SUFFIX="/services/Cloud" - ADMIN_SUFFIX="/services/Admin" - ;; - image|baremetal|network|metering) - SUFFIX="/" - ;; - orchestration|volume) - SUFFIX="/v1/%(tenant_id)s" - ;; - volumev2) - SUFFIX="/v2/%(tenant_id)s" - ;; - identity) - SUFFIX="/v2.0" - ;; - compute) - SUFFIX="/v2/\$(tenant_id)s" - ;; - computev3) - SUFFIX="/v3" - ;; - object-store) - SUFFIX="/v1/AUTH_%(tenant_id)s" - ADMIN_SUFFIX="/v1" - ;; - dashboard) - SUFFIX="/" - ADMIN_SUFFIX="/admin" - ;; - management) - SUFFIX="/v2" - ;; - *) - echo "Unknown service type" >&2 - exit 1 -esac - -if [ -z "$ADMIN_SUFFIX" ]; then - ADMIN_SUFFIX="$SUFFIX" -fi - -if [ -n "$DESCRIPTION" ]; then - DESCRIPTION="--description=$DESCRIPTION" -fi - -if [ -z "$INTERNAL_URL" ]; then - INTERNAL_URL="$PUBLIC_URL" -fi - -if [ -z "$ADMIN_URL" ]; then - ADMIN_URL="$INTERNAL_URL" -fi - -ADMIN_ROLE=$(openstack $DEBUG role list | awk '/ admin / {print $2}') -if [ -z "$ADMIN_ROLE" ]; then - echo "Could not find admin role" >&2 - exit 1 -fi - -# Some services don't need a user -if [ "dashboard" != "$TYPE" ]; then - SERVICE_TENANT=$(openstack $DEBUG project list | awk '/ service / {print $2}') - PASSWORD=${PASSWORD:-$(os-make-password)} - - # Some services have multiple endpoints, the user doesn't need to be recreated - USER_ID=$(openstack $DEBUG user show $NAME | awk '$2=="id" { print $4 }') - if [ -z "$USER_ID" ]; then - USER_ID=$(openstack $DEBUG user create --password $PASSWORD --project $SERVICE_TENANT --email=nobody@example.com $NAME | awk ' / id / {print $4}') - fi - if ! openstack role list --project $SERVICE_TENANT --user $USER_ID | grep -q " $ADMIN_ROLE "; then - echo "Creating user-role assignment for user $NAME, role admin, tenant service" - openstack role add $DEBUG \ - --project $SERVICE_TENANT \ - --user $USER_ID \ - $ADMIN_ROLE - fi - #Add the admin tenant role for ceilometer user to enable polling services - if [ "metering" == "$TYPE" ]; then - ADMIN_TENANT=$(openstack $DEBUG project list | awk '/ admin / {print $2}') - if ! openstack role list --project $ADMIN_TENANT --user $USER_ID | grep -q " $ADMIN_ROLE "; then - echo "Creating user-role assignment for user $NAME, role admin, tenant admin" - openstack role add $DEBUG \ - --project $ADMIN_TENANT \ - --user $USER_ID \ - $ADMIN_ROLE - #swift polling requires ResellerAdmin role to be added to the Ceilometer user - RESELLER_ADMIN_ROLE=$(openstack $DEBUG role list | awk '/ ResellerAdmin / {print $2}') - openstack role add $DEBUG \ - --project $ADMIN_TENANT \ - --user $USER_ID \ - $RESELLER_ADMIN_ROLE - fi - fi - -fi -SERVICE_ID=$(openstack $DEBUG service create --name $NAME "$DESCRIPTION" $TYPE | awk '/ id / {print $4}') -openstack endpoint create $DEBUG \ - --publicurl "${PUBLIC_URL}${SUFFIX}" \ - --adminurl "${ADMIN_URL}${ADMIN_SUFFIX}" \ - --internalurl "${INTERNAL_URL}${SUFFIX}" --region "$REGION" $SERVICE_ID -echo "Service $TYPE created" diff --git a/scripts/select-cloud b/scripts/select-cloud deleted file mode 100755 index bb8c9de2..00000000 --- a/scripts/select-cloud +++ /dev/null @@ -1,134 +0,0 @@ -#!/bin/bash -# Copyright 2014 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -# -# Script to make cloud selection simple -# -set -eu -set -o pipefail -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(cd $(dirname $0); pwd) - -function show_options { - echo "Usage: $SCRIPT_NAME " - echo - echo "Options:" - echo " -h, --help -- print this help." - echo " --root -- Use as TRIPLEO_ROOT" - echo - echo "Echos the appropriate setup to interact with the requested cloud." - echo "Choices for are:" - echo " seed or s" - echo " undercloud or under or u" - echo " overcloud or over or o" - echo - echo "Run as follows to source the undercloud variables into the current shell:" - echo " source <( $SCRIPT_HOME/$SCRIPT_NAME undercloud )" - echo - exit $1 -} - -TEMP=`getopt -o h -l help,root: -n $SCRIPT_NAME -- "$@"` -if [ $? != 0 ]; then - echo "Terminating..." >&2 - exit 1 -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -h|--help) show_options 0 >&2;; - --root) TRIPLEO_ROOT=$2 ; shift 2;; - --) shift ; break;; - *) echo "Error: unsupported option $1." ; exit 1;; - esac -done - -if [[ -z "${TRIPLEO_ROOT:-}" ]] ; then - echo "Error: You must have TRIPLEO_ROOT set in the environment, or specify it with --root" >&2 - show_options 1 >&2 -fi - -if (( $# != 1 )); then echo "Cloud to interact with is required" >&2; show_options 1 >&2; fi - -set_common() { - cat << EOF -source_config_file() { - filename=\$1 - if [[ -e \$filename ]] ; then - source \$filename - elif [[ -e \${TRIPLEO_ROOT}/\$filename ]] ; then - source \${TRIPLEO_ROOT}/\$filename - else - echo "Could not find \$filename - sourcing may not work" >&2 - fi -} -update_tripleo_no_proxy() { - add=\$1 - echo \$no_proxy | grep -wq \$1 || export no_proxy=\$no_proxy,\$1 -} -EOF - # This file may not be there, depending on if the undercloud/overcloud are started yet - echo "[ -f ${TRIPLEO_ROOT}/tripleorc ] && source ${TRIPLEO_ROOT}/tripleorc" - # Need to reset TRIPLEO_ROOT after sourcing tripleorc - echo "export TRIPLEO_ROOT=$TRIPLEO_ROOT" - echo "source ${TRIPLEO_ROOT}/tripleo-incubator/scripts/devtest_variables.sh" -} - -set_seed() { - cat << EOF -source ${TRIPLEO_ROOT}/tripleo-incubator/seedrc -export SEED_IP=\$(os-apply-config -m \$TE_DATAFILE --type raw --key seed-ip) -export OS_AUTH_URL=http://\${SEED_IP}:5000/v2.0 -update_tripleo_no_proxy \${SEED_IP} -export UNDERCLOUD_ID=\$(glance image-list | grep undercloud | grep qcow2 | awk '{print \$2}' | head -1) -EOF - # Don't proxy to the seeds IP on the baremetal network - echo "update_tripleo_no_proxy \$(OS_CONFIG_FILES=\$TE_DATAFILE os-apply-config \ - --key baremetal-network.seed.ip --type raw --key-default '192.0.2.1')" -} - -set_undercloud() { - cat << EOF -source_config_file tripleo-undercloud-passwords -source ${TRIPLEO_ROOT}/tripleo-incubator/undercloudrc -export UNDERCLOUD_IP=\$(os-apply-config -m \$TE_DATAFILE --type raw --key undercloud.endpointhost) -update_tripleo_no_proxy \$UNDERCLOUD_IP -EOF -} - -set_overcloud() { - cat << EOF -source_config_file tripleo-overcloud-passwords -source ${TRIPLEO_ROOT}/tripleo-incubator/overcloudrc-user -export OVERCLOUD_IP=\$(os-apply-config -m \$TE_DATAFILE --type raw --key overcloud.endpointhost) -update_tripleo_no_proxy \$OVERCLOUD_IP -EOF -} - -# Get the argument to show what cloud to interact with -case "$1" in - s|seed) cloud=seed;; - u|under|undercloud) cloud=undercloud;; - o|over|overcloud) cloud=overcloud;; - *) echo "Error: unsupported cloud $1." ; exit 1 ;; -esac - -# Call the appropriate functions -set_common -set_${cloud} diff --git a/scripts/send-irc b/scripts/send-irc deleted file mode 100755 index 70366a0a..00000000 --- a/scripts/send-irc +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash -# -# Copyright 2013 Red Hat -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -eu - -SCRIPT_NAME=$(basename $0) - -function show_options { - echo "Usage: $SCRIPT_NAME IRC_CHANNEL IRC_USERNAME MESSAGE..." - echo - echo "Send a MESSAGE to a freenode channel IRC_CHANNEL from" - echo "the user IRC_USERNAME" - echo "Examples:" - echo " $SCRIPT_NAME tripleo toci "WARNING : The build failed"" - exit 1 -} - -[ $# -lt 3 ] && show_options - -exec 3<>/dev/tcp/irc.freenode.net/6667 - -IRC_CHANNEL=$1 -IRC_USERNAME=$2 -shift 2 -MESSAGE=$@ - -echo "Nick $IRC_USERNAME" >&3 -echo "User $IRC_USERNAME -i * : hi" >&3 -sleep 2 -echo "JOIN #$IRC_CHANNEL" >&3 -echo "PRIVMSG #$IRC_CHANNEL :$@" >&3 -echo "QUIT" >&3 - -cat <&3 > /dev/null - diff --git a/scripts/set-os-type b/scripts/set-os-type deleted file mode 100755 index 305a0864..00000000 --- a/scripts/set-os-type +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash - -TRIPLEO_OS_FAMILY='unsupported' # Generic OS Family: debian, redhat, suse -TRIPLEO_OS_DISTRO='unsupported' # Specific distro: centos, fedora, rhel, - # opensuse, sles, ubuntu - -if [ -f /etc/redhat-release ]; then - TRIPLEO_OS_FAMILY='redhat' - if $(grep -Eqs 'Red Hat Enterprise Linux' /etc/redhat-release); then - TRIPLEO_OS_DISTRO='rhel' - fi - if $(grep -Eqs 'CentOS' /etc/redhat-release); then - TRIPLEO_OS_DISTRO='centos' - fi - if $(grep -Eqs 'Fedora' /etc/redhat-release); then - TRIPLEO_OS_DISTRO='fedora' - fi -fi - -if [ -f /etc/debian_version ]; then - TRIPLEO_OS_FAMILY='debian' - if $(grep -Eqs 'Ubuntu' /etc/lsb-release); then - TRIPLEO_OS_DISTRO='ubuntu' - fi - if $(grep -Eqs 'Debian' /etc/os-release); then - TRIPLEO_OS_DISTRO='debian' - fi -fi - -function get_os_release { - ( - source /etc/os-release - echo $ID - ) -} - -if [ -f /etc/os-release ]; then - if [ "$(get_os_release)" = "opensuse" ]; then - TRIPLEO_OS_FAMILY='suse' - TRIPLEO_OS_DISTRO='opensuse' - fi - if [ "$(get_os_release)" = "sles" ]; then - TRIPLEO_OS_FAMILY='suse' - TRIPLEO_OS_DISTRO='sles' - fi -fi - -export TRIPLEO_OS_FAMILY -export TRIPLEO_OS_DISTRO diff --git a/scripts/set-pip-vars b/scripts/set-pip-vars deleted file mode 100755 index 4309757a..00000000 --- a/scripts/set-pip-vars +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/bash -# Copyright 2014 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -# Script to setup pip manifest file location environment variables from a -# given directory tree - -set -eu -set -o pipefail -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(cd $(dirname $0); pwd) - -function show_options { - echo - echo "Usage: $SCRIPT_NAME file|directory ..[file|directory]" - echo - echo " This script takes a list of manifest files and or directory" - echo " trees and sets the matching DIB_PIP_MANIFEST_ environment" - echo " variable to the full path of any matching manifest" - echo " dib-pip-manifest* files found" - echo - echo " To source the export commands produced by running this script" - echo " and set the variables for the current shell," - echo " you can run the script as follows:" - echo - echo " source <( $SCRIPT_NAME /path/to/pip-manifests )" - echo - echo "Options:" - echo " -h, --help -- print this help." - echo - echo "Echo the appropriate environment variables to use a pip manifest" - echo "for input into image building with the pip-manifest element." - echo - echo "e.g. $SCRIPT_NAME ~/myTripleo/seed-manifests" - echo - exit $1 -} - -TEMP=`getopt -o h -l help -n $SCRIPT_NAME -- "$@"` -if [ $? != 0 ]; then - echo "Terminating..." >&2; - exit 1; -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -h|--help) show_options 0 >&2;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -if (( $# <= 0 )); then - echo "One or more pip manifest directory or file name required" >&2; - show_options 1 >&2 -fi - -for target in $*; do - for ent in $(find ${target} -type f -name dib-pip-manifest\* ); do - echo DIB_PIP_MANIFEST_${ent##*dib-pip-manifest-}=${ent}; - done -done 2>/dev/null | sort -t = -k1 -u - - - diff --git a/scripts/set-source-vars b/scripts/set-source-vars deleted file mode 100755 index d6fb2ab8..00000000 --- a/scripts/set-source-vars +++ /dev/null @@ -1,170 +0,0 @@ -#!/bin/bash -# Copyright 2014 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -# -# Script to make git repository selection simple -set -eu -set -o pipefail -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(cd $(dirname $0); pwd) - -function show_options { - echo "Usage: $SCRIPT_NAME [options] local_repo [...]" - echo " e.g. use locally cloned repositories as input:" - echo " $SCRIPT_NAME -l /my/local/neutron /a/local/nova" - echo " e.g. use the url of remote \"origin\" of the locally cloned repositories as input:" - echo " $SCRIPT_NAME -r origin /my/local/neutron /a/local/nova" - echo " e.g. use the values from a git manifest generated by disk-image-builder:" - echo " $SCRIPT_NAME -m tripleo-git-manifest" - echo " The above examples will set the location and reference to use." - echo " The reference will be set to the current HEAD reference of the local repository" - echo - echo " To source the export commands produced by running this script and set the variables" - echo " for the current shell you can run the script as follows:" - echo " source <( $SCRIPT_NAME -l /path/to/repo )" - echo - echo "Display source-repositories element environment variables" - echo - echo "Options:" - echo " -h, --help -- print this help." - echo " -l, --local -- use the local path location of the repository" - echo " -r , --remote -- remote of the local repo to use to get the repo url" - echo " -m , --manifest -- git manifest file as produced by running devtest" - echo - echo "Echo the appropriate environment variables to use a local git repository" - echo "for input into image building via the source-repositories element" - echo - echo "The \"local_repo\" argment is the path to a locally cloned git repository from which to" - echo "take the settings. The name of the remote \"origin\" will be used to determine the name" - echo "of the repository (nova, etc) for use in the diskimage-builder environment variables." - echo - echo "Using the -l flag will result in the full path to the local repository being used" - echo "as the location to clone from for that repository in diskimage-builder" - echo - echo "Specifying a remote via the -r flag will result in the url associated with that remote" - echo "in the local repository being used for the location to clone from for that repository" - echo "in diskimage-builder" - echo - exit $1 -} - -TEMP=`getopt -o h,l,n,r:,m: -l help,local,no-echo,no_echo,remote:,manifest: -n $SCRIPT_NAME -- "$@"` -if [ $? != 0 ]; then - echo "Terminating..." >&2 - exit 1 -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -h|--help) show_options 0 >&2;; - -l|--local) USE_LOCAL=1; shift 1;; - -r|--remote) USE_REMOTE=1; REMOTE=$2; shift 2;; - -m|--manifest) USE_MANIFEST=1; MANIFEST=$2; shift 2;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -USE_LOCAL=${USE_LOCAL:-0} -USE_REMOTE=${USE_REMOTE:-0} -REMOTE=${REMOTE:-""} -USE_MANIFEST=${USE_MANIFEST:-0} - -if [[ "$((USE_LOCAL + USE_REMOTE + USE_MANIFEST))" != "1" ]]; then - echo "Choose to either clone the local path (-l)" >&2 - echo "OR" >&2 - echo "to use the remote (-r ) defined in the local repo to lookup the repo URL" >&2 - echo "OR" >&2 - echo "to parse repos and SHA1s from a manifest file (-m )" >&2 - show_options 1 >&2 -fi - -function transform_manifest { - while read name _type _dest loc ref; do - name_transformed=$(echo "$name" | tr '[:upper:]-' '[:lower:]_') - echo "export DIB_REPOLOCATION_${name_transformed}=$loc" - echo "export DIB_REPOREF_${name_transformed}=$ref" - done -} - -function use_manifest { - for manifest in "${MANIFEST}"; do - transform_manifest < ${manifest} - done | sort -ut _ -k3 -} - - -function get_location { - local remote_name=${1:-""} - if [[ -n "${remote_name}" ]] ; then - git config --get remote.${remote_name}.url - elif [[ "${USE_LOCAL}" == "1" ]]; then - # Find the .git directory - local dir="$(pwd)" - while [[ "${dir}" != "/" ]]; do - if [[ -d "${dir}/.git" ]]; then - echo ${dir} - break - fi - dir="$(dirname $dir})" - done - else - echo -n "Internal Error: get_location called with [${remote_name}]" >&2 - echo " and USE_LOCAL is ${USE_LOCAL}" >&2 - exit 1 - fi -} - -function get_ref { - git rev-parse HEAD -} - -function get_name { - local remote_name=${1:-""} - name=$(get_location ${remote_name}) - echo $(basename ${name##*:} .git) -} - -function use_repos { - declare -A a - for dir in "${REPOS[@]}"; do - if [[ ! -d ${dir} ]] ; then - echo "Not a directory: ${dir}" >&2 - exit 1 - fi - pushd ${dir} > /dev/null 2>&1 - REPONAME=$(get_name ${REMOTE}) - REPONAME_VAR=${REPONAME//[^a-zA-Z0-9]/_} - a[DIB_REPOLOCATION_${REPONAME_VAR}]=$(get_location ${REMOTE}) - a[DIB_REPOREF_${REPONAME_VAR}]=$(get_ref) - echo "export DIB_REPOLOCATION_${REPONAME_VAR}=${a[DIB_REPOLOCATION_${REPONAME_VAR}]}" - echo "export DIB_REPOREF_${REPONAME_VAR}=${a[DIB_REPOREF_${REPONAME_VAR}]}" - popd > /dev/null 2>&1 - done -} - - -if [[ "${USE_MANIFEST}" == "1" ]] ; then - use_manifest -else - if (( $# <= 0 )); then echo "Local repository location is required" >&2; show_options 1 >&2; fi - REPOS=( "${@}" ) - use_repos -fi - diff --git a/scripts/set-usergroup-membership b/scripts/set-usergroup-membership deleted file mode 100755 index 733916dc..00000000 --- a/scripts/set-usergroup-membership +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/bash -set -eu - -# libvirtd group -case "$TRIPLEO_OS_DISTRO" in - 'debian' | 'opensuse' | 'sles') - LIBVIRTD_GROUP='libvirt' - ;; - *) - LIBVIRTD_GROUP='libvirtd' - ;; -esac -getent group $LIBVIRTD_GROUP || sudo groupadd $LIBVIRTD_GROUP - -if [ "$TRIPLEO_OS_FAMILY" = "suse" ]; then - # kvm_intel/amd is autoloaded on SUSE, but without - # proper permissions. the kvm package will install an udev rule, - # so lets activate that one: - if [ "$(sudo readlink -f /proc/1/root)" = "/" ]; then - sudo /sbin/udevadm control --reload-rules || : - sudo /sbin/udevadm trigger || : - fi -fi - -if [ "$TRIPLEO_OS_FAMILY" = "redhat" ]; then - libvirtd_file=/etc/libvirt/libvirtd.conf - if ! sudo grep -q "^unix_sock_group" $libvirtd_file; then - sudo sed -i "s/^#unix_sock_group.*/unix_sock_group = \"$LIBVIRTD_GROUP\"/g" $libvirtd_file - sudo sed -i 's/^#auth_unix_rw.*/auth_unix_rw = "none"/g' $libvirtd_file - sudo sed -i 's/^#unix_sock_rw_perms.*/unix_sock_rw_perms = "0770"/g' $libvirtd_file - sudo service libvirtd restart - fi -fi - -REMOTE_OPERATIONS=${REMOTE_OPERATIONS:-0} -if [ "$REMOTE_OPERATIONS" != 1 -a -n "$TE_DATAFILE" -a -e "$TE_DATAFILE" ]; then - REMOTE_OPERATIONS=$(jq '.["remote-operations"]' $TE_DATAFILE) - REMOTE_OPERATIONS=${REMOTE_OPERATIONS//\"} -fi - -if [ $REMOTE_OPERATIONS != 1 ]; then - if ! id | grep -qw $LIBVIRTD_GROUP; then - echo "adding $USER to group $LIBVIRTD_GROUP" - sudo usermod -a -G $LIBVIRTD_GROUP $USER - - echo "$USER was just added to the $LIBVIRTD_GROUP. Devtest will not" - echo "be able to continue until you start a new session to pick up the" - echo "new group membership. This can be done by either logging out and" - echo "back in, or running:" - echo - echo "sudo su -l $USER" - echo - echo "To verify that your group membership is correct, you can use the" - echo "following command:" - echo - echo "id | grep $LIBVIRTD_GROUP" - echo - echo "Once you have verified your group membership, you should be able to" - echo "re-run devtest successfully or continue with devtest_testenv." - # We have to exit non-zero so the calling script knows to stop. - exit 1 - fi -else - echo $TE_DATAFILE says to use remote operations\; not adding $USER to $LIBVIRTD_GROUP -fi diff --git a/scripts/setup-baremetal b/scripts/setup-baremetal deleted file mode 100755 index 20bc0004..00000000 --- a/scripts/setup-baremetal +++ /dev/null @@ -1,115 +0,0 @@ -#!/bin/bash -# -# Copyright 2013-2014 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -eu -set -o pipefail - -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -function show_options { - echo "Usage: $SCRIPT_NAME [options]" - echo - echo "Reads a JSON file describing machines for a baremetal cluster and" - echo "registers them all with Nova baremetal. Excess machines are removed" - echo "and flavors are created to match the machines that have been" - echo "registered using the local deploy-ramdisk and kernel, which are also" - echo "loaded into glance." - echo - echo "Options:" - echo " -h -- this help" - echo " --service-host -- nova bm service host to register nodes with" - echo " --nodes -- JSON list of nodes to register" - echo - exit $1 -} - -SERVICE_HOST="" -JSON_PATH= - -TEMP=$(getopt -o h -l help,service-host:,nodes: -n $SCRIPT_NAME -- "$@") -if [ $? != 0 ]; then - echo "Terminating..." >&2 - exit 1 -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -h | --help) show_options 0;; - --service-host) SERVICE_HOST="$2"; shift 2 ;; - --nodes) JSON_PATH="$2"; shift 2 ;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -if [ -z "$SERVICE_HOST" ]; then - echo "Ironic not supported, please specify --service-host." - exit 1 -fi -if [ -z "$JSON_PATH" ]; then - echo "A node list is required." - exit 1 -fi - -deploy_kernel=$TRIPLEO_ROOT/deploy-ramdisk-ironic.kernel -deploy_ramdisk=$TRIPLEO_ROOT/deploy-ramdisk-ironic.initramfs -if ! nova image-show bm-deploy-kernel > /dev/null ; then - deploy_kernel_id=$(glance image-create --name bm-deploy-kernel --visibility public \ - --disk-format aki --container-format aki < "$deploy_kernel" | awk ' / id / {print $4}') - deploy_ramdisk_id=$(glance image-create --name bm-deploy-ramdisk --visibility public \ - --disk-format ari --container-format ari < "$deploy_ramdisk" | awk ' / id / {print $4}') -fi - -NODES=$(cat $JSON_PATH) -register-nodes -s $SERVICE_HOST -n <(echo $NODES) -k bm-deploy-kernel -d bm-deploy-ramdisk - -function cleanup_flavor { - local FLAVOR_NAME=${1:?"cleanup_flavor requires a flavor name"} - if nova flavor-show "$FLAVOR_NAME" &> /dev/null; then - nova flavor-delete "$FLAVOR_NAME" - fi -} - -# While we can't mix hypervisors, having non-baremetal flavors will just -# confuse things. -cleanup_flavor 'm1.tiny' -cleanup_flavor 'm1.small' -cleanup_flavor 'm1.medium' -cleanup_flavor 'm1.large' -cleanup_flavor 'm1.xlarge' - -cleanup_flavor 'baremetal' -# XXX(lifeless) this should be a loop making sure every node is represented -# with a flavor. -MEM=$(jq -r ".[0][\"memory\"]" <<< $NODES) -DISK=$(jq -r ".[0][\"disk\"]" <<< $NODES) -CPU=$(jq -r ".[0][\"cpu\"]" <<< $NODES) -ARCH=$(jq -r ".[0][\"arch\"]" <<< $NODES) - -EPHEMERAL_DISK=$(( $DISK - $ROOT_DISK )) -if (( $EPHEMERAL_DISK < 0 )); then - echo "Error: NODE_DISK - ROOT_DISK must be >= 0 to specify size of ephemeral disk" - exit 1 -fi - -nova flavor-create baremetal \ - --ephemeral $EPHEMERAL_DISK auto $MEM $ROOT_DISK $CPU -nova flavor-key baremetal set "cpu_arch"="$ARCH" diff --git a/scripts/setup-clienttools b/scripts/setup-clienttools deleted file mode 100755 index ef6bfdf9..00000000 --- a/scripts/setup-clienttools +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -set -eu - -BASE=$(readlink -f $(dirname $0)/..) -VENV_HOME=$BASE/openstack-tools - -if [ ! -f $VENV_HOME/bin/activate ]; then - virtualenv --setuptools $VENV_HOME -fi - -# NOTE(derekh): we need to use +u to workaround an issue with the activate script -# /opt/stack/new/tripleo-incubator/openstack-tools/bin/activate: line 8: _OLD_VIRTUAL_PATH: unbound variable -set +u -source $VENV_HOME/bin/activate -set -u - -# Use latest versions of build/environment tooling. -pip install -U pip -pip install -U wheel setuptools pbr - -pip install -U \ - os-apply-config \ - os-cloud-config \ - python-barbicanclient \ - python-ceilometerclient \ - python-cinderclient \ - python-glanceclient \ - python-heatclient \ - python-ironicclient \ - python-neutronclient \ - python-novaclient \ - python-openstackclient \ - python-swiftclient - -for tool in os-apply-config cinder nova glance heat neutron swift ironic ceilometer openstack init-keystone generate-keystone-pki register-nodes setup-neutron; do - ln -sf $VENV_HOME/bin/$tool $BASE/scripts/$tool ; -done -echo "Installed openstack client tool symlinks in $BASE/scripts" diff --git a/scripts/setup-endpoints b/scripts/setup-endpoints deleted file mode 100755 index 9e86d7e6..00000000 --- a/scripts/setup-endpoints +++ /dev/null @@ -1,176 +0,0 @@ -#!/bin/bash -# -# Copyright 2013 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -eu - -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -function show_options { - echo "Usage: $SCRIPT_NAME [options] " - echo - echo "Perform initial setup of a cloud running on " - echo - echo "This will register ec2, image, orchestration, identity, network, " - echo "volume (optional), dashboard (optional), metering (optional) and " - echo "compute services as running on the default ports on controlplane-ip." - echo - echo "Options:" - echo " -r, --region -- Override the default region 'regionOne'." - echo " --ceilometer-password -- Specify a password for ceilometer" - echo " --cinder-password -- Specify a password for cinder." - echo " --glance-password -- Specify a password for glance." - echo " --heat-password -- Specify a password for heat." - echo " --ironic-password -- Specify a password for ironic." - echo " --neutron-password -- Specify a password for neutron." - echo " --nova-password -- Specify a password for nova." - echo " --swift-password -- Specify a password for swift" - echo " --tuskar-password -- Specify a password for tuskar" - echo " --enable-horizon -- Enable horizon" - echo " --debug -- Debug the API calls made." - echo " --ssl -- Use SSL public endpoints. Takes the hostname to" - echo " use for the public endpoints." - echo " --public -- Use non-SSL public endpoints. Takes the ip/hostname" - echo " to use for the public endpoints." - echo - echo "For instance: $SCRIPT_NAME 192.0.2.1" - echo "For instance(ssl): $SCRIPT_NAME --ssl mysite.org 192.0.2.1" - exit $1 -} - -DEBUG="" -CEILOMETER_PASSWORD="" -CINDER_PASSWORD="" -GLANCE_PASSWORD="" -HEAT_PASSWORD="" -IRONIC_PASSWORD="" -NEUTRON_PASSWORD="" -NOVA_PASSWORD="" -SWIFT_PASSWORD="" -TUSKAR_PASSWORD="" -ENABLE_HORIZON="" -SSL="" -PUBLIC="" -REGION="regionOne" #NB: This is the keystone default. - -TEMP=`getopt -o r: -l region:,debug,ceilometer-password:,cinder-password:,glance-password:,heat-password:,ironic-password:,public:,neutron-password:,nova-password:,swift-password:,tuskar-password:,enable-horizon,ssl: -n $SCRIPT_NAME -- "$@"` -if [ $? != 0 ]; then - echo "Terminating..." >&2; - exit 1; -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -r|--region) export REGION=$2; shift 2 ;; - --debug) export DEBUG=--debug; set -x; shift 1;; - --ceilometer-password) export CEILOMETER_PASSWORD=$2; shift 2 ;; - --cinder-password) export CINDER_PASSWORD=$2; shift 2 ;; - --glance-password) export GLANCE_PASSWORD=$2; shift 2 ;; - --heat-password) export HEAT_PASSWORD=$2; shift 2 ;; - --ironic-password) export IRONIC_PASSWORD=$2; shift 2 ;; - --neutron-password) export NEUTRON_PASSWORD=$2; shift 2 ;; - --nova-password) export NOVA_PASSWORD=$2; shift 2 ;; - --public) export PUBLIC=$2; shift 2 ;; - --swift-password) export SWIFT_PASSWORD=$2; shift 2 ;; - --tuskar-password) export TUSKAR_PASSWORD=$2; shift 2 ;; - --enable-horizon) export ENABLE_HORIZON=--enable-horizon; shift 1;; - --ssl) export SSL=$2; shift 2 ;; - -h) show_options 0;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -HOST=${1:-""} -EXTRA=${2:-""} - -if [ -z "$HOST" -o -n "$EXTRA" ]; then - show_options 1 -fi - -INTERNAL_HOST=http://${HOST}: - -if [ -n "$SSL" ]; then - PUBLIC_HOST=https://${SSL}: -elif [ -n "$PUBLIC" ]; then - PUBLIC_HOST=http://${PUBLIC}: -else - PUBLIC_HOST=$INTERNAL_HOST -fi - -NORMAL_PORT=8004 -SSL_PORT=${SSL:+13004} -SSL_PORT=${SSL_PORT:-$NORMAL_PORT} -PASSWORD=$HEAT_PASSWORD register-endpoint $DEBUG -r $REGION -d "Heat Service" heat orchestration -i ${INTERNAL_HOST}${NORMAL_PORT} ${PUBLIC_HOST}${SSL_PORT} - -NORMAL_PORT=9696 -SSL_PORT=${SSL:+13696} -SSL_PORT=${SSL_PORT:-$NORMAL_PORT} -PASSWORD=$NEUTRON_PASSWORD register-endpoint $DEBUG -r $REGION -d "Neutron Service" neutron network -i ${INTERNAL_HOST}${NORMAL_PORT} ${PUBLIC_HOST}${SSL_PORT} - -NORMAL_PORT=9292 -SSL_PORT=${SSL:+13292} -SSL_PORT=${SSL_PORT:-$NORMAL_PORT} -PASSWORD=$GLANCE_PASSWORD register-endpoint $DEBUG -r $REGION -d "Glance Image Service" glance image -i ${INTERNAL_HOST}${NORMAL_PORT} ${PUBLIC_HOST}${SSL_PORT} - -NORMAL_PORT=8773 -SSL_PORT=${SSL:+13773} -SSL_PORT=${SSL_PORT:-$NORMAL_PORT} -register-endpoint $DEBUG -r $REGION -d "EC2 Compatibility Layer" ec2 ec2 -i ${INTERNAL_HOST}${NORMAL_PORT} ${PUBLIC_HOST}${SSL_PORT} - -NORMAL_PORT=8774 -SSL_PORT=${SSL:+13774} -SSL_PORT=${SSL_PORT:-$NORMAL_PORT} -PASSWORD=$NOVA_PASSWORD register-endpoint $DEBUG -r $REGION -d "Nova Compute Service" nova compute -i ${INTERNAL_HOST}${NORMAL_PORT} ${PUBLIC_HOST}${SSL_PORT} -PASSWORD=$NOVA_PASSWORD register-endpoint $DEBUG -r $REGION -d "Nova Compute Service v3" nova computev3 -i ${INTERNAL_HOST}${NORMAL_PORT} ${PUBLIC_HOST}${SSL_PORT} - -if [ -n "$CEILOMETER_PASSWORD" ]; then - # Updating Ceilometer to be like other services - NORMAL_PORT=8777 - SSL_PORT=${SSL:+13777} - SSL_PORT=${SSL_PORT:-$NORMAL_PORT} - PASSWORD=$CEILOMETER_PASSWORD register-endpoint $DEBUG -r $REGION -d "Ceilometer Service" ceilometer metering -i ${INTERNAL_HOST}${NORMAL_PORT} ${PUBLIC_HOST}${SSL_PORT} -fi -if [ -n "$CINDER_PASSWORD" ]; then - NORMAL_PORT=8776 - SSL_PORT=${SSL:+13776} - SSL_PORT=${SSL_PORT:-$NORMAL_PORT} - PASSWORD=$CINDER_PASSWORD register-endpoint $DEBUG -r $REGION -d "Cinder Volume Service" cinder volume -i ${INTERNAL_HOST}${NORMAL_PORT} ${PUBLIC_HOST}${SSL_PORT} - PASSWORD=$CINDER_PASSWORD register-endpoint $DEBUG -r $REGION -d "Cinder Volume Service V2" cinderv2 volumev2 -i ${INTERNAL_HOST}${NORMAL_PORT} ${PUBLIC_HOST}${SSL_PORT} -fi -if [ -n "$SWIFT_PASSWORD" ]; then - NORMAL_PORT=8080 - SSL_PORT=${SSL:+13080} - SSL_PORT=${SSL_PORT:-$NORMAL_PORT} - PASSWORD=$SWIFT_PASSWORD register-endpoint $DEBUG -r $REGION -d "Swift Object Storage Service" swift object-store -i ${INTERNAL_HOST}${NORMAL_PORT} ${PUBLIC_HOST}${SSL_PORT} -fi -if [ -n "$ENABLE_HORIZON" ]; then - # XXX: SSL not wired up yet. - register-endpoint $DEBUG -r $REGION -d "OpenStack Dashboard" horizon dashboard -i ${INTERNAL_HOST} ${INTERNAL_HOST} -fi -if [ -n "$IRONIC_PASSWORD" ]; then - # XXX: SSL not wired up yet. - PASSWORD=$IRONIC_PASSWORD register-endpoint $DEBUG -r $REGION -d "Ironic Service" ironic baremetal -i ${INTERNAL_HOST}6385 ${PUBLIC_HOST}6385 -fi - -if [ -n "$TUSKAR_PASSWORD" ]; then - # XXX: SSL not wired up yet. - PASSWORD=$TUSKAR_PASSWORD register-endpoint $DEBUG -r $REGION -d "Tuskar Service" tuskar management -i ${INTERNAL_HOST}8585 ${PUBLIC_HOST}8585 -fi diff --git a/scripts/setup-env b/scripts/setup-env deleted file mode 120000 index 2d21e0e7..00000000 --- a/scripts/setup-env +++ /dev/null @@ -1 +0,0 @@ -refresh-env \ No newline at end of file diff --git a/scripts/setup-network b/scripts/setup-network deleted file mode 100755 index 41e6c431..00000000 --- a/scripts/setup-network +++ /dev/null @@ -1,74 +0,0 @@ -#!/bin/bash -set -eu - -BASE=$(dirname $0)/../ -BRIDGE_SUFFIX=${1:-''} # support positional arg for legacy support -BRIDGE_NAMES='brbm' -VLAN_TRUNK_IDS='' - -SCRIPT_NAME=$(basename $0) - -function show_options { - echo "Usage: $SCRIPT_NAME [-n num] [-b space delimited bridge names ]" - echo - echo "Setup libvirt networking and OVS bridges for TripleO." - echo - echo " -n -- Bridge number/suffix. Added to all bridges." - echo " Useful when creating multiple environments" - echo " on the same machine." - echo " -b -- Space delimited list of baremetal bridge" - echo " name(s). Defaults to brbm." - echo - exit 1 -} - -TEMP=$(getopt -o h,n:,b: -n $SCRIPT_NAME -- "$@") -if [ $? != 0 ]; then - show_options; -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -h) show_options ;; - -n) BRIDGE_SUFFIX="$2" ; shift 2 ;; - -b) BRIDGE_NAMES="$2" ; shift 2 ;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; show_options ;; - esac -done - -function create_bridge { - local BRIDGE_NAME=$1 - - # Only add bridge if missing - (sudo ovs-vsctl list-br | grep ${BRIDGE_NAME}$) || sudo ovs-vsctl add-br ${BRIDGE_NAME} - - # remove bridge before replacing it. - (virsh net-list --persistent | grep "${BRIDGE_NAME} ") && virsh net-destroy ${BRIDGE_NAME} - (virsh net-list --inactive --persistent | grep "${BRIDGE_NAME} ") && virsh net-undefine ${BRIDGE_NAME} - - virsh net-define <(sed -e "s/%NETWORK_NAME%/$BRIDGE_NAME/" $BASE/templates/net.xml) - virsh net-autostart ${BRIDGE_NAME} - virsh net-start ${BRIDGE_NAME} - -} - -for NAME in $BRIDGE_NAMES; do - create_bridge "$NAME$BRIDGE_SUFFIX" -done - -# start default if needed and configure it to autostart -default_net=$(sudo virsh net-list --all --persistent | grep default | awk 'BEGIN{OFS=":";} {print $2,$3}') -state=${default_net%%:*} -autostart=${default_net##*:} - -if [ "$state" != "active" ]; then - virsh net-start default -fi - -if [ "$autostart" != "yes" ]; then - virsh net-autostart default -fi diff --git a/scripts/setup-overcloud-passwords b/scripts/setup-overcloud-passwords deleted file mode 100755 index e9904da2..00000000 --- a/scripts/setup-overcloud-passwords +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/bash -# -# Copyright 2013 Red Hat, Inc. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -e -set -o pipefail - -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -function show_options { - echo "Usage: $SCRIPT_NAME [options] FILENAME" - echo - echo "Generate passwords for devtest and write them out to a file" - echo "that can be sourced." - echo - echo "Options:" - echo " -f, --file -- Noop. For backwards compatibility only" - echo " -o, --overwrite -- Overwrite file if it already exists." - exit $1 -} - -FILE= - -TEMP=`getopt -o hof -l help,overwrite,file -n $SCRIPT_NAME -- "$@"` -if [ $? != 0 ]; then - echo "Terminating..." >&2; - exit 1; -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -f | --file) shift 1 ;; - -o | --overwrite) OVERWRITE=--overwrite; shift 1 ;; - -h | --help) show_options 0;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -FILE=${FILE:-$1} - -if [ -z "$FILE" ]; then - echo "ERROR: Must provide a filename" - exit 1 -fi - -OVERWRITE=${OVERWRITE:-""} - -touch $FILE -# Make the file secure as reasonably possible. -chmod 0600 $FILE -if [ -n "$OVERWRITE" ]; then - echo -n "" > $FILE -fi - -function generate_password { - local name=$1 - if [ -z "$(grep "^$name=" $FILE)" ]; then - echo "$name=$(os-make-password)" >> $FILE - else - echo "Password $name in $FILE already exists, not overwriting." - echo "To overwrite all passwords in $FILE specify -o." - fi -} - -PASSWORD_LIST="OVERCLOUD_ADMIN_PASSWORD -OVERCLOUD_ADMIN_TOKEN -OVERCLOUD_CEILOMETER_PASSWORD -OVERCLOUD_CEILOMETER_SECRET -OVERCLOUD_CINDER_PASSWORD -OVERCLOUD_DEMO_PASSWORD -OVERCLOUD_GLANCE_PASSWORD -OVERCLOUD_HEAT_PASSWORD -OVERCLOUD_HEAT_STACK_DOMAIN_PASSWORD -OVERCLOUD_NEUTRON_PASSWORD -OVERCLOUD_NOVA_PASSWORD -OVERCLOUD_SWIFT_HASH -OVERCLOUD_SWIFT_PASSWORD" - -for name in $PASSWORD_LIST; do - generate_password $name -done diff --git a/scripts/setup-seed-vm b/scripts/setup-seed-vm deleted file mode 100755 index e6c14808..00000000 --- a/scripts/setup-seed-vm +++ /dev/null @@ -1,133 +0,0 @@ -#!/bin/bash -# -# Copyright 2013 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -e - -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -PATH=$PATH:/usr/sbin:/sbin - -# Some defaults -ARCH=i386 -BRIDGE=brbm -OVSBRIDGE= -MEMORY=2097152 -CPUS=1 -export IMAGE_NAME=seed -LIBVIRT_NIC_DRIVER=${LIBVIRT_NIC_DRIVER:-"virtio"} -LIBVIRT_DISK_BUS_TYPE=${LIBVIRT_DISK_BUS_TYPE:-"sata"} - -function show_options { - echo "Usage: $SCRIPT_NAME [options] [ ...]" - echo - echo "Create a VM definition for the seed VM." - echo "See ../scripts/devtest.sh" - echo - echo "Options:" - echo " -a i386|amd64 -- set the architecture of the VM (i386)" - echo " -o name -- set the name of the VM and image file" - echo " (seed) - must match that from boot-seed-vm" - echo " -m memory -- define amount of memory to use" - echo " -c cpus -- define number of CPUs to use" - echo " -b bridge -- define a baremetal bridge to use" - echo " -p bridge -- define an ovs bridge to use for the public interface" - echo " -e engine -- set the virt engine to use" - echo " (defaults to kvm if available, otherwise" - echo " qemu)" - echo - exit $1 -} - -TEMP=`getopt -o ha:o:m:c:b:p:e: -n $SCRIPT_NAME -- "$@"` -if [ $? != 0 ]; then - echo "Terminating..." >&2 - exit 1 -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -a) export ARCH=$2; shift 2 ;; - -o) export IMAGE_NAME=$2; shift 2 ;; - -m) export MEMORY=$2; shift 2 ;; - -c) export CPUS=$2; shift 2 ;; - -b) export BRIDGE=$2; shift 2 ;; - -p) export OVSBRIDGE=$2; shift 2 ;; - -e) export ENGINE=$2; shift 2 ;; - -h) show_options 0;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -EXTRA_ARGS=${1:-''} - -if [ -n "$EXTRA_ARGS" ]; then - show_options 1 -fi - -if [[ -z "$ENGINE" ]]; then - if [ -d /sys/module/kvm ]; then - ENGINE=kvm - else - ENGINE=qemu - if test -r /proc/cpuinfo && grep -q "vmx\|svm" /proc/cpuinfo; then - echo 'CPU supports virtualization but the kvm module is not loaded.' - fi - echo 'Using qemu as virtualization engine. Warning!: things will be extremely slow.' - fi -fi - -SEED_ARCH= - -case $ARCH in - i386) SEED_ARCH='i686'; ;; - amd64|x86_64) SEED_ARCH='x86_64'; ;; - *) echo "Unsupported arch $ARCH!" ; exit 1 ;; -esac - -which virsh >/dev/null || die "Error: virsh not found in path" -sudo virsh destroy $IMAGE_NAME 2>/dev/null || echo "$IMAGE_NAME VM not running" -sudo virsh undefine $IMAGE_NAME --managed-save 2>/dev/null || echo "$IMAGE_NAME VM not defined" -sudo touch /var/lib/libvirt/images/$IMAGE_NAME.qcow2 - -EXTRAOPTS= -if [ -n "$OVSBRIDGE" ] ; then - EXTRAOPTS="--ovsbridge $OVSBRIDGE" -fi - -if [[ $DIB_COMMON_ELEMENTS == *enable-serial-console* ]]; then - EXTRAOPTS="${EXTRAOPTS} --enable-serial-console" -fi - -configure-vm $EXTRAOPTS \ - --name $IMAGE_NAME \ - --image /var/lib/libvirt/images/$IMAGE_NAME.qcow2 \ - --diskbus $LIBVIRT_DISK_BUS_TYPE \ - --baremetal-interface $BRIDGE \ - --engine $ENGINE \ - --arch $SEED_ARCH \ - --memory $MEMORY \ - --cpus $CPUS \ - --libvirt-nic-driver $LIBVIRT_NIC_DRIVER \ - --seed - -MAC=$(sudo virsh dumpxml $IMAGE_NAME | grep "mac address" | head -1 | awk -F "'" '{print $2}') -echo "Seed VM created with MAC ${MAC}" diff --git a/scripts/setup-undercloud-passwords b/scripts/setup-undercloud-passwords deleted file mode 100755 index d088c39a..00000000 --- a/scripts/setup-undercloud-passwords +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/bash -# -# Copyright 2013 Red Hat, Inc. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -e -set -o pipefail - -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -function show_options { - echo "Usage: $SCRIPT_NAME [options] FILENAME" - echo - echo "Generate passwords for devtest and write them out to a file" - echo "that can be sourced." - echo - echo "Options:" - echo " -f, --file -- Noop. For backwards compatibility only" - echo " -o, --overwrite -- Overwrite file if it already exists." - exit $1 -} - -FILE= - -TEMP=`getopt -o hof -l help,overwrite,file -n $SCRIPT_NAME -- "$@"` -if [ $? != 0 ]; then - echo "Terminating..." >&2; - exit 1; -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -f | --file) shift 1 ;; - -o | --overwrite) OVERWRITE=--overwrite; shift 1 ;; - -h | --help) show_options 0;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -FILE=${FILE:-$1} - -if [ -z "$FILE" ]; then - echo "ERROR: Must provide a filename" - exit 1 -fi - -OVERWRITE=${OVERWRITE:-""} - -touch $FILE -# Make the file secure as reasonably possible. -chmod 0600 $FILE -if [ -n "$OVERWRITE" ]; then - echo -n "" > $FILE -fi - -function generate_password { - local name=$1 - if [ -z "$(grep "^$name=" $FILE)" ]; then - echo "$name=$(os-make-password)" >> $FILE - else - echo "Password $name in $FILE already exists, not overwriting." - echo "To overwrite all passwords in $FILE specify -o." - fi -} - -PASSWORD_LIST="UNDERCLOUD_ADMIN_TOKEN -UNDERCLOUD_ADMIN_PASSWORD -UNDERCLOUD_CEILOMETER_PASSWORD -UNDERCLOUD_CEILOMETER_SNMPD_PASSWORD -UNDERCLOUD_GLANCE_PASSWORD -UNDERCLOUD_HEAT_PASSWORD -UNDERCLOUD_NEUTRON_PASSWORD -UNDERCLOUD_NOVA_PASSWORD -UNDERCLOUD_IRONIC_PASSWORD -UNDERCLOUD_TUSKAR_PASSWORD" - -for name in $PASSWORD_LIST; do - generate_password $name -done diff --git a/scripts/takeovernode b/scripts/takeovernode deleted file mode 100755 index e130c2ca..00000000 --- a/scripts/takeovernode +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash - -# -# Copyright 2012 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -# Initial cut - no functions, JFDI. - -if [ -z "$1" ]; then - echo "No host supplied" >&2 - exit 1 -fi -if [ -z "$2" ]; then - echo "No image id supplied" >&2 - exit 1 -fi -#ref image=481ddf40-8f9c-4175-a993-c11b070d6653 -# NOT SAFE against /etc races. -commands="sudo su - -apt-get -y install python-pip qemu-utils -pip install python-glanceclient -rm /tmp/image.qcow2 -http_proxy= /usr/local/bin/glance -v --os-username demo --os-password nomoresecrete --os-tenant-name demo --os-auth-url http://glance.tripleo.org:5000/v2.0 --os-image-url http://glance.tripleo.org:9292/ image-download $2 --file /tmp/image.qcow2 -ls -lh /tmp/ -modprobe nbd max_part=16 -rmdir /tmp/newimage -mkdir -p /tmp/newimage -qemu-nbd -c /dev/nbd1 /tmp/image.qcow2 -mount /dev/nbd1 /tmp/newimage -rm -rf /tmp/recover -mkdir -p /tmp/recover/ssh -cp -ta /tmp/recover /etc/mtab /etc/hosts -cp -a /etc/ssh/ssh_host_*key* /tmp/recover/ssh/ -[ -e "/tmp/newimage/boot" ] && rsync -axHAXv /tmp/newimage/ / --exclude=/tmp --delete-after | tee -a /tmp/rsync.log -cp -at /etc /tmp/recover/* -# Rewrites e.g. /dev/nbd0 -> a FS UUID from the taken over system -# XXX: TODO: Relabel the taken over system rootfs label to match root=LABEL=cloudimg-rootfs -# XXX: TODO: make the built images use the label, not the device. -update-grub -grub-install /dev/vda -reboot -n -" -# Rewrites e.g. /dev/nbd0 -> a FS UUID from the taken over system -echo "$commands" | ssh ubuntu@$1 -# TODO: -# permit either: -# reboot -n -# or (staying online) -# retrigger cloud-init -# then free up the device.... -# apt-get install qemu-utils -# sudo umount /tmp/newimage -# sudo qemu-nbd -d /dev/nbd1 -# -#ssh stack@host / ubuntu@host? -# for the bootstrap image: -# Add eth1 via modprobe dummy && dummy0 - edit localrc and /etc/network/interfaces -#sudo ifup dummy0 -#tripleo-incubator/scripts/demo -#$profit - diff --git a/scripts/undercloud-debug b/scripts/undercloud-debug deleted file mode 100755 index 09ff4653..00000000 --- a/scripts/undercloud-debug +++ /dev/null @@ -1,74 +0,0 @@ -#!/bin/bash -# Copyright 2015 Red Hat, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -eux - -LOGFILE=undercloud-debug.log - -exec > >(tee $LOGFILE) -exec 2>&1 - -OS_AUTH_URL=${OS_AUTH_URL:-""} -if [ -z "$OS_AUTH_URL" ]; then - echo "You must source a stackrc file for the Undercloud." - exit 1 -fi - -nova list -for i in $(nova list | head -n -1 | tail -n +4 | awk '{print $2}'); do nova show $i; done -nova flavor-list -for f in $(nova flavor-list | head -n -1 | tail -n +4 | awk '{print $2}'); do nova flavor-show $f; done -nova quota-show -nova hypervisor-list -nova hypervisor-stats -nova service-list - -ironic node-list -for n in $(ironic node-list | head -n -1 | tail -n +4 | awk '{print $2}'); do ironic node-show $n; done -for n in $(ironic node-list | head -n -1 | tail -n +4 | awk '{print $2}'); do ironic node-port-list $n; done - -glance image-list -for i in $(glance image-list | head -n -1 | tail -n +4 | awk '{print $2}'); do glance image-show $i; done - -heat stack-list -if heat stack-list | grep overcloud; then - heat stack-show overcloud - heat resource-list -n 10 overcloud - for failed_deployment in $(heat resource-list --nested-depth 5 overcloud | grep FAILED | grep -E 'OS::Heat::SoftwareDeployment |OS::Heat::StructuredDeployment ' | cut -d '|' -f 3); do - echo $failed_deployment; - heat deployment-show $failed_deployment; - done -fi - -keystone endpoint-list -keystone catalog - -neutron quota-list -neutron net-list -neutron port-list -neutron agent-list - -sudo ovs-vsctl show -sudo ovs-ofctl dump-flows br-ctlplane - -set +x -echo -echo -echo "###############################################################" -echo "# All output saved to undercloud-debug.log" -echo "# Finished." -echo "###############################################################" - -exit diff --git a/scripts/update-admin-ssh-keys b/scripts/update-admin-ssh-keys deleted file mode 100755 index bff095b2..00000000 --- a/scripts/update-admin-ssh-keys +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash -set -eu -set -o pipefail -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -function show_options { - echo "Usage: $SCRIPT_NAME" - echo - echo "Pull the latest tripleo-cd-admin ssh keys into a user account." - echo - echo "Assumes it is running as that user." - echo - echo "Options:" - echo " -u|--users -- Update passwords for individual user accounts" - echo " instead of the root account." - echo " -h|--help -- This help." - echo - exit $1 -} - - -TEMP=$(getopt -o hu -l help,users -n $SCRIPT_NAME -- "$@") -if [ $? != 0 ]; then - echo "Terminating..." >&2; - exit 1; -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -INDIVIDUAL_USERS= - -while true ; do - case "$1" in - -h|--help) show_options 0;; - -u|--users) shift ; INDIVIDUAL_USERS=1;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -if [ -n "${1:-}" ]; then - show_options 1 -fi - -cd ~ -mkdir -p .ssh -chmod 0700 .ssh -mkdir -p .cache/tripleo-cd - -# Get the keys -cd .cache/tripleo-cd -if [ ! -d tripleo-incubator ]; then - git clone https://git.openstack.org/openstack/tripleo-incubator - cd tripleo-incubator -else - cd tripleo-incubator - git pull -fi -TMP_SSH_KEYS=$(mktemp) -for FILE in tripleo-cloud/ssh-keys/*; do - if [ -n "$INDIVIDUAL_USERS" ]; then - USER=$(basename $FILE) - if ! getent passwd $USER &>/dev/null; then - useradd --create-home --user-group $USER - fi - eval mkdir -p ~$USER/.ssh - eval chown -R $USER:$USER ~$USER/.ssh - eval chmod 700 ~$USER/.ssh - eval cp -f $FILE ~$USER/.ssh/authorized_keys - eval chmod 600 ~$USER/.ssh/authorized_keys - touch /etc/sudoers.d/$USER - chmod 0440 /etc/sudoers.d/$USER - echo "$USER ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/$USER - else - cat $FILE >> $TMP_SSH_KEYS - fi -done - -if [ -z "$INDIVIDUAL_USERS" ]; then - # Allow tripleo-incubator stuff that wants to add local keys... - # they'll get wiped on the next run (and obviously aren't relevant for bm - # access). - chmod 0600 $TMP_SSH_KEYS - mv $TMP_SSH_KEYS ~/.ssh/authorized_keys -else - # in individual users mode lets... lets check sudo syntax - visudo -c -q - rm $TMP_SSH_KEYS -fi diff --git a/scripts/user-config b/scripts/user-config deleted file mode 100755 index 5fa2b2d2..00000000 --- a/scripts/user-config +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -set -eu - -# Assumes nova etc are on PATH. -nova keypair-add --pub-key ~/.ssh/id_rsa.pub default diff --git a/scripts/wait_for b/scripts/wait_for deleted file mode 100755 index 82fe763e..00000000 --- a/scripts/wait_for +++ /dev/null @@ -1,179 +0,0 @@ -#!/bin/bash -# -# Copyright 2013 Red Hat -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -e # exit on the first non-zero status -set -u # exit on unset variables -set -o pipefail - -SCRIPT_NAME=$(basename $0) - - -function show_options { - EXITVAL=${1:-1} - echo "Usage: $SCRIPT_NAME [-h] [-w TIMEOUT] [-l LOOP_COUNT] [-f FAIL_MATCH] [-s SUCCESS_MATCH] --delay SLEEP_TIME -- COMMAND" - echo - echo "Waits for a command to fail, succeed, or timeout." - echo - echo "Options:" - echo " -h,--help -- this help" - echo " -w,--walltime TIMEOUT -- Timeout after TIMEOUT seconds." - echo " -l,--looptimeout LOOP_COUNT -- Timeout after checking COMMAND LOOP_COUNT times." - echo " -d,--delay SLEEP_TIME -- Seconds to sleep between checks of COMMAND." - echo " -s,--success-match -- Output that indicates a success." - echo " -f,--fail-match -- Output that indicates a short-circuit failure." - echo - echo "Execute the command in a loop until it succeeds, a timeout is reached, or" - echo "a short-circuit failure occurs. Between each check of the command sleep for" - echo "the number of seconds specified by SLEEP_TIME." - echo - echo "Examples:" - echo " wait_for -w 300 --delay 10 -- ping -c 1 192.0.2.2" - echo " wait_for -w 10 --delay 1 -- ls file_we_are_waiting_for" - echo " wait_for -w 30 --delay 3 -- date \| grep 8" - echo " wait_for -w 300 --delay 10 --fail-match CREATE_FAILED -- heat stack-show undercloud" - echo " wait_for -w 300 --delay 10 --success-match CREATE_COMPLETE -- heat stack-show undercloud" - exit $EXITVAL -} - -USE_WALLTIME= -TIMEOUT= -DELAY= - -if [ -n "${SUCCESSFUL_MATCH_OUTPUT:-}" ]; then - echo "DEPRECATION WARNING: Using env vars for specifying SUCCESSFUL_MATCH_OUTPUT is deprecated." -fi -SUCCESSFUL_MATCH_OUTPUT=${SUCCESSFUL_MATCH_OUTPUT:-""} -if [ -n "${FAIL_MATCH_OUTPUT:-}" ]; then - echo "DEPRECATION WARNING: Using env vars for specifying FAIL_MATCH_OUTPUT is deprecated." -fi -FAIL_MATCH_OUTPUT=${FAIL_MATCH_OUTPUT:-""} - -USE_ARGPARSE=0 -# We have to support positional arguments for backwards compat -if [ -n "$1" -a "${1:0:1}" == "-" ]; then - USE_ARGPARSE=1 -else - echo "DEPRECATION WARNING: Using positional arguments for wait_for is deprecated." -fi - -if [ $USE_ARGPARSE -eq 1 ]; then - set +e - TEMP=$(getopt -o h,w:,l:,d:,s:,f: -l help,walltime:,looptimeout:,delay:,success-match:,fail-match: -n $SCRIPT_NAME -- "$@") - if [ $? != 0 ]; then - show_options; - fi - set -e - - # Note the quotes around `$TEMP': they are essential! - eval set -- "$TEMP" - - while true ; do - case "$1" in - -h) show_options 0;; - --help) show_options 0;; - -w|--walltime) [ -n "$USE_WALLTIME" ] && show_options - USE_WALLTIME=1 - TIMEOUT="$2" - shift 2 - ;; - -l|--looptimeout) [ -n "$USE_WALLTIME" ] && show_options - USE_WALLTIME=0 - TIMEOUT="$2" - shift 2 - ;; - -d|--delay) DELAY="$2"; shift 2;; - -s|--success-match) SUCCESSFUL_MATCH_OUTPUT="$2"; shift 2;; - -f|--fail-match) FAIL_MATCH_OUTPUT="$2"; shift 2;; - --) shift ; break ;; - esac - done -else - TIMEOUT=${1:-""} - DELAY=${2:-""} - USE_WALLTIME=0 - shift 2 || true -fi - -COMMAND="$@" - -if [ -z "$TIMEOUT" -o -z "$DELAY" -o -z "$COMMAND" ]; then - show_options -fi - - -ENDTIME=$(($(date +%s) + $TIMEOUT)) -TIME_REMAINING=0 -function update_time_remaining { - CUR_TIME="$(date +%s)" - TIME_REMAINING=$(($ENDTIME - $CUR_TIME)) -} - - -OUTPUT= - -function check_cmd { - STATUS=0 - OUTPUT=$(eval $COMMAND 2>&1) || STATUS=$? - if [[ -n "$SUCCESSFUL_MATCH_OUTPUT" ]] \ - && [[ $OUTPUT =~ $SUCCESSFUL_MATCH_OUTPUT ]]; then - exit 0 - elif [[ -n "$FAIL_MATCH_OUTPUT" ]] \ - && [[ $OUTPUT =~ $FAIL_MATCH_OUTPUT ]]; then - echo "Command output matched '$FAIL_MATCH_OUTPUT'. Exiting..." - exit 1 - elif [[ -z "$SUCCESSFUL_MATCH_OUTPUT" ]] && [[ $STATUS -eq 0 ]]; then - # The command successfully completed and we aren't testing against - # it's output so we have finished waiting. - exit 0 - fi -} - -i=0 -while [ $USE_WALLTIME -eq 1 -o $i -lt $TIMEOUT ]; do - if [ $USE_WALLTIME -eq 1 ]; then - update_time_remaining - if [ $TIME_REMAINING -le 0 ]; then - break - fi - else - i=$((i + 1)) - fi - - check_cmd - - if [ $USE_WALLTIME -eq 1 ]; then - update_time_remaining - if [ $TIME_REMAINING -lt $DELAY ]; then - if [ $TIME_REMAINING -gt 0 ]; then - sleep $TIME_REMAINING - check_cmd - fi - else - sleep $DELAY - fi - else - sleep $DELAY - fi -done -if [ $USE_WALLTIME -eq 1 ]; then - SECONDS=$TIMEOUT -else - SECONDS=$((TIMEOUT * DELAY)) -fi -printf 'Timing out after %d seconds:\nCOMMAND=%s\nOUTPUT=%s\n' \ - "$SECONDS" "$COMMAND" "$OUTPUT" -exit 1 diff --git a/scripts/wait_for_hypervisor_stats b/scripts/wait_for_hypervisor_stats deleted file mode 100755 index 2d4806ff..00000000 --- a/scripts/wait_for_hypervisor_stats +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash - -set -eu -set -o pipefail - -SCRIPT_NAME=$(basename $0) - -function show_options { - echo "Usage: $SCRIPT_NAME [] [options]" - echo - echo "Waits for \`nova hypervisor-stats\` to show some memory + vcpus are available." - echo - echo "Positional arguments:" - echo " nodes -- The number of nodes to wait for, defaults to 1." - echo " memory -- The amount of memory to wait for in MB," - echo " defaults to the amount of memory for the" - echo " baremetal flavor times the number of nodes." - echo " vcpus -- The number of vcpus to wait for," - echo " defaults to the number of vcpus for the" - echo " baremtal flavor times the number of nodes." - echo - echo "Options:" - echo " -h / --help -- this help" - echo - exit $1 -} - -TEMP=$(getopt -o h -l help -n $SCRIPT_NAME -- "$@") -if [ $? != 0 ]; then - echo "Terminating..." >&2 - exit 1 -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -h | --help) show_options 0;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -EXPECTED_NODES=${1:-1} -EXPECTED_MEM=${2:-""} -EXPECTED_VCPUS=${3:-""} - -# NOTE(bnemec): If/when we have more flavors, this will need -# to be expanded. -if [ -z "$EXPECTED_VCPUS" ]; then - FLAVOR=$(nova flavor-show baremetal) - VCPUS=$(echo "$FLAVOR" | awk '$2=="vcpus" { print $4 }') - EXPECTED_VCPUS=$(($VCPUS*$EXPECTED_NODES)) -fi - -if [ -z "$EXPECTED_MEM" ]; then - FLAVOR=$(nova flavor-show baremetal) - MEM=$(echo "$FLAVOR" | awk '$2=="ram" { print $4 }') - EXPECTED_MEM=$(($MEM*$EXPECTED_NODES)) -fi - -nova hypervisor-stats | awk ' -$2=="count" && $4 >= '"$EXPECTED_NODES"' { c++ }; -$2=="memory_mb" && $4 >= '"$EXPECTED_MEM"' { c++ }; -$2=="vcpus" && $4 >= '"$EXPECTED_VCPUS"' { c++ }; -END { if (c != 3) exit 1 }' diff --git a/scripts/wait_for_stack_ready b/scripts/wait_for_stack_ready deleted file mode 100755 index 74050aff..00000000 --- a/scripts/wait_for_stack_ready +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -# -# Copyright 2014 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -eu - -SCRIPT_NAME=$(basename $0) - -USE_WALLTIME="-l" -if [ -n "$1" -a "$1" = "-w" ]; then - USE_WALLTIME="-w" - shift 1 -fi - -LOOPS=${1:-""} -SLEEPTIME=${2:-""} -STACK_NAME=${3:-""} -if [ -z "$LOOPS" -o -z "$SLEEPTIME" -o -z "$STACK_NAME" ]; then - echo "Usage: $SCRIPT_NAME [-w] LOOPS_NUMBER SLEEP_TIME STACK_NAME" - exit 1 -fi - -SUCCESSFUL_MATCH_OUTPUT="(CREATE|UPDATE)_COMPLETE" -FAIL_MATCH_OUTPUT="(CREATE|UPDATE)_FAILED" - - -wait_for $USE_WALLTIME $1 --delay $2 \ - --success-match $SUCCESSFUL_MATCH_OUTPUT \ - --fail-match $FAIL_MATCH_OUTPUT -- \ - "heat stack-show $STACK_NAME | awk '/stack_status / { print \$4 }'" diff --git a/scripts/write-tripleorc b/scripts/write-tripleorc deleted file mode 100755 index 351171f8..00000000 --- a/scripts/write-tripleorc +++ /dev/null @@ -1,133 +0,0 @@ -#!/bin/bash -# -# Copyright 2013 Red Hat, Inc. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -set -e -set -o pipefail - -SCRIPT_NAME=$(basename $0) -SCRIPT_HOME=$(dirname $0) - -function show_options { - echo "Usage: $SCRIPT_NAME [options] FILENAME" - echo - echo "Write devtest defined environment variables to a file." - echo - echo "Creates a tripleorc file that can be sourced later to restore" - echo "environment variables that are defined by devtest.md" - echo - echo "Options:" - echo " -f, --file -- Noop. For backwards compatibility only" - echo " -o, --overwrite -- Overwrite file if it already exists." - exit $1 -} - -FILE= - -TEMP=`getopt -o hof -l help,overwrite,file -n $SCRIPT_NAME -- "$@"` -if [ $? != 0 ]; then - echo "Terminating..." >&2; - exit 1; -fi - -# Note the quotes around `$TEMP': they are essential! -eval set -- "$TEMP" - -while true ; do - case "$1" in - -f | --file) shift 1 ;; - -o | --overwrite) OVERWRITE=--overwrite; shift 1 ;; - -h | --help) show_options 0;; - --) shift ; break ;; - *) echo "Error: unsupported option $1." ; exit 1 ;; - esac -done - -FILE=${FILE:-$1} - -if [ -z "$FILE" ]; then - echo "ERROR: Must provide a filename" - exit 1 -fi - -OVERWRITE=${OVERWRITE:-""} - -# Don't overwrite $FILE if it already exists and the overwrite option -# wasn't provided. -if [ -f $FILE -a -z "$OVERWRITE" ]; then - echo $FILE exists, not overwriting. - echo Either delete the file first, or specify -o - exit 1 -fi - -rm -f $FILE -touch $FILE - -ENV_VARS=" -DEPLOY_IMAGE_ELEMENT -DEPLOY_NAME -DIB_COMMON_ELEMENTS -ELEMENTS_PATH -LIBVIRT_DEFAULT_URI -LIBVIRT_DISK_BUS_TYPE -LIBVIRT_NIC_DRIVER -LIBVIRT_VOL_POOL -NODE_CNT -NODE_DIST -OVERCLOUD_BLOCKSTORAGE_DIB_EXTRA_ARGS -OVERCLOUD_BLOCKSTORAGESCALE -OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS -OVERCLOUD_COMPUTESCALE -OVERCLOUD_CONTROL_DIB_EXTRA_ARGS -OVERCLOUD_CONTROLSCALE -OVERCLOUD_LIBVIRT_TYPE -ROOT_DISK -SEED_DIB_EXTRA_ARGS -TE_DATAFILE -TRIPLEO_ROOT -UNDERCLOUD_DIB_EXTRA_ARGS -USE_UNDERCLOUD_UI" - -for env_var in $ENV_VARS; do - if [ ! -z "${!env_var}" ]; then - echo export $env_var=\"${!env_var}\" >> $FILE - fi -done - -# Also write out updated $PATH and $ELEMENTS_PATH -if [ -n "$TRIPLEO_ROOT" ]; then - - # Add a newline for some clarity in the tripleorc file. - echo >> $FILE - - # When tripleorc is later sourced, we only want to update $PATH and - # $ELEMENTS_PATH if they haven't already been updated. Otherwise, we will - # keep making them longer each time tripleorc is sourced. - cat >> $FILE < - %(name)s - %(memory)s - %(cpus)s - - - hvm - - - - - - - - - - destroy - restart - restart - - - - - - - - %(network)s - %(bm_network)s - %(enable_serial_console)s - - - - - - diff --git a/templates/net.xml b/templates/net.xml deleted file mode 100644 index f995cfcc..00000000 --- a/templates/net.xml +++ /dev/null @@ -1,6 +0,0 @@ - - %NETWORK_NAME% - - - - diff --git a/test-requirements.txt b/test-requirements.txt deleted file mode 100644 index cb3a3e7d..00000000 --- a/test-requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -oslosphinx -sphinx>=1.5.1 diff --git a/tox.ini b/tox.ini deleted file mode 100644 index 2fa3c6f3..00000000 --- a/tox.ini +++ /dev/null @@ -1,24 +0,0 @@ -[tox] -minversion = 1.6 -skipsdist = True -envlist = docs,pep8 - -[testenv] -usedevelop = True -install_command = pip install {opts} {packages} -setenv = VIRTUAL_ENV={envdir} -deps = -r{toxinidir}/test-requirements.txt - -[testenv:venv] -commands = {posargs} - -[testenv:docs] -commands = python setup.py build_sphinx - -[testenv:pep8] -deps = bashate -whitelist_externals = bash -commands = bash -c "./run-bashate.sh" - -[flake8] -exclude = .tox diff --git a/tripleo-cloud/README.md b/tripleo-cloud/README.md deleted file mode 100644 index 37e4d016..00000000 --- a/tripleo-cloud/README.md +++ /dev/null @@ -1,41 +0,0 @@ -This is a staging area for tools and information related to the -[https://wiki.openstack.org/wiki/TripleO/TripleOCloud production quality cloud] -the TripleO program is running in a continuous delivery fashion. - -Currently found here: - -* tripleo-cd-admins: A list (ircname/username,email,human name,comment) - of people permitted root access to the tripleo cloud. This is used for - recording details and for automatically creating admin (and regular user) - accounts. Our convention is use the IRC name as the username for ssh - access. - -* ssh-keys: (directory) SSH keys for TripleO CD Admins. The file names - in this directory correspond to the IRC/username in the tripleo-cd-admins - file. Multiple SSH keys may be listed in each file for a given user. - -* tripleo-cd-users: A list of users of the TripleO CD overcloud - either - TripleO ATC's or other folk which the TripleO PTL has granted access to the - cloud. This is used to populate users on the cloud automatically, and new - ATC's should ask for access by submitting a review to add their details. - The comment field should list why non-ATC's have access. - -The script update-admin-ssh-keys will copy the tripleo-cd-ssh-keys file on top -of the authorized\_keys file for the current user - making it an easy way to -self-maintain (as long as you trust the SSL infrastructure to ensure the right -repo is being copied :)). - -Policy on adding / removing people: - - get consensus/supermajority for adds from existing triple-cd-admins members. - - remove folk at own request or if idle for extended period. - -Implementation of adding / removing people: - - Ssh into the seed VM host and add / remove a user for them. - - Ssh into the seed VM and update the root authorized-keys likewise. - - Update the 'default' keyring on the CD seed 'admin' user to the current - keyring here. - - Ssh into cd-undercloud.tripleo.org and update the heat-admin authorized-keys - file. - - Update the 'default' keyring on the CD undercloud 'admin' user to the - current keyring here. - - Add them to https://docs.google.com/spreadsheet/ccc?key=0AlLkXwa7a4bpdERqN0p5RjNMQUJJeDdhZ05fRVUxUnc&usp=sharing diff --git a/tripleo-cloud/ssh-keys/GheRivero b/tripleo-cloud/ssh-keys/GheRivero deleted file mode 100644 index 1883e171..00000000 --- a/tripleo-cloud/ssh-keys/GheRivero +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDB4ARQm2NlwqBvegBEQuFNEFnlydjwyQJzLbkxPcUTqBDBtqUvsCsRyxkJOgJZoXr/jNPGBxTaw7hLojdGVfS24U0Av2iS9Gq1wteDW271dI5hfTPgiawaSsbaz5sd07LwdfbcXg+TO1cdWRuA33bH5mNtUP7A3VTSHJ3hXO0LHwjM+jUbdmRdUEtu8IKtKZoVXOOYY9FOb0xPNbxaex0WZV70KOrbZiV5+0DkTXIyw+MLE2TZWUun7VLpaQ5qgprUx7zGe54JWv5QUWkFPx0dWy0T3hNOD3r9TKf8ieESiguQK28AXtagEqbXLQx15zfKGHF3VAn2Wcn11+KMBalD GheRivero diff --git a/tripleo-cloud/ssh-keys/Ng b/tripleo-cloud/ssh-keys/Ng deleted file mode 100644 index d9b3587a..00000000 --- a/tripleo-cloud/ssh-keys/Ng +++ /dev/null @@ -1,3 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAmFHTRSHk22jdaXQTObJRSon+4X34c4+usib9H7MnCrXFNQCxEhZ3icA5rYFJtPZ6psQgB3LfdIbiQ8/nc4Cf6zpcBMbogs8tVk2E9I5t4TUtQqj66lx8QgXMNHbzBSjdP8vENfWeus7Q4vR71F3J2JWOG/rU54MwVZBu+wLedsYes6ghsK3jutwM+BS9Q7IZNSU0tJ/C03XjieImcZL7uicNSc0aSywKDE2QoTUkbJVkcCfdXAE1W1S9JlEb/CTEis2lIX8MTDb11i5XouReR0l9Wrg1I0XBtGqOKlDdloUJTe5IXsxRbt8oQq26/ntl9Y/rFX8E4MNflhK5UgOKNQ== ng-mackbook15 -ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuVwKv6mO6kIdrzm+3/FdgkBwDOG1eoQfcy0UIBA0nVpsdyu3RRHu5xmeaZeveRV8bYONIX6tF3k4JuxARgVXcE5e3DLh+ONH8LHyg+sOLW2zAInxghi9yCR6G0vT9MzbiUlNOFt7j4r5fgg5aJTX937oPRNaJmv5f6NQs7fy4TfVU1Ma4X5KZreNEylk7Jyocj7otYDkHnwRj1BdzgTJPL8As+5Mj/2OyKsS6ayAd0cZCFzeWnoTVIZBIo4r37o3mFxzNDSBQ2XI7disXvr5Xr5FDFR6TDOdgcs4gabhNUhch196DBjmTxJ3bTKAMy//Sz9e7dOd7pQDfn4lBJo0JQ== ng-kodachi -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFEQtLAva4QFGKWm1jVhkh1g0V3pXEOgSYSA1r/lnswQb1VxdumaWWHXEE8TKYR6YIPfOaD/VHIC1p1cYYrfhbVInradqjOPVZM96lM8b8UhbANsLH3C9+tP0Pb63HarEVXlS+HZxDIQ8UVrUw/EstSFUILHWY7DgLKUF3vVvtKM0VEaOdOix60FaCj/2sXlQ7dz5Xz3cQKKM7lszwzNiNlpSO+BxoK7U+t0I4ZL8SQJLiHvY7GoBFaPmzEg2dz6YmM/r2PXaxbcYCwO/JZ0Wi2jy1NCtVI6zcbfBOqDbcQcS9MR2F2MNKfI1qb8kFyW+fXttTLNQIhsAY9nr9I7rl ng-pixukipa.local diff --git a/tripleo-cloud/ssh-keys/SpamapS b/tripleo-cloud/ssh-keys/SpamapS deleted file mode 100644 index 6bdb6487..00000000 --- a/tripleo-cloud/ssh-keys/SpamapS +++ /dev/null @@ -1,2 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/zTl8QCACJjPqAvm0CRji2fyLEEkJYbfZIIrOngdc1hjrVd9yNFcZvWlwH3zfdTZhosVjv64Ol5O6Vc7gfJG4RCrdyBOuve4oUpARha/yUTbmPunQUaHEHofG1b7AIaAUWlVS6Z+NRXbzX5EmZ64C4BON/1UA3CMnemLpR2v3VwaxuUuKlB0oyvkvmcamQh+QUaHmlH1AYVd/5R+0yABQXqE+Elt+M8qc2vdHbLv6p3AEBnWXc0iV7wGZ0TcfdRjN2xBNrG79I2nB0btvfd396jpnA3TP1t8BnuyOVR5xYdKPc5fLEaAkpVm4OGH24/hdMUfSA03QZ13k1Ml1nvM9 spamaps-MacBookAir -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCd2K5esFjcXSCZ9m0sboBB+87kgRpQw075HhD9AvAmkljcX2acGy1+1UtWlMcuL0MPVVFAeQVr6f94kSSuXtQZY4CmSU0O14rLaBfAiFwpLuWDqRFkQWYx3nSduGlVC8YfI5fva9vbfV25NT+YqUykLaPt5LYtq4MGhQav7BxBdalHBhtLd/gcD5auF6/GJhG9XDXvWkI1P8oOEscf4KIxgyaj/E5RPUmSn1TxNyLfYoYfEwH3JXEwQ7LcNcUCJi1lDw45SENesjXvG9uwinbZVTYmXLLtvYim/MrmUXJGjU58T/V9lgzvJYKge9lWwlQxXMGircEvCyGwQ2ep6jV3 spamaps-clint-HP diff --git a/tripleo-cloud/ssh-keys/StevenK b/tripleo-cloud/ssh-keys/StevenK deleted file mode 100644 index 0fe83485..00000000 --- a/tripleo-cloud/ssh-keys/StevenK +++ /dev/null @@ -1,2 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1AyLa6DapyvGUfpxUiILcViOF9hKSA3VvEBeIS1PDVhcC/oYoz/xUlbMAeiKth1VkJ8jjJ5cZLvS1OVK+v/f83r702d9VREUqBuvY7EgS4tU7LqInVLB8+PTTPiMnF1v7M7RX26gKUDohLmB6TbfuyDqQ52i1JH4vOgZCpj2E5gfjlomRv24nhfGZ2A9Ut8IFkwdkDH566CBFExTKARp9Gmetb1PX7yHVKjYg/7C3pVLADqkE0x9qQIALtZJ9iWe5I6UP9H0q2CS+t2T2KHNtxrWCNhxtnWJxph8kIj2njhxKTEoTeXMNSMQG06INzwRD2E7nYnzwhmXvBK95qW0F steven@liquified -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDV0+uAoHs08Sq+Q3bIczy19aYcPs9U60BPUPaVSqPBt0tZghabdvTuEsArJESXl7MEAIo2S6FC+w7VJ8Pka1CPOk2jOvQ697kvAGOxEH5rV5xauBMpjFVjaPxn7FEhJ+C63tqHU5ZWK0B5Hqt3mSkXJRrId+TDNbqDo8wKrslw1YNClypNA8gzDyAc0m1oSvGUOwLUC8q1rNWfx5qNqrg0325G/dp5IQtkdCoNig8TQBzFyRtbygVVj2PAbGvaqr11ZsUN9TzeW4nQRXMQ0tDw/w4s2TVS9UBJLl3+eVMJLvqf++5dczaBtBlPQmk4Xw+3Y44PW3NNr7MOyQl4FSWR steven@sandblasted diff --git a/tripleo-cloud/ssh-keys/bnemec b/tripleo-cloud/ssh-keys/bnemec deleted file mode 100644 index a2f5242b..00000000 --- a/tripleo-cloud/ssh-keys/bnemec +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDv9l/F0vq7nzAT5hdrBfqDv0rD76nHNn+siS6s5gaFyAuvXJG808pqFk5bJLbRdRIA1/cLxIQeB+bB7IjeTS7Afbz/baAOPTtoumwEU8wLPzR7IyTg60R4o7pKOJG2cP45s3TGODsYt5eEAr96EGp9ayyanfuJZZf2wQWdNp1+vQXain8WHv9KIKI5XmcKI80x8RBWV86OKKsmbqV4yYxAkuLitq4h3Bhw3LP+VOxaqApevnpt7fcrvn8QR3XMsLKNZsJhT9r1qeLEZisundZPN+0EuiC7seu5zAuCBcKjRrBo7Ime8TYn5sjz9DTMcWvY3xHF2DZN2YdVxp4O8/iD bnemec@localhost.localdomain diff --git a/tripleo-cloud/ssh-keys/derekh b/tripleo-cloud/ssh-keys/derekh deleted file mode 100644 index 6fdac2ad..00000000 --- a/tripleo-cloud/ssh-keys/derekh +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCdK/KnJPXaycb8hOX9j1f/lU1HuB9GMUhCN7of4KrRs3OjzCtMUNZJSTCQaeUlR6VijNvUIe6Wx5zWCDR1DgNv/InQjr+7RhSgMofStz1TfJrlkGBfZw2mrhpPnX3fLaCf9Dyl+8+cuTjxGTMtYngJx2/9aNpgl75hMgaM6BRh/ULM+lLBDlCI+r9dFSsVx9UKTQUyenDh4A3J3eszP1CTT1sBWDKU5zz39MqWpzIxRaBgk+nI8+Uxbih7FUPaLLqlrl4Nxdr9A/Aul9pB8OSk/BK1oX/8mYW5mDE3usbeXIVU53ojEG0pkKaq4N9oeMorGB65xG7uAf845Av0qOpr derekh diff --git a/tripleo-cloud/ssh-keys/dmanchad b/tripleo-cloud/ssh-keys/dmanchad deleted file mode 100644 index 04de44ce..00000000 --- a/tripleo-cloud/ssh-keys/dmanchad +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDkdinmthPdZuLNKNgC3Rx2u26hAYq6AbehS9b7u7x8pjcu6YmOClp844qQJmpxkiwNMbKpCz1618QCcCz10LU7Wn+9IjJWdTkvOf69AohU/fZMb3kXO5K0IPojlloNkkKTM8gRjmzD/uuwwbZ3BU+x0Kfo/0hePOzcK+Rd/6xEB6LM9xerOo3ZQVv5UGuG7XdCFOjbJkAFciuLWiHQZPmguvDDTRby16SuZI8xWJzssHpOhUIK510M1frk/GtYuHcNZQD38BHBmzyxaw/vQiwDgajXGjgOGz3HZ6jFfeXdeMHToeX6ZbCoQ8521JAvaEMEUmpPx23MFC59M42DLGdp5pyHLSeHZx5fBTXLXb5oMKXtlRp94MAasmJ025unG8O7IWsAdFOq9Aad3qaaKNAbZLCVNhrw4XyXy5vWjdNfKipwdhG8TYBOjYecVX7EzJmM8lWDJgNuDOmzLA/Qpu0rsMtrrI+6BcA9j7xh9YC5cT3rQLNCpghCcWjIdWfxcKsirnt4vXbDWaGSt4x38Gn1Pif/XCmLE7hnseERf5ac5Gp+Uf28zyOSpdE6YXFE93bCLz8BsUAKhZVS4zc0eayY2WFgXxpBPEvfprp8v1EZeJksaZQEnV1FCSl4TBSDE5ie3v8jPKEgNjUmu/y8VsdYbqTxQyAC+hajgq8ONl+bHw== dmanchad@redhat.com diff --git a/tripleo-cloud/ssh-keys/dprince b/tripleo-cloud/ssh-keys/dprince deleted file mode 100644 index 3aeb5c78..00000000 --- a/tripleo-cloud/ssh-keys/dprince +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA+yNMzUrQXa0EOfv+WJtfmLO1WdoOaD47G9qwllSUc4GPRkYzkTNdxcEPrR3XBR94ctOeWOHZ/w7ymhvwK5LLsoNBK+WgRz/mg8oHcii2GoL0fNojdwUMyFMIJxJT+iwjF/omyhyrW/aLAztAKRO7BdOkNlXMAAcMxKzQtFqdZm09ghoImu3BPYUTyDKHMp+t0P1d7mkHdd719oDfMf+5miHxQeJZJCWAsGwroN7k8a46rvezDHEygBsDAF2ZpS2iGMABos/vTp1oyHkCgCqc3rM0OoKqcKB5iQ9Qaqi5ung08BXP/PHfVynXzdGMjTh4w+6jiMw7Dx2GrQIJsDolKQ== dan.prince@dovetail diff --git a/tripleo-cloud/ssh-keys/emacchi b/tripleo-cloud/ssh-keys/emacchi deleted file mode 100644 index 548bf779..00000000 --- a/tripleo-cloud/ssh-keys/emacchi +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDYt5FqMTz91Mbctj7wWg2tAkzwMDwDFtvw0l/6SGPqV+w84SxM1sRmCm1iGdjCk7Rhy3493yRMrA6RT02yTQnXyXG5xC9stspWku9GPNNXyg83SvC/iz53E5SWwYQISmgBK+dYNwzjiN8C8ohxmT8elV1ElckgGvzTOk80KygUzpf+KOfezQcSXZWxBbYsK/8FamPBoWGLCByv+zVX+dSjNgraqdGZDlXns+NiZAeEHeBwKTufFpN//1xm4lG+ah4g5oqaXNf1M7LApPSSm4r5VdFp0+S5SbcPocu+ztwttstnLI0fgJ5XUyqUJM0fZbaj1qkhFeG7bCi/75XIjnkp emilien@redhat.com diff --git a/tripleo-cloud/ssh-keys/greghaynes b/tripleo-cloud/ssh-keys/greghaynes deleted file mode 100644 index 4f627d6e..00000000 --- a/tripleo-cloud/ssh-keys/greghaynes +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC67ZgJPR8opztfyyPApZLu3mk+BlGa16WBFyCUknPSotGxyaryD1qH3HpNobPH5Ggdf9rxEHRGQhSWEaPjn4IZVxVwnLLQqIrMqvL/6zQtfVlOkXIJX/ieicRISzDuefi7Ocq9L6IpCNmvWZGUWmYwU8qOfL5HPp9eZNtV3VDw4c497SV3tSaq+kmV+0Hux0PZt7k47enKI30Kc6AHP82XRhg7OPivdebgiAU+WDrvJ47z5y+wHQ638vDRTYiKelhjRFopppbxnMOK+26/ndq7to/WkOcXxN27U6VvDMuFyCmZnN5LbOX19l2UG3RpObR1xUceHC53BaBtOeVe+jaP greghaynes-hp diff --git a/tripleo-cloud/ssh-keys/jog0 b/tripleo-cloud/ssh-keys/jog0 deleted file mode 100644 index a5233864..00000000 --- a/tripleo-cloud/ssh-keys/jog0 +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0Tyk2WgL7C5Bd0/up44EmSmYpbMV+sEl8zqznsTl4L83aDiWoQe5tov9BkRr8kVfcq81w2DoFn6oIa7rx51fG79cAwk42hDfBqscL/LvLaomjgP1T0GwO+tpHEUwVS9xQqOTjc/gTJDDOAHCg+73XW2y0gZw0ML/+wUyDDjJEvtnpXUQhmzzYkDQ2xneNx0Xu68iCue0MnYnAbk4qxF2ds4i34u3tfCHZUYNKGLEOM7Y9BEqlLtqXALuj42xhEj4PPD0quRI2ysgIl1OAbfnJJRA379IrDTHoHRIPdmIuPL9LSF+/2lEwZwwjKYxdnuRgsY/fEH4n0dCSm57pgnuH jog0 diff --git a/tripleo-cloud/ssh-keys/kforde b/tripleo-cloud/ssh-keys/kforde deleted file mode 100644 index 202d49d4..00000000 --- a/tripleo-cloud/ssh-keys/kforde +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6uMKlcBZv+eZn7sRgSXNeVM70v/SPw00+jS89Py3XFBDGk/D3wkjFiNi/rPHnx62B0yyYB5yUBw27tzXVWlCglB1GcL9gx3mRDLwFxPuSX7gAwfB/fHP8WEZGVP1ueoDNrqztUxzsDHOOuWZOecCrh16gWhM+9AHD4GWZJjgM5Y9QbwytWsSbVExj6Ci6ZkDs3ikc0Xc5qIni7tdfH5JO1iA+Zt5VKAx0yirYA/SZHaeonKuwaYFFI+dQqbRBaR5E8/mrWMfDmbaP2j01hyh4SPUXncTgh9Q6ZbOYcwlza0Vi7xfaewNi8a4M/p/8oHOC/BYdJpj3WH0FIdcAxRB3 kforde@redhat.com diff --git a/tripleo-cloud/ssh-keys/slagle b/tripleo-cloud/ssh-keys/slagle deleted file mode 100644 index b2ba5c37..00000000 --- a/tripleo-cloud/ssh-keys/slagle +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDSP0DZRAwaTAvHk7mHlLfSwVq6QCRqKn8mE6nwW1UzBmTzKdq9pK5XPqEAQgUKoarl+M+QhCNrBaNKpUqPF1dH76S0+2k2HARrxubTlXsQ9UDQQHQZxGjsrYW9sZ/F7yh4Yac7HW4pZANumyAxt0yKE0BLTZX9JojaiBn7bMzw1i5BS6qXIyH7oohd3YThxkpMCqP4O6W6wX90FSDYPtbSaZ1Q+9hzNkS29bXcsoy6uwTixkfedsCgkLb2wa9jcDHCely94Tn/oR+JjT9OQ19Tq8p/rjL8lullIrkHsEEsQ/4sIlB6441DgbeLtQAPPA7pyw50KfBCyTfHQZWPsacN jslagle@redhat.com diff --git a/tripleo-cloud/ssh-keys/sshnaidm b/tripleo-cloud/ssh-keys/sshnaidm deleted file mode 100644 index ae7af6fe..00000000 --- a/tripleo-cloud/ssh-keys/sshnaidm +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDhi/BqsZibuAPiUjJe7b3Dqe5nyI7BckOwfGwJYg436+bFQMoR/7RKmtPe+ISVQ04lwIriIPwKGaSHj5mbEe4LsCLZ5jAUHxvWfgHitqS5ln295zU7vp1z28o7e6LQNplgExyqQlxUPdOU48tmlz93F6szSYkNYvZnhzMn9syrajC74qPuKsmHTeYFLEcxesb7/u+BtxCk8WdjYTb//sk038NEtIsNhrGtAOV3WcDpXnA5mNMpUfeoQ4yiN9LqtreXr7Zeo587LV3T2QL+huAE0J7EuCzHAKk6TIzJqjLidg0SYwZZwfbxgviU66QLkeyzh9oiovwskelvOQCBFq3 sshnaidm@sshnaidm.remote.csb.new \ No newline at end of file diff --git a/tripleo-cloud/ssh-keys/tchaypo b/tripleo-cloud/ssh-keys/tchaypo deleted file mode 100644 index 030572f4..00000000 --- a/tripleo-cloud/ssh-keys/tchaypo +++ /dev/null @@ -1,2 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDHTSWqWdk6eVfp0LFl9jnuDt6EJczYPDShofoVLWmssWFWFvpTHnqivg6rUdBoPSdpto9SY9iY45CNtdhiBb5DjN2I9N7cuE5lMwGTBmE4+TWh5bke3k/ncovP94SZVMoszU2UahiWCCanm9gw7LjOHH0KEBMQrHQVec5lof0P4EuxpygMWSwbtZ+0f1DGvqGdXAV847vzqGq56WyX2SvdxvpRzaWDxsAbGRamnwk6XxCYVJMuvXy23EmYww5g4rgUT26WPImTerjziM+21m9mVDMDFAhmfqIo/HaULjUyT9rOqUfP61ixCPNp5yw7R9ndl0sIIX1b5Xo4Q3y0hMHZ jp@jamezpolley.com -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyQ/30x6T5OWt9R0BcfYkaTwSEf27K+vGcqnAhs7DIGg1SfVkC+6azuoRG9olbvRpPP1y0yVGkfjLSF+3fsT0tJjNUnBmdSPHD5FVgzW+gOdUNwgTjP+FL4JUoHiSFmUbrQVhbiNu1cqLgJjMzllVfkNevHnMSjU//b9BOB3vnempcAc45eqcDiLTdjL6OMtq31nO/EnERU8j8bKuutnohNxUGMyliNtgvnRPdI0V/SL3i/IqFJp1F3nlUJmzg6kuKFb76pezlHeHesHSJYx598PK6h8cydmfmOvbxpu5jwsDJ/TlCkt9FQLBepaViHM7kaTeHrsAjxq6pOw2y/ETJ jp@jamezpolley.com diff --git a/tripleo-cloud/tripleo-cd-admins b/tripleo-cloud/tripleo-cd-admins deleted file mode 100644 index fc8574bb..00000000 --- a/tripleo-cloud/tripleo-cd-admins +++ /dev/null @@ -1,8 +0,0 @@ -derekh,derekh@redhat.com,Derek Higgins -dprince,dprince@redhat.com,Dan Prince -slagle,jslagle@redhat.com,James Slagle -bnemec,bnemec@redhat.com,Ben Nemec -sshnaidm,sshnaidm@redhat.com,Sagi Shnaidman -emacchi,emilien@redhat.com,Emilien Macchi -dmanchad,dmanchad@redhat.com,David Manchado Cuesta -kforde,kforde@redhat.com,Kieran Forde diff --git a/tripleo-cloud/tripleo-cd-users b/tripleo-cloud/tripleo-cd-users deleted file mode 100644 index 7cdb1b3b..00000000 --- a/tripleo-cloud/tripleo-cd-users +++ /dev/null @@ -1,7 +0,0 @@ -openstack-infra,infra-root@openstack.org,OpenStack CI Service hosts,PTL - used by openstack infra for long lived hosts -openstack-nodepool,jenkins@openstack.org,OpenStack CI nodepool hosts,PTL - used by openstack infra for test hosts -tripleo-ci,ci@tripleo.org,OpenStack CI Test Environment hosts,PTL - used by tripleo ci for obtaining IPs from neutron -rpodolyaka,rpodolyaka@mirantis.com,Roman Podoliaka,ATC -elizabeth,lyz@princessleia.com,Elizabeth Krumbach Joseph,ATC -stevenk,steven@wedontsleep.org,Steve Kowalik,ATC -polleyj,jp@jamezpolley.com,James Polley,ATC diff --git a/undercloudrc b/undercloudrc deleted file mode 100644 index ab1ce201..00000000 --- a/undercloudrc +++ /dev/null @@ -1,8 +0,0 @@ -export NOVA_VERSION=1.1 -export OS_PASSWORD=$(os-apply-config -m $TE_DATAFILE --type raw --key undercloud.password) -export OS_AUTH_URL=$(os-apply-config -m $TE_DATAFILE --type raw --key undercloud.endpoint) -export OS_USERNAME=admin -export OS_TENANT_NAME=admin -export COMPUTE_API_VERSION=1.1 -export OS_NO_CACHE=True -export OS_CLOUDNAME=undercloud