diff --git a/go.mod b/go.mod index 84b9547643..bc15415dc3 100644 --- a/go.mod +++ b/go.mod @@ -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 diff --git a/go.sum b/go.sum index ed98c4f764..bf829bf6a9 100644 --- a/go.sum +++ b/go.sum @@ -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= diff --git a/pkg/apis/compute/loadbalancer_const.go b/pkg/apis/compute/loadbalancer_const.go index 383c056491..8d1e9e3ed1 100644 --- a/pkg/apis/compute/loadbalancer_const.go +++ b/pkg/apis/compute/loadbalancer_const.go @@ -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{ diff --git a/pkg/compute/models/loadbalancerbackendgroups.go b/pkg/compute/models/loadbalancerbackendgroups.go index d4efab2181..bc44e43593 100644 --- a/pkg/compute/models/loadbalancerbackendgroups.go +++ b/pkg/compute/models/loadbalancerbackendgroups.go @@ -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) } diff --git a/pkg/compute/models/loadbalancerbackends.go b/pkg/compute/models/loadbalancerbackends.go index 850c08f524..9c881a4b9a 100644 --- a/pkg/compute/models/loadbalancerbackends.go +++ b/pkg/compute/models/loadbalancerbackends.go @@ -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) { diff --git a/pkg/compute/regiondrivers/cloudflare.go b/pkg/compute/regiondrivers/cloudflare.go index e1a5d064c8..3a9317fb90 100644 --- a/pkg/compute/regiondrivers/cloudflare.go +++ b/pkg/compute/regiondrivers/cloudflare.go @@ -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 +} diff --git a/pkg/compute/regiondrivers/managedvirtual.go b/pkg/compute/regiondrivers/managedvirtual.go index f2ef6ed6f2..b7f074e9c4 100644 --- a/pkg/compute/regiondrivers/managedvirtual.go +++ b/pkg/compute/regiondrivers/managedvirtual.go @@ -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) diff --git a/vendor/modules.txt b/vendor/modules.txt index 8f1da476af..5b29ed9733 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -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 diff --git a/vendor/yunion.io/x/cloudmux/pkg/apis/compute/loadbalancer_const.go b/vendor/yunion.io/x/cloudmux/pkg/apis/compute/loadbalancer_const.go index f8325e1943..35b3eec692 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/apis/compute/loadbalancer_const.go +++ b/vendor/yunion.io/x/cloudmux/pkg/apis/compute/loadbalancer_const.go @@ -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 ( diff --git a/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/loadbalancerbackend.go b/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/loadbalancerbackend.go index 2e86d650ea..41a98d38d4 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/loadbalancerbackend.go +++ b/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/loadbalancerbackend.go @@ -18,6 +18,7 @@ type SLoadbalancerBackend struct { Index int Weight int Port int + Enabled bool Id string Name string ExternalId string