
* remove unused methods * use testools assert exceptions * use tearDown where possible * redundant str() Change-Id: I18af00599461ead7bf9084168aeed7321adfd4c0
275 lines
10 KiB
Python
275 lines
10 KiB
Python
# Copyright 2017 - 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 time
|
|
|
|
from oslo_log import log as logging
|
|
|
|
from vitrage_tempest_plugin.tests.common.constants import DOCTOR_DATASOURCE
|
|
from vitrage_tempest_plugin.tests.common.constants import EntityCategory
|
|
from vitrage_tempest_plugin.tests.common.constants import VertexProperties \
|
|
as VProps
|
|
from vitrage_tempest_plugin.tests.common.constants import VITRAGE_DATASOURCE
|
|
from vitrage_tempest_plugin.tests.common import general_utils as g_utils
|
|
from vitrage_tempest_plugin.tests.common import nova_utils
|
|
from vitrage_tempest_plugin.tests.common.tempest_clients import TempestClients
|
|
from vitrage_tempest_plugin.tests.common import vitrage_utils as v_utils
|
|
from vitrage_tempest_plugin.tests.e2e.test_actions_base import TestActionsBase
|
|
from vitrage_tempest_plugin.tests import utils
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
TRIGGER_ALARM_1 = 'e2e.test_basic_actions.trigger.alarm1'
|
|
TRIGGER_ALARM_2 = 'e2e.test_basic_actions.trigger.alarm2'
|
|
TRIGGER_ALARM_3 = 'e2e.test_basic_actions.trigger.alarm3'
|
|
TRIGGER_ALARM_4 = 'e2e.test_basic_actions.trigger.alarm4'
|
|
TRIGGER_ALARM_5 = 'e2e.test_basic_actions.trigger.alarm5'
|
|
DEDUCED = 'e2e.test_basic_actions.deduced.alarm'
|
|
|
|
TRIGGER_ALARM_1_V3 = 'e2e.test_basic_actions.trigger.alarm1.v3'
|
|
TRIGGER_ALARM_2_V3 = 'e2e.test_basic_actions.trigger.alarm2.v3'
|
|
TRIGGER_ALARM_3_V3 = 'e2e.test_basic_actions.trigger.alarm3.v3'
|
|
TRIGGER_ALARM_4_V3 = 'e2e.test_basic_actions.trigger.alarm4.v3'
|
|
TRIGGER_ALARM_5_V3 = 'e2e.test_basic_actions.trigger.alarm5.v3'
|
|
TRIGGER_ALARM_6_V3 = 'e2e.test_basic_actions.trigger.alarm6.v3'
|
|
DEDUCED_V3 = 'e2e.test_basic_actions.deduced.alarm.v3'
|
|
|
|
TRIGGER_ALARM_2_PROPS = {
|
|
VProps.NAME: TRIGGER_ALARM_2,
|
|
VProps.VITRAGE_CATEGORY: EntityCategory.ALARM,
|
|
VProps.VITRAGE_TYPE: DOCTOR_DATASOURCE,
|
|
}
|
|
|
|
TRIGGER_ALARM_2_PROPS_V3 = {
|
|
VProps.NAME: TRIGGER_ALARM_2_V3,
|
|
VProps.VITRAGE_CATEGORY: EntityCategory.ALARM,
|
|
VProps.VITRAGE_TYPE: DOCTOR_DATASOURCE,
|
|
}
|
|
|
|
TRIGGER_ALARM_6_PROPS_V3 = {
|
|
VProps.NAME: TRIGGER_ALARM_6_V3,
|
|
VProps.VITRAGE_CATEGORY: EntityCategory.ALARM,
|
|
VProps.VITRAGE_TYPE: DOCTOR_DATASOURCE,
|
|
}
|
|
|
|
DEDUCED_PROPS = {
|
|
VProps.NAME: DEDUCED,
|
|
VProps.VITRAGE_CATEGORY: EntityCategory.ALARM,
|
|
VProps.VITRAGE_TYPE: VITRAGE_DATASOURCE,
|
|
}
|
|
|
|
DEDUCED_PROPS_V3 = {
|
|
VProps.NAME: DEDUCED_V3,
|
|
VProps.VITRAGE_CATEGORY: EntityCategory.ALARM,
|
|
VProps.VITRAGE_TYPE: VITRAGE_DATASOURCE,
|
|
}
|
|
|
|
|
|
class TestBasicActions(TestActionsBase):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(TestBasicActions, cls).setUpClass()
|
|
cls._templates = []
|
|
cls._templates.append(
|
|
v_utils.add_template("e2e_test_basic_actions.yaml"))
|
|
cls._templates.append(
|
|
v_utils.add_template("e2e_test_basic_actions_v3.yaml"))
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
for t in cls._templates:
|
|
v_utils.delete_template(t['uuid'])
|
|
|
|
@utils.tempest_logger
|
|
def test_action_set_state_host(self):
|
|
self._do_test_action_set_state_host(TRIGGER_ALARM_1)
|
|
|
|
@utils.tempest_logger
|
|
def test_action_set_state_host_v3(self):
|
|
self._do_test_action_set_state_host(TRIGGER_ALARM_1_V3)
|
|
|
|
def _do_test_action_set_state_host(self, trigger_name):
|
|
try:
|
|
|
|
# Do
|
|
self._trigger_do_action(trigger_name)
|
|
curr_host = v_utils.get_first_host()
|
|
self.assertEqual(
|
|
'ERROR',
|
|
curr_host.get(VProps.VITRAGE_AGGREGATED_STATE),
|
|
'state should change after set_state action')
|
|
|
|
# Undo
|
|
self._trigger_undo_action(trigger_name)
|
|
curr_host = v_utils.get_first_host()
|
|
self.assertEqual(
|
|
self.orig_host.get(VProps.VITRAGE_AGGREGATED_STATE),
|
|
curr_host.get(VProps.VITRAGE_AGGREGATED_STATE),
|
|
'state should change after undo set_state action')
|
|
finally:
|
|
self._trigger_undo_action(trigger_name)
|
|
|
|
@utils.tempest_logger
|
|
def test_action_set_state_instance(self):
|
|
self._do_test_action_set_state_instance(TRIGGER_ALARM_3)
|
|
|
|
@utils.tempest_logger
|
|
def test_action_set_state_instance_v3(self):
|
|
self._do_test_action_set_state_instance(TRIGGER_ALARM_3_V3)
|
|
|
|
def _do_test_action_set_state_instance(self, trigger_name):
|
|
|
|
vm_id = ""
|
|
try:
|
|
vm_id = nova_utils.create_instances(set_public_network=True)[0].id
|
|
|
|
# Do
|
|
orig_instance = v_utils.get_first_instance(id=vm_id)
|
|
self._trigger_do_action(trigger_name)
|
|
curr_instance = v_utils.get_first_instance(id=vm_id)
|
|
self.assertEqual(
|
|
'ERROR',
|
|
curr_instance.get(VProps.VITRAGE_AGGREGATED_STATE),
|
|
'state should change after set_state action')
|
|
|
|
# Undo
|
|
self._trigger_undo_action(trigger_name)
|
|
curr_instance = v_utils.get_first_instance(id=vm_id)
|
|
self.assertEqual(
|
|
orig_instance.get(VProps.VITRAGE_AGGREGATED_STATE),
|
|
curr_instance.get(VProps.VITRAGE_AGGREGATED_STATE),
|
|
'state should change after undo set_state action')
|
|
finally:
|
|
self._trigger_undo_action(trigger_name)
|
|
nova_utils.delete_all_instances(id=vm_id)
|
|
|
|
@utils.tempest_logger
|
|
def test_action_mark_down_host(self):
|
|
self._do_test_action_mark_down_host(TRIGGER_ALARM_4)
|
|
|
|
@utils.tempest_logger
|
|
def test_action_mark_down_host_v3(self):
|
|
self._do_test_action_mark_down_host(TRIGGER_ALARM_4_V3)
|
|
|
|
def _do_test_action_mark_down_host(self, trigger_name):
|
|
try:
|
|
host_name = self.orig_host.get(VProps.NAME)
|
|
|
|
# Do
|
|
self._trigger_do_action(trigger_name)
|
|
nova_service = TempestClients.nova().services.list(
|
|
host=host_name, binary='nova-compute')[0]
|
|
self.assertEqual("down", nova_service.state)
|
|
|
|
# Undo
|
|
self._trigger_undo_action(trigger_name)
|
|
nova_service = TempestClients.nova().services.list(
|
|
host=host_name, binary='nova-compute')[0]
|
|
self.assertEqual("up", nova_service.state)
|
|
finally:
|
|
self._trigger_undo_action(trigger_name)
|
|
# nova.host datasource may take up to snapshot_intreval to update
|
|
time.sleep(130)
|
|
|
|
@utils.tempest_logger
|
|
def test_action_mark_down_instance(self):
|
|
self._do_test_action_mark_down_instance(TRIGGER_ALARM_5)
|
|
|
|
@utils.tempest_logger
|
|
def test_action_mark_down_instance_v3(self):
|
|
self._do_test_action_mark_down_instance(TRIGGER_ALARM_5_V3)
|
|
|
|
def _do_test_action_mark_down_instance(self, trigger_name):
|
|
vm_id = ""
|
|
try:
|
|
vm_id = nova_utils.create_instances(set_public_network=True)[0].id
|
|
# Do
|
|
self._trigger_do_action(trigger_name)
|
|
nova_instance = TempestClients.nova().servers.get(vm_id)
|
|
self.assertEqual("ERROR", nova_instance.status)
|
|
|
|
# Undo
|
|
self._trigger_undo_action(trigger_name)
|
|
nova_instance = TempestClients.nova().servers.get(vm_id)
|
|
self.assertEqual("ACTIVE", nova_instance.status)
|
|
finally:
|
|
self._trigger_undo_action(trigger_name)
|
|
nova_utils.delete_all_instances(id=vm_id)
|
|
|
|
@utils.tempest_logger
|
|
def test_action_deduce_alarm(self):
|
|
self._do_test_action_deduce_alarm(TRIGGER_ALARM_2, DEDUCED_PROPS)
|
|
|
|
@utils.tempest_logger
|
|
def test_action_deduce_alarm_v3(self):
|
|
self._do_test_action_deduce_alarm(TRIGGER_ALARM_2_V3, DEDUCED_PROPS_V3)
|
|
|
|
def _do_test_action_deduce_alarm(self, trigger_name, deduced_props):
|
|
try:
|
|
host_id = self.orig_host.get(VProps.VITRAGE_ID)
|
|
|
|
# Do
|
|
self._trigger_do_action(trigger_name)
|
|
self._check_deduced(1, deduced_props, host_id)
|
|
|
|
# Undo
|
|
self._trigger_undo_action(trigger_name)
|
|
self._check_deduced(0, deduced_props, host_id)
|
|
finally:
|
|
self._trigger_undo_action(trigger_name)
|
|
|
|
@utils.tempest_logger
|
|
def test_action_add_causal_relationship(self):
|
|
self._do_test_action_add_causal_relationship(TRIGGER_ALARM_2,
|
|
DEDUCED_PROPS,
|
|
TRIGGER_ALARM_2_PROPS)
|
|
|
|
@utils.tempest_logger
|
|
def test_action_add_causal_relationship_v3(self):
|
|
self._do_test_action_add_causal_relationship(TRIGGER_ALARM_2_V3,
|
|
DEDUCED_PROPS_V3,
|
|
TRIGGER_ALARM_2_PROPS_V3)
|
|
|
|
@utils.tempest_logger
|
|
def test_action_add_raise_alarm_with_causing_alarm(self):
|
|
self._do_test_action_add_causal_relationship(TRIGGER_ALARM_6_V3,
|
|
DEDUCED_PROPS_V3,
|
|
TRIGGER_ALARM_6_PROPS_V3)
|
|
|
|
def _do_test_action_add_causal_relationship(self,
|
|
trigger_name,
|
|
deduced_props,
|
|
trigger_alarm_props):
|
|
try:
|
|
# Do
|
|
self._trigger_do_action(trigger_name)
|
|
alarms = self.vitrage_client.alarm.list(
|
|
vitrage_id=self.orig_host.get(VProps.VITRAGE_ID),
|
|
all_tenants=True)
|
|
self.assertTrue(len(alarms) >= 2, 'alarms %s' % alarms)
|
|
|
|
deduced = g_utils.first_match(alarms, **deduced_props)
|
|
trigger = g_utils.first_match(alarms, **trigger_alarm_props)
|
|
|
|
# Get Rca for the deduced
|
|
rca = self.vitrage_client.rca.get(deduced[VProps.VITRAGE_ID],
|
|
all_tenants=True)
|
|
self._check_rca(rca, [deduced, trigger], deduced_props)
|
|
|
|
# Get Rca for the trigger
|
|
rca = self.vitrage_client.rca.get(trigger[VProps.VITRAGE_ID],
|
|
all_tenants=True)
|
|
self._check_rca(rca, [deduced, trigger], trigger_alarm_props)
|
|
finally:
|
|
self._trigger_undo_action(trigger_name)
|