fix(region): cloudflare lb backend operation (#22996)

This commit is contained in:
屈轩
2025-07-30 19:02:30 +08:00
committed by GitHub
parent 1012991176
commit 0970725598
10 changed files with 89 additions and 48 deletions
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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=
+1 -1
View File
@@ -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)
}
+14 -7
View File
@@ -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) {
+10
View File
@@ -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
}
+49 -31
View File
@@ -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)
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -18,6 +18,7 @@ type SLoadbalancerBackend struct {
Index int
Weight int
Port int
Enabled bool
Id string
Name string
ExternalId string