diff --git a/pkg/baremetal/handler/handlers.go b/pkg/baremetal/handler/handlers.go index 06a940b626..f2370993d9 100644 --- a/pkg/baremetal/handler/handlers.go +++ b/pkg/baremetal/handler/handlers.go @@ -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 { diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index b4e313adba..77b9252f10 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -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,