def test_modified_cs_action_execution_flow(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='present', )) from ansible_collections.misc.not_a_real_collection.plugins.modules import netscaler_cs_action client_mock = Mock() m = Mock(return_value=client_mock) server_proxy_attrs = { 'diff_object.return_value': {}, } cs_action_proxy_mock = Mock() cs_action_proxy_mock.configure_mock(**server_proxy_attrs) config_proxy_mock = Mock(return_value=cs_action_proxy_mock) with patch.multiple( 'ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_cs_action', get_nitro_client=m, diff_list=Mock(return_value={}), get_immutables_intersection=Mock(return_value=[]), action_exists=Mock(side_effect=[True, True]), action_identical=Mock(side_effect=[False, True]), ensure_feature_is_enabled=Mock(return_value=True), ConfigProxy=config_proxy_mock, ): self.module = netscaler_cs_action self.exited() cs_action_proxy_mock.assert_has_calls([call.update()])
def test_values_copied_to_actual(self): actual = Mock() client = Mock() values = { 'some_key': 'some_value', } ConfigProxy(actual=actual, client=client, attribute_values_dict=values, readwrite_attrs=['some_key']) self.assertEqual(actual.some_key, values['some_key'], msg='Failed to pass correct value from values dict')
def test_missing_from_values_dict_not_copied_to_actual(self): actual = Mock() client = Mock() values = { 'irrelevant_key': 'irrelevant_value', } print('value %s' % actual.key_for_none) ConfigProxy(actual=actual, client=client, attribute_values_dict=values, readwrite_attrs=['key_for_none']) print('none %s' % getattr(actual, 'key_for_none')) self.assertIsInstance(actual.key_for_none, Mock)
def test_absent_server_failed_delete(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='absent', )) from ansible_collections.misc.not_a_real_collection.plugins.modules import netscaler_ssl_certkey client_mock = Mock() m = Mock(return_value=client_mock) ssl_certkey_proxy_attrs = { 'diff_object.return_value': {}, } ssl_certkey_proxy_mock = Mock() ssl_certkey_proxy_mock.configure_mock(**ssl_certkey_proxy_attrs) config_proxy_mock = Mock(return_value=ssl_certkey_proxy_mock) with patch.multiple( 'ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_ssl_certkey', nitro_exception=self.MockException, get_nitro_client=m, diff_list=Mock(return_value={}), get_immutables_intersection=Mock(return_value=[]), key_exists=Mock(side_effect=[True, True]), key_identical=Mock(side_effect=[False, False]), ConfigProxy=config_proxy_mock, ): self.module = netscaler_ssl_certkey result = self.failed() self.assertEqual(result['msg'], 'SSL certkey still exists') self.assertTrue(result['failed'])
def test_absent_server_noop_flow(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='absent', )) from ansible_collections.misc.not_a_real_collection.plugins.modules import netscaler_ssl_certkey client_mock = Mock() m = Mock(return_value=client_mock) ssl_certkey_proxy_attrs = { 'diff_object.return_value': {}, } ssl_certkey_proxy_mock = Mock() ssl_certkey_proxy_mock.configure_mock(**ssl_certkey_proxy_attrs) config_proxy_mock = Mock(return_value=ssl_certkey_proxy_mock) with patch.multiple( 'ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_ssl_certkey', get_nitro_client=m, diff_list=Mock(return_value={}), get_immutables_intersection=Mock(return_value=[]), key_exists=Mock(side_effect=[False, False]), key_identical=Mock(side_effect=[False, False]), ConfigProxy=config_proxy_mock, ): self.module = netscaler_ssl_certkey self.exited() ssl_certkey_proxy_mock.assert_not_called()
def test_servicegroup_monitor_bindings_sanity(self): self.set_module_state('present') from ansible_collections.misc.not_a_real_collection.plugins.modules import netscaler_servicegroup servicegroup_proxy_mock = MagicMock() attrs = { 'diff_object.return_value': {}, } servicegroup_proxy_mock.configure_mock(**attrs) m = MagicMock(return_value=servicegroup_proxy_mock) sync_mock = Mock() with patch.multiple( 'ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_servicegroup', ConfigProxy=m, servicegroup_exists=Mock(side_effect=[True, True]), servicegroup_identical=Mock(side_effect=[True, True]), monitor_bindings_identical=Mock(side_effect=[False, False]), sync_monitor_bindings=Mock(), servicemembers_identical=Mock(side_effect=[True, True]), nitro_exception=self.MockException, sync_service_members=sync_mock, do_state_change=Mock(return_value=Mock(errorcode=0)), ): self.module = netscaler_servicegroup result = self.failed() self.assertEqual(result['msg'], 'Monitor bindings are not identical')
def test_update_servicegroup_when_service_members_differ(self): self.set_module_state('present') from ansible_collections.misc.not_a_real_collection.plugins.modules import netscaler_servicegroup servicegroup_proxy_mock = MagicMock() attrs = { 'diff_object.return_value': {}, } servicegroup_proxy_mock.configure_mock(**attrs) m = MagicMock(return_value=servicegroup_proxy_mock) sync_mock = Mock() with patch.multiple( 'ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_servicegroup', ConfigProxy=m, servicegroup_exists=Mock(side_effect=[True, True]), servicegroup_identical=Mock(side_effect=[True, True]), monitor_bindings_identical=Mock(side_effect=[True, True]), sync_monitor_bindings=Mock(), servicemembers_identical=Mock(side_effect=[False, True]), sync_service_members=sync_mock, do_state_change=Mock(return_value=Mock(errorcode=0)), ): self.module = netscaler_servicegroup result = self.exited() # poor man's assert_called_once since python3.5 does not implement that mock method self.assertEqual(len(sync_mock.mock_calls), 1, msg='sync monitor bindings not called once') self.assertTrue(result['changed'], msg='Change not recorded')
def test_disabled_state_change_called(self): set_module_args(dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='present', )) from ansible_collections.misc.not_a_real_collection.plugins.modules import netscaler_lb_vserver lb_vserver_proxy_mock = Mock() do_state_change_mock = Mock(return_value=Mock(errorcode=0)) client_mock = Mock() with patch.multiple( 'ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_lb_vserver', get_nitro_client=Mock(return_value=client_mock), ConfigProxy=Mock(return_value=lb_vserver_proxy_mock), ensure_feature_is_enabled=Mock(return_value=True), lb_vserver_exists=Mock(side_effect=[True, True]), nitro_exception=self.MockException, do_state_change=do_state_change_mock, ): self.module = netscaler_lb_vserver self.exited() self.assertTrue(len(do_state_change_mock.mock_calls) > 0, msg='Did not call state change')
def test_save_config_not_called_on_state_absent(self): set_module_args(dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='absent', save_config=False, )) from ansible_collections.misc.not_a_real_collection.plugins.modules import netscaler_lb_vserver client_mock = Mock() m = Mock(return_value=client_mock) lb_vserver_proxy_mock = Mock() with patch.multiple( 'ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_lb_vserver', get_nitro_client=m, lb_vserver_exists=Mock(side_effect=[True, False]), ConfigProxy=Mock(return_value=lb_vserver_proxy_mock), ensure_feature_is_enabled=Mock(return_value=True), do_state_change=Mock(return_value=Mock(errorcode=0)), ): self.module = netscaler_lb_vserver self.exited() self.assertNotIn(call.save_config(), client_mock.mock_calls)
def test_new_server_execution_flow(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='present', )) from ansible_collections.misc.not_a_real_collection.plugins.modules import netscaler_server client_mock = Mock() m = Mock(return_value=client_mock) server_proxy_attrs = { 'diff_object.return_value': {}, } server_proxy_mock = Mock() server_proxy_mock.configure_mock(**server_proxy_attrs) config_proxy_mock = Mock(return_value=server_proxy_mock) with patch.multiple( 'ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_server', get_nitro_client=m, server_exists=Mock(side_effect=[False, True]), server_identical=Mock(side_effect=[True]), ConfigProxy=config_proxy_mock, do_state_change=Mock(return_value=Mock(errorcode=0))): self.module = netscaler_server self.exited() server_proxy_mock.assert_has_calls([call.add()])
def test_do_state_change_fail(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='present', )) from ansible_collections.misc.not_a_real_collection.plugins.modules import netscaler_server client_mock = Mock() m = Mock(return_value=client_mock) server_proxy_mock = Mock() with patch.multiple( 'ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_server', nitro_exception=self.MockException, get_nitro_client=m, server_exists=Mock(side_effect=[True, False]), ConfigProxy=Mock(return_value=server_proxy_mock), diff_list=Mock(return_value={}), do_state_change=Mock(return_value=Mock( errorcode=1, message='Failed on purpose'))): self.module = netscaler_server result = self.failed() self.assertEqual( result['msg'], 'Error when setting disabled state. errorcode: 1 message: Failed on purpose' )
def test_save_config_called_on_state_present(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='present', )) from ansible_collections.misc.not_a_real_collection.plugins.modules import netscaler_server client_mock = Mock() m = Mock(return_value=client_mock) server_proxy_mock = Mock() with patch.multiple( 'ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_server', get_nitro_client=m, server_exists=Mock(side_effect=[False, True]), ConfigProxy=Mock(return_value=server_proxy_mock), diff_list=Mock(return_value={}), do_state_change=Mock(return_value=Mock(errorcode=0))): self.module = netscaler_server self.exited() self.assertIn(call.save_config(), client_mock.mock_calls)
def test_none_values_not_copied_to_actual(self): actual = Mock() client = Mock() actual.key_for_none = 'initial' print('actual %s' % actual.key_for_none) values = { 'key_for_none': None, } print('value %s' % actual.key_for_none) ConfigProxy(actual=actual, client=client, attribute_values_dict=values, readwrite_attrs=['key_for_none']) self.assertEqual(actual.key_for_none, 'initial')
def test_ensure_feature_is_enabled_called(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='present', save_config=False, )) from ansible_collections.misc.not_a_real_collection.plugins.modules import netscaler_lb_monitor client_mock = Mock() lb_monitor_proxy_mock = Mock(diff_object=Mock(return_value={})) feature_mock = Mock() with patch.multiple( 'ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_lb_monitor', get_nitro_client=Mock(return_value=client_mock), lbmonitor_exists=Mock(side_effect=[True, True]), lbmonitor_identical=Mock(side_effect=[True, True]), ConfigProxy=Mock(return_value=lb_monitor_proxy_mock), ensure_feature_is_enabled=feature_mock, ): self.module = netscaler_lb_monitor self.exited() feature_mock.assert_called_with(client_mock, 'LB')
def test_create_new_lb_monitor_workflow(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='present', save_config=False, )) from ansible_collections.misc.not_a_real_collection.plugins.modules import netscaler_lb_monitor lb_monitor_proxy_mock = Mock(diff_object=Mock(return_value={})) with patch.multiple( 'ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_lb_monitor', get_nitro_client=Mock(return_value=Mock()), lbmonitor_exists=Mock(side_effect=[False, True]), lbmonitor_identical=Mock(side_effect=[True]), ConfigProxy=Mock(return_value=lb_monitor_proxy_mock), ensure_feature_is_enabled=Mock(return_value=True), ): self.module = netscaler_lb_monitor result = self.exited() lb_monitor_proxy_mock.assert_has_calls([call.add()]) self.assertTrue(result['changed'])
def test_new_gslb_site_execution_flow(self): set_module_args(dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='present', )) from ansible_collections.misc.not_a_real_collection.plugins.modules import netscaler_gslb_service client_mock = Mock() m = Mock(return_value=client_mock) glsb_service_proxy_attrs = { 'diff_object.return_value': {}, } gslb_service_proxy_mock = Mock() gslb_service_proxy_mock.configure_mock(**glsb_service_proxy_attrs) config_proxy_mock = Mock(return_value=gslb_service_proxy_mock) with patch.multiple( 'ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_gslb_service', get_nitro_client=m, gslb_service_exists=Mock(side_effect=[False, True]), gslb_service_identical=Mock(side_effect=[True]), nitro_exception=self.MockException, ensure_feature_is_enabled=Mock(), monkey_patch_nitro_api=Mock(), ConfigProxy=config_proxy_mock, ): self.module = netscaler_gslb_service self.exited() gslb_service_proxy_mock.assert_has_calls([call.add()])
def test_save_config_not_called_on_state_present(self): set_module_args(dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='present', save_config=False, )) from ansible_collections.misc.not_a_real_collection.plugins.modules import netscaler_gslb_service client_mock = Mock() m = Mock(return_value=client_mock) gslb_service_proxy_mock = Mock() with patch.multiple( 'ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_gslb_service', get_nitro_client=m, gslb_service_exists=Mock(side_effect=[False, True]), gslb_service_identical=Mock(side_effect=[True]), nitro_exception=self.MockException, ensure_feature_is_enabled=Mock(), monkey_patch_nitro_api=Mock(), ConfigProxy=Mock(return_value=gslb_service_proxy_mock), ): self.module = netscaler_gslb_service self.exited() self.assertNotIn(call.save_config(), client_mock.mock_calls)
def test_lb_monitor_exists_sanity_check(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='present', )) from ansible_collections.misc.not_a_real_collection.plugins.modules import netscaler_lb_monitor lb_monitor_proxy_mock = Mock(diff_object=Mock(return_value={})) client_mock = Mock() with patch.multiple( 'ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_lb_monitor', get_nitro_client=Mock(return_value=client_mock), lbmonitor_exists=Mock(side_effect=[False, False]), lbmonitor_identical=Mock(side_effect=[False, True]), ConfigProxy=Mock(return_value=lb_monitor_proxy_mock), ensure_feature_is_enabled=Mock(return_value=True), nitro_exception=self.MockException, ): self.module = netscaler_lb_monitor result = self.failed() self.assertEqual(result['msg'], 'lb monitor does not exist')
def get_ndmp_mock_object(self, kind=None): """ Helper method to return an na_ontap_ndmp object :param kind: passes this param to MockONTAPConnection() :return: na_ontap_ndmp object """ obj = ndmp_module() obj.asup_log_for_cserver = Mock(return_value=None) obj.server = Mock() obj.server.invoke_successfully = Mock() if kind is None: obj.server = MockONTAPConnection() else: obj.server = MockONTAPConnection(kind=kind, data=self.mock_ndmp) return obj
def test_mas_login_headers(self): args = copy.deepcopy(module_arguments) args.update(dict( nitro_user='******', nitro_pass='******', operation='mas_login', )) mock_module_instance = Mock(params=args) expected_headers = { 'Content-Type': 'application/json', } module_mock = Mock(return_value=mock_module_instance) with patch('ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_nitro_request.AnsibleModule', module_mock): instance = netscaler_nitro_request.NitroAPICaller() self.assertDictEqual(instance._headers, expected_headers)
def get_kerberos_realm_mock_object(kind=None): """ Helper method to return an na_ontap_volume object :param kind: passes this param to MockONTAPConnection() :return: na_ontap_volume object """ krbrealm_obj = my_module() krbrealm_obj.asup_log_for_cserver = Mock(return_value=None) krbrealm_obj.cluster = Mock() krbrealm_obj.cluster.invoke_successfully = Mock() if kind is None: krbrealm_obj.server = MockONTAPConnection() else: krbrealm_obj.server = MockONTAPConnection(kind=kind) return krbrealm_obj
def test_elementsw_svip_exists(self): ''' svip_exists ''' data = self.set_default_args() set_module_args(data) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) mock_helper = Mock() mock_helper.get_cluster_info.return_value.cluster_info.svip = '10.10.10.10' if not self.onbox: my_obj.server = MockONTAPConnection('snapmirror', status='idle', parm='snapmirrored') res = my_obj.validate_elementsw_svip('10.10.10.10:/lun/1000', mock_helper) assert res is None
def get_policy_group_mock_object(self, kind=None): """ Helper method to return an na_ontap_volume object :param kind: passes this param to MockONTAPConnection() :return: na_ontap_volume object """ policy_obj = qos_policy_group_module() policy_obj.asup_log_for_cserver = Mock(return_value=None) policy_obj.cluster = Mock() policy_obj.cluster.invoke_successfully = Mock() if kind is None: policy_obj.server = MockONTAPConnection() else: policy_obj.server = MockONTAPConnection(kind=kind, data=self.mock_policy_group) return policy_obj
def get_role_mock_object(self, kind=None): """ Helper method to return an na_ontap_user_role object :param kind: passes this param to MockONTAPConnection() :return: na_ontap_user_role object """ role_obj = role_module() role_obj.asup_log_for_cserver = Mock(return_value=None) role_obj.cluster = Mock() role_obj.cluster.invoke_successfully = Mock() if kind is None: role_obj.server = MockONTAPConnection() else: role_obj.server = MockONTAPConnection(kind=kind, data=self.mock_role) return role_obj
def setUpClass(cls): class MockException(Exception): pass cls.MockException = MockException m = MagicMock() cls.cs_vserver_mock = MagicMock() cls.cs_vserver_mock.__class__ = MagicMock(add=Mock()) nssrc_modules_mock = { 'nssrc.com.citrix.netscaler.nitro.resource.config.cs': m, 'nssrc.com.citrix.netscaler.nitro.resource.config.cs.csvserver': m, 'nssrc.com.citrix.netscaler.nitro.resource.config.cs.csvserver.csvserver': m, 'nssrc.com.citrix.netscaler.nitro.resource.config.cs.csvserver_cspolicy_binding': m, 'nssrc.com.citrix.netscaler.nitro.resource.config.cs.csvserver_cspolicy_binding.csvserver_cspolicy_binding': m, 'nssrc.com.citrix.netscaler.nitro.resource.config.cs.csvserver_lbvserver_binding': m, 'nssrc.com.citrix.netscaler.nitro.resource.config.cs.csvserver_lbvserver_binding.csvserver_lbvserver_binding': m, 'nssrc.com.citrix.netscaler.nitro.resource.config.ssl': m, 'nssrc.com.citrix.netscaler.nitro.resource.config.ssl.sslvserver_sslcertkey_binding': m, 'nssrc.com.citrix.netscaler.nitro.resource.config.ssl.sslvserver_sslcertkey_binding.sslvserver_sslcertkey_binding': m, } cls.nitro_specific_patcher = patch.dict(sys.modules, nssrc_modules_mock) cls.nitro_base_patcher = nitro_base_patcher
def test_handle_get_return_object(self): resource = 'lbvserver' args = copy.deepcopy(module_arguments) args.update(dict( nitro_user='******', nitro_pass='******', resource=resource, )) resource_data = { 'property1': 'value1', 'property2': 'value2', } module_mock = Mock(params=args, from_json=json.loads) with patch('ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_nitro_request.AnsibleModule', Mock(return_value=module_mock)): instance = netscaler_nitro_request.NitroAPICaller() data = {resource: resource_data} result = { 'nitro_errorcode': 0, 'http_response_body': json.dumps(data), } expected_result = { 'nitro_object': resource_data } expected_result.update(result) instance.handle_get_return_object(result) self.assertDictEqual(result, expected_result)
def test_edit_response_data_body_in_info(self): args = copy.deepcopy(module_arguments) args.update(dict( nitro_user='******', nitro_pass='******', )) module_mock = Mock(params=args, from_json=json.loads) with patch('ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_nitro_request.AnsibleModule', Mock(return_value=module_mock)): body = { 'errorcode': 258, 'message': 'Numerical error 258', 'severity': 'ERROR' } instance = netscaler_nitro_request.NitroAPICaller() r = None info = { 'status': 200, 'body': codecs.encode(json.dumps(body), 'utf-8'), } result = {} success_status = 200 expected_result = { 'http_response_body': json.dumps(body), 'http_response_data': info, } nitro_data = {} for key, value in body.items(): nitro_data['nitro_%s' % key] = value expected_result.update(nitro_data) instance.edit_response_data(r, info, result, success_status) self.assertDictEqual(result, expected_result)
def test_edit_response_data_actual_body_data_irrelevant(self): args = copy.deepcopy(module_arguments) args.update(dict( nitro_user='******', nitro_pass='******', nitro_auth_token='##DDASKLFDJ', )) module_mock = Mock(params=args, from_json=json.loads) with patch('ansible_collections.misc.not_a_real_collection.plugins.modules.netscaler_nitro_request.AnsibleModule', Mock(return_value=module_mock)): with tempfile.TemporaryFile() as r: actual_body = {} r.write(codecs.encode(json.dumps(actual_body), 'utf-8')) r.seek(0) instance = netscaler_nitro_request.NitroAPICaller() info = { 'status': 200, } result = {} success_status = 200 expected_result = { 'http_response_body': json.dumps(actual_body), 'http_response_data': info, 'nitro_errorcode': 0, 'nitro_message': 'Success', 'nitro_severity': 'NONE', } instance.edit_response_data(r, info, result, success_status) self.assertDictEqual(result, expected_result)
def test_set_elem_connection_destination(self, create_sf_connection): ''' test set_elem_connection for destination''' data = self.set_default_args() data['source_hostname'] = 'test_source' set_module_args(data) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) create_sf_connection.return_value = Mock() if not self.onbox: my_obj.server = MockONTAPConnection('snapmirror', status='idle', parm='snapmirrored') my_obj.set_element_connection('destination') assert my_obj.module.params['hostname'] == data['hostname'] assert my_obj.module.params['username'] == data['username'] assert my_obj.module.params['password'] == data['password']
def test_elementsw_svip_exists_negative(self): ''' svip_exists negative testing''' data = self.set_default_args() set_module_args(data) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) mock_helper = Mock() mock_helper.get_cluster_info.return_value.cluster_info.svip = '10.10.10.10' if not self.onbox: my_obj.server = MockONTAPConnection('snapmirror', status='idle', parm='snapmirrored') with pytest.raises(AnsibleFailJson) as exc: my_obj.validate_elementsw_svip('10.10.10.11:/lun/1000', mock_helper) assert 'Error: Invalid SVIP' in exc.value.args[0]['msg']