From 1f29f83b97a7a8b25b4940c3226826566e208f56 Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Mon, 23 Sep 2019 11:41:31 +0000 Subject: [PATCH] =?UTF-8?q?lbagents:=20=E7=A6=81=E6=AD=A2=E5=9C=A8?= =?UTF-8?q?=E5=85=AC=E6=9C=89=E4=BA=91=E3=80=81=E6=89=98=E7=AE=A1=E7=89=A9?= =?UTF-8?q?=E7=90=86=E6=9C=BA=E4=B8=8A=E9=83=A8=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/loadbalanceragents_deploy.go | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/pkg/compute/models/loadbalanceragents_deploy.go b/pkg/compute/models/loadbalanceragents_deploy.go index d7abe91bda..2a175cf7e3 100644 --- a/pkg/compute/models/loadbalanceragents_deploy.go +++ b/pkg/compute/models/loadbalanceragents_deploy.go @@ -18,11 +18,14 @@ import ( "context" "path/filepath" "reflect" + "strings" "github.com/pkg/errors" "yunion.io/x/jsonutils" "yunion.io/x/pkg/gotypes" + "yunion.io/x/pkg/util/regutils" + "yunion.io/x/pkg/utils" ansible_apis "yunion.io/x/onecloud/pkg/apis/ansible" compute_apis "yunion.io/x/onecloud/pkg/apis/compute" @@ -252,6 +255,39 @@ func (lbagent *SLoadbalancerAgent) undeploy(ctx context.Context, userCred mcclie return pb, nil } +func (lbagent *SLoadbalancerAgent) validateHost(ctx context.Context, userCred mcclient.TokenCredential, host *ansible.Host) error { + name := strings.TrimSpace(host.Name) + if len(name) == 0 { + return httperrors.NewBadRequestError("empty host name") + } + switch { + case regutils.MatchIP4Addr(name): + case strings.HasPrefix(name, "host:"): + name = strings.TrimSpace(name[len("host:"):]) + obj, err := db.FetchByIdOrName(HostManager, userCred, name) + if err != nil { + return httperrors.NewNotFoundError("find host %s: %v", name, err) + } + host := obj.(*SHost) + if host.IsManaged() { + return httperrors.NewBadRequestError("lbagent cannot be deployed on managed host") + } + case strings.HasPrefix(name, "server:"): + name = name[len("server:"):] + fallthrough + default: + obj, err := db.FetchByIdOrName(GuestManager, userCred, name) + if err != nil { + return httperrors.NewNotFoundError("find guest %s: %v", name, err) + } + guest := obj.(*SGuest) + if utils.IsInStringArray(guest.Hypervisor, compute_apis.PUBLIC_CLOUD_HYPERVISORS) { + return httperrors.NewBadRequestError("lbagent cannot be deployed on public guests") + } + } + return nil +} + func (lbagent *SLoadbalancerAgent) PerformDeploy(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { input := &compute_apis.LoadbalancerAgentDeployInput{} if err := data.Unmarshal(input); err != nil { @@ -275,6 +311,9 @@ func (lbagent *SLoadbalancerAgent) PerformDeploy(ctx context.Context, userCred m return nil, httperrors.NewBadRequestError("user must have system admin privileges") } } + if err := lbagent.validateHost(ctx, userCred, &host); err != nil { + return nil, err + } host.SetVar("region", options.Options.Region) host.SetVar("auth_uri", options.Options.AuthURL) host.SetVar("id", lbagent.Id)