class IDRAC::Client
def wait_for_task(task_id)
def wait_for_task(task_id) task = nil begin loop do task_response = authenticated_request(:get, "/redfish/v1/TaskService/Tasks/#{task_id}") case task_response.status # 200-299 when 200..299 task = JSON.parse(task_response.body) if task["TaskState"] != "Running" break end # Extract percentage complete if available percent_complete = nil if task["Oem"] && task["Oem"]["Dell"] && task["Oem"]["Dell"]["PercentComplete"] percent_complete = task["Oem"]["Dell"]["PercentComplete"] debug "Task progress: #{percent_complete}% complete", 1 end debug "Waiting for task to complete...: #{task["TaskState"]} #{task["TaskStatus"]}", 1 sleep 5 else return { status: :failed, error: "Failed to check task status: #{task_response.status} - #{task_response.body}" } end end # Check final task state if task["TaskState"] == "Completed" && task["TaskStatus"] == "OK" debugger return { status: :success } elsif task["SystemConfiguration"] # SystemConfigurationProfile requests yield a 202 with a SystemConfiguration key return task else # For debugging purposes debug task.inspect, 1, :yellow # Extract any messages from the response messages = [] if task["Messages"] && task["Messages"].is_a?(Array) messages = task["Messages"].map { |m| m["Message"] }.compact end return { status: :failed, task_state: task["TaskState"], task_status: task["TaskStatus"], messages: messages, error: messages.first || "Task failed with state: #{task["TaskState"]}" } end rescue => e debugger return { status: :error, error: "Exception monitoring task: #{e.message}" } end end