예제 #1
0
    def __get_snapshot_by_name(self, resource, data):
        if 'name' not in data['snapshotParameters']:
            raise HPOneViewValueError(VOLUME_NO_OPTIONS_PROVIDED)

        result = self.oneview_client.volumes.get_snapshot_by(resource['uri'], 'name',
                                                             data['snapshotParameters']['name'])
        return result[0] if result else None
예제 #2
0
    def __present(self, data):
        resource = self.__get_resource(data)
        changed = False
        msg = ''

        if not resource:
            if 'credentials' not in data:
                raise HPOneViewValueError(STORAGE_SYSTEM_CREDENTIALS_MANDATORY)
            resource = self.oneview_client.storage_systems.add(
                data['credentials'])
            changed = True
            msg = STORAGE_SYSTEM_ADDED

        merged_data = resource.copy()
        merged_data.update(data)

        if 'credentials' in merged_data and 'password' in merged_data[
                'credentials']:
            # remove password, it cannot be used in comparison
            del merged_data['credentials']['password']

        if not resource_compare(resource, merged_data):
            # update the resource
            resource = self.oneview_client.storage_systems.update(merged_data)
            if not changed:
                changed = True
                msg = STORAGE_SYSTEM_UPDATED
        else:
            msg = STORAGE_SYSTEM_ALREADY_UPDATED

        return changed, msg, dict(storage_system=resource)
예제 #3
0
    def run(self):
        try:
            state = self.module.params['state']
            data = self.module.params['data']
            changed, msg, ansible_facts = False, '', {}

            if not self.module.params.get('validate_etag'):
                self.oneview_client.connection.disable_etag_validation()

            if not data.get('name'):
                raise HPOneViewValueError(STORAGE_VOLUME_TEMPLATE_MANDATORY_FIELD_MISSING)

            resource = (self.oneview_client.storage_volume_templates.get_by("name", data['name']) or [None])[0]

            if state == 'present':
                changed, msg, ansible_facts = self.__present(data, resource)
            elif state == 'absent':
                changed, msg, ansible_facts = self.__absent(resource)

            self.module.exit_json(changed=changed,
                                  msg=msg,
                                  ansible_facts=ansible_facts)

        except HPOneViewException as exception:
            self.module.fail_json(msg=exception.args[0])
예제 #4
0
    def test_oneview_value_error_inheritance(self):
        exception = HPOneViewValueError("The given data is empty!")

        self.assertIsInstance(exception, HPOneViewException)
        self.assertEqual(exception.msg, "The given data is empty!")
        self.assertEqual(exception.oneview_response, None)
        self.assertEqual(exception.args[0], "The given data is empty!")
    def __get_specific_attachment(self, params):

        attachment_uri = params.get('storageVolumeAttachmentUri')

        if attachment_uri:
            return [
                self.oneview_client.storage_volume_attachments.get(
                    attachment_uri)
            ]
        else:
            volume_uri = params.get('storageVolumeUri')
            profile_name = params.get('serverProfileName')

            if not profile_name or not (volume_uri
                                        or params.get('storageVolumeName')):
                raise HPOneViewValueError(ATTACHMENT_KEY_REQUIRED)

            if not volume_uri and params.get('storageVolumeName'):
                volumes = self.oneview_client.volumes.get_by(
                    'name', params.get('storageVolumeName'))
                if volumes:
                    volume_uri = volumes[0]['uri']

            uri = self.__search_attachment_uri.format(volume_uri, profile_name)
            attachments = self.oneview_client.storage_volume_attachments.get(
                uri) or {}

            return attachments.get('members')
    def __retrieve_differences(self, data, resource):
        if 'content' not in data:
            raise HPOneViewValueError(PLAN_SCRIPT_CONTENT_ATTRIBUTE_MANDATORY)

        differences = self.i3s_client.plan_scripts.retrieve_differences(
            resource['uri'], data['content'])
        return False, PLAN_SCRIPT_DIFFERENCES_RETRIEVED, dict(
            plan_script_differences=differences)
예제 #7
0
    def __get_resource(self, data):

        if not data.get('name'):
            raise HPOneViewValueError(POWER_DEVICE_MANDATORY_FIELD_MISSING)

        resource = (self.oneview_client.power_devices.get_by(
            "name", data['name']) or [None])[0]
        return resource
예제 #8
0
    def __present(self, data, resource):

        server_template_name = data.pop('server_template', '')
        server_hardware_name = data.pop('server_hardware', '')
        server_template = None
        changed = False
        created = False

        ServerProfileReplaceNamesByUris().replace(self.oneview_client, data)

        if server_hardware_name:
            selected_server_hardware = self.__get_server_hardware_by_name(
                server_hardware_name)
            if not selected_server_hardware:
                raise HPOneViewValueError(
                    HARDWARE_NOT_FOUND.format(server_hardware_name))
            data['serverHardwareUri'] = selected_server_hardware['uri']

        if server_template_name:
            server_template = self.oneview_client.server_profile_templates.get_by_name(
                server_template_name)
            if not server_template:
                raise HPOneViewValueError(
                    TEMPLATE_NOT_FOUND.format(server_template_name))
            data['serverProfileTemplateUri'] = server_template['uri']
        elif data.get('serverProfileTemplateUri'):
            server_template = self.oneview_client.server_profile_templates.get(
                data['serverProfileTemplateUri'])

        if not resource:
            resource = self.__create_profile(data, server_template)
            changed = True
            created = True
            msg = SERVER_PROFILE_CREATED
        else:
            merged_data = ServerProfileMerger().merge_data(resource, data)

            if not resource_compare(resource, merged_data):
                resource = self.__update_server_profile(merged_data)
                changed = True
                msg = SERVER_PROFILE_UPDATED
            else:
                msg = SERVER_ALREADY_UPDATED

        return created, changed, msg, resource
    def __get_drive_enclosure(self, data):
        name = data.get('name')
        if not name:
            raise HPOneViewValueError(DRIVE_ENCLOSURE_NAME_REQUIRED)
        else:
            result = self.oneview_client.drive_enclosures.get_by('name', name)

            if not result:
                raise HPOneViewResourceNotFound(DRIVE_ENCLOSURE_NOT_FOUND)

            return result[0]
예제 #10
0
    def __get_provider_uri_by_display_name(self, data):
        display_name = data.get('providerDisplayName')
        provider_uri = self.oneview_client.san_managers.get_provider_uri(
            display_name)

        if not provider_uri:
            raise HPOneViewValueError(
                SAN_MANAGER_PROVIDER_DISPLAY_NAME_NOT_FOUND.format(
                    display_name))

        return provider_uri
예제 #11
0
    def __compliance(self, data):

        uris = data.get('logicalInterconnectUris')

        if not uris:
            if 'logicalInterconnectNames' not in data:
                raise HPOneViewValueError(SAS_LOGICAL_INTERCONNECT_NO_OPTIONS_PROVIDED)

            uris = self.__resolve_log_interconnect_names(data['logicalInterconnectNames'])

        self.oneview_client.sas_logical_interconnects.update_compliance_all(uris)
        return True, SAS_LOGICAL_INTERCONNECT_CONSISTENT, {}
예제 #12
0
    def __update(self, data, resource):
        if 'newName' in data:
            if self.__get_by_name(data['newName']):
                raise HPOneViewValueError(VOLUME_NEW_NAME_INVALID)
            data['name'] = data.pop('newName')

        merged_data = resource.copy()
        merged_data.update(data)

        updated_volume = self.oneview_client.volumes.update(merged_data)

        self.module.exit_json(changed=True,
                              msg=VOLUME_UPDATED,
                              ansible_facts=dict(storage_volume=updated_volume))
예제 #13
0
    def run(self):
        try:
            state = self.module.params['state']
            data = self.module.params['data']

            if not self.module.params.get('validate_etag'):
                self.oneview_client.connection.disable_etag_validation()

            if state == 'present':
                changed, msg, ansible_facts = self.__present(data)

            else:
                if not data.get('name'):
                    raise HPOneViewValueError(
                        SERVER_HARDWARE_MANDATORY_FIELD_MISSING.format(
                            "data.name"))

                resource = self.__get_server_hardware(data['name'])

                if state == 'absent':
                    changed, msg, ansible_facts = self.__absent(resource)
                else:
                    if not resource:
                        raise HPOneViewResourceNotFound(
                            SERVER_HARDWARE_NOT_FOUND)

                    if state == 'power_state_set':
                        changed, msg, ansible_facts = self.__set_power_state(
                            data, resource)
                    elif state == 'refresh_state_set':
                        changed, msg, ansible_facts = self.__set_refresh_state(
                            data, resource)
                    elif state == 'ilo_firmware_version_updated':
                        changed, msg, ansible_facts = self.__update_mp_firmware_version(
                            resource)
                    elif state == 'environmental_configuration_set':
                        changed, msg, ansible_facts = self.__set_environmental_configuration(
                            data, resource)

                    else:
                        changed, msg, ansible_facts = self.__patch(
                            state, resource)

            self.module.exit_json(changed=changed,
                                  msg=msg,
                                  ansible_facts=ansible_facts)

        except HPOneViewException as exception:
            self.module.fail_json(msg=exception.args[0])
예제 #14
0
    def __get_resource(self, data):
        if 'credentials' in data and data['credentials'].get('ip_hostname'):
            resource = self.oneview_client.storage_systems.get_by_ip_hostname(
                data['credentials']['ip_hostname'])

            if data['credentials'].get('newIp_hostname'):
                data['credentials']['ip_hostname'] = data['credentials'].pop(
                    'newIp_hostname')

            return resource
        elif data.get('name'):
            return self.oneview_client.storage_systems.get_by_name(
                data['name'])
        else:
            raise HPOneViewValueError(STORAGE_SYSTEM_MANDATORY_FIELDS_MISSING)
예제 #15
0
    def __get_interconnect(self):
        interconnect_ip = self.module.params['ip']
        interconnect_name = self.module.params['name']

        if interconnect_ip:
            interconnects = self.oneview_client.interconnects.get_by('interconnectIP', interconnect_ip) or []
        elif interconnect_name:
            interconnects = self.oneview_client.interconnects.get_by('name', interconnect_name) or []
        else:
            raise HPOneViewValueError(MISSING_KEY_MSG)

        if not interconnects:
            raise HPOneViewResourceNotFound(INTERCONNECT_WAS_NOT_FOUND)

        return interconnects[0]
예제 #16
0
    def build_subresource_uri(self, resource_id_or_uri=None, subresource_id_or_uri=None, subresource_path=''):
        if subresource_id_or_uri and "/" in subresource_id_or_uri:
            return subresource_id_or_uri
        else:
            if not resource_id_or_uri:
                raise HPOneViewValueError(RESOURCE_ID_OR_URI_REQUIRED)

            resource_uri = self.build_uri(resource_id_or_uri)

            uri = "{}/{}/{}".format(resource_uri, subresource_path, str(subresource_id_or_uri or ''))
            uri = uri.replace("//", "/")

            if uri.endswith("/"):
                uri = uri[:-1]

            return uri
예제 #17
0
    def __present(self, data):

        if not data.get('hostname'):
            raise HPOneViewValueError(
                SERVER_HARDWARE_MANDATORY_FIELD_MISSING.format(
                    "data.hostname"))

        resource = self.__get_server_hardware(data['hostname'])

        changed = False

        if not resource:
            resource = self.oneview_client.server_hardware.add(data)
            changed = True
            msg = SERVER_HARDWARE_ADDED
        else:
            msg = SERVER_HARDWARE_ALREADY_ADDED

        return changed, msg, dict(server_hardware=resource)
예제 #18
0
    def __update(self, data, resource):
        if 'newName' in data:
            if self.__get_by_name(data['newName']):
                raise HPOneViewValueError(NETWORK_SET_NEW_NAME_INVALID)
            data['name'] = data.pop('newName')

        merged_data = resource.copy()
        merged_data.update(data)

        if resource_compare(resource, merged_data):

            self.module.exit_json(changed=False,
                                  msg=NETWORK_SET_ALREADY_EXIST,
                                  ansible_facts=dict(network_set=resource))

        else:
            updated_network_set = self.oneview_client.network_sets.update(
                merged_data)

            self.module.exit_json(
                changed=True,
                msg=NETWORK_SET_UPDATED,
                ansible_facts=dict(network_set=updated_network_set))
예제 #19
0
    def run(self):
        try:
            state = self.module.params['state']
            data = self.module.params['data']
            changed, msg, ansible_facts = False, '', {}

            if not data.get('poolName'):
                raise HPOneViewValueError(STORAGE_POOL_MANDATORY_FIELD_MISSING)

            resource = (self.oneview_client.storage_pools.get_by(
                "name", data['poolName']) or [None])[0]

            if state == 'present':
                changed, msg, ansible_facts = self.__present(data, resource)
            elif state == 'absent':
                changed, msg, ansible_facts = self.__absent(resource)

            self.module.exit_json(changed=changed,
                                  msg=msg,
                                  ansible_facts=ansible_facts)

        except HPOneViewException as exception:
            self.module.fail_json(msg=exception.args[0])
예제 #20
0
    def run(self):
        try:
            state = self.module.params['state']
            data = self.module.params['data']
            changed, msg, ansible_facts = False, '', {}

            if not data.get('name'):
                raise HPOneViewValueError(
                    CONNECTION_TEMPLATE_MANDATORY_FIELD_MISSING)

            resource = (self.oneview_client.connection_templates.get_by(
                "name", data['name']) or [None])[0]

            if state == 'present':
                changed, msg, ansible_facts = self.__present(data, resource)

            self.module.exit_json(changed=changed,
                                  msg=msg,
                                  ansible_facts=ansible_facts)

        except HPOneViewException as exception:
            self.module.fail_json(msg='; '.join(
                str(e) for e in exception.args))
    def __present(self, data, resource):

        changed = False
        msg = ''

        if "newName" in data:
            data["name"] = data.pop("newName")

        self.__replace_name_by_uris(data)
        self.__check_present_consistency(data)

        file_path = data.pop('localImageFilePath', None)

        if not resource:
            if data.get('osVolumeURI'):
                resource = self.i3s_client.golden_images.create(data)
                msg = GOLDEN_IMAGE_CREATED
                changed = True
            elif file_path:
                resource = self.i3s_client.golden_images.upload(file_path, data)
                msg = GOLDEN_IMAGE_UPLOADED
                changed = True
            else:
                raise HPOneViewValueError(I3S_MISSING_MANDATORY_ATTRIBUTES)
        else:
            merged_data = resource.copy()
            merged_data.update(data)

            if not resource_compare(resource, merged_data):
                # update resource
                resource = self.i3s_client.golden_images.update(merged_data)
                changed = True
                msg = GOLDEN_IMAGE_UPDATED
            else:
                msg = GOLDEN_IMAGE_ALREADY_UPDATED

        return changed, msg, dict(golden_image=resource)
예제 #22
0
 def __validate_key(self, data):
     if 'name' not in data:
         raise HPOneViewValueError(UPLINK_SET_KEY_REQUIRED)
     if 'logicalInterconnectUri' not in data and 'logicalInterconnectName' not in data:
         raise HPOneViewValueError(UPLINK_SET_KEY_REQUIRED)
 def __check_present_consistency(self, data):
     if data.get('osVolumeURI') and data.get('localImageFilePath'):
         raise HPOneViewValueError(I3S_CANT_CREATE_AND_UPLOAD)
예제 #24
0
 def __validate_settings(self, data):
     if 'ethernetSettings' not in data and 'fcoeSettings' not in data:
         raise HPOneViewValueError(LOGICAL_INTERCONNECT_NO_OPTIONS_PROVIDED)
예제 #25
0
 def __validate_options(self, subresource_type, data):
     if subresource_type not in data:
         raise HPOneViewValueError(LOGICAL_INTERCONNECT_NO_OPTIONS_PROVIDED)