From 0ecc1d623f952beb432338eaa392c0bf92e2edec Mon Sep 17 00:00:00 2001 From: Ifat Afek Date: Thu, 14 Mar 2019 13:50:15 +0000 Subject: [PATCH] Added a document with manual tests for Vitrage Change-Id: I50218ca0208f59f130f90cac02413b94c527f667 --- .../contributor/devstack-installation.rst | 7 + doc/source/contributor/manual-tests.rst | 624 ++++++++++++++++++ .../manual_tests/switch_and_nic.yaml | 19 + .../manual_tests/templates/v1_template.yaml | 30 + .../templates/v2_definition_template.yaml | 22 + .../templates/v2_equivalence.yaml | 23 + .../templates/v2_high_cpu_load.yaml | 75 +++ .../manual_tests/templates/v2_host_down.yaml | 76 +++ .../templates/v2_with_include.yaml | 28 + .../templates/v2_with_invalid_include.yaml | 28 + .../templates/v2_with_params.yaml | 41 ++ .../manual_tests/templates/v2_wrong.yaml | 30 + .../templates/v3_execute_mistral.yaml | 17 + .../templates/v3_high_mem_consumption.yaml | 31 + .../templates/v3_with_default_params.yaml | 23 + .../templates/v3_with_params.yaml | 22 + .../manual_tests/test_web_server.py | 29 + .../contributor/manual_tests/workflow1.yaml | 11 + 18 files changed, 1136 insertions(+) create mode 100644 doc/source/contributor/manual-tests.rst create mode 100644 doc/source/contributor/manual_tests/switch_and_nic.yaml create mode 100644 doc/source/contributor/manual_tests/templates/v1_template.yaml create mode 100644 doc/source/contributor/manual_tests/templates/v2_definition_template.yaml create mode 100644 doc/source/contributor/manual_tests/templates/v2_equivalence.yaml create mode 100644 doc/source/contributor/manual_tests/templates/v2_high_cpu_load.yaml create mode 100644 doc/source/contributor/manual_tests/templates/v2_host_down.yaml create mode 100644 doc/source/contributor/manual_tests/templates/v2_with_include.yaml create mode 100644 doc/source/contributor/manual_tests/templates/v2_with_invalid_include.yaml create mode 100644 doc/source/contributor/manual_tests/templates/v2_with_params.yaml create mode 100644 doc/source/contributor/manual_tests/templates/v2_wrong.yaml create mode 100644 doc/source/contributor/manual_tests/templates/v3_execute_mistral.yaml create mode 100644 doc/source/contributor/manual_tests/templates/v3_high_mem_consumption.yaml create mode 100644 doc/source/contributor/manual_tests/templates/v3_with_default_params.yaml create mode 100644 doc/source/contributor/manual_tests/templates/v3_with_params.yaml create mode 100644 doc/source/contributor/manual_tests/test_web_server.py create mode 100644 doc/source/contributor/manual_tests/workflow1.yaml diff --git a/doc/source/contributor/devstack-installation.rst b/doc/source/contributor/devstack-installation.rst index 107800330..c1b2a8d34 100644 --- a/doc/source/contributor/devstack-installation.rst +++ b/doc/source/contributor/devstack-installation.rst @@ -9,6 +9,13 @@ Vitrage Devstack Installation * `Enabling Vitrage in horizon `_ + +.. toctree:: + :maxdepth: 1 + + manual-tests + + External Monitor Installation ============================= diff --git a/doc/source/contributor/manual-tests.rst b/doc/source/contributor/manual-tests.rst new file mode 100644 index 000000000..2680d148d --- /dev/null +++ b/doc/source/contributor/manual-tests.rst @@ -0,0 +1,624 @@ +==================== +Vitrage manual tests +==================== + +General +------- + +The purpose of these tests is to manually check functionality that is not +tested using tempest tests, and to double-check the correctness and validity of +a devstack in general. + +Vitrage Health +-------------- + +Services +^^^^^^^^ + +Services Status +~~~~~~~~~~~~~~~ +**Run** + +.. code:: bash + + sudo systemctl status devstack@vitrage-graph.service + sudo systemctl status devstack@vitrage-persistor.service + sudo systemctl status devstack@vitrage-notifier.service + sudo systemctl status devstack@vitrage-api.service + +**Expected result** + +Make sure that the status is ``active``. + +Check the logs for WARNING/ERROR/Exception/traceback + +Services Restart +~~~~~~~~~~~~~~~~ +**Run** + +.. code:: bash + + sudo service devstack@vitrage-graph restart + sudo service devstack@vitrage-notifier restart + sudo service devstack@vitrage-persistor restart + +**Expected result** + +Make sure the restart is quick and does not reach a timeout + +Services Information +~~~~~~~~~~~~~~~~~~~~ +**Run** + +.. code:: bash + + vitrage service list + +**Expected result** + +.. code:: bash + + +----------------------------------+------------+-------------+---------------------------+ + | Name | Process Id | Hostname | Created At | + +----------------------------------+------------+-------------+---------------------------+ + | ApiWorker worker(0) | 1084 | my-devstack | 2019-03-13T14:31:46+00:00 | + | EvaluatorWorker worker(0) | 1082 | my-devstack | 2019-03-13T14:31:46+00:00 | + | MachineLearningService worker(0) | 5956 | my-devstack | 2019-03-13T10:30:54+00:00 | + | PersistorService worker(0) | 22536 | my-devstack | 2019-03-13T14:14:15+00:00 | + | SnmpParsingService worker(0) | 6170 | my-devstack | 2019-03-13T10:30:56+00:00 | + | VitrageNotifierService worker(0) | 22746 | my-devstack | 2019-03-13T14:14:27+00:00 | + | vitrageuWSGI worker 1 | 2847 | my-devstack | 2019-03-13T10:30:47+00:00 | + | vitrageuWSGI worker 2 | 2848 | my-devstack | 2019-03-13T10:30:47+00:00 | + +----------------------------------+------------+-------------+---------------------------+ + +Processes +~~~~~~~~~ + +**Run** + +.. code:: bash + + ps -aux | grep vitrage-graph + + +**Expected result** + +vitrage-graph: master process + +vitrage-graph: EvaluatorWorker + +vitrage-graph: ApiWorker + +There may be more than one EvaluatorWorker processes, according to the +definition in vitrage.conf (the default is one worker). + + +Healthcheck API +^^^^^^^^^^^^^^^ + +**Run** + +.. code:: bash + + vitrage healthcheck + + +**Expected result** + +.. code:: bash + + +----------+---------+ + | Field | Value | + +----------+---------+ + | detailed | False | + | reasons | [u'OK'] | + +----------+---------+ + +Vitrage Help +^^^^^^^^^^^^ + +**Run** + +.. code:: bash + + vitrage -h + +**Expected result** + +Should display all Vitrage commands. + +CLI commands +------------ +Most of the functionality is covered in tempest tests, but we have no automatic +tests for the CLI itself. + +Topology +^^^^^^^^ + +**Run** + +.. code:: bash + + vitrage topology show + +**Expected result** + +Should display a graph with Vitrage entities and relationships. + +Templates +^^^^^^^^^ +Template Validate +~~~~~~~~~~~~~~~~~ + ++----------------------------------------------------------------+--------------------------------------------------------+ +| What to execute | Expected results | ++================================================================+========================================================+ +| vitrage template validate | Error, --path is required | ++----------------------------------------------------------------+--------------------------------------------------------+ +| vitrage template validate -path ./v1_template.yaml | Validation failed - Unknown template type | ++----------------------------------------------------------------+--------------------------------------------------------+ +| vitrage template validate --path ./v1_template.yaml | Template validation is OK | +| --type standard | | ++----------------------------------------------------------------+--------------------------------------------------------+ +| vitrage template validate --path ./v1_template.yaml | Validation failed, definition template can not contain | +| --type definition | ``scenarios`` block | ++----------------------------------------------------------------+--------------------------------------------------------+ +| vitrage template validate --path ./v2_high_cpu_load.yaml | Template validation is OK | ++----------------------------------------------------------------+--------------------------------------------------------+ +| vitrage template validate --path . | Validates all templates in the path. Some succeed and | +| | some fail. | ++----------------------------------------------------------------+--------------------------------------------------------+ +| vitrage template validate --path ./v2_definition_template.yaml | Template validation is OK | ++----------------------------------------------------------------+--------------------------------------------------------+ +| vitrage template validate --path v2_equivalence.yaml | No validation | ++----------------------------------------------------------------+--------------------------------------------------------+ +| vitrage template validate --path v3_high_mem_consumption.yaml | Template validation is OK | ++----------------------------------------------------------------+--------------------------------------------------------+ + +Template Add +~~~~~~~~~~~~ + ++----------------------------------------------------------------+---------------------------------------------------------+ +| What to execute | Expected results | ++================================================================+=========================================================+ +| vitrage template list | An empty list | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template add | Error, --path is required | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template add --path ./v1_template.yaml | Template added with status ERROR: Unknown template type | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template add --path ./v1_template.yaml | --type: invalid choice: ``kuku`` | +| --type kuku | | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template add --path ./v1_template.yaml | Template added with status LOADING | +| --type standard | | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template add --path ./v1_template.yaml | ERROR: Duplicate template name | +| --type standard | | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template list | One template with status ACTIVE | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template delete | No output | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template list | An empty list | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template add --path ./v2_high_cpu_load.yaml | Template added with status LOADING | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template add --path ./v2_definition_template.yaml | Template added with status LOADING | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template add --path ./v2_with_include.yaml | Template added with status LOADING | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template add --path ./v2_with_invalid_include.yaml | ERROR: Trying to include a template that does not exist | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template add --path v2_equivalence.yaml | Template added with status LOADING | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template add --path v3_high_mem_consumption.yaml | Template validation is OK | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template list | Five templates with status ACTIVE and one in ERROR | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template show | Shows the template json representation | ++----------------------------------------------------------------+---------------------------------------------------------+ + +Templates with parameters +~~~~~~~~~~~~~~~~~~~~~~~~~ + ++----------------------------------------------------------------+---------------------------------------------------------+ +| What to execute | Expected results | ++================================================================+=========================================================+ +| vitrage template validate --path v3_with_params.yaml | Failed to resolve parameter - template_name | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template validate --path v3_with_params.yaml | Template validation is OK | +| --params template_name=template1 | | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template validate --path v3_with_params.yaml | Failed to resolve parameter - template_name | +| --params alarm_name=alarm1 | | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template validate --path v3_with_params.yaml | Template validation is OK | +| --params template_name=template1 alarm_name=alarm1 | | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template add --path v3_with_params.yaml | Template added with status LOADING | +| --params template_name=template1 alarm_name=alarm1 | | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template add --path v2_with_params.yaml | Template added with status LOADING | +| --params template_name=t1 alarm_name=a1 alarm_type=zabbix | | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage template show | Shows the template json representation. All parameters | +| | are resolved and the ``parameters`` section is removed. | ++----------------------------------------------------------------+---------------------------------------------------------+ + +Deduced Alarms and RCA +^^^^^^^^^^^^^^^^^^^^^^ + ++----------------------------------------------------------------+---------------------------------------------------------+ +| What to execute | Expected results | ++================================================================+=========================================================+ +| create an instance in Nova | An instance is created | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage alarm list | An empty list | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage event post --type="High CPU load" --details=' | Make sure to use ``hostname`` that contains an instance | +| {"hostname": "my-devstack","source":"sample_monitor", | No output | +| "cause":"link-down","severity":"critical","status":"down", | | +| "monitor_id":"monitor-1","monitor_event_id":"123"}' | | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage alarm list | Shows 'High CPU load' on the host and also an alarm on | +| | the instance. | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage alarm show | Shows the alarm details. Verify for both alarms. | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage rca show | Shows the alarm RCA graph. Verify for both alarms. | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage alarm count | Shows one WARNING and one CRITICAL alarm | ++----------------------------------------------------------------+---------------------------------------------------------+ + +Resources +^^^^^^^^^ + ++----------------------------------------------------------------+---------------------------------------------------------+ +| What to execute | Expected results | ++================================================================+=========================================================+ +| vitrage resource list | Shows a list of resources from different datasources. | +| | Does not show alarms | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage resource list --filter ..... TBD | Shows a list of resources that match the given filter. | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage resource show | Shows a the defails of the selected resource. | ++----------------------------------------------------------------+---------------------------------------------------------+ +| vitrage resource count | Shows how many resources there are of every type. | ++----------------------------------------------------------------+---------------------------------------------------------+ + +Multi Tenancy +^^^^^^^^^^^^^ + +TBD + +Datasources +----------- + +**Note:** The resources and alarms are visible only to the tenant that created +them. + +* For a resource that was created in the UI, check the Vitrage entity graph of + the same tenant. +* For a resource that was created in the CLI, check the Vitrage entity graph + of ``admin`` tenant. + +Basic OpenStack datasources +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ++------------------------------------------------------------+--------------------------------------------------------+ +| What to execute | Expected results | ++============================================================+========================================================+ +| Create an instance/volume/network/stack | A new entity immediately appears in Vitrage entity | +| | graph and is connected to the right neighbors. | ++------------------------------------------------------------+--------------------------------------------------------+ +| Delete these resources | The entities are immediately removed from the graph | ++------------------------------------------------------------+--------------------------------------------------------+ + +Static Topology +^^^^^^^^^^^^^^^ + ++------------------------------------------------------------+--------------------------------------------------------+ +| What to execute | Expected results | ++============================================================+========================================================+ +| Copy switch_and_nic.yaml under | The switche and nic should appear in the graph within | +| /etc/vitrage/static_datasources | 30 seconds | ++------------------------------------------------------------+--------------------------------------------------------+ + +Aodh +^^^^ + ++-------------------------------------------------------------+---------------------------------------------------------+ +| What to execute | Expected results | ++=============================================================+=========================================================+ +| aodh alarm create --name 'test_1' --state alarm | An alarm is created in Aodh with state ``alarm``. | +| --event-type 'my.event' --type event --query | Make sure to use as traits.resource_id the name of | +| 'traits.resource_id=string::my-devstack' | your devstack. | ++-------------------------------------------------------------+---------------------------------------------------------+ +| vitrage alarm list | The Aodh alarm appears and is connected to the devstack | ++-------------------------------------------------------------+---------------------------------------------------------+ +| aodh alarm create --name 'Gnocchi alarm 1' --type | An alarm is created in Aodh with state ``alarm``. | +| gnocchi_resources_threshold --resource-type instance | Make sure to assign --resource-id with a valid instance | +| --resource-id f9335fc1-f3bf-4915-bed2-2c7350628ac9 --metric | uuid. | +| cpu_util --threshold 0.001 --granularity 300 --state alarm | | +| --aggregation-method mean --comparison-operator gt | | ++-------------------------------------------------------------+---------------------------------------------------------+ +| vitrage alarm list | Two Aodh alarms, connected to different resources | ++-------------------------------------------------------------+---------------------------------------------------------+ +| aodh alarm delete | | ++-------------------------------------------------------------+---------------------------------------------------------+ +| vitrage alarm list | One Aodh alarm remains | ++-------------------------------------------------------------+---------------------------------------------------------+ + +Notifiers +--------- + +Nova Notifier +^^^^^^^^^^^^^ + ++-------------------------------------------------------------+---------------------------------------------------------+ +| What to execute | Expected results | ++=============================================================+=========================================================+ +| vitrage template add --path ./host_down.yaml | Template added with status LOADING | ++-------------------------------------------------------------+---------------------------------------------------------+ +| nova service-list | The state of nova-compute is ``up`` | ++-------------------------------------------------------------+---------------------------------------------------------+ +| vitrage event post --type="compute.host.down" --details= | Make sure to use ``hostname`` of your devstack. | +| '{"hostname": "my-devstack","source":"sample_monitor", | No output. | +| "cause":"link-down","severity":"critical","status":"down", | | +| "monitor_id":"monitor-1","monitor_event_id":"123"}' | | ++-------------------------------------------------------------+---------------------------------------------------------+ +| vitrage alarm list | A compute.host.down alarm, connected to the right host | ++-------------------------------------------------------------+---------------------------------------------------------+ +| nova service-list | The state of nova-compute is ``down`` | ++-------------------------------------------------------------+---------------------------------------------------------+ +| vitrage event post --type="compute.host.down" --details= | Make sure to use ``hostname`` of your devstack. | +| '{"hostname": "my-devstack","source":"sample_monitor", | No output. | +| "cause":"link-down","severity":"critical","status":"up", | | +| "monitor_id":"monitor-1","monitor_event_id":"123"}' | | ++-------------------------------------------------------------+---------------------------------------------------------+ +| nova service-list | The state of nova-compute is ``up`` | ++-------------------------------------------------------------+---------------------------------------------------------+ + +Webhook Notifier +^^^^^^^^^^^^^^^^ + +Configure a web client +~~~~~~~~~~~~~~~~~~~~~~ +Copy test_web_server.py under /opt/stack +Run: sudo pip install web.py + +Test the Webhook Notifier +~~~~~~~~~~~~~~~~~~~~~~~~~ + ++------------------------------------------------------------+--------------------------------------------------------+ +| What to execute | Expected results | ++============================================================+========================================================+ +| vitrage webhook list | Empty list | ++------------------------------------------------------------+--------------------------------------------------------+ +| python /opt/stack/test_web_server.py 8001 | server started (in a different console window) | ++------------------------------------------------------------+--------------------------------------------------------+ +| python /opt/stack/test_web_server.py 8002 | server started (in a different console window) | ++------------------------------------------------------------+--------------------------------------------------------+ +| vitrage webhook add --url http://localhost:8001/alarm | Outputs the webhook details | ++------------------------------------------------------------+--------------------------------------------------------+ +| vitrage webhook add --url http://localhost:8002/alarm | Outputs the webhook details | +| --regex '{"vitrage_type": "doctor"}' | | ++------------------------------------------------------------+--------------------------------------------------------+ +| vitrage webhook list | A list with the details of both webhooks | ++------------------------------------------------------------+--------------------------------------------------------+ +| vitrage webhook show | Shows the details of the webhook | ++------------------------------------------------------------+--------------------------------------------------------+ +| vitrage event post --type="compute.host.down" --details= | Both webhooks print the details of compute.host.down | +| '{"hostname": "compute-0-0","source":"sample_monitor", | alarm to the console. The webhook on port 8001 prints | +| "cause":"link-down","severity":"critical","status":"down", | also the details of the deduced alarms to the console. | +| "monitor_id":"monitor-1","monitor_event_id":"123"}' | | ++------------------------------------------------------------+--------------------------------------------------------+ +| vitrage webhook delete | Deletes a webhook | ++------------------------------------------------------------+--------------------------------------------------------+ +| vitrage webhook list | Shows only one webhook | ++------------------------------------------------------------+--------------------------------------------------------+ +| vitrage event post --type="compute.host.down" --details= | The deleted webhook does not print anything. The other | +| '{"hostname": "compute-0-0","source":"sample_monitor", | webhook prints the cleared alarm(s). | +| "cause":"link-down","severity":"critical","status":"up", | | +| "monitor_id":"monitor-1","monitor_event_id":"123"}' | | ++------------------------------------------------------------+--------------------------------------------------------+ + +Mistral Notifier +^^^^^^^^^^^^^^^^ + ++------------------------------------------------------------+--------------------------------------------------------+ +| What to execute | Expected results | ++============================================================+========================================================+ +| mistral workflow-create ./workflow1.yaml | The workflow is created | ++------------------------------------------------------------+--------------------------------------------------------+ +| vitrage template add --path ./v3_execute_mistral.yaml | Template added with status LOADING | ++------------------------------------------------------------+--------------------------------------------------------+ +| vitrage event post --type="alarm_for_mistral" --details= | Make sure to use ``hostname`` of your devstack. | +| '{"hostname": "my-devstack","source":"sample_monitor", | No output. | +| "cause":"link-down","severity":"critical","status":"down", | | +| "monitor_id":"monitor-1","monitor_event_id":"123"}' | | ++------------------------------------------------------------+--------------------------------------------------------+ +| mistral execution-list | ``workflow1`` is in the list. | ++------------------------------------------------------------+--------------------------------------------------------+ +| mistral execution-get | Shows details about ``workflow1`` execution. | ++------------------------------------------------------------+--------------------------------------------------------+ +| mistral execution-get-input | "farewell": "my-devstack" | ++------------------------------------------------------------+--------------------------------------------------------+ + +Zaqar Notifier +^^^^^^^^^^^^^^ +TBD + +SNMP Notifier +^^^^^^^^^^^^^ +TBD + +UI Tests +-------- + +The UI tests are included in this document, so we'll have a complete set of +manual sanity tests in one place. + +Alarm Banner +^^^^^^^^^^^^ ++------------------------------------------------------------+--------------------------------------------------------+ +| What to execute | Expected results | ++============================================================+========================================================+ +| Go to compute->instances menu | The alarm banner should be on the top right corner | +| | with the correct number of alarms | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click on the alarm banner | You should be redirected to Vitrage alarms view | ++------------------------------------------------------------+--------------------------------------------------------+ + +Alarm View +^^^^^^^^^^ ++------------------------------------------------------------+--------------------------------------------------------+ +| What to execute | Expected results | ++============================================================+========================================================+ +| Raise an alarm of type ``doctor`` (examples above) | The alarm appears in the ``Active Alarms`` list | ++------------------------------------------------------------+--------------------------------------------------------+ +| Filter By alarm type ``doctor`` | Only ``doctor`` alarms remain | ++------------------------------------------------------------+--------------------------------------------------------+ +| Clear the ``doctor`` filter | All alarms appear | ++------------------------------------------------------------+--------------------------------------------------------+ +| Sort by name | Alarms are sorted | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click the RCA button for the ``High CPU load`` alarm | An RCA graph displays the alarms on the host and on | +| | the instance(s). Make sure all properties are ok. | ++------------------------------------------------------------+--------------------------------------------------------+ +| Switch to ``Alarm History`` tab | Several alarms should appear with different statuses. | +| | The alarms that are currently active should not have | +| | an ``Ended`` value. | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click the RCA button for one of the alarms | An RCA graph displays the alarm(s) as inactive. | ++------------------------------------------------------------+--------------------------------------------------------+ +| Change the ``Ended`` filter and click ``Fetch Alarms`` | The list of alarms is different | ++------------------------------------------------------------+--------------------------------------------------------+ +| Filter By resource type ``nova.host`` | Only alarms on the host are displayed | ++------------------------------------------------------------+--------------------------------------------------------+ +| Go back to ``Active Alarms`` | The list of active alarms is displayed | ++------------------------------------------------------------+--------------------------------------------------------+ + +Topology View +^^^^^^^^^^^^^ ++------------------------------------------------------------+--------------------------------------------------------+ +| What to execute | Expected results | ++============================================================+========================================================+ +| Go to ``Topology View`` | The sunburst shows the compute hierarchy in different | +| | colors. | ++------------------------------------------------------------+--------------------------------------------------------+ +| Switch tenants | The number of instances changes accordingly | ++------------------------------------------------------------+--------------------------------------------------------+ +| Drill down to the host and instances | The sunburst changes. On the left there may be alarms | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click the RCA button on one of the alarms | The RCA view is opened | ++------------------------------------------------------------+--------------------------------------------------------+ + +Entity Graph +^^^^^^^^^^^^ ++------------------------------------------------------------+--------------------------------------------------------+ +| What to execute | Expected results | ++============================================================+========================================================+ +| Open the ``Entity Graph``, zoom in and out | The graph changes accordingly | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click the ``Pin`` button, drag 1-2 entities, and refresh | The graph is not changed | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click the ``Unpin`` button | The graph is changed | ++------------------------------------------------------------+--------------------------------------------------------+ +| Double-click two entites to pin them and drag them to | The pinned entities stay in the same location. | +| different places. Then refresh the graph. | The rest of the graph is changed. | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click several entities, one at the time | The properties of the selected entity appear on the | +| | left panel | ++------------------------------------------------------------+--------------------------------------------------------+ +| Write a text in the search box | All entities with the selected text are highlighted | ++------------------------------------------------------------+--------------------------------------------------------+ +| Switch to a different tenant and see how the graph changes | There are less entities (all instances are gone) | ++------------------------------------------------------------+--------------------------------------------------------+ +| Filter by a specific Heat stack, modify the details level | The graph changes accordingly | ++------------------------------------------------------------+--------------------------------------------------------+ + +Template View +^^^^^^^^^^^^^ +Template View for tenant +~~~~~~~~~~~~~~~~~~~~~~~~ ++------------------------------------------------------------+--------------------------------------------------------+ +| What to execute | Expected results | ++============================================================+========================================================+ +| Open the ``Template`` view under ``Project->Vitrage``, | Few templates appear with ``Template validation is OK``| +| check the list of templates | Details. | +| | There are no Add and Delete buttons. | ++------------------------------------------------------------+--------------------------------------------------------+ +| Write a name in the filter | Only templates with this name appear | ++------------------------------------------------------------+--------------------------------------------------------+ +| Clear the filter | All templates appear | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click the ``Show`` icon | The template content is displayed | ++------------------------------------------------------------+--------------------------------------------------------+ +| Expand some of the entities, relationships and scenarios | The details are displayed | ++------------------------------------------------------------+--------------------------------------------------------+ +| Switch to ``Yaml View`` | A json representation is displayed | ++------------------------------------------------------------+--------------------------------------------------------+ +| Switch back to ``Simple View`` | The simple view is displayed | ++------------------------------------------------------------+--------------------------------------------------------+ ++------------------------------------------------------------+--------------------------------------------------------+ + +Template View for admin +~~~~~~~~~~~~~~~~~~~~~~~ ++------------------------------------------------------------+--------------------------------------------------------+ +| What to execute | Expected results | ++============================================================+========================================================+ +| Open the ``Template`` view under ``Admin->Vitrage`` and do | | +| the same checks as for tenant | | ++------------------------------------------------------------+--------------------------------------------------------+ +| Delete all existing templates | Templates are deleted, the list is empty | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click ``Add template`` and add v1_template.yaml. In the | ERROR: A template definition can not contain includes | +| ``Type`` drop-down, select ``definition`` | or scenarios blocks | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click ``Add template`` and add v1_template.yaml. In the | The template is added with status ``ACTIVE`` | +| ``Type`` drop-down, select ``standard`` | | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click ``Add template`` and add v2_definition_template.yaml | The template is added with status ``ACTIVE`` | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click ``Add template`` and add v2_equivalence.yaml | The template is added with status ``ACTIVE`` and | +| | and details ``No Validation`` | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click ``Show`` icon for templates of types standard (v1, | All templates are displayed correctly | +| v2 and v3), equivalence and definition | | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click ``Add template`` and add v2_wrong.yaml | ERROR: Action definition must contain action_target | +| | field. The template is not added. | ++------------------------------------------------------------+--------------------------------------------------------+ + +Templates with parameters +~~~~~~~~~~~~~~~~~~~~~~~~~ ++------------------------------------------------------------+--------------------------------------------------------+ +| What to execute | Expected results | ++============================================================+========================================================+ +| Click ``Add template`` and add v2_with_params.yaml | Error: Failed to resolve parameter - alarm_type | +| | The template is not added. | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click ``Add template`` and add v2_with_params.yaml. Add | Error: Failed to resolve parameter - alarm_name | +| parameter alarm_type. | The template is not added. | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click ``Add template`` and add v2_with_params.yaml. Add | The template is added with status ``ACTIVE`` | +| parameters alarm_type, alarm_name, template_name and | | +| new_state. Add and remove another parameter before | | +| clicking Done. | | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click the ``Show`` icon | There is no ``parameters`` section. All parameters are | +| | resolved with the given values. | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click ``Add template`` and add v2_with_params.yaml. Add | The template is added with status ``ACTIVE`` | +| parameters alarm_type and alarm_name only | | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click the ``Show`` icon | There is no ``parameters`` section. alarm_type and | +| | alarm_name parameters are resolved with the given | +| | values. new_state has default value of ERROR. | ++------------------------------------------------------------+--------------------------------------------------------+ +| Perform similar tests for v3_with_params.yaml | | ++------------------------------------------------------------+--------------------------------------------------------+ +| Click ``Add template`` and add v3_with_default_params.yaml | The template is added with status ``ACTIVE`` | ++------------------------------------------------------------+--------------------------------------------------------+ diff --git a/doc/source/contributor/manual_tests/switch_and_nic.yaml b/doc/source/contributor/manual_tests/switch_and_nic.yaml new file mode 100644 index 000000000..ca27a533b --- /dev/null +++ b/doc/source/contributor/manual_tests/switch_and_nic.yaml @@ -0,0 +1,19 @@ +metadata: + description: static configuration with switches + name: switch_and_nic +definitions: + entities: + - id: 12345 + name: nic-1 + static_id: nic-1 + type: nic + state: available + - id: 23456 + name: switch-2 + static_id: switch-2 + type: switch + state: available + relationships: + - relationship_type: attached + source: nic-1 + target: switch-2 diff --git a/doc/source/contributor/manual_tests/templates/v1_template.yaml b/doc/source/contributor/manual_tests/templates/v1_template.yaml new file mode 100644 index 000000000..701373bf1 --- /dev/null +++ b/doc/source/contributor/manual_tests/templates/v1_template.yaml @@ -0,0 +1,30 @@ +metadata: + name: v1_template + description: v1 template +definitions: + entities: + - entity: + category: ALARM + type: doctor + name: High cpu load + template_id: alarm + - entity: + category: RESOURCE + type: nova.host + template_id: host + relationships: + - relationship: + source: alarm + relationship_type: on + target: host + template_id : alarm_on_host +scenarios: + - scenario: + condition: alarm_on_host + actions: + - action: + action_type: set_state + action_target: + target: host + properties: + state: SUBOPTIMAL diff --git a/doc/source/contributor/manual_tests/templates/v2_definition_template.yaml b/doc/source/contributor/manual_tests/templates/v2_definition_template.yaml new file mode 100644 index 000000000..c8ebcee72 --- /dev/null +++ b/doc/source/contributor/manual_tests/templates/v2_definition_template.yaml @@ -0,0 +1,22 @@ +metadata: + version: 2 + type: definition + name: definition_template + description: A template that contains only definitions +definitions: + entities: + - entity: + category: ALARM + type: nagios + name: High memory consumption + template_id: alarm + - entity: + category: RESOURCE + type: nova.host + template_id: resource + relationships: + - relationship: + source: alarm + target: resource + relationship_type: on + template_id : alarm_on_host diff --git a/doc/source/contributor/manual_tests/templates/v2_equivalence.yaml b/doc/source/contributor/manual_tests/templates/v2_equivalence.yaml new file mode 100644 index 000000000..e3b403083 --- /dev/null +++ b/doc/source/contributor/manual_tests/templates/v2_equivalence.yaml @@ -0,0 +1,23 @@ +metadata: + version: 2 + type: equivalence + name: entity equivalence example +equivalences: + - equivalence: + - entity: + category: ALARM + type: nagios + name: cpu_high + - entity: + category: ALARM + type: vitrage + name: cpu_high + - equivalence: + - entity: + category: ALARM + type: nagios + name: mem_low + - entity: + category: ALARM + type: vitrage + name: mem_low diff --git a/doc/source/contributor/manual_tests/templates/v2_high_cpu_load.yaml b/doc/source/contributor/manual_tests/templates/v2_high_cpu_load.yaml new file mode 100644 index 000000000..463f518bd --- /dev/null +++ b/doc/source/contributor/manual_tests/templates/v2_high_cpu_load.yaml @@ -0,0 +1,75 @@ +metadata: + name: v2_high_cpu_load + version: 2 + type: standard + description: High cpu load template +definitions: + entities: + - entity: + category: ALARM + type: doctor + name: High CPU load + template_id: host_alarm + - entity: + category: ALARM + type: vitrage + name: Instance memory performance degraded + template_id: instance_alarm + - entity: + category: RESOURCE + type: nova.instance + template_id: instance + - entity: + category: RESOURCE + type: nova.host + template_id: host + relationships: + - relationship: + source: host_alarm + relationship_type: on + target: host + template_id : alarm_on_host + - relationship: + source: host + relationship_type: contains + target: instance + template_id : host_contains_instance + - relationship: + source: instance_alarm + relationship_type: on + target: instance + template_id : alarm_on_instance +scenarios: + - scenario: + condition: alarm_on_host and host_contains_instance + actions: + - action: + action_type: raise_alarm + action_target: + target: instance + properties: + alarm_name: Instance memory performance degraded + severity: warning + - scenario: + condition: alarm_on_host and host_contains_instance and alarm_on_instance + actions: + - action: + action_type: add_causal_relationship + action_target: + source: host_alarm + target: instance_alarm + - action: + action_type: set_state + action_target: + target: instance + properties: + state: SUBOPTIMAL + - scenario: + condition: alarm_on_host + actions: + - action: + action_type: set_state + action_target: + target: host + properties: + state: SUBOPTIMAL diff --git a/doc/source/contributor/manual_tests/templates/v2_host_down.yaml b/doc/source/contributor/manual_tests/templates/v2_host_down.yaml new file mode 100644 index 000000000..fe42f7e91 --- /dev/null +++ b/doc/source/contributor/manual_tests/templates/v2_host_down.yaml @@ -0,0 +1,76 @@ +metadata: + version: 2 + type: standard + name: host_down + description: scenarios triggered by Doctor monitor 'compute.host.down' alarm +definitions: + entities: + - entity: + category: ALARM + name: compute.host.down + template_id: host_down_alarm + - entity: + category: ALARM + type: vitrage + name: Instance Down + template_id: instance_alarm + - entity: + category: RESOURCE + type: nova.instance + template_id: instance + - entity: + category: RESOURCE + type: nova.host + template_id: host + relationships: + - relationship: + source: host_down_alarm + relationship_type: on + target: host + template_id : host_down_alarm_on_host + - relationship: + source: host + relationship_type: contains + target: instance + template_id : host_contains_instance + - relationship: + source: instance_alarm + relationship_type: on + target: instance + template_id : alarm_on_instance +scenarios: + - scenario: + condition: host_down_alarm_on_host + actions: + - action: + action_type: set_state + action_target: + target: host + properties: + state: ERROR + - action: + action_type: mark_down + action_target: + target: host + - scenario: + condition: host_down_alarm_on_host and host_contains_instance + actions: + - action: + action_type: raise_alarm + action_target: + target: instance + properties: + alarm_name: Instance Down + severity: critical + - scenario: + condition: host_down_alarm_on_host and host_contains_instance and alarm_on_instance + actions: + - action: + action_type: add_causal_relationship + action_target: + source: host_down_alarm + target: instance_alarm + - action: + action_type: mark_down + action_target: + target: instance diff --git a/doc/source/contributor/manual_tests/templates/v2_with_include.yaml b/doc/source/contributor/manual_tests/templates/v2_with_include.yaml new file mode 100644 index 000000000..af9dc9a3f --- /dev/null +++ b/doc/source/contributor/manual_tests/templates/v2_with_include.yaml @@ -0,0 +1,28 @@ +metadata: + version: 2 + type: standard + name: template_with_include + description: a template that includes a definition template +includes: + - name: definition_template +definitions: + entities: + - entity: + category: ALARM + type: nagios + name: host_problem + template_id: alarm11 + - entity: + category: RESOURCE + type: nova.host + template_id: resource11 +scenarios: + - scenario: + condition: alarm_on_host + actions: + - action: + action_type: set_state + properties: + state: SUBOPTIMAL + action_target: + target: resource diff --git a/doc/source/contributor/manual_tests/templates/v2_with_invalid_include.yaml b/doc/source/contributor/manual_tests/templates/v2_with_invalid_include.yaml new file mode 100644 index 000000000..b4d849c26 --- /dev/null +++ b/doc/source/contributor/manual_tests/templates/v2_with_invalid_include.yaml @@ -0,0 +1,28 @@ +metadata: + version: 2 + type: standard + name: template_with_invalid_include + description: A template that tries to include a non-existing template +includes: + - name: non_existing_template +definitions: + entities: + - entity: + category: ALARM + type: nagios + name: host_problem + template_id: alarm11 + - entity: + category: RESOURCE + type: nova.host + template_id: resource11 +scenarios: + - scenario: + condition: alarm_on_host + actions: + - action: + action_type: set_state + properties: + state: SUBOPTIMAL + action_target: + target: resource diff --git a/doc/source/contributor/manual_tests/templates/v2_with_params.yaml b/doc/source/contributor/manual_tests/templates/v2_with_params.yaml new file mode 100644 index 000000000..b64f3feef --- /dev/null +++ b/doc/source/contributor/manual_tests/templates/v2_with_params.yaml @@ -0,0 +1,41 @@ +metadata: + version: 2 + type: standard + name: get_param(template_name) + description: template with parameters +parameters: + template_name: + description: the name of the template + default: template_with_params + alarm_type: + description: the type of the alarm + alarm_name: + new_state: + default: ERROR +definitions: + entities: + - entity: + category: ALARM + type: get_param(alarm_type) + name: get_param(alarm_name) + template_id: alarm + - entity: + category: RESOURCE + type: nova.host + template_id: resource + relationships: + - relationship: + source: alarm + target: resource + relationship_type: on + template_id : alarm_on_host +scenarios: + - scenario: + condition: alarm_on_host + actions: + - action: + action_type: set_state + properties: + state: get_param(new_state) + action_target: + target: resource diff --git a/doc/source/contributor/manual_tests/templates/v2_wrong.yaml b/doc/source/contributor/manual_tests/templates/v2_wrong.yaml new file mode 100644 index 000000000..07bbe4f7e --- /dev/null +++ b/doc/source/contributor/manual_tests/templates/v2_wrong.yaml @@ -0,0 +1,30 @@ +metadata: + version: 2 + type: standard + name: v2_low_swap_space + description: low swap space +definitions: + entities: + - entity: + category: ALARM + type: doctor + name: High CPU load + template_id: alarm + - entity: + category: RESOURCE + type: nova.host + template_id: host + relationships: + - relationship: + source: alarm + relationship_type: on + target: host + template_id : alarm_on_host +scenarios: + - scenario: + condition: alarm_on_host + actions: + - action: + action_type: set_state + properties: + state: SUBOPTIMAL diff --git a/doc/source/contributor/manual_tests/templates/v3_execute_mistral.yaml b/doc/source/contributor/manual_tests/templates/v3_execute_mistral.yaml new file mode 100644 index 000000000..9130f3fca --- /dev/null +++ b/doc/source/contributor/manual_tests/templates/v3_execute_mistral.yaml @@ -0,0 +1,17 @@ +metadata: + version: 3 + name: v3_execute_mistral + description: execute mistral + type: standard +entities: + alarm: + name: alarm_for_mistral + host: + type: nova.host +scenarios: + - condition: alarm [on] host + actions: + - execute_mistral: + workflow: workflow1 + input: + farewell: get_attr(host,name) diff --git a/doc/source/contributor/manual_tests/templates/v3_high_mem_consumption.yaml b/doc/source/contributor/manual_tests/templates/v3_high_mem_consumption.yaml new file mode 100644 index 000000000..0ea283634 --- /dev/null +++ b/doc/source/contributor/manual_tests/templates/v3_high_mem_consumption.yaml @@ -0,0 +1,31 @@ +metadata: + version: 3 + name: High memory consumption + description: Version 3 template of high memory consumption + type: standard +entities: + host_alarm: + type: zabbix + rawtext: host network interface is down + instance: + type: nova.instance + host: + type: nova.host + foo: + name.regex: kuku +scenarios: + - condition: host_alarm [ on ] host + actions: + - set_state: + state: ERROR + target: host + - condition: host_alarm [ on ] host AND host [ contains ] instance + actions: + - raise_alarm: + target: instance + alarm_name: Instance high memory consumption + severity: WARNING + causing_alarm: host_alarm + - set_state: + state: SUBOPTIMAL + target: instance diff --git a/doc/source/contributor/manual_tests/templates/v3_with_default_params.yaml b/doc/source/contributor/manual_tests/templates/v3_with_default_params.yaml new file mode 100644 index 000000000..021fabfee --- /dev/null +++ b/doc/source/contributor/manual_tests/templates/v3_with_default_params.yaml @@ -0,0 +1,23 @@ +metadata: + version: 3 + name: get_param(template_name) + description: execute mistral + type: standard +parameters: + template_name: + description: the name of the template + default: v3_with_default_params + alarm_name: + default: alarm1 +entities: + alarm: + name: get_param(alarm_name) + host: + type: nova.host +scenarios: + - condition: alarm [on] host + actions: + - execute_mistral: + workflow: workflow_1 + input: + hostname: get_attr(host,name) diff --git a/doc/source/contributor/manual_tests/templates/v3_with_params.yaml b/doc/source/contributor/manual_tests/templates/v3_with_params.yaml new file mode 100644 index 000000000..9bdae7ba7 --- /dev/null +++ b/doc/source/contributor/manual_tests/templates/v3_with_params.yaml @@ -0,0 +1,22 @@ +metadata: + version: 3 + name: get_param(template_name) + description: execute mistral + type: standard +parameters: + template_name: + description: the name of the template + alarm_name: + default: alarm1 +entities: + alarm: + name: get_param(alarm_name) + host: + type: nova.host +scenarios: + - condition: alarm [on] host + actions: + - execute_mistral: + workflow: workflow_1 + input: + hostname: get_attr(host,name) diff --git a/doc/source/contributor/manual_tests/test_web_server.py b/doc/source/contributor/manual_tests/test_web_server.py new file mode 100644 index 000000000..3b62baf37 --- /dev/null +++ b/doc/source/contributor/manual_tests/test_web_server.py @@ -0,0 +1,29 @@ +# Copyright 2019 - Nokia +# +# 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 web + +url = ( + '/alarm', 'Server' +) + + +class Server(object): + + def POST(self): + print('data:', web.data()) + + +if __name__ == "__main__": + app = web.application(url, globals()) + app.run() diff --git a/doc/source/contributor/manual_tests/workflow1.yaml b/doc/source/contributor/manual_tests/workflow1.yaml new file mode 100644 index 000000000..bf852a1bb --- /dev/null +++ b/doc/source/contributor/manual_tests/workflow1.yaml @@ -0,0 +1,11 @@ +--- +version: '2.0' + +workflow1: + type: direct + input: + - farewell + + tasks: + goodbye: + action: std.echo output="<% $.farewell %>, Tempest Test!"