def test_delete_volume_sync(mock_request): module = MockModule() rest_api = netapp_utils.OntapRestAPI(module) mock_request.side_effect = [SRR['empty_good'], SRR['end_of_sequence']] volume, error = rest_volume.delete_volume(rest_api, 'uuid') assert error is None assert volume == dict()
def test_get_volume_not_found(mock_request): module = MockModule() rest_api = netapp_utils.OntapRestAPI(module) mock_request.side_effect = [SRR['zero_record'], SRR['end_of_sequence']] volume, error = rest_volume.get_volume(rest_api, 'name', 'vserver') assert error is None assert volume is None
def test_get_volumes_none(mock_request): module = MockModule() rest_api = netapp_utils.OntapRestAPI(module) mock_request.side_effect = [SRR['zero_record'], SRR['end_of_sequence']] volumes, error = rest_volume.get_volumes(rest_api) assert error is None assert volumes is None
def test_get_volume_too_many(mock_request): module = MockModule() rest_api = netapp_utils.OntapRestAPI(module) mock_request.side_effect = [ SRR['three_volume_records'], SRR['end_of_sequence'] ] dummy, error = rest_volume.get_volume(rest_api, 'name', 'vserver') expected = "calling: storage/volumes/: unexpected response" assert expected in error
def __init__(self): self.argument_spec = netapp_utils.na_ontap_host_argument_spec() self.argument_spec.update( dict(vserver=dict(required=False, type="str"), )) self.module = AnsibleModule(argument_spec=self.argument_spec) self.na_helper = NetAppModule() self.parameters = self.na_helper.set_parameters(self.module.params) self.rest_api = netapp_utils.OntapRestAPI(self.module) self.log_list = [] self.error_list = [] self.server = None
def test_get_volumes_three(mock_request): module = MockModule() rest_api = netapp_utils.OntapRestAPI(module) mock_request.side_effect = [ SRR['three_volume_records'], SRR['end_of_sequence'] ] volumes, error = rest_volume.get_volumes(rest_api) assert error is None assert volumes == [ SRR['three_volume_records'][1]['records'][x] for x in (0, 1, 2) ]
def setup_rest_application(self): use_application_template = self.na_helper.safe_get(self.parameters, ['san_application_template', 'use_san_application']) rest_api, rest_app = None, None if use_application_template: if self.parameters.get('flexvol_name') is not None: self.module.fail_json(msg="'flexvol_name' option is not supported when san_application_template is present") rest_api = netapp_utils.OntapRestAPI(self.module) name = self.na_helper.safe_get(self.parameters, ['san_application_template', 'name'], allow_sparse_dict=False) rest_app = RestApplication(rest_api, self.parameters['vserver'], name) elif self.parameters.get('flexvol_name') is None: self.module.fail_json(msg="flexvol_name option is required when san_application_template is not present") return rest_api, rest_app
def test_delete_volume_async_bad_url(mock_request): module = MockModule() rest_api = netapp_utils.OntapRestAPI(module) mock_request.side_effect = [SRR['job_bad_url'], SRR['end_of_sequence']] try: response, error = rest_volume.delete_volume(rest_api, 'uuid') except UnboundLocalError: # TODO: DEVOPS-3627 response = None error = 'DEVOPS-3627' # print(mock_request.mock_calls) print(error) print(response)
def test_delete_volume_async(mock_request): module = MockModule() rest_api = netapp_utils.OntapRestAPI(module) mock_request.side_effect = [ copy.deepcopy(SRR['job']), # deepcopy as job is modified in place! SRR['job_status_success'], SRR['end_of_sequence'] ] response, error = rest_volume.delete_volume(rest_api, 'uuid') job = dict(SRR['job'][1]) # deepcopy as job is modified in place! job['job_response'] = SRR['job_status_success'][1]['message'] assert error is None assert response == job
def test_patch_volume_async(mock_request): module = MockModule() rest_api = netapp_utils.OntapRestAPI(module) mock_request.side_effect = [ copy.deepcopy(SRR['job']), # deepcopy as job is modified in place! SRR['job_status_success'], SRR['end_of_sequence'] ] body = dict(a1=1, a2=True, a3='str') response, error = rest_volume.patch_volume(rest_api, 'uuid', body) job = dict(SRR['job'][1]) # deepcopy as job is modified in place! job['job_response'] = SRR['job_status_success'][1]['message'] assert error is None assert response == job expected = call('PATCH', 'storage/volumes/uuid', {'return_timeout': 30}, json=body) assert expected in mock_request.mock_calls
def create_restapi_object(args): module = create_module(args) module.fail_json = fail_json restApi = netapp_utils.OntapRestAPI(module) return restApi
def __init__(self): self.argument_spec = netapp_utils.na_ontap_host_argument_spec() self.argument_spec.update( dict( state=dict(required=False, type='str', choices=['present', 'absent'], default='present'), origin_volume=dict(required=False, type='str'), # origins[0] origin_vserver=dict(required=False, type='str'), # origins[0] origin_cluster=dict(required=False, type='str'), # origins[0] auto_provision_as=dict(required=False, type='str'), # ignored with REST name=dict(required=True, type='str', aliases=['volume']), junction_path=dict(required=False, type='str', aliases=['path']), size=dict(required=False, type='int'), size_unit=dict(default='gb', choices=[ 'bytes', 'b', 'kb', 'mb', 'gb', 'tb', 'pb', 'eb', 'zb', 'yb' ], type='str'), vserver=dict(required=True, type='str'), aggr_list=dict(required=False, type='list', elements='str', aliases=['aggregates']), aggr_list_multiplier=dict( required=False, type='int', aliases=['constituents_per_aggregate']), force_offline=dict(required=False, type='bool', default=False), force_unmount=dict(required=False, type='bool', default=False), time_out=dict(required=False, type='int', default=180), prepopulate=dict(required=False, type='dict', options=dict( dir_paths=dict(required=True, type='list', elements='str'), exclude_dir_paths=dict(required=False, type='list', elements='str'), recurse=dict(required=False, type='bool'), force_prepopulate_if_already_created=dict( required=False, type='bool', default=True), )))) self.module = AnsibleModule(argument_spec=self.argument_spec, mutually_exclusive=[ ('aggr_list', 'auto_provision_as'), ], supports_check_mode=True) self.na_helper = NetAppModule(self.module) self.parameters = self.na_helper.set_parameters(self.module.params) if self.parameters.get('size'): self.parameters['size'] = self.parameters['size'] * \ netapp_utils.POW2_BYTE_MAP[self.parameters['size_unit']] # setup later if required self.origin_server = None self.rest_api = netapp_utils.OntapRestAPI(self.module) self.use_rest = self.rest_api.is_rest() ontap_98_options = ['prepopulate'] if not self.rest_api.meets_rest_minimum_version( self.use_rest, 9, 8) and any(x in self.parameters for x in ontap_98_options): self.module.fail_json(msg='Error: %s' % self.rest_api.options_require_ontap_version( ontap_98_options, version='9.8')) if 'prepopulate' in self.parameters: # sanitize the dictionary, as Ansible fills everything with None values self.parameters[ 'prepopulate'] = self.na_helper.filter_out_none_entries( self.parameters['prepopulate']) ontap_99_options = ['exclude_dir_paths'] if not self.rest_api.meets_rest_minimum_version( self.use_rest, 9, 9) and any( x in self.parameters['prepopulate'] for x in ontap_99_options): options = ['prepopulate: ' + x for x in ontap_99_options] self.module.fail_json( msg='Error: %s' % self.rest_api.options_require_ontap_version(options, version='9.9')) if not self.parameters['prepopulate']: # remove entry if the dict is empty del self.parameters['prepopulate'] if not self.use_rest: if not netapp_utils.has_netapp_lib(): self.module.fail_json( msg=netapp_utils.netapp_lib_is_required()) else: self.server = netapp_utils.setup_na_ontap_zapi( module=self.module, vserver=self.parameters['vserver'])