mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-19 02:37:24 +08:00
fix(region): cloudflare lb backend operation (#22996)
This commit is contained in:
@@ -96,7 +96,7 @@ require (
|
||||
k8s.io/cri-api v0.22.17
|
||||
k8s.io/klog/v2 v2.20.0
|
||||
moul.io/http2curl/v2 v2.3.0
|
||||
yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250730063007-41803e85d5d3
|
||||
yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250730103446-8b50657aec9f
|
||||
yunion.io/x/executor v0.0.0-20250518005516-5402e9e0bed0
|
||||
yunion.io/x/jsonutils v1.0.1-0.20250507052344-1abcf4f443b1
|
||||
yunion.io/x/log v1.0.1-0.20240305175729-7cf2d6cd5a91
|
||||
|
||||
@@ -1408,8 +1408,8 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK
|
||||
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
|
||||
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
|
||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
||||
yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250730063007-41803e85d5d3 h1:UOvsicDRvf12FrHCboUeikDYvbXjBZXhyJp0AmEPDTg=
|
||||
yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250730063007-41803e85d5d3/go.mod h1:FXxAEbdNfWXX9gjME3K2nJhkydHY5EKEUZb+RLEzVwQ=
|
||||
yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250730103446-8b50657aec9f h1:dSJnDY8bp5wDt3egbszpWtipjGTacjHDsI7p3xi3bg4=
|
||||
yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250730103446-8b50657aec9f/go.mod h1:FXxAEbdNfWXX9gjME3K2nJhkydHY5EKEUZb+RLEzVwQ=
|
||||
yunion.io/x/executor v0.0.0-20250518005516-5402e9e0bed0 h1:msG4SiDSVU7CrXH06WuHlNEZXIooTcmNbfrIGHuIHBU=
|
||||
yunion.io/x/executor v0.0.0-20250518005516-5402e9e0bed0/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws=
|
||||
yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634=
|
||||
|
||||
@@ -384,7 +384,7 @@ const (
|
||||
LB_BACKEND_GUEST = compute.LB_BACKEND_GUEST
|
||||
LB_BACKEND_HOST = compute.LB_BACKEND_HOST
|
||||
LB_BACKEND_IP = compute.LB_BACKEND_IP
|
||||
LB_BACKEND_ADDRESS = "address"
|
||||
LB_BACKEND_ADDRESS = compute.LB_BACKEND_ADDRESS
|
||||
)
|
||||
|
||||
var LB_BACKEND_TYPES = []string{
|
||||
|
||||
@@ -279,10 +279,11 @@ func (man *SLoadbalancerBackendGroupManager) ValidateCreateData(ctx context.Cont
|
||||
input.Backends[i].ExternalId = host.ExternalId
|
||||
input.Backends[i].Address = host.AccessIp
|
||||
backendRegion, _ = host.GetRegion()
|
||||
case api.LB_BACKEND_ADDRESS:
|
||||
default:
|
||||
return nil, httperrors.NewInputParameterError("unexpected backend type %s", input.Backends[i].BackendType)
|
||||
}
|
||||
if lbIsManaged && backendRegion.Id != region.Id {
|
||||
if lbIsManaged && backendRegion != nil && backendRegion.Id != region.Id {
|
||||
return nil, httperrors.NewInputParameterError("region of backend %d does not match that of lb's", i)
|
||||
}
|
||||
}
|
||||
@@ -500,9 +501,12 @@ func (lbbg *SLoadbalancerBackendGroup) PostCreate(ctx context.Context, userCred
|
||||
Address: input.Backends[i].Address,
|
||||
Port: input.Backends[i].Port,
|
||||
}
|
||||
backend.Name = input.Backends[i].Name
|
||||
backend.BackendGroupId = lbbg.Id
|
||||
backend.Status = api.LB_STATUS_ENABLED
|
||||
backend.Name = fmt.Sprintf("%s-%s-%s", lbbg.Name, backend.BackendType, backend.Name)
|
||||
if backend.BackendType == api.LB_BACKEND_GUEST {
|
||||
backend.Name = fmt.Sprintf("%s-%s-%s", lbbg.Name, backend.BackendType, backend.Name)
|
||||
}
|
||||
backend.SetModelManager(LoadbalancerBackendManager, backend)
|
||||
LoadbalancerBackendManager.TableSpec().Insert(ctx, backend)
|
||||
}
|
||||
|
||||
@@ -277,7 +277,7 @@ func (man *SLoadbalancerBackendManager) ValidateCreateData(ctx context.Context,
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "GetLoadbalancer")
|
||||
}
|
||||
if len(input.BackendId) == 0 {
|
||||
if len(input.BackendId) == 0 && input.BackendType != api.LB_BACKEND_ADDRESS {
|
||||
return nil, httperrors.NewMissingParameterError("backend_id")
|
||||
}
|
||||
region, err := lb.GetRegion()
|
||||
@@ -348,6 +348,11 @@ func (man *SLoadbalancerBackendManager) ValidateCreateData(ctx context.Context,
|
||||
}
|
||||
input.Address = input.BackendId
|
||||
baseName = input.Address
|
||||
|
||||
case api.LB_BACKEND_ADDRESS:
|
||||
if len(input.Address) == 0 {
|
||||
return nil, httperrors.NewMissingParameterError("address")
|
||||
}
|
||||
default:
|
||||
return input, httperrors.NewInputParameterError("invalid backend_type %s", input.BackendType)
|
||||
}
|
||||
@@ -420,20 +425,22 @@ func (lbb *SLoadbalancerBackend) ValidateUpdateData(ctx context.Context, userCre
|
||||
|
||||
func (lbb *SLoadbalancerBackend) PostUpdate(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) {
|
||||
lbb.SStatusStandaloneResourceBase.PostUpdate(ctx, userCred, query, data)
|
||||
if data.Contains("port") || data.Contains("weight") {
|
||||
lbb.StartLoadBalancerBackendSyncTask(ctx, userCred, "")
|
||||
if data.Contains("port") || data.Contains("weight") || data.Contains("enabled") {
|
||||
params := data.(*jsonutils.JSONDict)
|
||||
if !params.Contains("enabled") {
|
||||
params.Add(jsonutils.NewBool(lbb.Status == api.LB_STATUS_ENABLED), "enabled")
|
||||
}
|
||||
lbb.StartLoadBalancerBackendSyncTask(ctx, userCred, params, "")
|
||||
}
|
||||
}
|
||||
|
||||
func (lbb *SLoadbalancerBackend) StartLoadBalancerBackendSyncTask(ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string) error {
|
||||
params := jsonutils.NewDict()
|
||||
func (lbb *SLoadbalancerBackend) StartLoadBalancerBackendSyncTask(ctx context.Context, userCred mcclient.TokenCredential, params *jsonutils.JSONDict, parentTaskId string) error {
|
||||
lbb.SetStatus(ctx, userCred, api.LB_SYNC_CONF, "")
|
||||
task, err := taskman.TaskManager.NewTask(ctx, "LoadbalancerBackendSyncTask", lbb, userCred, params, parentTaskId, "", nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
task.ScheduleRun(nil)
|
||||
return nil
|
||||
return task.ScheduleRun(nil)
|
||||
}
|
||||
|
||||
func (lbb *SLoadbalancerBackend) PostCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) {
|
||||
|
||||
@@ -19,6 +19,7 @@ import (
|
||||
|
||||
api "yunion.io/x/onecloud/pkg/apis/compute"
|
||||
"yunion.io/x/onecloud/pkg/compute/models"
|
||||
"yunion.io/x/onecloud/pkg/httperrors"
|
||||
"yunion.io/x/onecloud/pkg/mcclient"
|
||||
)
|
||||
|
||||
@@ -42,3 +43,12 @@ func (self *SCloudflareRegionDriver) IsSupportLoadbalancerListenerRuleRedirect()
|
||||
func (self *SCloudflareRegionDriver) ValidateCreateLoadbalancerListenerRuleData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, input *api.LoadbalancerListenerRuleCreateInput) (*api.LoadbalancerListenerRuleCreateInput, error) {
|
||||
return input, nil
|
||||
}
|
||||
|
||||
func (self *SCloudflareRegionDriver) ValidateCreateLoadbalancerBackendData(ctx context.Context, userCred mcclient.TokenCredential,
|
||||
lb *models.SLoadbalancer, lbbg *models.SLoadbalancerBackendGroup,
|
||||
input *api.LoadbalancerBackendCreateInput) (*api.LoadbalancerBackendCreateInput, error) {
|
||||
if input.BackendType != api.LB_BACKEND_ADDRESS {
|
||||
return nil, httperrors.NewUnsupportOperationError("internal error: unexpected backend type %s", input.BackendType)
|
||||
}
|
||||
return input, nil
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ func (self *SManagedVirtualizationRegionDriver) ValidateUpdateLoadbalancerBacken
|
||||
|
||||
func (self *SManagedVirtualizationRegionDriver) ValidateCreateLoadbalancerBackendGroupData(ctx context.Context, userCred mcclient.TokenCredential, lb *models.SLoadbalancer, input *api.LoadbalancerBackendGroupCreateInput) (*api.LoadbalancerBackendGroupCreateInput, error) {
|
||||
for _, backend := range input.Backends {
|
||||
if len(backend.ExternalId) == 0 {
|
||||
if len(backend.ExternalId) == 0 && backend.BackendType == api.LB_BACKEND_GUEST {
|
||||
return nil, httperrors.NewInputParameterError("invalid guest %s", backend.Name)
|
||||
}
|
||||
}
|
||||
@@ -496,6 +496,16 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateLoadbalancerBackend
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "db.SetExternalId")
|
||||
}
|
||||
iBackends, err := iLbbg.GetILoadbalancerBackends()
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "GetILoadBalancerBackends")
|
||||
}
|
||||
for i := 0; i < len(backends) && i < len(iBackends); i++ {
|
||||
db.Update(&backends[i], func() error {
|
||||
backends[i].ExternalId = iBackends[i].GetGlobalId()
|
||||
return nil
|
||||
})
|
||||
}
|
||||
return nil, nil
|
||||
})
|
||||
return nil
|
||||
@@ -566,14 +576,18 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateLoadbalancerBackend
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
guest := lbb.GetGuest()
|
||||
if guest == nil {
|
||||
return nil, fmt.Errorf("failed to find guest for lbb %s", lbb.Name)
|
||||
}
|
||||
opts := &cloudprovider.SLoadbalancerBackend{
|
||||
Weight: lbb.Weight,
|
||||
Port: lbb.Port,
|
||||
Id: guest.ExternalId,
|
||||
Name: lbb.Name,
|
||||
Weight: lbb.Weight,
|
||||
Port: lbb.Port,
|
||||
Address: lbb.Address,
|
||||
}
|
||||
if lbb.BackendType == api.LB_BACKEND_GUEST {
|
||||
guest := lbb.GetGuest()
|
||||
if guest == nil {
|
||||
return nil, fmt.Errorf("failed to find guest for lbb %s", lbb.Name)
|
||||
}
|
||||
opts.ExternalId = guest.ExternalId
|
||||
}
|
||||
iLoadbalancerBackend, err := iLoadbalancerBackendGroup.AddBackendServer(opts)
|
||||
if err != nil {
|
||||
@@ -612,22 +626,27 @@ func (self *SManagedVirtualizationRegionDriver) RequestDeleteLoadbalancerBackend
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
guest := lbb.GetGuest()
|
||||
if guest == nil {
|
||||
log.Warningf("failed to find guest for lbb %s", lbb.Name)
|
||||
return nil, nil
|
||||
}
|
||||
_, err = guest.GetIVM(ctx)
|
||||
if err != nil {
|
||||
if errors.Cause(err) == cloudprovider.ErrNotFound {
|
||||
return nil, nil
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
opts := &cloudprovider.SLoadbalancerBackend{
|
||||
Weight: lbb.Weight,
|
||||
Port: lbb.Port,
|
||||
ExternalId: guest.ExternalId,
|
||||
Name: lbb.Name,
|
||||
Address: lbb.Address,
|
||||
ExternalId: lbb.ExternalId,
|
||||
}
|
||||
if lbb.BackendType == api.LB_BACKEND_GUEST {
|
||||
guest := lbb.GetGuest()
|
||||
if guest == nil {
|
||||
log.Warningf("failed to find guest for lbb %s", lbb.Name)
|
||||
return nil, nil
|
||||
}
|
||||
_, err = guest.GetIVM(ctx)
|
||||
if err != nil {
|
||||
if errors.Cause(err) == cloudprovider.ErrNotFound {
|
||||
return nil, nil
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
opts.ExternalId = guest.ExternalId
|
||||
}
|
||||
return nil, iLoadbalancerBackendGroup.RemoveBackendServer(opts)
|
||||
})
|
||||
@@ -644,22 +663,18 @@ func (self *SManagedVirtualizationRegionDriver) RequestSyncLoadbalancerBackend(c
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
iRegion, err := lb.GetIRegion(ctx)
|
||||
iLb, err := lb.GetILoadbalancer(ctx)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "regionDriver.RequestSyncLoadbalancerBackend.GetIRegion")
|
||||
return nil, errors.Wrap(err, "GetILoadbalancer")
|
||||
}
|
||||
iLoadbalancer, err := iRegion.GetILoadBalancerById(lb.ExternalId)
|
||||
iLoadbalancerBackendGroup, err := iLb.GetILoadBalancerBackendGroupById(lbbg.ExternalId)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "regionDriver.RequestSyncLoadbalancerBackend.GetILoadBalancerById")
|
||||
}
|
||||
iLoadbalancerBackendGroup, err := iLoadbalancer.GetILoadBalancerBackendGroupById(lbbg.ExternalId)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "regionDriver.RequestSyncLoadbalancerBackend.GetILoadBalancerBackendGroupById")
|
||||
return nil, errors.Wrap(err, "GetILoadBalancerBackendGroupById")
|
||||
}
|
||||
|
||||
iBackend, err := iLoadbalancerBackendGroup.GetILoadbalancerBackendById(lbb.ExternalId)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "regionDriver.RequestSyncLoadbalancerBackend.GetILoadbalancerBackendById")
|
||||
return nil, errors.Wrap(err, "GetILoadbalancerBackendById")
|
||||
}
|
||||
|
||||
opts := &cloudprovider.SLoadbalancerBackend{
|
||||
@@ -670,9 +685,12 @@ func (self *SManagedVirtualizationRegionDriver) RequestSyncLoadbalancerBackend(c
|
||||
BackendRole: lbb.BackendRole,
|
||||
Address: lbb.Address,
|
||||
}
|
||||
|
||||
opts.Enabled = jsonutils.QueryBoolean(task.GetParams(), "enabled", true)
|
||||
|
||||
err = iBackend.Update(ctx, opts)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "regionDriver.RequestSyncLoadbalancerBackend.SyncConf")
|
||||
return nil, errors.Wrap(err, "Update")
|
||||
}
|
||||
|
||||
iBackend, err = iLoadbalancerBackendGroup.GetILoadbalancerBackendById(lbb.ExternalId)
|
||||
|
||||
Vendored
+1
-1
@@ -1852,7 +1852,7 @@ sigs.k8s.io/structured-merge-diff/v4/value
|
||||
# sigs.k8s.io/yaml v1.2.0
|
||||
## explicit; go 1.12
|
||||
sigs.k8s.io/yaml
|
||||
# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250730063007-41803e85d5d3
|
||||
# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250730103446-8b50657aec9f
|
||||
## explicit; go 1.21
|
||||
yunion.io/x/cloudmux/pkg/apis
|
||||
yunion.io/x/cloudmux/pkg/apis/billing
|
||||
|
||||
+4
-3
@@ -155,9 +155,10 @@ const (
|
||||
|
||||
// TODO raw type
|
||||
const (
|
||||
LB_BACKEND_GUEST = "guest"
|
||||
LB_BACKEND_HOST = "host"
|
||||
LB_BACKEND_IP = "ip"
|
||||
LB_BACKEND_GUEST = "guest"
|
||||
LB_BACKEND_HOST = "host"
|
||||
LB_BACKEND_IP = "ip"
|
||||
LB_BACKEND_ADDRESS = "address"
|
||||
)
|
||||
|
||||
const (
|
||||
|
||||
+1
@@ -18,6 +18,7 @@ type SLoadbalancerBackend struct {
|
||||
Index int
|
||||
Weight int
|
||||
Port int
|
||||
Enabled bool
|
||||
Id string
|
||||
Name string
|
||||
ExternalId string
|
||||
|
||||
Reference in New Issue
Block a user