Skip to content

Commit f3e290a

Browse files
Itxakammnelemane
authored andcommitted
- Clean up.
- Store 2 more items in the NodeObject to identify and track the rackscale instances - Rewrite the rest-client queries to protect and log http exceptions - Create several Power management shortcuts for the RedFish client - Create a handler for redfish commands - On power management actions, check for rackscale and execute the actions via rest calls
1 parent 29f7888 commit f3e290a

File tree

3 files changed

+97
-16
lines changed

3 files changed

+97
-16
lines changed

crowbar_framework/app/controllers/intelrsd_controller.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,6 @@ def get_rsd_nodes
109109
@node_object_list
110110
end
111111

112-
def reset_system(sys_id)
113-
post_action("Systems/#{sys_id}", action: "ComputerSystem.Reset")
114-
end
115-
116112
def get_crowbar_node_object(sys_id)
117113
system_object = get_system_data(sys_id)
118114
node_name_prefix = "d"
@@ -126,6 +122,10 @@ def get_crowbar_node_object(sys_id)
126122
node = NodeObject.create_new "#{node_name}.#{Crowbar::Settings.domain}".downcase
127123

128124
node.set["name"] = node_name
125+
# set a flag to identify this node as a rackscale one
126+
node.set["rackscale"] = true
127+
# track the rackscale id for this node
128+
node.set["rackscale_id"] = sys_id
129129
node.set["target_cpu"] = ""
130130
node.set["target_vendor"] = "suse"
131131
node.set["host_cpu"] = ""

crowbar_framework/app/helpers/redfish_helper.rb

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,25 +37,56 @@ def initialize(host, port, insecure = true, client_cert = false)
3737
@service_uri = "https://#{host}:#{port}/#{REDFISH_VERSION}"
3838
@verify_ssl = OpenSSL::SSL::VERIFY_NONE if insecure
3939
@ssl_client_cert = false unless client_cert
40+
@reset_action = "ComputerSystem.Reset".freeze
4041
end
4142

42-
def handle_exception(json_rpc_error)
43-
Rails.logger.error(json_rpc_error[:message])
44-
end
45-
46-
def post_action(resource, action:None, params: None)
43+
def post_action(resource, action = nil, payload = nil)
4744
uri = @service_uri + resource
4845
uri += "/Actions/#{action}" if action
46+
payload = {} unless payload
4947

5048
begin
5149
response = RestClient::Request.execute(url: uri,
5250
method: :post,
51+
payload: payload.to_json,
52+
headers: { content_type: :json },
5353
verify_ssl: @verify_ssl,
5454
ssl_client_cert: @ssl_client_cert)
55-
rescue
56-
handle_exception(response)
55+
JSON.parse(response)
56+
rescue RestClient::ExceptionWithResponse => e
57+
Rails.logger.error("Error while trying to post #{payload} to #{uri}: #{e}")
58+
false
5759
end
58-
JSON.parse(response)
60+
end
61+
62+
def restart(resource)
63+
post_action("Systems/#{resource}",
64+
@reset_action,
65+
"ResetType" => "GracefulRestart")
66+
end
67+
68+
def shutdown(resource)
69+
post_action("Systems/#{resource}",
70+
@reset_action,
71+
"ResetType" => "GracefulShutdown")
72+
end
73+
74+
def poweron(resource)
75+
post_action("Systems/#{resource}",
76+
@reset_action,
77+
"ResetType" => "On")
78+
end
79+
80+
def powercycle(resource)
81+
post_action("Systems/#{resource}",
82+
@reset_action,
83+
"ResetType" => "ForceRestart")
84+
end
85+
86+
def poweroff(resource)
87+
post_action("Systems/#{resource}",
88+
@reset_action,
89+
"ResetType" => "ForceOff")
5990
end
6091

6192
def get_resource(resource)
@@ -67,10 +98,11 @@ def get_resource(resource)
6798
method: :get,
6899
verify_ssl: @verify_ssl,
69100
ssl_client_cert: @ssl_client_cert)
70-
rescue
71-
handle_exception(response)
101+
return JSON.parse(response)
102+
rescue RestClient::ExceptionWithResponse => e
103+
Rails.logger.error(e)
104+
JSON.parse(e.response)
72105
end
73-
JSON.parse(response)
74106
end
75107
end
76108
end

crowbar_framework/app/models/node_object.rb

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1161,6 +1161,43 @@ def bmc_cmd(cmd)
11611161
[200, {}]
11621162
end
11631163

1164+
def redfish_rest_cmd(cmd, rackscale_id)
1165+
host = ENV["CROWBAR_REDFISH_HOST"] || "localhost"
1166+
port = ENV["CROWBAR_REDFISH_PORT"] || "8443"
1167+
redfish_client = RedfishHelper::RedfishClient.new(host, port)
1168+
case cmd
1169+
when :reboot
1170+
unless redfish_client.restart(rackscale_id)
1171+
Rails.logger.warn("rackscale reboot rest cmd failed - node in unknown state")
1172+
[422, I18n.t("unknown_state", scope: "error")]
1173+
end
1174+
when :shutdown
1175+
unless redfish_client.shutdown(rackscale_id)
1176+
Rails.logger.warn("rackscale shutdown rest cmd failed - node in unknown state")
1177+
[422, I18n.t("unknown_state", scope: "error")]
1178+
end
1179+
when :poweron
1180+
unless redfish_client.poweron(rackscale_id)
1181+
Rails.logger.warn("rackscale poweron rest cmd failed - node in unknown state")
1182+
[422, I18n.t("unknown_state", scope: "error")]
1183+
end
1184+
when :powercycle
1185+
unless redfish_client.powercycle(rackscale_id)
1186+
Rails.logger.warn("rackscale powercycle rest cmd failed - node in unknown state")
1187+
[422, I18n.t("unknown_state", scope: "error")]
1188+
end
1189+
when :poweroff
1190+
unless redfish_client.poweroff(rackscale_id)
1191+
Rails.logger.warn("rackscale poweroff rest cmd failed - node in unknown state")
1192+
[422, I18n.t("unknown_state", scope: "error")]
1193+
end
1194+
else
1195+
Rails.logger.warn("Unknown command #{cmd} for #{@node.name}.")
1196+
[400, I18n.t("unknown_cmd", scope: "error", cmd: cmd)]
1197+
end
1198+
[200, {}]
1199+
end
1200+
11641201
def set_state(state)
11651202
# use the real transition function for this
11661203
cb = CrowbarService.new Rails.logger
@@ -1261,6 +1298,8 @@ def reboot
12611298
set_state("reboot")
12621299
if @node[:platform_family] == "windows"
12631300
net_rpc_cmd(:reboot)
1301+
elsif @node["rackscale"]
1302+
redfish_rest_cmd(:reboot, @node["rackscale_id"])
12641303
else
12651304
ssh_cmd("/sbin/reboot")
12661305
end
@@ -1270,20 +1309,28 @@ def shutdown
12701309
set_state("shutdown")
12711310
if @node[:platform_family] == "windows"
12721311
net_rpc_cmd(:shutdown)
1312+
elsif @node["rackscale"]
1313+
redfish_rest_cmd(:shutdown, @node["rackscale_id"])
12731314
else
12741315
ssh_cmd("/sbin/poweroff")
12751316
end
12761317
end
12771318

12781319
def poweron
12791320
set_state("poweron")
1280-
bmc_cmd("power on")
1321+
if @node["rackscale"]
1322+
redfish_rest_cmd(:poweron, @node["rackscale_id"])
1323+
else
1324+
bmc_cmd("power on")
1325+
end
12811326
end
12821327

12831328
def powercycle
12841329
set_state("reboot")
12851330
if @node[:platform_family] == "windows"
12861331
net_rpc_cmd(:power_cycle)
1332+
elsif @node["rackscale"]
1333+
redfish_rest_cmd(:powercycle, @node["rackscale_id"])
12871334
else
12881335
bmc_cmd("power cycle")
12891336
end
@@ -1293,6 +1340,8 @@ def poweroff
12931340
set_state("shutdown")
12941341
if @node[:platform_family] == "windows"
12951342
net_rpc_cmd(:power_off)
1343+
elsif @node["rackscale"]
1344+
redfish_rest_cmd(:poweroff, @node["rackscale_id"])
12961345
else
12971346
bmc_cmd("power off")
12981347
end

0 commit comments

Comments
 (0)