Example #1
0
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()
Example #2
0
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
Example #3
0
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
Example #4
0
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
Example #5
0
 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
Example #6
0
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
Example #8
0
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)
Example #9
0
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
Example #10
0
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
Example #11
0
def create_restapi_object(args):
    module = create_module(args)
    module.fail_json = fail_json
    restApi = netapp_utils.OntapRestAPI(module)
    return restApi
Example #12
0
    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'])