X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_mon%2Ftests%2Fplugins%2FVMware%2Ftest_mon_plugin_vrops.py;fp=osm_mon%2Ftests%2Fplugins%2FVMware%2Ftest_mon_plugin_vrops.py;h=0000000000000000000000000000000000000000;hb=6c3e7842b5ac04959058263c88ef185da352058e;hp=2d10d1b7cd93d18b6660f6e2aa6bbc69171df461;hpb=6eda48bf7489c00fee4e1f276404ab82db23fd1d;p=osm%2FMON.git diff --git a/osm_mon/tests/plugins/VMware/test_mon_plugin_vrops.py b/osm_mon/tests/plugins/VMware/test_mon_plugin_vrops.py deleted file mode 100644 index 2d10d1b..0000000 --- a/osm_mon/tests/plugins/VMware/test_mon_plugin_vrops.py +++ /dev/null @@ -1,3083 +0,0 @@ -# -*- coding: utf-8 -*- - -## -# Copyright 2017-2018 VMware Inc. -# This file is part of ETSI OSM -# 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. -# -# For those usages not covered by the Apache License, Version 2.0 please -# contact: osslegalrouting@vmware.com -## - -""" Mock tests for VMware vROPs Mon plugin """ - -import os -import sys -import unittest - -import mock -import requests - -sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..", "..")) - -from osm_mon.plugins.vRealiseOps import mon_plugin_vrops as monPlugin - -from pyvcloud.vcd.client import Client - - -class TestMonPlugin(unittest.TestCase): - """Test class for vROPs Mon Plugin class methods""" - - def setUp(self): - """Setup the tests for Mon Plugin class methods""" - super(TestMonPlugin, self).setUp() - - self.m_vim_access_config = {'vrops_site': 'abc', - 'vrops_user': 'user', - 'vrops_password': 'passwd', - 'vim_url': 'vcd_url', - 'admin_username': 'admin', - 'admin_password': 'admin_passwd', - 'vim_uuid': '1', - 'tenant_id': 'org_vdc_1'} - self.mon_plugin = monPlugin.MonPlugin(self.m_vim_access_config) - # create client object - self.vca = Client('test', verify_ssl_certs=False) - # create session - self.session = requests.Session() - - def test_get_default_Params_valid_metric_alarm_name(self): - """Test get default params method""" - - # Mock valid metric_alarm_name and response - metric_alarm_name = "Average_Memory_Usage_Above_Threshold" - expected_return = {'impact': 'risk', 'cancel_cycles': 2, 'adapter_kind': 'VMWARE', - 'repeat': False, 'cancel_period': 300, 'alarm_type': 16, - 'vrops_alarm': 'Avg_Mem_Usage_Above_Thr', 'enabled': True, 'period': 300, - 'resource_kind': 'VirtualMachine', 'alarm_subType': 19, - 'action': 'acknowledge', 'evaluation': 2, 'unit': '%'} - - # call get default param function under test - actual_return = self.mon_plugin.get_default_Params(metric_alarm_name) - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - def test_get_default_Params_invalid_metric_alarm_name(self): - """Test get default params method invalid metric alarm""" - - # Mock valid metric_alarm_name and response - metric_alarm_name = "Invalid_Alarm" - expected_return = {} - - # call get default param function under test - actual_return = self.mon_plugin.get_default_Params(metric_alarm_name) - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'post') - def test_create_symptom_valid_req_response(self, m_post): - """Test create symptom method-valid request""" - - # Mock valid symptom params and mock responses - symptom_param = {'threshold_value': 0, 'cancel_cycles': 1, 'adapter_kind_key': 'VMWARE', - 'resource_kind_key': 'VirtualMachine', 'severity': 'CRITICAL', - 'symptom_name': \ - 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'operation': 'GT', 'wait_cycles': 1, 'metric_key': 'cpu|usage_average'} - - m_post.return_value.status_code = 201 - m_post.return_value.content = \ - '{"id":"SymptomDefinition-351c23b4-bc3c-4c7b-b4af-1ad90a673c5d",\ - "name":"CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4",\ - "adapterKindKey":"VMWARE","resourceKindKey":"VirtualMachine",\ - "waitCycles":1,"cancelCycles":1,\ - "state":{"severity":"CRITICAL","condition":{"type":"CONDITION_HT",\ - "key":"cpu|usage_average","operator":"GT","value":"0.0",\ - "valueType":"NUMERIC",\ - "instanced":false,"thresholdType":"STATIC"}}}' - - expected_return = "SymptomDefinition-351c23b4-bc3c-4c7b-b4af-1ad90a673c5d" - - # call create symptom method under test - actual_return = self.mon_plugin.create_symptom(symptom_param) - - # verify that mocked method is called - m_post.assert_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'post') - def test_create_symptom_invalid_req_response(self, m_post): - """Test create symptom method-invalid response""" - - # Mock valid symptom params and invalid mock responses - symptom_param = {'threshold_value': 0, 'cancel_cycles': 1, 'adapter_kind_key': 'VMWARE', - 'resource_kind_key': 'VirtualMachine', 'severity': 'CRITICAL', - 'symptom_name': \ - 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'operation': 'GT', 'wait_cycles': 1, 'metric_key': 'cpu|usage_average'} - - m_post.return_value.status_code = 404 - m_post.return_value.content = '404 Not Found' - - expected_return = None - - # call create symptom method under test - actual_return = self.mon_plugin.create_symptom(symptom_param) - - # verify that mocked method is called - m_post.assert_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'post') - def test_create_symptom_incorrect_data(self, m_post): - """Test create symptom method-incorrect data""" - - # Mock valid symptom params and invalid mock responses - symptom_param = {'threshold_value': 0, 'cancel_cycles': 1, 'adapter_kind_key': 'VMWARE', - 'resource_kind_key': 'VirtualMachine', 'severity': 'CRITICAL', - 'symptom_name': \ - 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'operation': 'GT', 'metric_key': 'cpu|usage_average'} - - expected_return = None - - # call create symptom method under test - actual_return = self.mon_plugin.create_symptom(symptom_param) - - # verify that mocked method is not called - m_post.assert_not_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'post') - def test_create_alarm_definition_valid_req_response(self, m_post): - """Test create alarm definition method-valid response""" - - # Mock valid alarm params and mock responses - alarm_param = {'description': 'CPU_Utilization_Above_Threshold', 'cancelCycles': 1, - 'subType': 19, 'waitCycles': 1, - 'severity': 'CRITICAL', 'impact': 'risk', 'adapterKindKey': 'VMWARE', - 'name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'resourceKindKey': 'VirtualMachine', 'type': 16, - 'symptomDefinitionId': \ - 'SymptomDefinition-25278b06-bff8-4409-a141-9b4e064235df'} - - m_post.return_value.status_code = 201 - m_post.return_value.content = \ - '{"id":"AlertDefinition-d4f21e4b-770a-45d6-b298-022eaf489115",\ - "name":"CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4",\ - "description":"CPU_Utilization_Above_Threshold","adapterKindKey":"VMWARE",\ - "resourceKindKey":"VirtualMachine","waitCycles":1,"cancelCycles":1,\ - "type":16,"subType":19,\ - "states":[{"severity":"CRITICAL","base-symptom-set":{"type":"SYMPTOM_SET",\ - "relation":"SELF","aggregation":"ALL","symptomSetOperator":"AND",\ - "symptomDefinitionIds":\ - ["SymptomDefinition-25278b06-bff8-4409-a141-9b4e064235df"]},\ - "impact":{"impactType":"BADGE","detail":"risk"}}]}' - - expected_return = "AlertDefinition-d4f21e4b-770a-45d6-b298-022eaf489115" - - # call create alarm definition method under test - actual_return = self.mon_plugin.create_alarm_definition(alarm_param) - - # verify that mocked method is called - m_post.assert_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'post') - def test_create_alarm_definition_invalid_req_response(self, m_post): - """Test create alarm definition method-invalid response""" - - # Mock valid alarm params and mock responses - alarm_param = {'description': 'CPU_Utilization_Above_Threshold', 'cancelCycles': 1, - 'subType': 19, 'waitCycles': 1, - 'severity': 'CRITICAL', 'impact': 'risk', 'adapterKindKey': 'VMWARE', - 'name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'resourceKindKey': 'VirtualMachine', 'type': 16, - 'symptomDefinitionId': \ - 'SymptomDefinition-25278b06-bff8-4409-a141-9b4e064235df'} - - m_post.return_value.status_code = 404 - m_post.return_value.content = '404 Not Found' - - expected_return = None - - # call create alarm definition method under test - actual_return = self.mon_plugin.create_alarm_definition(alarm_param) - - # verify that mocked method is called - m_post.assert_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'post') - def test_create_alarm_definition_incorrect_data(self, m_post): - """Test create alarm definition method-incorrect data""" - - # Mock incorrect alarm param - alarm_param = {'description': 'CPU_Utilization_Above_Threshold', 'cancelCycles': 1, - 'subType': 19, 'waitCycles': 1, 'type': 16, - 'severity': 'CRITICAL', 'impact': 'risk', 'adapterKindKey': 'VMWARE', - 'symptomDefinitionId': \ - 'SymptomDefinition-25278b06-bff8-4409-a141-9b4e064235df'} - expected_return = None - - # call create symptom method under test - actual_return = self.mon_plugin.create_alarm_definition(alarm_param) - - # verify that mocked method is not called - m_post.assert_not_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.DatabaseManager, 'save_alarm') - @mock.patch.object(monPlugin.MonPlugin, 'create_alarm_notification_rule') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_resource_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_moref_id') - @mock.patch.object(monPlugin.MonPlugin, 'create_alarm_definition') - @mock.patch.object(monPlugin.MonPlugin, 'create_symptom') - @mock.patch.object(monPlugin.MonPlugin, 'get_alarm_defination_by_name') - @mock.patch.object(monPlugin.MonPlugin, 'get_default_Params') - def test_configure_alarm_valid_req(self, m_get_default_Params, - m_get_alarm_defination_by_name, - m_create_symptom, - m_create_alarm_definition, - m_get_vm_moref_id, - m_get_vm_resource_id, - m_create_alarm_notification_rule, - m_save_alarm): - """Test configure alarm valid request creating alarm""" - - # Mock input configuration dictionary - config_dict = {'threshold_value': 0, 'severity': 'CRITICAL', - 'alarm_name': 'CPU_Utilization_Above_Threshold', - 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'correlation_id': 'e14b203c-6bf2-4e2f-a91c-8c19d2abcdef', - 'statistic': 'AVERAGE', 'metric_name': 'cpu_utilization', - 'vdu_name': 'vdu1', 'vnf_member_index': 'index1', 'ns_id': 'nsd1', - 'operation': 'GT', 'unit': '%', - 'description': 'CPU_Utilization_Above_Threshold'} - - # symptom parameters to be passed for symptom creation - symptom_params = {'threshold_value': 0, - 'cancel_cycles': 1, - 'adapter_kind_key': 'VMWARE', - 'resource_kind_key': 'VirtualMachine', - 'severity': 'CRITICAL', - 'symptom_name': \ - 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'operation': 'GT', - 'wait_cycles': 1, - 'metric_key': 'cpu|usage_average'} - - # alarm parameters to be passed for alarm creation - alarm_params = {'description': 'CPU_Utilization_Above_Threshold', - 'cancelCycles': 1, 'subType': 19, - 'waitCycles': 1, 'severity': 'CRITICAL', - 'impact': 'risk', 'adapterKindKey': 'VMWARE', - 'name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'resourceKindKey': 'VirtualMachine', - 'symptomDefinitionId': \ - 'SymptomDefinition-2e8f9ddc-9f7b-4cd6-b85d-7d7fe3a8a804', - 'type': 16} - - vm_moref_id = 'vm-6626' - vrops_alarm_name = 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - alarm_def = 'AlertDefinition-0f3cdcb3-4e1b-4a0b-86d0-66d4b3f65220' - resource_id = 'ac87622f-b761-40a0-b151-00872a2a456e' - alarm_def_uuid = '0f3cdcb3-4e1b-4a0b-86d0-66d4b3f65220' - - # Mock default Parameters for alarm & metric configuration - m_get_default_Params.side_effect = [{'impact': 'risk', 'cancel_cycles': 1, - 'adapter_kind': 'VMWARE', 'repeat': False, - 'cancel_period': 300, 'alarm_type': 16, - 'vrops_alarm': 'CPU_Utilization_Above_Thr', - 'enabled': True, 'period': 300, - 'resource_kind': 'VirtualMachine', - 'alarm_subType': 19, 'action': 'acknowledge', - 'evaluation': 1, 'unit': 'msec'}, - {'metric_key': 'cpu|usage_average', 'unit': '%'} - ] - - # set mocked function return values - m_get_alarm_defination_by_name.return_value = [] - m_create_symptom.return_value = 'SymptomDefinition-2e8f9ddc-9f7b-4cd6-b85d-7d7fe3a8a804' - m_create_alarm_definition.return_value = \ - 'AlertDefinition-0f3cdcb3-4e1b-4a0b-86d0-66d4b3f65220' - m_get_vm_moref_id.return_value = vm_moref_id - m_get_vm_resource_id.return_value = 'ac87622f-b761-40a0-b151-00872a2a456e' - m_create_alarm_notification_rule.return_value = 'f37900e7-dd01-4383-b84c-08f519530d71' - - # Call configure_alarm method under test - return_value = self.mon_plugin.configure_alarm(config_dict) - - # Verify that mocked methods are called with correct parameters - self.assertEqual(m_get_default_Params.call_count, 2) - m_get_alarm_defination_by_name.assert_called_with(vrops_alarm_name) - m_create_symptom.assert_called_with(symptom_params) - m_create_alarm_definition.assert_called_with(alarm_params) - m_get_vm_moref_id.assert_called_with(config_dict['resource_uuid']) - m_get_vm_resource_id.assert_called_with(vm_moref_id) - m_create_alarm_notification_rule.assert_called_with(vrops_alarm_name, - alarm_def, - resource_id) - m_save_alarm.assert_called_with(vrops_alarm_name, '1', - config_dict['threshold_value'], - config_dict['operation'], - config_dict['metric_name'], - config_dict['vdu_name'], - config_dict['vnf_member_index'], - config_dict['ns_id']) - - # Verify return value with expected value of alarm_def_uuid - self.assertEqual(return_value, alarm_def_uuid) - - @mock.patch.object(monPlugin.DatabaseManager, 'save_alarm') - @mock.patch.object(monPlugin.MonPlugin, 'create_alarm_notification_rule') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_resource_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_moref_id') - @mock.patch.object(monPlugin.MonPlugin, 'create_alarm_definition') - @mock.patch.object(monPlugin.MonPlugin, 'create_symptom') - @mock.patch.object(monPlugin.MonPlugin, 'get_alarm_defination_by_name') - @mock.patch.object(monPlugin.MonPlugin, 'get_default_Params') - def test_configure_alarm_invalid_alarm_name_req(self, m_get_default_Params, - m_get_alarm_defination_by_name, - m_create_symptom, - m_create_alarm_definition, - m_get_vm_moref_id, - m_get_vm_resource_id, - m_create_alarm_notification_rule, - m_save_alarm): - """Test configure alarm invalid test: for invalid alarm name""" - - # Mock input configuration dictionary - config_dict = {'threshold_value': 0, 'severity': 'CRITICAL', - 'alarm_name': 'CPU_Utilization_Above_Threshold', - 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'correlation_id': 'e14b203c-6bf2-4e2f-a91c-8c19d2abcdef', - 'statistic': 'AVERAGE', 'metric_name': 'CPU_UTILIZATION', - 'operation': 'GT', 'unit': '%', - 'description': 'CPU_Utilization_Above_Threshold'} - - alarm_def_uuid = None - - # Mock default Parameters return value to None - m_get_default_Params.return_value = {} - - # Call configure_alarm method under test - return_value = self.mon_plugin.configure_alarm(config_dict) - - # Verify that mocked methods are called with correct parameters - m_get_default_Params.assert_called_with(config_dict['alarm_name']) - m_get_alarm_defination_by_name.assert_not_called() - m_create_symptom.assert_not_called() - m_create_alarm_definition.assert_not_called() - m_get_vm_moref_id.assert_not_called() - m_get_vm_resource_id.assert_not_called() - m_create_alarm_notification_rule.assert_not_called() - m_save_alarm.assert_not_called() - - # Verify return value with expected value i.e. None - self.assertEqual(return_value, alarm_def_uuid) - - @mock.patch.object(monPlugin.DatabaseManager, 'save_alarm') - @mock.patch.object(monPlugin.MonPlugin, 'create_alarm_notification_rule') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_resource_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_moref_id') - @mock.patch.object(monPlugin.MonPlugin, 'create_alarm_definition') - @mock.patch.object(monPlugin.MonPlugin, 'create_symptom') - @mock.patch.object(monPlugin.MonPlugin, 'get_alarm_defination_by_name') - @mock.patch.object(monPlugin.MonPlugin, 'get_default_Params') - def test_configure_alarm_invalid_metric_name_req(self, m_get_default_Params, - m_get_alarm_defination_by_name, - m_create_symptom, - m_create_alarm_definition, - m_get_vm_moref_id, - m_get_vm_resource_id, - m_create_alarm_notification_rule, - m_save_alarm): - """Test configure alarm invalid test: for invalid metric name""" - - # Mock input configuration dictionary - config_dict = {'threshold_value': 0, 'severity': 'CRITICAL', - 'alarm_name': 'CPU_Utilization_Above_Threshold', - 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'correlation_id': 'e14b203c-6bf2-4e2f-a91c-8c19d2abcdef', - 'statistic': 'AVERAGE', 'metric_name': 'CPU_UTILIZATION', - 'operation': 'GT', 'unit': '%', - 'description': 'CPU_Utilization_Above_Threshold'} - - alarm_def_uuid = None - - # Mock default Parameters return values for metrics to None - m_get_default_Params.side_effect = [{'impact': 'risk', 'cancel_cycles': 1, - 'adapter_kind': 'VMWARE', 'repeat': False, - 'cancel_period': 300, 'alarm_type': 16, - 'vrops_alarm': 'CPU_Utilization_Above_Thr', - 'enabled': True, 'period': 300, - 'resource_kind': 'VirtualMachine', - 'alarm_subType': 19, 'action': 'acknowledge', - 'evaluation': 1, 'unit': 'msec'}, - {} - ] - - # Call configure_alarm method under test - return_value = self.mon_plugin.configure_alarm(config_dict) - - # Verify that mocked methods are called with correct parameters - self.assertEqual(m_get_default_Params.call_count, 2) - m_get_alarm_defination_by_name.assert_not_called() - m_create_symptom.assert_not_called() - m_create_alarm_definition.assert_not_called() - m_get_vm_moref_id.assert_not_called() - m_get_vm_resource_id.assert_not_called() - m_create_alarm_notification_rule.assert_not_called() - m_save_alarm.assert_not_called() - - # Verify return value with expected value i.e. None - self.assertEqual(return_value, alarm_def_uuid) - - @mock.patch.object(monPlugin.DatabaseManager, 'save_alarm') - @mock.patch.object(monPlugin.MonPlugin, 'create_alarm_notification_rule') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_resource_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_moref_id') - @mock.patch.object(monPlugin.MonPlugin, 'create_alarm_definition') - @mock.patch.object(monPlugin.MonPlugin, 'create_symptom') - @mock.patch.object(monPlugin.MonPlugin, 'get_alarm_defination_by_name') - @mock.patch.object(monPlugin.MonPlugin, 'get_default_Params') - def test_configure_alarm_invalid_already_exists(self, m_get_default_Params, - m_get_alarm_defination_by_name, - m_create_symptom, - m_create_alarm_definition, - m_get_vm_moref_id, - m_get_vm_resource_id, - m_create_alarm_notification_rule, - m_save_alarm): - """Test configure alarm invalid test: for alarm that already exists""" - - # Mock input configuration dictionary - config_dict = {'threshold_value': 0, 'severity': 'CRITICAL', - 'alarm_name': 'CPU_Utilization_Above_Threshold', - 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'correlation_id': 'e14b203c-6bf2-4e2f-a91c-8c19d2abcdef', - 'statistic': 'AVERAGE', 'metric_name': 'CPU_UTILIZATION', - 'operation': 'GT', 'unit': '%', - 'description': 'CPU_Utilization_Above_Threshold'} - - vrops_alarm_name = 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - alarm_def_uuid = None - - # Mock default Parameters for alarm & metric configuration - m_get_default_Params.side_effect = [{'impact': 'risk', 'cancel_cycles': 1, - 'adapter_kind': 'VMWARE', 'repeat': False, - 'cancel_period': 300, 'alarm_type': 16, - 'vrops_alarm': 'CPU_Utilization_Above_Thr', - 'enabled': True, 'period': 300, - 'resource_kind': 'VirtualMachine', - 'alarm_subType': 19, 'action': 'acknowledge', - 'evaluation': 1, 'unit': 'msec'}, - {'metric_key': 'cpu|usage_average', 'unit': '%'} - ] - # set mocked function return value - m_get_alarm_defination_by_name.return_value = ['mocked_alarm_CPU_Utilization_Above_Thr'] - - # Call configure_alarm method under test - return_value = self.mon_plugin.configure_alarm(config_dict) - - # Verify that mocked methods are called with correct parameters - self.assertEqual(m_get_default_Params.call_count, 2) - m_get_alarm_defination_by_name.assert_called_with(vrops_alarm_name) - m_create_symptom.assert_not_called() - m_create_alarm_definition.assert_not_called() - m_get_vm_moref_id.assert_not_called() - m_get_vm_resource_id.assert_not_called() - m_create_alarm_notification_rule.assert_not_called() - m_save_alarm.assert_not_called() - # Verify return value with expected value of alarm_def_uuid - self.assertEqual(return_value, alarm_def_uuid) - - @mock.patch.object(monPlugin.DatabaseManager, 'save_alarm') - @mock.patch.object(monPlugin.MonPlugin, 'create_alarm_notification_rule') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_resource_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_moref_id') - @mock.patch.object(monPlugin.MonPlugin, 'create_alarm_definition') - @mock.patch.object(monPlugin.MonPlugin, 'create_symptom') - @mock.patch.object(monPlugin.MonPlugin, 'get_alarm_defination_by_name') - @mock.patch.object(monPlugin.MonPlugin, 'get_default_Params') - def test_configure_alarm_failed_symptom_creation(self, m_get_default_Params, - m_get_alarm_defination_by_name, - m_create_symptom, - m_create_alarm_definition, - m_get_vm_moref_id, - m_get_vm_resource_id, - m_create_alarm_notification_rule, - m_save_alarm): - """Test configure alarm: failed to create symptom""" - - # Mock input configuration dictionary - config_dict = {'threshold_value': 0, 'severity': 'CRITICAL', - 'alarm_name': 'CPU_Utilization_Above_Threshold', - 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'correlation_id': 'e14b203c-6bf2-4e2f-a91c-8c19d2abcdef', - 'statistic': 'AVERAGE', 'metric_name': 'CPU_UTILIZATION', - 'operation': 'GT', 'unit': '%', - 'description': 'CPU_Utilization_Above_Threshold'} - - # symptom parameters to be passed for symptom creation - symptom_params = {'threshold_value': 0, - 'cancel_cycles': 1, - 'adapter_kind_key': 'VMWARE', - 'resource_kind_key': 'VirtualMachine', - 'severity': 'CRITICAL', - 'symptom_name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'operation': 'GT', - 'wait_cycles': 1, - 'metric_key': 'cpu|usage_average'} - vrops_alarm_name = 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - alarm_def_uuid = None - - # Mock default Parameters for alarm & metric configuration - m_get_default_Params.side_effect = [{'impact': 'risk', 'cancel_cycles': 1, - 'adapter_kind': 'VMWARE', 'repeat': False, - 'cancel_period': 300, 'alarm_type': 16, - 'vrops_alarm': 'CPU_Utilization_Above_Thr', - 'enabled': True, 'period': 300, - 'resource_kind': 'VirtualMachine', - 'alarm_subType': 19, 'action': 'acknowledge', - 'evaluation': 1, 'unit': 'msec'}, - {'metric_key': 'cpu|usage_average', 'unit': '%'} - ] - # set mocked function return values - m_get_alarm_defination_by_name.return_value = [] - m_create_symptom.return_value = None - - # Call configure_alarm method under test - return_value = self.mon_plugin.configure_alarm(config_dict) - - # Verify that mocked methods are called with correct parameters - self.assertEqual(m_get_default_Params.call_count, 2) - m_get_alarm_defination_by_name.assert_called_with(vrops_alarm_name) - m_create_symptom.assert_called_with(symptom_params) - m_create_alarm_definition.assert_not_called() - m_get_vm_moref_id.assert_not_called() - m_get_vm_resource_id.assert_not_called() - m_create_alarm_notification_rule.assert_not_called() - m_save_alarm.assert_not_called() - - # Verify return value with expected value of alarm_def_uuid - self.assertEqual(return_value, alarm_def_uuid) - - @mock.patch.object(monPlugin.DatabaseManager, 'save_alarm') - @mock.patch.object(monPlugin.MonPlugin, 'create_alarm_notification_rule') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_resource_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_moref_id') - @mock.patch.object(monPlugin.MonPlugin, 'create_alarm_definition') - @mock.patch.object(monPlugin.MonPlugin, 'create_symptom') - @mock.patch.object(monPlugin.MonPlugin, 'get_alarm_defination_by_name') - @mock.patch.object(monPlugin.MonPlugin, 'get_default_Params') - def test_configure_alarm_failed_alert_creation(self, m_get_default_Params, - m_get_alarm_defination_by_name, - m_create_symptom, - m_create_alarm_definition, - m_get_vm_moref_id, - m_get_vm_resource_id, - m_create_alarm_notification_rule, - m_save_alarm): - """Test configure alarm: failed to create alert in vROPs""" - - # Mock input configuration dictionary - config_dict = {'threshold_value': 0, 'severity': 'CRITICAL', - 'alarm_name': 'CPU_Utilization_Above_Threshold', - 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'correlation_id': 'e14b203c-6bf2-4e2f-a91c-8c19d2abcdef', - 'statistic': 'AVERAGE', 'metric_name': 'CPU_UTILIZATION', - 'operation': 'GT', 'unit': '%', - 'description': 'CPU_Utilization_Above_Threshold'} - - # symptom parameters to be passed for symptom creation - symptom_params = {'threshold_value': 0, - 'cancel_cycles': 1, - 'adapter_kind_key': 'VMWARE', - 'resource_kind_key': 'VirtualMachine', - 'severity': 'CRITICAL', - 'symptom_name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'operation': 'GT', - 'wait_cycles': 1, - 'metric_key': 'cpu|usage_average'} - - # alarm parameters to be passed for alarm creation - alarm_params = {'description': 'CPU_Utilization_Above_Threshold', - 'cancelCycles': 1, 'subType': 19, - 'waitCycles': 1, 'severity': 'CRITICAL', - 'impact': 'risk', 'adapterKindKey': 'VMWARE', - 'name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'resourceKindKey': 'VirtualMachine', - 'symptomDefinitionId': 'SymptomDefinition-2e8f9ddc-9f7b-4cd6-b85d-7d7fe3a8a804', - 'type': 16} - - vrops_alarm_name = 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - alarm_def_uuid = None - - # Mock default Parameters for alarm & metric configuration - m_get_default_Params.side_effect = [{'impact': 'risk', 'cancel_cycles': 1, - 'adapter_kind': 'VMWARE', 'repeat': False, - 'cancel_period': 300, 'alarm_type': 16, - 'vrops_alarm': 'CPU_Utilization_Above_Thr', - 'enabled': True, 'period': 300, - 'resource_kind': 'VirtualMachine', - 'alarm_subType': 19, 'action': 'acknowledge', - 'evaluation': 1, 'unit': 'msec'}, - {'metric_key': 'cpu|usage_average', 'unit': '%'} - ] - # set mocked function return values - m_get_alarm_defination_by_name.return_value = [] - m_create_symptom.return_value = 'SymptomDefinition-2e8f9ddc-9f7b-4cd6-b85d-7d7fe3a8a804' - m_create_alarm_definition.return_value = None - - # Call configure_alarm method under test - return_value = self.mon_plugin.configure_alarm(config_dict) - - # Verify that mocked methods are called with correct parameters - self.assertEqual(m_get_default_Params.call_count, 2) - m_get_alarm_defination_by_name.assert_called_with(vrops_alarm_name) - m_create_symptom.assert_called_with(symptom_params) - m_create_alarm_definition.assert_called_with(alarm_params) - m_get_vm_moref_id.assert_not_called() - m_get_vm_resource_id.assert_not_called() - m_create_alarm_notification_rule.assert_not_called() - m_save_alarm.assert_not_called() - - # Verify return value with expected value of alarm_def_uuid - self.assertEqual(return_value, alarm_def_uuid) - - @mock.patch.object(monPlugin.DatabaseManager, 'save_alarm') - @mock.patch.object(monPlugin.MonPlugin, 'create_alarm_notification_rule') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_resource_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_moref_id') - @mock.patch.object(monPlugin.MonPlugin, 'create_alarm_definition') - @mock.patch.object(monPlugin.MonPlugin, 'create_symptom') - @mock.patch.object(monPlugin.MonPlugin, 'get_alarm_defination_by_name') - @mock.patch.object(monPlugin.MonPlugin, 'get_default_Params') - def test_configure_alarm_failed_to_get_vm_moref_id(self, m_get_default_Params, - m_get_alarm_defination_by_name, - m_create_symptom, - m_create_alarm_definition, - m_get_vm_moref_id, - m_get_vm_resource_id, - m_create_alarm_notification_rule, - m_save_alarm): - """Test configure alarm: failed to get vm_moref_id""" - - # Mock input configuration dictionary - config_dict = {'threshold_value': 0, 'severity': 'CRITICAL', - 'alarm_name': 'CPU_Utilization_Above_Threshold', - 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'correlation_id': 'e14b203c-6bf2-4e2f-a91c-8c19d2abcdef', - 'statistic': 'AVERAGE', 'metric_name': 'CPU_UTILIZATION', - 'operation': 'GT', 'unit': '%', - 'description': 'CPU_Utilization_Above_Threshold'} - - # symptom parameters to be passed for symptom creation - symptom_params = {'threshold_value': 0, - 'cancel_cycles': 1, - 'adapter_kind_key': 'VMWARE', - 'resource_kind_key': 'VirtualMachine', - 'severity': 'CRITICAL', - 'symptom_name': \ - 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'operation': 'GT', - 'wait_cycles': 1, - 'metric_key': 'cpu|usage_average'} - - # alarm parameters to be passed for alarm creation - alarm_params = {'description': 'CPU_Utilization_Above_Threshold', - 'cancelCycles': 1, 'subType': 19, - 'waitCycles': 1, 'severity': 'CRITICAL', - 'impact': 'risk', 'adapterKindKey': 'VMWARE', - 'name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'resourceKindKey': 'VirtualMachine', - 'symptomDefinitionId': \ - 'SymptomDefinition-2e8f9ddc-9f7b-4cd6-b85d-7d7fe3a8a804', - 'type': 16} - - vrops_alarm_name = 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - alarm_def_uuid = None - - # Mock default Parameters for alarm & metric configuration - m_get_default_Params.side_effect = [{'impact': 'risk', 'cancel_cycles': 1, - 'adapter_kind': 'VMWARE', 'repeat': False, - 'cancel_period': 300, 'alarm_type': 16, - 'vrops_alarm': 'CPU_Utilization_Above_Thr', - 'enabled': True, 'period': 300, - 'resource_kind': 'VirtualMachine', - 'alarm_subType': 19, 'action': 'acknowledge', - 'evaluation': 1, 'unit': 'msec'}, - {'metric_key': 'cpu|usage_average', 'unit': '%'} - ] - # set mocked function return values - m_get_alarm_defination_by_name.return_value = [] - m_create_symptom.return_value = 'SymptomDefinition-2e8f9ddc-9f7b-4cd6-b85d-7d7fe3a8a804' - m_create_alarm_definition.return_value = \ - 'AlertDefinition-0f3cdcb3-4e1b-4a0b-86d0-66d4b3f65220' - m_get_vm_moref_id.return_value = None - - # Call configure_alarm method under test - return_value = self.mon_plugin.configure_alarm(config_dict) - - # Verify that mocked methods are called with correct parameters - self.assertEqual(m_get_default_Params.call_count, 2) - m_get_alarm_defination_by_name.assert_called_with(vrops_alarm_name) - m_create_symptom.assert_called_with(symptom_params) - m_create_alarm_definition.assert_called_with(alarm_params) - m_get_vm_moref_id.assert_called_with(config_dict['resource_uuid']) - m_get_vm_resource_id.assert_not_called() - m_create_alarm_notification_rule.assert_not_called() - m_save_alarm.assert_not_called() - - # Verify return value with expected value of alarm_def_uuid - self.assertEqual(return_value, alarm_def_uuid) - - @mock.patch.object(monPlugin.DatabaseManager, 'save_alarm') - @mock.patch.object(monPlugin.MonPlugin, 'create_alarm_notification_rule') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_resource_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_moref_id') - @mock.patch.object(monPlugin.MonPlugin, 'create_alarm_definition') - @mock.patch.object(monPlugin.MonPlugin, 'create_symptom') - @mock.patch.object(monPlugin.MonPlugin, 'get_alarm_defination_by_name') - @mock.patch.object(monPlugin.MonPlugin, 'get_default_Params') - def test_configure_alarm_failed_to_get_vm_resource_id(self, m_get_default_Params, - m_get_alarm_defination_by_name, - m_create_symptom, - m_create_alarm_definition, - m_get_vm_moref_id, - m_get_vm_resource_id, - m_create_alarm_notification_rule, - m_save_alarm): - """Test configure alarm: failed to get vm resource_id""" - - # Mock input configuration dictionary - config_dict = {'threshold_value': 0, 'severity': 'CRITICAL', - 'alarm_name': 'CPU_Utilization_Above_Threshold', - 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'correlation_id': 'e14b203c-6bf2-4e2f-a91c-8c19d2abcdef', - 'statistic': 'AVERAGE', 'metric_name': 'CPU_UTILIZATION', - 'operation': 'GT', 'unit': '%', - 'description': 'CPU_Utilization_Above_Threshold'} - - # symptom parameters to be passed for symptom creation - symptom_params = {'threshold_value': 0, - 'cancel_cycles': 1, - 'adapter_kind_key': 'VMWARE', - 'resource_kind_key': 'VirtualMachine', - 'severity': 'CRITICAL', - 'symptom_name': \ - 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'operation': 'GT', - 'wait_cycles': 1, - 'metric_key': 'cpu|usage_average'} - - # alarm parameters to be passed for alarm creation - alarm_params = {'description': 'CPU_Utilization_Above_Threshold', - 'cancelCycles': 1, 'subType': 19, - 'waitCycles': 1, 'severity': 'CRITICAL', - 'impact': 'risk', 'adapterKindKey': 'VMWARE', - 'name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'resourceKindKey': 'VirtualMachine', - 'symptomDefinitionId': \ - 'SymptomDefinition-2e8f9ddc-9f7b-4cd6-b85d-7d7fe3a8a804', - 'type': 16} - - vrops_alarm_name = 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - vm_moref_id = 'vm-6626' - alarm_def_uuid = None - - # Mock default Parameters for alarm & metric configuration - m_get_default_Params.side_effect = [{'impact': 'risk', 'cancel_cycles': 1, - 'adapter_kind': 'VMWARE', 'repeat': False, - 'cancel_period': 300, 'alarm_type': 16, - 'vrops_alarm': 'CPU_Utilization_Above_Thr', - 'enabled': True, 'period': 300, - 'resource_kind': 'VirtualMachine', - 'alarm_subType': 19, 'action': 'acknowledge', - 'evaluation': 1, 'unit': 'msec'}, - {'metric_key': 'cpu|usage_average', 'unit': '%'} - ] - # set mocked function return values - m_get_alarm_defination_by_name.return_value = [] - m_create_symptom.return_value = 'SymptomDefinition-2e8f9ddc-9f7b-4cd6-b85d-7d7fe3a8a804' - m_create_alarm_definition.return_value = \ - 'AlertDefinition-0f3cdcb3-4e1b-4a0b-86d0-66d4b3f65220' - m_get_vm_moref_id.return_value = vm_moref_id - m_get_vm_resource_id.return_value = None - m_save_alarm.assert_not_called() - - # Call configure_alarm method under test - return_value = self.mon_plugin.configure_alarm(config_dict) - - # Verify that mocked methods are called with correct parameters - self.assertEqual(m_get_default_Params.call_count, 2) - m_get_alarm_defination_by_name.assert_called_with(vrops_alarm_name) - m_create_symptom.assert_called_with(symptom_params) - m_create_alarm_definition.assert_called_with(alarm_params) - m_get_vm_moref_id.assert_called_with(config_dict['resource_uuid']) - m_get_vm_resource_id.assert_called_with(vm_moref_id) - m_create_alarm_notification_rule.assert_not_called() - - # Verify return value with expected value of alarm_def_uuid - self.assertEqual(return_value, alarm_def_uuid) - - @mock.patch.object(monPlugin.DatabaseManager, 'save_alarm') - @mock.patch.object(monPlugin.MonPlugin, 'create_alarm_notification_rule') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_resource_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_moref_id') - @mock.patch.object(monPlugin.MonPlugin, 'create_alarm_definition') - @mock.patch.object(monPlugin.MonPlugin, 'create_symptom') - @mock.patch.object(monPlugin.MonPlugin, 'get_alarm_defination_by_name') - @mock.patch.object(monPlugin.MonPlugin, 'get_default_Params') - def test_configure_alarm_failed_to_create_alarm_notification_rule(self, m_get_default_Params, - m_get_alarm_defination_by_name, - m_create_symptom, - m_create_alarm_definition, - m_get_vm_moref_id, - m_get_vm_resource_id, - m_create_alarm_notification_rule, - m_save_alarm): - """Test configure alarm: failed to create alarm notification rule""" - - # Mock input configuration dictionary - config_dict = {'threshold_value': 0, 'severity': 'CRITICAL', - 'alarm_name': 'CPU_Utilization_Above_Threshold', - 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'correlation_id': 'e14b203c-6bf2-4e2f-a91c-8c19d2abcdef', - 'statistic': 'AVERAGE', 'metric_name': 'CPU_UTILIZATION', - 'operation': 'GT', 'unit': '%', - 'description': 'CPU_Utilization_Above_Threshold'} - - # symptom parameters to be passed for symptom creation - symptom_params = {'threshold_value': 0, - 'cancel_cycles': 1, - 'adapter_kind_key': 'VMWARE', - 'resource_kind_key': 'VirtualMachine', - 'severity': 'CRITICAL', - 'symptom_name': \ - 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'operation': 'GT', - 'wait_cycles': 1, - 'metric_key': 'cpu|usage_average'} - - # alarm parameters to be passed for alarm creation - alarm_params = {'description': 'CPU_Utilization_Above_Threshold', - 'cancelCycles': 1, 'subType': 19, - 'waitCycles': 1, 'severity': 'CRITICAL', - 'impact': 'risk', 'adapterKindKey': 'VMWARE', - 'name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'resourceKindKey': 'VirtualMachine', - 'symptomDefinitionId': \ - 'SymptomDefinition-2e8f9ddc-9f7b-4cd6-b85d-7d7fe3a8a804', - 'type': 16} - - vrops_alarm_name = 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - vm_moref_id = 'vm-6626' - alarm_def = 'AlertDefinition-0f3cdcb3-4e1b-4a0b-86d0-66d4b3f65220' - resource_id = 'ac87622f-b761-40a0-b151-00872a2a456e' - alarm_def_uuid = None - - # Mock default Parameters for alarm & metric configuration - m_get_default_Params.side_effect = [{'impact': 'risk', 'cancel_cycles': 1, - 'adapter_kind': 'VMWARE', 'repeat': False, - 'cancel_period': 300, 'alarm_type': 16, - 'vrops_alarm': 'CPU_Utilization_Above_Thr', - 'enabled': True, 'period': 300, - 'resource_kind': 'VirtualMachine', - 'alarm_subType': 19, 'action': 'acknowledge', - 'evaluation': 1, 'unit': 'msec'}, - {'metric_key': 'cpu|usage_average', 'unit': '%'} - ] - # set mocked function return values - m_get_alarm_defination_by_name.return_value = [] - m_create_symptom.return_value = 'SymptomDefinition-2e8f9ddc-9f7b-4cd6-b85d-7d7fe3a8a804' - m_create_alarm_definition.return_value = \ - 'AlertDefinition-0f3cdcb3-4e1b-4a0b-86d0-66d4b3f65220' - m_get_vm_moref_id.return_value = vm_moref_id - m_get_vm_resource_id.return_value = 'ac87622f-b761-40a0-b151-00872a2a456e' - m_create_alarm_notification_rule.return_value = None - - # Call configure_alarm method under test - return_value = self.mon_plugin.configure_alarm(config_dict) - - # Verify that mocked methods are called with correct parameters - self.assertEqual(m_get_default_Params.call_count, 2) - m_get_alarm_defination_by_name.assert_called_with(vrops_alarm_name) - m_create_symptom.assert_called_with(symptom_params) - m_create_alarm_definition.assert_called_with(alarm_params) - m_get_vm_moref_id.assert_called_with(config_dict['resource_uuid']) - m_get_vm_resource_id.assert_called_with(vm_moref_id) - m_create_alarm_notification_rule.assert_called_with(vrops_alarm_name, alarm_def, resource_id) - m_save_alarm.assert_not_called() - - # Verify return value with expected value of alarm_def_uuid - self.assertEqual(return_value, alarm_def_uuid) - - @mock.patch.object(monPlugin.requests, 'get') - def test_get_alarm_defination_details_valid_rest_req_response(self, m_get): - """Test get_alarm_defination_details: For a valid REST request response""" - - alarm_uuid = '9a6d8a14-9f25-4d81-bf91-4d773497444d' - - # Set mocked function's return values - m_get.return_value.status_code = 200 - m_get.return_value.content = '{"id":"AlertDefinition-9a6d8a14-9f25-4d81-bf91-4d773497444d",\ - "name":"CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4",\ - "description":"CPU_Utilization_Above_Threshold",\ - "adapterKindKey":"VMWARE","resourceKindKey":"VirtualMachine",\ - "waitCycles":1,"cancelCycles":1,"type":16,"subType":19,\ - "states":[{"severity":"CRITICAL","base-symptom-set":\ - {"type":"SYMPTOM_SET","relation":"SELF",\ - "aggregation":"ALL","symptomSetOperator":"AND","symptomDefinitionIds":\ - ["SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278"]},\ - "impact":{"impactType":"BADGE","detail":"risk"}}]}' - - expected_alarm_details = {'adapter_kind': 'VMWARE', 'symptom_definition_id': \ - 'SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278', - 'alarm_name': \ - 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'alarm_id': 'AlertDefinition-9a6d8a14-9f25-4d81-bf91-4d773497444d', - 'resource_kind': 'VirtualMachine', 'type': 16, 'sub_type': 19} - - expected_alarm_details_json = {'states': - [{'impact': - {'impactType': 'BADGE', 'detail': 'risk'}, 'severity': 'CRITICAL', - 'base-symptom-set': {'symptomDefinitionIds': \ - [ - 'SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278'], - 'relation': 'SELF', 'type': 'SYMPTOM_SET', - 'aggregation': 'ALL', 'symptomSetOperator': 'AND'}}], - 'adapterKindKey': 'VMWARE', - 'description': 'CPU_Utilization_Above_Threshold', - 'type': 16, 'cancelCycles': 1, - 'resourceKindKey': 'VirtualMachine', - 'subType': 19, 'waitCycles': 1, - 'id': 'AlertDefinition-9a6d8a14-9f25-4d81-bf91-4d773497444d', - 'name': \ - 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4'} - - # Call get_alarm_defination_details method under test - alarm_details_json, alarm_details = self.mon_plugin.get_alarm_defination_details(alarm_uuid) - - # Verify that mocked method is called - m_get.assert_called() - - # Verify return value with expected value - self.assertEqual(expected_alarm_details, alarm_details) - self.assertEqual(expected_alarm_details_json, alarm_details_json) - - @mock.patch.object(monPlugin.requests, 'get') - def test_get_alarm_defination_details_invalid_rest_req_response(self, m_get): - """Test get_alarm_defination_details: For an invalid REST request response""" - - alarm_uuid = '9a6d8a14-9f25-4d81-bf91-4d773497444d' - - # Set mocked function's return values - m_get.return_value.status_code = 404 - m_get.return_value.content = '{"message": "No such AlertDefinition - \ - AlertDefinition-9a6d8a14-9f25-4d81-bf91-4d773497444.",\ - "httpStatusCode": 404,"apiErrorCode": 404}' - - expected_alarm_details = None - expected_alarm_details_json = None - - # Call get_alarm_defination_details method under test - alarm_details_json, alarm_details = self.mon_plugin.get_alarm_defination_details(alarm_uuid) - - # verify that mocked method is called - m_get.assert_called() - - # Verify return value with expected value - self.assertEqual(expected_alarm_details, alarm_details) - self.assertEqual(expected_alarm_details_json, alarm_details_json) - - @mock.patch.object(monPlugin.requests, 'get') - def test_get_alarm_defination_by_name_valid_rest_req_response(self, m_get): - """Test get_alarm_defination_by_name: For a valid REST request response""" - - alarm_name = 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - - # Set mocked function's return values - m_get.return_value.status_code = 200 - m_get.return_value.content = '{"pageInfo": {"totalCount": 1,"page": 0,"pageSize": 1000},\ - "links": [\ - {"href": "/suite-api/api/alertdefinitions?page=0&pageSize=1000",\ - "rel": "SELF","name": "current"},\ - {"href": "/suite-api/api/alertdefinitions?page=0&pageSize=1000",\ - "rel": "RELATED","name": "first"},\ - {"href": "/suite-api/api/alertdefinitions?page=0&pageSize=1000",\ - "rel": "RELATED","name": "last"}],\ - "alertDefinitions": [{\ - "id": "AlertDefinition-9a6d8a14-9f25-4d81-bf91-4d773497444d",\ - "name": "CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4",\ - "description": "CPU_Utilization_Above_Threshold",\ - "adapterKindKey": "VMWARE","resourceKindKey": "VirtualMachine",\ - "waitCycles": 1,"cancelCycles": 1,"type": 16,"subType": 19,\ - "states": [{"impact": {"impactType": "BADGE","detail": "risk"},\ - "severity": "CRITICAL",\ - "base-symptom-set": {"type": "SYMPTOM_SET",\ - "relation": "SELF","aggregation": "ALL",\ - "symptomSetOperator": "AND",\ - "symptomDefinitionIds": [\ - "SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278"]}}]\ - }]}' - - # Expected return match list - Exp_alert_match_list = [{'states': - [{'impact': {'impactType': 'BADGE', 'detail': 'risk'}, - 'severity': 'CRITICAL', - 'base-symptom-set': { - 'symptomDefinitionIds': \ - ['SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278'], - 'relation': 'SELF', - 'type': 'SYMPTOM_SET', - 'aggregation': 'ALL', - 'symptomSetOperator': 'AND'} - }], - 'adapterKindKey': 'VMWARE', - 'description': 'CPU_Utilization_Above_Threshold', - 'type': 16, - 'cancelCycles': 1, - 'resourceKindKey': 'VirtualMachine', - 'subType': 19, 'waitCycles': 1, - 'id': 'AlertDefinition-9a6d8a14-9f25-4d81-bf91-4d773497444d', - 'name': \ - 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - }] - - # Call get_alarm_defination_by_name method under test - alert_match_list = self.mon_plugin.get_alarm_defination_by_name(alarm_name) - - # Verify that mocked method is called - m_get.assert_called() - - # Verify return value with expected value - self.assertEqual(Exp_alert_match_list, alert_match_list) - - @mock.patch.object(monPlugin.requests, 'get') - def test_get_alarm_defination_by_name_no_valid_alarm_found(self, m_get): - """Test get_alarm_defination_by_name: With no valid alarm found in returned list""" - - alarm_name = 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda5' - - # Set mocked function's return values - m_get.return_value.status_code = 200 - m_get.return_value.content = '{"pageInfo": {"totalCount": 1,"page": 0,"pageSize": 1000},\ - "links": [\ - {"href": "/suite-api/api/alertdefinitions?page=0&pageSize=1000",\ - "rel": "SELF","name": "current"},\ - {"href": "/suite-api/api/alertdefinitions?page=0&pageSize=1000",\ - "rel": "RELATED","name": "first"},\ - {"href": "/suite-api/api/alertdefinitions?page=0&pageSize=1000",\ - "rel": "RELATED","name": "last"}],\ - "alertDefinitions": [{\ - "id": "AlertDefinition-9a6d8a14-9f25-4d81-bf91-4d773497444d",\ - "name": "CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4",\ - "description": "CPU_Utilization_Above_Threshold",\ - "adapterKindKey": "VMWARE","resourceKindKey": "VirtualMachine",\ - "waitCycles": 1,"cancelCycles": 1,"type": 16,"subType": 19,\ - "states": [{"impact": {"impactType": "BADGE","detail": "risk"},\ - "severity": "CRITICAL",\ - "base-symptom-set": {"type": "SYMPTOM_SET",\ - "relation": "SELF","aggregation": "ALL",\ - "symptomSetOperator": "AND",\ - "symptomDefinitionIds": [\ - "SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278"]}}]\ - }]}' - - # Expected return match list - Exp_alert_match_list = [] - - # Call get_alarm_defination_by_name method under test - alert_match_list = self.mon_plugin.get_alarm_defination_by_name(alarm_name) - - # Verify that mocked method is called - m_get.assert_called() - - # Verify return value with expected value - self.assertEqual(Exp_alert_match_list, alert_match_list) - - @mock.patch.object(monPlugin.requests, 'put') - @mock.patch.object(monPlugin.MonPlugin, 'get_symptom_defination_details') - def test_update_symptom_defination_valid_symptom_req_response(self, - m_get_symptom_defination_details, - m_put): - """Test update_symptom_defination: With valid REST response, update symptom""" - - # Expected symptom to be updated - symptom_defination_id = 'SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278' - new_alarm_config = {'severity': "CRITICAL", - 'operation': 'GT', - 'threshold_value': 5, - 'alarm_uuid': '9a6d8a14-9f25-4d81-bf91-4d773497444d' - } - - # Set mocked function's return values - m_get_symptom_defination_details.return_value = { - "id": "SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278", - "name": "CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4", - "adapterKindKey": "VMWARE", - "resourceKindKey": "VirtualMachine", - "waitCycles": 1, - "cancelCycles": 1, - "state": {"severity": "CRITICAL", - "condition": { - "type": "CONDITION_HT", - "key": "cpu|usage_average", "operator": "GT", "value": "0.0", - "valueType": "NUMERIC", "instanced": False, - "thresholdType": "STATIC"} - } - } - - m_put.return_value.status_code = 200 - m_put.return_value.content = '{\ - "id":"SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278",\ - "name":"CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4",\ - "adapterKindKey":"VMWARE","resourceKindKey":"VirtualMachine","waitCycles":1,\ - "cancelCycles":1,\ - "state":{\ - "severity":"CRITICAL",\ - "condition":{\ - "type":"CONDITION_HT","key":"cpu|usage_average","operator":"GT","value":"5.0",\ - "valueType":"NUMERIC","instanced":False,"thresholdType":"STATIC"}}}' - - # Call update_symptom_defination method under test - symptom_uuid = self.mon_plugin.update_symptom_defination(symptom_defination_id, - new_alarm_config) - - # Verify that mocked method is called with required parameters - m_get_symptom_defination_details.assert_called_with(symptom_defination_id) - # m_put.assert_called_with(symptom_defination_id,new_alarm_config) - - # Verify return value with expected value - self.assertEqual(symptom_defination_id, symptom_uuid) - - @mock.patch.object(monPlugin.requests, 'put') - @mock.patch.object(monPlugin.MonPlugin, 'get_symptom_defination_details') - def test_update_symptom_defination_invalid_symptom_req_response(self, - m_get_symptom_defination_details, - m_put): - """Test update_symptom_defination: If invalid REST response received, return None""" - - # Expected symptom to be updated - symptom_defination_id = 'SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278' - new_alarm_config = {'severity': "CRITICAL", - 'operation': 'GT', - 'threshold_value': 5, - 'alarm_uuid': '9a6d8a14-9f25-4d81-bf91-4d773497444d' - } - - # Set mocked function's return values - m_get_symptom_defination_details.return_value = { - "id": "SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278", - "name": "CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4", - "adapterKindKey": "VMWARE", - "resourceKindKey": "VirtualMachine", - "waitCycles": 1, - "cancelCycles": 1, - "state": {"severity": "CRITICAL", - "condition": { - "type": "CONDITION_HT", - "key": "cpu|usage_average", "operator": "GT", "value": "0.0", - "valueType": "NUMERIC", "instanced": False, - "thresholdType": "STATIC"} - } - } - - m_put.return_value.status_code = 500 - m_put.return_value.content = '{\ - "message": "Internal Server error, cause unknown.",\ - "moreInformation": [\ - {"name": "errorMessage",\ - "value": "Symptom Definition CPU_Utilization_Above_Thr-e14b203c-\ - 6bf2-4e2f-a91c-8c19d240eda4 does not exist and hence cannot be updated."},\ - {"name": "localizedMessage",\ - "value": "Symptom Definition CPU_Utilization_Above_Thr-e14b203c-\ - 6bf2-4e2f-a91c-8c19d240eda4 does not exist and hence cannot be updated.;"}],\ - "httpStatusCode": 500,"apiErrorCode": 500}' - - # Call update_symptom_defination method under test - symptom_uuid = self.mon_plugin.update_symptom_defination(symptom_defination_id, - new_alarm_config) - - # Verify that mocked method is called with required parameters - m_get_symptom_defination_details.assert_called_with(symptom_defination_id) - m_put.assert_called() - - # Verify return value with expected value - self.assertEqual(symptom_uuid, None) - - @mock.patch.object(monPlugin.requests, 'put') - @mock.patch.object(monPlugin.MonPlugin, 'get_symptom_defination_details') - def test_update_symptom_defination_failed_to_get_symptom_defination(self, - m_get_symptom_defination_details, - m_put): - """Test update_symptom_defination: if fails to get symptom_defination returns None""" - - # Expected symptom to be updated - symptom_defination_id = 'SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278' - new_alarm_config = {'severity': "CRITICAL", - 'operation': 'GT', - 'threshold_value': 5, - 'alarm_uuid': '9a6d8a14-9f25-4d81-bf91-4d773497444d' - } - - # Set mocked function's return values - m_get_symptom_defination_details.return_value = None - - # Call update_symptom_defination method under test - symptom_uuid = self.mon_plugin.update_symptom_defination(symptom_defination_id, - new_alarm_config) - - # Verify that mocked method is called with required parameters - m_get_symptom_defination_details.assert_called_with(symptom_defination_id) - m_put.assert_not_called() - - # Verify return value with expected value - self.assertEqual(symptom_uuid, None) - - @mock.patch.object(monPlugin.requests, 'get') - def test_get_symptom_defination_details_valid_req_response(self, m_get): - """Test update_symptom_defination: With valid REST response symptom is created""" - - # Expected symptom to be updated - symptom_uuid = 'SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278' - - # Set mocked function's return values - m_get.return_value.status_code = 200 - m_get.return_value.content = '{\ - "id": "SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278",\ - "name": "CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4",\ - "adapterKindKey": "VMWARE","resourceKindKey": "VirtualMachine","waitCycles": 1,\ - "cancelCycles": 1,"state": {"severity": "CRITICAL","condition": {"type": "CONDITION_HT",\ - "key": "cpu|usage_average","operator": "GT","value": "6.0","valueType": "NUMERIC",\ - "instanced": false,"thresholdType": "STATIC"}}}' - expected_symptom_details = { \ - "id": "SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278", - "name": "CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4", - "adapterKindKey": "VMWARE", "resourceKindKey": "VirtualMachine", "waitCycles": 1, - "cancelCycles": 1, "state": {"severity": "CRITICAL", "condition": {"type": "CONDITION_HT", - "key": "cpu|usage_average", - "operator": "GT", "value": "6.0", - "valueType": "NUMERIC", - "instanced": False, - "thresholdType": "STATIC"}}} - - # Call update_symptom_defination method under test - symptom_details = self.mon_plugin.get_symptom_defination_details(symptom_uuid) - - # Verify that mocked method is called with required parameters - m_get.assert_called() - - # Verify return value with expected value - self.assertEqual(expected_symptom_details, symptom_details) - - @mock.patch.object(monPlugin.requests, 'get') - def test_get_symptom_defination_details_invalid_req_response(self, m_get): - """Test update_symptom_defination: if invalid REST response received return None""" - - # Expected symptom to be updated - symptom_uuid = 'SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278' - - # Set mocked function's return values - m_get.return_value.status_code = 404 - m_get.return_value.content = '{"message": "No such SymptomDefinition\ - - SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278.",\ - "httpStatusCode": 404,"apiErrorCode": 404}' - - expected_symptom_details = None - - # Call update_symptom_defination method under test - symptom_details = self.mon_plugin.get_symptom_defination_details(symptom_uuid) - - # Verify that mocked method is called with required parameters - m_get.assert_called() - - # Verify return value with expected value - self.assertEqual(expected_symptom_details, symptom_details) - - @mock.patch.object(monPlugin.requests, 'get') - def test_get_symptom_defination_details_symptom_uuid_not_provided(self, m_get): - """Test update_symptom_defination: if required symptom uuid is not provided""" - - # Expected symptom to be updated - symptom_uuid = None - expected_symptom_details = None - - # Call update_symptom_defination method under test - symptom_details = self.mon_plugin.get_symptom_defination_details(symptom_uuid) - - # Verify that mocked method is called with required parameters - m_get.assert_not_called() - - # Verify return value with expected value - self.assertEqual(expected_symptom_details, symptom_details) - - @mock.patch.object(monPlugin.requests, 'put') - def test_reconfigure_alarm_valid_req_response(self, m_put): - """Test reconfigure_alarm: for valid REST response""" - - # Set input parameters to reconfigure_alarm - alarm_details_json = { - 'id': 'AlertDefinition-9a6d8a14-9f25-4d81-bf91-4d773497444d', - 'name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'description': 'CPU_Utilization_Above_Threshold', 'adapterKindKey': 'VMWARE', - 'states': [{'impact': {'impactType': 'BADGE', 'detail': 'risk'}, 'severity': 'CRITICAL', - 'base-symptom-set': { - 'symptomDefinitionIds': ['SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278'], - 'relation': 'SELF', 'type': 'SYMPTOM_SET', 'aggregation': 'ALL', - 'symptomSetOperator': 'AND'}}], - 'type': 16, 'cancelCycles': 1, 'resourceKindKey': 'VirtualMachine', 'subType': 19, - 'waitCycles': 1} - - new_alarm_config = {'severity': 'WARNING', - 'description': 'CPU_Utilization_Above_Threshold_Warning'} - - # Set mocked function's return values - m_put.return_value.status_code = 200 - m_put.return_value.content = '{"id":"AlertDefinition-9a6d8a14-9f25-4d81-bf91-4d773497444d",\ - "name":"CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4",\ - "description":"CPU_Utilization_Above_Threshold_Warning","adapterKindKey":"VMWARE",\ - "resourceKindKey":"VirtualMachine","waitCycles":1,"cancelCycles":1,"type":16,\ - "subType":19,"states":[{"severity":"WARNING","base-symptom-set":{"type":"SYMPTOM_SET",\ - "relation":"SELF","aggregation":"ALL","symptomSetOperator":"AND",\ - "symptomDefinitionIds":["SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278"]},\ - "impact":{"impactType":"BADGE","detail":"risk"}}]}' - - # Expected alarm_def_uuid to be returned - expected_alarm_def_uuid = '9a6d8a14-9f25-4d81-bf91-4d773497444d' - - # Call reconfigure_alarm method under test - alarm_def_uuid = self.mon_plugin.reconfigure_alarm(alarm_details_json, new_alarm_config) - - # Verify that mocked method is called with required parameters - m_put.assert_called() - - # Verify return value with expected value - self.assertEqual(expected_alarm_def_uuid, alarm_def_uuid) - - @mock.patch.object(monPlugin.requests, 'put') - def test_reconfigure_alarm_invalid_req_response(self, m_put): - """Test reconfigure_alarm: for invalid REST response, return None""" - - # Set input parameters to reconfigure_alarm - alarm_details_json = { - 'id': 'AlertDefinition-9a6d8a14-9f25-4d81-bf91-4d773497444d', - 'name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'description': 'CPU_Utilization_Above_Threshold', 'adapterKindKey': 'VMWARE', - 'states': [{'impact': {'impactType': 'BADGE', 'detail': 'risk'}, 'severity': 'CRITICAL', - 'base-symptom-set': { - 'symptomDefinitionIds': ['SymptomDefinition-bcc2cb36-a67b-4deb-bcd3-9b5884973278'], - 'relation': 'SELF', 'type': 'SYMPTOM_SET', 'aggregation': 'ALL', - 'symptomSetOperator': 'AND'}}], - 'type': 16, 'cancelCycles': 1, 'resourceKindKey': 'VirtualMachine', 'subType': 19, - 'waitCycles': 1} - - new_alarm_config = {'severity': 'WARNING', - 'description': 'CPU_Utilization_Above_Threshold_Warning'} - - # Set mocked function's return values - m_put.return_value.status_code = 500 - m_put.return_value.content = '{"message": "Internal Server error, cause unknown.",\ - "moreInformation": [{"name": "errorMessage",\ - "value": "Cannot update Alert Definition CPU_Utilization_Above_Thr-\ - e14b203c-6bf2-4e2f-a91c-8c19d240eda4 since it does not exist"},\ - {"name": "localizedMessage",\ - "value": "Cannot update Alert Definition CPU_Utilization_Above_Thr-\ - e14b203c-6bf2-4e2f-a91c-8c19d240eda4 since it does not exist;"}],\ - "httpStatusCode": 500,"apiErrorCode": 500}' - - # Expected alarm_def_uuid to be returned - expected_alarm_def_uuid = None - - # Call reconfigure_alarm method under test - alarm_def_uuid = self.mon_plugin.reconfigure_alarm(alarm_details_json, new_alarm_config) - - # Verify that mocked method is called with required parameters - m_put.assert_called() - - # Verify return value with expected value - self.assertEqual(expected_alarm_def_uuid, alarm_def_uuid) - - @mock.patch.object(monPlugin.MonPlugin, 'delete_symptom_definition') - @mock.patch.object(monPlugin.MonPlugin, 'delete_alarm_defination') - @mock.patch.object(monPlugin.MonPlugin, 'delete_notification_rule') - @mock.patch.object(monPlugin.MonPlugin, 'get_alarm_defination_details') - def test_delete_alarm_configuration_successful_alarm_deletion(self, - m_get_alarm_defination_details, - m_delete_notification_rule, - m_delete_alarm_defination, - m_delete_symptom_definition): - """Test delete_alarm_configuration: for successful alarm deletion, return alarm uuid""" - - # Set input parameters to delete_alarm_configuration - delete_alarm_req_dict = {'alarm_uuid': '9a6d8a14-9f25-4d81-bf91-4d773497444d'} - - # Set mocked function's return values - alarm_details_json = { - 'id': 'AlertDefinition-9a6d8a14-9f25-4d81-4d773497444d', - 'name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-8c19d240eda4', - 'symptomDefinitionIds': ['SymptomDefinition-bcc2cb36-a67b-4deb-9b5884973278']} - alarm_details = { - 'alarm_name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-8c19d240eda4', - 'alarm_id': 'AlertDefinition-9a6d8a14-9f25-4d81-4d773497444d', - 'symptom_definition_id': 'SymptomDefinition-bcc2cb36-a67b-4deb-9b5884973278'} - - m_get_alarm_defination_details.return_value = (alarm_details_json, alarm_details) - m_delete_notification_rule.return_value = '989e7293-d78d-4405-92e30ec4f247' - m_delete_alarm_defination.return_value = alarm_details['alarm_id'] - m_delete_symptom_definition.return_value = alarm_details['symptom_definition_id'] - - # Call reconfigure_alarm method under test - alarm_uuid = self.mon_plugin.delete_alarm_configuration(delete_alarm_req_dict) - - # Verify that mocked method is called with required parameters - m_get_alarm_defination_details.assert_called_with(delete_alarm_req_dict['alarm_uuid']) - m_delete_notification_rule.assert_called_with(alarm_details['alarm_name']) - m_delete_alarm_defination.assert_called_with(alarm_details['alarm_id']) - m_delete_symptom_definition.assert_called_with(alarm_details['symptom_definition_id']) - - # Verify return value with expected value - self.assertEqual(alarm_uuid, delete_alarm_req_dict['alarm_uuid']) - - @mock.patch.object(monPlugin.MonPlugin, 'delete_symptom_definition') - @mock.patch.object(monPlugin.MonPlugin, 'delete_alarm_defination') - @mock.patch.object(monPlugin.MonPlugin, 'delete_notification_rule') - @mock.patch.object(monPlugin.MonPlugin, 'get_alarm_defination_details') - def test_delete_alarm_configuration_failed_to_get_alarm_defination(self, - m_get_alarm_defination_details, - m_delete_notification_rule, - m_delete_alarm_defination, - m_delete_symptom_definition): - """Test delete_alarm_configuration: if failed to get alarm definition, return None""" - - # Set input parameters to delete_alarm_configuration - delete_alarm_req_dict = {'alarm_uuid': '9a6d8a14-9f25-4d81-bf91-4d773497444d'} - - # Set mocked function's return values - alarm_details_json = None - alarm_details = None - - m_get_alarm_defination_details.return_value = (alarm_details_json, alarm_details) - - # Call reconfigure_alarm method under test - alarm_uuid = self.mon_plugin.delete_alarm_configuration(delete_alarm_req_dict) - - # Verify that mocked method is called with required parameters - m_get_alarm_defination_details.assert_called_with(delete_alarm_req_dict['alarm_uuid']) - m_delete_notification_rule.assert_not_called() - m_delete_alarm_defination.assert_not_called() - m_delete_symptom_definition.assert_not_called() - - # Verify return value with expected value - self.assertEqual(alarm_uuid, None) - - @mock.patch.object(monPlugin.MonPlugin, 'delete_symptom_definition') - @mock.patch.object(monPlugin.MonPlugin, 'delete_alarm_defination') - @mock.patch.object(monPlugin.MonPlugin, 'delete_notification_rule') - @mock.patch.object(monPlugin.MonPlugin, 'get_alarm_defination_details') - def test_delete_alarm_configuration_failed_to_delete_notification_rule(self, - m_get_alarm_defination_details, - m_delete_notification_rule, - m_delete_alarm_defination, - m_delete_symptom_definition): - """Test delete_alarm_configuration: if failed to delete notification rule, return None""" - - # Set input parameters to delete_alarm_configuration - delete_alarm_req_dict = {'alarm_uuid': '9a6d8a14-9f25-4d81-bf91-4d773497444d'} - - # Set mocked function's return values - alarm_details_json = { - 'id': 'AlertDefinition-9a6d8a14-9f25-4d81-4d773497444d', - 'name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-8c19d240eda4', - 'symptomDefinitionIds': ['SymptomDefinition-bcc2cb36-a67b-4deb-9b5884973278']} - alarm_details = { - 'alarm_name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-8c19d240eda4', - 'alarm_id': 'AlertDefinition-9a6d8a14-9f25-4d81-4d773497444d', - 'symptom_definition_id': 'SymptomDefinition-bcc2cb36-a67b-4deb-9b5884973278'} - - m_get_alarm_defination_details.return_value = (alarm_details_json, alarm_details) - m_delete_notification_rule.return_value = None - - # Call reconfigure_alarm method under test - alarm_uuid = self.mon_plugin.delete_alarm_configuration(delete_alarm_req_dict) - - # Verify that mocked method is called with required parameters - m_get_alarm_defination_details.assert_called_with(delete_alarm_req_dict['alarm_uuid']) - m_delete_notification_rule.assert_called_with(alarm_details['alarm_name']) - m_delete_alarm_defination.assert_not_called() - m_delete_symptom_definition.assert_not_called() - - # Verify return value with expected value - self.assertEqual(alarm_uuid, None) - - @mock.patch.object(monPlugin.MonPlugin, 'delete_symptom_definition') - @mock.patch.object(monPlugin.MonPlugin, 'delete_alarm_defination') - @mock.patch.object(monPlugin.MonPlugin, 'delete_notification_rule') - @mock.patch.object(monPlugin.MonPlugin, 'get_alarm_defination_details') - def test_delete_alarm_configuration_failed_to_delete_alarm_defination(self, - m_get_alarm_defination_details, - m_delete_notification_rule, - m_delete_alarm_defination, - m_delete_symptom_definition): - """Test delete_alarm_configuration: if failed to delete alarm definition, return None""" - - # Set input parameters to delete_alarm_configuration - delete_alarm_req_dict = {'alarm_uuid': '9a6d8a14-9f25-4d81-bf91-4d773497444d'} - - # Set mocked function's return values - alarm_details_json = { - 'id': 'AlertDefinition-9a6d8a14-9f25-4d81-4d773497444d', - 'name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-8c19d240eda4', - 'symptomDefinitionIds': ['SymptomDefinition-bcc2cb36-a67b-4deb-9b5884973278']} - alarm_details = { - 'alarm_name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-8c19d240eda4', - 'alarm_id': 'AlertDefinition-9a6d8a14-9f25-4d81-4d773497444d', - 'symptom_definition_id': 'SymptomDefinition-bcc2cb36-a67b-4deb-9b5884973278'} - - m_get_alarm_defination_details.return_value = (alarm_details_json, alarm_details) - m_delete_notification_rule.return_value = '989e7293-d78d-4405-92e30ec4f247' - m_delete_alarm_defination.return_value = None - - # Call reconfigure_alarm method under test - alarm_uuid = self.mon_plugin.delete_alarm_configuration(delete_alarm_req_dict) - - # Verify that mocked method is called with required parameters - m_get_alarm_defination_details.assert_called_with(delete_alarm_req_dict['alarm_uuid']) - m_delete_notification_rule.assert_called_with(alarm_details['alarm_name']) - m_delete_alarm_defination.assert_called_with(alarm_details['alarm_id']) - m_delete_symptom_definition.assert_not_called() - - # Verify return value with expected value - self.assertEqual(alarm_uuid, None) - - @mock.patch.object(monPlugin.MonPlugin, 'delete_symptom_definition') - @mock.patch.object(monPlugin.MonPlugin, 'delete_alarm_defination') - @mock.patch.object(monPlugin.MonPlugin, 'delete_notification_rule') - @mock.patch.object(monPlugin.MonPlugin, 'get_alarm_defination_details') - def test_delete_alarm_configuration_failed_to_delete_symptom_definition(self, - m_get_alarm_defination_details, - m_delete_notification_rule, - m_delete_alarm_defination, - m_delete_symptom_definition): - """Test delete_alarm_configuration: if failed to delete symptom definition, return None""" - - # Set input parameters to delete_alarm_configuration - delete_alarm_req_dict = {'alarm_uuid': '9a6d8a14-9f25-4d81-bf91-4d773497444d'} - - # Set mocked function's return values - alarm_details_json = { - 'id': 'AlertDefinition-9a6d8a14-9f25-4d81-4d773497444d', - 'name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-8c19d240eda4', - 'symptomDefinitionIds': ['SymptomDefinition-bcc2cb36-a67b-4deb-9b5884973278']} - alarm_details = { - 'alarm_name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-8c19d240eda4', - 'alarm_id': 'AlertDefinition-9a6d8a14-9f25-4d81-4d773497444d', - 'symptom_definition_id': 'SymptomDefinition-bcc2cb36-a67b-4deb-9b5884973278'} - - m_get_alarm_defination_details.return_value = (alarm_details_json, alarm_details) - m_delete_notification_rule.return_value = '989e7293-d78d-4405-92e30ec4f247' - m_delete_alarm_defination.return_value = alarm_details['alarm_id'] - m_delete_symptom_definition.return_value = None - - # Call reconfigure_alarm method under test - alarm_uuid = self.mon_plugin.delete_alarm_configuration(delete_alarm_req_dict) - - # Verify that mocked method is called with required parameters - m_get_alarm_defination_details.assert_called_with(delete_alarm_req_dict['alarm_uuid']) - m_delete_notification_rule.assert_called_with(alarm_details['alarm_name']) - m_delete_alarm_defination.assert_called_with(alarm_details['alarm_id']) - m_delete_symptom_definition.assert_called_with(alarm_details['symptom_definition_id']) - - # Verify return value with expected value - self.assertEqual(alarm_uuid, None) - - @mock.patch.object(monPlugin.requests, 'delete') - @mock.patch.object(monPlugin.MonPlugin, 'get_notification_rule_id_by_alarm_name') - def test_delete_notification_rule_successful_deletion_req_response(self, - m_get_notification_rule_id_by_alarm_name, - m_delete): - """Test delete_notification_rule: Valid notification rule is deleted & returns rule_id""" - - # Set input parameters to delete_notification_rule - alarm_name = 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-8c19d240eda4' - - # Set mocked function's return values - m_get_notification_rule_id_by_alarm_name.return_value = '8db86441-71d8-4830-9e1a-a90be3776d12' - m_delete.return_value.status_code = 204 - - # Call delete_notification_rule method under test - rule_id = self.mon_plugin.delete_notification_rule(alarm_name) - - # Verify that mocked method is called with required parameters - m_get_notification_rule_id_by_alarm_name.assert_called_with(alarm_name) - m_delete.assert_called() - - # Verify return value with expected value - self.assertEqual(rule_id, '8db86441-71d8-4830-9e1a-a90be3776d12') - - @mock.patch.object(monPlugin.requests, 'delete') - @mock.patch.object(monPlugin.MonPlugin, 'get_notification_rule_id_by_alarm_name') - def test_delete_notification_rule_failed_to_get_notification_rule_id(self, - m_get_notification_rule_id_by_alarm_name, - m_delete): - """Test delete_notification_rule: if notification rule is not found, returns None""" - - # Set input parameters to delete_notification_rule - alarm_name = 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-8c19d240eda4' - - # Set mocked function's return values - m_get_notification_rule_id_by_alarm_name.return_value = None - - # Call delete_notification_rule method under test - rule_id = self.mon_plugin.delete_notification_rule(alarm_name) - - # Verify that mocked method is called with required parameters - m_get_notification_rule_id_by_alarm_name.assert_called_with(alarm_name) - m_delete.assert_not_called() - - # verify return value with expected value - self.assertEqual(rule_id, None) - - @mock.patch.object(monPlugin.requests, 'delete') - @mock.patch.object(monPlugin.MonPlugin, 'get_notification_rule_id_by_alarm_name') - def test_delete_notification_rule_invalid_deletion_req_response(self, - m_get_notification_rule_id_by_alarm_name, - m_delete): - """Test delete_notification_rule: If an invalid response is received, returns None""" - - # Set input parameters to delete_notification_rule - alarm_name = 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-8c19d240eda4' - - # Set mocked function's return values - m_get_notification_rule_id_by_alarm_name.return_value = '8db86441-71d8-4830-9e1a-a90be3776d12' - m_delete.return_value.status_code = 404 - - # Call delete_notification_rule method under test - rule_id = self.mon_plugin.delete_notification_rule(alarm_name) - - # Verify that mocked method is called with required parameters - m_get_notification_rule_id_by_alarm_name.assert_called_with(alarm_name) - m_delete.assert_called() - - # Verify return value with expected value - self.assertEqual(rule_id, None) - - @mock.patch.object(monPlugin.requests, 'get') - def test_get_notification_rule_id_by_alarm_name_valid_req_response(self, m_get): - """Test get_notification_rule_id_by_alarm_name: A valid request response received, - returns notification_id - """ - - # Set input parameters to get_notification_rule_id_by_alarm_name - alarm_name = 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - - # Set mocked function's return values - m_get.return_value.status_code = 200 - m_get.return_value.content = '{\ - "pageInfo": {"totalCount": 0,"page": 0,"pageSize": 1000},\ - "links": [\ - {"href": "/suite-api/api/notifications/rules?page=0&pageSize=1000",\ - "rel": "SELF","name": "current"},\ - {"href": "/suite-api/api/notifications/rules?page=0&pageSize=1000",\ - "rel": "RELATED","name": "first"},\ - {"href": "/suite-api/api/notifications/rules?page=0&pageSize=1000",\ - "rel": "RELATED","name": "last"}],\ - "notification-rule": [{\ - "id": "2b86fa23-0c15-445c-a2b1-7bd725c46f59",\ - "name": "notify_CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4",\ - "pluginId": "03053f51-f829-438d-993d-cc33a435d76a",\ - "links": [{"href": "/suite-api/api/notifications/rules/2b86fa23-0c15-445c-a2b1-7bd725c46f59",\ - "rel": "SELF","name": "linkToSelf"}]}]}' - - # Call get_notification_rule_id_by_alarm_name method under test - notification_id = self.mon_plugin.get_notification_rule_id_by_alarm_name(alarm_name) - - # Verify that mocked method is called with required parameters - m_get.assert_called() - - # Verify return value with expected value - self.assertEqual(notification_id, '2b86fa23-0c15-445c-a2b1-7bd725c46f59') - - @mock.patch.object(monPlugin.requests, 'get') - def test_get_notification_rule_id_by_alarm_name_invalid_req_response(self, m_get): - """Test get_notification_rule_id_by_alarm_name: If an invalid response received,\ - returns None - """ - - # Set input parameters to delete_alarm_configuration - alarm_name = 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - - # Set mocked function's return values - m_get.return_value.status_code = 404 - - # Call get_notification_rule_id_by_alarm_name method under test - notification_id = self.mon_plugin.get_notification_rule_id_by_alarm_name(alarm_name) - - # Verify that mocked method is called with required parameters - m_get.assert_called() - - # Verify return value with expected value - self.assertEqual(notification_id, None) - - @mock.patch.object(monPlugin.requests, 'get') - def test_get_notification_rule_id_by_alarm_name_rule_not_found(self, m_get): - """Test get_notification_rule_id_by_alarm_name: If a notification rule is not found, - returns None - """ - - # Set input parameters to delete_alarm_configuration - alarm_name = 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda' - - # Set mocked function's return values - m_get.return_value.status_code = 200 - m_get.return_value.content = '{\ - "pageInfo": {"totalCount": 0,"page": 0,"pageSize": 1000},\ - "links": [\ - {"href": "/suite-api/api/notifications/rules?page=0&pageSize=1000",\ - "rel": "SELF","name": "current"},\ - {"href": "/suite-api/api/notifications/rules?page=0&pageSize=1000",\ - "rel": "RELATED","name": "first"},\ - {"href": "/suite-api/api/notifications/rules?page=0&pageSize=1000",\ - "rel": "RELATED","name": "last"}],\ - "notification-rule": [{\ - "id": "2b86fa23-0c15-445c-a2b1-7bd725c46f59",\ - "name": "notify_CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4",\ - "pluginId": "03053f51-f829-438d-993d-cc33a435d76a",\ - "links": [{"href": "/suite-api/api/notifications/rules/2b86fa23-0c15-445c-a2b1-7bd725c46f59",\ - "rel": "SELF","name": "linkToSelf"}]}]}' - - # Call get_notification_rule_id_by_alarm_name method under test - notification_id = self.mon_plugin.get_notification_rule_id_by_alarm_name(alarm_name) - - # Verify that mocked method is called with required parameters - m_get.assert_called() - - # Verify return value with expected value - self.assertEqual(notification_id, None) - - @mock.patch.object(monPlugin.requests, 'delete') - def test_delete_alarm_defination_valid_req_response(self, m_delete): - """Test delete_alarm_defination: A valid request response received, - returns symptom_id - """ - - # Set input parameters to delete_alarm_definition - alarm_definition_id = 'AlertDefinition-9a6d8a14-9f25-4d81-4d773497444d' - - # Set mocked function's return values - m_delete.return_value.status_code = 204 - - # Call delete_alarm_defination method under test - actual_alarm_id = self.mon_plugin.delete_alarm_defination(alarm_definition_id) - - # Verify that mocked method is called with required parameters - m_delete.assert_called() - - # Verify return value with expected value - self.assertEqual(actual_alarm_id, alarm_definition_id) - - @mock.patch.object(monPlugin.requests, 'delete') - def test_delete_alarm_defination_invalid_req_response(self, m_delete): - """Test delete_alarm_defination: If an invalid request response received, - returns None - """ - - # Set input parameters to delete_alarm_definition - alarm_definition_id = 'AlertDefinition-9a6d8a14-9f25-4d81-4d773497444d' - - # Set mocked function's return values - m_delete.return_value.status_code = 404 - - # Call delete_alarm_defination method under test - actual_alarm_id = self.mon_plugin.delete_alarm_defination(alarm_definition_id) - - # Verify that mocked method is called with required parameters - m_delete.assert_called() - - # Verify return value with expected value - self.assertEqual(actual_alarm_id, None) - - @mock.patch.object(monPlugin.requests, 'delete') - def test_delete_symptom_definition_valid_req_response(self, m_delete): - """Test delete_symptom_definition: A valid request response received, - returns symptom_id - """ - - # Set input parameters to delete_symptom_definition - symptom_definition_id = 'SymptomDefinition-bcc2cb36-a67b-4deb-9b5884973278' - - # Set mocked function's return values - m_delete.return_value.status_code = 204 - - # Call delete_symptom_definition method under test - actual_symptom_id = self.mon_plugin.delete_symptom_definition(symptom_definition_id) - - # Verify that mocked method is called with required parameters - m_delete.assert_called() - - # Verify return value with expected value - self.assertEqual(actual_symptom_id, symptom_definition_id) - - @mock.patch.object(monPlugin.requests, 'delete') - def test_delete_symptom_definition_invalid_req_response(self, m_delete): - """Test delete_symptom_definition: If an invalid request response received, - returns None - """ - - # Set input parameters to delete_symptom_definition - symptom_definition_id = 'SymptomDefinition-bcc2cb36-a67b-4deb-9b5884973278' - - # Set mocked function's return values - m_delete.return_value.status_code = 404 - - # Call delete_symptom_definition method under test - actual_symptom_id = self.mon_plugin.delete_symptom_definition(symptom_definition_id) - - # Verify that mocked method is called with required parameters - m_delete.assert_called() - - # Verify return value with expected value - self.assertEqual(actual_symptom_id, None) - - @mock.patch.object(monPlugin.requests, 'post') - @mock.patch.object(monPlugin.MonPlugin, 'check_if_plugin_configured') - def test_configure_rest_plugin_valid_plugin_id(self, m_check_if_plugin_configured, m_post): - """Test configure rest plugin method-valid plugin id""" - - # mock return values - expected_return = m_check_if_plugin_configured.return_value = "mock_pluginid" - - # call configure rest plugin method under test - actual_return = self.mon_plugin.configure_rest_plugin() - - # verify that mocked method is called - m_check_if_plugin_configured.assert_called() - m_post.assert_not_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.MonPlugin, 'enable_rest_plugin') - @mock.patch.object(monPlugin.requests, 'post') - @mock.patch.object(monPlugin.MonPlugin, 'check_if_plugin_configured') - def est_configure_rest_plugin_invalid_plugin_id(self, m_check_if_plugin_configured, m_post, m_enable_rest_plugin): - """Test configure rest plugin method-invalid plugin id""" - - # mock return values - m_check_if_plugin_configured.return_value = None # not configured - m_post.return_value.status_code = 201 # success - m_post.return_value.content = '{"pluginTypeId":"RestPlugin","pluginId":"1ef15663-9739-49fe-8c41-022bcc9f690c",\ - "name":"MON_module_REST_Plugin","version":1518693747871,"enabled":false,\ - "configValues":[{"name":"Url","value":"https://MON.lxd:8080/notify/"},\ - {"name":"Content-type","value":"application/json"},{"name":"Certificate",\ - "value":"AA:E7:3E:A5:34:E0:25:FB:28:84:3B:74:B2:18:74:C0:C3:E8:26:50"},\ - {"name":"ConnectionCount","value":"20"}]}' - - m_enable_rest_plugin.return_value = True # success - expected_return = '1ef15663-9739-49fe-8c41-022bcc9f690c' - - # call configure rest plugin method under test - actual_return = self.mon_plugin.configure_rest_plugin() - - # verify that mocked method is called - m_check_if_plugin_configured.assert_called() - m_post.assert_called() - m_enable_rest_plugin.assert_called_with('1ef15663-9739-49fe-8c41-022bcc9f690c', 'MON_module_REST_Plugin') - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.MonPlugin, 'enable_rest_plugin') - @mock.patch.object(monPlugin.requests, 'post') - @mock.patch.object(monPlugin.MonPlugin, 'check_if_plugin_configured') - def est_configure_rest_plugin_failed_to_enable_plugin(self, m_check_if_plugin_configured, m_post, - m_enable_rest_plugin): - """Test configure rest plugin method-failed to enable plugin case""" - - # mock return values - m_check_if_plugin_configured.return_value = None # not configured - m_post.return_value.status_code = 201 # success - m_post.return_value.content = '{"pluginTypeId":"RestPlugin","pluginId":"1ef15663-9739-49fe-8c41-022bcc9f690c",\ - "name":"MON_module_REST_Plugin","version":1518693747871,"enabled":false,\ - "configValues":[{"name":"Url","value":"https://MON.lxd:8080/notify/"},\ - {"name":"Content-type","value":"application/json"},{"name":"Certificate",\ - "value":"AA:E7:3E:A5:34:E0:25:FB:28:84:3B:74:B2:18:74:C0:C3:E8:26:50"},\ - {"name":"ConnectionCount","value":"20"}]}' - - m_enable_rest_plugin.return_value = False # return failure - expected_return = None - - # call configure rest plugin method under test - actual_return = self.mon_plugin.configure_rest_plugin() - - # verify that mocked method is called - m_check_if_plugin_configured.assert_called() - m_post.assert_called() - m_enable_rest_plugin.assert_called_with('1ef15663-9739-49fe-8c41-022bcc9f690c', 'MON_module_REST_Plugin') - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'get') - def test_check_if_plugin_configured_valid_req_response(self, m_get): - """Test check if plugin configured method-valid request response""" - - plugin_name = 'MON_module_REST_Plugin' - # mock return values - m_get.return_value.status_code = 200 - expected_return = '1ef15663-9739-49fe-8c41-022bcc9f690c' - m_get.return_value.content = '{"notificationPluginInstances":\ - [{"pluginTypeId":"RestPlugin",\ - "pluginId":"1ef15663-9739-49fe-8c41-022bcc9f690c",\ - "name":"MON_module_REST_Plugin","version":1518694966987,\ - "enabled":true,"configValues":[{"name":"Url",\ - "value":"https://MON.lxd:8080/notify/"},\ - {"name":"Content-type","value":"application/json"},\ - {"name":"Certificate",\ - "value":"AA:E7:3E:A5:34:E0:25:FB:28:84:3B:74:B2:18:74:C0"},\ - {"name":"ConnectionCount","value":"20"}]}]}' - - # call check if plugin configured method under test - actual_return = self.mon_plugin.check_if_plugin_configured(plugin_name) - - # verify that mocked method is called - m_get.assert_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'get') - def test_check_if_plugin_configured_invalid_req_response(self, m_get): - """Test check if plugin configured method-invalid request response""" - - plugin_name = 'MON_module_REST_Plugin' - # mock return values - m_get.return_value.status_code = 201 - expected_return = None - m_get.return_value.content = '{"notificationPluginInstances":\ - [{"pluginTypeId":"RestPlugin",\ - "pluginId":"1ef15663-9739-49fe-8c41-022bcc9f690c",\ - "name":"MON_module_REST_Plugin","version":1518694966987,\ - "enabled":true,"configValues":[{"name":"Url",\ - "value":"https://MON.lxd:8080/notify/"},\ - {"name":"Content-type","value":"application/json"},\ - {"name":"Certificate",\ - "value":"AA:E7:3E:A5:34:E0:25:FB:28:84:3B:74:B2:18:74:C0"},\ - {"name":"ConnectionCount","value":"20"}]}]}' - - # call check if plugin configured method under test - actual_return = self.mon_plugin.check_if_plugin_configured(plugin_name) - - # verify that mocked method is called - m_get.assert_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'put') - def test_enable_rest_plugin_valid_req_response(self, m_put): - """Test enable rest plugin method-valid request response""" - - plugin_name = 'MON_module_REST_Plugin' - plugin_id = '1ef15663-9739-49fe-8c41-022bcc9f690c' - # mock return values - m_put.return_value.status_code = 204 - expected_return = True - m_put.return_value.content = '' - - # call enable rest plugin configured method under test - actual_return = self.mon_plugin.enable_rest_plugin(plugin_id, plugin_name) - - # verify that mocked method is called - m_put.assert_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'put') - def test_enable_rest_plugin_invalid_req_response(self, m_put): - """Test enable rest plugin method-invalid request response""" - - plugin_name = 'MON_module_REST_Plugin' - plugin_id = '08018c0f-8879-4ca1-9b92-00e22d2ff81b' # invalid plugin id - # mock return values - m_put.return_value.status_code = 404 # api Error code - expected_return = False - m_put.return_value.content = '\ - No such Notification Plugin - 08018c0f-8879-4ca1-9b92-\ - 00e22d2ff81b.' - - # call enable rest plugin configured method under test - actual_return = self.mon_plugin.enable_rest_plugin(plugin_id, plugin_name) - - # verify that mocked method is called - m_put.assert_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'post') - @mock.patch.object(monPlugin.MonPlugin, 'check_if_plugin_configured') - def test_create_alarm_notification_rule_valid_req(self, m_check_if_plugin_configured, m_post): - """Test create alarm notification rule method valid request response""" - - alarm_name = 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - alarm_id = 'AlertDefinition-f1163767-6eac-438f-8e60-a7a867257e14' - res_id = 'ac87622f-b761-40a0-b151-00872a2a456e' - expected_return = "8db86441-71d8-4830-9e1a-a90be3776d12" - - # mock return values - m_check_if_plugin_configured.return_value = '03053f51-f829-438d-993d-cc33a435d76a' - m_post.return_value.status_code = 201 - m_post.return_value.content = '{"id":"8db86441-71d8-4830-9e1a-a90be3776d12",\ - "name":"notify_CPU_Utilization_Above_Thr-e14b203c",\ - "pluginId":"03053f51-f829-438d-993d-cc33a435d76a",\ - "alertControlStates":[],"alertStatuses":[],\ - "resourceFilter":{"matchResourceIdOnly":true,\ - "childrenResourceKindFilters":[],\ - "resourceId":"ac87622f-b761-40a0-b151-00872a2a456e"},\ - "alertTypeFilters":[],"alertDefinitionIdFilters":{"values":[\ - "AlertDefinition-f1163767-6eac-438f-8e60-a7a867257e14"]}}' - - # call enable rest plugin configured method under test - actual_return = self.mon_plugin.create_alarm_notification_rule(alarm_name, alarm_id, res_id) - - # verify that mocked method is called - m_check_if_plugin_configured.assert_called_with('MON_module_REST_Plugin') - m_post.assert_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'post') - @mock.patch.object(monPlugin.MonPlugin, 'check_if_plugin_configured') - def test_create_alarm_notification_rule_invalid_req(self, m_check_if_plugin_configured, m_post): - """Test create alarm notification rule method invalid request response""" - - alarm_name = 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - alarm_id = 'AlertDefinition-f1163767-6eac-438f-8e60-a7a867257e14' - res_id = 'ac87622f-b761-40a0-b151-00872a2a456e' - expected_return = None # invalid req should retrun none - - # mock return values - m_check_if_plugin_configured.return_value = '03053f51-f829-438d-993d-cc33a435d76a' - m_post.return_value.status_code = 500 - m_post.return_value.content = '{"message":"Internal Server error, cause unknown.",\ - "moreInformation":[{"name":"errorMessage","value":\ - "there is already a rule with the same rule name"},\ - {"name":"localizedMessage","value":"there is already \ - a rule with the same rule name;"}],"httpStatusCode":500,\ - "apiErrorCode":500}' - - # call enable rest plugin configured method under test - actual_return = self.mon_plugin.create_alarm_notification_rule(alarm_name, alarm_id, res_id) - - # verify that mocked method is called - m_check_if_plugin_configured.assert_called_with('MON_module_REST_Plugin') - m_post.assert_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'post') - @mock.patch.object(monPlugin.MonPlugin, 'check_if_plugin_configured') - def test_create_alarm_notification_rule_failed_to_get_plugin_id(self, - m_check_if_plugin_configured, m_post): - """Test create alarm notification rule method invalid plugin id""" - - alarm_name = 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - alarm_id = 'AlertDefinition-f1163767-6eac-438f-8e60-a7a867257e14' - res_id = 'ac87622f-b761-40a0-b151-00872a2a456e' - expected_return = None # invalid req should retrun none - - # mock return values - m_check_if_plugin_configured.return_value = None - - # call enable rest plugin configured method under test - actual_return = self.mon_plugin.create_alarm_notification_rule(alarm_name, alarm_id, res_id) - - # verify that mocked method is called - m_check_if_plugin_configured.assert_called_with('MON_module_REST_Plugin') - m_post.assert_not_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'get') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_resource_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_moref_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_default_Params') - def test_get_metrics_data_valid_rest_req_response(self, m_get_default_Params, - m_get_vm_moref_id, - m_get_vm_resource_id, - m_get): - """Test get metrics data of resource method valid request response""" - - metrics = {'collection_period': 1, 'metric_name': 'CPU_UTILIZATION', 'metric_uuid': None, - 'schema_version': 1.0, 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'correlation_id': 'e14b203c-6bf2-4e2f-a91c-8c19d2abcdef', - 'schema_type': 'read_metric_data_request', 'vim_type': 'VMware', - 'collection_unit': 'HR', 'vim_uuid': '1'} - - # mock return value - m_get_default_Params.return_value = {'metric_key': 'cpu|usage_average', 'unit': '%'} - vm_moref_id = m_get_vm_moref_id.return_value = 'vm-6626' - m_get_vm_resource_id.return_value = 'ac87622f-b761-40a0-b151-00872a2a456e' - m_get.return_value.status_code = 200 - m_get.return_value.content = '{"values":[{"resourceId":"ac87622f-b761-40a0-b151-\ - 00872a2a456e","stat-list":{"stat":[{"timestamps":\ - [1519716874297,1519717174294,1519717474295,1519717774298,\ - 1519718074300,1519718374299,1519718674314,1519718974325,\ - 1519719274304,1519719574298,1519719874298,1519720174301],\ - "statKey":{"key":"cpu|usage_average"},"intervalUnit":\ - {"quantifier":1},"data":[0.1120000034570694,\ - 0.11866666376590729,0.11599999666213989,0.11400000005960464,\ - 0.12066666781902313,0.11533333361148834,0.11800000071525574,\ - 0.11533333361148834,0.12200000137090683,0.11400000005960464,\ - 0.1459999978542328,0.12133333086967468]}]}}]}' - - # call get matrics data method under test - actual_return = self.mon_plugin.get_metrics_data(metrics) - - # verify that mocked method is called - m_get_default_Params.assert_called_with(metrics['metric_name']) - m_get_vm_moref_id.assert_called_with(metrics['resource_uuid']) - m_get_vm_resource_id.assert_called_with(vm_moref_id) - m_get.assert_called() - - # verify return value with expected value - # self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'get') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_resource_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_moref_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_default_Params') - def test_get_metrics_data_invalid_rest_req_response(self, m_get_default_Params, - m_get_vm_moref_id, - m_get_vm_resource_id, - m_get): - """Test get metrics data of resource method invalid request response""" - - metrics = {'collection_period': 1, 'metric_name': 'CPU_UTILIZATION', 'metric_uuid': None, - 'schema_version': 1.0, 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'correlation_id': 'e14b203c-6bf2-4e2f-a91c-8c19d2abcdef', - 'schema_type': 'read_metric_data_request', 'vim_type': 'VMware', - 'collection_unit': 'HR', 'vim_uuid': '1'} - - # mock return value - m_get_default_Params.return_value = {'metric_key': 'cpu|usage_average', 'unit': '%'} - vm_moref_id = m_get_vm_moref_id.return_value = 'vm-6626' - m_get_vm_resource_id.return_value = 'ac87622f-b761-40a0-b151-00872a2a456e' - m_get.return_value.status_code = 400 - expected_return = {'metric_name': 'CPU_UTILIZATION', 'metric_uuid': '0', - 'schema_version': '1.0', - 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'correlation_id': 'e14b203c-6bf2-4e2f-a91c-8c19d2abcdef', - 'metrics_data': {'time_series': [], 'metrics_series': []}, - 'schema_type': 'read_metric_data_response', - 'unit': '%', 'vim_uuid': '1'} - - # call get metrics data method under test - actual_return = self.mon_plugin.get_metrics_data(metrics) - - # verify that mocked method is called - m_get_default_Params.assert_called_with(metrics['metric_name']) - m_get_vm_moref_id.assert_called_with(metrics['resource_uuid']) - m_get_vm_resource_id.assert_called_with(vm_moref_id) - m_get.assert_called() - - m_get.return_value.content = '{"message":"Invalid request... #1 violations found.",\ - "validationFailures":[{"failureMessage":"Invalid Parameter",\ - "violationPath":"end"}],"httpStatusCode":400,\ - "apiErrorCode":400}' - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'get') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_resource_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_moref_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_default_Params') - def test_get_metrics_data_metric_not_supported(self, m_get_default_Params, - m_get_vm_moref_id, - m_get_vm_resource_id, - m_get): - """Test get metrics data of resource method invalid metric name""" - - metrics = {'collection_period': 1, 'metric_name': 'invalid_metric', 'metric_uuid': None, - 'schema_version': 1.0, - 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'correlation_id': 'e14b203c-6bf2-4e2f-a91c-8c19d2abcdef', - 'schema_type': 'read_metric_data_request', 'vim_type': 'VMware', - 'collection_unit': 'HR', 'vim_uuid': '1'} - - # mock return value - m_get_default_Params.return_value = {} # returns empty dict - - expected_return = {'metric_name': 'invalid_metric', 'metric_uuid': '0', 'vim_uuid': '1', - 'schema_version': '1.0', 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'correlation_id': 'e14b203c-6bf2-4e2f-a91c-8c19d2abcdef', - 'metrics_data': {'time_series': [], 'metrics_series': []}, - 'schema_type': 'read_metric_data_response', 'unit': None} - - # call get matrics data method under test - actual_return = self.mon_plugin.get_metrics_data(metrics) - - # verify that mocked method is called/not called - m_get_default_Params.assert_called_with(metrics['metric_name']) - m_get_vm_moref_id.assert_not_called() - m_get_vm_resource_id.assert_not_called() - m_get.assert_not_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'get') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_resource_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_moref_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_default_Params') - def test_get_metrics_data_failed_to_get_vm_moref_id(self, m_get_default_Params, - m_get_vm_moref_id, - m_get_vm_resource_id, - m_get): - """Test get metrics data method negative scenario- invalid resource id""" - - metrics = {'collection_period': 1, 'metric_name': 'cpu_utilization', 'metric_uuid': None, - 'schema_version': 1.0, 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'correlation_id': 'e14b203c-6bf2-4e2f-a91c-8c19d2abcdef', - 'schema_type': 'read_metric_data_request', 'vim_type': 'VMware', - 'collection_unit': 'HR', 'vim_uuid': '1'} - - # mock return value - m_get_default_Params.return_value = {'metric_key': 'cpu|usage_average', 'unit': '%'} - m_get_vm_moref_id.return_value = None - expected_return = {'metric_name': 'cpu_utilization', 'metric_uuid': '0', - 'schema_version': '1.0', - 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'correlation_id': 'e14b203c-6bf2-4e2f-a91c-8c19d2abcdef', - 'metrics_data': {'time_series': [], 'metrics_series': []}, - 'schema_type': 'read_metric_data_response', - 'unit': '%', 'vim_uuid': '1'} - - # call get matrics data method under test - actual_return = self.mon_plugin.get_metrics_data(metrics) - - # verify that mocked method is called/not called - m_get_default_Params.assert_called_with(metrics['metric_name']) - m_get_vm_moref_id.assert_called_with(metrics['resource_uuid']) - m_get_vm_resource_id.assert_not_called() - m_get.assert_not_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'get') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_resource_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_moref_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_default_Params') - def test_get_metrics_data_failed_to_get_vm_resource_id(self, m_get_default_Params, - m_get_vm_moref_id, - m_get_vm_resource_id, - m_get): - """Test get metrics data method negative scenario- invalid moref id""" - - metrics = {'collection_period': 1, 'metric_name': 'CPU_UTILIZATION', 'metric_uuid': None, - 'schema_version': 1.0, 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'correlation_id': 'e14b203c-6bf2-4e2f-a91c-8c19d2abcdef', - 'schema_type': 'read_metric_data_request', 'vim_type': 'VMware', - 'collection_unit': 'HR', 'vim_uuid': '1'} - - # mock return value - m_get_default_Params.return_value = {'metric_key': 'cpu|usage_average', 'unit': '%'} - m_get_vm_moref_id.return_value = 'Invalid-vm-6626' - m_get_vm_resource_id.return_value = None - expected_return = {'metric_name': 'CPU_UTILIZATION', 'metric_uuid': '0', - 'schema_version': '1.0', - 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'correlation_id': 'e14b203c-6bf2-4e2f-a91c-8c19d2abcdef', - 'metrics_data': {'time_series': [], 'metrics_series': []}, - 'schema_type': 'read_metric_data_response', - 'unit': '%', 'vim_uuid': '1'} - - # call get matrics data method under test - actual_return = self.mon_plugin.get_metrics_data(metrics) - - # verify that mocked method is called/not called - m_get_default_Params.assert_called_with(metrics['metric_name']) - m_get_vm_moref_id.assert_called_with(metrics['resource_uuid']) - m_get_vm_resource_id.assert_called() - m_get_vm_resource_id.assert_called_with('Invalid-vm-6626') - m_get.assert_not_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.MonPlugin, 'reconfigure_alarm') - @mock.patch.object(monPlugin.MonPlugin, 'update_symptom_defination') - @mock.patch.object(monPlugin.MonPlugin, 'get_alarm_defination_details') - def test_update_alarm_configuration_successful_updation(self, m_get_alarm_defination_details, - m_update_symptom_defination, - m_reconfigure_alarm): - """Test update alarm configuration method""" - - alarm_config = {'alarm_uuid': 'f1163767-6eac-438f-8e60-a7a867257e14', - 'correlation_id': 14203, - 'description': 'CPU_Utilization_Above_Threshold_L', 'operation': 'GT'} - - # mock return value - alarm_details_json = {'states': [{'impact': {'impactType': 'BADGE', 'detail': 'risk'}, - 'severity': 'CRITICAL', 'base-symptom-set': {'symptomDefinitionIds': - [ - 'SymptomDefinition-47c88675-bea8-436a-bb41-8d2231428f44'], - 'relation': 'SELF', - 'type': 'SYMPTOM_SET', - 'aggregation': 'ALL'}}], - 'description': 'CPU_Utilization_Above_Threshold', 'type': 16, - 'id': 'AlertDefinition-f1163767-6eac-438f-8e60-a7a867257e14', - 'name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d2'} - alarm_details = {'symptom_definition_id': 'SymptomDefinition-47c88675-bea8-436a-bb41-\ - 8d2231428f44', 'alarm_name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-\ - a91c-8c19d2', 'alarm_id': 'AlertDefinition-f1163767-6eac-438f-8e60-\ - a7a867257e14', 'resource_kind': 'VirtualMachine', 'type': 16} - m_get_alarm_defination_details.return_value = (alarm_details_json, alarm_details) - m_update_symptom_defination.return_value = 'SymptomDefinition-47c88675-bea8-436a-bb41-\ - 8d2231428f44' - expected_return = m_reconfigure_alarm.return_value = 'f1163767-6eac-438f-8e60-a7a867257e14' - - # call update alarm configuration method under test - actual_return = self.mon_plugin.update_alarm_configuration(alarm_config) - - # verify that mocked method is called - m_get_alarm_defination_details.assert_called_with(alarm_config['alarm_uuid']) - m_update_symptom_defination.assert_called_with(alarm_details['symptom_definition_id'], - alarm_config) - m_reconfigure_alarm.assert_called_with(alarm_details_json, alarm_config) - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.MonPlugin, 'reconfigure_alarm') - @mock.patch.object(monPlugin.MonPlugin, 'update_symptom_defination') - @mock.patch.object(monPlugin.MonPlugin, 'get_alarm_defination_details') - def test_update_alarm_configuration_failed_to_reconfigure_alarm(self, - m_get_alarm_defination_details, - m_update_symptom_defination, - m_reconfigure_alarm): - """Test update alarm configuration method- failed to reconfigure alarm""" - - alarm_config = {'alarm_uuid': 'f1163767-6eac-438f-8e60-a7a867257e14', - 'correlation_id': 14203, - 'description': 'CPU_Utilization_Above_Threshold_L', 'operation': 'GT'} - - # mock return value - alarm_details_json = {'states': [{'impact': {'impactType': 'BADGE', 'detail': 'risk'}, - 'severity': 'CRITICAL', 'base-symptom-set': {'symptomDefinitionIds': - [ - 'SymptomDefinition-47c88675-bea8-436a-bb41-8d2231428f44'], - 'relation': 'SELF', - 'type': 'SYMPTOM_SET', - 'aggregation': 'ALL'}}], - 'description': 'CPU_Utilization_Above_Threshold', 'type': 16, - 'id': 'AlertDefinition-f1163767-6eac-438f-8e60-a7a867257e14', - 'name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d2'} - alarm_details = {'symptom_definition_id': 'SymptomDefinition-47c88675-bea8-436a-bb41-\ - 8d2231428f44', 'alarm_name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-\ - a91c-8c19d2', 'alarm_id': 'AlertDefinition-f1163767-6eac-438f-8e60-\ - a7a867257e14', 'resource_kind': 'VirtualMachine', 'type': 16} - m_get_alarm_defination_details.return_value = (alarm_details_json, alarm_details) - m_update_symptom_defination.return_value = 'SymptomDefinition-47c88675-bea8-436a-bb41-\ - 8d2231428f44' - expected_return = m_reconfigure_alarm.return_value = None # failed to reconfigure - - # call update alarm configuration method under test - actual_return = self.mon_plugin.update_alarm_configuration(alarm_config) - - # verify that mocked method is called - m_get_alarm_defination_details.assert_called_with(alarm_config['alarm_uuid']) - m_update_symptom_defination.assert_called_with(alarm_details['symptom_definition_id'], - alarm_config) - m_reconfigure_alarm.assert_called_with(alarm_details_json, alarm_config) - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.MonPlugin, 'reconfigure_alarm') - @mock.patch.object(monPlugin.MonPlugin, 'update_symptom_defination') - @mock.patch.object(monPlugin.MonPlugin, 'get_alarm_defination_details') - def test_update_alarm_configuration_failed_to_update_symptom(self, - m_get_alarm_defination_details, - m_update_symptom_defination, - m_reconfigure_alarm): - """Test update alarm configuration method- failed to update alarm""" - - alarm_config = {'alarm_uuid': 'f1163767-6eac-438f-8e60-a7a867257e14', - 'correlation_id': 14203, - 'description': 'CPU_Utilization_Above_Threshold_L', 'operation': 'GT'} - - # mock return value - alarm_details_json = {'states': [{'impact': {'impactType': 'BADGE', 'detail': 'risk'}, - 'severity': 'CRITICAL', 'base-symptom-set': {'symptomDefinitionIds': - [ - 'SymptomDefinition-47c88675-bea8-436a-bb41-8d2231428f44'], - 'relation': 'SELF', - 'type': 'SYMPTOM_SET', - 'aggregation': 'ALL'}}], - 'description': 'CPU_Utilization_Above_Threshold', 'type': 16, - 'id': 'AlertDefinition-f1163767-6eac-438f-8e60-a7a867257e14', - 'name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d2'} - alarm_details = {'symptom_definition_id': 'Invalid-47c88675-bea8-436a-bb41-\ - 8d2231428f44', 'alarm_name': 'CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-\ - a91c-8c19d2', 'alarm_id': 'AlertDefinition-f1163767-6eac-438f-8e60-\ - a7a867257e14', 'resource_kind': 'VirtualMachine', 'type': 16} - m_get_alarm_defination_details.return_value = (alarm_details_json, alarm_details) - expected_return = m_update_symptom_defination.return_value = None - - # call update alarm configuration method under test - actual_return = self.mon_plugin.update_alarm_configuration(alarm_config) - - # verify that mocked method is called - m_get_alarm_defination_details.assert_called_with(alarm_config['alarm_uuid']) - m_update_symptom_defination.assert_called_with(alarm_details['symptom_definition_id'], - alarm_config) - m_reconfigure_alarm.assert_not_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.MonPlugin, 'get_default_Params') - def test_verify_metric_support_metric_supported_with_unit(self, m_get_default_Params): - """Test verify metric support method for supported metric""" - - # mock return value - metric_info = {'metric_unit': '%', 'metric_name': 'cpu_utilization', - 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4'} - m_get_default_Params.return_value = {'metric_key': 'cpu|usage_average', 'unit': '%'} - expected_return = True # supported metric returns True - - # call verify metric support method under test - actual_return = self.mon_plugin.verify_metric_support(metric_info) - - # verify that mocked method is called - m_get_default_Params.assert_called_with(metric_info['metric_name']) - # m_get_default_Params.assert_called_with(metric_info) - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.MonPlugin, 'get_default_Params') - def test_verify_metric_support_metric_not_supported(self, m_get_default_Params): - """Test verify metric support method for un-supported metric""" - - # mock return value - metric_info = {'metric_unit': '%', 'metric_name': 'invalid_metric', - 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4'} - m_get_default_Params.return_value = {} - expected_return = False # supported metric returns True - - # call verify metric support method under test - actual_return = self.mon_plugin.verify_metric_support(metric_info) - - # verify that mocked method is called - m_get_default_Params.assert_called_with(metric_info['metric_name']) - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.MonPlugin, 'get_default_Params') - def test_verify_metric_support_metric_supported_with_mismatched_unit(self, - m_get_default_Params): - """Test verify metric support method for supported metric with mismatched unit""" - - # mock return value - metric_info = {'metric_unit': '', 'metric_name': 'invalid_metric', - 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4'} - m_get_default_Params.return_value = {'metric_key': 'cpu|usage_average', 'unit': '%'} - expected_return = True # supported metric returns True - - # call verify metric support method under test - actual_return = self.mon_plugin.verify_metric_support(metric_info) - - # verify that mocked method is called - m_get_default_Params.assert_called_with(metric_info['metric_name']) - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.MonPlugin, 'get_triggered_alarms_on_resource') - @mock.patch.object(monPlugin.MonPlugin, 'get_vrops_resourceid_from_ro_uuid') - def test_get_triggered_alarms_list_returns_triggered_alarms(self, - m_get_vrops_resourceid, - m_triggered_alarms): - """Test get triggered alarm list method valid input""" - - # Mock list alarm input - list_alarm_input = {'severity': 'CRITICAL', - 'correlation_id': 'e14b203c', - 'alarm_name': 'CPU_Utilization_Above_Threshold', - 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4'} - - resource_id = m_get_vrops_resourceid.return_value = 'ac87622f-b761-40a0-b151-00872a2a456e' - expected_return = m_triggered_alarms.return_value = [{'status': 'ACTIVE', - 'update_date': '2018-01-12T08:34:05', - 'severity': 'CRITICAL', 'resource_uuid': 'e14b203c', - 'cancel_date': '0000-00-00T00:00:00', - 'alarm_instance_uuid': 'd9e3bc84', - 'alarm_uuid': '5714977d', 'vim_type': 'VMware', - 'start_date': '2018-01-12T08:34:05'}, - {'status': 'CANCELED', - 'update_date': '2017-12-20T09:37:57', - 'severity': 'CRITICAL', 'resource_uuid': 'e14b203c', - 'cancel_date': '2018-01-12T06:49:19', - 'alarm_instance_uuid': 'd3bbeef6', - 'alarm_uuid': '7ba1bf3e', 'vim_type': 'VMware', - 'start_date': '2017-12-20T09:37:57'}] - - # call get triggered alarms list method under test - actual_return = self.mon_plugin.get_triggered_alarms_list(list_alarm_input) - - # verify that mocked method is called - m_get_vrops_resourceid.assert_called_with(list_alarm_input['resource_uuid']) - m_triggered_alarms.assert_called_with(list_alarm_input['resource_uuid'], resource_id) - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.MonPlugin, 'get_triggered_alarms_on_resource') - @mock.patch.object(monPlugin.MonPlugin, 'get_vrops_resourceid_from_ro_uuid') - def test_get_triggered_alarms_list_invalid_resource_uuid(self, - m_get_vrops_resourceid, - m_triggered_alarms): - """Test get triggered alarm list method invalid resource uuid""" - - # Mock list alarm input - list_alarm_input = {'severity': 'CRITICAL', - 'correlation_id': 'e14b203c', - 'alarm_name': 'CPU_Utilization_Above_Threshold', - 'resource_uuid': '12345'} # invalid resource uuid - - expected_return = m_get_vrops_resourceid.return_value = None # returns empty list - - # call get triggered alarms list method under test - actual_return = self.mon_plugin.get_triggered_alarms_list(list_alarm_input) - - # verify that mocked method is called - m_get_vrops_resourceid.assert_called_with(list_alarm_input['resource_uuid']) - m_triggered_alarms.assert_not_called() - - # verify return value with expected value - self.assertEqual([], actual_return) - - @mock.patch.object(monPlugin.MonPlugin, 'get_triggered_alarms_on_resource') - @mock.patch.object(monPlugin.MonPlugin, 'get_vrops_resourceid_from_ro_uuid') - def test_get_triggered_alarms_list_resource_uuid_not_present(self, - m_get_vrops_resourceid, - m_triggered_alarms): - """Test get triggered alarm list method resource not present""" - - # Mock list alarm input - list_alarm_input = {'severity': 'CRITICAL', - 'correlation_id': 'e14b203c', - 'alarm_name': 'CPU_Utilization_Above_Threshold'} - - # call get triggered alarms list method under test - actual_return = self.mon_plugin.get_triggered_alarms_list(list_alarm_input) - - # verify that mocked method is called - m_get_vrops_resourceid.assert_not_called() - m_triggered_alarms.assert_not_called() - - # verify return value with expected value - self.assertEqual([], actual_return) - - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_resource_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_moref_id') - def test_get_vrops_resourceid_from_ro_uuid(self, m_get_vm_moref_id, m_get_vm_resource_id): - """Test get vrops resourceid from ro uuid method""" - - # Mock the inputs - ro_resource_uuid = 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - vm_moref_id = m_get_vm_moref_id.return_value = 'vm-6626' - expected_return = m_get_vm_resource_id.return_value = 'ac87622f-b761-40a0-b151-00872a2a456e' - - # call get_vrops_resourceid_from_ro_uuid method under test - actual_return = self.mon_plugin.get_vrops_resourceid_from_ro_uuid(ro_resource_uuid) - - # verify that mocked method is called - m_get_vm_moref_id.assert_called_with(ro_resource_uuid) - m_get_vm_resource_id.assert_called_with(vm_moref_id) - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_resource_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_moref_id') - def test_get_vrops_resourceid_from_ro_uuid_failed_to_get_vm_resource_id(self, - m_get_vm_moref_id, - m_get_vm_resource_id): - """Test get vrops resourceid from ro uuid method negative scenario""" - - # Mock the inputs - ro_resource_uuid = 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - vm_moref_id = m_get_vm_moref_id.return_value = 'vm-6626' - expected_return = m_get_vm_resource_id.return_value = None - - # call get_vrops_resourceid_from_ro_uuid method under test - actual_return = self.mon_plugin.get_vrops_resourceid_from_ro_uuid(ro_resource_uuid) - - # verify that mocked method is called - m_get_vm_moref_id.assert_called_with(ro_resource_uuid) - m_get_vm_resource_id.assert_called_with(vm_moref_id) - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_resource_id') - @mock.patch.object(monPlugin.MonPlugin, 'get_vm_moref_id') - def test_get_vrops_resourceid_from_ro_uuid_failed_to_get_vm_moref_id(self, - m_get_vm_moref_id, - m_get_vm_resource_id): - """Test get vrops resourceid from ro uuid method negative scenario""" - - # Mock the inputs - ro_resource_uuid = 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - expected_return = vm_moref_id = m_get_vm_moref_id.return_value = None - - # call get_vrops_resourceid_from_ro_uuid method under test - actual_return = self.mon_plugin.get_vrops_resourceid_from_ro_uuid(ro_resource_uuid) - - # verify that mocked method is called - m_get_vm_moref_id.assert_called_with(ro_resource_uuid) - m_get_vm_resource_id.assert_not_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'get') - def test_get_triggered_alarms_on_resource_valid_req_response(self, m_get): - """Test get triggered alarms on resource method for valid request""" - - # Mock the inputs - ro_resource_uuid = 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - vrops_resource_id = 'ac87622f-b761-40a0-b151-00872a2a456e' - m_get.return_value.status_code = 200 - expected_return = [{'status': 'ACTIVE', 'update_date': '2018-01-12T08:34:05', - 'severity': 'CRITICAL', 'start_date': '2018-01-12T08:34:05', - 'resource_uuid': 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4', - 'cancel_date': '2018-02-12T08:24:48', 'vim_type': 'VMware', - 'alarm_instance_uuid': 'd9e3bc84-dcb4-4905-b592-00a55f4cdaf1', - 'alarm_uuid': '5714977d-56f6-4222-adc7-43fa6c6e7e39'}] - - m_get.return_value.content = '{"alerts": [\ - {\ - "alertId": "d9e3bc84-dcb4-4905-b592-00a55f4cdaf1",\ - "resourceId": "ac87622f-b761-40a0-b151-00872a2a456e",\ - "alertLevel": "CRITICAL",\ - "status": "ACTIVE",\ - "startTimeUTC": 1515746045278,\ - "cancelTimeUTC": 1518423888708,\ - "updateTimeUTC": 1515746045278,\ - "alertDefinitionId": "AlertDefinition-5714977d-56f6-4222-adc7-43fa6c6e7e39",\ - "alertDefinitionName": "CPU_Utilization_Above_Thr-e14b203c-6bf2-4e2f-a91c-8c19d240eda4"\ - },\ - {\ - "alertId": "5fb5e940-e161-4253-a729-7255c6d6b1f5",\ - "resourceId": "ac87622f-b761-40a0-b151-00872a2a456e",\ - "alertLevel": "WARNING",\ - "status": "CANCELED",\ - "startTimeUTC": 1506684979154,\ - "cancelTimeUTC": 0,\ - "updateTimeUTC": 1520471975507,\ - "alertDefinitionId": "AlertDefinition-9ec5a921-1a54-411d-85ec-4c1c9b26dd02",\ - "alertDefinitionName": "VM_CPU_Usage_Alarm"\ - }]}' - - # call get_vrops_resourceid_from_ro_uuid method under test - actual_return = self.mon_plugin.get_triggered_alarms_on_resource(ro_resource_uuid, - vrops_resource_id) - - # verify that mocked method is called - m_get.assert_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'get') - def test_get_triggered_alarms_on_resource_invalid_req_response(self, m_get): - """Test get triggered alarms on resource method for invalid request""" - - # Mock the inputs - ro_resource_uuid = 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - vrops_resource_id = 'ac87622f-b761-40a0-b151-00872a2a456e' - m_get.return_value.status_code = 204 - expected_return = None - - # call get_vrops_resourceid_from_ro_uuid method under test - actual_return = self.mon_plugin.get_triggered_alarms_on_resource(ro_resource_uuid, - vrops_resource_id) - - # verify that mocked method is called - m_get.assert_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'get') - def test_get_triggered_alarms_on_resource_no_alarms_present(self, m_get): - """Test get triggered alarms on resource method for no alarms present""" - - # Mock the inputs - ro_resource_uuid = 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - vrops_resource_id = 'ac87622f-b761-40a0-b151-00872a2a456e' - m_get.return_value.status_code = 200 - expected_return = [] - m_get.return_value.content = '{"alerts": []}' - - # call get_vrops_resourceid_from_ro_uuid method under test - actual_return = self.mon_plugin.get_triggered_alarms_on_resource(ro_resource_uuid, - vrops_resource_id) - - # verify that mocked method is called - m_get.assert_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - def test_convert_date_time_valid_date_time(self): - """Test convert date time method valid input""" - - # Mock the inputs - date_time = 1515746045278 - expected_return = '2018-01-12T08:34:05' - - # call convert_date_time method under test - actual_return = self.mon_plugin.convert_date_time(date_time) - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - def test_convert_date_time_invalid_date_time(self): - """Test convert date time method invalid input""" - - # Mock the inputs - date_time = 0 - expected_return = '0000-00-00T00:00:00' - - # call convert_date_time method under test - actual_return = self.mon_plugin.convert_date_time(date_time) - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'get') - def test_get_vm_resource_id_rest_valid_req_response(self, m_get): - """Test get vms resource id valid request""" - - # Mock the inputs - vm_moref_id = 'vm-6626' - m_get.return_value.status_code = 200 - expected_return = "ac87622f-b761-40a0-b151-00872a2a456e" - m_get.return_value.content = \ - '{ \ - "resourceList": [\ - {\ - "creationTime": 1497770174130,\ - "resourceKey": {\ - "name": "OCInst2.ubuntu(4337d51f-1e65-4ab0-9c08-4897778d4fda)",\ - "adapterKindKey": "VMWARE",\ - "resourceKindKey": "VirtualMachine",\ - "resourceIdentifiers": [\ - {\ - "identifierType": {\ - "name": "VMEntityObjectID",\ - "dataType": "STRING",\ - "isPartOfUniqueness": true\ - },\ - "value": "vm-6626"\ - }\ - ]\ - },\ - "identifier": "ac87622f-b761-40a0-b151-00872a2a456e"\ - }\ - ]\ - }' - - # call get_vm_resource_id method under test - actual_return = self.mon_plugin.get_vm_resource_id(vm_moref_id) - - # verify that mocked method is called - m_get.assert_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'get') - def test_get_vm_resource_id_rest_invalid_req_response(self, m_get): - """Test get vms resource id invalid request""" - - # Mock the inputs - vm_moref_id = 'vm-6626' - m_get.return_value.status_code = 406 - expected_return = None - m_get.return_value.content = '406 Not Acceptable' - - # call get_vm_resource_id method under test - actual_return = self.mon_plugin.get_vm_resource_id(vm_moref_id) - - # verify that mocked method is called - m_get.assert_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'get') - def test_get_vm_resource_id_rest_invalid_response(self, m_get): - """Test get vms resource id invalid response""" - - # Mock the inputs - vm_moref_id = 'vm-6626' - m_get.return_value.status_code = 200 - expected_return = None - m_get.return_value.content = \ - '{ \ - "resourceList": \ - {\ - "creationTime": 1497770174130,\ - "resourceKey": {\ - "name": "OCInst2.ubuntu(4337d51f-1e65-4ab0-9c08-4897778d4fda)",\ - "adapterKindKey": "VMWARE",\ - "resourceKindKey": "VirtualMachine",\ - "resourceIdentifiers": [\ - {\ - "identifierType": {\ - "name": "VMEntityObjectID",\ - "dataType": "STRING",\ - "isPartOfUniqueness": true\ - },\ - "value": "vm-6626"\ - }\ - ]\ - },\ - "identifier": "ac87622f-b761-40a0-b151-00872a2a456e"\ - }\ - }' - - # call get_vm_resource_id method under test - actual_return = self.mon_plugin.get_vm_resource_id(vm_moref_id) - - # verify that mocked method is called - # m_get.assert_called - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.MonPlugin, 'get_vapp_details_rest') - def test_get_vm_moref_id_valid_id_found(self, m_get_vapp_details_rest): - """Test get vm moref id valid scenario""" - - # mock the inputs - vapp_uuid = 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - m_get_vapp_details_rest.return_value = {'vm_vcenter_info': {'vm_moref_id': 'vm-6626'}} - expected_return = 'vm-6626' - - # call get_vm_resource_id method under test - actual_return = self.mon_plugin.get_vm_moref_id(vapp_uuid) - - # verify that mocked method is called - m_get_vapp_details_rest.assert_called_with(vapp_uuid) - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.MonPlugin, 'get_vapp_details_rest') - def test_get_vm_moref_id_valid_id_not_found(self, m_get_vapp_details_rest): - """Test get vm moref id invalid scenario""" - - # mock the inputs - vapp_uuid = 'e14b203c-6bf2-4e2f-a91c-8c19d240eda' # invalid uuid - m_get_vapp_details_rest.return_value = {} - expected_return = None - - # call get_vm_resource_id method under test - actual_return = self.mon_plugin.get_vm_moref_id(vapp_uuid) - - # verify that mocked method is called - m_get_vapp_details_rest.assert_called_with(vapp_uuid) - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'get') - @mock.patch.object(monPlugin.MonPlugin, 'connect_as_admin') - def test_get_vapp_details_rest_valid_req_response(self, m_connect_as_admin, m_get): - """Test get vapp details rest method for valid request response""" - - # mock the inputs - vapp_uuid = 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - m_connect_as_admin.return_value = self.vca - self.vca._session = self.session - self.vca._session.headers['x-vcloud-authorization'] = '2ec69b2cc6264ad0a47aaf4e3e280d16' - m_get.return_value.status_code = 200 - expected_return = {'vm_vcenter_info': {'vm_moref_id': 'vm-6626'}} - m_get.return_value.content = '\ - \ - \ - \ - \ - \ - \ - \ - vm-6626\ - VIRTUAL_MACHINE\ - \ - \ - \ - \ - \ - ' - - # call get_vapp_details_rest method under test - actual_return = self.mon_plugin.get_vapp_details_rest(vapp_uuid) - - # verify that mocked method is called - m_connect_as_admin.assert_called_with() - m_get.assert_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'get') - @mock.patch.object(monPlugin.MonPlugin, 'connect_as_admin') - def test_get_vapp_details_rest_invalid_req_response(self, m_connect_as_admin, m_get): - """Test get vapp details rest method for invalid request response""" - - # mock the inputs - vapp_uuid = 'Invalid-e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - m_connect_as_admin.return_value = self.vca - self.vca._session = self.session - self.vca._session.headers['x-vcloud-authorization'] = '2ec69b2cc6264ad0a47aaf4e3e280d16' - m_get.return_value.status_code = 400 - expected_return = {} - m_get.return_value.content = 'Bad Request' - - # call get_vapp_details_rest method under test - actual_return = self.mon_plugin.get_vapp_details_rest(vapp_uuid) - - # verify that mocked method is called - m_connect_as_admin.assert_called_with() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'get') - @mock.patch.object(monPlugin.MonPlugin, 'connect_as_admin') - def test_get_vapp_details_rest_failed_to_connect_vcd(self, m_connect_as_admin, m_get): - """Test get vapp details rest method for failed to connect to vcd""" - - # mock the inputs - vapp_uuid = 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - m_connect_as_admin.return_value = None - expected_return = {} - - # call get_vapp_details_rest method under test - actual_return = self.mon_plugin.get_vapp_details_rest(vapp_uuid) - - # verify that mocked method is called - m_connect_as_admin.assert_called_with() - m_get.assert_not_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.requests, 'get') - @mock.patch.object(monPlugin.MonPlugin, 'connect_as_admin') - def test_get_vapp_details_rest_invalid_response(self, m_connect_as_admin, m_get): - """Test get vapp details rest method for invalid response""" - - # mock the inputs - vapp_uuid = 'e14b203c-6bf2-4e2f-a91c-8c19d240eda4' - m_connect_as_admin.return_value = self.vca - self.vca._session = self.session - self.vca._session.headers['x-vcloud-authorization'] = '2ec69b2cc6264ad0a47aaf4e3e280d16' - m_get.return_value.status_code = 200 - expected_return = {} - m_get.return_value.content = '\ - \ - \ - \ - \ - \ - \ - \ - vm-6626\ - VIRTUAL_MACHINE\ - \ - \ - \ - \ - ' - - # call get_vapp_details_rest method under test - actual_return = self.mon_plugin.get_vapp_details_rest(vapp_uuid) - - # verify that mocked method is called - m_connect_as_admin.assert_called_with() - m_get.assert_called() - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - - @mock.patch.object(monPlugin.Client, 'set_credentials') - @mock.patch.object(monPlugin, 'Client') - def test_connect_as_admin(self, m_client, m_set_credentials): - """Test connect as admin to vCD method""" - - # mock the inputs and mocked returns - expected_return = m_client.return_value = self.vca - m_set_credentials.retrun_value = True - - # call connect_as_admin method under test - actual_return = self.mon_plugin.connect_as_admin() - - # verify that mocked method is called - m_client.assert_called_with(self.m_vim_access_config['vim_url'], - verify_ssl_certs=False) - - # verify return value with expected value - self.assertEqual(expected_return, actual_return) - -# For testing purpose -# if __name__ == '__main__': -# unittest.main()