module IDRAC::Jobs
def wait_for_job(job_id)
def wait_for_job(job_id) # Job ID can be a job ID, path, or response hash from another request job_path = if job_id.is_a?(Hash) if job_id['headers'] && job_id['headers']['location'] job_id['headers']['location'].sub(/^\/redfish\/v1\//, '') else raise Error, "Invalid job hash, missing location header" end elsif job_id.to_s.start_with?('/redfish/v1/') job_id.sub(/^\/redfish\/v1\//, '') else "Managers/iDRAC.Embedded.1/Jobs/#{job_id}" end puts "Waiting for job to complete: #{job_id}".light_cyan retries = 36 # ~6 minutes with 10s sleep while retries > 0 response = authenticated_request(:get, "/redfish/v1/#{job_path}") if response.status == 200 begin job_data = JSON.parse(response.body) job_state = job_data["JobState"] case job_state when "Completed" puts "Job completed successfully".green puts "CompletionTime: #{job_data['CompletionTime']}".green if job_data['CompletionTime'] return job_data when "Failed" puts "Job failed: #{job_data['Message']}".red puts "CompletionTime: #{job_data['CompletionTime']}".red if job_data['CompletionTime'] raise Error, "Job failed: #{job_data['Message']}" when "CompletedWithErrors" puts "Job completed with errors: #{job_data['Message']}".yellow puts "CompletionTime: #{job_data['CompletionTime']}".yellow if job_data['CompletionTime'] return job_data end puts "Job state: #{job_state}. Waiting...".yellow rescue JSON::ParserError puts "Failed to parse job status response, will retry...".yellow end else puts "Failed to get job status. Status code: #{response.status}".red end retries -= 1 sleep 10 end raise Error, "Timeout waiting for job to complete" end