From 64bb1b15db4e6ff7c5afb10059b6bdcbf7b54c10 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Wed, 13 Mar 2019 11:52:10 +0800 Subject: [PATCH] fix: use agent manageruri instance of endpoint to visit agents --- cmd/climc/shell/baremetalagents.go | 21 ++++++++++ pkg/compute/models/baremetalagents.go | 29 ++++++++++++- pkg/compute/models/hosts.go | 59 +++++++++++++-------------- 3 files changed, 77 insertions(+), 32 deletions(-) diff --git a/cmd/climc/shell/baremetalagents.go b/cmd/climc/shell/baremetalagents.go index e5ff84b2cd..94942659d6 100644 --- a/cmd/climc/shell/baremetalagents.go +++ b/cmd/climc/shell/baremetalagents.go @@ -28,4 +28,25 @@ func init() { printList(result, modules.Baremetalagents.GetColumns(s)) return nil }) + + type BaremetalAgentOpsOperations struct { + ID string `help:"ID or name of agent"` + } + R(&BaremetalAgentOpsOperations{}, "baremetal-agent-enable", "Enable baremetal agent", func(s *mcclient.ClientSession, args *BaremetalAgentOpsOperations) error { + result, err := modules.Baremetalagents.PerformAction(s, args.ID, "enable", nil) + if err != nil { + return err + } + printObject(result) + return nil + }) + + R(&BaremetalAgentOpsOperations{}, "baremetal-agent-disable", "Disable baremetal agent", func(s *mcclient.ClientSession, args *BaremetalAgentOpsOperations) error { + result, err := modules.Baremetalagents.PerformAction(s, args.ID, "disable", nil) + if err != nil { + return err + } + printObject(result) + return nil + }) } diff --git a/pkg/compute/models/baremetalagents.go b/pkg/compute/models/baremetalagents.go index 65fcf1c30b..6ed07413b7 100644 --- a/pkg/compute/models/baremetalagents.go +++ b/pkg/compute/models/baremetalagents.go @@ -9,6 +9,8 @@ import ( "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/pkg/util/regutils" + "yunion.io/x/log" + "database/sql" ) const ( @@ -17,9 +19,11 @@ const ( BAREMETAL_AGENT_OFFLINE = "offline" ) +type TAgentType string + const ( - AgentTypeBaremetal = "baremetal" - AgentTypeEsxi = "esxiagent" + AgentTypeBaremetal = TAgentType("baremetal") + AgentTypeEsxi = TAgentType("esxiagent") AgentTypeDefault = AgentTypeBaremetal ) @@ -175,3 +179,24 @@ func (self *SBaremetalagent) GetExtraDetails(ctx context.Context, userCred mccli } return extra, nil } + +func (manager *SBaremetalagentManager) GetAgent(agentType TAgentType, zoneId string) *SBaremetalagent { + q := manager.Query().Equals("agent_type", agentType).Equals("zone_id", zoneId).Asc("created_at") + agents := make([]SBaremetalagent, 0) + err := db.FetchModelObjects(manager, q, &agents) + if err != nil { + if err != sql.ErrNoRows { + log.Errorf("GetAgent query fail %s", err) + } + return nil + } + if len(agents) == 0 { + return nil + } + for i := range agents { + if agents[i].Status == BAREMETAL_AGENT_ENABLED { + return &agents[i] + } + } + return &agents[0] +} \ No newline at end of file diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index ccd1ec1cf6..0933b3cc0d 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -2629,26 +2629,6 @@ func (self *SHost) StartBaremetalUnmaintenanceTask(ctx context.Context, userCred return nil } -func (self *SHost) IsBaremetalAgentReady() bool { - url, err := auth.GetServiceURL("baremetal", options.Options.Region, self.GetZone().GetName(), "") - if err != nil { - log.Errorln("is baremetal agent ready: false") - return false - } - log.Infof("baremetal url:%s", url) - return true -} - -func (self *SHost) BaremetalSyncRequest(ctx context.Context, method httputils.THttpMethod, url string, headers http.Header, body *jsonutils.JSONDict) (jsonutils.JSONObject, error) { - serviceUrl, err := auth.GetServiceURL("baremetal", options.Options.Region, self.GetZone().GetName(), "") - if err != nil { - return nil, err - } - url = serviceUrl + url - _, data, err := httputils.JSONRequest(httputils.GetDefaultClient(), ctx, method, url, headers, body, false) - return data, err -} - func (self *SHost) StartSyncstatus(ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string) error { guest := self.GetBaremetalServer() if guest != nil { @@ -3599,20 +3579,39 @@ func (host *SHost) SyncHostExternalNics(ctx context.Context, userCred mcclient.T // return HostManager.GetEsxiAgentHost(host.Id) // } +func (self *SHost) IsBaremetalAgentReady() bool { + return self.isAgentReady(AgentTypeBaremetal) +} + +func (self *SHost) BaremetalSyncRequest(ctx context.Context, method httputils.THttpMethod, url string, headers http.Header, body *jsonutils.JSONDict) (jsonutils.JSONObject, error) { + return self.doAgentRequest(AgentTypeBaremetal, ctx, method, url, headers, body) +} + func (self *SHost) IsEsxiAgentReady() bool { - url, err := auth.GetServiceURL("esxiagent", options.Options.Region, self.GetZone().GetName(), "") - if err != nil { - log.Errorln("is esxi agent ready: false") - return false - } - log.Infof("esxi agent url:%s", url) - return true + return self.isAgentReady(AgentTypeEsxi) } func (self *SHost) EsxiRequest(ctx context.Context, method httputils.THttpMethod, url string, headers http.Header, body *jsonutils.JSONDict) (jsonutils.JSONObject, error) { - serviceUrl, err := auth.GetServiceURL("esxiagent", options.Options.Region, self.GetZone().GetName(), "") - if err != nil { - return nil, err + return self.doAgentRequest(AgentTypeEsxi, ctx, method, url, headers, body) +} + +func (self *SHost) isAgentReady(agentType TAgentType) bool { + agent := BaremetalagentManager.GetAgent(agentType, self.ZoneId) + if agent == nil { + log.Errorf("%s ready: false", agentType) + return false + } + return true +} + +func (self *SHost) doAgentRequest(agentType TAgentType, ctx context.Context, method httputils.THttpMethod, url string, headers http.Header, body *jsonutils.JSONDict) (jsonutils.JSONObject, error) { + agent := BaremetalagentManager.GetAgent(agentType, self.ZoneId) + if agent == nil { + return nil, fmt.Errorf("no valid %s", agentType) + } + serviceUrl := agent.ManagerUri + if url[0] != '/' && serviceUrl[len(serviceUrl)-1] != '/' { + serviceUrl += "/" } url = serviceUrl + url _, data, err := httputils.JSONRequest(httputils.GetDefaultClient(), ctx, method, url, headers, body, false)