230 lines
8.1 KiB
Python
230 lines
8.1 KiB
Python
# Copyright (C) 2022 Fujitsu
|
|
# All Rights Reserved.
|
|
#
|
|
# 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 copy
|
|
from unittest import mock
|
|
|
|
from tacker import context
|
|
from tacker.sol_refactored.common import exceptions as sol_ex
|
|
from tacker.sol_refactored.common import monitoring_plugin_base as mon_base
|
|
from tacker.sol_refactored.common import server_notification as sn_common
|
|
from tacker.sol_refactored.common import vnf_instance_utils as inst_utils
|
|
from tacker.sol_refactored.controller import server_notification
|
|
from tacker.sol_refactored import objects
|
|
from tacker.tests.unit import base
|
|
|
|
_inst1 = {
|
|
'id': 'test_id',
|
|
'vnfdId': 'vnfdId',
|
|
'vnfProvider': 'vnfProvider',
|
|
'vnfProductName': 'vnfProductName',
|
|
'vnfSoftwareVersion': 'vnfSoftwareVersion',
|
|
'vnfdVersion': 'vnfdVersion',
|
|
'instantiationState': 'NOT_INSTANTIATED',
|
|
'instantiatedVnfInfo': {
|
|
'id': 'id',
|
|
'vduId': 'vduId',
|
|
'vnfcResourceInfo': [
|
|
{
|
|
'id': 'vnfc_resource_id1',
|
|
'vduId': 'vduId',
|
|
'computeResource': {},
|
|
'metadata': {
|
|
"server_notification": {
|
|
"alarmId": "alarm_id"
|
|
}
|
|
}
|
|
}, {
|
|
'id': 'vnfc_resource_id2',
|
|
'vduId': 'vduId2',
|
|
'computeResource': {},
|
|
'metadata': {
|
|
"server_notification": {
|
|
"alarmId": "alarm_id2"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
'vnfcInfo': [{
|
|
'id': 'vnfc_info1',
|
|
'vduId': 'vdu_id',
|
|
'vnfcResourceInfoId': 'vnfc_resource_id1',
|
|
'vnfcState': 'STARTED'
|
|
}],
|
|
'metadata': {
|
|
'ServerNotifierUri': 'ServerNotifierUri',
|
|
'ServerNotifierFaultID': ['1111', '1234']
|
|
}
|
|
},
|
|
'vnfConfigurableProperties': {
|
|
'isAutohealEnabled': True
|
|
}
|
|
}
|
|
|
|
_body = {
|
|
'notification': {
|
|
'alarm_id': 'alarm_id',
|
|
'fault_id': '1234',
|
|
'fault_type': '10',
|
|
}
|
|
}
|
|
|
|
_body2 = {
|
|
'error_schema': {}
|
|
}
|
|
|
|
pkg = 'tacker.tests.unit.sol_refactored.controller.test_server_notification'
|
|
|
|
|
|
class VendorSpecificMonitoringPlugin(mon_base.MonitoringPlugin):
|
|
_instance = None
|
|
|
|
@staticmethod
|
|
def instance():
|
|
if not VendorSpecificMonitoringPlugin._instance:
|
|
VendorSpecificMonitoringPlugin()
|
|
return VendorSpecificMonitoringPlugin._instance
|
|
|
|
def __init__(self):
|
|
if VendorSpecificMonitoringPlugin._instance:
|
|
raise SystemError(
|
|
"Not constructor but instance() should be used.")
|
|
VendorSpecificMonitoringPlugin._instance = self
|
|
|
|
def alert(self, **kwargs):
|
|
pass
|
|
|
|
|
|
class NotASubClassOfMonitoringPlugin():
|
|
pass
|
|
|
|
|
|
class TestServerNotification(base.TestCase):
|
|
def setUp(self):
|
|
super(TestServerNotification, self).setUp()
|
|
objects.register_all()
|
|
self.context = context.get_admin_context()
|
|
self.request = mock.Mock()
|
|
self.request.context = self.context
|
|
self.controller = \
|
|
server_notification.ServerNotificationController()
|
|
self.config_fixture.config(
|
|
group='server_notification', server_notification=True)
|
|
sn_common.ServerNotification._instance = None
|
|
|
|
def tearDown(self):
|
|
super(TestServerNotification, self).tearDown()
|
|
sn_common.ServerNotification._instance = None
|
|
|
|
def test_notify_config_false(self):
|
|
self.config_fixture.config(
|
|
group='server_notification', server_notification=False)
|
|
self.assertRaises(
|
|
sol_ex.ServerNotificationNotEnabled,
|
|
self.controller.notify, request=self.request,
|
|
vnf_instance_id='test_id',
|
|
server_id='test_server_id', body=_body)
|
|
|
|
@mock.patch.object(inst_utils, 'get_inst')
|
|
def test_notify(self, mock_inst):
|
|
self.config_fixture.config(
|
|
group='server_notification', server_notification=True)
|
|
mock_inst.return_value = objects.VnfInstanceV2.from_dict(_inst1)
|
|
response = self.controller.notify(
|
|
request=self.request,
|
|
vnf_instance_id='test_id',
|
|
server_id='test_server_id', body=_body)
|
|
self.assertEqual(204, response.status)
|
|
|
|
def test_notify_error_schema(self):
|
|
self.config_fixture.config(
|
|
group='server_notification', server_notification=True)
|
|
self.assertRaises(
|
|
sol_ex.ServerNotificationValidationError,
|
|
self.controller.notify,
|
|
request=self.request,
|
|
vnf_instance_id='test_id',
|
|
server_id='test_server_id', body=_body2)
|
|
|
|
@mock.patch.object(inst_utils, 'get_inst')
|
|
def test_notify_vnfc_mismatch(self,
|
|
mock_inst):
|
|
self.config_fixture.config(
|
|
group='server_notification', server_notification=True)
|
|
_inst = copy.deepcopy(_inst1)
|
|
_inst['instantiatedVnfInfo']['vnfcInfo'][0]['vnfcResourceInfoId'] = (
|
|
'vnfc_resource_id2')
|
|
|
|
mock_inst.return_value = objects.VnfInstanceV2.from_dict(_inst)
|
|
self.assertRaises(
|
|
sol_ex.ServerNotificationValidationError,
|
|
self.controller.notify, request=self.request,
|
|
vnf_instance_id='test_id',
|
|
server_id='test_server_id', body=_body)
|
|
|
|
@mock.patch.object(inst_utils, 'get_inst')
|
|
def test_notify_fault_id_mismatch(self,
|
|
mock_inst):
|
|
self.config_fixture.config(
|
|
group='server_notification', server_notification=True)
|
|
_inst = copy.deepcopy(_inst1)
|
|
metadata = _inst['instantiatedVnfInfo']['metadata']
|
|
metadata['ServerNotifierFaultID'] = ['0000']
|
|
|
|
mock_inst.return_value = objects.VnfInstanceV2.from_dict(_inst)
|
|
self.assertRaises(
|
|
sol_ex.ServerNotificationValidationError,
|
|
self.controller.notify, request=self.request,
|
|
vnf_instance_id='test_id',
|
|
server_id='test_server_id', body=_body)
|
|
|
|
@mock.patch.object(inst_utils, 'get_inst')
|
|
def test_notify_no_vnf_instance(self, mock_inst):
|
|
self.config_fixture.config(
|
|
group='server_notification', server_notification=True)
|
|
mock_inst.return_value = None
|
|
self.assertRaises(
|
|
sol_ex.ServerNotificationValidationError,
|
|
self.controller.notify, request=self.request,
|
|
vnf_instance_id='test_id',
|
|
server_id='test_server_id', body=_body)
|
|
|
|
def test_vendor_specific_plugin(self):
|
|
self.config_fixture.config(
|
|
group='server_notification', server_notification=True)
|
|
self.config_fixture.config(
|
|
group='server_notification', server_notification_package=pkg)
|
|
self.config_fixture.config(
|
|
group='server_notification',
|
|
server_notification_class='VendorSpecificMonitoringPlugin')
|
|
response = self.controller.notify(
|
|
request=self.request,
|
|
vnf_instance_id='test_id',
|
|
server_id='test_server_id', body=_body)
|
|
self.assertEqual(204, response.status)
|
|
|
|
def test_vendor_specific_plugin_subclass(self):
|
|
self.config_fixture.config(
|
|
group='server_notification', server_notification=True)
|
|
self.config_fixture.config(
|
|
group='server_notification', server_notification_package=pkg)
|
|
self.config_fixture.config(
|
|
group='server_notification',
|
|
server_notification_class='NotASubClassOfMonitoringPlugin')
|
|
self.assertRaises(
|
|
sol_ex.MonitoringPluginClassError, self.controller.notify,
|
|
request=self.request, vnf_instance_id='test_id',
|
|
server_id='test_server_id', body=_body)
|