NetApp cDOT driver enhanced support logging

The NetApp cDOT driver logs some info about OpenStack deployments
already, and more info is needed about the specific storage
resources managed by Manila.

Implements: blueprint netapp-cdot-enhanced-support-logging
Change-Id: I8e4f81b3f1291e3c88fc88ab71ac93a415990ee3
This commit is contained in:
Clinton Knight 2016-09-19 12:15:41 -04:00
parent 8f2fa31d8a
commit 04686f2d18
7 changed files with 139 additions and 32 deletions

View File

@ -20,6 +20,7 @@ single-SVM or multi-SVM functionality needed by the cDOT Manila drivers.
"""
import copy
import json
import math
import socket
@ -294,24 +295,49 @@ class NetAppCmodeFileStorageLibrary(object):
@na_utils.trace
def _handle_ems_logging(self):
"""Build and send an EMS log message."""
self._client.send_ems_log_message(self._build_ems_log_message())
self._client.send_ems_log_message(self._build_ems_log_message_0())
self._client.send_ems_log_message(self._build_ems_log_message_1())
@na_utils.trace
def _build_ems_log_message(self):
"""Construct EMS Autosupport log message."""
def _build_base_ems_log_message(self):
"""Construct EMS Autosupport log message common to all events."""
ems_log = {
'computer-name': socket.getfqdn() or 'Manila_node',
'event-id': '0',
'computer-name': socket.gethostname() or 'Manila_node',
'event-source': 'Manila driver %s' % self.driver_name,
'app-version': self._app_version,
'category': 'provisioning',
'event-description': 'OpenStack Manila connected to cluster node',
'log-level': '6',
'log-level': '5',
'auto-support': 'false',
}
return ems_log
@na_utils.trace
def _build_ems_log_message_0(self):
"""Construct EMS Autosupport log message with deployment info."""
ems_log = self._build_base_ems_log_message()
ems_log.update({
'event-id': '0',
'event-description': 'OpenStack Manila connected to cluster node',
})
return ems_log
@na_utils.trace
def _build_ems_log_message_1(self):
"""Construct EMS Autosupport log message with storage pool info."""
message = self._get_ems_pool_info()
ems_log = self._build_base_ems_log_message()
ems_log.update({
'event-id': '1',
'event-description': json.dumps(message),
})
return ems_log
def _get_ems_pool_info(self):
raise NotImplementedError()
@na_utils.trace
def _handle_housekeeping_tasks(self):
"""Handle various cleanup activities."""

View File

@ -88,6 +88,14 @@ class NetAppCmodeMultiSVMFileStorageLibrary(
vserver_client = self._get_api_client(vserver)
return vserver, vserver_client
def _get_ems_pool_info(self):
return {
'pools': {
'vserver': None,
'aggregates': self._find_matching_aggregates(),
},
}
@na_utils.trace
def _handle_housekeeping_tasks(self):
"""Handle various cleanup activities."""

View File

@ -100,6 +100,14 @@ class NetAppCmodeSingleSVMFileStorageLibrary(
vserver_client = self._get_api_client(self._vserver)
return self._vserver, vserver_client
def _get_ems_pool_info(self):
return {
'pools': {
'vserver': self._vserver,
'aggregates': self._find_matching_aggregates(),
},
}
@na_utils.trace
def _handle_housekeeping_tasks(self):
"""Handle various cleanup activities."""

View File

@ -17,6 +17,7 @@ Unit tests for the NetApp Data ONTAP cDOT base storage driver library.
"""
import copy
import json
import math
import socket
import time
@ -409,33 +410,54 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
def test_handle_ems_logging(self):
self.mock_object(self.library,
'_build_ems_log_message',
mock.Mock(return_value=fake.EMS_MESSAGE))
'_build_ems_log_message_0',
mock.Mock(return_value=fake.EMS_MESSAGE_0))
self.mock_object(self.library,
'_build_ems_log_message_1',
mock.Mock(return_value=fake.EMS_MESSAGE_1))
self.library._handle_ems_logging()
self.library._client.send_ems_log_message.assert_called_with(
fake.EMS_MESSAGE)
self.library._client.send_ems_log_message.assert_has_calls([
mock.call(fake.EMS_MESSAGE_0),
mock.call(fake.EMS_MESSAGE_1),
])
def test_build_ems_log_message(self):
def test_build_ems_log_message_0(self):
self.mock_object(socket,
'getfqdn',
'gethostname',
mock.Mock(return_value=fake.HOST_NAME))
result = self.library._build_ems_log_message()
result = self.library._build_ems_log_message_0()
fake_ems_log = {
'computer-name': fake.HOST_NAME,
'event-id': '0',
'event-source': 'Manila driver %s' % fake.DRIVER_NAME,
'app-version': fake.APP_VERSION,
'category': 'provisioning',
'event-description': 'OpenStack Manila connected to cluster node',
'log-level': '6',
'auto-support': 'false'
self.assertDictEqual(fake.EMS_MESSAGE_0, result)
def test_build_ems_log_message_1(self):
pool_info = {
'pools': {
'vserver': 'fake_vserver',
'aggregates': ['aggr1', 'aggr2'],
},
}
self.assertDictEqual(fake_ems_log, result)
self.mock_object(socket,
'gethostname',
mock.Mock(return_value=fake.HOST_NAME))
self.mock_object(self.library,
'_get_ems_pool_info',
mock.Mock(return_value=pool_info))
result = self.library._build_ems_log_message_1()
self.assertDictEqual(pool_info,
json.loads(result['event-description']))
result['event-description'] = ''
self.assertDictEqual(fake.EMS_MESSAGE_1, result)
def test_get_ems_pool_info(self):
self.assertRaises(NotImplementedError,
self.library._get_ems_pool_info)
def test_find_matching_aggregates(self):
self.assertRaises(NotImplementedError,

View File

@ -171,6 +171,22 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
self.assertTupleEqual((fake.VSERVER1, 'fake_client'), result)
def test_get_ems_pool_info(self):
self.mock_object(self.library,
'_find_matching_aggregates',
mock.Mock(return_value=['aggr1', 'aggr2']))
result = self.library._get_ems_pool_info()
expected = {
'pools': {
'vserver': None,
'aggregates': ['aggr1', 'aggr2'],
},
}
self.assertEqual(expected, result)
def test_handle_housekeeping_tasks(self):
self.mock_object(self.client, 'prune_deleted_nfs_export_policies')

View File

@ -148,6 +148,22 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
self.assertRaises(exception.VserverNotFound,
self.library._get_vserver)
def test_get_ems_pool_info(self):
self.mock_object(self.library,
'_find_matching_aggregates',
mock.Mock(return_value=['aggr1', 'aggr2']))
result = self.library._get_ems_pool_info()
expected = {
'pools': {
'vserver': fake.VSERVER1,
'aggregates': ['aggr1', 'aggr2'],
},
}
self.assertEqual(expected, result)
def test_handle_housekeeping_tasks(self):
mock_vserver_client = mock.Mock()

View File

@ -475,14 +475,25 @@ SHARE_ACCESS = {
'access_to': [LIF_ADDRESSES[0]]
}
EMS_MESSAGE = {
'computer-name': 'fake_host',
EMS_MESSAGE_0 = {
'computer-name': HOST_NAME,
'event-id': '0',
'event-source': 'fake_driver',
'app-version': 'fake_app_version',
'category': 'fake_category',
'event-description': 'fake_description',
'log-level': '6',
'event-source': 'Manila driver %s' % DRIVER_NAME,
'app-version': APP_VERSION,
'category': 'provisioning',
'event-description': 'OpenStack Manila connected to cluster node',
'log-level': '5',
'auto-support': 'false'
}
EMS_MESSAGE_1 = {
'computer-name': HOST_NAME,
'event-id': '1',
'event-source': 'Manila driver %s' % DRIVER_NAME,
'app-version': APP_VERSION,
'category': 'provisioning',
'event-description': '',
'log-level': '5',
'auto-support': 'false'
}