Retire Packaging Deb project repos

This commit is part of a series to retire the Packaging Deb
project. Step 2 is to remove all content from the project
repos, replacing it with a README notification where to find
ongoing work, and how to recover the repo if needed at some
future point (as in
https://docs.openstack.org/infra/manual/drivers.html#retiring-a-project).

Change-Id: I416e08c1d85d78f9c141571bf88b6b7076271088
This commit is contained in:
Tony Breeds
2017-09-12 16:18:47 -06:00
parent 196d177377
commit e3f138ca7f
1820 changed files with 14 additions and 173602 deletions

View File

@@ -1,11 +0,0 @@
[run]
branch = True
source = rally
[report]
ignore_errors = True
precision = 3
omit = */migrations/versions/ca3626f62937_init_migration.py
[html]
directory = cover

View File

@@ -1,5 +0,0 @@
rally-jobs
tests
contrib
test-requirements.txt
tox.ini

51
.gitignore vendored
View File

@@ -1,51 +0,0 @@
*.py[cod]
# C extensions
*.so
# Packages
*.egg*
dist
build
eggs
.eggs
parts
bin
var
sdist
develop-eggs
.installed.cfg
lib
!devstack/lib
lib64
# Installer logs
pip-log.txt
# Unit test / coverage reports
.coverage
.tox
nosetests.xml
cover
cover-master
.testrepository
*.sqlite
.venv
.cache
.test_results/
# Docs
doc/source/_build/
# Translations
*.mo
# Mr Developer
.mr.developer.cfg
.project
.idea
.pydevproject
*.swp
# Mac Desktop Service Store
*.DS_Store

View File

@@ -1,4 +0,0 @@
[gerrit]
host=review.openstack.org
port=29418
project=openstack/rally.git

View File

@@ -1 +0,0 @@
doc/source/contribute.rst

View File

@@ -1,68 +0,0 @@
FROM ubuntu:16.04
MAINTAINER Sergey Skripnick <sskripnick@mirantis.com>
# install prereqs
RUN apt-get update && apt-get install --yes wget python vim bash-completion gcc lsb-release
# ubuntu's pip is too old to work with the version of requests we
# require, so get pip with get-pip.py
RUN wget https://bootstrap.pypa.io/get-pip.py && \
python get-pip.py && \
rm -f get-pip.py
# install bindep
RUN pip install bindep
# create rally user
RUN apt-get install sudo && \
useradd -u 65500 -m rally && \
usermod -aG sudo rally && \
echo "rally ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/00-rally-user && \
ln -s /opt/rally/doc /home/rally/rally-docs
# install rally. the COPY command below frequently invalidates
# subsequent cache
COPY . /tmp/rally
WORKDIR /tmp/rally
RUN ./install_rally.sh --system --verbose --yes \
--db-name /home/rally/.rally.sqlite && \
pip install -r optional-requirements.txt && \
mkdir /opt/rally/ && \
# TODO(andreykurilin): build docs to rst before move, since we have several
# extensions.
mv certification/ samples/ doc/ /opt/rally/ && \
chown -R rally /opt/rally /etc/rally && \
rm -rf /tmp/* && \
apt-get -y remove \
build-essential \
libxml2-dev \
libxslt1-dev \
python3 \
&& \
apt-get -y autoremove && \
apt-get clean
RUN echo '[ ! -z "$TERM" -a -r /etc/motd ] && cat /etc/motd' \
>> /etc/bash.bashrc; echo '\
╔═════════════════════════════════════════════════════════════════════════════╗\n\
║ Welcome to Rally Docker container! ║\n\
║ Rally certification tasks, samples and docs are located at /opt/rally/ ║\n\
║ Rally at readthedocs - http://rally.readthedocs.org ║\n\
║ How to contribute - http://rally.readthedocs.org/en/latest/contribute.html ║\n\
║ If you have any questions, you can reach the Rally team by: ║\n\
║ * e-mail - openstack-dev@lists.openstack.org with tag [Rally] in subject ║\n\
║ * irc - "#openstack-rally" channel at freenode.net ║\n\
╚═════════════════════════════════════════════════════════════════════════════╝\n' > /etc/motd
VOLUME ["/home/rally"]
WORKDIR /home/rally/
USER rally
ENV HOME /home/rally/
CMD ["bash", "--login"]
RUN rally-manage db recreate
# TODO(stpierre): Find a way to use `rally` as the
# entrypoint. Currently this is complicated by the need to run
# rally-manage to create the database.

191
LICENSE
View File

@@ -1,191 +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:
You must give any other recipients of the Work or Derivative Works a copy of
this License; and
You must cause any modified files to carry prominent notices stating that You
changed the files; and
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
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.

14
README Normal file
View File

@@ -0,0 +1,14 @@
This project is no longer maintained.
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".
For ongoing work on maintaining OpenStack packages in the Debian
distribution, please see the Debian OpenStack packaging team at
https://wiki.debian.org/OpenStack/.
For any further questions, please email
openstack-dev@lists.openstack.org or join #openstack-dev on
Freenode.

View File

@@ -1,102 +0,0 @@
=====
Rally
=====
Team and repository tags
========================
.. image:: https://governance.openstack.org/badges/rally.svg
:target: https://governance.openstack.org/reference/tags/index.html
.. image:: https://img.shields.io/pypi/v/rally.svg
:target: https://pypi.python.org/pypi/rally/
:alt: Latest Version
.. image:: https://img.shields.io/badge/gitter-join_chat-ff69b4.svg
:target: https://gitter.im/rally-dev/Lobby
:alt: Gitter Chat
.. image:: https://img.shields.io/badge/tasks-trello_board-blue.svg
:target: https://trello.com/b/DoD8aeZy/rally
:alt: Trello Board
.. image:: https://img.shields.io/github/license/openstack/rally.svg
:target: https://www.apache.org/licenses/LICENSE-2.0
:alt: Apache License, Version 2.0
What is Rally
=============
Rally is a Benchmark-as-a-Service project for OpenStack.
Rally is intended to provide the community with a benchmarking tool that is capable of performing **specific**, **complicated** and **reproducible** test cases on **real deployment** scenarios.
If you are here, you are probably familiar with OpenStack and you also know that it's a really huge ecosystem of cooperative services. When something fails, performs slowly or doesn't scale, it's really hard to answer different questions on "what", "why" and "where" has happened. Another reason why you could be here is that you would like to build an OpenStack CI/CD system that will allow you to improve SLA, performance and stability of OpenStack continuously.
The OpenStack QA team mostly works on CI/CD that ensures that new patches don't break some specific single node installation of OpenStack. On the other hand it's clear that such CI/CD is only an indication and does not cover all cases (e.g. if a cloud works well on a single node installation it doesn't mean that it will continue to do so on a 1k servers installation under high load as well). Rally aims to fix this and help us to answer the question "How does OpenStack work at scale?". To make it possible, we are going to automate and unify all steps that are required for benchmarking OpenStack at scale: multi-node OS deployment, verification, benchmarking & profiling.
**Rally** workflow can be visualized by the following diagram:
.. image:: doc/source/images/Rally-Actions.png
:alt: Rally Architecture
Who Is Using Rally
==================
.. image:: doc/source/images/Rally_who_is_using.png
:alt: Who is Using Rally
Documentation
=============
`Rally documentation on ReadTheDocs <https://rally.readthedocs.org/en/latest/>`_ is a perfect place to start learning about Rally. It provides you with an **easy** and **illustrative** guidance through this benchmarking tool. For example, check out the `Rally step-by-step tutorial <https://rally.readthedocs.io/en/latest/quick_start/tutorial.html>`_ that explains, in a series of lessons, how to explore the power of Rally in benchmarking your OpenStack clouds.
Architecture
------------
In terms of software architecture, Rally is built of 4 main components:
1. **Server Providers** - provide servers (virtual servers), with ssh access, in one L3 network.
2. **Deploy Engines** - deploy OpenStack cloud on servers that are presented by **Server Providers**
3. **Verification** - component that runs tempest (or another specific set of tests) against a deployed cloud, collects results & presents them in human readable form.
4. **Benchmark engine** - allows to write parameterized benchmark scenarios & run them against the cloud.
Use Cases
---------
There are 3 major high level Rally Use Cases:
.. image:: doc/source/images/Rally-UseCases.png
:alt: Rally Use Cases
Typical cases where Rally aims to help are:
- Automate measuring & profiling focused on how new code changes affect the OS performance;
- Using Rally profiler to detect scaling & performance issues;
- Investigate how different deployments affect the OS performance:
- Find the set of suitable OpenStack deployment architectures;
- Create deployment specifications for different loads (amount of controllers, swift nodes, etc.);
- Automate the search for hardware best suited for particular OpenStack cloud;
- Automate the production cloud specification generation:
- Determine terminal loads for basic cloud operations: VM start & stop, Block Device create/destroy & various OpenStack API methods;
- Check performance of basic cloud operations in case of different loads.
Links
----------------------
* Free software: Apache license
* Documentation: https://rally.readthedocs.org/en/latest/
* Source: https://git.openstack.org/cgit/openstack/rally
* Bugs: https://bugs.launchpad.net/rally
* Step-by-step tutorial: https://rally.readthedocs.io/en/latest/quick_start/tutorial.html
* RoadMap: https://docs.google.com/a/mirantis.com/spreadsheets/d/16DXpfbqvlzMFaqaXAcJsBzzpowb_XpymaK2aFY2gA2g
* Launchpad page: https://launchpad.net/rally
* Gitter chat: https://gitter.im/rally-dev/Lobby
* Trello board: https://trello.com/b/DoD8aeZy/rally

View File

@@ -1 +0,0 @@
[python: **.py]

View File

@@ -1,23 +0,0 @@
# This is a cross-platform list tracking distribution packages needed by tests;
# see http://docs.openstack.org/infra/bindep/ for additional information.
build-essential [platform:dpkg]
gcc [platform:rpm]
gmp-devel [platform:rpm]
libffi-dev [platform:dpkg]
libffi-devel [platform:rpm !platform:opensuse]
libffi48-devel [platform:opensuse]
libpq-dev [platform:dpkg]
libssl-dev [platform:dpkg]
libxml2-dev [platform:dpkg]
libxml2-devel [platform:rpm]
libxslt1-dev [platform:dpkg]
libxslt-devel [platform:rpm]
openssl-devel [platform:rpm]
postgresql-devel [platform:rpm !platform:opensuse]
postgresql93-devel [platform:opensuse]
python-dev [platform:dpkg]
python-devel [platform:rpm]
redhat-rpm-config [platform:rpm]
iputils-ping [platform:dpkg]
iputils [platform:rpm]

View File

@@ -1,50 +0,0 @@
============================
OpenStack Certification Task
============================
How To Validate & Run Task
--------------------------
To validate task with your own parameters run:
.. code-block:: console
$ rally task validate task.yaml --task-args-file task_arguments.yaml
To start task with your own parameters run:
.. code-block:: console
$ rally task start task.yaml --task-args-file task_arguments.yaml
Task Arguments
--------------
File task_arguments.yaml contains all task options:
+------------------------+----------------------------------------------------+
| Name | Description |
+========================+====================================================+
| service_list | List of services which should be tested |
+------------------------+----------------------------------------------------+
| smoke | Dry run without load from 1 user |
+------------------------+----------------------------------------------------+
| use_existing_users | In case of testing cloud with r/o Keystone e.g. AD |
+------------------------+----------------------------------------------------+
| image_name | Images name that exist in cloud |
+------------------------+----------------------------------------------------+
| flavor_name | Flavor name that exist in cloud |
+------------------------+----------------------------------------------------+
| glance_image_location | URL of image that is used to test Glance upload |
+------------------------+----------------------------------------------------+
| users_amount | Expected amount of users |
+------------------------+----------------------------------------------------+
| tenants_amount | Expected amount of tenants |
+------------------------+----------------------------------------------------+
| controllers_amount | Amount of OpenStack API nodes (controllers) |
+------------------------+----------------------------------------------------+
All options have default values, hoverer user should change them to reflect
configuration and size of tested OpenStack cloud.

View File

@@ -1,95 +0,0 @@
{%- macro user_context(tenants,users_per_tenant, use_existing_users) -%}
{%- if use_existing_users and caller is not defined -%} {}
{%- else %}
{%- if not use_existing_users %}
users:
tenants: {{ tenants }}
users_per_tenant: {{ users_per_tenant }}
{%- endif %}
{%- if caller is defined %}
{{ caller() }}
{%- endif %}
{%- endif %}
{%- endmacro %}
{%- macro vm_params(image=none, flavor=none, size=none) %}
{%- if flavor is not none %}
flavor:
name: {{ flavor }}
{%- endif %}
{%- if image is not none %}
image:
name: {{ image }}
{%- endif %}
{%- if size is not none %}
size: {{ size }}
{%- endif %}
{%- endmacro %}
{%- macro unlimited_volumes() %}
cinder:
gigabytes: -1
snapshots: -1
volumes: -1
{%- endmacro %}
{%- macro constant_runner(concurrency=1, times=1, is_smoke=True) %}
type: "constant"
{%- if is_smoke %}
concurrency: 1
times: 1
{%- else %}
concurrency: {{ concurrency }}
times: {{ times }}
{%- endif %}
{%- endmacro %}
{%- macro rps_runner(rps=1, times=1, is_smoke=True) %}
type: rps
{%- if is_smoke %}
rps: 1
times: 1
{%- else %}
rps: {{ rps }}
times: {{ times }}
{%- endif %}
{%- endmacro %}
{%- macro no_failures_sla() %}
failure_rate:
max: 0
{%- endmacro %}
{%- macro volumes(size=1, volumes_per_tenant=1) %}
volumes:
size: {{ size }}
volumes_per_tenant: {{ volumes_per_tenant }}
{%- endmacro %}
{%- macro unlimited_nova(keypairs=false) %}
nova:
cores: -1
floating_ips: -1
instances: -1
{%- if keypairs %}
key_pairs: -1
{%- endif %}
ram: -1
security_group_rules: -1
security_groups: -1
{%- endmacro %}
{%- macro unlimited_neutron() %}
{% if "neutron" in service_list %}
neutron:
network: -1
port: -1
subnet: -1
{% endif %}
{%- endmacro %}
{%- macro glance_args(location, container="bare", type="qcow2") %}
container_format: {{ container }}
disk_format: {{ type }}
image_location: {{ location }}
{%- endmacro %}

View File

@@ -1,8 +0,0 @@
Authenticate.keystone:
-
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
runner:
{{ rps_runner(rps=15*controllers_amount, times=20000*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}

View File

@@ -1,191 +0,0 @@
CinderVolumes.create_and_attach_volume:
-
args:
{{ vm_params(image_name,flavor_name,1) }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount),times=min(30, 10*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
CinderVolumes.create_and_delete_snapshot:
-
args:
force: false
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
{{ volumes() }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount),times=min(200, 67*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
CinderVolumes.create_and_delete_volume:
-
args:
size:
max: 1
min: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount),times=min(100, 33*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
-
args:
{{ vm_params(image_name,none,1) }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount),times=min(100, 33*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
-
args:
size: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount),times=min(100, 33*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
CinderVolumes.create_and_extend_volume:
-
args:
new_size: 2
size: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount),times=min(100, 33*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
CinderVolumes.create_and_list_snapshots:
-
args:
detailed: true
force: false
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
{{ volumes() }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount),times=min(100, 33*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
CinderVolumes.create_and_list_volume:
-
args:
detailed: true
{{ vm_params(image_name,none,1) }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount),times=min(100, 33*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
-
args:
detailed: true
size: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount),times=min(100, 33*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
CinderVolumes.create_and_upload_volume_to_image:
-
args:
container_format: "bare"
disk_format: "raw"
do_delete: true
force: false
size: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount),times=min(40, 13*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
CinderVolumes.create_from_volume_and_delete_volume:
-
args:
size: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
{{ volumes() }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount),times=min(200, 67*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
CinderVolumes.create_nested_snapshots_and_attach_volume:
-
args:
nested_level: 1
size:
max: 1
min: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
servers:
{{ vm_params(image_name,flavor_name,none)|indent(2,true) }}
servers_per_tenant: 1
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount),times=min(10, 3*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
Quotas.cinder_update_and_delete:
-
args:
max_quota: 1024
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount),times=min(200, 67*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}

View File

@@ -1,30 +0,0 @@
GlanceImages.create_and_delete_image:
-
args:
{{ glance_args(location=glance_image_location) }}
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount),times=min(200, 67*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
GlanceImages.create_and_list_image:
-
args:
{{ glance_args(location=glance_image_location) }}
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount),times=min(200, 67*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
GlanceImages.list_images:
-
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount),times=min(200, 67*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}

View File

@@ -1,62 +0,0 @@
KeystoneBasic.add_and_remove_user_role:
-
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
runner:
{{ constant_runner(concurrency=min(50, 7*controllers_amount),times=min(200, 67*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
KeystoneBasic.create_add_and_list_user_roles:
-
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
runner:
{{ constant_runner(concurrency=min(50, 7*controllers_amount),times=min(200, 67*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
KeystoneBasic.create_and_list_tenants:
-
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount),times=min(200, 10*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
KeystoneBasic.create_and_delete_role:
-
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
runner:
{{ constant_runner(concurrency=min(50, 7*controllers_amount),times=min(200, 67*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
KeystoneBasic.create_and_delete_service:
-
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
runner:
{{ constant_runner(concurrency=min(50, 7*controllers_amount),times=min(200, 67*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
KeystoneBasic.get_entities:
-
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
runner:
{{ constant_runner(concurrency=min(50, 3*controllers_amount),times=min(200, 67*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
KeystoneBasic.create_update_and_delete_tenant:
-
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
runner:
{{ constant_runner(concurrency=min(50, 7*controllers_amount),times=min(200, 67*controllers_amount), is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}

View File

@@ -1,245 +0,0 @@
NeutronNetworks.create_and_delete_networks:
-
args:
network_create_args: {}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
neutron:
network: -1
{% endcall %}
runner:
{{ constant_runner(concurrency=2*controllers_amount, times=8*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NeutronNetworks.create_and_delete_ports:
-
args:
network_create_args: {}
port_create_args: {}
ports_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
neutron:
network: -1
port: -1
{% endcall %}
runner:
{{ constant_runner(concurrency=2*controllers_amount, times=8*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NeutronNetworks.create_and_delete_routers:
-
args:
network_create_args: {}
router_create_args: {}
subnet_cidr_start: "1.1.0.0/30"
subnet_create_args: {}
subnets_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
neutron:
network: -1
subnet: -1
port: -1
router: -1
{% endcall %}
runner:
{{ constant_runner(concurrency=2*controllers_amount, times=8*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NeutronNetworks.create_and_delete_subnets:
-
args:
network_create_args: {}
subnet_cidr_start: "1.1.0.0/30"
subnet_create_args: {}
subnets_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
neutron:
network: -1
subnet: -1
{% endcall %}
runner:
{{ constant_runner(concurrency=2*controllers_amount, times=8*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NeutronNetworks.create_and_list_networks:
-
args:
network_create_args: {}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
neutron:
network: -1
{% endcall %}
runner:
{{ constant_runner(concurrency=2*controllers_amount, times=8*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NeutronNetworks.create_and_list_ports:
-
args:
network_create_args: {}
port_create_args: {}
ports_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
neutron:
network: -1
port: -1
{% endcall %}
runner:
{{ constant_runner(concurrency=2*controllers_amount, times=8*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NeutronNetworks.create_and_list_routers:
-
args:
network_create_args: {}
router_create_args: {}
subnet_cidr_start: "1.1.0.0/30"
subnet_create_args: {}
subnets_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
neutron:
network: -1
subnet: -1
router: -1
{% endcall %}
runner:
{{ constant_runner(concurrency=2*controllers_amount, times=8*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NeutronNetworks.create_and_list_subnets:
-
args:
network_create_args: {}
subnet_cidr_start: "1.1.0.0/30"
subnet_create_args: {}
subnets_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
neutron:
network: -1
subnet: -1
{% endcall %}
runner:
{{ constant_runner(concurrency=2*controllers_amount, times=8*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NeutronNetworks.create_and_update_networks:
-
args:
network_create_args: {}
network_update_args:
admin_state_up: false
name: "_updated"
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
neutron:
network: -1
{% endcall %}
runner:
{{ constant_runner(concurrency=2*controllers_amount, times=8*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NeutronNetworks.create_and_update_ports:
-
args:
network_create_args: {}
port_create_args: {}
port_update_args:
admin_state_up: false
device_id: "dummy_id"
device_owner: "dummy_owner"
name: "_port_updated"
ports_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
neutron:
network: -1
port: -1
{% endcall %}
runner:
{{ constant_runner(concurrency=2*controllers_amount, times=8*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NeutronNetworks.create_and_update_routers:
-
args:
network_create_args: {}
router_create_args: {}
router_update_args:
admin_state_up: false
name: "_router_updated"
subnet_cidr_start: "1.1.0.0/30"
subnet_create_args: {}
subnets_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
neutron:
network: -1
subnet: -1
port: -1
router: -1
{% endcall %}
runner:
{{ constant_runner(concurrency=2*controllers_amount, times=8*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NeutronNetworks.create_and_update_subnets:
-
args:
network_create_args: {}
subnet_cidr_start: "1.4.0.0/16"
subnet_create_args: {}
subnet_update_args:
enable_dhcp: false
name: "_subnet_updated"
subnets_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
neutron:
network: -1
subnet: -1
{% endcall %}
runner:
{{ constant_runner(concurrency=2*controllers_amount, times=8*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
Quotas.neutron_update:
-
args:
max_quota: 1024
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
runner:
{{ constant_runner(concurrency=2*controllers_amount, times=8*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}

View File

@@ -1,195 +0,0 @@
NovaKeypair.boot_and_delete_server_with_keypair:
-
args:
{{ vm_params(image_name, flavor_name) }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
network:
networks_per_tenant: 1
start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_neutron() }}
{{ unlimited_nova(keypairs=true) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount), times=17*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NovaKeypair.create_and_delete_keypair:
-
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_nova(keypairs=true) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount), times=67*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NovaKeypair.create_and_list_keypairs:
-
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_nova(keypairs=true) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount), times=67*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NovaServers.boot_and_bounce_server:
-
args:
actions:
-
hard_reboot: 1
-
soft_reboot: 1
-
stop_start: 1
-
rescue_unrescue: 1
{{ vm_params(image_name, flavor_name) }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
network:
networks_per_tenant: 1
start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_neutron() }}
{{ unlimited_nova() }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount), times=17*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NovaServers.boot_and_delete_server:
-
args:
{{ vm_params(image_name, flavor_name) }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
network:
networks_per_tenant: 1
start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_neutron() }}
{{ unlimited_nova() }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount), times=17*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NovaServers.boot_and_list_server:
-
args:
detailed: true
{{ vm_params(image_name, flavor_name) }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
network:
networks_per_tenant: 1
start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_neutron() }}
{{ unlimited_nova() }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 10*controllers_amount), times=333*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NovaServers.boot_and_rebuild_server:
-
args:
{{ vm_params(flavor=flavor_name) }}
from_image:
name: {{ image_name }}
to_image:
name: {{ image_name }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
network:
networks_per_tenant: 1
start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_neutron() }}
{{ unlimited_nova() }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount), times=17*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NovaServers.boot_server_from_volume_and_delete:
-
args:
{{ vm_params(image_name, flavor_name) }}
volume_size: 5
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
network:
networks_per_tenant: 1
start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_volumes() }}
{{ unlimited_neutron() }}
{{ unlimited_nova() }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 3*controllers_amount), times=17*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NovaServers.pause_and_unpause_server:
-
args:
{{ vm_params(image_name, flavor_name) }}
force_delete: false
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
network:
networks_per_tenant: 1
start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_neutron() }}
{{ unlimited_nova() }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount), times=17*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
NovaServers.snapshot_server:
-
args:
{{ vm_params(image_name, flavor_name) }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
network:
networks_per_tenant: 1
start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_neutron() }}
{{ unlimited_nova() }}
{% endcall %}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount), times=17*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}
Quotas.nova_update_and_delete:
-
args:
max_quota: 1024
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
runner:
{{ constant_runner(concurrency=min(50, 2*controllers_amount), times=17*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}

View File

@@ -1,42 +0,0 @@
{%- set glance_image_location = glance_image_location|default("https://download.cirros-cloud.net/0.3.5/cirros-0.3.5-i386-disk.img") %}
{%- set image_name = image_name|default("^(cirros.*-disk|TestVM)$") %}
{%- set flavor_name = flavor_name|default("m1.tiny") %}
{%- set use_existing_users = use_existing_users|default(false) %}
{%- set service_list = service_list|default(["authentication", "cinder", "keystone", "nova", "glance", "neutron"]) %}
{%- set smoke = smoke|default(true) %}
{%- set controllers_amount = controllers_amount|default(1) %}
{%- if smoke %}
{%- set users_amount = 1 %}
{%- set tenants_amount = 1 %}
{%- else %}
{%- set users_amount = users_amount|default(1) %}
{%- set tenants_amount = tenants_amount|default(1) %}
{%- endif %}
{%- from "macro/macro.yaml" import user_context, vm_params, unlimited_volumes, constant_runner, rps_runner, no_failures_sla -%}
{%- from "macro/macro.yaml" import volumes, unlimited_nova, unlimited_neutron, glance_args -%}
---
{% if "authentication" in service_list %}
{%- include "scenario/authentication.yaml"-%}
{% endif %}
{% if "cinder" in service_list %}
{%- include "scenario/cinder.yaml"-%}
{% endif %}
{% if "keystone" in service_list %}
{%- include "scenario/keystone.yaml"-%}
{% endif %}
{% if "nova" in service_list %}
{%- include "scenario/nova.yaml"-%}
{% endif %}
{% if "glance" in service_list %}
{%- include "scenario/glance.yaml"-%}
{% endif %}
{% if "neutron" in service_list %}
{%- include "scenario/neutron.yaml"-%}
{% endif %}

View File

@@ -1,20 +0,0 @@
---
service_list:
- authentication
- nova
- neutron
- keystone
- cinder
- glance
use_existing_users: false
image_name: "^(cirros.*-disk|TestVM)$"
flavor_name: "m1.tiny"
glance_image_location: ""
smoke: true
users_amount: 1
tenants_amount: 1
controllers_amount: 3
compute_amount: 77
storage_amount: 20
network_amount: 1

View File

@@ -1,30 +0,0 @@
Rally with DevStack all-in-one installation
-------------------------------------------
It is also possible to install Rally with DevStack. First, clone the
corresponding repositories:
.. code-block:: bash
git clone https://git.openstack.org/openstack-dev/devstack
git clone https://github.com/openstack/rally
Then, configure DevStack to run Rally. First, create your ``local.conf`` file:
.. code-block:: bash
cd devstack
cp samples/local.conf local.conf
Next, edit local.conf: add the following line to the ``[[local|localrc]]``
section.
.. code-block:: bash
enable_plugin rally https://github.com/openstack/rally master
Finally, run DevStack as usually:
.. code-block:: bash
./stack.sh

View File

@@ -1,188 +0,0 @@
config:
default:
master: [default, ceilometer, glance, horizon, nova, placement, swift, cinder, keystone]
"0.9": [default, ceilometer, glance, horizon, nova, placement, swift, cinder, keystone]
# This can be used by functional jobs that only want their dependencies installed
# and don't need to incur the overhead of installing all services in the process.
no_services: [default]
neutron:
features: [neutron, neutron-adv]
# different backends
postgres:
features: [postgresql]
# feature changes for different test matrixes
grenade:
rm-features: [trove, sahara, neutron-adv, horizon]
tempest:
features: [tempest]
# feature changes for different configs of existing services
nova_api_metadata_split:
features: [nova-md]
cells:
features: [nova-cells]
# feature declarations for incubated or recently integrated projects (so they
# can be tested outside the releases they were supported in)
trove:
features: [trove]
marconi:
features: [marconi]
zaqar:
features: [zaqar]
sahara:
features: [sahara]
ironic:
features: [ironic]
qpid:
features: [qpid]
zeromq:
features: [zeromq]
ceph:
features: [ceph]
heat:
features: [heat]
tlsproxy:
features: [tlsproxy]
cinder_mn_grenade:
features: [cinder-mn-grenade]
cinder_mn_grenade_sub_volschbak:
features: [cinder-mn-grenade-sub-volschbak]
cinder_mn_grenade_sub_bak:
features: [cinder-mn-grenade-sub-bak]
neutron_dvr:
features: [neutron-dvr]
branches:
# The value of ""default" is the name of the "trunk" branch
default: master
# Normalized branch names only here, e.g. stable/ocata => ocata
allowed: [master, 0.9]
primary:
default:
base:
services: [mysql, rabbit, dstat, peakmem_tracker]
ceilometer:
base:
services: [ceilometer-acompute, ceilometer-acentral, ceilometer-collector, ceilometer-api, ceilometer-alarm-notifier, ceilometer-alarm-evaluator, ceilometer-anotification]
glance:
base:
services: [g-api, g-reg]
keystone:
base:
services: [key]
horizon:
base:
services: [horizon]
nova:
base:
services: [n-api, n-cauth, n-cond, n-cpu, n-net, n-novnc, n-obj, n-sch]
nova-md:
base:
services: [n-api-meta]
nova-cells:
base:
services: [n-cell]
rm-compute-ext: [agregates, hosts]
placement:
base:
services: [placement-api]
neutron:
base:
services: [q-svc, q-agt, q-dhcp, q-l3, q-meta, q-metering]
rm-services: [n-net]
neutron-adv:
base:
rm-services: [n-net]
neutron-dvr:
base:
services: []
swift:
base:
services: [s-proxy, s-account, s-container, s-object]
cinder:
base:
services: [cinder, c-api, c-vol, c-sch, c-bak]
# This will be used to disable c-vol, c-bak on primary node when running multinode grenade
# job that will test compatibility of new c-api, c-sch (primary) and old c-vol and c-bak (sub).
cinder-mn-grenade:
base:
rm-services: [c-vol, c-bak]
# This will be used to disable c-vol, c-sch, c-bak on primary node when running multinode grenade
# job that will test compatibility of new c-api (primary) and old c-vol, c-sch and c-bak (sub).
cinder-mn-grenade-sub-volschbak:
base:
rm-services: [c-vol, c-sch, c-bak]
# This will be used to disable c-bak on primary node when running multinode grenade
# job that will test compatibility of new c-api, c-sch, c-vol (primary) and old c-bak (sub).
cinder-mn-grenade-sub-bak:
base:
rm-services: [c-bak]
heat:
base:
services: [heat, h-api, h-api-cfn, h-api-cw, h-eng]
trove:
base:
services: [trove, tr-api, tr-tmgr, tr-cond]
ironic:
base:
services: [ir-api, ir-cond]
rm-services: [cinder, c-api, c-vol, c-sch, c-bak]
sahara:
base:
services: [sahara]
marconi:
base:
services: [marconi-server]
zaqar:
base:
services: [zaqar-server]
tempest:
base:
services: [tempest]
# service overrides
postgresql:
base:
services: [postgresql]
rm-services: [mysql]
zeromq:
base:
services: [zeromq]
rm-services: [rabbit]
qpid:
base:
services: [qpid]
rm-services: [rabbit]
ceph:
base:
services: [ceph]
tlsproxy:
base:
services: [tls-proxy]

View File

@@ -1,133 +0,0 @@
# lib/rally
# Functions to control the configuration and operation of the **Rally**
# Dependencies:
#
# - ``functions`` file
# - ``DEST``, ``DATA_DIR``, ``STACK_USER`` must be defined
# ``stack.sh`` calls the entry points in this order:
#
# - install_rally
# - configure_rally
# - init_rally
# Save trace setting
XTRACE=$(set +o | grep xtrace)
set +o xtrace
# Defaults
# --------
# Set up default directories
DIR=$(dirname ${BASH_SOURCE[0]})
RALLY_DIR=$(readlink -m $DIR/../..)
RALLY_CONF_DIR=${RALLY_CONF_DIR:-/etc/rally}
RALLY_CONF_FILE=rally.conf
# Debug mode
RALLY_DEBUG=${RALLY_DEBUG:-False}
# Create deployment
RALLY_ADD_DEPLOYMENT=${RALLY_ADD_DEPLOYMENT:-"True"}
RALLY_ADD_DEPLOYMENT=$(trueorfalse True $RALLY_ADD_DEPLOYMENT)
# Functions
# ---------
# Creates a configuration file for the current deployment
# Uses the following variables:
#
# - ``ADMIN_PASSWORD``, ``KEYSTONE_SERVICE_PROTOCOL``,
# ``KEYSTONE_SERVICE_HOST``, ``KEYSTONE_SERVICE_PORT``,
# ``IDENTITY_API_VERSION`` - must be defined
#
# _create_deployment_config filename
function _create_deployment_config() {
if [[ "$IDENTITY_API_VERSION" == 2.0 ]]
then
cat >$1 <<EOF
{
"type": "ExistingCloud",
"creds": {
"openstack": {
"auth_url": "$OS_AUTH_URL",
"region_name": "$REGION_NAME",
"admin": {
"username": "admin",
"password": "$ADMIN_PASSWORD",
"tenant_name": "admin",
}
}
}
}
EOF
fi
if [[ "$IDENTITY_API_VERSION" == 3 ]]
then
cat >$1 <<EOF
{
"type": "ExistingCloud",
"creds": {
"openstack": {
"auth_url": "$OS_AUTH_URL",
"region_name": "$REGION_NAME",
"admin": {
"username": "admin",
"password": "$ADMIN_PASSWORD",
"project_name": "admin",
"user_domain_name": "Default",
"project_domain_name": "Default"
}
}
}
}
EOF
fi
}
# install_rally() - Collect source and prepare
function install_rally() {
setup_develop $RALLY_DIR
}
# configure_rally() - Set config files, create data dirs, etc
function configure_rally() {
if [[ ! -d $RALLY_CONF_DIR ]]; then
sudo mkdir -p $RALLY_CONF_DIR
fi
sudo chown $STACK_USER $RALLY_CONF_DIR
# Copy over rally configuration file and configure common parameters.
cp $RALLY_DIR/etc/rally/rally.conf.sample $RALLY_CONF_DIR/$RALLY_CONF_FILE
iniset $RALLY_CONF_DIR/$RALLY_CONF_FILE DEFAULT debug $RALLY_DEBUG
iniset $RALLY_CONF_DIR/$RALLY_CONF_FILE database connection `database_connection_url rally`
iniset $RALLY_CONF_DIR/$RALLY_CONF_FILE DEFAULT use_syslog $SYSLOG
}
# init_rally() - Initialize databases, etc.
function init_rally() {
recreate_database rally utf8
# Recreate rally database
rally-manage --config-file $RALLY_CONF_DIR/$RALLY_CONF_FILE db recreate
# Add current DevStack deployment to Rally
if [ "$RALLY_ADD_DEPLOYMENT" = "True" ]; then
local tmpfile=$(mktemp)
_create_deployment_config $tmpfile
rally --config-file $RALLY_CONF_DIR/$RALLY_CONF_FILE deployment create --name devstack --filename $tmpfile
fi
}
# Restore xtrace
$XTRACE
# Tell emacs to use shell-script-mode
## Local variables:
## mode: shell-script
## End:

View File

@@ -1,22 +0,0 @@
# DevStack extras script to install Rally
# Save trace setting
XTRACE=$(set +o | grep xtrace)
set -o xtrace
DIR=$(dirname ${BASH_SOURCE[0]})
source $DIR/lib/rally
if [[ "$1" == "stack" && "$2" == "install" ]]; then
echo_summary "Installing Rally"
install_rally
elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
echo_summary "Configuring Rally"
configure_rally
elif [[ "$1" == "stack" && "$2" == "extra" ]]; then
echo_summary "Initializing Rally"
init_rally
fi
# Restore xtrace
$XTRACE

View File

@@ -1,3 +0,0 @@
# Devstack settings
enable_service rally

View File

@@ -1,47 +0,0 @@
========================
Content of doc directory
========================
This directory contains everything that is related to documentation and
bureaucracy. You can find here 4 subdirectories:
feature_request
~~~~~~~~~~~~~~~
If some use case is not covered by Rally, it is the right place to request it.
To request new feature you should just explain use case on high level.
Technical details and writing code are not required at all.
source
~~~~~~
Source of documentation. Latest version of documentation_.
.. _documentation: http://rally.readthedocs.org/
specs
~~~~~
Specs are detailed description of proposed changes in project.
Usually they answer on what, why, how to change in project and who is going to work on change.
user_stories
~~~~~~~~~~~~
Place where you can share any of Rally user experience. E.g. fixing some bugs,
measuring performance of different architectures or comparing different
hardware and so on..
release_notes
~~~~~~~~~~~~~
The latest.rst_ contains new features and API changes of Rally's latest release.
And you could find all old releases in archive_.
.. _latest.rst: https://github.com/openstack/rally/blob/master/doc/release_notes/latest.rst
.. _archive: https://github.com/openstack/rally/tree/master/doc/release_notes/archive

View File

View File

@@ -1,213 +0,0 @@
# Copyright 2016: Mirantis 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.
import copy
import inspect
from docutils.parsers import rst
from rally.cli import cliutils
from rally.cli import main
from rally.cli import manage
import utils
class Parser(object):
"""A simplified interface of argparse.ArgumentParser"""
def __init__(self):
self.parsers = {}
self.subparser = None
self.defaults = {}
self.arguments = []
def add_parser(self, name, help=None, description=None,
formatter_class=None):
parser = Parser()
self.parsers[name] = {"description": description,
"help": help,
"fclass": formatter_class,
"parser": parser}
return parser
def set_defaults(self, command_object=None, action_fn=None,
action_kwargs=None):
if command_object:
self.defaults["command_object"] = command_object
if action_fn:
self.defaults["action_fn"] = action_fn
if action_kwargs:
self.defaults["action_kwargs"] = action_kwargs
def add_subparsers(self, dest):
# NOTE(andreykurilin): there is only one expected call
if self.subparser:
raise ValueError("Can't add one more subparser.")
self.subparser = Parser()
return self.subparser
def add_argument(self, *args, **kwargs):
if "action_args" in args:
return
self.arguments.append((args, kwargs))
DEFAULT_UUIDS_CMD = {
"deployment": ["rally deployment create"],
"task": ["rally task start"],
"verification": ["rally verify start", "rally verify import_results"]
}
def compose_note_about_default_uuids(argument, dest):
# TODO(andreykurilin): add references to commands
return utils.note(
"The default value for the ``%(arg)s`` argument is taken from "
"the Rally environment. Usually, the default value is equal to"
" the UUID of the last successful run of ``%(cmd)s``, if the "
"``--no-use`` argument was not used." % {
"arg": argument,
"cmd": "``, ``".join(DEFAULT_UUIDS_CMD[dest])})
def compose_use_cmd_hint_msg(cmd):
return utils.hint(
"You can set the default value by executing ``%(cmd)s <uuid>``"
" (ref__).\n\n __ #%(ref)s" % {"cmd": cmd,
"ref": cmd.replace(" ", "-")})
def make_arguments_section(category_name, cmd_name, arguments, defaults):
elements = [utils.paragraph("**Command arguments**:")]
for args, kwargs in arguments:
# for future changes...
# :param args: a single command argument which can represented by
# several names(for example, --uuid and --task-id) in cli.
# :type args: tuple
# :param kwargs: description of argument. Have next format:
# {"dest": "action_kwarg_<name of keyword argument in code>",
# "help": "just a description of argument"
# "metavar": "[optional] metavar of argument. Example:"
# "Example: argument '--file'; metavar 'path' ",
# "type": "[optional] class object of argument's type",
# "required": "[optional] boolean value"}
# :type kwargs: dict
dest = kwargs.get("dest").replace("action_kwarg_", "")
description = []
if cmd_name != "use":
# lets add notes about specific default values and hint about
# "use" command with reference
if dest in ("deployment", "task"):
description.append(compose_note_about_default_uuids(
args[0], dest))
description.append(
compose_use_cmd_hint_msg("rally %s use" % dest))
elif dest == "verification":
description.append(compose_note_about_default_uuids(
args[0], dest))
description.append(
compose_use_cmd_hint_msg("rally verify use"))
description.append(kwargs.get("help"))
action = kwargs.get("action")
if not action:
arg_type = kwargs.get("type")
if arg_type:
description.append("**Type**: %s" % arg_type.__name__)
skip_default = dest in ("deployment",
"task_id",
"verification")
if not skip_default and dest in defaults:
description.append("**Default**: %s" % defaults[dest])
metavar = kwargs.get("metavar")
ref = "%s_%s_%s" % (category_name, cmd_name, args[0].replace("-", ""))
if metavar:
args = ["%s %s" % (arg, metavar) for arg in args]
elements.extend(utils.make_definition(", ".join(args),
ref, description))
return elements
def get_defaults(func):
"""Return a map of argument:default_value for specified function."""
spec = inspect.getargspec(func)
if spec.defaults:
return dict(zip(spec.args[-len(spec.defaults):], spec.defaults))
return {}
def make_command_section(category_name, name, parser):
# NOTE(andreykurilin): there is only one category in rally-manage, so
# let's just hardcode it.
cmd = "rally-manage" if category_name == "db" else "rally"
section = utils.subcategory("%s %s %s" % (cmd, category_name, name))
section.extend(utils.parse_text(parser["description"]))
if parser["parser"].arguments:
defaults = get_defaults(parser["parser"].defaults["action_fn"])
section.extend(make_arguments_section(
category_name, name, parser["parser"].arguments, defaults))
return section
def make_category_section(name, parser):
category_obj = utils.category("Category: %s" % name)
# NOTE(andreykurilin): we are re-using `_add_command_parsers` method from
# `rally.cli.cliutils`, but, since it was designed to print help message,
# generated description for categories contains specification for all
# sub-commands. We don't need information about sub-commands at this point,
# so let's skip "generated description" and take it directly from category
# class.
description = parser.defaults["command_object"].__doc__
# TODO(andreykurilin): write a decorator which will mark cli-class as
# deprecated without changing its docstring.
if description.startswith("[Deprecated"):
i = description.find("]")
msg = description[1:i]
description = description[i + 1:].strip()
category_obj.append(utils.warning(msg))
category_obj.extend(utils.parse_text(description))
for command in sorted(parser.subparser.parsers.keys()):
subparser = parser.subparser.parsers[command]
category_obj.append(make_command_section(name, command, subparser))
return category_obj
class CLIReferenceDirective(rst.Directive):
optional_arguments = 1
option_spec = {"group": str}
def run(self):
parser = Parser()
categories = copy.copy(main.categories)
categories["db"] = manage.DBCommands
if "group" in self.options:
categories = {k: v for k, v in categories.items()
if k == self.options["group"]}
cliutils._add_command_parsers(categories, parser)
content = []
for cg in sorted(categories.keys()):
content.append(make_category_section(
cg, parser.parsers[cg]["parser"]))
return content
def setup(app):
app.add_directive("make_cli_reference", CLIReferenceDirective)

View File

@@ -1,57 +0,0 @@
# Copyright 2017: Mirantis 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.
from docutils import nodes
import json
from oslo_utils import importutils
def include_var(name, rawtext, text, lineno, inliner, options=None,
content=None):
"""include variable
:param name: The local name of the interpreted role, the role name
actually used in the document.
:param rawtext: A string containing the enitre interpreted text input,
including the role and markup. Return it as a problematic
node linked to a system message if a problem is
encountered.
:param text: The interpreted text content.
:param lineno: The line number where the interpreted text begins.
:param inliner: The docutils.parsers.rst.states.Inliner object that
called include_var. It contains the several attributes
useful for error reporting and document tree access.
:param options: A dictionary of directive options for customization
(from the 'role' directive), to be interpreted by the
role function. Used for additional attributes for the
generated elements and other functionality.
:param content: A list of strings, the directive content for
customization (from the 'role' directive). To be
interpreted by the role function.
:return:
"""
obj = importutils.import_class(text)
if isinstance(obj, (tuple, list)):
obj = ", ".join(obj)
elif isinstance(obj, dict):
obj = json.dumps(dict, indent=4)
else:
obj = str(obj)
return [nodes.Text(obj)], []
def setup(app):
app.add_role("include-var", include_var)

View File

@@ -1,380 +0,0 @@
# Copyright 2015: Mirantis 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.
import copy
from docutils.parsers import rst
import json
import re
from rally.common.plugin import discover
from rally.common.plugin import plugin
from rally.common import validation
from rally import plugins
import utils
JSON_SCHEMA_TYPES_MAP = {"boolean": "bool",
"string": "str",
"number": "float",
"integer": "int",
"array": "list",
"object": "dict"}
def process_jsonschema(schema):
"""Process jsonschema and make it looks like regular docstring."""
if not schema:
# nothing to parse
return
if "type" in schema:
# str
if schema["type"] == "string":
doc = schema.get("description", "")
if "pattern" in schema:
doc += ("\n\nShould follow next pattern: %s." %
schema["pattern"])
return {"doc": doc, "type": "str"}
# int or float
elif schema["type"] in ("integer", "number"):
doc = schema.get("description", "")
if "minimum" in schema:
doc += "\n\nMin value: %s." % schema["minimum"]
if "maximum" in schema:
doc += "\n\nMax value: %s." % schema["maximum"]
return {"doc": doc, "type": JSON_SCHEMA_TYPES_MAP[schema["type"]]}
# bool or null
elif schema["type"] in ("boolean", "null"):
return {"doc": schema.get("description", ""),
"type": "bool" if schema["type"] == "boolean" else "null"}
# list
elif schema["type"] == "array":
info = {"doc": schema.get("description", ""),
"type": "list"}
if "items" in schema:
if info["doc"]:
info["doc"] += "\n\n"
info["doc"] += ("Elements of the list should follow format(s) "
"described below:\n\n")
items = schema["items"]
itype = None
if "type" in items:
itype = JSON_SCHEMA_TYPES_MAP.get(items["type"],
items["type"])
info["doc"] += "- Type: %s. " % itype
if "description" in items:
# add indention
desc = items["description"].split("\n")
info["doc"] += "\n ".join(desc)
new_schema = copy.copy(items)
new_schema.pop("description", None)
new_schema = json.dumps(new_schema, indent=4)
new_schema = "\n ".join(
new_schema.split("\n"))
info["doc"] += ("\n Format:\n\n"
" .. code-block:: json\n\n"
" %s\n" % new_schema)
return info
elif isinstance(schema["type"], list):
# it can be too complicated for parsing... do not do it deeply
return {"doc": schema.get("description", ""),
"type": "/".join(schema["type"])}
# dict
elif schema["type"] == "object":
info = {"doc": schema.get("description", ""),
"type": "dict",
"parameters": []}
required_parameters = schema.get("required", [])
if "properties" in schema:
for name in schema["properties"]:
if isinstance(schema["properties"][name], str):
pinfo = {"name": name,
"type": schema["properties"][name],
"doc": ""}
else:
pinfo = process_jsonschema(schema["properties"][name])
if name in required_parameters:
pinfo["required"] = True
pinfo["name"] = name
info["parameters"].append(pinfo)
elif "patternProperties" in schema:
info.pop("parameters", None)
info["patternProperties"] = []
for k, v in schema["patternProperties"].items():
info["patternProperties"].append(process_jsonschema(v))
info["patternProperties"][-1]["name"] = k
info["patternProperties"][-1]["type"] = "str"
elif (not (set(schema.keys()) - {"type", "description", "$schema",
"additionalProperties"})):
# it is ok, schema accepts any object. nothing to add more
pass
elif "oneOf" in schema:
# Example:
# SCHEMA = {"type": "object", "$schema": consts.JSON_SCHEMA,
# "oneOf": [{"properties": {"foo": {"type": "string"}}
# "required": ["foo"],
# "additionalProperties": False},
# {"properties": {"bar": {"type": "string"}}
# "required": ["bar"],
# "additionalProperties": False},
#
oneOf = copy.deepcopy(schema["oneOf"])
for item in oneOf:
for k, v in schema.items():
if k not in ("oneOf", "description"):
item[k] = v
return {"doc": schema.get("description", ""),
"type": "dict",
"oneOf": [process_jsonschema(item) for item in oneOf]}
else:
raise Exception("Failed to parse jsonschema: %s" % schema)
if "definitions" in schema:
info["definitions"] = schema["definitions"]
return info
else:
raise Exception("Failed to parse jsonschema: %s" % schema)
# enum
elif "enum" in schema:
doc = schema.get("description", "")
doc += "\nSet of expected values: '%s'." % ("', '".join(
[e or "None" for e in schema["enum"]]))
return {"doc": doc}
elif "anyOf" in schema:
return {"doc": schema.get("description", ""),
"anyOf": [process_jsonschema(i) for i in schema["anyOf"]]}
elif "oneOf" in schema:
return {"doc": schema.get("description", ""),
"oneOf": [process_jsonschema(i) for i in schema["oneOf"]]}
elif "$ref" in schema:
return {"doc": schema.get("description", "n/a"),
"ref": schema["$ref"]}
else:
raise Exception("Failed to parse jsonschema: %s" % schema)
CATEGORIES = {
"Common": ["OS Client"],
"Deployment": ["Engine", "Provider Factory"],
"Task Component": ["Chart", "Context", "Exporter", "Hook",
"Resource Type", "SLA", "Scenario", "Scenario Runner",
"Trigger"],
"Verification Component": ["Verifier Context", "Verification Reporter",
"Verifier Manager"]
}
# NOTE(andreykurilin): several bases do not have docstings at all, so it is
# redundant to display them
IGNORED_BASES = ["Resource Type", "Task Exporter", "OS Client"]
class PluginsReferenceDirective(rst.Directive):
optional_arguments = 1
option_spec = {"base_cls": str}
def _make_arg_items(self, items, ref_prefix, description=None,
title="Parameters"):
terms = []
for item in items:
iname = item.get("name", "") or item.pop("type")
if "type" in item:
iname += " (%s)" % item["type"]
terms.append((iname, [item["doc"]]))
return utils.make_definitions(title=title,
ref_prefix=ref_prefix,
terms=terms,
descriptions=description)
def _make_plugin_section(self, plugin_cls, base_name=None):
section_name = plugin_cls.get_name()
if base_name:
section_name += " [%s]" % base_name
section_obj = utils.section(section_name)
info = plugin_cls.get_info()
if info["title"]:
section_obj.append(utils.paragraph(info["title"]))
if info["description"]:
section_obj.extend(utils.parse_text(info["description"]))
if info["namespace"]:
section_obj.append(utils.paragraph(
"**Namespace**: %s" % info["namespace"]))
if base_name:
ref_prefix = "%s-%s-" % (base_name, plugin_cls.get_name())
else:
ref_prefix = "%s-" % plugin_cls.get_name()
if info["parameters"]:
section_obj.extend(self._make_arg_items(info["parameters"],
ref_prefix))
if info["returns"]:
section_obj.extend(utils.parse_text(
"**Returns**:\n%s" % info["returns"]))
if info["schema"]:
schema = process_jsonschema(info["schema"])
if "type" in schema:
if "parameters" in schema:
section_obj.extend(self._make_arg_items(
items=schema["parameters"],
ref_prefix=ref_prefix))
elif "patternProperties" in schema:
section_obj.extend(self._make_arg_items(
items=schema["patternProperties"],
ref_prefix=ref_prefix,
description=["*Dictionary is expected. Keys should "
"follow pattern(s) described bellow.*"]))
elif "oneOf" in schema:
section_obj.append(utils.note(
"One of the following groups of "
"parameters should be provided."))
for i, oneOf in enumerate(schema["oneOf"], 1):
description = None
if oneOf.get("doc", None):
description = [oneOf["doc"]]
section_obj.extend(self._make_arg_items(
items=oneOf["parameters"],
ref_prefix=ref_prefix,
title="Option %s of parameters" % i,
description=description))
else:
section_obj.extend(self._make_arg_items(
items=[schema], ref_prefix=ref_prefix))
else:
raise Exception("Failed to display provided schema: %s" %
info["schema"])
if issubclass(plugin_cls, validation.ValidatablePluginMixin):
validators = plugin_cls._meta_get("validators", default=[])
platforms = [kwargs for name, args, kwargs in validators
if name == "required_platform"]
if platforms:
section_obj.append(
utils.paragraph("**Requires platform(s)**:"))
section = ""
for p in platforms:
section += "* %s" % p["platform"]
admin_msg = "credentials for admin user"
user_msg = ("regular users (temporary users can be created"
" via the 'users' context if admin user is "
"specified for the platform)")
if p.get("admin", False) and p.get("users", False):
section += " with %s and %s." % (admin_msg, user_msg)
elif p.get("admin", False):
section += " with %s." % admin_msg
elif p.get("users", False):
section += " with %s." % user_msg
section += "\n"
section_obj.extend(utils.parse_text(section))
filename = info["module"].replace(".", "/")
ref = "https://github.com/openstack/rally/blob/master/%s.py" % filename
section_obj.extend(utils.parse_text("**Module**:\n`%s`__\n\n__ %s"
% (info["module"], ref)))
return section_obj
def _make_plugin_base_section(self, base_cls, base_name=None):
if base_name:
title = ("%ss" % base_name if base_name[-1] != "y"
else "%sies" % base_name[:-1])
subcategory_obj = utils.subcategory(title)
else:
subcategory_obj = []
for p in sorted(base_cls.get_all(), key=lambda o: o.get_name()):
# do not display hidden contexts
if p._meta_get("hidden", False):
continue
subcategory_obj.append(self._make_plugin_section(p, base_name))
return subcategory_obj
@staticmethod
def _parse_class_name(cls):
name = ""
for word in re.split(r"([A-Z][a-z]*)", cls.__name__):
if word:
if len(word) > 1 and name:
name += " "
name += word
return name
def _get_all_plugins_bases(self):
"""Return grouped and sorted all plugins bases."""
bases = []
bases_names = []
for p in discover.itersubclasses(plugin.Plugin):
base_ref = getattr(p, "base_ref", None)
if base_ref == p:
name = self._parse_class_name(p)
if name in bases_names:
raise Exception("Two base classes with same name '%s' are "
"detected." % name)
bases_names.append(name)
category_of_base = "Common"
for cname, cbases in CATEGORIES.items():
if name in cbases:
category_of_base = cname
bases.append((category_of_base, name, p))
return sorted(bases)
def run(self):
plugins.load()
bases = self._get_all_plugins_bases()
if "base_cls" in self.options:
for _category_name, base_name, base_cls in bases:
if base_name == self.options["base_cls"]:
return self._make_plugin_base_section(base_cls)
raise Exception("Failed to generate plugins reference for '%s'"
" plugin base." % self.options["base_cls"])
categories = {}
for category_name, base_name, base_cls in bases:
# FIXME(andreykurilin): do not ignore anything
if base_name in IGNORED_BASES:
continue
if category_name not in categories:
categories[category_name] = utils.category(category_name)
category_of_base = categories[category_name]
category_of_base.append(self._make_plugin_base_section(base_cls,
base_name))
return [content for _name, content in sorted(categories.items())]
def setup(app):
plugins.load()
app.add_directive("generate_plugin_reference", PluginsReferenceDirective)

View File

@@ -1,85 +0,0 @@
# 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.
"""
Docutils is awful library. Let's apply some hacks and aliases to simplify usage
"""
from docutils import frontend
from docutils import nodes
from docutils.parsers import rst
from docutils import utils
import string
import six
def parse_text(text):
parser = rst.Parser()
settings = frontend.OptionParser(
components=(rst.Parser,)).get_default_values()
document = utils.new_document(text, settings)
parser.parse(text, document)
return document.children
paragraph = lambda text: parse_text(text)[0]
note = lambda msg: nodes.note("", paragraph(msg))
hint = lambda msg: nodes.hint("", *parse_text(msg))
warning = lambda msg: nodes.warning("", paragraph(msg))
category = lambda title: parse_text("%s\n%s" % (title, "-" * len(title)))[0]
subcategory = lambda title: parse_text("%s\n%s" % (title, "~" * len(title)))[0]
section = lambda title: parse_text("%s\n%s" % (title, "\"" * len(title)))[0]
def make_definition(term, ref, descriptions):
"""Constructs definition with reference to it."""
ref = ref.replace("_", "-").replace(" ", "-")
definition = parse_text(
".. _%(ref)s:\n\n* *%(term)s* [ref__]\n\n__ #%(ref)s" %
{"ref": ref, "term": term})
for descr in descriptions:
if descr:
if isinstance(descr, (six.text_type, six.binary_type)):
if descr[0] not in string.ascii_uppercase:
descr = descr.capitalize()
descr = paragraph(" %s" % descr)
definition.append(descr)
return definition
def make_definitions(title, ref_prefix, terms, descriptions=None):
"""Constructs a list of definitions with reference to them."""
raw_text = ["**%s**:" % title]
if descriptions:
for descr in descriptions:
raw_text.append(descr)
for term, definitions in terms:
ref = ("%s%s" % (ref_prefix, term)).lower().replace(
".", "-").replace("_", "-").replace(" ", "-")
raw_text.append(".. _%s:" % ref)
raw_text.append("* *%s* [ref__]" % term)
for d in definitions:
d = d.strip() if d else None
if d:
if d[0] not in string.ascii_uppercase:
# .capitalize() removes existing caps
d = d[0].upper() + d[1:]
d = "\n ".join(d.split("\n"))
raw_text.append(" %s" % d)
raw_text.append("__ #%s" % ref)
return parse_text("\n\n".join(raw_text) + "\n")

View File

@@ -1,11 +0,0 @@
================
Feature requests
================
To request a new feature, you should create a document similar to other feature
requests. And contribute it to this directory using the next instruction_.
If you don't have time to contribute your feature request via Gerrit, please
contact Andrey Kurilin (andr.kurilin@gmail.com)
.. _instruction: http://rally.readthedocs.org/en/latest/contribute.html#how-to-contribute

View File

@@ -1,22 +0,0 @@
==========================
Capture Logs from services
==========================
Use case
--------
A developer is executing various task and would like to capture logs as
well as test results.
Problem description
-------------------
In case of errors it is quite hard to debug what happened.
Possible solution
-----------------
* Add special context that can capture the logs from tested services.

View File

@@ -1,23 +0,0 @@
====================
Check queue perfdata
====================
Use case
--------
Sometimes OpenStack services use common messaging system very prodigally. For
example Neutron metering agent sending all database table data on new object
creation i.e https://review.openstack.org/#/c/143672/. It cause to Neutron
degradation and other obvious problems. It will be nice to have a way to track
messages count and messages size in queue during tests/benchmarks.
Problem description
-------------------
Heavy usage of queue isnt checked.
Possible solution
-----------------
* Before running tests/benchmarks start process which will connect to queue
topics and measure messages count, size and other data which we need.

View File

@@ -1,24 +0,0 @@
=======================================
Ability to compare results between task
=======================================
Use case
--------
During the work on performance it's essential to be able to compare results of
similar task before and after change in system.
Problem description
-------------------
There is no command to compare two or more tasks and get tables and graphs.
Possible solution
-----------------
* Add command that accepts 2 tasks UUID and prints graphs that compares result

View File

@@ -1,19 +0,0 @@
===========================
Distributed load generation
===========================
Use Case
--------
Some OpenStack projects (Marconi, MagnetoDB) require a real huge load,
like 10-100k request per second for benchmarking.
To generate such huge load Rally has to create load from different
servers.
Problem Description
-------------------
* Rally can't generate load from different servers
* Result processing can't handle big amount of data
* There is no support for chunking results

View File

@@ -1,28 +0,0 @@
===============================================
Explicitly specify existing users for scenarios
===============================================
Use Case
--------
Rally allows to reuse existing users for scenario runs. And we should be able
to use only specified set of existing users for specific scenarios.
Problem Description
-------------------
For the moment if used `deployment` with existing users then Rally chooses
user for each scenario run randomly. But there are cases when we may want
to use one scenario with one user and another with different one specific user.
Main reason for it is in different set of resources that each user has and
those resources may be required for scenarios. Without this feature Rally user
is forced to make all existing users similar and have all required resources
set up for all scenarios he uses. But it is redundant.
Possible solution
-----------------
* Make it possible to use explicitly existing_users context

View File

@@ -1,26 +0,0 @@
===========================
Historical performance data
===========================
Use case
--------
OpenStack is really rapidly developed. Hundreds of patches are merged daily
and it's really hard to track how performance is changed during time.
It will be nice to have a way to track performance of major functionality
of OpenStack running periodically rally task and building graphs that represent
how performance of specific method is changed during the time.
Problem description
-------------------
There is no way to bind tasks
Possible solution
-----------------
* Add grouping for tasks
* Add command that creates historical graphs

View File

@@ -1,30 +0,0 @@
===============================================
Support benchmarking clouds that are using LDAP
===============================================
Use Case
--------
A lot of production clouds are using LDAP with read only access. It means
that load can be generated only by existing in system users and there is no admin access.
Problem Description
-------------------
Rally is using admin access to create temporary users that will be used to
produce load.
Possible Solution
-----------------
* Add some way to pass already existing users
Current Solution
----------------
* Allow the user to specify existing users in the configuration of the *ExistingCloud* deployment plugin
* When such an *ExistingCloud* deployment is active, and the benchmark task file does not specify the *"users"* context, use the existing users instead of creating the temporary ones.
* Modify the *rally show ...* commands to list resources for each user separately.

View File

@@ -1,24 +0,0 @@
========================================
Running Tempest using custom concurrency
========================================
Use case
--------
User might want to use specific concurrency for running tests based on his
deployment and available resources.
Problem description
-------------------
"rally verify start" command does not allow to specify concurrency
for tempest tests. And they always run using concurrency equal
to amount of CPU cores.
Possible solution
-----------------
* Add ``--concurrency`` option to "rally verify start" command.

View File

@@ -1,58 +0,0 @@
==================================
Stop scenario after several errors
==================================
Use case
--------
Starting long tests on the big environments.
Problem description
-------------------
When we start a rally scenario on the env where keystone dies we get a lot of
time before timeout happens.
Example
-------
Times in hard tests
05:25:40 rally-scenarios.cinder
05:25:40 create-and-delete-volume [4074 iterations, 15 threads] OK 8.91
08:00:02 create-and-delete-snapshot [5238 iterations, 15 threads] OK 17.46
08:53:20 create-and-list-volume [4074 iterations, 15 threads] OK 3.18
12:04:14 create-snapshot-and-attach-volume [2619 iterations, 15 threads] FAIL
14:18:44 create-and-attach-volume [2619 iterations, 15 threads] FAIL
14:23:47 rally-scenarios.vm
14:23:47 boot_runcommand_metadata_delete [5 iterations, 5 threads] FAIL
16:30:46 rally-scenarios.nova
16:30:46 boot_and_list_server [5820 iterations, 15 threads] FAIL
19:19:30 resize_server [5820 iterations, 15 threads] FAIL
02:51:13 boot_and_delete_server_with_secgroups [5820 iterations, 60 threads] FAIL
Times in light variant
00:38:25 rally-scenarios.cinder
00:38:25 create-and-delete-volume [14 iterations, 1 threads] OK 5.30
00:40:39 create-and-delete-snapshot [18 iterations, 1 threads] OK 5.65
00:41:52 create-and-list-volume [14 iterations, 1 threads] OK 2.89
00:45:18 create-snapshot-and-attach-volume [9 iterations, 1 threads] OK 17.75
00:48:54 create-and-attach-volume [9 iterations, 1 threads] OK 20.04
00:52:29 rally-scenarios.vm
00:52:29 boot_runcommand_metadata_delete [5 iterations, 5 threads] OK 128.86
00:56:42 rally-scenarios.nova
00:56:42 boot_and_list_server [20 iterations, 1 threads] OK 6.98
01:04:48 resize_server [20 iterations, 1 threads] OK 22.90
In the hard test we have a lot of timeouts from keystone and a lot of time on
test execution
Possible solution
-----------------
Improve SLA check functionality to work "online". And add ability to control
execution process and stop load generation in case of sla check failures.

View File

@@ -1,26 +0,0 @@
======================================================================
Enhancements to installation script: ``--version`` and ``--uninstall``
======================================================================
Use case
--------
User might wish to control which rally version is installed or even purge
rally from the machine completely.
Problem description
-------------------
#. Installation script doesn't allow to choose version.
#. No un-install support.
Possible solution
-----------------
#. Add ``--version`` option to installation script.
#. Add ``--uninstall`` option to installation script or create an
un-installation script

View File

@@ -1,26 +0,0 @@
==================================================================================
Installation script: ``--pypi-mirror``, ``--package-mirror`` and ``--venv-mirror``
==================================================================================
Use case
--------
Installation is pretty easy when there is an Internet connection available.
And there is surely a number of OpenStack uses when whole environment is
isolated. In this case, we need somehow specify where installation script
should take required libs and packages.
Problem description
-------------------
#. Installation script can't work without direct Internet connection
Possible solution #1
--------------------
#. Add ``--pypi-mirror`` option to installation script.
#. Add ``--package-mirror`` option to installation script.
#. Add ``--venv-mirror`` option to installation script.

View File

@@ -1,27 +0,0 @@
============================
Launch Specific Benchmark(s)
============================
Use case
--------
A developer is working on a feature that is covered by one or more specific
benchmarks/scenarios. He/she would like to execute a rally task with an
existing task template file (YAML or JSON) indicating exactly which
benchmark(s) will be executed.
Problem description
-------------------
When executing a task with a template file in Rally, all benchmarks are
executed without the ability to specify one or a set of benchmarks the user
would like to execute.
Possible solution
-----------------
* Add optional flag to rally task start command to specify one or more
benchmarks to execute as part of that test run.

View File

@@ -1,35 +0,0 @@
======================================
Using multi scenarios to generate load
======================================
Use Case
--------
Rally should be able to generate real life load. Simultaneously create load
on different components of OpenStack, e.g. simultaneously booting VM, uploading
image and listing users.
Problem Description
-------------------
At the moment Rally is able to run only 1 scenario per benchmark.
Scenario are quite specific (e.g. boot and delete VM for example) and can't
actually generate real life load.
Writing a lot of specific benchmark scenarios that will produce more real life
load will produce mess and a lot of duplication of code.
Possible solution
-----------------
* Extend Rally task benchmark configuration in such way to support passing
multiple benchmark scenarios in single benchmark context
* Extend Rally task output format to support results of multiple scenarios in
single benchmark separately.
* Extend rally task plot2html and rally task detailed to show results
separately for every scenario.

View File

@@ -1,20 +0,0 @@
======================
Multiple attach volume
======================
Use Case
--------
Since multiple volume attaching support to OpenStack Mitaka, one volume can be
attached to several instances or hosts, Rally should add scenarios about
multiple attach volume.
Problem Description
-------------------
Rally lack of scenarios about multiple attach volume.
Possible solution
-----------------
* Add nova scenarios "multi_attach_volume" and "multi_detach_volume"

View File

@@ -1,30 +0,0 @@
================================================
Add support of persistence benchmark environment
================================================
Use Case
--------
To benchmark many of operations like show, list, detailed you need to have
already these resource in cloud. So it will be nice to be able to create
benchmark environment once before benchmarking. So run some amount of
benchmarks that are using it and at the end just delete all created resources
by benchmark environment.
Problem Description
-------------------
Fortunately Rally has already a mechanism for creating benchmark environment,
that is used to create load. Unfortunately it's atomic operation:
(create environment, make load, delete environment).
This should be split to 3 separated steps.
Possible solution
-----------------
* Add new CLI operations to work with benchmark environment:
(show, create, delete, list)
* Allow task to start against benchmark environment (instead of deployment)

View File

@@ -1,36 +0,0 @@
========================
Production read cleanups
========================
Use Case
--------
Rally should delete in any case all resources that it created during benchmark.
Problem Description
-------------------
* (implemented) Deletion rate limit
You can kill cloud by deleting too many objects simultaneously, so deletion
rate limit is required
* (implemented) Retry on failures
There should be few attempts to delete resource in case of failures
* (implemented) Log resources that failed to be deleted
We should log warnings about all non deleted resources. This information
should include UUID of resource, it's type and project.
* (implemented) Pluggable
It should be simple to add new cleanups adding just plugins somewhere.
* Disaster recovery
Rally should use special name patterns, to be able to delete resources
in such case if something went wrong with server that is running Rally. And
you have just new instance (without old Rally DB) of Rally on new server.

View File

@@ -1,11 +0,0 @@
.. _release_notes/archive:
=================
All release notes
=================
.. toctree::
:glob:
:maxdepth: 1
archive/*

View File

@@ -1,28 +0,0 @@
============
Rally v0.0.1
============
Information
-----------
+------------------+-----------------+
| Commits | **1039** |
+------------------+-----------------+
| Bug fixes | **0** |
+------------------+-----------------+
| Dev cycle | **547 days** |
+------------------+-----------------+
| Release date | **26/Jan/2015** |
+------------------+-----------------+
Details
-------
Rally is awesome tool for testing verifying and benchmarking OpenStack clouds.
A lot of people started using Rally in their CI/CD so Rally team should provide
more stable product with clear strategy of deprecation and upgrades.

View File

@@ -1,223 +0,0 @@
============
Rally v0.0.2
============
Information
-----------
+------------------+-----------------+
| Commits | **100** |
+------------------+-----------------+
| Bug fixes | **18** |
+------------------+-----------------+
| Dev cycle | **45 days** |
+------------------+-----------------+
| Release date | **12/Mar/2015** |
+------------------+-----------------+
Details
-------
This release contains new features, new benchmark plugins, bug fixes,
various code and API improvements.
New Features
~~~~~~~~~~~~
* rally task start **--abort-on-sla-failure**
Stopping load before things go wrong.
Load generation will be interrupted if SLA criteria stop passing.
* Rally verify command supports multiple Tempest sources now.
* python34 support
* postgres DB backend support
API changes
~~~~~~~~~~~
* [new] **rally [deployment | verify | task] use** subcommand
It should be used instead of root command **rally use**
* [new] Rally as a Lib API
To avoid code duplication between Rally as CLI tool and Rally as a Service
we decide to make Rally as a Lib as a common part between these 2 modes.
Rally as a Service will be a daemon that just maps HTTP request to Rally
as a Lib API.
* [deprecated] **rally use** CLI command
* [deprecated] Old Rally as a Lib API
Old Rally API was quite mixed up so we decide to deprecate it
Plugins
~~~~~~~
* **Benchmark Scenario Runners**:
[improved] Improved algorithm of generation load in **constant runner**
Before we used processes to generate load, now it creates pool of
processes (amount of processes is equal to CPU count) after that in
each process use threads to generate load. So now you can easily
generate load of 1k concurrent scenarios.
[improved] Unify code of **constant** and **rps** runners
[interface] Added **abort()** to runner's plugin interface
New method **abort()** is used to immediately interrupt execution.
* **Benchmark Scenarios**:
[new] DesignateBasic.create_and_delete_server
[new] DesignateBasic.create_and_list_servers
[new] DesignateBasic.list_servers
[new] MistralWorkbooks.list_workbooks
[new] MistralWorkbooks.create_workbook
[new] Quotas.neutron_update
[new] HeatStacks.create_update_delete_stack
[new] HeatStacks.list_stacks_and_resources
[new] HeatStacks.create_suspend_resume_delete_stac
[new] HeatStacks.create_check_delete_stack
[new] NeutronNetworks.create_and_delete_routers
[new] NovaKeypair.create_and_delete_keypair
[new] NovaKeypair.create_and_list_keypairs
[new] NovaKeypair.boot_and_delete_server_with_keypair
[new] NovaServers.boot_server_from_volume_and_live_migrate
[new] NovaServers.boot_server_attach_created_volume_and_live_migrate
[new] CinderVolumes.create_and_upload_volume_to_image
[fix] CinderVolumes.create_and_attach_volume
Pass optional \*\*kwargs only to create server command
[fix] GlanceImages.create_image_and_boot_instances
Pass optional \*\*kwargs only to create server command
[fix] TempestScenario.\* removed stress cleanup.
Major issue is that tempest stress cleanup cleans whole OpenStack.
This is very dangerous, so it's better to remove it and leave some
extra resources.
[improved] NovaSecGroup.boot_and_delete_server_with_secgroups
Add optional \*\*kwargs that are passed to boot server comment
* **Benchmark Context**:
[new] **stacks**
Generates passed amount of heat stacks for all tenants.
[new] **custom_image**
Prepares images for benchmarks in VMs.
To Support generating workloads in VMs by existing tools like: IPerf,
Blogbench, HPCC and others we have to have prepared images, with
already installed and configured tools.
Rally team decide to generate such images on fly from passed to avoid
requirements of having big repository with a lot of images.
This context is abstract context that allows to automate next steps:
1) runs VM with passed image (with floating ip and other stuff)
2) execute abstract method that has access to VM
3) snapshot this image
In future we are going to use this as a base for making context that
prepares images.
[improved] **allow_ssh**
Automatically disable it if security group are disabled in neutron.
[improved] **keypair**
Key pairs are stored in "users" space it means that accessing keypair
from scenario is simpler now:
self.context["user"]["keypair"]["private"]
[fix] **users**
Pass proper EndpointType for newly created users
[fix] **sahara_edp**
The Job Binaries data should be treated as a binary content
* **Benchmark SLA**:
[interface] SLA calculations is done in additive way now
Resolves scale issues, because now we don't need to have whole
array of iterations in memory to process SLA.
This is required to implement **--abort-on-sla-failure** feature
[all] SLA plugins were rewritten to implement new interface
Bug fixes
~~~~~~~~~
**18 bugs were fixed, the most critical are**:
* Fix **rally task detailed --iterations-data**
It didn't work in case of missing atomic actions. Such situation can occur
if scenario method raises exceptions
* Add user-friendly message if the task cannot be deleted
In case of trying to delete task that is not in "finished" status users get
traces instead of user-friendly message try to run it with --force key.
* Network context cleanups networks properly now
Documentation
~~~~~~~~~~~~~
* Image sizes are fixed
* New tutorial in "Step by Step" relate to **--abort-on-sla-failure**
* Various fixes

View File

@@ -1,153 +0,0 @@
============
Rally v0.0.3
============
Information
-----------
+------------------+-----------------+
| Commits | **53** |
+------------------+-----------------+
| Bug fixes | **14** |
+------------------+-----------------+
| Dev cycle | **33 days** |
+------------------+-----------------+
| Release date | **14/Apr/2015** |
+------------------+-----------------+
Details
-------
This release contains new features, new benchmark plugins, bug fixes,
various code and API improvements.
New Features & API changes
~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add the ability to specify versions for clients in benchmark scenarios
You can call self.clients("glance", "2") and get any client for
specific version.
* Add API for tempest uninstall
$ rally-manage tempest uninstall
# removes fully tempest for active deployment
* Add a --uuids-only option to rally task list
$ rally task list --uuids-only # returns list with only task uuids
* Adds endpoint to --fromenv deployment creation
$ rally deployment create --fromenv
# recognizes standard OS_ENDPOINT environment variable
* Configure SSL per deployment
Now SSL information is deployment specific not Rally specific and
rally.conf option is deprecated
Like in this sample
https://github.com/openstack/rally/blob/14d0b5ba0c75ececfdb6a6c121d9cf2810571f77/samples/deployments/existing.json#L11-L12
Specs
~~~~~
* [spec] Proposal for new task input file format
This spec describes new task input format that will allow us to generate
multi scenario load which is crucial for HA and more real life testing:
https://github.com/openstack/rally/blob/master/doc/specs/in-progress/new_rally_input_task_format.rst
Plugins
~~~~~~~
* **Benchmark Scenario Runners**:
* Add a maximum concurrency option to rps runner
To avoid running to heavy load you can set 'concurrency' to configuration
and in case if cloud is not able to process all requests it won't start
more parallel requests then 'concurrency' value.
* **Benchmark Scenarios**:
[new] CeilometerAlarms.create_alarm_and_get_history
[new] KeystoneBasic.get_entities
[new] EC2Servers.boot_server
[new] KeystoneBasic.create_and_delete_service
[new] MuranoEnvironments.list_environments
[new] MuranoEnvironments.create_and_delete_environment
[new] NovaServers.suspend_and_resume_server
[new] NovaServers.pause_and_unpause_server
[new] NovaServers.boot_and_rebuild_server
[new] KeystoneBasic.create_and_list_services
[new] HeatStacks.list_stacks_and_events
[improved] VMTask.boot_runcommand_delete
restore ability to use fixed IP and floating IP to connect to VM
via ssh
[fix] NovaServers.boot_server_attach_created_volume_and_live_migrate
Kwargs in nova scenario were wrongly passed
* **Benchmark SLA**:
* [new] aborted_on_sla
This is internal SLA criteria, that is added if task was aborted
* [new] something_went_wrong
This is internal SLA criteria, that is added if something went wrong,
context failed to create or runner raised some exceptions
Bug fixes
~~~~~~~~~
**14 bugs were fixed, the most critical are**:
* Set default task uuid to running task. Before it was set only after
task was fully finished.
* The "rally task results" command showed a disorienting "task not found"
message for a task that is currently running.
* Rally didn't know how to reconnect to OpenStack in case if token
expired.
Documentation
~~~~~~~~~~~~~
* New tutorial **task templates**
https://rally.readthedocs.org/en/latest/tutorial/step_5_task_templates.html
* Various fixes

View File

@@ -1,180 +0,0 @@
============
Rally v0.0.4
============
Information
-----------
+------------------+-----------------+
| Commits | **87** |
+------------------+-----------------+
| Bug fixes | **21** |
+------------------+-----------------+
| Dev cycle | **30 days** |
+------------------+-----------------+
| Release date | **14/May/2015** |
+------------------+-----------------+
Details
-------
This release contains new features, new benchmark plugins, bug fixes, various code and API improvements.
New Features & API changes
~~~~~~~~~~~~~~~~~~~~~~~~~~
* Rally now can generate load with users that already exist
Now one can use Rally for benchmarking OpenStack clouds that are using LDAP, AD or any other read-only keystone backend where it is not possible to create any users. To do this, one should set up the "users" section of the deployment configuration of the ExistingCloud type. This feature also makes it safer to run Rally against production clouds: when run from an isolated group of users, Rally wont affect rest of the cloud users if something goes wrong.
* New decorator *@osclients.Clients.register* can add new OpenStack clients at runtime
It is now possible to add a new OpenStack client dynamically at runtime. The added client will be available from osclients.Clients at the module level and cached. Example:
.. code-block:: none
>>> from rally import osclients
>>> @osclients.Clients.register("supernova")
... def another_nova_client(self):
... from novaclient import client as nova
... return nova.Client("2", auth_token=self.keystone().auth_token,
... **self._get_auth_info(password_key="key"))
...
>>> clients = osclients.Clients.create_from_env()
>>> clients.supernova().services.list()[:2]
[<Service: nova-conductor>, <Service: nova-cert>]
* Assert methods now available for scenarios and contexts
There is now a new *FunctionalMixin* class that implements basic unittest assert methods. The *base.Context* and *base.Scenario* classes inherit from this mixin, so now it is possible to use *base.assertX()* methods in scenarios and contexts.
* Improved installation script
The installation script has been almost completely rewritten. After this change, it can be run from an unprivileged user, supports different database types, allows to specify a custom python binary, always asks confirmation before doing potentially dangerous actions, automatically install needed software if run as root, and also automatically cleans up the virtualenv and/or the downloaded repository if interrupted.
Specs & Feature requests
~~~~~~~~~~~~~~~~~~~~~~~~
* [Spec] Reorder plugins
The spec describes how to split Rally framework and plugins codebase to make it simpler for newbies to understand how Rally code is organized and how it works.
* [Feature request] Specify what benchmarks to execute in task
This feature request proposes to add the ability to specify benchmark(s) to be executed when the user runs the *rally task start* command. A possible solution would be to add a special flag to the *rally task start* command.
Plugins
~~~~~~~
* **Benchmark Scenario Runners**:
* Add limits for maximum Core usage to constant and rps runners
The new 'max_cpu_usage' parameter can be used to avoid possible 100% usage of all available CPU cores by reducing the number of CPU cores available for processes started by the corresponding runner.
* **Benchmark Scenarios**:
* [new] KeystoneBasic.create_update_and_delete_tenant
* [new] KeystoneBasic.create_user_update_password
* [new] NovaServers.shelve_and_unshelve_server
* [new] NovaServers.boot_and_associate_floating_ip
* [new] NovaServers.boot_lock_unlock_and_delete
* [new] NovaHypervisors.list_hypervisors
* [new] CeilometerSamples.list_samples
* [new] CeilometerResource.get_resources_on_tenant
* [new] SwiftObjects.create_container_and_object_then_delete_all
* [new] SwiftObjects.create_container_and_object_then_download_object
* [new] SwiftObjects.create_container_and_object_then_list_objects
* [new] MuranoEnvironments.create_and_deploy_environment
* [new] HttpRequests.check_random_request
* [new] HttpRequests.check_request
* [improved] NovaServers live migrate benchmarks
add 'min_sleep' and 'max_sleep' parameters to simulate a pause between VM booting and running live migration
* [improved] NovaServers.boot_and_live_migrate_server
add a usage sample to samples/tasks
* [improved] CinderVolumes benchmarks
support size range to be passed to the 'size' argument as a dictionary
*{"min": <minimum_size>, "max": <maximum_size>}*
* **Benchmark Contexts**:
* [new] MuranoPackage
This new context can upload a package to Murano from some specified path.
* [new] CeilometerSampleGenerator
Context that can be used for creating samples and collecting resources for benchmarks in a list.
* **Benchmark SLA**:
* [new] outliers
This new SLA checks that the number of outliers (calculated from the mean and standard deviation of the iteration durations) does not exceed some maximum value. The SLA is highly configurable: the parameters used for outliers threshold calculation can be set by the user.
Bug fixes
~~~~~~~~~
**21 bugs were fixed, the most critical are**:
* Make it possible to use relative imports for plugins that are outside of rally package.
* Fix heat stacks cleanup by deleting them only 1 time per tenant (get rid of "stack not found" errors in logs).
* Fix the wrong behavior of 'rally task detailed --iterations-data' (it lacked the iteration info before).
* Fix security groups cleanup: a security group called "default", created automatically by Neutron, did not get deleted for each tenant.
Other changes
~~~~~~~~~~~~~~~~~~~~~~~~~~
* Streaming algorithms that scale
This release introduces the common/streaming_algorithms.py module. This module is going to contain implementations of benchmark data processing algorithms that scale: these algorithms do not store exhaustive information about every single benchmark iteration duration processed. For now, the module contains implementations of algorithms for computation of mean & standard deviation.
* Coverage job to check that new patches come with unit tests
Rally now has a coverage job that checks that every patch submitted for review does not decrease the number of lines covered by unit tests (at least too much). This job allows to mark most patches with no unit tests with '-1'.
* Splitting the plugins code (Runners & SLA) into common/openstack plugins
According to the spec "Reorder plugins" (see above), the plugins code for runners and SLA has been moved to the *plugins/common/* directory. Only base classes now remain in the *benchmark/* directory.
Documentation
~~~~~~~~~~~~~
* Various fixes
* Remove obsolete *.rst* files (*deploy_engines.rst* / *server_providers.rst* / ...)
* Restructure the docs files to make them easier to navigate through
* Move the chapter on task templates to the 4th step in the tutorial
* Update the information about meetings (new release meeting & time changes)

View File

@@ -1,514 +0,0 @@
============
Rally v0.1.0
============
Information
-----------
+------------------+-----------------------+
| Commits | **355** |
+------------------+-----------------------+
| Bug fixes | **90** |
+------------------+-----------------------+
| Dev cycle | **132 days** |
+------------------+-----------------------+
| Release date | **25/September/2015** |
+------------------+-----------------------+
Details
-------
This release contains new features, new 42 plugins, 90 bug fixes,
various code and API improvements.
New Features & API changes
~~~~~~~~~~~~~~~~~~~~~~~~~~
* **Improved installation script**
* Add parameters:
* ``--develop`` parameter to install rally in editable (develop) mode
* ``--no-color`` to switch off output colorizing
useful for automated output parsing and terminals that don't
support colors.
* Puts rally.conf under virtualenv etc/rally/ so you can have several
rally installations in virtualenv
* Many fixes related to access of different file, like: rally.conf,
rally db file in case of sqlite
* Update pip before Rally installation
* Fix reinstallation
* **Separated Rally plugins & framework**
Now plugins are here:
https://github.com/openstack/rally/tree/master/rally/plugins
Plugins are as well separated common/* for common plugins
that can be use no matter what is tested and OpenStack related
plugins
* **New Rally Task framework**
* All plugins has the same Plugin base:
rally.common.plugin.pluing.Plugin They have the same mechanisms for:
discovering, providing information based on docstrings, and in future
they will use the same deprecation/rename mechanism.
* Some of files are moved:
* rally/benchmark -> rally/task
*This was done to unify naming of rally task command and
actually code that implements it.*
* rally/benchmark/sla/base.py -> rally/task/sla.py
* rally/benchmark/context/base.py -> rally/task/context.py
* rally/benchmark/scenarios/base.py -> rally/task/scenario.py
* rally/benchmark/runners/base.py -> rally/task/runner.py
* rally/benchmark/scenarios/utils.py -> rally/task/utils.py
This was done to:
* avoid doing rally.benchmark.scenarios import base as scenario_base
* remove one level of nesting
* simplify framework structure
* Some of classes and methods were renamed
* Plugin configuration:
* context.context() -> context.configure()
* scenario.scenario() -> scenario.configure()
* Introduced runner.configure()
* Introduced sla.configure()
This resolves 3 problems:
* Unifies configuration of different types of plugins
* Simplifies plugin interface
* Looks nice with new modules path:
>>> from rally.task import scenario
>>> @scenario.configure()
* Atomic Actions were changed:
* New rally.task.atomic module
This allow us in future to reuse atomic actions in Context plugins
* Renames:
rally.benchmark.scenarios.base.AtomicAction
-> rally.task.atomic.ActionTimer
rally.benchmark.scenarios.base.atomic_action()
-> rally.task.atomic.action_timer()
* **Context plugins decide how to map their data for scenario**
Now Context.map_for_scenario method can be override to decide
how to pass context object to each iteration of scenario.
* Samples of NEW vs OLD context, sla, scenario and runner plugins:
* Context
.. code-block:: python
# Old
from rally.benchmark.context import base
@base.context(name="users", order=100)
class YourContext(base.Context):
def setup(self):
# ...
def cleanup(self):
# ...
# New
from rally.task import context
@context.configure(name="users", order=100)
class YourContext(context.Context):
def setup(self):
# ...
def cleanup(self):
# ...
def map_for_scenario(self):
# Maps context object to the scenario context object
# like context["users"] -> context["user"] and so on.
..
* Scenario
.. code-block:: python
# Old Scenario
from rally.benchmark.scenarios import base
from rally.benchmark import validation
class ScenarioPlugin(base.Scenario):
@base.scenario()
def some(self):
self._do_some_action()
@base.atomic_action_timer("some_timer")
def _do_some_action(self):
# ...
# New Scenario
from rally.task import atomic
from rally.task import scenario
from rally.task import validation
# OpenStack scenario has different base now:
# rally.plugins.openstack.scenario.OpenStackScenario
class ScenarioPlugin(scenario.Scenario):
@scenario.configure()
def some(self):
self._do_some_action()
@atomic.action_timer("some_action")
def _do_some_action(self):
# ...
..
* Runner
.. code-block:: python
## Old
from rally.benchmark.runners import base
class SomeRunner(base.ScenarioRunner):
__execution_type__ = "some_runner"
def _run_scenario(self, cls, method_name, context, args)
# Load generation
def abort(self):
# Method that aborts load generation
## New
from rally.task import runner
@runner.configure(name="some_runner")
class SomeRunner(runner.ScenarioRunner):
def _run_scenario(self, cls, method_name, context, args)
# Load generation
def abort(self):
# Method that aborts load generation
..
* SLA
.. code-block:: python
# Old
from rally.benchmark import sla
class FailureRate(sla.SLA):
# ...
# New
from rally.task import sla
@sla.configure(name="failure_rate")
class FailureRate(sla.SLA):
# ...
..
* **Rally Task aborted command**
Finally you can gracefully shutdown running task by calling:
.. code:: bash
rally task abort <task_uuid>
..
* **Rally CLI changes**
* [add] ``rally --plugin-paths`` specify the list of directories with plugins
* [add] ``rally task report --junit`` - generate a JUnit report
This allows users to feed reports to tools such as Jenkins.
* [add] ``rally task abort`` - aborts running Rally task
when run with the ``--soft`` key, the ``rally task abort`` command is
waiting until the currently running subtask is finished, otherwise the
command interrupts subtask immediately after current scenario iterations
are finished.
* [add] ``rally plugin show`` prints detailed information about plugin
* [add] ``rally plugin list`` prints table with rally plugin names and titles
* [add] ``rally verify genconfig`` generates tempest.conf without running it.
* [add] ``rally verify install`` install tempest for specified deployment
* [add] ``rally verify reinstall`` removes tempest for specified deployment
* [add] ``rally verify uninstall`` uninstall tempest of specified deployment
* [fix] ``rally verify start --no-use`` --no-use was always turned on
* [remove] ``rally use`` now each command has subcommand ``use``
* [remove] ``rally info``
* [remove] ``rally-manage tempest`` now it is covered by ``rally verify``
* **New Rally task reports**
* New code is based on OOP style which is base step to make pluggable Reports
* Reports are now generated for only one iteration over the resulting data
which resolves scalability issues when we are working with large
amount of iterations.
* New Load profiler plot that shows amount of iterations that are working
in parallel
* Failed iterations are shown as a red areas on stacked are graphic.
Non backward compatible changes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* [remove] ``rally use`` cli command
* [remove] ``rally info`` cli command
* [remove] ``--uuid`` parameter from ``rally deployment <any>``
* [remove ``--deploy-id`` parameter from:
``rally task <any>``, ``rally verify <any>``, ``rally show <any>``
Specs & Feature requests
~~~~~~~~~~~~~~~~~~~~~~~~
[feature request] Explicitly specify existing users for scenarios
[feature request] Improve install script and add --uninstall and --version
[feature request] Allows specific repos & packages in install-rally.sh
[feature request] Add ability to capture logs from tested services
[feature request] Check RPC queue perfdata
[spec] Refactoring Rally cleanup
[spec] Consistent resource names
Plugins
~~~~~~~
* **Scenarios**:
[new] CinderVolumes.create_volume_backup
[new] CinderVolumes.create_and_restore_volume_backup
[new] KeystoneBasic.add_and_remove_user_role
[new] KeystoneBasic.create_and_delete_role
[new] KeystoneBasic.create_add_and_list_user_roles
[new] FuelEnvironments.list_environments
[new] CinderVolumes.modify_volume_metadata
[new] NovaServers.boot_and_delete_multiple_servers
[new] NeutronLoadbalancerV1.create_and_list_pool
[new] ManilaShares.list_shares
[new] CeilometerEvents.create_user_and_get_event
[new] CeilometerEvents.create_user_and_list_event_types
[new] CeilometerEvents.create_user_and_list_events
[new] CeilometerTraits.create_user_and_list_trait_descriptions
[new] CeilometerTraits.create_user_and_list_traits
[new] NeutronLoadbalancerV1.create_and_delete_pools
[new] NeutronLoadbalancerV1.create_and_update_pools
[new] ManilaShares.create_and_delete_share
[new] ManilaShares.create_share_network_and_delete
[new] ManilaShares.create_share_network_and_list
[new] HeatStacks.create_and_delete_stack
[new] ManilaShares.list_share_servers
[new] HeatStacks.create_snapshot_restore_delete_stack
[new] KeystoneBasic.create_and_delete_ec2credential
[new] KeystoneBasic.create_and_list_ec2credentials
[new] HeatStacks.create_stack_and_scale
[new] ManilaShares.create_security_service_and_delete
[new] KeystoneBasic.create_user_set_enabled_and_delete
[new] ManilaShares.attach_security_service_to_share_network
[new] IronicNodes.create_and_delete_node
[new] IronicNodes.create_and_list_node
[new] CinderVolumes.create_and_list_volume_backups
[new] NovaNetworks.create_and_list_networks
[new] NovaNetworks.create_and_delete_network
[new] EC2Servers.list_servers
[new] VMTasks.boot_runcommand_delete_custom_imagea
[new] CinderVolumes.create_and_update_volume
* **Contexts**:
[new] ManilaQuotas
Add context for setting up Manila quotas:
shares, gigabytes, snapshots, snapshot_gigabytes, share_networks
[new] ManilaShareNetworks
Context for share networks that will be used in case of usage
deployment with existing users. Provided share networks via context
option "share_networks" will be balanced between all share creations
of scenarios.
[new] Lbaas
Context to create LBaaS-v1 resources
[new] ImageCommandCustomizerContext
Allows image customization using side effects of a command execution.
E.g. one can install an application to the image and use these image
for 'boot_runcommand_delete' scenario afterwards.
[new] EC2ServerGenerator
Context that creates servers using EC2 api
[new] ExistingNetwork
This context lets you use existing networks that have already been
created instead of creating new networks with Rally. This is useful
when, for instance, you are using Neutron with a dumb router that is
not capable of creating new networks on the fly.
* **SLA**:
[remove] max_failure_rate - use failure_rate instead
Bug fixes
~~~~~~~~~
**90 bugs were fixed, the most critical are**:
* Many fixes related that fixes access of rally.conf and DB files
* Incorrect apt-get "-yes" parameter in install_rally.sh script
* Rally bash completion doesn't exist in a virtualenv
* Rally show networks CLI command worked only with nova networks
* RPS runner was not properly generating load
* Check is dhcp_agent_scheduler support or not in network cleanup
* NetworkContext doesn't work with Nova V2.1
* Rally task input file was not able to use jinja2 include directive
* Rally in docker image was not able to
* Rally docker image didn't contain samples
* Do not update the average duration when iteration failed
Documentation
~~~~~~~~~~~~~
* **Add plugin reference page**
:ref:`Rally Plugins Reference page <plugin-reference>` page contains a
full list with
* **Add maintainers section on project info page**
:ref:`Rally Maintainers section <project_info>` contains information
about core contributors of OpenStack Rally their responsibilities and
contacts. This will help us to make our community more transparent and open
for newbies.
* **Added who is using section in docs**
* **Many small fixes**

View File

@@ -1,131 +0,0 @@
============
Rally v0.1.1
============
Information
-----------
+------------------+-----------------------+
| Commits | **32** |
+------------------+-----------------------+
| Bug fixes | **9** |
+------------------+-----------------------+
| Dev cycle | **11 days** |
+------------------+-----------------------+
| Release date | **6/October/2015** |
+------------------+-----------------------+
Details
-------
This release contains new features, new 6 plugins, 9 bug fixes,
various code and API improvements.
New Features
~~~~~~~~~~~~
* **Rally verify generates proper tempest.conf file now**
Improved script that generates tempest.conf, now it works out of box for
most of the clouds and most of Tempest tests will pass without hacking it.
* **Import Tempest results to Rally DB**
``rally verify import`` command allows you to import already existing Tempest
results and work with them as regular "rally verify start" results:
generate HTML/CSV reports & compare different runs.
API Changes
~~~~~~~~~~~~
**Rally CLI changes**
* [add] ``rally verify import`` imports raw Tempest results to Rally
Specs & Feature requests
~~~~~~~~~~~~~~~~~~~~~~~~
There is no new specs and feature requests.
Plugins
~~~~~~~
* **Scenarios**:
[new] NeutronNetworks.create_and_list_floating_ips
[new] NeutronNetworks.create_and_delete_floating_ips
[new] MuranoPackages.import_and_list_packages
[new] MuranoPackages.import_and_delete_package
[new] MuranoPackages.import_and_filter_applications
[new] MuranoPackages.package_lifecycle
[improved] NovaKeypair.boot_and_delete_server_with_keypair
New argument ``server_kwargs``, these kwargs are used to boot server.
[fix] NeutronLoadbalancerV1.create_and_delete_vips
Now it works in case of concurrency > 1
* **Contexts**:
[improved] network
Network context accepts two new arguments:
``subnets_per_network`` and ``network_create_args``.
[fix] network
Fix cleanup if nova-network is used. Networks should be dissociate from
project before deletion
[fix] custom_image
Nova server that is used to create custom image was not deleted if
script that prepares server failed.
Bug fixes
~~~~~~~~~
**9 bugs were fixed, the most critical are**:
* Fix install_rally.sh script
Set 777 access to /var/lib/rally/database file if system-wide method of
installation is used.
* Rally HTML reports Overview table had few mistakes
* Success rate was always 100%
* Percentiles were wrongly calculated
* Missing Ironic, Murano and Workload(vm) options in default config file
* ``rally verify start`` failed while getting network_id
* ``rally verify genconfig`` hangs forever if Horizon is not available
Documentation
~~~~~~~~~~~~~
* **Fix project maintainers page**
Update the information about Rally maintainers
* **Document rally --plugin-paths CLI argument**
* **Code blocks in documentation looks prettier now**

View File

@@ -1,206 +0,0 @@
============
Rally v0.1.2
============
Information
-----------
+------------------+-----------------------+
| Commits | **208** |
+------------------+-----------------------+
| Bug fixes | **37** |
+------------------+-----------------------+
| Dev cycle | **77 days** |
+------------------+-----------------------+
| Release date | **23/December/2015** |
+------------------+-----------------------+
Details
-------
This release, as well as all previous ones, includes a lot of internal and
external changes. Most important of them are listed below.
.. warning:: Release 0.1.2 is the last release with Python 2.6 support.
Deprecations
~~~~~~~~~~~~
* Class `rally.common.objects.Endpoint` was renamed to `Credentials`. Old
class is kept for backward compatibility. Please, stop using the old class
in your plugins.
.. warning:: dict key was changed too in user context from "endpoint" to "credential"
* rally.task.utils: wait_is_ready(), wait_for(), wait_for_delete() deprecated
you should use wait_for_status() instead.
Rally Verify
~~~~~~~~~~~~
* Added possibility to run Tempest tests listed in a file(--tests-file argument in ``verify start``)
* Added possibility to upload Tempest subunit stream logs into data base
* Improvements in generating Tempest config file
* Reworked subunit stream parser
* Don't install Tempest when `rally verify [gen/show]config`
* Rally team tries to simplify usage of each our component.
Now Rally verification has some kind of a context like in Tasks.
Before launching each verification, Rally checks existence of required
resources(networks, images, flavours, etc) in Tempest configuration file and
pre-creates them. Do not worry, all these resources will not be forgotten
and left, Rally will clean them after verification.
Rally Task
~~~~~~~~~~
* Add --html-static argument to ``rally task report`` which allows to
generate HTML reports that doesn't require Internet.
* Rally supports different API versions now via api_versions context:
.. code-block:: none
CinderVolumes.create_and_delete_volume:
-
args:
size: 1
runner:
type: "constant"
times: 2
concurrency: 2
context:
users:
tenants: 2
users_per_tenant: 2
api_versions:
cinder:
version: 2
service_name: cinderv2
* Move rally.osclients.Clients to plugin base
Rally OSclients is pluggable now and it is very easy to extend OSClient for
your cloud out of Rally tree.
* Add 'merge' functionality to SLA
All SLA plugins should implement merge() method now.
In future this will be used for distributed load generation.
Where SLA results from different runners will be merged together.
* New optional_action_timer decorator
Allows to make the methods that can be both atomic_action or regular
method. Method changes behavior based on value in extra key "atomic_action"
Rally Certification
~~~~~~~~~~~~~~~~~~~
* Fix Glance certification arguments
* Add Neutron Quotas only if Neutron service is available
Specs & Feature Requests
~~~~~~~~~~~~~~~~~~~~~~~~
* Spec consistent-resource-names:
Resource name is based on Task id now. It is a huge step to persistence
and disaster cleanups.
* Add a spec for distributed load generation:
https://github.com/openstack/rally/blob/master/doc/specs/in-progress/distributed_runner.rst
* Improvements for scenario output format
https://github.com/openstack/rally/blob/master/doc/specs/in-progress/improve_scenario_output_format.rst
* Task and Verify results export command
https://github.com/openstack/rally/blob/master/doc/specs/in-progress/task_and_verification_export.rst
Plugins
~~~~~~~
* **Scenarios**:
* [new] NovaServers.boot_and_get_console_output
* [new] NovaServers.boot_and_show_server
* [new] NovaServers.boot_server_attach_created_volume_and_resize
* [new] NovaServers.boot_server_from_volume_and_resize
* [new] NeutronSecurityGroup.create_and_delete_security_groups
* [new] NeutronSecurityGroup.create_and_list_security_groups
* [new] NeutronSecurityGroup.create_and_update_security_groups
* [new] NeutronLoadbalancerV1.create_and_delete_healthmonitors
* [new] NeutronLoadbalancerV1.create_and_list_healthmonitors
* [new] NeutronLoadbalancerV1.create_and_update_healthmonitors
* [new] SwiftObjects.list_and_download_objects_in_containers
* [new] SwiftObjects.list_objects_in_containers
* [new] FuelNodes.add_and_remove_node
* [new] CeilometerMeters.list_matched_meters
* [new] CeilometerResource.list_matched_resources
* [new] CeilometerSamples.list_matched_samples
* [new] CeilometerStats.get_stats
* [new] Authenticate.validate_monasca
* [new] DesignateBasic.create_and_delete_zone
* [new] DesignateBasic.create_and_list_zones
* [new] DesignateBasic.list_recordsets
* [new] DesignateBasic.list_zones
* [fix] CinderVolumes.create_nested_snapshots_and_attach_volume
Remove random nested level which produce different amount of atomic
actions and bad reports.
* Support for Designate V2 api
* A lot of improvements in Sahara scenarios
* **Context**:
* [new] api_versions
Context allows us to setup client to communicate to specific service.
* [new] swift_objects
Context pre creates swift objects for future usage in scenarios
* [update] sahara_cluster
It supports proxy server which allows to use single floating IP for
whole cluster.
* [fix] cleanup
Fix cleanup of networks remove vip before port.
Bug fixes
~~~~~~~~~
**37 bugs were fixed, the most critical are**:
* Follow symlinks in plugin discovery
* Use sed without -i option for portability (install_rally.sh)
* Fixed race in rally.common.broker
* Fixed incorrect iteration number on "Failures" Tab
* Fixing issue with create_isolated_networks = False
* Fix docker build command
Documentation
~~~~~~~~~~~~~
Fixed some minor typos and inaccuracies.
Thanks
~~~~~~
We would like to thank Andreas Jaeger for ability to provide Python 2.6 support in this release.

View File

@@ -1,165 +0,0 @@
============
Rally v0.2.0
============
Information
-----------
+------------------+-----------------------+
| Commits | **48** |
+------------------+-----------------------+
| Bug fixes | *6** |
+------------------+-----------------------+
| Dev cycle | **19 days** |
+------------------+-----------------------+
| Release date | **1/11/2015** |
+------------------+-----------------------+
Details
-------
This release, as well as all previous ones, includes a lot of internal and
external changes. Most important of them are listed below.
.. warning:: Release 0.2.0 doesn't support python 26
Deprecations
~~~~~~~~~~~~
* Option --system-wide-install for ``rally verify start`` was deprecated in
favor of --system-wide
* `rally show` commands were deprecated because of 3 reasons:
- It blocks us to make Rally generic testing tool
- It complicates work on Rally as a Service
- You can always use standard OpenStack clients to do the same
Rally Verify
~~~~~~~~~~~~
* Add "xfail" mechanism for Tempest tests.
This mechanism allows us to list some tests, that are expected to fail,
in a YAML file and these tests will have "xfail" status instead of "fail".
Use new argument "--xfails-file" of rally verify start command.
Rally Task
~~~~~~~~~~
* --out argument of `rally task report` is optional now
If you don't specify --out <file> it will just print the resulting report
* Better scenario output support
As far as you know each scenario plugin are able to return data as a dict.
This dict contained set of key-values {<name>: <float>} where each name
was line on graph and each number was one of point. Each scenario run adds
a single point for each line on that graph.
This allows to add extra data to the Rally and see how some values were
changed over time. However, in case when Rally was used to execute some other
tool and collect it's data this was useless.
To address this **Scenario.add_output(additive, complete)** was introduced:
Now it is possible to generate as many as you need graphs by calling this
method multiple times.
There are two types of graph additive and complete. **Additive** is the same
as legacy concept of output data which is generated from results of all
iterations, **complete** are used when you would like to return whole chart
from each iteration.
HTML report has proper sub-tabs *Aggregated* and *Per iteration*
inside *Scenario Data* tab.
Here is a simple example how output can be added in any
scenario plugin:
.. code-block:: python
# This represents a single X point in result StackedArea.
# Values from other X points are taken from other iterations.
self.add_output(additive={"title": "How do A and B changes",
"description": ("Trend for A and B "
"during the scenario run"),
"chart_plugin": "StackedArea",
"data": [["foo", 42], ["bar", 24]]})
# This is a complete Pie chart that belongs to this concrete iteration
self.add_output(
complete={"title": "",
"description": ("Complete results for Foo and Bar "
"from this iteration"),
"chart_plugin": "Pie",
"data": [["foo", 42], ["bar", 24]]})
Rally Certification
~~~~~~~~~~~~~~~~~~~
None.
Specs & Feature Requests
~~~~~~~~~~~~~~~~~~~~~~~~
[Spec][Implemented] improve_scenario_output_format
https://github.com/openstack/rally/blob/master/doc/specs/implemented/improve_scenario_output_format.rst
Plugins
~~~~~~~
* **Scenarios**:
* [new] DesignateBasic.create_and_update_domain
* [improved] CinderVolumes.create_and_attach_volume
.. warning:: Use "create_vm_params" dict argument instead of ``**kwargs``
for instance parameters.
* **Context**:
* [improved] images
.. warning:: The min_ram and min_disk arguments in favor of image_args,
which lets the user specify any image creation keyword arguments they want.
Bug fixes
~~~~~~~~~
**6 bugs were fixed**:
* #1522935: CinderVolumes.create_and_attach_volume does not accept additional
args for create_volume
* #1530770: "rally verify" fails with error 'TempestResourcesContext' object
has no attribute 'generate_random_name'
* #1530075: cirros_img_url in rally.conf doesn't take effective in
verification tempest
* #1517839: Make CONF.set_override with parameter enforce_type=True by default
* #1489059: "db type could not be determined" running py34
* #1262123: Horizon is unreachable outside VM when we are using DevStack +
OpenStack
Documentation
~~~~~~~~~~~~~
None.
Thanks
~~~~~~
2 Everybody!

View File

@@ -1,188 +0,0 @@
============
Rally v0.3.0
============
Information
-----------
+------------------+-----------------------+
| Commits | **69** |
+------------------+-----------------------+
| Bug fixes | **7** |
+------------------+-----------------------+
| Dev cycle | **29 days** |
+------------------+-----------------------+
| Release date | **2/16/2016** |
+------------------+-----------------------+
Details
-------
This release, as well as all previous ones, includes a lot of internal and
external changes. Most important of them are listed below.
.. warning:: In this release Rally DB schema migration is introduced. While
upgrading Rally from previous versions it is required now to run
``rally-manade db upgrade``. Please see 'Documentation' section for details.
CLI changes
~~~~~~~~~~~
* .. warning:: [Removed] ``rally info`` in favor of ``rally plugin *``.
It was deprecated for a long time.
* [Modified] ``rally deployment check`` now prints services, which don't have
names, since such services can be used via api_versions context.
* .. warning:: [Modified] ``rally verify [re]install``
option --no-tempest-venv was deprecated in favor of --system-wide
* [Added] ``rally-manage db revision`` displays current revision of
Rally database schema
* [Added] ``rally-manage db upgrade`` upgrades pre-existing Rally
database schema to the latest revision
* [Added] ``rally-manage db downgrade`` to downgrades existing Rally
database schema to previous revision
* [Added] ``rally task export`` exports task results to external
services (only CLI command introduced, no real service support
implemented yet, however one could write own plugins)
* [Added] ``rally verify export`` exports verification results to
external services (only CLI command introduced, no real service support
implemented yet, however one could write own plugins)
Rally Deployment
~~~~~~~~~~~~~~~~
* .. warning:: ``fuel`` deployment engine is removed since it was outdated and
lacked both usage and support
Rally Task
~~~~~~~~~~
Add custom labels for "Scenario Output" charts
* X-axis label can be specified to add_output() by
"axis_label" key of chart options dict.
The key is named "axis_label" but not "x_label"
because chart can be displayed as table, so we explicitly
mention "axis" in option name to make this parameter
useless for tables
* Y-axis label can be specified to add_output() by
"label" key of chart options dict
In some cases this parameter can be used for rendering
tables - it becomes column name in case if chart with
single iteration is transformed into table
* As mentioned above, if we have output chart
with single iteration, then it is transformed to table,
because chart with single value is useless
* OutputLinesChart is added, it is displayed by
NVD3 lineChart()
* Chart "description" is optional now. Description is
not shown if it is not specified explicitly
* Scenario Dummy.add_output is improved to display labels
and OutputLinesChart
* Fix: If Y-values are too long and overlaps chart box,
then JavaScript updates chart width in runtime to fit
width of chart graphs + Y values to their DOM container
Rally Certification
~~~~~~~~~~~~~~~~~~~
None.
Specs & Feature Requests
~~~~~~~~~~~~~~~~~~~~~~~~
* [Spec][Introduced] Export task and verification results to external services
https://github.com/openstack/rally/blob/master/doc/specs/in-progress/task_and_verification_export.rst
* [Spec][Implemented] Consistent resource names
https://github.com/openstack/rally/blob/master/doc/specs/implemented/consistent_resource_names.rst
* [Feature request][Implemented] Tempest concurrency
https://github.com/openstack/rally/blob/master/doc/feature_request/implemented/add_possibility_to_specify_concurrency_for_tempest.rst
Plugins
~~~~~~~
* **Scenarios**:
- [added] VMTasks.workload_heat
- [added] NovaFlavors.list_flavors
- [updated] Flavors for Master and Worker node groups are now
configured separately for SaharaCluster.* scenarios
* **Context**:
- .. warning:: [deprecated] rally.plugins.openstack.context.cleanup
in favor of rally.plugins.openstack.cleanup
- [improved] sahara_cluster
Flavors for Master and Worker node groups are now
configured separately in ``sahara_cluster`` context
Miscellaneous
~~~~~~~~~~~~~
* Cinder version 2 is used by default
* Keystone API v3 compatibility improved
- Auth URL in both formats http://foo.rally:5000/v3
and http://foo.rally:5000 is supported for Keystone API v3
- Tempest configuration file is created properly according
to Keystone API version used
* ``install_rally.sh --branch`` now accepts all git tree-ish,
not just branches or tags
* VM console logs are now printed when Rally fails to connect to VM
* Add support for Rally database schema migration (see 'Documentation' section)
Bug fixes
~~~~~~~~~
**7 bugs were fixed**:
* #1540563: Rally is incompatible with liberty Neutron client
The root cause is that in Neutron Liberty client,
the _fx function doesn't take any explicit keyword parameter
but Rally is passing one (tenant_id).
* #1543414: The `rally verify start` command fails when running
a verification against Kilo OpenStack
* #1538341: Error in logic to retrieve image details in image_valid_on_flavor
Documentation
~~~~~~~~~~~~~
* Add documentation for DB migration
https://github.com/openstack/rally/blob/master/rally/common/db/sqlalchemy/migrations/README.rst
Thanks
~~~~~~
2 Everybody!

View File

@@ -1,47 +0,0 @@
============
Rally v0.3.1
============
Information
-----------
+------------------+-----------------------+
| Commits | **9** |
+------------------+-----------------------+
| Bug fixes | **6** |
+------------------+-----------------------+
| Dev cycle | **2 days** |
+------------------+-----------------------+
| Release date | **2/18/2016** |
+------------------+-----------------------+
Details
-------
This release is more about bug-fixes than features.
.. warning:: Please, update 0.3.0 to latest one.
Features
~~~~~~~~
* Pass api_versions info to glance images context
* [Verify] Don't create new flavor when flavor already exists
Bug fixes
~~~~~~~~~
**6 bugs were fixed, the most critical are**:
* #1545889: Existing deployment with given endpoint doesn't work anymore
* #1547092: Insecure doesn't work with Rally 0.3.0
* #1547083: Rally Cleanup failed with api_versions context in 0.3.0 release
* #1544839: Job gate-rally-dsvm-zaqar-zaqar fails since the recent Rally patch
* #1544522: Non-existing "called_once_with" method of Mock library is used

View File

@@ -1,216 +0,0 @@
============
Rally v0.3.2
============
Information
-----------
+------------------+-----------------------+
| Commits | **55** |
+------------------+-----------------------+
| Dev cycle | **25 days** |
+------------------+-----------------------+
| Release date | **3/14/2016** |
+------------------+-----------------------+
Details
-------
This release, as well as all previous ones, includes a lot of internal and
external changes. Most important of them are listed below.
CLI changes
~~~~~~~~~~~
* .. warning:: [Modified] Option '--tempest-config' for 'rally verify
reinstall' command was deprecated for removal.
* .. warning:: [Removed] Option `--system-wide-install` was removed from
`rally verify` commands in favor of `--system-wide` option.
* .. warning:: [Modified] Step of installation of Tempest during execution of
the `rally verify start` command was deprecated and will be removed in the
future. Please use `rally verify install` instead.
* Rework commands.task.TaskCommands.detailed. Now output of the command
contains the same results as in HTML report.
Rally Verify
~~~~~~~~~~~~
* Re-run failed Tempest tests
Add the ability to re-run the tempest tests that failed in the last test
execution. Sometimes Tempest tests fail due to a special temporary condition
in the environment, in such cases it is very useful to be able to re-execute
those tests.
Running the following command will re-run all the test that failed during
the last test execution regardless of what test suite was run.
.. code-block:: bash
rally verify start --failing
Specs & Feature Requests
~~~~~~~~~~~~~~~~~~~~~~~~
* `[Spec][Introduced] Refactoring scenario utils`__
__ https://github.com/openstack/rally/blob/master/doc/specs/in-progress/refactor_scenario_utils.rst
* `[Spec] Deployment unification`__
__ https://github.com/openstack/rally/blob/master/doc/specs/in-progress/deployment_type.rst
Plugins
~~~~~~~
* **Scenarios**:
* [updated] Fix flavor for cloudera manager
Cloudera manager need master-node flavor
* [added] Expand Nova API benchmark in Rally
Add support for listing nova hosts, agents, availability-zones
and aggregates.
* [updated] Make sure VolumeGenerator uses the api version info while cleanup
* Designate V2 - Add recordset scenarios
Add create_and_(list|delete)_recordset scenarios
Remove the test also that checks the allowed methods, this is in order for
us to be able to have a private method _walk_pages that will do fetching of
pages for us vs attempting to fetch 1 giant list at once.
* unify \*_kwargs name in scenarios
When running a scenario, `kwargs` is used as default key-word arguments.
But in some scenarios, there are more and one services being called, and
we use xxx_kwargs for this case.
However, some xxx_kwargs are not unified for same usage[0]. Unifying
these could avoid misleading for end users. Another improvement is to
add xxx_kwargs with empty settings for scenario config files.
[0] http://paste.openstack.org/show/489505/
* .. warning:: Deprecated arguments 'script' and 'interpreter' were removed
in favor of 'command' argument.
VM task scenarios executes a script with a interpreter provided through a
formatted argument called 'command' which expects the remote_path or
local_path of the script and optionally an interpreter with which the
script has to be executed.
Miscellaneous
~~~~~~~~~~~~~
* Avoid using `len(x)` to check if x is empty
This cases are using `len()` to check if collection has items. As
collections have a boolean representation too, directly check for true /
false. And fix the wrong mock in its unit test.
* Fix install_rally.sh to get it to work on MacOSX
On MacOSX, `mktemp` requires being passed a template. This change modifies
the calls to `mktemp` to explicitly pass a template so that the code works
on both MacOSX and linux.
* Use new-style Python classes
There are some classes in the code that didn't inherited from
nothing and this is an old-style classes. A "New Class" is the
recommended way to create a class in modern Python.A "New Class"
should always inherit from `object` or another new-style class.
Hacking rule added as well.
* Make Rally cope with unversioned keystone URL
With the change, the client version that's returned is now determined by
the keystoneclient library itself based on whether you supply a URL with a
version in it or not.
* Fix rally-mos job to work with mos-8.0
Also remove hardcoded values for some other jobs.
* Add name() to ResourceManager
This will allow us to perform cleanup based on the name.
* Add task_id argument to name_matches_object
This will be used to ensure that we are only deleting resources for a
particular Rally task.
* Extend api.Task.get_detailed
Extend api.Task.get_detailed with ability to return task data as dict with
extended results.
Bug fixes
~~~~~~~~~
**The most critical fixed bugs are**:
* #1547624: Wrong configuration for baremetal(ironic) tempest tests
* #1536800: openrc values are not quoted
The openrc file created after rally deployment --fromenv did not quote the
values for environment variables that will be exported.
* #1509027: Heat delete_stack never exits if status is DELETE_FAILED
* #1540545: Refactored atomic action in authenticate scenario
* #1469897: Incompatible with Keystone v3 argument in service create scenario
* #1550262: Different results in ``rally task detailed``, ``rally task report``
and ``rally task status`` commands.
* #1553024: Backward incompatible change in neutronclient(release 4.1.0) broke
Tempest config generation to support latest neutronclient.
Documentation
~~~~~~~~~~~~~
* Add documentation for DB migration
* Make documentation for output plugins
* Add descriptive docstrings for plugins based on OutputChart
* Register these plugins in `Rally Plugins Reference`__
__ https://docs.openstack.org/rally/latest/plugins/plugin_reference.html
* Documentation tox fix
Added information about debugging unit test with tox. Replace 3 references
to py26 with py34 to reflect current rally tox configuration.
* Change structure of rally plugin and plugin references page
* Update the scenario development, runner and context sections
* The design of `Rally Plugins Reference`__ page was improved
__ https://docs.openstack.org/rally/latest/plugins/plugin_reference.html
* New page was added - `CLI references`__
__ https://docs.openstack.org/rally/latest/cli_reference.html
Thanks
~~~~~~
To Everybody!

View File

@@ -1,112 +0,0 @@
============
Rally v0.3.3
============
Information
-----------
+------------------+-----------------------+
| Commits | **20** |
+------------------+-----------------------+
| Dev cycle | **10 days** |
+------------------+-----------------------+
| Release date | **3/24/2016** |
+------------------+-----------------------+
Details
-------
A half of patches relate to Cleanup. We have once again proved that ideal
stuff can be improved. :)
Specs & Feature Requests
~~~~~~~~~~~~~~~~~~~~~~~~
* `[Spec][Introduced] Improve atomic actions format`__
__ https://github.com/openstack/rally/blob/master/doc/specs/in-progress/improve_atomic_actions_format.rst
Plugins
~~~~~~~
* **Cleanups**:
* Use proper attribute to get heat stack name
* Always assign a name to created images.
This is necessary for name-based cleanup. If a name is not specified, one
will be generated automatically.
* Improve filtering glance images in case of V2 API
* Delete only images created by images context
Since the images context allows creating images with arbitrary names,
name-based cleanup won't work for it, so we have to delete the exact list
of images that it created instead.
* New config option to set cleanup threads
Allow the user to change the number of cleanup threads via the rally
config. When scaling out to thousands of instances, the cleanup can take
forever with the static 20 threads.
* Add inexact matching to name_matches_object
This will support places where we create resources with names that start
with a given name pattern, but include some additional identifier
afterwards. For instance, when bulk creating instances, Nova appends a UUID
to each instance name.
* **Scenarios**:
* Add sample of template for testing for testing heat caching.
* Introduced new scenario `Dummy.dummy_random_action`__. It is suitable for
demonstration of upcoming trends report.
__ http://rally.readthedocs.org/en/latest/plugin/plugin_reference.html#dummy-dummy-random-action-scenario
* **Contexts**:
`api_versions`__ context was extended to support switch between Keystone V2
and V3 API versions. Now it is possible to use one Rally deployment to check
both Keystone APIs.
__ http://rally.readthedocs.org/en/latest/plugin/plugin_reference.html#api-versions-context
* **Newcomer in the family**:
All ResourceType classes are pluggable now and it is much easier to use and
extend them.
.. warning:: Decorator ``rally.task.types.set`` is deprecated now in favor of
``rally.task.types.convert``.
Bug fixes
~~~~~~~~~
* #1536172: rally deployment destroy failed with traceback for failed
deployments. At current moment it is impossible to delete deployment if for
some reason deployment engine plugin cannot be found, because exception will
be thrown.
Documentation
~~~~~~~~~~~~~
* Remove extra link in `All release notes`
Previously, two links for latest release were presented.
* Update release notes for 0.3.2
* Fixed indents for warning messages
* Fixed all references
Thanks
~~~~~~
To Everybody!

View File

@@ -1,286 +0,0 @@
============
Rally v0.4.0
============
Information
-----------
+------------------+-----------------------+
| Commits | **76** |
+------------------+-----------------------+
| Bug fixes | **12** |
+------------------+-----------------------+
| Dev cycle | **28 days** |
+------------------+-----------------------+
| Release date | **4/18/2016** |
+------------------+-----------------------+
Details
-------
.. warning:: Rally DB schema was changed since previous release.
See `HOWTO <http://rally.readthedocs.org/en/latest/db_migrations.html>`_
about updating your database.
CLI changes
~~~~~~~~~~~
* Add status messages of db migration process
* Display task errors in human-friendly form
* Support OS_PROJECT_NAME as well as OS_TENANT_NAME
Messages
~~~~~~~~
* Removed deprecation warning in case of transmitted "name" attribute while
creation neutron resources.
.. warning:: Deprecated code was deleted.
* Suppress warning insecure URL messages
Do not spam end users by insecure URL messages because it is
quite valid case in testing process
Database
~~~~~~~~
While preparing for deployment refactoring:
* db schema was changed;
* migration with new column `credentials` to deployment model was added;
* columns `users` and `admin` were dropped.
Rally Task
~~~~~~~~~~
* Remove deprecated scenario output mechanism via returing value
.. warning:: Deprecated code was deleted.
* Friendlier error message with empty task file
This is particularly useful when a Jinja2 template results in an empty
task. The current error message isn't very helpful:
Task config is invalid: `'NoneType' object has no attribute 'get'`
* Add Heat template validator
Plugins
~~~~~~~
**Scenarios**:
* Extend VM bind actions with "pause_unpause", "suspend_resume", "lock_unlock",
"shelve_unshelve".
* Add exact error message into `VMTasks.runcommand_heat scenario`__
__ http://rally.readthedocs.org/en/0.4.0/plugin/plugin_reference.html#vmtasks-runcommand-heat-scenario
* Add heat scenarios: output-show, output-list
Current patch contains 4 scenarios from heat repo:
- `output-show for old algorithm
<http://rally.readthedocs.org/en/0.4.0/plugin/plugin_reference.html#heatstacks-create-stack-and-list-output-via-api-scenario>`_
- `output-show for new algorithm
<http://rally.readthedocs.org/en/0.4.0/plugin/plugin_reference.html#heatstacks-create-stack-and-show-output-scenario>`_
- `output-list for old algorithm
<http://rally.readthedocs.org/en/0.4.0/plugin/plugin_reference.html#heatstacks-create-stack-and-list-output-via-api-scenario>`_
- `output-list for new algorithm
<http://rally.readthedocs.org/en/0.4.0/plugin/plugin_reference.html#heatstacks-create-stack-and-list-output-scenario>`_
**Contexts**:
* Reduce default speed of users creation in users context from 30 to 20
by default.
**SLAs**:
* *NEW!!* MaxAverageDurationPerAtomic : Maximum average duration of one
iterations atomic actions in seconds.
`Plugin Reference <http://rally.readthedocs.org/en/0.4.0/plugin/plugin_reference.html#max-avg-duration-per-atomic-sla>`_
**Reports**:
* Improve results calculation in charts.Table
* Use int instead of float for Y axis. It's number of parallel iterations and
it can't be float.
* Remove accuracy that makes no sense, and creates a lot of noise on this graph
* Include failed iterations as well, otherwise we will calculate load
incorrectly
* Graph should start from 0 (begging of experiment)
* Add 2 points at the end of graph to get at the end of graph 0 iterations
in parallel
**Task Exporter**:
In previous release we introduced new mechanism to export results in various
external systems and various formats.
In this release, we added first plugin for this stuff - `file_exporter`
**Services**:
Remove hardcoded timeout from heat service
**Utils**:
Make glance web uploads streamable
Without this change entire file get's downloaded into memory and can cause
issues.
Rally Verify
~~~~~~~~~~~~
* Set time precision to 3 digits (instead of 5) after dot.
* Don't use "--parallel" flag when concurrency == 1
If concurrency equals to 1, it means that we use only one thread to run
Tempest tests and the "--parallel" flag is not needed.
Plugin for DevStack
~~~~~~~~~~~~~~~~~~~
* Support to be enabled with different plugin name
Allow rally to be installed by devstack through a different plugin
name, e.g:
.. code-block:: bash
enable_plugin test-rally http://github.com/rally/rally.git master
* Removed uncalled code
Devstack won't "source plugin.sh source" any more.
Bug fixes
~~~~~~~~~
**12 bugs were fixed**:
* X-Fail mechanism did not work for TestCase which failed on setUp step
If Tempest fails in a test's setUpClass(), there is only one subunit event
for each TestCase. In this case, Rally did not check partial test with x-fail
list and marked test as "fail" insted of "x-fail".
`Launchpad bug-report #1568133
<https://bugs.launchpad.net/rally/+bug/1568133>`_
* Weak isolation of scenario arguments between iterations
Input arguments for sub-task were shared between all iterations. Rally team
found one scenario which modified mutable input variable.
Affected scenario: NeutronNetworks.create_and_update_ports
* Incompatible filters between V1 and V2 for Glance images listing
Glance V1 and V2 have different filters. For example, "owner" is a separate
kwarg in V1, not a generic filter. Also, visibility has different labels in
different APIs. We modified our Glance wrapper to support Glance V2 format
of filters for both V1 and V2
* Wrong way to store validation errors
Results of failed task validations saved in incorrect format. It broke and
made un-userfriendly `rally task detailed` command.
`Launchpad bug-report #1562713
<https://bugs.launchpad.net/rally/+bug/1562713>`_
* Hardcoded task's status in `rally task results`
If there are no results for task, `rally task results` printed message that
task has failed status, but it can be not true(tasks in running state do not
have results).
`Launchpad bug-report #1539096
<https://bugs.launchpad.net/rally/+bug/1539096>`_
* Tempest context failed to create network resources
While we merged improvement for keystoneclient, we used wrong way to obtain
tenant id in TempestContext.
`Launchpad bug-report #1550848
<https://bugs.launchpad.net/rally/+bug/1550848>`_
* Tasks based on Tempest failed to parse execution time.
There is an ability in Rally to launch tasks based on Tempest. Since launch
of Tempest is just subprocess, it is needed to parse subunit to set correct
atomic actions.
There was an issue while converting task execution time.
`Launchpad bug-report #1566712
<https://bugs.launchpad.net/rally/+bug/1566712>`_
* JSONSchema huge impact on task performance
Before runner sent data to engine we were checking jsonschema. This operation
is very expensive and in some cases it can take a lot of time.
Here are test results, with Dummy.dummy_output scenario, sleep 0.5s
(added manually), 8000 iterations, 400 in parallel:
* on master branch before the fix:
Load duration: 117.659588099
Full duration: 227.451056004
* on master before the fix but remove jsonschema validation in scenario:
Load duration: 12.5437350273
Full duration: 128.942219973
* on this patch before the fix (pure python validation):
Load duration: 11.5991640091
Full duration: 22.7199981213
* Wrong Calculation of running iterations in parallel
Load profile chart was calculated wrongly.
It showed more running iterations in parallel than actually are running.
* Rally did not show "missing argument" error raised by argparse while parsing
cli args
`Launchpad bug-report #1562916
<https://bugs.launchpad.net/rally/+bug/1562916>`_
* Issue while checking required arguments in CLI
There was a possible issue in case of several required arguments
`Launchpad bug-report #1555764
<https://bugs.launchpad.net/rally/+bug/1555764>`_
* Prepare step of verification did not check visibility of obtained image
When we request a list of images to choose one of them for tests, we should
make sure all images are active and they are PUBLIC. If images are not
public, we will have failures of Tempest tests as described in the bug.
`Launchpad bug-report #1564431
<https://bugs.launchpad.net/rally/+bug/1564431>`_
Thanks
~~~~~~
2 Everybody!

View File

@@ -1,410 +0,0 @@
============
Rally v0.5.0
============
Information
-----------
+------------------+-----------------------+
| Commits | **175** |
+------------------+-----------------------+
| Bug fixes | **19** |
+------------------+-----------------------+
| Dev cycle | **93 days** |
+------------------+-----------------------+
| Release date | **7/20/2016** |
+------------------+-----------------------+
Details
-------
This release took much more time than we expected, but we have a lot of
reasons for such delay and if you look at our change-log, you will understand
them.:)
Here is a quick introduction:
* To make our releases as much as possible stable, we added upper limits for
each of our requirements;
* A lot of deprecated lines of code were removed, so be careful;
* Statistics trends for given tasks were introduced;
* Support for tempest plugins was added;
* Several new pages at docs.
Specs & Feature Requests
~~~~~~~~~~~~~~~~~~~~~~~~
* `[Introduced && implemented] Introduce class-based scenario implementation <https://github.com/openstack/rally/blob/0.5.0/doc/specs/implemented/class-based-scenarios.rst>`_
* `[Introduced] Rally Task Validation refactoring <https://github.com/openstack/rally/blob/0.5.0/doc/specs/in-progress/pluggable_validators.rst>`_
* `[Introduced] Scaling & Refactoring Rally DB <https://github.com/openstack/rally/blob/0.5.0/doc/specs/in-progress/db_refactoring.rst>`_
* `[Introduced] SLA Performance degradation plugin <https://github.com/openstack/rally/blob/0.5.0/doc/specs/in-progress/sla_pd_plugin.rst>`_
Logging
~~~~~~~
* disable urllib3 warnings only if the library provide them
Database
~~~~~~~~
[doesn't require migration]
Transform DB layer to return dicts, not SQLAlchemy models
Rally Deployment
~~~~~~~~~~~~~~~~
* Support single-AZ deployment
This supports the case where OpenStack is deployed with a single AZ for both
controller(s) and compute(s), and not all hosts in the AZ that contains an
instance are guaranteed to have the nova-compute service.
* Extend creation from environment with several new vars
- OS_ENDPOINT_TYPE/OS_INTERFACE
- OS_USER_DOMAIN_NAME
- OS_PROJECT_DOMAIN_NAME
* Improve devstack plugin for Keystone V3
Rally Task
~~~~~~~~~~
*NEW!!* Statistics trends for given tasks.
Rally Verify
~~~~~~~~~~~~
* Remove '--tempest-config' arg from 'reinstall' command
.. warning:: Using `--tempest-config` is became an error from this release.
Use `rally verify genconfig` cmd for all config related stuff.
* Don't install Tempest when `rally verify start`
.. warning:: Use should use `rally verify install` cmd to install tempest now
* Add ability to setup version of Tempest to install
`CLI argument to setup version <http://rally.readthedocs.io/en/0.5.0/cli/cli_reference.html#verify-install-version>`_
* Configure 'aodh' service in 'service_available' section
* Check existence of Tempest-tree in `rally verify discover` cmd
* Make Tempest work with auth url which doesn't include keystone version
Tempest needs /v2.0 and /v3 at the end of URLs. Actually, we can't fix
Tempest, so we extend our configuration module with workaround which allow
to specify auth_url without version in rally deployment config.
* Use default list of plugins for sahara
* Move tempest related options of rally configuration to separate section.
* *NEW!!* Support for tempest plugins.
`CLI argument to install them <http://rally.readthedocs.io/en/0.5.0/cli/cli_reference.html#verify-installplugin>`_
Plugins
~~~~~~~
In this release we are happy to introduce new entity - plugins Base classes
We have a lot of base plugin entities: Context, Scenario, SLA and etc.
Sometimes plugins of different bases can have equal names(i.e ceilometer
OSClient and ceilometer Context). It is normal and we should allow such
conflicts. To support such cases we introduced new entity - plugin base.
Statements of plugin bases:
- Each plugin base is unique entity;
- Names of plugin bases can't conflict with each other;
- Names of two or more plugins in one plugin base can't conflict with each
other(in case of same namespace).
- Names of two or more plugins in different plugin base can conflict
Current list of plugin bases:
- rally.task.context.Context
- rally.task.scenario.Scenario
- rally.task.types.ResourceType
- rally.task.exporter.TaskExporter
- rally.task.processing.charts.Chart
- rally.task.runner.ScenarioRunner
- rally.task.sla.SLA
- rally.deployment.serverprovider.provider.ProviderFactory
- rally.deployment.engine.Engine
- rally.osclients.OSClient
**OSClients**
* *NEW!!* Support for Senlin client
* *NEW!!* Support for Gnocchi client
* *NEW!!* Support for Magnum client
* *NEW!!* Support for Watcher client
* Transmit endpoint_type to saharaclient
**Scenarios**:
* *NEW!!*:
- `Authenticate.validate_ceilometer <http://rally.readthedocs.io/en/0.5.0/plugin/plugin_reference.html#authenticate-validate-ceilometer-scenario>`_
- `CinderVolumes.create_volume_from_snapshot <http://rally.readthedocs.io/en/0.5.0/plugin/plugin_reference.html#cindervolumes-create-volume-from-snapshot>`_
- `CinderVolumes.create_volume_and_clone <http://rally.readthedocs.io/en/0.5.0/plugin/plugin_reference.html#cindervolumes-create-volume-and-clone>`_
- `NovaFlavors.create_and_list_flavor_access <http://rally.readthedocs.io/en/0.5.0/plugin/plugin_reference.html#novaflavors-create-and-list-flavor-access-scenario>`_
- `NovaFlavors.create_flavor <http://rally.readthedocs.io/en/0.5.0/plugin/plugin_reference.html#novaflavors-create-flavor-scenario>`_
- `NovaServers.boot_and_update_server <http://rally.readthedocs.io/en/0.5.0/plugin/plugin_reference.html#novaservers-boot-and-update-server>`_
- `NovaServers.boot_server_from_volume_snapshot <http://rally.readthedocs.io/en/0.5.0/plugin/plugin_reference.html#novaservers-boot-server-from-volume-snapshot>`_
* [Sahara] Add configs to MapR plugin
* Extend CinderVolumes.create_and_upload_volume_to_image with "image" argument
`Plugin Reference <http://rally.readthedocs.io/en/0.5.0/plugin/plugin_reference.html#cindervolumes-create-and-upload-volume-to-image-scenario>`_
* Deprecate Dummy.dummy_with_scenario_output scenario in favor of Dummy.dummy_output
.. warning:: Dummy.dummy_with_scenario_output scenario will be removed after
several releases
`Deprecated Plugin Reference <http://rally.readthedocs.io/en/0.5.0/plugin/plugin_reference.html#dummy-dummy-with-scenario-output-scenario>`_
`New Plugin Reference <http://rally.readthedocs.io/en/0.5.0/plugin/plugin_reference.html#dummy-dummy-output-scenario>`_
* Extend CinderVolumes.create_volume_and_clone with nested_level
Add nested_level argument for nested cloning volume to new volume
* Extend `CinderVolumes.create_nested_snapshots_and_attach_volume
<http://rally.readthedocs.io/en/0.5.0/plugin/plugin_reference.html#cindervolumes-create-nested-snapshots-and-attach-volume-scenario>`_
Two new arguments were added: create_volume_kwargs and create_snapshot_kwargs
.. warning:: All arguments related to snapshot creation should be transmitted
only via create_snapshot_kwargs.
* Introduce new style of scenarios - class based.
`Spec Reference <https://github.com/openstack/rally/blob/0.5.0/doc/specs/implemented/class-based-scenarios.rst>`_
* Improve report for VMTasks.boot_runcommand_delete
* [Sahara] Added 5.5.0 version for cdh-plugin and 1.6.0 version for spark
* Extend boot_server_from_volume_and_delete, boot_server_from_volume,
boot_server_from_volume_and_live_migrate, boot_server_from_volume_snapshot
scenarios of NovaServers class with "volume_type" parameter.
**Contexts**:
* *NEW!!*:
- `Cinder volume_types <http://rally.readthedocs.io/en/0.5.0/plugin/plugin_reference.html#volume-types-context>`_
- `Murano environments <http://rally.readthedocs.io/en/0.5.0/plugin/plugin_reference.html#murano-environments-context>`_
- `Heat dataplane <http://rally.readthedocs.io/en/0.5.0/plugin/plugin_reference.html#heat-dataplane-context>`_
* Use Broker Pattern in Keystone roles context
* Use immutable types for locking context configuration
Since context configuration passed to Context.__init__() was a mutable type
(dict or list), sometimes we had unexpected changes done by unpredictable
code (for example, in wrappers).
* Add possibility to balance usage of users
For the moment all users for tasks were taken randomly and there was no way
to balance them between tasks. It may be very useful when we have difference
between first usage of tenant/user and all consecutive. In this case we get
different load results.
Therefore, "users" context was extended with new config option
'user_choice_method' that defines approach for picking up users.
Two values are available:
- random
- round_robin
Default one is compatible with old approach - "random".
* Make sahara_image and custom_image contexts glance v2 compatible
* Extend servers context with "nics" parameter
* Extend network context with "dns_nameservers" parameter
* Extend volume context with "volume_type" parameter
**Cleanup**:
* Mark several cleanup resources as tenant_resource
Nova servers and security groups are tenant related resources, but resource
decorator missed that fact which makes cleanup tries to delete one resources
several times.
* Turn off redundant nova servers cleanup for NovaFlavors.list_flavors scenario
* Add neutron cleanup for NeutronSecurityGroup.create_and_delete_security_groups
**Exporter**:
Rename task-exporter "file-exporter" to "file".
.. warning:: "file-exporter" is deprecated and will be removed in further
releases.
**Types**:
Remove deprecated types.
.. warning:: you should use rally.task.types.convert instead of
rally.task.types.set decorator
**Validators**
* Add a required_api_version validator
* Add validators for scenario arguments
**Utils**:
Use glance wrapper where appropriate to support compatibility between V1 and V2
Bug fixes
~~~~~~~~~
**19 bugs were fixed**:
* Wrong arguments order of Keystone wrapper in case of V2 and V3
* AttributeError while disabling urllib3 warnings on old installations
`Launchpad bug-report #1573650
<https://bugs.launchpad.net/rally/+bug/1573650>`_
* install_rally.sh script is failed while obtaining setuptools
* "-inf" load duration in case of wrong runner plugin and failed start of
contexts
* Strange input task in the report
`Launchpad bug-report #1570328
<https://bugs.launchpad.net/rally/+bug/1570328>`_
* Wrong behaviour of boot_server_from_volume scenarios in case of booting
server from image.
The arg of image must be None, when booting server from volume. Otherwise
still boot server from image.
Affected scenarios:
NovaServers.boot_server_from_volume
NovaServers.boot_server_from_volume_and_delete
NovaServers.boot_server_from_volume_and_resize
NovaServers.boot_server_from_volume_and_live_migrate
`Launchpad bug-report #1578556
<https://bugs.launchpad.net/rally/+bug/1578556>`_
* Weak validation of json schema of RPS runner
JSON Schema of RPS runner doesn't have "required" field. It means that
users are able to pass wrong configs and we will have runtime error while
running task.
* Rally doesn't take cacert setting while creating keystone session
`Launchpad bug-report #1577360
<https://bugs.launchpad.net/rally/+bug/1577360>`_
* Heat scenarios fail when API uses TLS
`Launchpad bug-report #1585456
<https://bugs.launchpad.net/rally/+bug/1585456>`_
* Example in comment of context manila_share_networks wrong
`Launchpad bug-report #1587164
<https://bugs.launchpad.net/rally/+bug/1587164>`_
* There is no way to get UUID of a verification after it is created by
"rally verify start" or "rally verify import_results" when --no-use is set
`Launchpad bug-report #1587034
<https://bugs.launchpad.net/rally/+bug/1587034>`_
* Exposed ssh timeout and interval in vm scenario
`Launchpad bug-report #1587728
<https://bugs.launchpad.net/rally/+bug/1587728>`_
* Ceilometer scenario doesn't require "ceilometer" ctx
`Launchpad bug-report #1557642
<https://bugs.launchpad.net/rally/+bug/1557642>`_
* "servers" context requires setting network id for multiple possible networks
found.
`Launchpad bug-report #1592292
<https://bugs.launchpad.net/rally/+bug/1592292>`_
* nested_level data type incorrect in create_nested_snapshots_and_attach_volume
`Launchpad bug-report #1594656
<https://bugs.launchpad.net/rally/+bug/1594656>`_
* Rally cleanup servers raises exception
`Launchpad bug-report #1584104
<https://bugs.launchpad.net/rally/+bug/1584104>`_
* Stopping server is redundant before cold-migrating server
`Launchpad bug-report #1594730
<https://bugs.launchpad.net/rally/+bug/1594730>`_
* existing_users context doesn't work in case of Keystone v3
* Whether validates flavor's disk or not depends on booting type of the instance
`Launchpad bug-report #1596756
<https://bugs.launchpad.net/rally/+bug/1596756>`_
Documentation
~~~~~~~~~~~~~
* Re-use openstack theme for building docs outside rtd.
`Rally Docs at docs.openstack.org
<https://docs.openstack.org/rally/latest/>`_
* Add page for Verification component
`RTD page for Verification component
<http://rally.readthedocs.io/en/0.5.0/tutorial/step_10_verifying_cloud_via_tempest.html>`_
* Add glossary page
`RTD page for Glossary
<http://rally.readthedocs.io/en/0.5.0/tutorial/glossary.html>`_
* Adjust docs reference to "KeystoneBasic.authenticate" scenario
`Step 6. Aborting load generation on success criteria failure
<http://rally.readthedocs.io/en/0.5.0/tutorial/step_6_aborting_load_generation_on_sla_failure.html>`_
Thanks
~~~~~~
2 Everybody!

View File

@@ -1,198 +0,0 @@
============
Rally v0.6.0
============
Overview
--------
+------------------+-----------------------+
| Release date | **9/05/2016** |
+------------------+-----------------------+
Details
-------
Common
~~~~~~
* Added Python 3.5 support
* Sync requirements with OpenStack global-requirements
* Start using latest way of authentication - keystoneauth library
* Start porting all scenario plugins to class-based view.
Specs & Feature Requests
~~~~~~~~~~~~~~~~~~~~~~~~
* `[Implemented] SLA Performance degradation plugin <https://github.com/openstack/rally/blob/0.6.0/doc/specs/implemented/sla_pd_plugin.rst>`_
* `[Proposed] New Tasks Configuration section - hook <https://github.com/openstack/rally/blob/0.6.0/doc/specs/in-progress/hook_section.rst>`_
Database
~~~~~~~~
* disable db downgrade api
* [require migration] upgrade deployment config
Docker image
~~~~~~~~~~~~
* Add sudo rights to rally user
Rally is a pluggable framework. External plugins can require installation of
additional python or system packages, so we decided to add sudo rights.
* Move from ubuntu:14.04 base image to ubuntu:16.04 .
Ubuntu 16.04 is current/latest LTS release. Let's use it.
* pre-install vim
Since there are a lot of users who like to experiment and modify samples
inside container, rally team decided to pre-install vim
* configure/pre-install bash-completion
Rally provides bash-completion script, but it doesn't work without installed
`bash-completion` package and now it is included in our image.
Rally Deployment
~~~~~~~~~~~~~~~~
* Add strict jsonschema validation for ExistingCloud deployments. All incorrect
and unexpected properties will not be ignored anymore. If you need to store
some extra parameters, you can use new "extra" property.
* Fix an issue with endpoint_type.
Previously, endpoint type was not transmitted to keystone client. In this
case, keystoneclient used default endpoint type (for different API calls it
can differ). Behaviour after the fix:
- None endpoint type -> Rally will initialize all clients without setting
endpoint type. It means that clients will choose what default values for
endpoint type use by itself. Most of clients have "public" as default
values. Keystone use "admin" or "internal" by default.
- Not none endpoint type -> Rally will initialize all clients with this
endpoint. Be careful, by default most of keystone v2 api calls do not work
with public endpoint type.
Rally Task
~~~~~~~~~~
* [core] Iterations numbers in logging and reports must be synchronized. Now
they start from 1 .
* [config] users_context.keystone_default_role is a new config option
(Defaults to "member") for setting default user role for new users in case
of Keystone V3.
* [Reports] Embed Rally version into HTML reports
This adds Rally version via meta tag into HTML reports:
<meta name="generator" content="Rally version {{ version }}">
* [Reports] Expand menu if there is only one menu group
* [logging] Remove deprecated rally.common.log module
* [Trends][Reports] Add success rate chart to trends report
* [Reports] Hide menu list if there is no data at all
Rally Verify
~~~~~~~~~~~~
* Updating Tempest config file
- Some tests (for boto, horizon, etc.) were removed from Tempest and now there
is no need to keep the corresponding options in Tempest config file.
- Some options in Tempest were moved from one section to another and we should
to do the corresponding changes in Rally to be up to date with the latest
Tempest version.
* Adding '--skip-list' arg to `rally verify start` cmd
`CLI argument for --skip-list <http://rally.readthedocs.io/en/0.6.0/cli/cli_reference.html#verify-start-skiplist>`_
* *NEW!!*:
- `Command for plugin listing <http://rally.readthedocs.io/en/0.6.0/cli/cli_reference.html#rally-verify-listplugins>`_
- `Command to uninstall plugins <http://rally.readthedocs.io/en/0.6.0/cli/cli_reference.html#rally-verify-uninstallplugin>`_
* Rename and deprecated several arguments for `rally verify start` cmd:
- tests-file -> load-list
- xfails-file -> xfail-list
Plugins
~~~~~~~
**Scenarios**:
* Extend Sahara scenarios with autoconfig param
Affected plugins:
- `SaharaClusters.create_and_delete_cluster <http://rally.readthedocs.io/en/0.6.0/plugin/plugin_reference.html#saharaclusters-create-and-delete-cluster-scenario>`_
- `SaharaClusters.create_scale_delete_cluster <http://rally.readthedocs.io/en/0.6.0/plugin/plugin_reference.html#saharaclusters-create-scale-delete-cluster-scenario>`_
- `SaharaNodeGroupTemplates.create_and_list_node_group_templates <http://rally.readthedocs.io/en/0.6.0/plugin/plugin_reference.html#saharanodegrouptemplates-create-and-list-node-group-templates-scenario>`_
- `SaharaNodeGroupTemplates.create_delete_node_group_templates <http://rally.readthedocs.io/en/0.6.0/plugin/plugin_reference.html#saharanodegrouptemplates-create-delete-node-group-templates-scenario>`_
* *NEW!!*:
- `MonascaMetrics.list_metrics <http://rally.readthedocs.io/en/0.6.0/plugin/plugin_reference.html#monascametrics-list-metrics-scenario>`_
- `SenlinClusters.create_and_delete_cluster <http://rally.readthedocs.io/en/0.6.0/plugin/plugin_reference.html#senlinclusters-create-and-delete-cluster-scenario>`_
- `Watcher.create_audit_template_and_delete <http://rally.readthedocs.io/en/0.6.0/plugin/plugin_reference.html#watcher-create-audit-template-and-delete-scenario>`_
- `Watcher.create_audit_and_delete <http://rally.readthedocs.io/en/0.6.0/plugin/plugin_reference.html#watcher-create-audit-and-delete-scenario>`_
- `Watcher.list_audit_templates <http://rally.readthedocs.io/en/0.6.0/plugin/plugin_reference.html#watcher-list-audit-templates-scenario>`_
* Rename **murano.create_service** to **murano.create_services** atomic action
**SLA**:
*NEW!!*: `performance degradation plugin <http://rally.readthedocs.io/en/0.6.0/plugin/plugin_reference.html#performance-degradation-sla>`_
**Contexts**:
* *NEW!!*:
- `Monasca monasca_metrics <http://rally.readthedocs.io/en/0.6.0/plugin/plugin_reference.html#monasca-metrics-context>`_
- `Senlin profiles <http://rally.readthedocs.io/en/0.6.0/plugin/plugin_reference.html#profiles-context>`_
- `Watcher audit_templates <http://rally.readthedocs.io/en/0.6.0/plugin/plugin_reference.html#audit-templates-context>`_
* Extend `manila_share_networks <http://rally.readthedocs.io/en/0.6.0/plugin/plugin_reference.html#manila-share-networks-context>`_
context with share-network autocreation support.
* Extend `volumes <http://rally.readthedocs.io/en/0.6.0/plugin/plugin_reference.html#volumes-context>`_
context to allow volume_type to be None to allow using default value
Bug fixes
~~~~~~~~~
* [existing users] Quota context does not restore original settings on exit
`Launchpad bug-report #1595578 <https://bugs.launchpad.net/rally/+bug/1595578>`_
* [keystone v3] Rally task's test user role setting failed
`Launchpad bug-report #1595081 <https://bugs.launchpad.net/rally/+bug/1595081>`_
* [existing users] context cannot fetch 'tenant' and 'user' details from cloud
deployment
`Launchpad bug-report #1602157 <https://bugs.launchpad.net/rally/+bug/1602157>`_
* UnboundLocalError: local variable 'cmd' referenced before assignment
`Launchpad bug-report #1587941 <https://bugs.launchpad.net/rally/+bug/1587941>`_
* [Reports] Fix trends report generation if there are n/a results
Documentation
~~~~~~~~~~~~~
* Add page about task reports
`RTD page for reports <http://rally.readthedocs.io/en/0.6.0/reports.html>`_
Thanks
~~~~~~
2 Everybody!

View File

@@ -1,135 +0,0 @@
============
Rally v0.7.0
============
Overview
--------
+------------------+-----------------------+
| Release date | **10/11/2016** |
+------------------+-----------------------+
Details
-------
Specs & Feature Requests
~~~~~~~~~~~~~~~~~~~~~~~~
* [Used] Ported all rally scenarios to class base
`Spec reference <https://github.com/openstack/rally/blob/0.7.0/doc/specs/implemented/class-based-scenarios.rst>`_
* `[Implemented] New Plugins Type - Hook <https://github.com/openstack/rally/blob/0.7.0/doc/specs/implemented/hook_plugins.rst>`_
Database
~~~~~~~~
.. warning:: Database schema is changed, you must run
`rally-manage db upgrade <http://rally.readthedocs.io/en/0.7.0/cli/cli_reference.html#rally-manage-db-upgrade>`_
to be able to use old Rally installation with latest release.
* [require migration] fix for wrong format of "verification_log" of tasks
* [require migration] remove admin_domain_name from OpenStack deployments
Rally Deployment
~~~~~~~~~~~~~~~~
* Remove admin_domain_name from openstack deployment
Reason: admin_domain_name parameter is absent in Keystone Credentials.
Rally Task
~~~~~~~~~~
* [Trends][Reports] Use timestamps on X axis in trends report
* [Reports] Add new OutputTextArea chart plugin
New chart plugin can show arbitrary textual data on
"Scenario Stata -> Per iteration" tab.
This finally allows to show non-numeric data like IP addresses, notes and
even long comments.
Plugin `Dummy.dummy_output <http://rally.readthedocs.io/en/0.7.0/plugin/plugin_reference.html#dummy-dummy-output-scenario>`_
is also updated to provide demonstration.
* [cli] Add version info to *rally task start* output
* [api] Allow to delete stopped tasks without force=True
It is reasonable to protect deletion of running tasks (statuses INIT,
VERIFYING, RUNNING, ABORTING and so on...) but it is strange to protect
deletion for stopped tasks (statuses FAILED and ABORTED). Also this is
annoying in CLI usage.
* Added hooks and triggers.
Hook is a new entity which can be launched on specific events. Trigger is
another new entity which processes events and launches hooks.
For example, hook can launch specific destructive action - just execute cli
command(we have sys_call hook for this task) and it can be launched by
simple trigger on specific iteration(s) or time (there is event trigger).
Rally Verify
~~~~~~~~~~~~
Scenario tests in Tempest require an image file. Logic of obtaining this image
is changed:
* If CONF.tempest.img_name_regex is set, Rally tries to find an image matching
to the regex in Glance and download it for the tests.
* If CONF.tempest.img_name_regex is not set (or Rally didn't find the image
matching to CONF.tempest.img_name_regex), Rally downloads the image by the
link specified in CONF.tempest.img_url.
Plugins
~~~~~~~
**Scenarios**:
* *Removed*: `Dummy.dummy_with_scenario_output <http://rally.readthedocs.io/en/0.6.0/plugin/plugin_reference.html#dummy-dummy-with-scenario-output-scenario>`_
It was deprecated in 0.5.0
.. warning:: This plugin is not available anymore in 0.7.0
* *NEW!!*:
- `MagnumClusterTemplates.list_cluster_templates <http://rally.readthedocs.io/en/0.7.0/plugin/plugin_reference.html#magnumclustertemplates-list-cluster-templates-scenario>`_
- `MagnumClusters.list_clusters <http://rally.readthedocs.io/en/0.7.0/plugin/plugin_reference.html#magnumclusters-list-clusters-scenario>`_
- `MagnumClusters.create_and_list_clusters <http://rally.readthedocs.io/en/0.7.0/plugin/plugin_reference.html#magnumclusters-create-and-list-clusters-scenario>`_
- `NovaAggregates.create_aggregate_add_and_remove_host <http://rally.readthedocs.io/en/0.7.0/plugin/plugin_reference.html#novaaggregates-create-aggregate-add-and-remove-host-scenario>`_
- `NovaAggregates.create_and_list_aggregates <http://rally.readthedocs.io/en/0.7.0/plugin/plugin_reference.html#novaaggregates-create-and-list-aggregates-scenario>`_
- `NovaAggregates.create_and_delete_aggregate <http://rally.readthedocs.io/en/0.7.0/plugin/plugin_reference.html#novaaggregates-create-and-delete-aggregate-scenario>`_
- `NovaAggregates.create_and_update_aggregate <http://rally.readthedocs.io/en/0.7.0/plugin/plugin_reference.html#novaaggregates-create-and-update-aggregate-scenario>`_
- `NovaFlavors.create_and_get_flavor <http://rally.readthedocs.io/en/0.7.0/plugin/plugin_reference.html#novaflavors-create-and-get-flavor-scenario>`_
- `NovaFlavors.create_flavor_and_set_keys <http://rally.readthedocs.io/en/0.7.0/plugin/plugin_reference.html#novaflavors-create-flavor-and-set-keys-scenario>`_
- `NovaHypervisors.list_and_get_hypervisors <http://rally.readthedocs.io/en/0.7.0/plugin/plugin_reference.html#novahypervisors-list-and-get-hypervisors-scenario>`_
- `NovaServers.boot_server_associate_and_dissociate_floating_ip <http://rally.readthedocs.io/en/0.7.0/plugin/plugin_reference.html#novaservers-boot-server-associate-and-dissociate-floating-ip-scenario>`_
- `KeystoneBasic.authenticate_user_and_validate_token <http://rally.readthedocs.io/en/0.7.0/plugin/plugin_reference.html#keystonebasic-authenticate-user-and-validate-token-scenario>`_
**Contexts**:
* *NEW!!*:
- `Manila manila_security_services <http://rally.readthedocs.io/en/0.7.0/plugin/plugin_reference.html#manila-security-services-context>`_
- `Magnum cluster_templates <http://rally.readthedocs.io/en/0.7.0/plugin/plugin_reference.html#cluster-templates-context>`_
- `Magnum clusters <http://rally.readthedocs.io/en/0.7.0/plugin/plugin_reference.html#clusters-context>`_
**OSClients**:
Port all openstack clients to use keystone session.
Bug fixes
~~~~~~~~~
* [tasks] rally task detailed incorrect / inconsistent output
`Launchpad bug-report #1562713 <https://bugs.launchpad.net/rally/+bug/1562713>`_
Thanks
~~~~~~
2 Everybody!

View File

@@ -1,232 +0,0 @@
============
Rally v0.8.0
============
Overview
--------
+------------------+-----------------------+
| Release date | **1/25/2017** |
+------------------+-----------------------+
Details
-------
Specs & Feature Requests
~~~~~~~~~~~~~~~~~~~~~~~~
* `[Implemented] Refactor Verification Component
<https://github.com/openstack/rally/blob/0.8.0/doc/specs/implemented/verification_refactoring.rst>`_
* `[Implemented] Scaling & Refactoring Rally DB
<https://github.com/openstack/rally/blob/0.8.0/doc/specs/implemented/db_refactoring.rst>`_
Installation
~~~~~~~~~~~~
We switched to use bindep library for checking required system packages.
All our dependencies moved to separate file (like requirements.txt for python
packages) `bindep.txt
<https://github.com/openstack/rally/blob/0.8.0/bindep.txt>`_.
Database
~~~~~~~~
.. warning:: Database schema is changed, you must run
`rally-manage db upgrade <http://rally.readthedocs.io/en/0.8.0/cli/cli_reference.html#rally-manage-db-upgrade>`_
to be able to use old Rally installation with latest release.
* change structure of database to be more flexible
* save raw task results in chunks (see raw_result_chunk_size option of
[DEFAULT] rally configuration section)
* add db revision check in rally API, so it is impossible to use rally with
wrong db now.
Rally API
~~~~~~~~~
Single entry point for Rally API is added - rally.api.API . Old API classes
(``rally.api.Task``, ``rally.api.Verification``, ``rally.api.Deployment``) are
deprecated now.
Rally CLI
~~~~~~~~~
* ``rally task sla_check`` is deprecated now in favor of
``rally task sla-check``
* Deprecated category ``rally show`` was removed.
* `rally plugin list` is extended with plugin base column
Task Component
~~~~~~~~~~~~~~
- [Random names] scenario for checking performance of generate_random_name
method is added to our CI with proper SLA. Be sure, whatever number of random
names you need, it will not affect performance of Rally at all, we checked.
- [atomic actions] scenario for checking performance of calculating atomic
actions is added to our CI with proper SLA. Be sure, whatever number atomics
you have in scenarios, it will not affect performance of Rally at all, we
checked.
- [services] new entity is introduced for helping to provide compatibility
layer between different API versions of one service.
Verification component
~~~~~~~~~~~~~~~~~~~~~~
We completely redesign the whole Verification component. For more details see
`our new docs for that component
<http://rally.readthedocs.io/en/0.8.0/verification/index.html>`_
Unfortunately, such big change could not be done in backward compatible way,
so old code is not compatible with new one. See `HowTo migrate from
Verification component 0.7.0 to 0.8.0
<http://rally.readthedocs.io/en/0.8.0/verification/howto/migrate_from_old_design.html>`_
Plugins
~~~~~~~
**Services**:
* Glance:
Switched from V1 to V2 API by default.
* Keystone:
- Transmit endpoint_type to keystoneclient
- Full keystone V3 support
**Scenarios**:
* *Updated*:
- The meaning of the volume_type argument is changes in
`CinderVolumes.create_snapshot_and_attach_volume
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#cindervolumes-create-snapshot-and-attach-volume-scenario>`_
scenario. It should contain actual volume type instead of boolean value to
choose random volume type.
- Extend `GlanceImages.create_image_and_boot_instances
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#glanceimages-create-image-and-boot-instances-scenario>`_
with create_image_kwargs and boot_server_kwargs arguments.
* *NEW!!*:
- `CeilometerAlarms.create_and_get_alarm
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#ceilometeralarms-create-and-get-alarm-scenario>`_
- `CinderVolumeBackups.create_incremental_volume_backup
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#cindervolumebackups-create-incremental-volume-backup-scenario>`_
- `CinderVolumeTypes.create_and_delete_volume_type
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#cindervolumetypes-create-and-delete-volume-type-scenario>`_
- `CinderVolumeTypes.create_volume_type_and_encryption_type
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#cindervolumetypes-create-volume-type-and-encryption-type-scenario>`_
- `CinderVolumes.create_and_accept_transfer
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#cindervolumes-create-and-accept-transfer-scenario>`_
- `CinderVolumes.create_and_get_volume
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#cindervolumes-create-and-get-volume-scenario>`_
- `CinderVolumes.create_volume_and_update_readonly_flag
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#cindervolumes-create-volume-and-update-readonly-flag-scenario>`_
- `CinderVolumes.list_transfers
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#cindervolumes-list-transfers-scenario>`_
- `CinderVolumes.list_types
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#cindervolumes-list-types-scenario>`_
- `KeystoneBasic.create_and_get_role
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#keystonebasic-create-and-get-role-scenario>`_
- `ManilaShares.create_and_list_share
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#manilashares-create-and-list-share-scenario>`_
- `ManilaShares.set_and_delete_metadata
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#manilashares-set-and-delete-metadata-scenario>`_
- `MistralExecutions.create_execution_from_workbook
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#mistralexecutions-create-execution-from-workbook-scenario>`_
- `MistralExecutions.list_executions
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#mistralexecutions-list-executions-scenario>`_
- `NeutronLoadbalancerV2.create_and_list_loadbalancers
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#neutronloadbalancerv2-create-and-list-loadbalancers-scenario>`_
- `NeutronNetworks.create_and_show_network
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#neutronnetworks-create-and-show-network-scenario>`_
- `NeutronNetworks.list_agents
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#neutronnetworks-list-agents-scenario>`_
- `NovaAggregates.create_aggregate_add_host_and_boot_server
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#novaaggregates-create-aggregate-add-host-and-boot-server-scenario>`_
- `NovaAggregates.create_and_get_aggregate_details
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#novaaggregates-create-and-get-aggregate-details-scenario>`_
- `NovaFlavors.create_and_delete_flavor
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#novaflavors-create-and-delete-flavor-scenario>`_
- `NovaFlavors.create_flavor_and_add_tenant_access
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#novaflavors-create-flavor-and-add-tenant-access-scenario>`_
- `NovaHosts.list_and_get_hosts
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#novahosts-list-and-get-hosts-scenario>`_
- `NovaHypervisors.list_and_get_uptime_hypervisors
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#novahypervisors-list-and-get-uptime-hypervisors-scenario>`_
- `NovaHypervisors.list_and_search_hypervisors
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#novahypervisors-list-and-search-hypervisors-scenario>`_
- `NovaHypervisors.statistics_hypervisors
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#novahypervisors-statistics-hypervisors-scenario>`_
- `NovaSecGroup.boot_server_and_add_secgroups
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#novasecgroup-boot-server-and-add-secgroups-scenario>`_
- `NovaServerGroups.create_and_list_server_groups
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#novaservergroups-create-and-list-server-groups-scenario>`_
- `Quotas.nova_get
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#quotas-nova-get-scenario>`_
**Hooks**:
* *NEW!!*:
- `fault_injection
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#fault-injection-hook>`_
**Runners**
* *Updated*:
- `RPS runner
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#rps-scenario-runner>`_
is extended with ability to increase 'rps' value by arithmetic progression
across certain duration. Now it can be also a dict specifying progression
parameters:
.. code-block:: json
rps": {
"start": 1,
"end": 10,
"step": 1,
"duration": 2
}
This will generate rps value: ``start, start + step, start + 2 * step, ..,
end`` across certain 'duration' seconds each step. If iteration count not
ended at the last step of progression, then rps will continue to generate
with "end" value. Note that the last rps could be generated smaller.
Fixed bugs
~~~~~~~~~~
* [hooks] incorrect encoding of stdout/stderr streams opened by sys_call hook
for py3
* [hooks] sorting Hook column at HTML report doesn't work
* [tasks][scenarios][neutron] L3 HA: Unable to complete operation on subnet
`Launchpad bug-report #1562878 <https://bugs.launchpad.net/rally/+bug/1562878>`_
* [tasks] JSON report doesn't save order of atomics
* [tasks][cleanup][nova] Failed to remove aggregate which has hosts in it
* [tasks] `--abort-on-sla-failure
<http://rally.readthedocs.io/en/0.8.0/cli_reference.html#task-start-abortonslafailure>`_
mechanism works only for current workload, but does not stop the next ones.
* [hooks] hooks section isn't displayed in HTML report
Thanks
~~~~~~
2 Everybody!

View File

@@ -1,40 +0,0 @@
============
Rally v0.8.1
============
Overview
--------
+------------------+-----------------------+
| Release date | **1/27/2017** |
+------------------+-----------------------+
Details
-------
Fix for python requirements list.
Plugins
~~~~~~~
**Scenarios**:
* *Updated*:
- Use new network for each subnet at
`NeutronNetworks.create_and_list_subnets
<http://rally.readthedocs.io/en/0.8.1/plugins/plugin_reference.html#neutronnetworks-create-and-list-subnets-scenario>`_
scenario.
* *NEW!!*:
- `CinderVolumeTypes.create_and_list_encryption_type
<http://rally.readthedocs.io/en/0.8.1/plugins/plugin_reference.html#cindervolumetypes-create-and-list-encryption-type-scenario>`_
- `Quotas.cinder_get
<http://rally.readthedocs.io/en/0.8.1/plugins/plugin_reference.html#quotas-cinder-get-scenario>`_
Thanks
~~~~~~
2 Everybody!

View File

@@ -1,163 +0,0 @@
============
Rally v0.9.0
============
Overview
--------
+------------------+-----------------------+
| Release date | **3/20/2017** |
+------------------+-----------------------+
Details
-------
Command Line Interface
~~~~~~~~~~~~~~~~~~~~~~
* `rally plugin list` now does not contain hidden plugins.
Task component
~~~~~~~~~~~~~~
* Added check for duplicated keys in task files.
* The order of subtasks (scenarios/workloads) is not ignored any more. You can
generate whatever you want load or use that feature for up the cloud (put
small scenario to the start of task to wake up the cloud before the real
load).
* Information about workload creation is added to HTML-reports.
* Task statuses is changed to be more clear and cover more cases:
- ``verifying`` is renamed to ``validating``.
- ``failed`` is divided for 2 statuses - ``validation_failed``, which means
that task did not pass validation step, and ``crashed``, which means that
something went wrong in rally engine.
* Our awesome cleanup become more awesome! The filter mechanism is improved to
discover resources in projects created only by Rally (it works for most of
resources, except several network-related ). It makes possible to run Rally
with existing users in real tenants without fear to remove something
important.
Verification component
~~~~~~~~~~~~~~~~~~~~~~
* Fixed an issue with missed tests while listing all supported tests of
specified verifier.
* Fixed an issue with displaying the wrong version of verifier in case of
cloning from the local directory.
* Extend `rally verify rerun
<http://rally.readthedocs.io/en/0.9.0/verification/cli_reference.html#rally-verify-rerun>`_
with ``--detailed``, ``--no-use``, ``--tag`` and ``--concurrency`` arguments.
* Add output examples for `JSON
<http://rally.readthedocs.io/en/0.9.0/verification/reports.html#json>`_ and
`JUnit-XML
<http://rally.readthedocs.io/en/0.9.0/verification/reports.html#junit-xml>`_
reporters.
Plugins
~~~~~~~
**Contexts**
* Extend cinder quotas to support ``backups`` and ``backup_gigabytes``.
**Deployment Engines**:
*Updated* Extend `DevstackEngine
<http://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#devstackengine-engine>`_
with ``enable_plugin`` option.
**OpenStack clients**:
* Extend support for auth urls like ``https://example.com:35357/foo/bar/v3``
* Pass endpoint type to heatclient
**Scenarios**:
* *NEW!!*
- `CinderVolumeTypes.create_and_delete_encryption_type
<http://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#cindervolumetypes-create-and-delete-encryption-type-scenario>`_
- `CinderVolumeTypes.create_and_set_volume_type_keys
<http://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#cindervolumetypes-create-and-set-volume-type-keys-scenario>`_
- `KeystoneBasic.create_and_list_roles
<http://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#keystonebasic-create-and-list-roles-scenario>`_
- `KeystoneBasic.create_and_update_user
<http://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#keystonebasic-create-and-update-user-scenario>`_
- `NovaKeypair.create_and_get_keypair
<http://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#novakeypair-create-and-get-keypair-scenario>`_
- `NovaServers.resize_shutoff_server
<http://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#novaservers-resize-shutoff-server-scenario>`_
- `VMTasks.dd_load_test
<http://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#vmtasks-dd-load-test-scenario>`_
* *UPDATED!!*
- Extend `VMTasks.boot_runcommand_delete
<http://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#vmtasks-boot-runcommand-delete-scenario>`_
to display just raw text output of executed command.
* *DELETED*
Scenario `VMTasks.boot_runcommand_delete_custom_image
<http://rally.readthedocs.io/en/0.8.0/plugins/plugin_reference.html#vmtasks-boot-runcommand-delete-custom-image-scenario>`_
is removed since `VMTasks.boot_runcommand_delete
<http://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#vmtasks-boot-runcommand-delete-scenario>`_
covers the case of that particular scenario without adding any complexity.
**Validators**:
* Extend ``required_contexts`` validator to support ``at least one of the``
logic.
* Fix a bunch of JSON schemas which are used for validation of all plugins.
Documentation
~~~~~~~~~~~~~
We totally reworked `Plugins Reference
<http://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html>`_ page.
Now it looks more like `Command Line Interface
<http://rally.readthedocs.io/en/0.9.0/cli_reference.html>`_, which means that
you can get links for particular parameter of particular plugin.
Also, you can find expected parameters and their types of all contexts, hooks,
SLAs and so on! Most of them still miss descriptions, but we are working on
adding them.
Fixed bugs
~~~~~~~~~~
* [osclients] Custom auth mechanism was used for zaqarclient instead of unified
keystonesession, which led to auth errors at some envs.
* [plugins] During running
`CinderVolumes.create_and_restore_volume_backup
<http://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#cindervolumes-create-and-restore-volume-backup-scenario>`_
scenario we had a race problem with backup deleting due to wrong check of
backup status.
* [plugins][verifications] Jenkins expexts "classname" JUnitXML attribute
instead of "class_name".
Thanks
~~~~~~
2 Everybody!

View File

@@ -1 +0,0 @@
archive/v0.9.0.rst

View File

@@ -1,177 +0,0 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/rally.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/rally.qhc"
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/rally"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/rally"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."

View File

@@ -1,3 +0,0 @@
.body img {
max-width: 100%;
}

View File

@@ -1,47 +0,0 @@
{% extends "openstack/layout.html" %}
{% set show_source = False %}
{% set css_files = css_files + ["_static/img.css"] %}
{# sidebarlogo is a top block in sidebar. Let's use it to display home link #}
{%- block sidebarlogo %}
<h3><a href="{{ pathto(master_doc) }}">What is Rally?</a></h3>
{%- endblock %}
{# Display global toc instead of local #}
{%- block sidebartoc %}
<h3>Contents</h3>
{{ toctree() }}
{%- endblock %}
{# Turn off sections "Previous topic" and "Next topic" #}
{%- block sidebarrel %}{% endblock %}
{% block projectsource %}
<h3>Contacts</h3>
<p class="topless" style="color: black">
<b>IRC</b> <br /><a href="ircs://irc.freenode.net:6697/#openstack-rally">#openstack-rally</a> channel at FreeNode<br />
<b>E-mail</b> <br /><a href="mailto:openstack-dev@lists.openstack.org?subject=[Rally]">openstack-dev@lists.openstack.org</a> with "[Rally]" tag in subject
</p>
<h3>Useful links</h3>
<ul>
<li><a href="{{ pathto(master_doc) }}">Documentation</a></li>
<li><a href="http://rally.readthedocs.org/en/latest/">Documentation at RTD</a></li>
<li><a href="http://git.openstack.org/cgit/openstack/rally">Source</a></li>
<li><a href="https://github.com/openstack/rally">GitHub mirror</a></li>
<li><a href="http://bugs.launchpad.net/rally">Bug tracker</a></li>
<li><a href="https://docs.google.com/a/mirantis.com/spreadsheets/d/16DXpfbqvlzMFaqaXAcJsBzzpowb_XpymaK2aFY2gA2g">RoadMap</a></li>
<li><a href="https://launchpad.net/rally">Launchpad page</a></li>
</ul>
{% endblock %}
{# copy-pasted from original theme and extended with Rally links #}
{%- block header_navigation %}
<li><a href="http://www.openstack.org/" title="Go to the Home page" class="link">Home</a></li>
<li><a href="http://www.openstack.org/projects/" title="Go to the Projects page">Projects</a></li>
<li><a href="http://www.openstack.org/user-stories/" title="Go to the User Stories page" class="link">User Stories</a></li>
<li><a href="http://www.openstack.org/community/" title="Go to the Community page" class="link">Community</a></li>
<li><a href="http://www.openstack.org/blog/" title="Go to the OpenStack Blog">Blog</a></li>
<li><a href="http://wiki.openstack.org/" title="Go to the OpenStack Wiki">Wiki</a></li>
<li><a href="{{ pathto(master_doc) }}" title="Go to Rally Documentation" class="current">Documentation</a></li>
{% endblock %}

View File

@@ -1,2 +0,0 @@
[theme]
inherit = openstack

View File

@@ -1,11 +0,0 @@
.. _cli-reference:
Command Line Interface
======================
.. contents::
:depth: 1
:local:
.. make_cli_reference::

View File

@@ -1,299 +0,0 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# Rally documentation build configuration file, created by
# sphinx-quickstart on Fri Jan 10 23:19:18 2014.
#
# This file is execfile() with the current directory set to its containing dir.
#
# Note that not all possible configuration values are present in this
# auto-generated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import datetime as dt
import os
import subprocess
import sys
import rally.common.version
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
# sys.path.extend([
# os.path.abspath("../.."),
# os.path.abspath("../"),
# os.path.abspath("./")
# ])
sys.path.insert(0, os.path.abspath("../../"))
sys.path.insert(0, os.path.abspath("../"))
sys.path.insert(0, os.path.abspath("./"))
# -- General configuration ----------------------------------------------------
on_rtd = os.environ.get("READTHEDOCS") == "True"
# If your documentation needs a minimal Sphinx version, state it here.
# needs_sphinx = "1.0"
# Add any Sphinx extension module names here, as strings.
# They can be extensions coming with Sphinx (named "sphinx.ext.*") or your
# custom ones.
extensions = [
"sphinx.ext.autodoc",
"sphinx.ext.doctest",
"sphinx.ext.todo",
"sphinx.ext.coverage",
"sphinx.ext.ifconfig",
"sphinx.ext.viewcode",
"ext.cli_reference",
"ext.plugin_reference",
"ext.include_vars"
]
todo_include_todos = True
# Add any paths that contain templates here, relative to this directory.
templates_path = ["_templates"]
# The suffix of source filenames.
source_suffix = ".rst"
# The encoding of source files.
# source_encoding = "utf-8-sig"
# The master toctree document.
master_doc = "index"
# General information about the project.
project = u"Rally"
copyright = u"%d, OpenStack Foundation" % dt.datetime.now().year
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = rally.common.version.version_string()
# The full version, including alpha/beta/rc tags.
release = rally.common.version.version_string()
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
# language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
# today = ""
# Else, today_fmt is used as the format for a strftime call.
# today_fmt = "%B %d, %Y"
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = [
"feature_request/README.rst",
"samples/README.rst",
"**/README.rst"
]
# The reST default role (used for this markup: `text`) to use for all documents
# default_role = None
# If true, "()" will be appended to :func: etc. cross-reference text.
add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
# show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = "sphinx"
# A list of ignored prefixes for module index sorting.
# modindex_common_prefix = []
# -- Options for HTML output --------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
if not on_rtd:
html_theme = "openstackrally"
else:
html_theme = "default"
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
# html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
if not on_rtd:
import oslosphinx
theme_dir = os.path.join(os.path.dirname(oslosphinx.__file__), "theme")
html_theme_path = [theme_dir, "_templates"]
else:
html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
# html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
# html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
# html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
# html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
if not on_rtd:
html_static_path = ["_templates/openstackrally/_static"]
else:
html_static_path = []
# If not "", a "Last updated on:" timestamp is inserted at every page bottom,
# using the given strftime format.
git_cmd = [
"git", "log", "--pretty=format:'%ad, commit %h'", "--date=local", "-n1"]
html_last_updated_fmt = subprocess.check_output(git_cmd).decode("utf-8")
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
html_use_smartypants = False
# Custom sidebar templates, maps document names to template names.
html_sidebars = {"**": ["searchbox.html", "globaltoc.html"]}
# Additional templates that should be rendered to pages, maps page names to
# template names.
# html_additional_pages = {}
# If false, no module index is generated.
# html_domain_indices = True
# If false, no index is generated.
# html_use_index = True
# If true, the index is split into individual pages for each letter.
# html_split_index = False
# If true, links to the reST sources are added to the pages.
# html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
# html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
# html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
# html_use_opensearch = ""
# This is the file name suffix for HTML files (e.g. ".xhtml").
# html_file_suffix = None
# Output file base name for HTML help builder.
htmlhelp_basename = "%sdoc" % project
# -- Options for LaTeX output -------------------------------------------------
latex_elements = {
# The paper size ("letterpaper" or "a4paper").
# "papersize": "letterpaper",
# The font size ("10pt", "11pt" or "12pt").
# "pointsize": "10pt",
# Additional stuff for the LaTeX preamble.
# "preamble": "",
}
# 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"),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
# latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
# latex_use_parts = False
# If true, show page references after internal links.
# latex_show_pagerefs = False
# If true, show URL addresses after external links.
# latex_show_urls = False
# Documents to append as an appendix to all manuals.
# latex_appendices = []
# If false, no module index is generated.
# latex_domain_indices = True
# -- Options for manual page output -------------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
# man_pages = [
# ("index", "rally", u"Rally Documentation",
# [u"Rally Team"], 1)
# ]
# If true, show URL addresses after external links.
# man_show_urls = False
# -- Options for Texinfo output -----------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
("index", "Rally", u"Rally Documentation",
u"Rally Team", "Rally",
"Testing framework and tool for all kinds of tests",
"Development"),
]
# Documents to append as an appendix to all manuals.
# texinfo_appendices = []
# If false, no module index is generated.
# texinfo_domain_indices = True
# How to display URL addresses: "footnote", "no", or "inline".
# texinfo_show_urls = "footnote"

View File

@@ -1,261 +0,0 @@
..
Copyright 2015 Mirantis 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.
.. _contribute:
Contribute to Rally
===================
Where to begin
--------------
Please take a look `our Roadmap`_ to get information about our current work
directions.
In case you have questions or want to share your ideas, be sure to contact us
either at `Rally-dev/Lobby`_ channel on **Gitter** messenger (or, less
preferably, at the ``#openstack-rally`` IRC channel on **irc.freenode.net**).
If you are going to contribute to Rally, you will probably need to grasp a
better understanding of several main design concepts used throughout our
project (such as **benchmark scenarios**, **contexts** etc.). To do so, please
read :ref:`this article <main_concepts>`.
How to contribute
-----------------
1. You need a `Launchpad`_ account and need to be joined to the
`OpenStack team`_. You can also join the `Rally team`_ if you want to. Make
sure Launchpad has your SSH key, Gerrit (the code review system) uses this.
2. Sign the CLA as outlined in the `account setup`_ section of the developer
guide.
3. Tell git your details:
.. code-block:: bash
git config --global user.name "Firstname Lastname"
git config --global user.email "your_email@youremail.com"
4. Install git-review. This tool takes a lot of the pain out of remembering
commands to push code up to Gerrit for review and to pull it back down to edit
it. It is installed using:
.. code-block:: bash
pip install git-review
Several Linux distributions (notably Fedora 16 and Ubuntu 12.04) are also
starting to include git-review in their repositories so it can also be
installed using the standard package manager.
5. Grab the Rally repository:
.. code-block:: bash
git clone git@github.com:openstack/rally.git
6. Checkout a new branch to hack on:
.. code-block:: bash
git checkout -b TOPIC-BRANCH
7. Start coding
8. Run the test suite locally to make sure nothing broke, e.g. (this will run
py34/py27/pep8 tests):
.. code-block:: bash
tox
**(NOTE: you should have installed tox<=1.6.1)**
If you extend Rally with new functionality, make sure you have also provided
unit and/or functional tests for it.
9. Commit your work using:
.. code-block:: bash
git commit -a
Make sure you have supplied your commit with a neat commit message, containing
a link to the corresponding blueprint / bug, if appropriate.
10. Push the commit up for code review using:
.. code-block:: bash
git review -R
That is the awesome tool we installed earlier that does a lot of hard work for
you.
11. Watch your email or `review site`_, it will automatically send your code
for a battery of tests on our `Jenkins setup`_ and the core team for the
project will review your code. If there are any changes that should be made
they will let you know.
12. When all is good the review site will automatically merge your code.
(This tutorial is based on:
http://www.linuxjedi.co.uk/2012/03/real-way-to-start-hacking-on-openstack.html)
Testing
-------
Please, don't hesitate to write tests ;)
Unit tests
^^^^^^^^^^
*Files: /tests/unit/**
The goal of unit tests is to ensure that internal parts of the code work
properly. All internal methods should be fully covered by unit tests with a
reasonable mocks usage.
About Rally unit tests:
- All `unit tests`_ are located inside /tests/unit/*
- Tests are written on top of: *testtools* and *mock* libs
- `Tox`_ is used to run unit tests
To run unit tests locally:
.. code-block:: console
$ pip install tox
$ tox
To run py34, py27 or pep8 only:
.. code-block:: console
$ tox -e <name>
#NOTE: <name> is one of py34, py27 or pep8
To run a single unit test e.g. test_deployment
.. code-block:: console
$ tox -e <name> -- <test_name>
#NOTE: <name> is one of py34, py27 or pep8
# <test_name> is the unit test case name, e.g tests.unit.test_osclients
To debug issues on the unit test:
- Add breakpoints on the test file using ``import pdb;`` ``pdb.set_trace()``
- Then run tox in debug mode:
.. code-block:: console
$ tox -e debug <test_name>
#NOTE: use python 2.7
#NOTE: <test_name> is the unit test case name
or
.. code-block:: console
$ tox -e debug34 <test_name>
#NOTE: use python 3.4
#NOTE: <test_name> is the unit test case name
To get test coverage:
.. code-block:: console
$ tox -e cover
#NOTE: Results will be in /cover/index.html
To generate docs:
.. code-block:: console
$ tox -e docs
#NOTE: Documentation will be in doc/source/_build/html/index.html
Functional tests
^^^^^^^^^^^^^^^^
*Files: /tests/functional/**
The goal of `functional tests`_ is to check that everything works well
together. Functional tests use Rally API only and check responses without
touching internal parts.
To run functional tests locally:
.. code-block:: console
$ source openrc
$ rally deployment create --fromenv --name testing
$ tox -e cli
#NOTE: openrc file with OpenStack admin credentials
Output of every Rally execution will be collected under some reports root in
directory structure like: reports_root/ClassName/MethodName_suffix.extension
This functionality implemented in tests.functional.utils.Rally.__call__ method.
Use 'gen_report_path' method of 'Rally' class to get automatically generated
file path and name if you need. You can use it to publish html reports,
generated during tests. Reports root can be passed throw environment variable
'REPORTS_ROOT'. Default is 'rally-cli-output-files'.
Rally CI scripts
^^^^^^^^^^^^^^^^
*Files: /tests/ci/**
This directory contains scripts and files related to the Rally CI system.
Rally Style Commandments
^^^^^^^^^^^^^^^^^^^^^^^^
*Files: /tests/hacking/*
This module contains Rally specific hacking rules for checking commandments.
For more information about Style Commandments, read the
`OpenStack Style Commandments manual`_.
.. references:
.. _our Roadmap: https://docs.google.com/a/mirantis.com/spreadsheets/d/16DXpfbqvlzMFaqaXAcJsBzzpowb_XpymaK2aFY2gA2g/edit#gid=0
.. _Rally-dev/Lobby: https://gitter.im/rally-dev/Lobby
.. _Launchpad: https://launchpad.net/
.. _OpenStack team: https://launchpad.net/openstack
.. _Rally team: https://launchpad.net/rally
.. _account setup: http://docs.openstack.org/infra/manual/developers.html#development-workflow
.. _review site: http://review.openstack.org/
.. _Jenkins setup: http://jenkins.openstack.org/
.. _unit tests: http://en.wikipedia.org/wiki/Unit_testing
.. _Tox: https://tox.readthedocs.org/en/latest/
.. _functional tests: https://en.wikipedia.org/wiki/Functional_testing
.. _OpenStack Style Commandments manual: https://docs.openstack.org/hacking/latest/

View File

@@ -1 +0,0 @@
../feature_request/

View File

@@ -1,34 +0,0 @@
..
Copyright 2015 Mirantis 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.
.. _feature_requests:
Request New Features
====================
To request a new feature, you should create a document similar to other feature
requests and then contribute it to the **doc/feature_request** directory of the
Rally repository (see the :ref:`How-to-contribute tutorial <contribute>`).
If you don't have time to contribute your feature request via Gerrit, please
contact Boris Pavlovic (boris@pavlovic.me)
Active feature requests:
.. toctree::
:glob:
:maxdepth: 1
feature_request/*

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Some files were not shown because too many files have changed in this diff Show More