Propose release notes for Rally 0.10.0
Change-Id: Idd1a72f17756f275ba453959b35fadf6d650fe55
This commit is contained in:
parent
04382bc6c9
commit
e97e312fc7
520
doc/release_notes/archive/v0.10.0.rst
Normal file
520
doc/release_notes/archive/v0.10.0.rst
Normal file
@ -0,0 +1,520 @@
|
||||
=============
|
||||
Rally v0.10.0
|
||||
=============
|
||||
|
||||
Overview
|
||||
--------
|
||||
|
||||
+------------------+-----------------------+
|
||||
| Release date | **10/20/2017** |
|
||||
+------------------+-----------------------+
|
||||
|
||||
* Ability to use OpenStack deployments without admin credentials
|
||||
* Better validation process of tasks
|
||||
* New task format (with an ability to set description for workloads)
|
||||
* New JSON report
|
||||
* ElasticSearch exporter
|
||||
* `OSProfiler support
|
||||
<https://rally.readthedocs.io/en/0.10.0/quick_start/tutorial/step_11_profiling_openstack_internals.html>`_
|
||||
* Restructure of configuration options.
|
||||
|
||||
Details
|
||||
-------
|
||||
|
||||
Command Line Interface
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Introduce `rally task import
|
||||
<https://rally.readthedocs.io/en/0.10.0/cli_reference.html#rally-task-import>`_
|
||||
command for importing task results into database.
|
||||
|
||||
* Extend tags support for tasks. Now you can specify several tags for a single
|
||||
task using `--tag argument
|
||||
<https://rally.readthedocs.io/en/0.10.0/cli_reference.html#task-start-tag>`_.
|
||||
Also filtering tasks by tags is now available.
|
||||
|
||||
* Move DB category from ``rally-manage db`` to `rally db
|
||||
<https://rally.readthedocs.io/en/0.10.0/cli_reference.html#category-db>`_ and
|
||||
introduce `rally db show
|
||||
<https://rally.readthedocs.io/en/0.10.0/cli_reference.html#rally-db-show>`_
|
||||
command for printing the used connection string.
|
||||
|
||||
Deployments
|
||||
~~~~~~~~~~~
|
||||
|
||||
This release we started a huge work related to simplification of deployment
|
||||
component of Rally. There is a good progress which includes several nice
|
||||
features:
|
||||
|
||||
* The format.
|
||||
"ExistingCloud" deployment type covers 99.99% cases and is used as a base for
|
||||
all new things. Also, it will be extended to support different platforms
|
||||
soon. The new format looks like (for OpenStack case):
|
||||
|
||||
.. code-block:: json
|
||||
|
||||
{
|
||||
"openstack": {
|
||||
"admin": {
|
||||
"username": "admin",
|
||||
"password": "changeme",
|
||||
"tenant_name": "foo",
|
||||
},
|
||||
"auth_url": "https://example.com",
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
* admin user is optional in case of setting existing users.
|
||||
From the beginning, setting admin credentials was a required section of Rally
|
||||
deployment configuration. Even with introducing existing users feature, this
|
||||
behaviour left.
|
||||
Finally, we finished a big code refactoring and admin credential become
|
||||
optional section. If a set of plugins for particular workload doesn't require
|
||||
admin user, you can launch this task at deployment without setting it.
|
||||
|
||||
The information about the requirements of plugins you can find at
|
||||
`Plugins Reference page
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html>`_ (see
|
||||
``Requires platform(s):`` section at the bottom of each plugin).
|
||||
|
||||
* Originally, Rally project was designed to check performance of OpenStack and
|
||||
we succeeded in building awesome tool. We do not plan to stop and just want
|
||||
to inform about our future plans to expand a number of supported platforms.
|
||||
Subscribe to our `GitHub organization
|
||||
<https://github.com/xrally>`_ to not miss new plugins.
|
||||
|
||||
Task component
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
* The new task format is introduced. It includes a bunch of improvements,
|
||||
unification, etc. All the docs and samples will be updated soon.
|
||||
|
||||
As for now, you can check `a spec
|
||||
<https://github.com/openstack/rally/blob/0.10.0/doc/specs/implemented/new_rally_input_task_format.rst>`_
|
||||
for this big change.
|
||||
|
||||
* SLA failure_rate max=0 become a default if nothing else is specified.
|
||||
|
||||
* Totally reworked atomic actions. The atomic actions now supports nested
|
||||
actions which allows to measure durations inside the scenario even more
|
||||
precise. You can find them in HTML report or in our new json report
|
||||
(see ``rally task report --json``).
|
||||
|
||||
* Generation of names for new resources takes care about particular workload
|
||||
id, so it helps to provide a better cleanup and prepare for new feature -
|
||||
disaster cleanup.
|
||||
|
||||
Plugins
|
||||
~~~~~~~
|
||||
|
||||
We started supporting discovering plugins by entry-points, so you can easily
|
||||
deliver your custom plugins as a simple python package.
|
||||
|
||||
To make you package after-discoverable, you need to specify the proper
|
||||
entry-point at your setup.cfg file:
|
||||
|
||||
.. code-block::
|
||||
|
||||
rally_plugins =
|
||||
path=package_name
|
||||
|
||||
**Deployment Engines**:
|
||||
|
||||
Remove serverproviders & rarely used deployers
|
||||
|
||||
Unfortunately, seems like nobody is using deployers for deploying
|
||||
their clouds and mostly people would like just to execute their code.
|
||||
|
||||
1) Remove server provides
|
||||
2) Remove engines that uses server providers
|
||||
|
||||
**OpenStack clients**:
|
||||
|
||||
* Deprecate EC2 client. It wasn't used in any of plugins and doesn't support
|
||||
keystone v3
|
||||
|
||||
* Move ``rally.osclients`` module to ``rally.plugins.openstack.oscliens``
|
||||
|
||||
**Scenarios**:
|
||||
|
||||
The old way to describe scenario plugin via method is finally removed.
|
||||
Initially Rally scenario plugins were methods of special class, like below:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from rally.task import scenario
|
||||
|
||||
class SomeBasicClass(scenario.Scenario):
|
||||
|
||||
@scenario.configure()
|
||||
def some_scenario(self, arg1):
|
||||
"""An implementation of SomeBasicClass.foo scenario."""
|
||||
|
||||
@scenario.configure()
|
||||
def another_scenario(self):
|
||||
"""Implementation of another scenario, SomeBasicClass.bar."""
|
||||
|
||||
However to unify scenarios with other plugins we moved to model where
|
||||
plugin is class. It was done long time ago.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from rally.task import scenario
|
||||
|
||||
@scenario.configure(name="CustomName")
|
||||
class Some(scenario.Scenario):
|
||||
|
||||
def run(self, arg1):
|
||||
"""An implementation of the scenario."""
|
||||
|
||||
We had a bunch of code that was used for transition and backward compatibility
|
||||
that we finally removed.
|
||||
|
||||
|
||||
* *NEW!!*
|
||||
|
||||
- `CinderQos.create_and_get_qos
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#cinderqos-create-and-get-qos-scenario>`_
|
||||
|
||||
- `CinderQos.create_and_list_qos
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#cinderqos-create-and-list-qos-scenario>`_
|
||||
|
||||
- `CinderQos.create_and_set_qos
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#cinderqos-create-and-set-qos-scenario>`_
|
||||
|
||||
- `CinderQos.create_qos_associate_and_disassociate_type
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#cinderqos-create-qos-associate-and-disassociate-type-scenario>`_
|
||||
|
||||
- `CinderVolumeTypes.create_and_get_volume_type
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#cindervolumetypes-create-and-get-volume-type-scenario>`_
|
||||
|
||||
- `CinderVolumeTypes.create_and_list_volume_types
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#cindervolumetypes-create-and-list-volume-types-scenario>`_
|
||||
|
||||
- `CinderVolumeTypes.create_and_update_encryption_type
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#cindervolumetypes-create-and-update-encryption-type-scenario>`_
|
||||
|
||||
- `CinderVolumeTypes.create_and_update_volume_type
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#cindervolumetypes-create-and-update-volume-type-scenario>`_
|
||||
|
||||
- `CinderVolumeTypes.create_get_and_delete_encryption_type
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#cindervolumetypes-create-get-and-delete-encryption-type-scenario>`_
|
||||
|
||||
- `CinderVolumeTypes.create_volume_type_add_and_list_type_access
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#cindervolumetypes-create-volume-type-add-and-list-type-access-scenario>`_
|
||||
|
||||
- `Dummy.openstack
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#dummy-openstack-scenario>`_
|
||||
|
||||
- `GlanceImages.create_and_deactivate_image
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#glanceimages-create-and-deactivate-image-scenario>`_
|
||||
|
||||
- `GlanceImages.create_and_download_image
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#glanceimages-create-and-download-image-scenario>`_
|
||||
|
||||
- `GlanceImages.create_and_get_image
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#glanceimages-create-and-get-image-scenario>`_
|
||||
|
||||
- `GlanceImages.create_and_update_image
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#glanceimages-create-and-update-image-scenario>`_
|
||||
|
||||
- `K8sPods.create_pods
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#k8spods-create-pods-scenario>`_
|
||||
|
||||
- `K8sPods.create_rcs
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#k8spods-create-rcs-scenario>`_
|
||||
|
||||
- `K8sPods.list_pods
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#k8spods-list-pods-scenario>`_
|
||||
|
||||
- `ManilaShares.create_and_extend_share
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#manilashares-create-and-extend-share-scenario>`_
|
||||
|
||||
- `ManilaShares.create_and_shrink_share
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#manilashares-create-and-shrink-share-scenario>`_
|
||||
|
||||
- `ManilaShares.create_share_then_allow_and_deny_access
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#manilashares-create-share-then-allow-and-deny-access-scenario>`_
|
||||
|
||||
- `NeutronBGPVPN.create_and_delete_bgpvpns
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#neutronbgpvpn-create-and-delete-bgpvpns-scenario>`_
|
||||
|
||||
- `NeutronBGPVPN.create_and_list_bgpvpns
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#neutronbgpvpn-create-and-list-bgpvpns-scenario>`_
|
||||
|
||||
- `NeutronBGPVPN.create_and_list_networks_associations
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#neutronbgpvpn-create-and-list-networks-associations-scenario>`_
|
||||
|
||||
- `NeutronBGPVPN.create_and_list_routers_associations
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#neutronbgpvpn-create-and-list-routers-associations-scenario>`_
|
||||
|
||||
- `NeutronBGPVPN.create_and_update_bgpvpns
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#neutronbgpvpn-create-and-update-bgpvpns-scenario>`_
|
||||
|
||||
- `NeutronBGPVPN.create_bgpvpn_assoc_disassoc_networks
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#neutronbgpvpn-create-bgpvpn-assoc-disassoc-networks-scenario>`_
|
||||
|
||||
- `NeutronBGPVPN.create_bgpvpn_assoc_disassoc_routers
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#neutronbgpvpn-create-bgpvpn-assoc-disassoc-routers-scenario>`_
|
||||
|
||||
- `NeutronNetworks.create_and_show_ports
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#neutronnetworks-create-and-show-ports-scenario>`_
|
||||
|
||||
- `NeutronNetworks.create_and_show_routers
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#neutronnetworks-create-and-show-routers-scenario>`_
|
||||
|
||||
- `NeutronNetworks.create_and_show_subnets
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#neutronnetworks-create-and-show-subnets-scenario>`_
|
||||
|
||||
- `NeutronNetworks.set_and_clear_router_gateway
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#neutronnetworks-set-and-clear-router-gateway-scenario>`_
|
||||
|
||||
- `NeutronSecurityGroup.create_and_delete_security_group_rule
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#neutronsecuritygroup-create-and-delete-security-group-rule-scenario>`_
|
||||
|
||||
- `NeutronSecurityGroup.create_and_list_security_group_rules
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#neutronsecuritygroup-create-and-list-security-group-rules-scenario>`_
|
||||
|
||||
- `NeutronSecurityGroup.create_and_show_security_group
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#neutronsecuritygroup-create-and-show-security-group-scenario>`_
|
||||
|
||||
- `NeutronSecurityGroup.create_and_show_security_group_rule
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#neutronsecuritygroup-create-and-show-security-group-rule-scenario>`_
|
||||
|
||||
- `NovaServerGroups.create_and_delete_server_group
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#novaservergroups-create-and-delete-server-group-scenario>`_
|
||||
|
||||
- `NovaServerGroups.create_and_get_server_group
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#novaservergroups-create-and-get-server-group-scenario>`_
|
||||
|
||||
- `NovaServers.boot_and_get_console_url
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#novaservers-boot-and-get-console-url-scenario>`_
|
||||
|
||||
- `NovaServers.boot_server_and_attach_interface
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#novaservers-boot-server-and-attach-interface-scenario>`_
|
||||
|
||||
- `NovaServers.boot_server_and_list_interfaces
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#novaservers-boot-server-and-list-interfaces-scenario>`_
|
||||
|
||||
- `NovaServers.boot_server_attach_volume_and_list_attachments
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#novaservers-boot-server-attach-volume-and-list-attachments-scenario>`_
|
||||
|
||||
* *UPDATED!!*
|
||||
|
||||
- The new argument ``properties`` is added to scenario
|
||||
`IronicNodes.create_and_list_node
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#ironicnodes-create-and-list-node-scenario>`_
|
||||
|
||||
|
||||
* *DELETED*
|
||||
|
||||
Fuel and Nova-Network are not alive any more. So we removed those scenarios.
|
||||
If any of those scenarios a critical for you, please contact us.
|
||||
|
||||
- `FuelEnvironments.create_and_delete_environment
|
||||
<https://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#fuelenvironments-create-and-delete-environment-scenario>`_
|
||||
|
||||
- `FuelEnvironments.create_and_list_environments
|
||||
<https://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#fuelenvironments-create-and-list-environments-scenario>`_
|
||||
|
||||
- `FuelNodes.add_and_remove_node
|
||||
<https://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#fuelnodes-add-and-remove-node-scenario>`_
|
||||
|
||||
- `NovaFloatingIpsBulk.create_and_delete_floating_ips_bulk
|
||||
<https://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#novafloatingipsbulk-create-and-delete-floating-ips-bulk-scenario>`_
|
||||
|
||||
- `NovaFloatingIpsBulk.create_and_list_floating_ips_bulk
|
||||
<https://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#novafloatingipsbulk-create-and-list-floating-ips-bulk-scenario>`_
|
||||
|
||||
- `NovaNetworks.create_and_delete_network
|
||||
<https://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#novanetworks-create-and-delete-network-scenario>`_
|
||||
|
||||
- `NovaNetworks.create_and_list_networks
|
||||
<https://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#novanetworks-create-and-list-networks-scenario>`_
|
||||
|
||||
- `NovaSecGroup.boot_and_delete_server_with_secgroups
|
||||
<https://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#novasecgroup-boot-and-delete-server-with-secgroups-scenario>`_
|
||||
|
||||
- `NovaSecGroup.boot_server_and_add_secgroups
|
||||
<https://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#novasecgroup-boot-server-and-add-secgroups-scenario>`_
|
||||
|
||||
- `NovaSecGroup.create_and_delete_secgroups
|
||||
<https://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#novasecgroup-create-and-delete-secgroups-scenario>`_
|
||||
|
||||
- `NovaSecGroup.create_and_list_secgroups
|
||||
<https://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#novasecgroup-create-and-list-secgroups-scenario>`_
|
||||
|
||||
- `NovaSecGroup.create_and_update_secgroups
|
||||
<https://rally.readthedocs.io/en/0.9.0/plugins/plugin_reference.html#novasecgroup-create-and-update-secgroups-scenario>`_
|
||||
|
||||
**Validators**:
|
||||
|
||||
The validators refactoring was a long-term task which blocked us to abandon
|
||||
alignment to only OpenStack platform and requirements of setting admin
|
||||
credentials. In this release, we made a great progress and fixed a lot of
|
||||
issues and blockers which made possible to refactor validators.
|
||||
Now validation step is equal for all types of plugins (Scenario, SLA, Context,
|
||||
Hooks, Runners, etc).
|
||||
|
||||
The old way to add validator for scenario is deprecated. The new unified way
|
||||
looks like:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import time
|
||||
|
||||
from rally.common import validation
|
||||
from rally.task import scenario
|
||||
|
||||
@validation.add("number", param_name="timeout", minval=0)
|
||||
@scenario.configure(name="Foo.bar")
|
||||
class FooScenario(scenario.Scenario):
|
||||
def run(self, timeout):
|
||||
time.sleep()
|
||||
|
||||
The old validators from ``rally.task.validators`` module is deprecated too, see
|
||||
equivalents which can be used with ``add`` decorator:
|
||||
|
||||
- required_openstack --> `required_platform
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#required-platform-validator>`_
|
||||
with setting platform argument to "openstack"
|
||||
|
||||
- external_network_exists ->`external_network_exists
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#external-network-exists-validator>`_
|
||||
|
||||
- file_exists ->`file_exists
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#file-exists-validator>`_
|
||||
|
||||
- flavor_exists ->`flavor_exists
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#flavor-exists-validator>`_
|
||||
|
||||
- image_exists ->`image_exists
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#image-exists-validator>`_
|
||||
|
||||
- image_valid_on_flavor ->`image_valid_on_flavor
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#image-valid-on-flavor-validator>`_
|
||||
|
||||
- number ->`number
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#number-validator>`_
|
||||
|
||||
- required_api_versions ->`required_api_versions
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#required-api-versions-validator>`_
|
||||
|
||||
- required_cinder_services ->`required_cinder_services
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#required-cinder-services-validator>`_
|
||||
|
||||
- required_clients ->`required_clients
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#required-clients-validator>`_
|
||||
|
||||
- required_contexts ->`required_contexts
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#required-contexts-validator>`_
|
||||
|
||||
- required_neutron_extensions ->`required_neutron_extensions
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#required-neutron-extensions-validator>`_
|
||||
|
||||
- required_param_or_context ->`required_param_or_context
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#required-param-or-context-validator>`_
|
||||
|
||||
- required_services ->`required_services
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#required-services-validator>`_
|
||||
|
||||
- restricted_parameters ->`restricted_parameters
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#restricted-parameters-validator>`_
|
||||
|
||||
- validate_heat_template ->`validate_heat_template
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#validate-heat-template-validator>`_
|
||||
|
||||
- volume_type_exists ->`volume_type_exists
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#volume-type-exists-validator>`_
|
||||
|
||||
- workbook_contains_workflow -> `workbook_contains_workflow
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#workbook-contains-workflow-validator>`_
|
||||
|
||||
- network_exists is removed, since we do not find any customers for it.
|
||||
Please contact us if it was useful for you.
|
||||
|
||||
- validate_share_proto is removed in favor of enum validator
|
||||
|
||||
Fixed bugs
|
||||
~~~~~~~~~~
|
||||
|
||||
* [plugins] JSON schema of `servers
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#servers-context>`_
|
||||
context allows to transmit a list of nics in two formats. First one is a
|
||||
format that novaclient expects to see (each network should be represented
|
||||
like ``{"nic-id": "the id of the network"}``). The second one is more
|
||||
user-friendly - just list of strings (each network should be represented
|
||||
just by id of the network). Unfortunately, the second case was not covered
|
||||
by our code base.
|
||||
|
||||
Also, the first described format works in limited cases due to bad
|
||||
serialization.
|
||||
|
||||
`Launchpad bug-report #1695245
|
||||
<https://bugs.launchpad.net/rally/+bug/1695245>`_
|
||||
|
||||
* [deployment] ~/rally/.openrc not working for keystone v3
|
||||
|
||||
`Launchpad bug-report #1683820
|
||||
<https://bugs.launchpad.net/rally/+bug/1683820>`_
|
||||
|
||||
* [plugins] Failed to list volumes in case of missed name in the object.
|
||||
|
||||
* [backported into 0.9.1][deployment] Credentials is not updated as soon as
|
||||
deployment is recreated. Need to call recreate request twice.
|
||||
|
||||
`Launchpad bug-report #1675271
|
||||
<https://bugs.launchpad.net/rally/+bug/1675271>`_
|
||||
|
||||
* [backported into 0.9.1][plugins] Scenario `IronicNodes.create_and_list_node
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#ironicnodes-create-and-list-node-scenario>`_
|
||||
had a wrong check that list of all nodes contains newly created one.
|
||||
|
||||
* [backported into 0.9.1][task][cleanup] Do not remove quotas in case of
|
||||
existing users
|
||||
|
||||
* [backported into 0.9.1][task][cleanup] Various traces of neutron resources
|
||||
|
||||
* [backported into 0.9.1][core] Keystone v3, authentication error for Rally
|
||||
users if the value of project_domain_name of admin user isn't equal "default"
|
||||
|
||||
`Launchpad bug-report #1680837
|
||||
<https://bugs.launchpad.net/rally/+bug/1680837>`_
|
||||
|
||||
* [backported into 0.9.1][task] Scenario `NovaHosts.list_and_get_hosts
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#novahosts-list-and-get-hosts-scenario>`_
|
||||
obtains hostname for all hosts. But it fails in some environments if host is
|
||||
not compute.
|
||||
|
||||
`Launchpad bug-report #1675254
|
||||
<https://bugs.launchpad.net/rally/+bug/1675254>`_
|
||||
|
||||
* [backported into 0.9.1][verification] Rally fails to run on systems on which
|
||||
python-virtualenv is not installed
|
||||
|
||||
`Launchpad bug-report #1678047
|
||||
<https://bugs.launchpad.net/rally/+bug/1678047>`_
|
||||
|
||||
* [backported into 0.9.1][verification] CLI `rally verify rerun
|
||||
<https://rally.readthedocs.io/en/0.9.1/verification/cli_reference.html#rally-verify-rerun>`_
|
||||
fails with TypeError due to wrong integration with Rally API.
|
||||
|
||||
* [plugins] Rally fails while creating neutron router on the clouds where
|
||||
ext-gw-mode extension is not installed.
|
||||
|
||||
* [plugins] Scenario `CinderVolumes.create_nested_snapshots_and_attach_volume
|
||||
<https://rally.readthedocs.io/en/0.10.0/plugins/plugin_reference.html#cindervolumes-create-nested-snapshots-and-attach-volume-scenario>`_
|
||||
fails on a big load due to the fact that one server is used for several
|
||||
iterations. In such case we are facing 2 issues: the maximum number of
|
||||
volumes per VM is 26 (which is a number of available names for volumes);
|
||||
detaching volume of one iteration can block attaching of other iterations.
|
||||
|
||||
`Launchpad bug-report #1708160
|
||||
<https://bugs.launchpad.net/rally/+bug/1708160>`_
|
||||
|
||||
|
||||
Thanks
|
||||
~~~~~~
|
||||
|
||||
2 Everybody!
|
@ -1 +1 @@
|
||||
./archive/v0.9.2.rst
|
||||
./archive/v0.10.0.rst
|
157
doc/specs/implemented/improve_atomic_actions_format.rst
Normal file
157
doc/specs/implemented/improve_atomic_actions_format.rst
Normal file
@ -0,0 +1,157 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
..
|
||||
This template should be in ReSTructured text. The filename in the git
|
||||
repository should match the launchpad URL, for example a URL of
|
||||
https://blueprints.launchpad.net/heat/+spec/awesome-thing should be named
|
||||
awesome-thing.rst . Please do not delete any of the sections in this
|
||||
template. If you have nothing to say for a whole section, just write: None
|
||||
For help with syntax, see http://sphinx-doc.org/rest.html
|
||||
To test out your formatting, see http://www.tele3.cz/jbar/rest/rest.html
|
||||
|
||||
|
||||
=============================================
|
||||
New Atomic actions format in workload results
|
||||
=============================================
|
||||
|
||||
Currently atomic actions data in workload results is insufficient,
|
||||
therefore some new features can not be implemented.
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
The main problem is that current format does not support nested
|
||||
atomic actions.
|
||||
|
||||
Also, atomic actions data does not include timestamps for each action
|
||||
start and end time. Having this data will allow us to inspect atomic
|
||||
actions runtime better and generate detailed reports.
|
||||
|
||||
Since word "atomic" means something that can not be split into parts
|
||||
and we introduce nested atomic actions, we should use different term
|
||||
instead of "atomic actions".
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
Term "atomic actions" should be renamed to just "actions".
|
||||
|
||||
Change actions results schema from type "object" to "array"
|
||||
and extend it with timestamps and nested actions.
|
||||
|
||||
Nested actions will be represented by "children" key and have
|
||||
unlimited nesting.
|
||||
|
||||
With timestamps, there is no need to save durations anymore,
|
||||
so get rid of this value.
|
||||
|
||||
Since this change is not backward compatible, we need to create
|
||||
a database migration script. The migration will use iteration start
|
||||
timestamp as start timestamp for first action and then calculate
|
||||
further timestamps based on actions order and their durations.
|
||||
|
||||
Benefits of new format
|
||||
----------------------
|
||||
|
||||
Nested actions will make actions measurement more detailed and flexible
|
||||
since we could have data what sub-actions were run during specific action
|
||||
runtime, without complicated changes at code.
|
||||
|
||||
Start and end timestamps will provide us with accurate information
|
||||
about action runtime within the whole iteration and ability to create
|
||||
`Gantt charts <https://en.wikipedia.org/wiki/Gantt_chart>`_.
|
||||
|
||||
Schema modification
|
||||
-------------------
|
||||
|
||||
Schema location is *rally.common.objects.task.TASK_RESULT_SCHEMA
|
||||
["properties"]["result"]["properties"]["atomic_actions"]*
|
||||
|
||||
should be moved to *rally.common.objects.task.TASK_RESULT_SCHEMA
|
||||
["properties"]["result"]["properties"]["actions"]*
|
||||
|
||||
and changed:
|
||||
|
||||
AS IS:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
{
|
||||
"type": "object"
|
||||
}
|
||||
|
||||
Here keys are actions names, and values are their durations.
|
||||
Actions data is actually represented by collections.OrderedDict,
|
||||
so we have real order saved.
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
OrderedDict([("keystone.create_tenant", 0.1234),
|
||||
("keystone.create_users", 1.234)])
|
||||
|
||||
TO BE:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
{
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string"}, # name of action
|
||||
"started_at": {"type": "number"}, # float UNIX timestamp
|
||||
"finished_at": {"type": "number"}, # float UNIX timestamp
|
||||
"children": {"$ref": "#/"},
|
||||
},
|
||||
"required": ["name", "started_at", "finished_at", "children"],
|
||||
"additionalProperties": False
|
||||
},
|
||||
"minItems": 0
|
||||
}
|
||||
|
||||
Example how this data can be represented:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
[{"name": "keystone.create_tenant",
|
||||
"started_at": 1455281370.288397,
|
||||
"finished_at": 1455281372.672342,
|
||||
"children": []},
|
||||
{"name": "keystone.create_users",
|
||||
"started_at": 1455281372.931324,
|
||||
"finished_at": 1455281373.375184,
|
||||
"children": []}]
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
None
|
||||
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
Alexander Maretskiy <amaretskiy@mirantis.com>
|
||||
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
- Rename atomic actions into actions
|
||||
- Improve actions results format
|
||||
- Create a DB migartion that transforms results to new format
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
None
|
348
doc/specs/implemented/new_rally_input_task_format.rst
Normal file
348
doc/specs/implemented/new_rally_input_task_format.rst
Normal file
@ -0,0 +1,348 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
..
|
||||
This template should be in ReSTructured text. The filename in the git
|
||||
repository should match the launchpad URL, for example a URL of
|
||||
https://blueprints.launchpad.net/heat/+spec/awesome-thing should be named
|
||||
awesome-thing.rst . Please do not delete any of the sections in this
|
||||
template. If you have nothing to say for a whole section, just write: None
|
||||
For help with syntax, see http://sphinx-doc.org/rest.html
|
||||
To test out your formatting, see http://www.tele3.cz/jbar/rest/rest.html
|
||||
|
||||
|
||||
====================================
|
||||
Make the new Rally input task format
|
||||
====================================
|
||||
|
||||
Current Rally format is not flexible enough to cover all use cases that are
|
||||
required. Let's change it!
|
||||
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
Why do we need such fundamental change?
|
||||
|
||||
- Multi scenarios load generation support.
|
||||
This is very important, because it will allow to use Rally for more
|
||||
real life load generation. Like making load on different components
|
||||
and HA testing (where one scenario tries for example to authenticate
|
||||
another is disabling controller)
|
||||
|
||||
- Ability to add require meta information like (title and descriptions)
|
||||
That are required to generate clear reports
|
||||
|
||||
- Fixing UX issues. Previous format is very hard for understanding and
|
||||
end users have issues with understanding how it works exactly.
|
||||
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
Make a new format that address all issues.
|
||||
|
||||
|
||||
Old format JSON schema:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
{
|
||||
"type": "object",
|
||||
"$schema": "http://json-schema.org/draft-04/schema",
|
||||
"patternProperties": {
|
||||
".*": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"args": {
|
||||
"type": "object"
|
||||
},
|
||||
"runner": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"type": {"type": "string"}
|
||||
},
|
||||
"required": ["type"]
|
||||
},
|
||||
"context": {
|
||||
"type": "object"
|
||||
},
|
||||
"sla": {
|
||||
"type": "object",
|
||||
},
|
||||
},
|
||||
"additionalProperties": False
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Old format sample:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
---
|
||||
<ScenarioName>:
|
||||
-
|
||||
args: <dict_with_scenario_args>
|
||||
runner: <dict_with_runner_type_and_args>
|
||||
context:
|
||||
<context_name>: <dict_with_context_args>
|
||||
...
|
||||
sla:
|
||||
<sla_name>: <sla_arguments>
|
||||
-
|
||||
-//-
|
||||
-
|
||||
-//-
|
||||
<AnotherScenarioName>:
|
||||
-//-
|
||||
|
||||
Every element of list corresponding to <ScenarioName> is separated task,
|
||||
that generates environment according to context, generates load using
|
||||
specified runner that runs multiple times <ScenarioName> with it's args.
|
||||
|
||||
|
||||
New format JSON schema:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
{
|
||||
"type": "object",
|
||||
"$schema": "http://json-schema.org/draft-04/schema",
|
||||
"properties": {
|
||||
"version": {"type": "number"},
|
||||
"title": {"type": "string"},
|
||||
"description": {"type": "string"},
|
||||
"tags": {
|
||||
"type": "array",
|
||||
"items": {"type": "string"}
|
||||
},
|
||||
|
||||
"subtasks": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"title": {"type": "string"},
|
||||
"description": {"type": "string"},
|
||||
"tags": {
|
||||
"type": "array",
|
||||
"items": {"type": "string"}
|
||||
},
|
||||
|
||||
"run_in_parallel": {"type": "boolean"},
|
||||
"workloads": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"scenario": {"type": "object"},
|
||||
"runner": {"type": "object"}
|
||||
"sla": {"type": "object"},
|
||||
"contexts": {"type": "object"}
|
||||
},
|
||||
"required": ["scenario", "runner"]
|
||||
}
|
||||
},
|
||||
"contexts": {"type": "object"}
|
||||
},
|
||||
"required": ["title", "workloads"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": ["title", "tasks"]
|
||||
}
|
||||
|
||||
|
||||
New format sample:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
---
|
||||
|
||||
# Having Dictionary on top level allows us in future to add any new keys.
|
||||
# Keeping the schema of format more or less same for end users.
|
||||
|
||||
# Version of format
|
||||
version: 2
|
||||
|
||||
# Allows to set title of report. Which allows end users to understand
|
||||
# what they can find in task report.
|
||||
title: "New Input Task format"
|
||||
|
||||
# Description allows us to put all required information to explain end
|
||||
# users what kind of results they can find in reports.
|
||||
description: "This task allows you to certify that your cloud works"
|
||||
|
||||
# Explicit usage "rally task start --tag" --tag attribute
|
||||
tags: ["periodic", "nova", "cinder", "ha"]
|
||||
|
||||
subtasks:
|
||||
# Note every task is executed serially (one by one)
|
||||
#
|
||||
# Using list for describing what subtasks to run is much better idea then
|
||||
# using dictionary. It resolves at least 3 big issues:
|
||||
#
|
||||
# 1) Bad user experience
|
||||
# 1.1) Users do not realize that Rally can run N subtask
|
||||
# 1.2) Keys of Dictionary were Scenario names (reasonable question why?!)
|
||||
# 1.3) Users tried to put N times same k-v (to run one subtask N times)
|
||||
# 2) No way to specify order of scenarios execution, especially in case
|
||||
# where we need to do chain like: ScenarioA -> SecnearioB -> ScenarioA
|
||||
# 3) No way to support multi scenario load, because we used scenario name
|
||||
# as a identifier of single task
|
||||
-
|
||||
# title field is required because in case of multi scenario load
|
||||
# we can't use scenario name for it's value.
|
||||
title: "First task to execute"
|
||||
description: "We will stress Nova" # optional
|
||||
|
||||
# Tags are going to be used in various rally task reports for filtering
|
||||
# and grouping.
|
||||
tags: ["nova", "my_favorite_task", "do it"]
|
||||
|
||||
# The way to execute scenarios (one by one or all in parallel)
|
||||
run_in_parallel: False
|
||||
|
||||
# Single scenario load can be generated by specifying only one element
|
||||
# in "workloads" section.
|
||||
workloads:
|
||||
-
|
||||
scenario:
|
||||
NovaServers.boot_and_delete:
|
||||
image:
|
||||
name: "^cirros$"
|
||||
flavors:
|
||||
name: "m1.small"
|
||||
runner:
|
||||
constant:
|
||||
times: 100
|
||||
concurrency: 10
|
||||
# Subtask success of criteria based on results
|
||||
sla:
|
||||
# Every key means SLA plugin name, values are config of plugin
|
||||
# Only if all criteria pass task is marked as passed
|
||||
failure_rate:
|
||||
max: 0
|
||||
|
||||
# Specification of context that creates env for scenarios
|
||||
# E.g. it creates users, tenants, sets quotas, uploads images...
|
||||
contexts:
|
||||
# Each key is the name of context plugin
|
||||
|
||||
# This context creates temporary users and tenants
|
||||
users:
|
||||
# These k-v will be passed as arguments to this `users` plugin
|
||||
tenants: 2
|
||||
users_per_tenant: 10
|
||||
|
||||
# This context set's quotas for created by `users` context tenants
|
||||
quotas:
|
||||
nova:
|
||||
cpu: -1
|
||||
|
||||
-
|
||||
title: "Second task to execute"
|
||||
description: "Multi Scenario load generation with common context"
|
||||
|
||||
run_in_parallel: True
|
||||
|
||||
# If we put 2 or more scenarios to `scenarios` section we will run
|
||||
# all of them simultaneously which allows us to generate more real life
|
||||
# load
|
||||
workloads:
|
||||
-
|
||||
scenario:
|
||||
CinderVolumes.create_and_delete:
|
||||
size: 10
|
||||
runner:
|
||||
constant:
|
||||
times: 100
|
||||
concurrency: 10
|
||||
sla:
|
||||
failure_rate:
|
||||
max: 0
|
||||
-
|
||||
scenario:
|
||||
KeystoneBasic.create_and_delete_users:
|
||||
name_length: 20
|
||||
runner:
|
||||
rps:
|
||||
rps: 1
|
||||
times: 1000
|
||||
sla:
|
||||
max_seconds_per_iteration: 10
|
||||
-
|
||||
scenario:
|
||||
PhysicalNode.restart:
|
||||
ip: "..."
|
||||
user: "..."
|
||||
password: "..."
|
||||
runner:
|
||||
rps:
|
||||
rps: 10
|
||||
times: 10
|
||||
sla:
|
||||
max_seconds_per_iteration: 100
|
||||
# This scenario is called in own independent and isolated context
|
||||
contexts: {}
|
||||
|
||||
# Global context that is used if scenario doesn't specify own
|
||||
contexts:
|
||||
users:
|
||||
tenants: 2
|
||||
users_per_tenant: 10
|
||||
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
No way
|
||||
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
boris-42 aka Boris Pavlovic
|
||||
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
- Implement OLD -> NEW format converter
|
||||
|
||||
- Switch task engine to use new format. This should affect only task engine
|
||||
|
||||
- Implement new DB schema format, that will allow to store multi-scenario
|
||||
output data
|
||||
|
||||
- Add support for multi scenario results processing in rally task
|
||||
detailed|sla_check|report
|
||||
|
||||
- Add timestamps to task, scenarios and atomics
|
||||
|
||||
- Add support for usage multi-runner instance in single task with
|
||||
common context
|
||||
|
||||
- Add support for scenario's own context
|
||||
|
||||
- Add ability to use new format in rally task start.
|
||||
|
||||
- Deprecate OLD format
|
||||
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
None
|
206
doc/specs/implemented/pluggable_validators.rst
Normal file
206
doc/specs/implemented/pluggable_validators.rst
Normal file
@ -0,0 +1,206 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
..
|
||||
This template should be in ReSTructured text. The filename in the git
|
||||
repository should match the launchpad URL, for example a URL of
|
||||
https://blueprints.launchpad.net/heat/+spec/awesome-thing should be named
|
||||
awesome-thing.rst . Please do not delete any of the sections in this
|
||||
template. If you have nothing to say for a whole section, just write: None
|
||||
For help with syntax, see http://sphinx-doc.org/rest.html
|
||||
To test out your formatting, see http://www.tele3.cz/jbar/rest/rest.html
|
||||
|
||||
|
||||
=================================
|
||||
Rally Task Validation Refactoring
|
||||
=================================
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
* Current validator system is pluggable - but it doesn't use our plugin
|
||||
mechanism which creates problems (e.g. validators are imported directly and
|
||||
used in code, instead of using their names, which doesn't allow to rename
|
||||
them or move without breaking backward compatibility).
|
||||
|
||||
* Current mechanism of validation leads to a lot of OpenStack related code in
|
||||
the Rally task engine.
|
||||
|
||||
* It's hard to use the same validators for different types of plugins, current
|
||||
approach is used only for scenarios.
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
To create unified validation mechanism that can be used for all types of
|
||||
future deployments and type of plugins in the same way. So we will be able
|
||||
to remove `OpenStack related code <https://github
|
||||
.com/openstack/rally/blob/be8cd7bff6de9b3e83dd31005ae5d07ca1c86b9e/rally
|
||||
/task/engine.py#L188-L278>`_ from the task engine, and create a bunch of
|
||||
common validators (e.g. jsonschema) that can be used by any
|
||||
plugin.
|
||||
As a bonus of refactoring, it allows us to switch to common mechanism of
|
||||
plugins.
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
No way
|
||||
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Here is an example of base class for all pluggable validators.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import abc
|
||||
import six
|
||||
|
||||
from rally.common.plugin import plugin
|
||||
from rally.task import validation
|
||||
|
||||
|
||||
def configure(name, platform="default"):
|
||||
return plugin.configure(name=name, platform=platform)
|
||||
|
||||
@six.add_metaclass(abc.ABCMeta)
|
||||
@configure(name="base_validator")
|
||||
class Validator(plugin.Plugin):
|
||||
|
||||
def validate(self, cache, deployment, cfg, plugin_cfg):
|
||||
"""
|
||||
Method that validates something.
|
||||
|
||||
:param cache: this is cross validator cache where different
|
||||
validators could store information about
|
||||
environment like initialized OpenStack clients,
|
||||
images, etc and share it through validators.
|
||||
E.g. if your custom validators need to perform 200
|
||||
OpenStack checks and each validator plugin need to
|
||||
initialize client, Rally will take extra 2 minutes
|
||||
for validation step. As well, its not efficient to
|
||||
fetch all image each time if we have image related
|
||||
validators.
|
||||
:param deployment: Deployment object, deployment which would be
|
||||
used for validation
|
||||
:param cfg: dict, configuration of subtask
|
||||
:param plugin_cfg: dict, with exact configuration of the plugin
|
||||
"""
|
||||
pass
|
||||
|
||||
def add(name, **kwargs):
|
||||
"""
|
||||
Add validator instance to the validator plugin class meta.
|
||||
|
||||
Get validator class by name. Initialize an instance. Add validator
|
||||
instance to validators list stored in the Validator meta by
|
||||
'validator_v2' key. This would be used to iterate and execute through
|
||||
all validators used during execution of subtask.
|
||||
|
||||
:param kwargs: dict, arguments used to initialize validator class
|
||||
instance
|
||||
:param name: str, name of the validator plugin
|
||||
"""
|
||||
validator = Validator.get(name)(**kwargs)
|
||||
|
||||
def wrapper(p):
|
||||
p._meta_setdefault("validators_v2", [])
|
||||
p._meta_get("validators_v2").append(validator)
|
||||
return p
|
||||
|
||||
return wrapper
|
||||
|
||||
|
||||
@abc.abstractmethod
|
||||
def validate(plugin, deployment, cfg, plugin_cfg):
|
||||
"""
|
||||
Execute all validate() method of all validators stored in meta of
|
||||
Validator.
|
||||
|
||||
Iterate during all validators stored in the meta of Validator and
|
||||
execute proper validate() method and add validation result to the
|
||||
list.
|
||||
|
||||
:param plugin: is plugin class instance that has validators and should
|
||||
be validated
|
||||
:param deployment: Deployment object, deployment which would be
|
||||
used for validation
|
||||
:param cfg: dict, configuration of subtask
|
||||
:param plugin_cfg: dict, with exact configuration of the plugin
|
||||
"""
|
||||
results = []
|
||||
cache = {}
|
||||
|
||||
for v in plugin._meta_get("validators_v2"):
|
||||
try:
|
||||
v.validate(cache, deployment, cfg, plugin_cfg)
|
||||
except Exception as e:
|
||||
results.append(validation.ValidationResult(is_valid=False,
|
||||
msg=e))
|
||||
return results
|
||||
|
||||
|
||||
New design allows us to use the same validator and same validation mechanism
|
||||
for different types of plugins (context, sla, runner, scenarios) which was not
|
||||
possible before. For example, we could implement jsonschema validation as a
|
||||
plugin.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import jsonschema
|
||||
|
||||
@configure(name="jsonschema")
|
||||
class JsonSchemaValidator(Validator):
|
||||
|
||||
def __init__(self, schema=None):
|
||||
super(JsonSchemaValidator, self).__init__()
|
||||
self.schema = schema or {}
|
||||
|
||||
def validate(self, cache, deployment, cfg, plugin_cfg):
|
||||
jsonschema.validate(plugin_cfg, self.schema)
|
||||
|
||||
|
||||
|
||||
@validator.add("jsonschema", schema="<here_json_schema>")
|
||||
class SomeContext(base.Context):
|
||||
pass
|
||||
|
||||
|
||||
class SomeScenario(base.Scenario):
|
||||
|
||||
@validator.add("jsonschema", schema="<here_json_schema>")
|
||||
def some_function(self):
|
||||
pass
|
||||
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
|
||||
- boris-42 <bpavlovic@mirantis.com>
|
||||
- rvasilets <rvasilets@mirantis.com>
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
- Create validation module with base plugin and method of adding validators
|
||||
|
||||
- Add support to task engine of new validation mechanism
|
||||
|
||||
- Port all old validators to new mechanism
|
||||
|
||||
- Deprecate old validation mechanism
|
||||
|
||||
- Remove deprecated in new release
|
||||
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
None
|
109
doc/specs/implemented/task_and_verification_export.rst
Normal file
109
doc/specs/implemented/task_and_verification_export.rst
Normal file
@ -0,0 +1,109 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
..
|
||||
This template should be in ReSTructured text. The filename in the git
|
||||
repository should match the launchpad URL, for example a URL of
|
||||
https://blueprints.launchpad.net/heat/+spec/awesome-thing should be named
|
||||
awesome-thing.rst . Please do not delete any of the sections in this
|
||||
template. If you have nothing to say for a whole section, just write: None
|
||||
For help with syntax, see http://sphinx-doc.org/rest.html
|
||||
To test out your formatting, see http://www.tele3.cz/jbar/rest/rest.html
|
||||
|
||||
|
||||
====================================================
|
||||
Export task and verifications into external services
|
||||
====================================================
|
||||
|
||||
Currently Rally stores all information about executed tasks and verifications
|
||||
in its database and it is also able to provide this data in JSON format or
|
||||
in the form of HTML reports. There is a request for Rally to export this data
|
||||
into external services (like test management system or Google Docs)
|
||||
via its API.
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
There are many, including a lot of proprietary, test management systems
|
||||
in the market available as SaaS and/or On-Premises, like TestRail, TestLink,
|
||||
TestLodge etc, which objective is to manage, organize and track all testing
|
||||
efforts.
|
||||
|
||||
Most of the systems provide an API for importing test data. The systems also
|
||||
possess data model somewhat similar to Rally's one.
|
||||
It usually includes (among others) models for project, test suite test case,
|
||||
test plan and test execution results.
|
||||
|
||||
It is suggested to provide Rally users an ability to export information about
|
||||
testing their environments into such test management systems in order
|
||||
to integrate testing via Rally into rest of their testing activities.
|
||||
|
||||
Since different test management systems have alike yet different API
|
||||
for the purpose it is reasonable to implement this export functionality via
|
||||
plugins.
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
1. Implement a base class Exporter for an export plugin at
|
||||
*rally/task/exporter.py*.
|
||||
|
||||
..code-block:: python
|
||||
|
||||
class Exporter(plugin.Plugin):
|
||||
def export(self, task, connection_string):
|
||||
...
|
||||
|
||||
2. Implement a CLI command of the form
|
||||
|
||||
..code-block:: shell
|
||||
|
||||
rally task export <UUID> <CONNECTION_STRING>
|
||||
|
||||
3. Implement a base class VerifyExporter for an export plugin at
|
||||
*rally/verify/exporter.py*.
|
||||
|
||||
..code-block:: python
|
||||
|
||||
class VerifyExporter(plugin.Plugin):
|
||||
def export(self, verification, connection_string):
|
||||
...
|
||||
|
||||
4. Implement a CLI command of the form
|
||||
|
||||
..code-block:: shell
|
||||
|
||||
rally verify export <UUID> <CONNECTION_STRING>
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
No way
|
||||
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
|
||||
rvasilets <rvasilets@mirantis.com>
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
- Implement plugin base class
|
||||
|
||||
- Implement CLI command
|
||||
|
||||
- Implement plugin for TestRail
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
None
|
Loading…
x
Reference in New Issue
Block a user