Class: RedfishTools::Servlet

Inherits:
WEBrick::HTTPServlet::AbstractServlet
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/redfish_tools/servlet.rb

Constant Summary collapse

BAD_HEADERS =
Set.new(["connection", "content-length", "keep-alive"])
DEFAULT_HEADERS =
{
  "content-type" => "application/json"
}.freeze
TRANSITIONS =
{
  "PoweringOn"  => {}.freeze,
  "On"          => {
    "GracefulShutdown" => "Off",
    "ForceOff"         => "Off",
    "PushPowerButton"  => "Off",
    "Nmi"              => "Off",
    "GracefulRestart"  => "On",
    "ForceRestart"     => "On",
    "PowerCycle"       => "On",
  }.freeze,
  "PoweringOff" => {}.freeze,
  "Off"         => {
    "On"              => "On",
    "ForceOn"         => "On",
    "PushPowerButton" => "On",
  }.freeze,
}.freeze
TASK_TRANSITIONS =
{
  "New"       => "Starting",
  "Starting"  => "Running",
  "Running"   => "Completed",
  "Completed" => "Completed",
}

Instance Method Summary collapse

Instance Method Details

#do_DELETE(request, response) ⇒ Object



112
113
114
115
116
117
118
# File 'lib/redfish_tools/servlet.rb', line 112

def do_DELETE(request, response)
  item = datastore.get(request.path)
  return response.status = 404 unless item.body

  delete_item(item)
  response.status = 204
end

#do_GET(request, response) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/redfish_tools/servlet.rb', line 54

def do_GET(request, response)
  return response.status = 404 unless datastore.get(request.path).body

  item = datastore.get(request.path)
  response.status = 200

  if request.path.chomp("/").end_with?("monitor") && item.body["TaskState"]
    item.body["TaskState"] = TASK_TRANSITIONS[item.body["TaskState"]]
    response.status = 202
    if item.body["TaskState"] == "Completed"
      response.status = 200
      item.body["EndTime"] = Time.now.utc.iso8601
    end
  end

  set_headers(response, item.headers)
  response.body = item.body.to_json
end

#do_PATCH(request, response) ⇒ Object



101
102
103
104
105
106
107
108
109
110
# File 'lib/redfish_tools/servlet.rb', line 101

def do_PATCH(request, response)
  system = datastore.get(request.path)
  return response.status = 404 unless system.body
  system.body = Utils.combine_hashes(system.body, JSON.parse(request.body))
  response.status = 200
rescue Exceptions::MergeConflict => error
  response.status = 405
  set_headers(response)
  response.body = error_body(error).to_json
end

#do_POST(request, response) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/redfish_tools/servlet.rb', line 73

def do_POST(request, response)
  action = actions[request.path]
  item = datastore.get(request.path)
  return response.status = 404 unless action || item.body
  return response.status = 405 if action.nil? && item.body["Members"].nil?

  data = JSON.parse(request.body)
  if action
    body, headers, status = execute_action(action, data)
  elsif (request.path)
    body, headers, status = (item, data)
  else
    body, headers, status = new_item(item, data)
  end

  response.status = status
  set_headers(response, headers)
  response.body = body.to_json
rescue JSON::ParserError
  response.status = 400
  set_headers(response)
  response.body = error_body("Invalid JSON").to_json
end

#do_PUT(_request, response) ⇒ Object



97
98
99
# File 'lib/redfish_tools/servlet.rb', line 97

def do_PUT(_request, response)
  response.status = 501
end

#service(request, response) ⇒ Object



48
49
50
51
52
# File 'lib/redfish_tools/servlet.rb', line 48

def service(request, response)
  return response.status = 401 unless authorized?(request)

  super
end