def test_trunk_vlans_no_change(self): set_module_args( dict(name='Eth1/10', mode='hybrid', access_vlan=1, trunk_allowed_vlans=[10])) self.execute_module(changed=False)
def test_mlag_port_channel_add(self): set_module_args(dict(name='Mpo34', state='present', members=['Eth1/9'])) self.load_mlag_port_channel_fixture() commands = ['interface mlag-port-channel 34', 'exit', 'interface ethernet 1/9 mlag-channel-group 34 mode on'] self.execute_module(changed=True, commands=commands)
def test_magp_remove_address(self): set_module_args(dict(interface='Vlan 1243', magp_id=102)) commands = [ 'interface vlan 1243 magp 102 no ip virtual-router address', 'interface vlan 1243 magp 102 no ip virtual-router mac-address' ] self.execute_module(changed=True, commands=commands)
def test_absent_state_sanity_check(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='absent', )) from ansible_collections.ansible.misc.plugins.modules import netscaler_lb_vserver lb_vserver_proxy_mock = Mock() client_mock = Mock() with patch.multiple( 'ansible_collections.ansible.misc.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, ): self.module = netscaler_lb_vserver result = self.failed() lb_vserver_proxy_mock.assert_has_calls([call.delete()]) self.assertEqual(result['msg'], 'lb vserver still exists')
def test_get_immutables_failure(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='present', )) from ansible_collections.ansible.misc.plugins.modules import netscaler_lb_vserver lb_vserver_proxy_mock = Mock() client_mock = Mock() m = Mock(return_value=['some']) with patch.multiple( 'ansible_collections.ansible.misc.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(), lb_vserver_exists=Mock(side_effect=[True, True]), lb_vserver_identical=Mock(side_effect=[False]), do_state_change=Mock(return_value=Mock(errorcode=0)), get_immutables_intersection=m, nitro_exception=self.MockException, ): self.module = netscaler_lb_vserver result = self.failed() self.assertTrue( result['msg'].startswith('Cannot update immutable attributes'), msg='Did not handle immutables error correctly', )
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.ansible.misc.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.ansible.misc.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_ssl_bindings_not_called_for_non_ssl_service(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='present', save_config=False, servicetype='HTTP', )) from ansible_collections.ansible.misc.plugins.modules import netscaler_lb_vserver lb_vserver_proxy_mock = Mock() ssl_sync_mock = Mock() client_mock = Mock() with patch.multiple( 'ansible_collections.ansible.misc.plugins.modules.netscaler_lb_vserver', get_nitro_client=Mock(return_value=client_mock), lb_vserver_exists=Mock(side_effect=[True, True]), lb_vserver_identical=Mock(side_effect=[False, True]), servicegroup_bindings_identical=Mock(side_effect=[True, True]), service_bindings_identical=Mock(side_effect=[True, True]), ssl_certkey_bindings_identical=Mock(side_effect=[False, True]), ssl_certkey_bindings_sync=ssl_sync_mock, 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)), get_immutables_intersection=(Mock(return_value=[])), ): self.module = netscaler_lb_vserver result = self.exited() ssl_sync_mock.assert_not_called() self.assertTrue(result['changed'])
def test_snmp_communities_with_change(self): set_module_args( dict(snmp_communities=[ dict(community_name='community_2', community_type='read-only') ])) commands = ['snmp-server community community_2 ro'] self.execute_module(changed=True, commands=commands)
def test_lldp_change(self): set_module_args(dict(name='Eth1/1', state='absent')) commands = [ 'interface ethernet 1/1 no lldp receive', 'interface ethernet 1/1 no lldp transmit' ] self.execute_module(changed=True, commands=commands)
def test_snmp_communities_delete_with_change(self): set_module_args( dict(snmp_communities=[ dict(community_name='community_1', state='absent') ])) commands = ['no snmp-server community community_1'] self.execute_module(changed=True, commands=commands)
def test_snmp_permissions_with_change(self): set_module_args( dict(snmp_permissions=[ dict(state_enabled=True, permission_type='RFC1213-MIB') ])) commands = ['snmp-server enable set-permission RFC1213-MIB'] self.execute_module(changed=True, commands=commands)
def test_graceful_no_connection_error(self): if sys.version_info[:2] == (2, 6): self.skipTest('requests library not available under python2.6') set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', )) from ansible_collections.ansible.misc.plugins.modules import netscaler_save_config class MockException(Exception): pass client_mock = Mock() attrs = {'login.side_effect': requests.exceptions.ConnectionError} client_mock.configure_mock(**attrs) m = Mock(return_value=client_mock) with patch.multiple( 'ansible_collections.ansible.misc.plugins.modules.netscaler_save_config', get_nitro_client=m, nitro_exception=MockException, ): self.module = netscaler_save_config result = self.failed() self.assertTrue(result['msg'].startswith('Connection error'), msg='Connection error was not handled gracefully')
def test_edgeos_config_match_none(self): lines = [ 'set system interfaces ethernet eth0 address 1.2.3.4/24', 'set system interfaces ethernet eth0 description Outside' ] set_module_args(dict(lines=lines, match='none')) self.execute_module(changed=True, commands=lines, sort=False)
def test_arp_suppression_with_change(self): self.arp_suppression = False set_module_args(dict(nve_id=1, loopback_id=1, bgp=True, mlag_tunnel_ip='192.10.10.1', vni_vlan_list=[dict(vlan_id=10, vni_id=10010), dict(vlan_id=6, vni_id=10060)], arp_suppression=True)) commands = ["interface vlan 10", "exit", "interface vlan 6", "exit"] self.execute_module(changed=True, commands=commands)
def test_graceful_nitro_error_on_login(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='present', )) from ansible_collections.ansible.misc.plugins.modules import netscaler_lb_vserver class MockException(Exception): def __init__(self, *args, **kwargs): self.errorcode = 0 self.message = '' client_mock = Mock() client_mock.login = Mock(side_effect=MockException) m = Mock(return_value=client_mock) with patch( 'ansible_collections.ansible.misc.plugins.modules.netscaler_lb_vserver.get_nitro_client', m): with patch( 'ansible_collections.ansible.misc.plugins.modules.netscaler_lb_vserver.nitro_exception', MockException): self.module = netscaler_lb_vserver result = self.failed() self.assertTrue( result['msg'].startswith('nitro exception'), msg='nitro exception during login not handled properly')
def test_new_cs_vserver_execution_flow(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='present', )) from ansible_collections.ansible.misc.plugins.modules import netscaler_cs_vserver client_mock = Mock() m = Mock(return_value=client_mock) server_proxy_attrs = { 'diff_object.return_value': {}, } cs_vserver_proxy_mock = Mock() cs_vserver_proxy_mock.configure_mock(**server_proxy_attrs) config_proxy_mock = Mock(return_value=cs_vserver_proxy_mock) with patch.multiple( 'ansible_collections.ansible.misc.plugins.modules.netscaler_cs_vserver', get_nitro_client=m, cs_vserver_exists=Mock(side_effect=[False, True]), cs_vserver_identical=Mock(side_effect=[True]), ensure_feature_is_enabled=Mock(return_value=True), ConfigProxy=config_proxy_mock, nitro_exception=self.MockException, do_state_change=Mock(return_value=Mock(errorcode=0)), ): self.module = netscaler_cs_vserver self.exited() cs_vserver_proxy_mock.assert_has_calls([call.add()])
def test_graceful_login_error(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='present', )) from ansible_collections.ansible.misc.plugins.modules import netscaler_lb_vserver if sys.version_info[:2] == (2, 6): self.skipTest('requests library not available under python2.6') client_mock = Mock() attrs = {'login.side_effect': requests.exceptions.SSLError} client_mock.configure_mock(**attrs) m = Mock(return_value=client_mock) with patch.multiple( 'ansible_collections.ansible.misc.plugins.modules.netscaler_lb_vserver', get_nitro_client=m, nitro_exception=self.MockException, do_state_change=Mock(return_value=Mock(errorcode=0)), ): self.module = netscaler_lb_vserver result = self.failed() self.assertTrue(result['msg'].startswith('SSL Error'), msg='SSL Error was not handled gracefully')
def test_absent_cs_vserver_noop_flow(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='absent', )) from ansible_collections.ansible.misc.plugins.modules import netscaler_cs_vserver client_mock = Mock() m = Mock(return_value=client_mock) server_proxy_attrs = { 'diff_object.return_value': {}, } cs_vserver_proxy_mock = Mock() cs_vserver_proxy_mock.configure_mock(**server_proxy_attrs) config_proxy_mock = Mock(return_value=cs_vserver_proxy_mock) with patch.multiple( 'ansible_collections.ansible.misc.plugins.modules.netscaler_cs_vserver', get_nitro_client=m, diff_list=Mock(return_value={}), get_immutables_intersection=Mock(return_value=[]), cs_vserver_exists=Mock(side_effect=[False, False]), cs_vserver_identical=Mock(side_effect=[False, False]), ensure_feature_is_enabled=Mock(return_value=True), ConfigProxy=config_proxy_mock, ): self.module = netscaler_cs_vserver self.exited() cs_vserver_proxy_mock.assert_not_called()
def test_create_new_lb_vserver_workflow(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='present', save_config=False, )) from ansible_collections.ansible.misc.plugins.modules import netscaler_lb_vserver lb_vserver_proxy_mock = Mock() with patch.multiple( 'ansible_collections.ansible.misc.plugins.modules.netscaler_lb_vserver', get_nitro_client=Mock(return_value=Mock()), lb_vserver_exists=Mock(side_effect=[False, True]), lb_vserver_identical=Mock(side_effect=[True]), servicegroup_bindings_identical=Mock(side_effect=[True, True]), service_bindings_identical=Mock(side_effect=[True, True]), do_state_change=Mock(return_value=Mock(errorcode=0)), ConfigProxy=Mock(return_value=lb_vserver_proxy_mock), ensure_feature_is_enabled=Mock(return_value=True), ): self.module = netscaler_lb_vserver result = self.exited() lb_vserver_proxy_mock.assert_has_calls([call.add()]) self.assertTrue(result['changed'])
def test_graceful_nitro_exception_state_absent(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='absent', )) from ansible_collections.ansible.misc.plugins.modules import netscaler_cs_vserver class MockException(Exception): def __init__(self, *args, **kwargs): self.errorcode = 0 self.message = '' m = Mock(side_effect=MockException) with patch.multiple( 'ansible_collections.ansible.misc.plugins.modules.netscaler_cs_vserver', cs_vserver_exists=m, ensure_feature_is_enabled=Mock(return_value=True), nitro_exception=MockException): self.module = netscaler_cs_vserver result = self.failed() self.assertTrue( result['msg'].startswith('nitro exception'), msg='Nitro exception not caught on operation absent')
def test_server_servicegroup_bindings_sanity_check(self): set_module_args( dict( nitro_user='******', nitro_pass='******', nsip='192.0.2.1', state='present', )) from ansible_collections.ansible.misc.plugins.modules import netscaler_lb_vserver lb_vserver_proxy_mock = Mock() client_mock = Mock() with patch.multiple( 'ansible_collections.ansible.misc.plugins.modules.netscaler_lb_vserver', get_nitro_client=Mock(return_value=client_mock), lb_vserver_exists=Mock(side_effect=[True, True]), lb_vserver_identical=Mock(side_effect=[False, True]), servicegroup_bindings_identical=Mock( side_effect=[False, False]), service_bindings_identical=Mock(side_effect=[True, True]), ssl_certkey_bindings_identical=Mock( side_effect=[False, 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)), get_immutables_intersection=(Mock(return_value=[])), nitro_exception=self.MockException, ): self.module = netscaler_lb_vserver result = self.failed() self.assertEqual(result['msg'], 'servicegroup bindings are not identical')
def test_igmp_last_member_query_interval(self): set_module_args(dict(state='enabled', last_member_query_interval=10)) commands = [ 'ip igmp snooping', 'ip igmp snooping last-member-query-interval 10' ] self.execute_module(changed=True, commands=commands)
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.ansible.misc.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.ansible.misc.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_igmp_report_suppression_interval(self): set_module_args(dict(state='enabled', report_suppression_interval=10)) commands = [ 'ip igmp snooping', 'ip igmp snooping report-suppression-interval 10' ] self.execute_module(changed=True, commands=commands)
def test_port_channel_add(self): set_module_args(dict(name='Po23', state='present', members=['Eth1/8'])) self.load_port_channel_fixture() commands = ['interface port-channel 23', 'exit', 'interface ethernet 1/8 channel-group 23 mode on'] self.execute_module(changed=True, commands=commands)
def test_routeros_command_multiple(self): set_module_args( dict( commands=['/system resource print', '/system resource print'])) result = self.execute_module() self.assertEqual(len(result['stdout']), 2) self.assertTrue('platform: "MikroTik"' in result['stdout'][0])
def test_slxos_vlan_state_absent(self, *args, **kwargs): set_module_args(dict(vlan_id=200, state='absent')) result = self.execute_module(changed=True) self.assertEqual(result, { 'commands': ['no vlan 200'], 'changed': True })
def test_snmp_user_auth_type_no_change(self): set_module_args( dict(users=[ dict( name='sara', auth_type='sha', auth_password='******') ])) self.execute_module(changed=False)
def test_bgp_del_neighbor(self): set_module_args(dict(as_number=172, networks=['172.16.1.0/24'], purge=True)) commands = ['router bgp 172 vrf default no neighbor 10.2.3.4 remote-as 173', 'router bgp 172 vrf default no neighbor 10.2.3.5 remote-as 322'] self.execute_module(changed=True, commands=commands)
def test_switch_port_access(self): set_module_args(dict(name='Eth1/12', mode='access', access_vlan=11)) commands = [ 'interface ethernet 1/12', 'switchport mode access', 'switchport access vlan 11', 'exit' ] self.execute_module(changed=True, commands=commands)