module IDRAC::VirtualMedia
def insert_virtual_media(iso_url, device: "CD")
def insert_virtual_media(iso_url, device: "CD") raise Error, "Device must be CD or RemovableDisk" unless ["CD", "RemovableDisk"].include?(device) # First eject any inserted media eject_virtual_media(device: device) # Firmware version determines which API to use firmware_version = get_firmware_version.split(".")[0,2].join.to_i puts "Inserting media: #{iso_url}".yellow tries = 0 max_tries = 10 while tries < max_tries begin # Different endpoint based on firmware version path = if firmware_version >= 600 "Systems/System.Embedded.1/VirtualMedia/1/Actions/VirtualMedia.InsertMedia" else "Managers/iDRAC.Embedded.1/VirtualMedia/#{device}/Actions/VirtualMedia.InsertMedia" end response = authenticated_request( :post, "/redfish/v1/#{path}", body: { "Image": iso_url, "Inserted": true, "WriteProtected": true }.to_json, headers: { 'Content-Type': 'application/json' } ) if response.status == 204 || response.status == 200 puts "Inserted media successfully".green return true end # Handle error responses error_message = "Failed to insert media. Status code: #{response.status}" begin error_data = JSON.parse(response.body) if error_data["error"] && error_data["error"]["@Message.ExtendedInfo"] error_info = error_data["error"]["@Message.ExtendedInfo"].first error_message += ", Message: #{error_info['Message']}" end rescue # Ignore JSON parsing errors end puts "#{error_message}. Retrying (#{tries + 1}/#{max_tries})...".red rescue => e puts "Error during insert_virtual_media: #{e.message}. Retrying (#{tries + 1}/#{max_tries})...".red end tries += 1 sleep 60 # Wait before retry end raise Error, "Failed to insert virtual media after #{max_tries} attempts" end