def test_georep_checkpoint_completed(strftime, load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) strftime.return_value = "01 Jan 1970 05:50:34" event = {"message": {"master_node": "node1", "master_volume": "v1", "brick_path": "/gluster/b1", "slave_host": "node2", "slave_volume": "volume1", "checkpoint_time": "1234", "checkpoint_completion_time": "2345" }, "event": "GEOREP", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().georep_checkpoint_completed(event) NS.gluster.objects.NativeEvents.assert_called_with( 'georep_checkpoint_completed|node1:v1:/gluster' '/b1--->node2:volume1', alert_notify=True, current_value='georep_checkpoint_completed', message='Georeplication checkpoint completed for pair ' 'node1:v1:/gluster/b1--->node2:volume1. ' 'Check point creation time 01 Jan 1970 05:50:34. ' 'Check point completion time 01 Jan 1970 05:50:34.' ' in cluster 77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='info' )
def test_posix_health_check_failed(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) event = {"message": {"brick": "b1", "path": "/gluster", "error": "test_error", "op": "testing" }, "event": "POSIX_HEALTH_CHECK_FAILED", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().posix_health_check_failed(event) NS.gluster.objects.NativeEvents.assert_called_with( 'posix_health_check_failed|b1/gluster', alert_notify=True, current_value='posix_health_check_failed', message='Posix health check failed for brick: b1. Path: ' '/gluster in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a. Error: ' 'test_error. op: testing', severity='warning' )
def test_georep_checkpoint_completed(strftime, load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a") strftime.return_value = "01 Jan 1970 05:50:34" event = { "message": { "master_node": "node1", "master_volume": "v1", "brick_path": "/gluster/b1", "slave_host": "node2", "slave_volume": "volume1", "checkpoint_time": "1234", "checkpoint_completion_time": "2345" }, "event": "GEOREP", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().georep_checkpoint_completed(event) NS.gluster.objects.NativeEvents.assert_called_with( 'georep_checkpoint_completed|node1:v1:/gluster' '/b1--->node2:volume1', alert_notify=True, current_value='georep_checkpoint_completed', message='Georeplication checkpoint completed for pair ' 'node1:v1:/gluster/b1--->node2:volume1. ' 'Check point creation time 01 Jan 1970 05:50:34. ' 'Check point completion time 01 Jan 1970 05:50:34.' ' in cluster 77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='info')
def test_posix_health_check_failed(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a") event = { "message": { "brick": "b1", "path": "/gluster", "error": "test_error", "op": "testing" }, "event": "POSIX_HEALTH_CHECK_FAILED", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().posix_health_check_failed(event) NS.gluster.objects.NativeEvents.assert_called_with( 'posix_health_check_failed|b1/gluster', alert_notify=True, current_value='posix_health_check_failed', message='Posix health check failed for brick: b1. Path: ' '/gluster in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a. Error: ' 'test_error. op: testing', severity='warning')
def test_volume_delete(load, save, load_all, sleep): init() keys = maps.NamedDict(key="sub_vol1/dhcp123-12.lab.abc.com:|gluster|b1") load.return_value = maps.NamedDict( brick_path="/gluster/b1", short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a") save.return_value = True obj = NS.gluster.objects.Volume() obj.name = "v1" obj.vol_id = "0f5b4b99-fa4a-4b8f-be52-770b42879d67" load_all.return_value = [obj] sleep.return_value = True monitoring_utils.update_dashboard = MagicMock() monitoring_utils.delete_resource_from_graphite = MagicMock() event = { "message": { "name": "v1" }, "event": "VOLUME_DELETE", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } with patch.object(etcd_utils, "read") as read: read.return_value = maps.NamedDict(leaves=[keys], value="/gluster/b1") with patch.object(etcd_utils, "delete") as delete: delete.return_value = True Callback().volume_delete(event) monitoring_utils.delete_resource_from_graphite.assert_called_with( 'v1', 'volume', '77deef29-b8e5-4dc5-8247-21e2a409a66a', 'delete') monitoring_utils.update_dashboard.assert_called_with( 'v1', 'volume', '77deef29-b8e5-4dc5-8247-21e2a409a66a', 'delete')
def test_emit_event_with_brick_resource(): init() setattr(NS, "tendrl_context", maps.NamedDict()) NS.tendrl_context["integration_id"] = "int-id" NS.tendrl_context["cluster_name"] = "cluster1" NS.tendrl_context["sds_name"] = "gluster" NS.publisher_id = "gluster-integration" setattr(NS, "node_context", maps.NamedDict()) NS.node_context["node_id"] = "node-id" NS.node_context["fqdn"] = "fqdn" from tendrl.gluster_integration.sds_sync import event_utils event_utils.emit_event( "brick_status", "stopped", "Status of brick1 of vol1 changed to stopped from started", "volume_vol1|brick_path1", "WARNING", tags={ "entity_type": "brick", "volume_name": "vol1" }) with mock.patch.object(log_utils, 'log') as logger: logger.assert_called
def test_sync_volumes(refresh, emit_event, compare, save, load, blivet): init() refresh.return_value = True compare.return_value = True save.return_value = True emit_event.return_value = True NS.node_context = node_context.NodeContext obj = node_context.NodeContext( node_id="eeebe9f5-6e43-4cf8-b321-37d648eb0510", fqdn="dhcp12-12.lab.abc.com", tags=["provisioner/%s" % NS.tendrl_context.integration_id], ipv4_addr="127.0.0.1") NS.node_context = obj load.return_value = obj sds_sync = importlib.import_module('tendrl.gluster_integration.sds_sync') raw_data = ini2json.ini_to_dict( os.path.join(os.path.dirname(__file__), "gluster-state.yaml")) raw_data_options = ini2json.ini_to_dict( os.path.join(os.path.dirname(__file__), "gluster-volume-option.yaml")) sds_sync.Event = MagicMock() sds_sync.Message = MagicMock() with patch.object(NS._int.client, "read", read): with patch.object(brick_device_details, "update_brick_device_details") as update: update.return_value = True with patch.object(brick_utilization, "brick_utilization") as utilization: utilization.return_value = 10 sds_sync.sync_volumes(raw_data['Volumes'], 1, raw_data_options.get('Volume Options'), 10)
def test_geo_replication_pair(): init() obj = GeoReplicationPair(vol_id="58b1283f-fde6-4abf-8d57-b17bb22f0922", session_id="123", pair="testing") obj.render() result = 'clusters/77deef29-b8e5-4dc5-8247-21e2a409a66a' + \ '/Volumes/58b1283f-fde6-4abf-8d57-b17bb22f0922/' + \ 'GeoRepSessions/123/pairs/testing' if obj.value != result: raise AssertionError(obj.value)
def test_sync_volume_connections(blivet, save, load): init() client_connections = importlib.import_module( 'tendrl.gluster_integration.sds_sync.client_connections') init() obj = NS.gluster.objects.Brick("dhcp123-12.lab.abc.com", "_gluster_b1") obj.client_count = 1 load.return_value = obj with patch.object(NS._int.client, "read", read): client_connections.sync_volume_connections( [NS.gluster.objects.Volume()]) save.assert_called()
def test_geo_replication_session(): init() obj = geo_replication_session.GeoReplicationSession( vol_id="58b1283f-fde6-4abf-8d57-b17bb22f0922", session_id="123", session_status="up", pair="testing" ) obj.render() result = 'clusters/77deef29-b8e5-4dc5-8247-21e2a409a66a' + \ '/Volumes/58b1283f-fde6-4abf-8d57-b17bb22f0922/' + \ 'GeoRepSessions/123' if obj.value != result: raise AssertionError(obj.value)
def test_peer_detach(sleep): init() sleep.return_value = True event = { "message": { "host": "dhcp123-12.lab.abc.com" }, "event": "PEER_DISCONNECT", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } monitoring_utils.update_dashboard = MagicMock() Callback().peer_detach(event) monitoring_utils.update_dashboard.assert_called_with( 'dhcp123-12.lab.abc.com', 'host', '77deef29-b8e5-4dc5-8247-21e2a409a66a', 'delete')
def test_sync_volume_connections(save, load): init() client_connections = importlib.import_module( 'tendrl.gluster_integration.sds_sync.client_connections' ) init() obj = NS.tendrl.objects.GlusterBrick( "dhcp123-12.lab.abc.com", "_gluster_b1" ) obj.client_count = 1 load.return_value = obj with patch.object(etcd_utils, "read", read): client_connections.sync_volume_connections( [NS.gluster.objects.Volume()] ) save.assert_called()
def test_peer_detach(sleep, load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) sleep.return_value = True event = {"message": {"host": "dhcp123-12.lab.abc.com"}, "event": "PEER_DISCONNECT", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } monitoring_utils.update_dashboard = MagicMock() Callback().peer_detach(event) monitoring_utils.update_dashboard.assert_called_with( 'dhcp123-12.lab.abc.com', 'host', '77deef29-b8e5-4dc5-8247-21e2a409a66a', 'delete' )
def test_process_events(save, load_all): init() save.return_value = True obj = NS.gluster.objects.NativeEvents( 'svc_reconfigure_failed|testingv1', alert_notify=True, current_value='svc_reconfigure_failed', message='Service reconfigure failed for service: test', severity='warning', ) load_all.return_value = [obj] with patch.object(event_utils, "emit_event") as emit_event: process_events.process_events() emit_event.assert_called_with( 'svc_reconfigure_failed', 'svc_reconfigure_failed', 'Service reconfigure failed for service: test', 'svc_reconfigure_failed|testingv1', 'WARNING', alert_notify=True, tags={}) obj = NS.gluster.objects.NativeEvents( 'quorum|v1', current_value='quorum_gained', message='Quorum of volume: v1 is regained in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='recovery', tags={ 'volume_name': 'v1', 'entity_type': 'volume' }) load_all.return_value = [obj] with patch.object(event_utils, "emit_event") as emit_event: process_events.process_events() emit_event.assert_called_with( 'quorum', 'quorum_gained', 'Quorum of volume: v1 is regained in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', 'quorum|v1', 'INFO', tags={ 'entity_type': 'volume', 'volume_name': 'v1' })
def test_process_events(save, load_all): init() save.return_value = True obj = NS.gluster.objects.NativeEvents( 'svc_reconfigure_failed|testingv1', alert_notify=True, current_value='svc_reconfigure_failed', message='Service reconfigure failed for service: test', severity='warning', ) load_all.return_value = [obj] with patch.object(event_utils, "emit_event") as emit_event: process_events.process_events() emit_event.assert_called_with( 'svc_reconfigure_failed', 'svc_reconfigure_failed', 'Service reconfigure failed for service: test', 'svc_reconfigure_failed|testingv1', 'WARNING', alert_notify=True, tags={} ) obj = NS.gluster.objects.NativeEvents( 'quorum|v1', current_value='quorum_gained', message='Quorum of volume: v1 is regained in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='recovery', tags={'volume_name': 'v1', 'entity_type': 'volume' } ) load_all.return_value = [obj] with patch.object(event_utils, "emit_event") as emit_event: process_events.process_events() emit_event.assert_called_with( 'quorum', 'quorum_gained', 'Quorum of volume: v1 is regained in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', 'quorum|v1', 'INFO', tags={'entity_type': 'volume', 'volume_name': 'v1'} )
def test_svc_disconnected(): init() event = { "message": { "volume": "v1", "svc_name": "test" }, "event": "SVC_DISCONNECTED", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().svc_disconnected(event) NS.gluster.objects.NativeEvents.assert_called_with( 'svc_connection|testv1', current_value='service_disconnected', message='Service: test is disconnected in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning')
def test_peer_reject(): init() event = { "message": { "peer": "dhcp123-12.lab.abc.com" }, "event": "PEER_REJECT", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().peer_reject(event) NS.gluster.objects.NativeEvents.assert_called_with( 'peer_reject|dhcp123-12.lab.abc.com', alert_notify=True, current_value='peer_reject', message='Peer: dhcp123-12.lab.abc.com is rejected in ' 'cluster 77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning')
def test_svc_disconnected(load): init() NS.node_context.fqdn = "node-test" load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) event = {"message": {"volume": "v1", "svc_name": "test"}, "event": "SVC_DISCONNECTED", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().svc_disconnected(event) NS.gluster.objects.NativeEvents.assert_called_with( 'svc_connection|test_node-testv1', current_value='service_disconnected', message='Service: test is disconnected on node node-test ' 'of cluster 77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning' )
def test_afr_subvols_down(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) event = {"message": {"subvol": "volume1-replica-2"}, "event": "AFR_SUBVOLS_DOWN", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().afr_subvols_down(event) NS.gluster.objects.NativeEvents.assert_called_with( 'afr_subvol_state|volume1-replica-2', current_value='afr_subvol_down', message='Afr subvolume: volume1-replica-2 is down in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning', tags={'volume_name': 'volume1', 'entity_type': 'volume'} )
def test_afr_subvol_up(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) event = {"message": {"subvol": "sub_vol"}, "event": "AFR_SUBVOL_UP", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().afr_subvol_up(event) NS.gluster.objects.NativeEvents.assert_called_with( 'afr_subvol_state|sub_vol', current_value='afr_subvol_up', message='Afr subvolume: sub_vol is back up in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='recovery', tags={'entity_type': 'volume', 'volume_name': 'sub_vol'} )
def test_afr_quorum_fail(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) event = {"message": {"subvol": "sub_vol"}, "event": "AFR_QUORUM_FAIL", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().afr_quorum_fail(event) NS.gluster.objects.NativeEvents.assert_called_with( 'afr_quorum_state|sub_vol', current_value='afr_quorum_failed', message='Afr quorum has failed for subvolume: sub_vol in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning', tags={'entity_type': 'volume', 'volume_name': 'sub_vol'} )
def test_ec_min_bricks_up(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) event = {"message": {"subvol": "sub_vol"}, "event": "EC_MIN_BRICKS_UP", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().ec_min_bricks_up(event) NS.gluster.objects.NativeEvents.assert_called_with( 'ec_min_bricks_up|sub_vol', current_value='ec_min_bricks_up', message='Minimum number of bricks back online in EC subvolume: ' 'sub_vol in cluster 77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='recovery', tags={'entity_type': 'volume', 'volume_name': 'sub_vol'} )
def test_unknown_peer(): init() event = { "message": { "peer": "dhcp123-12.lab.abc.com" }, "event": "UNKNOWN_PEER", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().unknown_peer(event) NS.gluster.objects.NativeEvents.assert_called_with( 'unknown_peer|dhcp123-12.lab.abc.com', alert_notify=True, current_value='unknown_peer', message='Peer dhcp123-12.lab.abc.com has moved to ' 'unknown state in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning')
def test_svc_reconfigure_failed(): init() event = { "message": { "service": "testing", "volume": "v1", "svc_name": "test" }, "event": "SVC_MANAGER_FAILED", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().svc_reconfigure_failed(event) NS.gluster.objects.NativeEvents.assert_called_with( 'svc_reconfigure_failed|testingv1', alert_notify=True, current_value='svc_reconfigure_failed', message='Service reconfigure failed for service: test', severity='warning')
def test_rebalance_status_update_failed(): init() event = { "message": { "volume": "v1" }, "event": "REBALANCE_STATUS_UPDATE_FAILED", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().rebalance_status_update_failed(event) NS.gluster.objects.NativeEvents.assert_called_with( 'rebalance_status_update_failed|v1', alert_notify=True, current_value='rebalance_status_update_failed', message='Rebalance status update failed for volume: ' 'v1 in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning')
def test_compare_friend_volume_failed(): init() event = { "message": { "volume": "volume1" }, "event": "COMPARE_FRIEND_VOLUME_FAILED", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().compare_friend_volume_failed(event) NS.gluster.objects.NativeEvents.assert_called_with( 'compare_friend_volume_failed|volume1', alert_notify=True, current_value='compare_friend_volume_failed', message='Compare friend volume failed for volume: ' 'volume1 in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning')
def test_snapshot_hard_limit_reached(): init() event = { "message": { "volume_name": "volume1" }, "event": "SNAPSHOT_HARD_LIMIT_REACHED", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().snapshot_hard_limit_reached(event) NS.gluster.objects.NativeEvents.assert_called_with( 'snapshot_hard_limit_reached|volume1', alert_notify=True, current_value='snapshot_hard_limit_reached', message='Snapshot hard limit reached for volume: ' 'volume1 in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning')
def test_peer_reject(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) event = {"message": {"peer": "dhcp123-12.lab.abc.com"}, "event": "PEER_REJECT", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().peer_reject(event) NS.gluster.objects.NativeEvents.assert_called_with( 'peer_reject|dhcp123-12.lab.abc.com', alert_notify=True, current_value='peer_reject', message='Peer: dhcp123-12.lab.abc.com is rejected in ' 'cluster 77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning' )
def test_unknown_peer(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) event = {"message": {"peer": "dhcp123-12.lab.abc.com"}, "event": "UNKNOWN_PEER", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().unknown_peer(event) NS.gluster.objects.NativeEvents.assert_called_with( 'unknown_peer|dhcp123-12.lab.abc.com', alert_notify=True, current_value='unknown_peer', message='Peer dhcp123-12.lab.abc.com has moved to ' 'unknown state in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning' )
def test_snapshot_hard_limit_reached(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) event = {"message": {"volume_name": "volume1"}, "event": "SNAPSHOT_HARD_LIMIT_REACHED", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().snapshot_hard_limit_reached(event) NS.gluster.objects.NativeEvents.assert_called_with( 'snapshot_hard_limit_reached|volume1', alert_notify=True, current_value='snapshot_hard_limit_reached', message='Snapshot hard limit reached for volume: ' 'volume1 in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning' )
def test_compare_friend_volume_failed(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) event = {"message": {"volume": "volume1"}, "event": "COMPARE_FRIEND_VOLUME_FAILED", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().compare_friend_volume_failed(event) NS.gluster.objects.NativeEvents.assert_called_with( 'compare_friend_volume_failed|volume1', alert_notify=True, current_value='compare_friend_volume_failed', message='Compare friend volume failed for volume: ' 'volume1 in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning' )
def test_svc_reconfigure_failed(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) event = {"message": {"service": "testing", "volume": "v1", "svc_name": "test"}, "event": "SVC_MANAGER_FAILED", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().svc_reconfigure_failed(event) NS.gluster.objects.NativeEvents.assert_called_with( 'svc_reconfigure_failed|testingv1', alert_notify=True, current_value='svc_reconfigure_failed', message='Service reconfigure failed for service: test', severity='warning' )
def test_rebalance_status_update_failed(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) event = {"message": {"volume": "v1"}, "event": "REBALANCE_STATUS_UPDATE_FAILED", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().rebalance_status_update_failed(event) NS.gluster.objects.NativeEvents.assert_called_with( 'rebalance_status_update_failed|v1', alert_notify=True, current_value='rebalance_status_update_failed', message='Rebalance status update failed for volume: ' 'v1 in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning' )
def test_afr_split_brain(): init() event = { "message": { "subvol": "volume1-replica-2" }, "event": "AFR_SPLIT_BRAIN", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().afr_split_brain(event) NS.gluster.objects.NativeEvents.assert_called_with( 'afr_split_brain|volume1-replica-2', alert_notify=True, current_value='afr_split_brain', message='Subvolume: volume1-replica-2 is affected by split-brain.' ' Some of thereplicated files in the volume might ' 'be divergent in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning')
def test_volume_delete(load, save, load_all, sleep): init() keys = maps.NamedDict( key="sub_vol1/dhcp123-12.lab.abc.com:|gluster|b1" ) load.return_value = maps.NamedDict( brick_path="/gluster/b1", short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) save.return_value = True obj = NS.gluster.objects.Volume() obj.name = "v1" obj.vol_id = "0f5b4b99-fa4a-4b8f-be52-770b42879d67" load_all.return_value = [obj] sleep.return_value = True monitoring_utils.update_dashboard = MagicMock() monitoring_utils.delete_resource_from_graphite = MagicMock() event = {"message": {"name": "v1"}, "event": "VOLUME_DELETE", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } with patch.object(etcd_utils, "read") as read: read.return_value = maps.NamedDict(leaves=[keys], value="/gluster/b1") with patch.object(etcd_utils, "delete") as delete: delete.return_value = True Callback().volume_delete(event) monitoring_utils.delete_resource_from_graphite.assert_called_with( 'v1', 'volume', '77deef29-b8e5-4dc5-8247-21e2a409a66a', 'delete' ) monitoring_utils.update_dashboard.assert_called_with( 'v1', 'volume', '77deef29-b8e5-4dc5-8247-21e2a409a66a', 'delete' )
def test_quorum_regained(): init() event = { "message": { "volume": "v1" }, "event": "QUORUM_REGAINED", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().quorum_regained(event) NS.gluster.objects.NativeEvents.assert_called_with( 'quorum|v1', current_value='quorum_gained', message='Quorum of volume: v1 is regained in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='recovery', tags={ 'volume_name': 'v1', 'entity_type': 'volume' })
def test_quota_crossed_soft_limit(): init() event = { "message": { "path": "/gluster/b1", "volume": "v1", "usage": "70%" }, "event": "QUOTA_CROSSED_SOFT_LIMIT", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().quota_crossed_soft_limit(event) NS.gluster.objects.NativeEvents.assert_called_with( 'quota_crossed_soft_limit|v1/gluster/b1', alert_notify=True, current_value='quota_crossed_soft_limit', message='Quota soft limit crossed in volume: v1 for path: ' '/gluster/b1. Current usage: 70% in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning')
def test_afr_split_brain(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) event = {"message": {"subvol": "volume1-replica-2"}, "event": "AFR_SPLIT_BRAIN", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().afr_split_brain(event) NS.gluster.objects.NativeEvents.assert_called_with( 'afr_split_brain|volume1-replica-2', alert_notify=True, current_value='afr_split_brain', message='Subvolume: volume1-replica-2 is affected by split-brain.' ' Some of thereplicated files in the volume might ' 'be divergent in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning' )
def test_brickpath_resolve_failed(): init() event = { "message": { "peer": "dhcp123-12.lab.abc.com", "volume": "v1", "brick": "b1" }, "event": "BRICKPATH_RESOLVE_FAILED", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().brickpath_resolve_failed(event) NS.gluster.objects.NativeEvents.assert_called_with( 'brickpath_resolve_failed|dhcp123-12.lab.abc.comv1b1', alert_notify=True, current_value='brick_path_resolve_failed', message='Brick path resolution failed for brick: b1 . ' 'Volume: v1.Peer: dhcp123-12.lab.abc.com in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning')
def test_quorum_regained(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) event = {"message": {"volume": "v1"}, "event": "QUORUM_REGAINED", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().quorum_regained(event) NS.gluster.objects.NativeEvents.assert_called_with( 'quorum|v1', current_value='quorum_gained', message='Quorum of volume: v1 is regained in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='recovery', tags={'volume_name': 'v1', 'entity_type': 'volume' } )
def test_bitrot_bad_file(): init() event = { "message": { "path": "/gluster/b1", "brick": "b1", "gfid": "1" }, "event": "BITROT_BAD_FILE", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().bitrot_bad_file(event) NS.gluster.objects.NativeEvents.assert_called_with( 'bitrot_bad_file|b1/gluster/b11', alert_notify=True, current_value='bitrot_bad_file', message='File with gfid: 1 is corrupted due to bitrot. ' 'Brick: b1. Path: /gluster/b1 in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning')
def test_svc_disconnected(load): init() NS.node_context.fqdn = "node-test" load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a") event = { "message": { "volume": "v1", "svc_name": "test" }, "event": "SVC_DISCONNECTED", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().svc_disconnected(event) NS.gluster.objects.NativeEvents.assert_called_with( 'svc_connection|test_node-testv1', current_value='service_disconnected', message='Service: test is disconnected on node node-test ' 'of cluster 77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning')
def test_ec_min_bricks_up(): init() event = { "message": { "subvol": "sub_vol" }, "event": "EC_MIN_BRICKS_UP", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().ec_min_bricks_up(event) NS.gluster.objects.NativeEvents.assert_called_with( 'ec_min_bricks_up|sub_vol', current_value='ec_min_bricks_up', message='Minimum number of bricks back online in EC subvolume: ' 'sub_vol in cluster 77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='recovery', tags={ 'entity_type': 'volume', 'volume_name': 'sub_vol' })
def test_afr_subvol_up(): init() event = { "message": { "subvol": "sub_vol" }, "event": "AFR_SUBVOL_UP", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().afr_subvol_up(event) NS.gluster.objects.NativeEvents.assert_called_with( 'afr_subvol_state|sub_vol', current_value='afr_subvol_up', message='Afr subvolume: sub_vol is back up in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='recovery', tags={ 'entity_type': 'volume', 'volume_name': 'sub_vol' })
def test_afr_quorum_fail(): init() event = { "message": { "subvol": "sub_vol" }, "event": "AFR_QUORUM_FAIL", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().afr_quorum_fail(event) NS.gluster.objects.NativeEvents.assert_called_with( 'afr_quorum_state|sub_vol', current_value='afr_quorum_failed', message='Afr quorum has failed for subvolume: sub_vol in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning', tags={ 'entity_type': 'volume', 'volume_name': 'sub_vol' })
def test_afr_subvols_down(): init() event = { "message": { "subvol": "volume1-replica-2" }, "event": "AFR_SUBVOLS_DOWN", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().afr_subvols_down(event) NS.gluster.objects.NativeEvents.assert_called_with( 'afr_subvol_state|volume1-replica-2', current_value='afr_subvol_down', message='Afr subvolume: volume1-replica-2 is down in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning', tags={ 'volume_name': 'volume1', 'entity_type': 'volume' })
def test_emit_event_with_brick_resource(): init() setattr(NS, "tendrl_context", maps.NamedDict()) NS.tendrl_context["integration_id"] = "int-id" NS.tendrl_context["cluster_name"] = "cluster1" NS.tendrl_context["sds_name"] = "gluster" NS.publisher_id = "gluster-integration" setattr(NS, "node_context", maps.NamedDict()) NS.node_context["node_id"] = "node-id" NS.node_context["fqdn"] = "fqdn" from tendrl.gluster_integration.sds_sync import event_utils event_utils.emit_event( "brick_status", "stopped", "Brick:brick1 in volume:vol1 has stopped", "volume_vol1|brick_path1", "WARNING", tags={"entity_type": "brick", "volume_name": "vol1"} ) with mock.patch.object(log_utils, 'log') as logger: logger.assert_called
def test_quota_crossed_soft_limit(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) event = {"message": {"path": "/gluster/b1", "volume": "v1", "usage": "70%" }, "event": "QUOTA_CROSSED_SOFT_LIMIT", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().quota_crossed_soft_limit(event) NS.gluster.objects.NativeEvents.assert_called_with( 'quota_crossed_soft_limit|v1/gluster/b1', alert_notify=True, current_value='quota_crossed_soft_limit', message='Quota soft limit crossed in volume: v1 for path: ' '/gluster/b1. Current usage: 70% in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning' )
def test_quorum_lost(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a") event = { "message": { "volume": "v1" }, "event": "QUORUM_LOST", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().quorum_lost(event) NS.gluster.objects.NativeEvents.assert_called_with( 'quorum|v1', current_value='quorum_lost', message='Quorum of volume: v1 is lost in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning', tags={ 'volume_name': 'v1', 'entity_type': 'volume' })
def test_afr_quorum_met(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a") event = { "message": { "subvol": "sub_vol" }, "event": "AFR_QUORUM_MET", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().afr_quorum_met(event) NS.gluster.objects.NativeEvents.assert_called_with( 'afr_quorum_state|sub_vol', current_value='afr_quorum_met', message='Afr quorum is met for subvolume: sub_vol in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='recovery', tags={ 'volume_name': 'sub_vol', 'entity_type': 'volume' })
def test_ec_min_bricks_not_up(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a") event = { "message": { "subvol": "sub_vol" }, "event": "EC_MIN_BRICKS_NOT_UP", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().ec_min_bricks_not_up(event) NS.gluster.objects.NativeEvents.assert_called_with( 'ec_min_bricks_up|sub_vol', current_value='ec_min_bricks_not_up', message='Minimum number of bricks not up in EC subvolume: sub_vol ' 'in cluster 77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning', tags={ 'entity_type': 'volume', 'volume_name': 'sub_vol' })
def test_brickpath_resolve_failed(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) event = {"message": {"peer": "dhcp123-12.lab.abc.com", "volume": "v1", "brick": "b1" }, "event": "BRICKPATH_RESOLVE_FAILED", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().brickpath_resolve_failed(event) NS.gluster.objects.NativeEvents.assert_called_with( 'brickpath_resolve_failed|dhcp123-12.lab.abc.comv1b1', alert_notify=True, current_value='brick_path_resolve_failed', message='Brick path resolution failed for brick: b1 . ' 'Volume: v1.Peer: dhcp123-12.lab.abc.com in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning' )
def test_bitrot_bad_file(load): init() load.return_value = maps.NamedDict( short_name="77deef29-b8e5-4dc5-8247-21e2a409a66a" ) event = {"message": {"path": "/gluster/b1", "brick": "b1", "gfid": "1" }, "event": "BITROT_BAD_FILE", "ts": 1486634392, "nodeid": "0f5b4b99-fa4a-4b8f-be52-770b42879d67" } NS.gluster.objects.NativeEvents = MagicMock() Callback().bitrot_bad_file(event) NS.gluster.objects.NativeEvents.assert_called_with( 'bitrot_bad_file|b1/gluster/b11', alert_notify=True, current_value='bitrot_bad_file', message='File with gfid: 1 is corrupted due to bitrot. ' 'Brick: b1. Path: /gluster/b1 in cluster ' '77deef29-b8e5-4dc5-8247-21e2a409a66a', severity='warning' )
def setup_method(self, method): init() self.tempdir = tempfile.mkdtemp()