def test_copy_image_to_swift(self, LOG_mock, swift_api_mock): # | GIVEN | self.config(swift_ilo_container="ilo_container", group="ilo") self.config(swift_object_expiry_timeout=1, group="ilo") container = CONF.ilo.swift_ilo_container timeout = CONF.ilo.swift_object_expiry_timeout swift_obj_mock = swift_api_mock.return_value destination_object_name = "destination_object_name" source_file_path = "tmp_image_file" object_headers = {"X-Delete-After": str(timeout)} # | WHEN | ilo_common.copy_image_to_swift(source_file_path, destination_object_name) # | THEN | swift_obj_mock.create_object.assert_called_once_with( container, destination_object_name, source_file_path, object_headers=object_headers ) swift_obj_mock.get_temp_url.assert_called_once_with(container, destination_object_name, timeout)
def test_copy_image_to_swift(self, LOG_mock, swift_api_mock): # | GIVEN | self.config(swift_ilo_container='ilo_container', group='ilo') self.config(swift_object_expiry_timeout=1, group='ilo') container = CONF.ilo.swift_ilo_container timeout = CONF.ilo.swift_object_expiry_timeout swift_obj_mock = swift_api_mock.return_value destination_object_name = 'destination_object_name' source_file_path = 'tmp_image_file' object_headers = {'X-Delete-After': timeout} # | WHEN | ilo_common.copy_image_to_swift(source_file_path, destination_object_name) # | THEN | swift_obj_mock.create_object.assert_called_once_with( container, destination_object_name, source_file_path, object_headers=object_headers) swift_obj_mock.get_temp_url.assert_called_once_with( container, destination_object_name, timeout)
def _extract_fw_from_file(node, target_file): """Extracts firmware image file. Extracts the firmware image file thru proliantutils and uploads it to the conductor webserver, if needed. :param node: an Ironic node object. :param target_file: firmware file to be extracted from :returns: tuple of: a) wrapper object of raw firmware image location b) a boolean, depending upon whether the raw firmware file was already in raw format(same file remains, no need to extract) or compact format (thereby extracted and hence different file). If uploaded then, then also its a different file. :raises: ImageUploadFailed, if upload to web server fails. :raises: SwiftOperationError, if upload to Swift fails. :raises: IloOperationError, on failure to process firmware file. """ ilo_object = ilo_common.get_ilo_object(node) try: # Note(deray): Based upon different iLO firmwares, the firmware file # which needs to be updated has to be either an http/https or a simple # file location. If it has to be a http/https location, then conductor # will take care of uploading the firmware file to web server or # swift (providing a temp url). fw_image_location, to_upload, is_extracted = ( proliantutils_utils.process_firmware_image(target_file, ilo_object)) except (proliantutils_error.InvalidInputError, proliantutils_error.ImageExtractionFailed) as proliantutils_exc: operation = _("Firmware file extracting as part of manual cleaning") raise exception.IloOperationError(operation=operation, error=proliantutils_exc) is_different_file = is_extracted fw_image_filename = os.path.basename(fw_image_location) fw_image_location_obj = FirmwareImageLocation(fw_image_location, fw_image_filename) if to_upload: is_different_file = True try: if CONF.ilo.use_web_server_for_images: # upload firmware image file to conductor webserver LOG.debug("For firmware update on node %(node)s, hosting " "firmware file %(firmware_image)s on web server ...", {'firmware_image': fw_image_location, 'node': node.uuid}) fw_image_uploaded_url = ilo_common.copy_image_to_web_server( fw_image_location, fw_image_filename) fw_image_location_obj.fw_image_location = fw_image_uploaded_url fw_image_location_obj.remove = types.MethodType( _remove_webserver_based_me, fw_image_location_obj) else: # upload firmware image file to swift LOG.debug("For firmware update on node %(node)s, hosting " "firmware file %(firmware_image)s on swift ...", {'firmware_image': fw_image_location, 'node': node.uuid}) fw_image_uploaded_url = ilo_common.copy_image_to_swift( fw_image_location, fw_image_filename) fw_image_location_obj.fw_image_location = fw_image_uploaded_url fw_image_location_obj.remove = types.MethodType( _remove_swift_based_me, fw_image_location_obj) finally: if is_extracted: # Note(deray): remove the file `fw_image_location` irrespective # of status of uploading (success or failure) and only if # extracted (and not passed as in plain binary format). If the # file is passed in binary format, then the invoking method # takes care of handling the deletion of the file. ilo_common.remove_single_or_list_of_files(fw_image_location) LOG.debug("For firmware update on node %(node)s, hosting firmware " "file: %(fw_image_location)s ... done. Hosted firmware " "file: %(fw_image_uploaded_url)s", {'fw_image_location': fw_image_location, 'node': node.uuid, 'fw_image_uploaded_url': fw_image_uploaded_url}) else: fw_image_location_obj.remove = types.MethodType( _remove_file_based_me, fw_image_location_obj) return fw_image_location_obj, is_different_file
def _extract_fw_from_file(node, target_file): """Extracts firmware image file. Extracts the firmware image file thru proliantutils and uploads it to the conductor webserver, if needed. :param node: an Ironic node object. :param target_file: firmware file to be extracted from :returns: tuple of: a) wrapper object of raw firmware image location b) a boolean, depending upon whether the raw firmware file was already in raw format(same file remains, no need to extract) or compact format (thereby extracted and hence different file). If uploaded then, then also its a different file. :raises: ImageUploadFailed, if upload to web server fails. :raises: SwiftOperationError, if upload to Swift fails. :raises: IloOperationError, on failure to process firmware file. """ ilo_object = ilo_common.get_ilo_object(node) try: # Note(deray): Based upon different iLO firmwares, the firmware file # which needs to be updated has to be either an http/https or a simple # file location. If it has to be a http/https location, then conductor # will take care of uploading the firmware file to web server or # swift (providing a temp url). fw_image_location, to_upload, is_extracted = ( proliantutils_utils.process_firmware_image(target_file, ilo_object)) except (proliantutils_error.InvalidInputError, proliantutils_error.ImageExtractionFailed) as proliantutils_exc: operation = _("Firmware file extracting as part of manual cleaning") raise exception.IloOperationError(operation=operation, error=proliantutils_exc) is_different_file = is_extracted fw_image_filename = os.path.basename(fw_image_location) fw_image_location_obj = FirmwareImageLocation(fw_image_location, fw_image_filename) if to_upload: is_different_file = True try: if CONF.ilo.use_web_server_for_images: # upload firmware image file to conductor webserver LOG.debug( "For firmware update on node %(node)s, hosting " "firmware file %(firmware_image)s on web server ...", { 'firmware_image': fw_image_location, 'node': node.uuid }) fw_image_uploaded_url = ilo_common.copy_image_to_web_server( fw_image_location, fw_image_filename) fw_image_location_obj.fw_image_location = fw_image_uploaded_url fw_image_location_obj.remove = types.MethodType( _remove_webserver_based_me, fw_image_location_obj) else: # upload firmware image file to swift LOG.debug( "For firmware update on node %(node)s, hosting " "firmware file %(firmware_image)s on swift ...", { 'firmware_image': fw_image_location, 'node': node.uuid }) fw_image_uploaded_url = ilo_common.copy_image_to_swift( fw_image_location, fw_image_filename) fw_image_location_obj.fw_image_location = fw_image_uploaded_url fw_image_location_obj.remove = types.MethodType( _remove_swift_based_me, fw_image_location_obj) finally: if is_extracted: # Note(deray): remove the file `fw_image_location` irrespective # of status of uploading (success or failure) and only if # extracted (and not passed as in plain binary format). If the # file is passed in binary format, then the invoking method # takes care of handling the deletion of the file. ilo_common.remove_single_or_list_of_files(fw_image_location) LOG.debug( "For firmware update on node %(node)s, hosting firmware " "file: %(fw_image_location)s ... done. Hosted firmware " "file: %(fw_image_uploaded_url)s", { 'fw_image_location': fw_image_location, 'node': node.uuid, 'fw_image_uploaded_url': fw_image_uploaded_url }) else: fw_image_location_obj.remove = types.MethodType( _remove_file_based_me, fw_image_location_obj) return fw_image_location_obj, is_different_file