fix: use agent manageruri instance of endpoint to visit agents

This commit is contained in:
Qiu Jian
2019-03-13 11:52:10 +08:00
parent f0f6172156
commit 64bb1b15db
3 changed files with 77 additions and 32 deletions
+21
View File
@@ -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
})
}
+27 -2
View File
@@ -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]
}
+29 -30
View File
@@ -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)