fix: host jnlp request fail for idrac9

This commit is contained in:
Qiu Jian
2020-04-13 00:13:20 +08:00
parent 35e6f3992a
commit 4fc343f577
2 changed files with 23 additions and 32 deletions
+18
View File
@@ -21,6 +21,7 @@ import (
"yunion.io/x/jsonutils"
"yunion.io/x/log"
"yunion.io/x/pkg/errors"
"yunion.io/x/onecloud/pkg/appsrv"
"yunion.io/x/onecloud/pkg/baremetal"
@@ -71,6 +72,7 @@ func initBaremetalsHandler(app *appsrv.Application) {
AddHandler(app, "POST", bmActionPrefix("reset-bmc"), bmObjMiddleware(handleBaremetalResetBMC))
AddHandler(app, "POST", bmActionPrefix("ipmi-probe"), bmObjMiddleware(handleBaremetalIpmiProbe))
AddHandler(app, "POST", bmActionPrefix("cdrom"), bmObjMiddleware(handleBaremetalCdromTask))
AddHandler(app, "POST", bmActionPrefix("jnlp"), bmObjMiddleware(handleBaremetalJnlpTask))
// server actions handler
AddHandler(app, "POST", srvActionPrefix("create"), srvClassMiddleware(handleServerCreate))
@@ -160,6 +162,22 @@ func handleBaremetalCdromTask(ctx *Context, bm *baremetal.SBaremetalInstance) {
ctx.ResponseOk()
}
func handleBaremetalJnlpTask(ctx *Context, bm *baremetal.SBaremetalInstance) {
cli := bm.GetRedfishCli(ctx)
if cli == nil {
ctx.ResponseError(httperrors.NewNotSupportedError("Redfish API"))
return
}
jnlp, err := cli.GetConsoleJNLP(ctx)
if err != nil {
ctx.ResponseError(errors.Wrap(err, "GetConsoleJNLP"))
return
}
result := jsonutils.NewDict()
result.Add(jsonutils.NewString(jnlp), "jnlp")
ctx.ResponseJson(result)
}
func handleServerCreate(ctx *Context, bm *baremetal.SBaremetalInstance) {
err := bm.StartServerCreateTask(ctx.UserCred(), ctx.TaskId(), ctx.Data())
if err != nil {
+5 -32
View File
@@ -53,7 +53,6 @@ import (
"yunion.io/x/onecloud/pkg/mcclient/modules"
"yunion.io/x/onecloud/pkg/util/httputils"
"yunion.io/x/onecloud/pkg/util/logclient"
"yunion.io/x/onecloud/pkg/util/redfish/bmconsole"
)
type SHostManager struct {
@@ -4615,39 +4614,13 @@ func (self *SHost) AllowGetDetailsJnlp(ctx context.Context, userCred mcclient.To
}
func (self *SHost) GetDetailsJnlp(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (jsonutils.JSONObject, error) {
ipmi, err := self.GetIpmiInfo()
url := fmt.Sprintf("/baremetals/%s/jnlp", self.Id)
header := mcclient.GetTokenHeaders(userCred)
resp, err := self.BaremetalSyncRequest(ctx, "POST", url, header, nil)
if err != nil {
return nil, httperrors.NewInvalidStatusError("no valid ipmi_info")
return nil, errors.Wrap(err, "BaremetalSyncRequest")
}
if !ipmi.Verified {
return nil, httperrors.NewInvalidStatusError("no veried ipmi_info")
}
if self.SysInfo == nil {
return nil, httperrors.NewInvalidStatusError("no valid sys_info")
}
ipmiPass, err := utils.DescryptAESBase64(self.Id, ipmi.Password)
if err != nil {
return nil, httperrors.NewInternalServerError("decrypt ipmi password fail: %s", err)
}
bmc := bmconsole.NewBMCConsole(ipmi.IpAddr, ipmi.Username, ipmiPass, false)
manufacture, _ := self.SysInfo.GetString("manufacture")
var jnlp string
switch strings.ToLower(manufacture) {
case "hp", "hpe":
jnlp, err = bmc.GetIloConsoleJNLP(ctx)
case "dell", "dell inc.":
sku, _ := self.SysInfo.GetString("sku")
model, _ := self.SysInfo.GetString("model")
jnlp, err = bmc.GetIdracConsoleJNLP(ctx, sku, model)
default:
return nil, httperrors.NewNotImplementedError("Unsupported manufacture %s", manufacture)
}
if err != nil {
return nil, httperrors.NewGeneralError(err)
}
ret := jsonutils.NewDict()
ret.Add(jsonutils.NewString(jnlp), "jnlp")
return ret, nil
return resp, nil
}
func (self *SHost) AllowPerformInsertIso(ctx context.Context,