diff --git a/vitrage/datasources/alarm_transformer_base.py b/vitrage/datasources/alarm_transformer_base.py index 0e397cdbd..cca09f296 100644 --- a/vitrage/datasources/alarm_transformer_base.py +++ b/vitrage/datasources/alarm_transformer_base.py @@ -39,15 +39,18 @@ class AlarmTransformerBase(tbase.TransformerBase): def _extract_action_type(self, entity_event): # TODO(ifat_afek): this method should reside together with the cache, # in the transformer code - if DSProps.EVENT_TYPE in entity_event: + if DSProps.EVENT_TYPE in entity_event and \ + entity_event[DSProps.EVENT_TYPE] == EventAction.DELETE_ENTITY: return entity_event[DSProps.EVENT_TYPE] sync_mode = entity_event[DSProps.SYNC_MODE] if sync_mode in (SyncMode.UPDATE, SyncMode.SNAPSHOT): return EventAction.DELETE_ENTITY if self._ok_status(entity_event) \ else EventAction.UPDATE_ENTITY + if SyncMode.INIT_SNAPSHOT == sync_mode: return EventAction.CREATE_ENTITY + raise VitrageTransformerError('Invalid sync mode: (%s)' % sync_mode) def _key_values(self, *args): diff --git a/vitrage/datasources/nova/instance/driver.py b/vitrage/datasources/nova/instance/driver.py index 6cbef7280..4b096008b 100644 --- a/vitrage/datasources/nova/instance/driver.py +++ b/vitrage/datasources/nova/instance/driver.py @@ -60,9 +60,9 @@ class InstanceDriver(NovaDriverBase): 'compute.instance.rebuild.end', 'compute.instance.resize.end', 'compute.instance.resize.revert.end', - 'compute.instance.resume', + 'compute.instance.resume.end', 'compute.instance.shutdown.end', - 'compute.instance.suspend', + 'compute.instance.suspend.end', 'compute.instance.volume.attach', 'compute.instance.volume.detach', 'compute.instance.pause.end', diff --git a/vitrage_tempest_tests/tests/api/base.py b/vitrage_tempest_tests/tests/api/base.py index e2178b04f..5224e97c3 100644 --- a/vitrage_tempest_tests/tests/api/base.py +++ b/vitrage_tempest_tests/tests/api/base.py @@ -58,14 +58,15 @@ class BaseApiTest(base.BaseTestCase): def _create_volume_and_attach(self, name, size, instance_id, mount_point): volume = self.cinder_client.volumes.create(display_name=name, size=size) - time.sleep(3) + time.sleep(2) self.cinder_client.volumes.attach(volume=volume, instance_uuid=instance_id, mountpoint=mount_point) - self._wait_for_status(20, + self._wait_for_status(30, self._check_num_volumes, - num_volumes=1) + num_volumes=1, + state='in-use') time.sleep(2) @@ -80,9 +81,10 @@ class BaseApiTest(base.BaseTestCase): flavor=flavors_list[0], image=images_list[0]) for index in range(num_instances)] - self._wait_for_status(20, + self._wait_for_status(30, self._check_num_instances, - num_instances=num_instances) + num_instances=num_instances, + state='active') time.sleep(2) return resources @@ -95,7 +97,7 @@ class BaseApiTest(base.BaseTestCase): except Exception: pass - self._wait_for_status(20, + self._wait_for_status(30, self._check_num_instances, num_instances=0) @@ -116,11 +118,20 @@ class BaseApiTest(base.BaseTestCase): time.sleep(2) - def _check_num_instances(self, num_instances=0): - return len(self.nova_client.servers.list()) == num_instances + def _check_num_instances(self, num_instances=0, state=''): + if len(self.nova_client.servers.list()) != num_instances: + return False - def _check_num_volumes(self, num_volumes=0): - return len(self.cinder_client.volumes.list()) == num_volumes + return all(instance.__dict__['status'].upper() == state.upper() + for instance in self.nova_client.servers.list()) + + def _check_num_volumes(self, num_volumes=0, state=''): + if len(self.cinder_client.volumes.list()) != num_volumes: + return False + + return all(volume.__dict__['status'].upper() == state.upper() and + len(volume.__dict__['attachments']) == 1 + for volume in self.cinder_client.volumes.list()) @staticmethod def _create_graph_from_graph_dictionary(api_graph): diff --git a/vitrage_tempest_tests/tests/api/datasources/test_aodh.py b/vitrage_tempest_tests/tests/api/datasources/test_aodh.py index 24010d7d5..1bc101b29 100644 --- a/vitrage_tempest_tests/tests/api/datasources/test_aodh.py +++ b/vitrage_tempest_tests/tests/api/datasources/test_aodh.py @@ -42,6 +42,8 @@ class TestAodhAlarm(BaseApiTest): instance_entities=1, instance_edges=2, aodh_entities=1, aodh_edges=1) self._validate_graph_correctness(graph, 5, 4, entities) + except Exception as e: + LOG.exception(e) finally: self._delete_ceilometer_alarms() self._delete_instances() @@ -56,28 +58,35 @@ class TestAodhAlarm(BaseApiTest): host_entities=1, host_edges=1, aodh_entities=1, aodh_edges=0) self._validate_graph_correctness(graph, 4, 2, entities) + except Exception as e: + LOG.exception(e) finally: self._delete_ceilometer_alarms() def _create_ceilometer_alarm(self, resource_id=None): aodh_request = self._aodh_request(resource_id=resource_id) self.ceilometer_client.alarms.create(**aodh_request) - self._wait_for_status(20, + self._wait_for_status(30, self._check_num_alarms, - num_alarms=1) + num_alarms=1, + state='alarm') time.sleep(25) def _delete_ceilometer_alarms(self): alarms = self.ceilometer_client.alarms.list() for alarm in alarms: self.ceilometer_client.alarms.delete(alarm.alarm_id) - self._wait_for_status(20, + self._wait_for_status(30, self._check_num_alarms, num_alarms=0) time.sleep(25) - def _check_num_alarms(self, num_alarms=0): - return len(self.ceilometer_client.alarms.list()) == num_alarms + def _check_num_alarms(self, num_alarms=0, state=''): + if len(self.ceilometer_client.alarms.list()) != num_alarms: + return False + + return all(alarm.__dict__['state'].upper() == state.upper() + for alarm in self.ceilometer_client.alarms.list()) def _aodh_request(self, resource_id=None): query = [] diff --git a/vitrage_tempest_tests/tests/api/datasources/test_cinder_volume.py b/vitrage_tempest_tests/tests/api/datasources/test_cinder_volume.py index 576038af0..86ab03d2d 100644 --- a/vitrage_tempest_tests/tests/api/datasources/test_cinder_volume.py +++ b/vitrage_tempest_tests/tests/api/datasources/test_cinder_volume.py @@ -35,5 +35,7 @@ class TestCinderVolume(BaseTopologyTest): instance_entities=3, instance_edges=4, volume_entities=1, volume_edges=1) self._validate_graph_correctness(graph, 7, 6, entities) + except Exception as e: + LOG.exception(e) finally: self._rollback_to_default() diff --git a/vitrage_tempest_tests/tests/api/datasources/test_nova.py b/vitrage_tempest_tests/tests/api/datasources/test_nova.py index 372157982..ee69a78a9 100644 --- a/vitrage_tempest_tests/tests/api/datasources/test_nova.py +++ b/vitrage_tempest_tests/tests/api/datasources/test_nova.py @@ -34,5 +34,7 @@ class TestNova(BaseTopologyTest): host_entities=1, host_edges=4, instance_entities=3, instance_edges=3) self._validate_graph_correctness(graph, 6, 5, entities) + except Exception as e: + LOG.exception(e) finally: self._rollback_to_default() diff --git a/vitrage_tempest_tests/tests/api/datasources/test_static_physical.py b/vitrage_tempest_tests/tests/api/datasources/test_static_physical.py index 632b6430d..0e4659607 100644 --- a/vitrage_tempest_tests/tests/api/datasources/test_static_physical.py +++ b/vitrage_tempest_tests/tests/api/datasources/test_static_physical.py @@ -39,6 +39,8 @@ class TestStaticPhysical(BaseApiTest): host_entities=1, host_edges=3, switch_entities=2, switch_edges=2) self._validate_graph_correctness(graph, 5, 4, entities) + except Exception as e: + LOG.exception(e) finally: self._delete_switches() diff --git a/vitrage_tempest_tests/tests/api/topology/base.py b/vitrage_tempest_tests/tests/api/topology/base.py index 00d162594..beae27ef9 100644 --- a/vitrage_tempest_tests/tests/api/topology/base.py +++ b/vitrage_tempest_tests/tests/api/topology/base.py @@ -45,6 +45,7 @@ class BaseTopologyTest(BaseApiTest): self._create_volume_and_attach('volume-1', 1, resources[0].__dict__['id'], '/tmp/vda') + # waiting until all the entities creation were processed by the # entity graph processor time.sleep(end_sleep) @@ -55,7 +56,7 @@ class BaseTopologyTest(BaseApiTest): # waiting until all the entities deletion were processed by the # entity graph processor - time.sleep(5) + time.sleep(2) @staticmethod def _compare_graphs(api_graph, cli_graph): diff --git a/vitrage_tempest_tests/tests/api/topology/test_topology.py b/vitrage_tempest_tests/tests/api/topology/test_topology.py index 20865d52a..01ee52511 100644 --- a/vitrage_tempest_tests/tests/api/topology/test_topology.py +++ b/vitrage_tempest_tests/tests/api/topology/test_topology.py @@ -45,6 +45,8 @@ class TestTopology(BaseTopologyTest): instance_entities=3, instance_edges=4, volume_entities=1, volume_edges=1) self._validate_graph_correctness(graph, 7, 6, entities) + except Exception as e: + LOG.exception(e) finally: self._rollback_to_default() @@ -59,6 +61,8 @@ class TestTopology(BaseTopologyTest): host_entities=1, host_edges=4, instance_entities=3, instance_edges=3) self._validate_graph_correctness(graph, 6, 5, entities) + except Exception as e: + LOG.exception(e) finally: self._rollback_to_default() @@ -72,18 +76,22 @@ class TestTopology(BaseTopologyTest): host_entities=1, host_edges=4, instance_entities=3, instance_edges=3) self._validate_graph_correctness(graph, 6, 5, entities) + except Exception as e: + LOG.exception(e) finally: self._rollback_to_default() def test_tree_with_query(self): try: # create entities - self._create_entities(num_instances=3, end_sleep=10) + self._create_entities(num_instances=3) api_graph = self.vitrage_client.topology.get( graph_type='tree', query=self._tree_query()) graph = self._create_graph_from_tree_dictionary(api_graph) entities = self._entities_validation_data( host_entities=1, host_edges=1) self._validate_graph_correctness(graph, 3, 2, entities) + except Exception as e: + LOG.exception(e) finally: self._rollback_to_default()