From 0b17eb0f55b32377821331ae0e30843c01390be0 Mon Sep 17 00:00:00 2001 From: Chris Archibald Date: Wed, 5 Aug 2020 11:09:13 -0400 Subject: [PATCH] Sync bitbucket and Github --- .../netapp/azure/netapp-azure-20.8.0.tar.gz | Bin 17196 -> 17464 bytes ansible_collections/netapp/ontap/README.md | 2 +- .../plugins/modules/na_ontap_flexcache.py | 19 ----- .../plugins/modules/na_ontap_rest_info.py | 74 ++++++++++++++---- .../plugins/modules/na_ontap_snapmirror.py | 3 +- .../unit/plugins/modules/test_na_ontap_dns.py | 4 + .../modules/test_na_ontap_export_policy.py | 3 +- .../modules/test_na_ontap_flexcache.py | 6 +- .../plugins/modules/test_na_ontap_ipspace.py | 16 +++- .../modules/test_na_ontap_job_schedule.py | 6 +- .../modules/test_na_ontap_login_messages.py | 7 ++ .../modules/test_na_ontap_object_store.py | 39 +++++++-- .../modules/test_na_ontap_rest_info.py | 45 ++++++++--- .../modules/test_na_ontap_snapmirror.py | 10 +-- .../modules/test_na_ontap_software_update.py | 4 +- .../plugins/modules/test_na_ontap_user.py | 7 +- .../modules/test_na_ontap_volume_autosize.py | 4 +- .../plugins/modules/test_na_ontap_vscan.py | 4 + 18 files changed, 178 insertions(+), 75 deletions(-) diff --git a/ansible_collections/netapp/azure/netapp-azure-20.8.0.tar.gz b/ansible_collections/netapp/azure/netapp-azure-20.8.0.tar.gz index 066a2c8b251c38ca36e5b63e67ec671f11fb6f3a..ca1a6484dd81696dd613cb3e7cd2fb38e3ec11a6 100644 GIT binary patch literal 17464 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

wg%nxvbsMKkKKrK()Jo_bE?P&Wl6mM5WP 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 H09XP5T1kub literal 17196 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 diff --git a/ansible_collections/netapp/ontap/README.md b/ansible_collections/netapp/ontap/README.md index 335d96a1..0c7ead51 100644 --- a/ansible_collections/netapp/ontap/README.md +++ b/ansible_collections/netapp/ontap/README.md @@ -32,7 +32,7 @@ Join our Slack Channel at [Netapp.io](http://netapp.io/slack) ### New Options - na_ontap_aggregate: support `disk_size_with_unit` option. - na_ontap_ldap_client: support `ad_domain` and `preferred_ad_server` options. -- na_ontap_rest_info: Support for gather subsets - `cloud_targets_info, cluster_chassis_info, cluster_jobs_info, cluster_metrics_info, cluster_schedules, broadcast_domains_info, cluster_software_history, cluster_software_packages, network_ports_info, ip_interfaces_info, ip_routes_info, ip_service_policies, network_ipspaces_info`. +- na_ontap_rest_info: Support for gather subsets - `cloud_targets_info, cluster_chassis_info, cluster_jobs_info, cluster_metrics_info, cluster_schedules, broadcast_domains_info, cluster_software_history, cluster_software_packages, network_ports_info, ip_interfaces_info, ip_routes_info, ip_service_policies, network_ipspaces_info, san_fc_logins_info, san_fc_wppn-aliases, svm_dns_config_info, svm_ldap_config_info, svm_name_mapping_config_info, svm_nis_config_info, svm_peers_info, svm_peer-permissions_info`. - na_ontap_rest_info: Support for gather subsets for 9.8+ - `cluster_metrocluster_diagnostics. - na_ontap_qtree: `force_delete` option with a DEFAULT of `true` so that ZAPI behavior is aligned with REST. - na_ontap_security_certificates:`ignore_name_if_not_supported` option to not fail if `name` is present since `name` is not supported in ONTAP 9.6 and 9.7. diff --git a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_flexcache.py b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_flexcache.py index f9af7ec5..9dea364b 100644 --- a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_flexcache.py +++ b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_flexcache.py @@ -407,25 +407,6 @@ def volume_unmount(self): % (to_native(error)), exception=traceback.format_exc()) - def flexcache_delete_async(self): - """ - Delete FlexCache relationship at destination cluster - """ - options = {'volume': self.parameters['volume']} - flexcache_delete = netapp_utils.zapi.NaElement.create_node_with_children( - 'flexcache-destroy-async', **options) - try: - result = self.server.invoke_successfully(flexcache_delete, enable_tunneling=True) - except netapp_utils.zapi.NaApiError as error: - self.module.fail_json(msg='Error deleting FlexCache : %s' - % (to_native(error)), - exception=traceback.format_exc()) - results = dict() - for key in ('result-status', 'result-jobid'): - if result.get_child_by_name(key): - results[key] = result[key] - return results - def flexcache_delete(self): """ Delete FlexCache relationship at destination cluster diff --git a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_rest_info.py b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_rest_info.py index bde8a7f7..c1680933 100644 --- a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_rest_info.py +++ b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_rest_info.py @@ -50,12 +50,20 @@ "cluster_schedules" or "cluster/schedules", "cluster_software_history" or "cluster/software/history", "cluster_software_packages" or "cluster/software/packages", - "network_ports_info" or "network/ethernet/ports", + "disk_info" or "storage/disks", "ip_interfaces_info" or "network/ip/interfaces", "ip_routes_info" or "network/ip/routes", "ip_service_policies" or "network/ip/service-policies", "network_ipspaces_info" or "network/ipspaces", - "disk_info" or "storage/disks", + "network_ports_info" or "network/ethernet/ports", + "san_fc_logins_info" or "network/fc/logins", + "san_fc_wppn-aliases" or "network/fc/wwpn-aliases", + "svm_dns_config_info" or "name-services/dns", + "svm_ldap_config_info" or "name-services/ldap", + "svm_name_mapping_config_info" or "name-services/name-mappings", + "svm_nis_config_info" or "name-services/nis", + "svm_peers_info" or "svm/peers", + "svm_peer-permissions_info" or "svm/peer-permissions", "vserver_info" or "svm/svms", "volume_info" or "storage/volumes", Can specify a list of values to include a larger subset. @@ -270,12 +278,20 @@ def convert_subsets(self): "cluster_schedules": "cluster/schedules", "cluster_software_history": "cluster/software/history", "cluster_software_packages": "cluster/software/packages", - "network_ports_info": "network/ethernet/ports", + "disk_info": "storage/disks", "ip_interfaces_info": "network/ip/interfaces", "ip_routes_info": "network/ip/routes", "ip_service_policies": "network/ip/service-policies", "network_ipspaces_info": "network/ipspaces", - "disk_info": "storage/disks", + "network_ports_info": "network/ethernet/ports", + "san_fc_logins_info": "network/fc/logins", + "san_fc_wppn-aliases": "network/fc/wwpn-aliases", + "svm_dns_config_info": "name-services/dns", + "svm_ldap_config_info": "name-services/ldap", + "svm_name_mapping_config_info": "name-services/name-mappings", + "svm_nis_config_info": "name-services/nis", + "svm_peers_info": "svm/peers", + "svm_peer-permissions_info": "svm/peer-permissions", "vserver_info": "svm/svms", "volume_info": "storage/volumes" } @@ -302,15 +318,6 @@ def apply(self): # Defining gather_subset and appropriate api_call get_ontap_subset_info = { - 'storage/aggregates': { - 'api_call': 'storage/aggregates', - }, - 'protocols/cifs/services': { - 'api_call': 'protocols/cifs/services', - }, - 'protocols/cifs/shares': { - 'api_call': 'protocols/cifs/shares', - }, 'cloud/targets': { 'api_call': 'cloud/targets', }, @@ -342,9 +349,30 @@ def apply(self): 'cluster/software/packages': { 'api_call': 'cluster/software/packages', }, + 'name-services/dns': { + 'api_call': 'name-services/dns', + }, + 'name-services/ldap': { + 'api_call': 'name-services/ldap', + }, + 'name-services/name-mappings': { + 'api_call': 'name-services/name-mappings', + }, + 'name-services/nis': { + 'api_call': 'name-services/nis', + }, + 'network/ethernet/broadcast-domains': { + 'api_call': 'network/ethernet/broadcast-domains', + }, 'network/ethernet/ports': { 'api_call': 'network/ethernet/ports', }, + 'network/fc/logins': { + 'api_call': 'network/fc/logins', + }, + 'network/fc/wwpn-aliases': { + 'api_call': 'network/fc/wwpn-aliases', + }, 'network/ip/interfaces': { 'api_call': 'network/ip/interfaces', }, @@ -357,18 +385,30 @@ def apply(self): 'network/ipspaces': { 'api_call': 'network/ipspaces', }, - 'network/ethernet/broadcast-domains': { - 'api_call': 'network/ethernet/broadcast-domains', + 'storage/aggregates': { + 'api_call': 'storage/aggregates', }, 'storage/disks': { 'api_call': 'storage/disks', }, + 'storage/volumes': { + 'api_call': 'storage/volumes', + }, + 'svm/peers': { + 'api_call': 'svm/peers', + }, + 'svm/peer-permissions': { + 'api_call': 'svm/peer-permissions', + }, 'svm/svms': { 'api_call': 'svm/svms', }, - 'storage/volumes': { - 'api_call': 'storage/volumes', + 'protocols/cifs/services': { + 'api_call': 'protocols/cifs/services', }, + 'protocols/cifs/shares': { + 'api_call': 'protocols/cifs/shares', + } } if 'all' in self.parameters['gather_subset']: diff --git a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_snapmirror.py b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_snapmirror.py index 5091cabe..00338142 100644 --- a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_snapmirror.py +++ b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_snapmirror.py @@ -680,8 +680,7 @@ def snapmirror_update(self): snapmirror_update = netapp_utils.zapi.NaElement.create_node_with_children( 'snapmirror-update', **options) try: - result = self.server.invoke_successfully(snapmirror_update, - enable_tunneling=True) + self.server.invoke_successfully(snapmirror_update, enable_tunneling=True) except netapp_utils.zapi.NaApiError as error: self.module.fail_json(msg='Error updating SnapMirror : %s' % (to_native(error)), diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_dns.py b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_dns.py index 071d8062..92ba524b 100644 --- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_dns.py +++ b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_dns.py @@ -152,6 +152,7 @@ def test_module_fail_when_required_args_missing(self): def test_idempotent_modify_dns(self): data = self.mock_args() + data['use_rest'] = 'never' set_module_args(data) with pytest.raises(AnsibleExitJson) as exc: self.get_dns_mock_object('zapi', 'enable', 'false').apply() @@ -160,6 +161,7 @@ def test_idempotent_modify_dns(self): def test_successfully_modify_dns(self): data = self.mock_args() data['domains'] = ['new_test.com'] + data['use_rest'] = 'never' set_module_args(data) with pytest.raises(AnsibleExitJson) as exc: self.get_dns_mock_object('zapi', 'enable', 'false').apply() @@ -168,6 +170,7 @@ def test_successfully_modify_dns(self): @patch('ansible_collections.netapp.ontap.plugins.module_utils.netapp.ems_log_event') def test_idempotent_create_dns(self, mock_ems_log_event): data = self.mock_args() + data['use_rest'] = 'never' set_module_args(data) with pytest.raises(AnsibleExitJson) as exc: self.get_dns_mock_object('zapi').apply() @@ -178,6 +181,7 @@ def test_successfully_create_dns(self, mock_ems_log_event): data = self.mock_args() print("create dns") data['domains'] = ['new_test.com'] + data['use_rest'] = 'never' set_module_args(data) with pytest.raises(AnsibleExitJson) as exc: self.get_dns_mock_object('zapi', 'create').apply() diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_export_policy.py b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_export_policy.py index 3b190d34..1ed9f2b0 100644 --- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_export_policy.py +++ b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_export_policy.py @@ -130,7 +130,8 @@ def mock_args(self, rest=False): 'name': self.mock_export_policy['name'], 'hostname': 'test', 'username': 'test_user', - 'password': 'test_pass!' + 'password': 'test_pass!', + 'use_rest': 'never' } def get_export_policy_mock_object(self, type='zapi', kind=None): diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_flexcache.py b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_flexcache.py index a7b5929d..ae93f142 100644 --- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_flexcache.py +++ b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_flexcache.py @@ -520,8 +520,10 @@ def test_create_flexcache_time_out(self): if not self.onbox: my_obj.server = MockONTAPConnection(job_error='time_out') with patch.object(my_module, 'flexcache_create', wraps=my_obj.flexcache_create) as mock_create: - with pytest.raises(AnsibleFailJson) as exc: - my_obj.apply() + # replace time.sleep with a noop + with patch('time.sleep', lambda a: None): + with pytest.raises(AnsibleFailJson) as exc: + my_obj.apply() print('Create: ' + repr(exc.value)) msg = 'Error when creating flexcache: job completion exceeded expected timer of: %s seconds' \ % args['time_out'] diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_ipspace.py b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_ipspace.py index 1b4140ec..d615ac24 100644 --- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_ipspace.py +++ b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_ipspace.py @@ -117,7 +117,7 @@ def get_ipspace_mock_object(type='zapi', kind=None, status=None): if kind is None: ipspace_obj.server = MockONTAPConnection() else: - ipspace_obj.server = MockONTAPConnection(kind=kind, data=status) + ipspace_obj.server = MockONTAPConnection(kind=kind, parm1=status) return ipspace_obj def test_fail_requiredargs_missing(self): @@ -127,8 +127,13 @@ def test_fail_requiredargs_missing(self): my_module() print('Info: %s' % exc.value.args[0]['msg']) - def test_get_ipspace_iscalled(self): + @patch('ansible_collections.netapp.ontap.plugins.module_utils.netapp.OntapRestAPI.send_request') + def test_get_ipspace_iscalled(self, mock_request): ''' test if get_ipspace() is called ''' + mock_request.side_effect = [ + SRR['is_zapi'], + SRR['end_of_sequence'] + ] set_module_args(self.set_default_args()) my_obj = my_module() my_obj.server = self.server @@ -136,8 +141,13 @@ def test_get_ipspace_iscalled(self): print('Info: test_get_ipspace: %s' % repr(ipspace)) assert ipspace is None - def test_ipspace_apply_iscalled(self): + @patch('ansible_collections.netapp.ontap.plugins.module_utils.netapp.OntapRestAPI.send_request') + def test_ipspace_apply_iscalled(self, mock_request): ''' test if apply() is called ''' + mock_request.side_effect = [ + SRR['is_zapi'], + SRR['end_of_sequence'] + ] module_args = {'name': 'test_apply_ips'} module_args.update(self.set_default_args()) set_module_args(module_args) diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_job_schedule.py b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_job_schedule.py index 479441a1..40a8aaf9 100644 --- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_job_schedule.py +++ b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_job_schedule.py @@ -102,9 +102,6 @@ def invoke_successfully(self, xml, enable_tunneling): # pylint: disable=unused- xml = self.build_job_schedule_cron_info(self.params) elif self.kind == 'job_multiple': xml = self.build_job_schedule_multiple_cron_info(self.params) - # TODO: mock invoke_elem for autosupport calls - elif self.kind == 'vserver': - xml = self.build_vserver_info() self.xml_out = xml return xml @@ -188,7 +185,8 @@ def mock_args(self, rest=False): 'job_minutes': [self.mock_job['minutes']], 'hostname': 'test', 'username': 'test_user', - 'password': 'test_pass!' + 'password': 'test_pass!', + 'use_rest': 'never' } def get_job_mock_object(self, kind=None, call_type='zapi'): diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_login_messages.py b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_login_messages.py index 51ee985e..c001bde1 100644 --- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_login_messages.py +++ b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_login_messages.py @@ -173,6 +173,7 @@ def test_module_fail_when_required_args_missing(self): def test_successfully_create_banner(self): data = self.mock_args() data['banner'] = 'test banner' + data['use_rest'] = 'never' set_module_args(data) with pytest.raises(AnsibleExitJson) as exc: self.get_login_mock_object('zapi', 'create', data).apply() @@ -181,6 +182,7 @@ def test_successfully_create_banner(self): def test_create_banner_idempotency(self): data = self.mock_args() data['banner'] = 'test banner' + data['use_rest'] = 'never' set_module_args(data) with pytest.raises(AnsibleExitJson) as exc: self.get_login_mock_object('zapi', 'create_idempotency', data).apply() @@ -189,6 +191,7 @@ def test_create_banner_idempotency(self): def test_successfully_create_motd(self): data = self.mock_args() data['motd_message'] = 'test message' + data['use_rest'] = 'never' set_module_args(data) with pytest.raises(AnsibleExitJson) as exc: self.get_login_mock_object('zapi', 'create', data).apply() @@ -197,6 +200,7 @@ def test_successfully_create_motd(self): def test_create_motd_idempotency(self): data = self.mock_args() data['motd_message'] = 'test message' + data['use_rest'] = 'never' set_module_args(data) with pytest.raises(AnsibleExitJson) as exc: self.get_login_mock_object('zapi', 'create_idempotency', data).apply() @@ -204,6 +208,7 @@ def test_create_motd_idempotency(self): def test_get_banner_error(self): data = self.mock_args() + data['use_rest'] = 'never' set_module_args(data) with pytest.raises(AnsibleFailJson) as exc: self.get_login_mock_object('zapi', 'error', data).apply() @@ -213,6 +218,7 @@ def test_get_banner_error(self): def test_modify_banner_error(self, get_info): data = self.mock_args() data['banner'] = 'modify to new banner' + data['use_rest'] = 'never' set_module_args(data) get_info.side_effect = [ { @@ -228,6 +234,7 @@ def test_modify_banner_error(self, get_info): def test_modify_motd_error(self, get_info): data = self.mock_args() data['motd_message'] = 'modify to new motd' + data['use_rest'] = 'never' set_module_args(data) get_info.side_effect = [ { diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_object_store.py b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_object_store.py index 1f618b45..de8953b8 100644 --- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_object_store.py +++ b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_object_store.py @@ -151,22 +151,37 @@ def test_module_fail_when_required_args_missing(self): my_module() print('Info: %s' % exc.value.args[0]['msg']) - def test_ensure_object_store_get_called(self): + @patch('ansible_collections.netapp.ontap.plugins.module_utils.netapp.OntapRestAPI.send_request') + def test_ensure_object_store_get_called(self, mock_request): ''' fetching details of object store ''' + mock_request.side_effect = [ + SRR['is_zapi'], + SRR['end_of_sequence'] + ] set_module_args(self.set_default_args()) my_obj = my_module() my_obj.server = self.server assert my_obj.get_aggr_object_store() is not None - def test_ensure_get_called_existing(self): + @patch('ansible_collections.netapp.ontap.plugins.module_utils.netapp.OntapRestAPI.send_request') + def test_ensure_get_called_existing(self, mock_request): ''' test for existing object store''' + mock_request.side_effect = [ + SRR['is_zapi'], + SRR['end_of_sequence'] + ] set_module_args(self.set_default_args()) my_obj = my_module() my_obj.server = MockONTAPConnection(kind='object_store') assert my_obj.get_aggr_object_store() - def test_object_store_create(self): + @patch('ansible_collections.netapp.ontap.plugins.module_utils.netapp.OntapRestAPI.send_request') + def test_object_store_create(self, mock_request): ''' test for creating object store''' + mock_request.side_effect = [ + SRR['is_zapi'], + SRR['end_of_sequence'] + ] module_args = { 'provider_type': 'abc', 'server': 'abc', @@ -185,8 +200,13 @@ def test_object_store_create(self): my_obj.apply() assert not exc.value.args[0]['changed'] - def test_object_store_delete(self): + @patch('ansible_collections.netapp.ontap.plugins.module_utils.netapp.OntapRestAPI.send_request') + def test_object_store_delete(self, mock_request): ''' test for deleting object store''' + mock_request.side_effect = [ + SRR['is_zapi'], + SRR['end_of_sequence'] + ] module_args = { 'state': 'absent', } @@ -195,6 +215,10 @@ def test_object_store_delete(self): @patch('ansible_collections.netapp.ontap.plugins.module_utils.netapp.OntapRestAPI.send_request') def test_rest_error(self, mock_request): + mock_request.side_effect = [ + SRR['is_zapi'], + SRR['end_of_sequence'] + ] set_module_args(self.set_default_args()) mock_request.side_effect = [ SRR['is_rest'], @@ -248,7 +272,12 @@ def test_rest_successful_delete(self, mock_request): my_obj.apply() assert exc.value.args[0]['changed'] - def test_if_all_methods_catch_exception(self): + @patch('ansible_collections.netapp.ontap.plugins.module_utils.netapp.OntapRestAPI.send_request') + def test_if_all_methods_catch_exception(self, mock_request): + mock_request.side_effect = [ + SRR['is_zapi'], + SRR['end_of_sequence'] + ] module_args = { 'provider_type': 'abc', 'server': 'abc', diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_rest_info.py b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_rest_info.py index abdd1ebf..5552ecd7 100644 --- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_rest_info.py +++ b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_rest_info.py @@ -316,12 +316,14 @@ def test_run_Ontap_gather_facts_for_volume_info_pass(self, mock_request): def test_run_Ontap_gather_facts_for_all_subsets_pass(self, mock_request): set_module_args(self.set_args_run_Ontap_gather_facts_for_all_subsets()) my_obj = ontap_rest_info_module() - gather_subset = ['storage/aggregates', 'svm/svms', 'storage/volumes', 'cloud/targets', - 'cluster/chassis', 'cluster/jobs', 'cluster/metrics', 'cluster/nodes', - 'cluster/peers', 'cluster/schedules', 'protocols/cifs/services', 'protocols/cifs/shares', - 'storage/disks', 'cluster/software/history', 'cluster/software/packages', 'network/ethernet/ports', - 'network/ip/interfaces', 'network/ip/routes', 'network/ip/service-policies', 'network/ipspaces', - 'network/ethernet/broadcast-domains', 'cluster/metrocluster/diagnostics'] + gather_subset = ['cloud/targets', 'cluster/chassis', 'cluster/jobs', 'cluster/metrocluster/diagnostics', + 'cluster/metrics', 'cluster/nodes', 'cluster/peers', 'cluster/schedules', 'cluster/software/history', + 'cluster/software/packages', 'name-services/dns', 'name-services/ldap', 'name-services/name-mappings', + 'name-services/nis', 'network/ethernet/broadcast-domains', 'network/ethernet/ports', + 'network/fc/logins', 'network/fc/wwpn-aliases', 'network/ip/interfaces', 'network/ip/routes', + 'network/ip/service-policies', 'network/ipspaces', 'storage/aggregates', 'storage/disks', + 'storage/volumes', 'svm/peers', 'svm/peer-permissions', 'svm/svms', 'protocols/cifs/services', + 'protocols/cifs/shares'] mock_request.side_effect = [ SRR['validate_ontap_version_pass'], SRR['get_subset_info'], @@ -348,6 +350,14 @@ def test_run_Ontap_gather_facts_for_all_subsets_pass(self, mock_request): SRR['get_subset_info'], SRR['get_subset_info'], SRR['get_subset_info'], + SRR['get_subset_info'], + SRR['get_subset_info'], + SRR['get_subset_info'], + SRR['get_subset_info'], + SRR['get_subset_info'], + SRR['get_subset_info'], + SRR['get_subset_info'], + SRR['get_subset_info'], ] with pytest.raises(AnsibleExitJson) as exc: @@ -361,12 +371,14 @@ def test_run_Ontap_gather_facts_for_all_subsets_pass(self, mock_request): def test_run_Ontap_gather_facts_for_all_subsets_with_fields_section_pass(self, mock_request): set_module_args(self.set_args_run_Ontap_gather_facts_for_all_subsets_with_fields_section_pass()) my_obj = ontap_rest_info_module() - gather_subset = ['storage/aggregates', 'svm/svms', 'storage/volumes', 'cloud/targets', - 'cluster/chassis', 'cluster/jobs', 'cluster/metrics', 'cluster/nodes', - 'cluster/peers', 'cluster/schedules', 'protocols/cifs/services', 'protocols/cifs/shares', - 'storage/disks', 'cluster/software/history', 'cluster/software/packages', 'network/ethernet/ports', - 'network/ip/interfaces', 'network/ip/routes', 'network/ip/service-policies', 'network/ipspaces', - 'network/ethernet/broadcast-domains', 'cluster/metrocluster/diagnostics'] + gather_subset = ['cloud/targets', 'cluster/chassis', 'cluster/jobs', 'cluster/metrocluster/diagnostics', + 'cluster/metrics', 'cluster/nodes', 'cluster/peers', 'cluster/schedules', 'cluster/software/history', + 'cluster/software/packages', 'name-services/dns', 'name-services/ldap', 'name-services/name-mappings', + 'name-services/nis', 'network/ethernet/broadcast-domains', 'network/ethernet/ports', + 'network/fc/logins', 'network/fc/wwpn-aliases', 'network/ip/interfaces', 'network/ip/routes', + 'network/ip/service-policies', 'network/ipspaces', 'storage/aggregates', 'storage/disks', + 'storage/volumes', 'svm/peers', 'svm/peer-permissions', 'svm/svms', 'protocols/cifs/services', + 'protocols/cifs/shares'] mock_request.side_effect = [ SRR['validate_ontap_version_pass'], SRR['get_subset_info'], @@ -393,7 +405,14 @@ def test_run_Ontap_gather_facts_for_all_subsets_with_fields_section_pass(self, m SRR['get_subset_info'], SRR['get_subset_info'], SRR['get_subset_info'], - + SRR['get_subset_info'], + SRR['get_subset_info'], + SRR['get_subset_info'], + SRR['get_subset_info'], + SRR['get_subset_info'], + SRR['get_subset_info'], + SRR['get_subset_info'], + SRR['get_subset_info'], ] with pytest.raises(AnsibleExitJson) as exc: diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_snapmirror.py b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_snapmirror.py index 2f9a84ec..b568e218 100644 --- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_snapmirror.py +++ b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_snapmirror.py @@ -205,7 +205,9 @@ def test_failure_break(self): if not self.onbox: my_obj.server = MockONTAPConnection('snapmirror', 'snapmirrored', status='idle', quiesce_status='InProgress') with pytest.raises(AnsibleFailJson) as exc: - my_obj.apply() + # replace time.sleep with a noop + with patch('time.sleep', lambda a: None): + my_obj.apply() assert 'Taking a long time to Quiescing SnapMirror, try again later' in exc.value.args[0]['msg'] def test_successful_break(self): @@ -478,8 +480,7 @@ def test_elementsw_volume_exists(self): mock_helper.volume_id_exists.side_effect = [1000, None] if not self.onbox: my_obj.server = MockONTAPConnection('snapmirror', status='idle', parm='snapmirrored') - res = my_obj.check_if_elementsw_volume_exists('10.10.10.10:/lun/1000', mock_helper) - assert res is None + my_obj.check_if_elementsw_volume_exists('10.10.10.10:/lun/1000', mock_helper) with pytest.raises(AnsibleFailJson) as exc: my_obj.check_if_elementsw_volume_exists('10.10.10.10:/lun/1000', mock_helper) assert 'Error: Source volume does not exist in the ElementSW cluster' in exc.value.args[0]['msg'] @@ -494,8 +495,7 @@ def test_elementsw_svip_exists(self): 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 + my_obj.validate_elementsw_svip('10.10.10.10:/lun/1000', mock_helper) def test_elementsw_svip_exists_negative(self): ''' svip_exists negative testing''' diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_software_update.py b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_software_update.py index 241b6471..2c7c858b 100644 --- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_software_update.py +++ b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_software_update.py @@ -162,6 +162,8 @@ def test_ensure_apply_for_update_called(self): if not self.use_vsim: my_obj.server = MockONTAPConnection('software_update', 'async_pkg_get_phase_complete', 'abc') with pytest.raises(AnsibleExitJson) as exc: - my_obj.apply() + # replace time.sleep with a noop + with patch('time.sleep', lambda a: None): + my_obj.apply() print('Info: test_software_update_apply: %s' % repr(exc.value)) assert exc.value.args[0]['changed'] diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_user.py b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_user.py index 4e450ee8..15aed4aa 100644 --- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_user.py +++ b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_user.py @@ -148,11 +148,16 @@ def set_default_args(self, rest=False): vserver = 'vserver' application = 'console' authentication_method = 'password' + if rest: + use_rest = 'auto' + else: + use_rest = 'never' return dict({ 'hostname': hostname, 'username': username, 'password': password, + 'use_rest': use_rest, 'name': user_name, 'vserver': vserver, 'applications': application, @@ -353,7 +358,7 @@ def test_if_all_methods_catch_exception(self): @patch('ansible_collections.netapp.ontap.plugins.module_utils.netapp.OntapRestAPI.send_request') def test_rest_error_applications_snmp(self, mock_request): - data = self.set_default_args() + data = self.set_default_args(rest=True) data.update({'applications': 'snmp'}) data.update({'name': 'create'}) data.update({'role_name': 'test123'}) diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_volume_autosize.py b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_volume_autosize.py index fc03eb6f..3ac1236a 100644 --- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_volume_autosize.py +++ b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_volume_autosize.py @@ -151,7 +151,8 @@ def mock_args(self, rest=False): 'shrink_threshold_percent': self.mock_autosize['shrink_threshold_percent'], 'hostname': 'test', 'username': 'test_user', - 'password': 'test_pass!' + 'password': 'test_pass!', + 'use_rest': 'never' } def get_autosize_mock_object(self, type='zapi', kind=None): @@ -192,6 +193,7 @@ def test_successful_reset(self): data['password'] = 'test_pass!' data['volume'] = 'test_vol' data['vserver'] = 'test_vserver' + data['use_rest'] = 'never' set_module_args(data) with pytest.raises(AnsibleExitJson) as exc: self.get_autosize_mock_object('zapi', 'autosize').apply() diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_vscan.py b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_vscan.py index 90f41c4a..9e2ccb4a 100644 --- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_vscan.py +++ b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_vscan.py @@ -131,6 +131,7 @@ def test_module_fail_when_required_args_missing(self): def test_successfully_enable(self): data = self.mock_args() data['enable'] = True + data['use_rest'] = 'never' set_module_args(data) with pytest.raises(AnsibleExitJson) as exc: self.get_vscan_mock_object('zapi', 'enable', 'false').apply() @@ -139,6 +140,7 @@ def test_successfully_enable(self): def test_idempotently_enable(self): data = self.mock_args() data['enable'] = True + data['use_rest'] = 'never' set_module_args(data) with pytest.raises(AnsibleExitJson) as exc: self.get_vscan_mock_object('zapi', 'enable', 'true').apply() @@ -147,6 +149,7 @@ def test_idempotently_enable(self): def test_successfully_disable(self): data = self.mock_args() data['enable'] = False + data['use_rest'] = 'never' set_module_args(data) with pytest.raises(AnsibleExitJson) as exc: self.get_vscan_mock_object('zapi', 'enable', 'true').apply() @@ -155,6 +158,7 @@ def test_successfully_disable(self): def test_idempotently_disable(self): data = self.mock_args() data['enable'] = False + data['use_rest'] = 'never' set_module_args(data) with pytest.raises(AnsibleExitJson) as exc: self.get_vscan_mock_object('zapi', 'enable', 'false').apply()