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_quiesce = Mock(return_value=None) 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('data_protection') 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 = 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_successful_rest_create(self, mock_request): ''' creating snapmirror and testing idempotency ''' data = self.set_default_args() data.pop('relationship_type') data['initialize'] = False # the first get fails, as we pretend the relationship does not exist set_module_args(data) mock_request.side_effect = [ SRR['is_rest'], # REST support SRR['empty_good'], # POST SRR['end_of_sequence'] ] 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:ansible'}, 'policy': 'ansible'}) # Idempotency, relationship already exists # to reset na_helper from remembering the previous 'changed' value data = self.set_default_args() data['update'] = False set_module_args(data) mock_request.side_effect = [ SRR['is_rest'], # REST support SRR['end_of_sequence'] ] 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_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_ensure_apply_for_cluster_called(self, get_cl_id): ''' creating cluster and checking idempotency ''' 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') 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 get_ucadapter_mock_object(self, kind=None, data=None): """ Helper method to return an na_ontap_unix_user object :param kind: passes this param to MockONTAPConnection() :return: na_ontap_unix_user object """ obj = ucadapter_module() obj.autosupport_log = Mock(return_value=None) params = self.mock_ucadapter if data is not None: for k, v in data.items(): params[k] = v obj.server = MockONTAPConnection(kind=kind, data=params) return obj
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 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_snapmirror_resume(self, snapmirror_resume): ''' resuming snapmirror ''' 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='quiesced', parm='snapmirrored') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert exc.value.args[0]['changed'] snapmirror_resume.assert_called_with()
def test_cluster_join_called(self, cluster_join): ''' creating cluster_join''' data = self.set_default_args() del data['cluster_name'] data['cluster_ip_address'] = '10.10.10.10' set_module_args(data) my_obj = my_module() my_obj.autosupport_log = Mock(return_value=None) if not self.use_vsim: my_obj.server = MockONTAPConnection('cluster_add') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() print('Info: test_cluster_apply: %s' % repr(exc.value)) cluster_join.assert_called_with()
def test_cluster_create_old_api(self, get_cl_id, sleep_mock): ''' 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 get_snaplock_mock_object(self, kind=None): """ Helper method to return an na_ontap_volume_snaplock object :param kind: passes this param to MockONTAPConnection() :return: na_ontap_volume_snaplock object """ snaplock_obj = snaplock_module() netapp_utils.ems_log_event = Mock(return_value=None) if kind is None: snaplock_obj.server = MockONTAPConnection() else: snaplock_obj.server = MockONTAPConnection(kind=kind, data=self.mock_snaplock) return snaplock_obj
def test_successful_create_with_rest(self, snapmirror_create_policy): ''' creating snapmirror_policy and testing idempotency ''' data = self.set_default_args() data['use_rest'] = 'Always' 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=None) 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='Never') data['use_rest'] = 'Always' 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 not exc.value.args[0]['changed']
def test_successful_enable_policy(self, modify_snapshot): ''' enabling snapshot policy and testing idempotency ''' data = self.set_default_args() data['enabled'] = 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 = MockONTAPConnection('snapshot_policy_info_policy_disabled') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert exc.value.args[0]['changed'] current = self.set_default_current() current['enabled'] = False 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('policy') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert not exc.value.args[0]['changed']
def test_successful_modify_schedules(self, modify_snapshot): ''' modifying snapshot policy schedule counts and testing idempotency ''' data = self.set_default_args() data['schedule'] = ['hourly', 'daily', 'weekly'] data['count'] = [10, 50, 100] 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_modified_schedule_counts') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert not exc.value.args[0]['changed']
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_net_route_mock_object(self, kind=None, data=None, type='zapi'): """ Helper method to return an na_ontap_net_route object :param kind: passes this param to MockONTAPConnection() :param data: passes this data to MockONTAPConnection() :param type: differentiates zapi and rest procedure :return: na_ontap_net_route object """ net_route_obj = net_route_module() if type == 'zapi': net_route_obj.ems_log_event = Mock(return_value=None) net_route_obj.cluster = Mock() net_route_obj.cluster.invoke_successfully = Mock() if kind is None: net_route_obj.server = MockONTAPConnection() else: if data is None: net_route_obj.server = MockONTAPConnection( kind='net_route', data=self.mock_net_route) else: net_route_obj.server = MockONTAPConnection( kind='net_route', data=data) return net_route_obj
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', None) # 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_successful_initialize(self, snapmirror_initialize): ''' initialize snapmirror and testing idempotency ''' 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='uninitialized') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert exc.value.args[0]['changed'] snapmirror_initialize.assert_called_with() # to reset na_helper from remembering the previous 'changed' value data = self.set_default_args() data['update'] = 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('snapmirror', status='idle', parm='snapmirrored') with pytest.raises(AnsibleExitJson) as exc: my_obj.apply() assert not exc.value.args[0]['changed']
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_failure_break(self): ''' breaking snapmirror to test quiesce time-delay failure ''' data = self.set_default_args() data['relationship_state'] = 'broken' 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', 'snapmirrored', status='idle', quiesce_status='InProgress') with pytest.raises(AnsibleFailJson) as exc: # 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_delete_check_get_destination(self): ''' check required parameter source cluster hostname deleting snapmirror''' 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) if not self.onbox: my_obj.server = MockONTAPConnection('snapmirror', status='idle') my_obj.source_server = MockONTAPConnection('snapmirror', status='idle') res = my_obj.get_destination() assert res is True
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['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_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 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_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_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_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_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