def test_info_default_values(self, mock_rpc, mock_context, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} endpoint = nova_endpoint.NovaNotificationEndpoint( 'PROJECT', 'CLUSTER_ID', recover_action) ctx = mock.Mock() payload = { 'metadata': { 'cluster_id': 'CLUSTER_ID', 'cluster_node_id': 'NODE_ID' }, 'user_id': 'USER', } metadata = {'timestamp': 'TIMESTAMP'} call_ctx = mock.Mock() mock_context.return_value = call_ctx res = endpoint.info(ctx, 'PUBLISHER', 'compute.instance.shutdown.end', payload, metadata) self.assertIsNone(res) x_rpc.call.assert_called_once_with(call_ctx, 'node_recover', mock.ANY) req = x_rpc.call.call_args[0][2] self.assertIsInstance(req, objects.NodeRecoverRequest) self.assertEqual('NODE_ID', req.identity) expected_params = { 'event': 'SHUTDOWN', 'state': 'Unknown', 'instance_id': 'Unknown', 'timestamp': 'TIMESTAMP', 'publisher': 'PUBLISHER', 'operation': 'REBUILD', } self.assertEqual(expected_params, req.params)
def test_init(self, mock_rpc, mock_filter): x_filter = mock_filter.return_value event_map = { 'compute.instance.pause.end': 'PAUSE', 'compute.instance.power_off.end': 'POWER_OFF', 'compute.instance.rebuild.error': 'REBUILD', 'compute.instance.shutdown.end': 'SHUTDOWN', 'compute.instance.soft_delete.end': 'SOFT_DELETE', } recover_action = {'operation': 'REBUILD'} endpoint = nova_endpoint.NovaNotificationEndpoint( 'PROJECT', 'CLUSTER_ID', recover_action) mock_filter.assert_called_once_with( publisher_id='^compute.*', event_type='^compute\.instance\..*', context={'project_id': '^PROJECT$'}) mock_rpc.assert_called_once_with() self.assertEqual(x_filter, endpoint.filter_rule) self.assertEqual(mock_rpc.return_value, endpoint.rpc) for e in event_map: self.assertIn(e, endpoint.VM_FAILURE_EVENTS) self.assertEqual(event_map[e], endpoint.VM_FAILURE_EVENTS[e]) self.assertEqual('PROJECT', endpoint.project_id) self.assertEqual('CLUSTER_ID', endpoint.cluster_id)
def ListenerProc(exchange, project_id, cluster_id, recover_action): """Thread procedure for running an event listener. :param exchange: The control exchange for a target service. :param project_id: The ID of the project to filter. :param cluster_id: The ID of the cluster to filter. :param recover_action: The health policy action name. """ transport = messaging.get_notification_transport(cfg.CONF) if exchange == cfg.CONF.health_manager.nova_control_exchange: endpoint = nova_endpoint.NovaNotificationEndpoint( project_id, cluster_id, recover_action) else: endpoint = heat_endpoint.HeatNotificationEndpoint( project_id, cluster_id, recover_action) listener = messaging.get_notification_listener(transport, [endpoint.target], [endpoint], executor='threading', pool='senlin-listeners') listener.start()
def test_info_no_metadata(self, mock_rpc, mock_filter): x_rpc = mock_rpc.return_value recover_action = {'operation': 'REBUILD'} endpoint = nova_endpoint.NovaNotificationEndpoint( 'PROJECT', 'CLUSTER_ID', recover_action) ctx = mock.Mock() payload = {'metadata': {}} metadata = {'timestamp': 'TIMESTAMP'} res = endpoint.info(ctx, 'PUBLISHER', 'compute.instance.delete.end', payload, metadata) self.assertIsNone(res) self.assertEqual(0, x_rpc.node_recover.call_count)