def test_successful_delete(self, delete_snapmirror): ''' deleting snapmirror and testing idempotency ''' data = self.set_default_args() data['state'] = 'absent' data['source_hostname'] = '10.10.10.10' set_module_args(data) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) my_obj.get_destination = Mock(return_value=True) if not self.onbox: my_obj.server = MockONTAPConnection('snapmirror', status='idle') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert exc.value.args[0]['changed'] delete_snapmirror.assert_called_with(False, 'data_protection') # to reset na_helper from remembering the previous 'changed' value my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) if not self.onbox: my_obj.server = self.server with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert not exc.value.args[0]['changed']
def test_cluster_create_old_api(self, get_cl_id): ''' creating cluster''' get_cl_id.return_value = None module_args = {} module_args.update(self.set_default_args()) set_module_args(module_args) my_obj = my_module() my_obj.autosupport_log = Mock(return_value=None) if not self.use_vsim: my_obj.server = MockONTAPConnection('cluster_extra_input') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() print('Info: test_cluster_apply: %s' % repr(exc.value)) assert exc.value.args[0]['changed']
def test_successful_create(self, snapmirror_create): ''' creating snapmirror and testing idempotency ''' data = self.set_default_args() data['schedule'] = 'abc' data['identity_preserve'] = True set_module_args(data) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) if not self.onbox: my_obj.server = self.server with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert exc.value.args[0]['changed'] snapmirror_create.assert_called_with() # to reset na_helper from remembering the previous 'changed' value set_module_args(self.set_default_args()) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) if not self.onbox: my_obj.server = MockONTAPConnection('snapmirror', 'snapmirrored', status='idle') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert not exc.value.args[0]['changed']
def test_successful_disable_policy(self, modify_snapshot): ''' disabling snapshot policy and testing idempotency ''' data = self.set_default_args() data['enabled'] = False set_module_args(data) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) if not self.onbox: my_obj.server = MockONTAPConnection('policy') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert exc.value.args[0]['changed'] current = self.set_default_current() modify_snapshot.assert_called_with(current) # to reset na_helper from remembering the previous 'changed' value my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) if not self.onbox: my_obj.server = MockONTAPConnection( 'snapshot_policy_info_policy_disabled') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert not exc.value.args[0]['changed']
def test_disk_firmware_upgrade(self, get_mock): ''' Test disk firmware upgrade ''' module_args = {} module_args.update(self.set_default_args()) module_args.update({'firmware_type': 'disk'}) set_module_args(module_args) my_obj = my_module() my_obj.autosupport_log = Mock(return_value=None) if not self.use_vsim: my_obj.server = self.server with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() print('Info: test_firmware_upgrade_apply: %s' % repr(exc.value)) assert not exc.value.args[0]['changed']
def test_cluster_create_called(self, cluster_create, get_cl_id): ''' creating cluster''' get_cl_id.return_value = None module_args = {} module_args.update(self.set_default_args()) set_module_args(module_args) my_obj = my_module() my_obj.autosupport_log = Mock(return_value=None) if not self.use_vsim: my_obj.server = MockONTAPConnection('cluster_success') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() print('Info: test_cluster_apply: %s' % repr(exc.value)) cluster_create.assert_called_with()
def test_successful_create_with_rules_via_rest(self, snapmirror_create_policy, send_request): ''' creating snapmirror policy with rules via rest and testing idempotency ''' data = self.set_default_args(use_rest='Always', with_rules=True) set_module_args(data) send_request.side_effect = [SRR['is_rest'], SRR['empty_good'], SRR['empty_good'], SRR['end_of_sequence']] my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) my_obj.get_snapmirror_policy = Mock() my_obj.get_snapmirror_policy.side_effect = [None, SRR['get_snapmirror_policy']] with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert exc.value.args[0]['changed'] snapmirror_create_policy.assert_called_with() # to reset na_helper from remembering the previous 'changed' value data = self.set_default_args(use_rest='Always', with_rules=True) set_module_args(data) send_request.side_effect = [SRR['is_rest'], SRR['end_of_sequence']] my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) my_obj.get_snapmirror_policy = Mock(return_value=SRR['get_snapmirror_policy_with_rules']) with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert not exc.value.args[0]['changed']
def get_mock_object(self, kind=None): """ Helper method to return an na_ontap_firewall_policy object :param kind: passes this param to MockONTAPConnection() :return: na_ontap_firewall_policy object """ obj = fp_module() obj.autosupport_log = Mock(return_value=None) if kind is None: obj.server = MockONTAPConnection() else: mock_data = self.mock_config if kind == 'config' else self.mock_policy obj.server = MockONTAPConnection(kind=kind, data=mock_data) return obj
def get_interface_mock_object(self, kind=None): """ Helper method to return an na_ontap_interface object :param kind: passes this param to MockONTAPConnection() :return: na_ontap_interface object """ interface_obj = interface_module() interface_obj.autosupport_log = Mock(return_value=None) if kind is None: interface_obj.server = MockONTAPConnection() else: interface_obj.server = MockONTAPConnection( kind=kind, data=self.mock_interface) return interface_obj
def test_successful_rest_create_with_create_destination_new_style( self, mock_request, mock_get_policy): ''' creating snapmirror and testing idempotency ''' data = self.set_default_args() data.pop('relationship_type') data.pop('use_rest') data.pop('destination_path') data.pop('source_path') data.pop('destination_vserver') data.pop('source_vserver') data['create_destination'] = dict(tiering=dict(policy='all')) data['destination_endpoint'] = dict(path='ansible_svm:ansible') data['source_endpoint'] = dict(path='ansible:ansible') data['source_endpoint'] = dict(path='ansible:ansible') set_module_args(data) mock_request.side_effect = [ SRR['is_rest'], # REST support SRR['empty_good'], # POST to create snapmirror relationship SRR['end_of_sequence'] ] mock_get_policy.return_value = 'async', None my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) if not self.onbox: my_obj.server = self.server with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert exc.value.args[0]['changed'] mock_request.assert_called_with('POST', 'snapmirror/relationships/', {'return_timeout': 60}, json={ 'source': { 'path': 'ansible:ansible' }, 'destination': { 'path': 'ansible_svm:ansible' }, 'create_destination': { 'enabled': True, 'tiering': { 'policy': 'all' } }, 'policy': 'ansible_policy', 'state': 'snapmirrored' }) # print(mock_get_policy.mock_calls) mock_get_policy.assert_called_with('ansible_policy', 'ansible_svm')
def test_firmware_download(self): ''' Test firmware download ''' module_args = {} module_args.update(self.set_default_args()) module_args.update({'package_url': 'dummy_url'}) set_module_args(module_args) my_obj = my_module() my_obj.autosupport_log = Mock(return_value=None) if not self.use_vsim: my_obj.server = MockONTAPConnection('firmware_download') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert exc.value.args[0]['changed'] msg = "Firmware download completed. Extra info: Download complete." assert exc.value.args[0]['msg'] == msg
def test_valid_schedule_count(self): ''' validate when schedule has same number of elements ''' data = self.set_default_args() data['schedule'] = ['hourly', 'daily', 'weekly', 'monthly', '5min'] data['prefix'] = ['hourly', 'daily', 'weekly', 'monthly', '5min'] data['count'] = [1, 2, 3, 4, 5] set_module_args(data) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) if not self.onbox: my_obj.server = self.server my_obj.create_snapshot_policy() create_xml = my_obj.server.xml_in assert data['count'][2] == int(create_xml['count3']) assert data['schedule'][4] == create_xml['schedule5']
def test_successful_modify_with_rules(self, snapmirror_policy_modify): ''' modifying snapmirror policy with rules and testing idempotency ''' data = self.set_default_args(use_rest='Never', with_rules=True) set_module_args(data) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) my_obj.get_snapmirror_policy = Mock(return_value=SRR['get_snapmirror_policy']) if not self.onbox: my_obj.server = MockONTAPConnection('snapmirror_policy') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert exc.value.args[0]['changed'] snapmirror_policy_modify.assert_called_with() # to reset na_helper from remembering the previous 'changed' value data = self.set_default_args(use_rest='Never', with_rules=True) set_module_args(data) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) my_obj.get_snapmirror_policy = Mock(return_value=SRR['get_snapmirror_policy_with_rules']) if not self.onbox: my_obj.server = MockONTAPConnection('snapmirror_policy') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert not exc.value.args[0]['changed']
def test_firmware_download_empty_output(self): ''' Test firmware download ''' module_args = {} module_args.update(self.set_default_args()) module_args.update({'package_url': 'dummy_url'}) set_module_args(module_args) my_obj = my_module() my_obj.autosupport_log = Mock(return_value=None) if not self.use_vsim: my_obj.server = MockONTAPConnection('firmware_download', 'empty_output') with pytest.raises(AnsibleFailJson) as exc: my_obj.apply() msg = "unable to download package from dummy_url: check console permissions." assert exc.value.args[0]['msg'].startswith(msg)
def get_asup_mock_object(self, kind=None, enabled='false'): """ Helper method to return an na_ontap_volume object :param kind: passes this param to MockONTAPConnection() :return: na_ontap_volume object """ asup_obj = asup_module() asup_obj.autosupport_log = Mock(return_value=None) if kind is None: asup_obj.server = MockONTAPConnection() else: data = self.mock_asup data['is_enabled'] = enabled asup_obj.server = MockONTAPConnection(kind='asup', data=data) return asup_obj
def test_successful_modify(self, modify_security_config): ''' modifying security_config and testing idempotency ''' data = self.set_default_args(use_rest='Never') data['is_fips_enabled'] = True # Modify to True set_module_args(data) my_obj = security_config_module() my_obj.ems_log_event = Mock(return_value=None) if not self.onbox: my_obj.server = MockONTAPConnection('security_config') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert exc.value.args[0]['changed'] # reset na_helper from remembering the previous 'changed' value data['is_fips_enabled'] = False set_module_args(data) my_obj = security_config_module() my_obj.ems_log_event = Mock(return_value=None) if not self.onbox: my_obj.server = MockONTAPConnection('security_config') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert not exc.value.args[0]['changed']
def test_successful_modify_with_rules_via_rest( self, snapmirror_policy_modify, modify_snapmirror_policy_rules): ''' modifying snapmirror policy with rules via rest and testing idempotency ''' data = self.set_default_args(use_rest='Always', with_rules=True) set_module_args(data) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) my_obj.get_snapmirror_policy = Mock( return_value=SRR['get_snapmirror_policy']) with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert exc.value.args[0]['changed'] snapmirror_policy_modify.assert_called_with( 'abcdef12-3456-7890-abcd-ef1234567890', 'async_mirror') # to reset na_helper from remembering the previous 'changed' value data = self.set_default_args(use_rest='Always', with_rules=True) set_module_args(data) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) my_obj.get_snapmirror_policy = Mock( return_value=SRR['get_snapmirror_policy_with_rules']) with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert not exc.value.args[0]['changed']
def test_check_elementsw_params_negative(self): ''' check elementsw parameters for source negative testing ''' data = self.set_default_args() del data['source_path'] set_module_args(data) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) if not self.onbox: my_obj.server = MockONTAPConnection('snapmirror', status='idle', parm='snapmirrored') with pytest.raises(AnsibleFailJson) as exc: my_obj.check_elementsw_parameters('source') assert 'Error: Missing required parameter source_path' in exc.value.args[ 0]['msg']
def test_elementsw_source_path_format(self): ''' test element_source_path_format_matches ''' data = self.set_default_args() set_module_args(data) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) if not self.onbox: my_obj.server = MockONTAPConnection('snapmirror', status='idle', parm='snapmirrored') match = my_obj.element_source_path_format_matches('1.1.1.1:dummy') assert match is None match = my_obj.element_source_path_format_matches( '10.10.10.10:/lun/10') assert match is not None
def test_invalid_schedule_count_with_snapmirror_labels(self): ''' validate error when schedule with snapmirror labels does not have same number of elements ''' data = self.set_default_args() data['schedule'] = ['s1', 's2', 's3'] data['count'] = [1, 2, 3] data['snapmirror_label'] = ['sm1', 'sm2'] set_module_args(data) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) if not self.onbox: my_obj.server = self.server with pytest.raises(AnsibleFailJson) as exc: my_obj.create_snapshot_policy() msg = 'Error: Each Snapshot Policy schedule must have an accompanying SnapMirror Label' assert exc.value.args[0]['msg'] == msg
def test_successful_create_without_initialize(self): ''' creating snapmirror and testing idempotency ''' data = self.set_default_args() data['schedule'] = 'abc' data['identity_preserve'] = True data['initialize'] = False set_module_args(data) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) my_obj.server = MockONTAPConnection('snapmirror', 'Uninitialized', status='idle') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert exc.value.args[0]['changed']
def test_successful_modify_schedules_add(self, modify_snapshot): ''' adding snapshot policy schedules and testing idempotency ''' data = self.set_default_args() data['schedule'] = ['hourly', 'daily', 'weekly'] data['count'] = [100, 5, 10] data['snapmirror_label'] = ['', 'daily', ''] set_module_args(data) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) if not self.onbox: my_obj.server = MockONTAPConnection('policy') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert exc.value.args[0]['changed'] current = self.set_default_current() modify_snapshot.assert_called_with(current) # to reset na_helper from remembering the previous 'changed' value my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) if not self.onbox: my_obj.server = MockONTAPConnection('snapshot_policy_info_schedules_added') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert not exc.value.args[0]['changed']
def get_job_mock_object(self, kind=None, call_type='zapi'): """ Helper method to return an na_ontap_job_schedule object :param kind: passes this param to MockONTAPConnection() :param call_type: :return: na_ontap_job_schedule object """ job_obj = job_module() job_obj.autosupport_log = Mock(return_value=None) if call_type == 'zapi': if kind is None: job_obj.server = MockONTAPConnection() else: job_obj.server = MockONTAPConnection(kind=kind, data=self.mock_job) return job_obj
def test_cluster_create_old_api_other_extra(self, get_cl_id): ''' creating cluster''' get_cl_id.return_value = None module_args = {} module_args.update(self.set_default_args()) set_module_args(module_args) my_obj = my_module() my_obj.autosupport_log = Mock(return_value=None) if not self.use_vsim: my_obj.server = MockONTAPConnection('cluster_extra_input_other') with pytest.raises(AnsibleFailJson) as exc: my_obj.apply() msg = 'TEST3:Extra input: other-unexpected-element' print('Info: test_cluster_apply: %s' % repr(exc.value)) assert msg in exc.value.args[0]['msg']
def test_if_all_methods_catch_exception(self): data = self.set_default_args(use_rest='Never') set_module_args(data) my_obj = log_forward_module() my_obj.ems_log_event = Mock(return_value=None) if not self.onbox: my_obj.server = MockONTAPConnection('log_forward_fail') with pytest.raises(AnsibleFailJson) as exc: my_obj.create_log_forward_config() assert 'Error creating log forward config with destination ' in exc.value.args[ 0]['msg'] with pytest.raises(AnsibleFailJson) as exc: my_obj.destroy_log_forward_config() assert 'Error destroying log forward destination ' in exc.value.args[ 0]['msg']
def test_successful_modify(self, modify_log_forward_config): ''' modifying log_forward config and testing idempotency ''' data = self.set_default_args(use_rest='Never') data['facility'] = 'kern' set_module_args(data) my_obj = log_forward_module() my_obj.ems_log_event = Mock(return_value=None) if not self.onbox: my_obj.server = MockONTAPConnection('log_forward') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert exc.value.args[0]['changed'] # modify_log_forward_config.assert_called_with() # to reset na_helper from remembering the previous 'changed' value data['facility'] = 'user' set_module_args(data) my_obj = log_forward_module() my_obj.ems_log_event = Mock(return_value=None) if not self.onbox: my_obj.server = MockONTAPConnection('log_forward') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert not exc.value.args[0]['changed']
def test_successful_element_ontap_create(self, check_param, snapmirror_create): ''' creating ElementSW to ONTAP snapmirror ''' data = self.set_default_args() data['schedule'] = 'abc' data['connection_type'] = 'elementsw_ontap' data['source_hostname'] = '10.10.10.10' set_module_args(data) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) if not self.onbox: my_obj.server = self.server with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert exc.value.args[0]['changed'] snapmirror_create.assert_called_with() check_param.assert_called_with()
def test_if_all_methods_catch_exception(self): data = self.set_default_args() data['source_hostname'] = '10.10.10.10' data['source_volume'] = 'ansible' data['destination_volume'] = 'ansible2' set_module_args(data) my_obj = my_module() if not self.onbox: my_obj.server = MockONTAPConnection('snapmirror_fail') with pytest.raises(AnsibleFailJson) as exc: my_obj.snapmirror_get() assert 'Error fetching snapmirror info: ' in exc.value.args[0]['msg'] with pytest.raises(AnsibleFailJson) as exc: my_obj.snapmirror_abort() assert 'Error aborting SnapMirror relationship :' in exc.value.args[0][ 'msg'] with pytest.raises(AnsibleFailJson) as exc: my_obj.snapmirror_break() assert 'Error breaking SnapMirror relationship :' in exc.value.args[0][ 'msg'] with pytest.raises(AnsibleFailJson) as exc: my_obj.snapmirror_get = Mock( return_value={'mirror_state': 'transferring'}) my_obj.snapmirror_initialize() assert 'Error initializing SnapMirror :' in exc.value.args[0]['msg'] with pytest.raises(AnsibleFailJson) as exc: my_obj.snapmirror_update() assert 'Error updating SnapMirror :' in exc.value.args[0]['msg'] with pytest.raises(AnsibleFailJson) as exc: my_obj.set_source_cluster_connection = Mock(return_value=True) my_obj.source_server = MockONTAPConnection('snapmirror_fail') my_obj.check_if_remote_volume_exists() assert 'Error fetching source volume details' in exc.value.args[0][ 'msg'] with pytest.raises(AnsibleFailJson) as exc: my_obj.check_if_remote_volume_exists = Mock(return_value=True) my_obj.source_server = MockONTAPConnection() my_obj.snapmirror_create() assert 'Error creating SnapMirror ' in exc.value.args[0]['msg'] with pytest.raises(AnsibleFailJson) as exc: my_obj.snapmirror_quiesce() assert 'Error Quiescing SnapMirror :' in exc.value.args[0]['msg'] with pytest.raises(AnsibleFailJson) as exc: my_obj.snapmirror_quiesce = Mock(return_value=None) my_obj.get_destination = Mock(return_value=None) my_obj.snapmirror_break = Mock(return_value=None) my_obj.delete_snapmirror(False, 'data_protection', None) assert 'Error deleting SnapMirror :' in exc.value.args[0]['msg'] with pytest.raises(AnsibleFailJson) as exc: my_obj.snapmirror_modify({ 'policy': 'ansible2', 'schedule': 'abc2' }) assert 'Error modifying SnapMirror schedule or policy :' in exc.value.args[ 0]['msg']
def test_invalid_schedule_count_is_none(self): ''' validate error when schedule is None ''' data = self.set_default_args() data['schedule'] = None data['count'] = None set_module_args(data) my_obj = my_module() my_obj.asup_log_for_cserver = Mock(return_value=None) if not self.onbox: my_obj.server = self.server with pytest.raises(AnsibleFailJson) as exc: my_obj.create_snapshot_policy() msg = 'Error: A Snapshot policy must have at least 1 ' \ 'schedule and can have up to a maximum of 5 schedules, with a count ' \ 'representing the maximum number of Snapshot copies for each schedule' assert exc.value.args[0]['msg'] == msg
def test_firmware_download_no_num_error(self): ''' Test firmware download ''' module_args = {} module_args.update(self.set_default_args()) module_args.update({'package_url': 'dummy_url'}) set_module_args(module_args) my_obj = my_module() my_obj.autosupport_log = Mock(return_value=None) if not self.use_vsim: my_obj.server = MockONTAPConnection('firmware_download_exception', 'some error string', 'whatever') with pytest.raises(AnsibleFailJson) as exc: my_obj.apply() msg = "NetApp API failed. Reason - some error string:whatever" assert msg in exc.value.args[0]['msg']