diff --git a/Makefile b/Makefile index a3d375afca..22548c8fa3 100644 --- a/Makefile +++ b/Makefile @@ -278,8 +278,8 @@ RELEASE_BRANCH:=master GOPROXY ?= direct mod: - GOPROXY=$(GOPROXY) GONOSUMDB=yunion.io/x go get -d yunion.io/x/cloudmux@$(RELEASE_BRANCH) - GOPROXY=$(GOPROXY) GONOSUMDB=yunion.io/x go get -d $(patsubst %,%@master,$(shell GO111MODULE=on go mod edit -print | sed -n -e 's|.*\(yunion.io/x/[a-z].*\) v.*|\1|p' | grep -v '/cloudmux$$')) + GOPROXY=$(GOPROXY) GONOSUMDB=yunion.io/x go get yunion.io/x/cloudmux@$(RELEASE_BRANCH) + GOPROXY=$(GOPROXY) GONOSUMDB=yunion.io/x go get $(patsubst %,%@master,$(shell GO111MODULE=on go mod edit -print | sed -n -e 's|.*\(yunion.io/x/[a-z].*\) v.*|\1|p' | grep -v '/cloudmux$$')) GOPROXY=$(GOPROXY) GONOSUMDB=yunion.io/x go mod tidy GOPROXY=$(GOPROXY) GONOSUMDB=yunion.io/x go mod vendor -v diff --git a/go.mod b/go.mod index fef7387362..c51e79ced0 100644 --- a/go.mod +++ b/go.mod @@ -95,7 +95,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.20250606110734-0a60d09de2c5 + yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250613110939-e90f66e6775d 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 77518c31ab..3bc62b3051 100644 --- a/go.sum +++ b/go.sum @@ -1410,8 +1410,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.20250606110734-0a60d09de2c5 h1:O76RBJit7vZ42bJdNqpYY5Px21g9jYQSODM5zuCaVrw= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250606110734-0a60d09de2c5/go.mod h1:FXxAEbdNfWXX9gjME3K2nJhkydHY5EKEUZb+RLEzVwQ= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250613110939-e90f66e6775d h1:yJLYt+0JEJIvhfgoZCx19SkzGirH/SYcjnLLQzAQHcg= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250613110939-e90f66e6775d/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.go b/pkg/apis/compute/loadbalancer.go index 9cec75b1a1..7dc64d9cc5 100644 --- a/pkg/apis/compute/loadbalancer.go +++ b/pkg/apis/compute/loadbalancer.go @@ -67,6 +67,17 @@ type LoadbalancerListInput struct { UsableLoadbalancerForEip string `json:"usable_loadbalancer_for_eip"` } +type LbEip struct { + // 公网IP地址 + Eip string `json:"eip"` + + EipId string `json:"eip_id"` + + // 公网IP地址类型: 弹性、非弹性 + // example: public_ip + EipMode string `json:"eip_mode"` +} + type LoadbalancerDetails struct { apis.VirtualResourceDetails @@ -82,14 +93,9 @@ type LoadbalancerDetails struct { SLoadbalancer - // 公网IP地址 - Eip string `json:"eip"` + LbEip - EipId string `json:"eip_id"` - - // 公网IP地址类型: 弹性、非弹性 - // example: public_ip - EipMode string `json:"eip_mode"` + Eips []LbEip `json:"eips"` // 后端服务器组名称 BackendGroup string `json:"backend_group"` diff --git a/pkg/compute/models/cloudsyncelb.go b/pkg/compute/models/cloudsyncelb.go index ca8af0f1ac..5fba699f79 100644 --- a/pkg/compute/models/cloudsyncelb.go +++ b/pkg/compute/models/cloudsyncelb.go @@ -136,9 +136,9 @@ func syncRegionLoadbalancers( } func syncLbPeripherals(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, local *SLoadbalancer, remote cloudprovider.ICloudLoadbalancer) { - err := syncLoadbalancerEip(ctx, userCred, provider, local, remote) + err := syncLoadbalancerEips(ctx, userCred, provider, local, remote) if err != nil { - log.Errorf("syncLoadbalancerEip error %s", err) + log.Errorf("syncLoadbalancerEips error %s", err) } err = syncLoadbalancerBackendgroups(ctx, userCred, SSyncResultSet{}, provider, local, remote) if err != nil { @@ -169,14 +169,14 @@ func syncLoadbalancerSecurityGroups(ctx context.Context, userCred mcclient.Token return nil } -func syncLoadbalancerEip(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, localLb *SLoadbalancer, remoteLb cloudprovider.ICloudLoadbalancer) error { - eip, err := remoteLb.GetIEIP() +func syncLoadbalancerEips(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, localLb *SLoadbalancer, remoteLb cloudprovider.ICloudLoadbalancer) error { + eips, err := remoteLb.GetIEIPs() if err != nil { - return errors.Wrapf(err, "GetIEIP") + return errors.Wrapf(err, "GetIEIPs") } - result := localLb.SyncLoadbalancerEip(ctx, userCred, provider, eip) + result := localLb.SyncLoadbalancerEips(ctx, userCred, provider, eips) msg := result.Result() - log.Infof("SyncEip for Loadbalancer %s result: %s", localLb.Name, msg) + log.Infof("SyncEips for Loadbalancer %s result: %s", localLb.Name, msg) if result.IsError() { return result.AllError() } diff --git a/pkg/compute/models/elasticips.go b/pkg/compute/models/elasticips.go index 0ec56a36ad..e6120f6e97 100644 --- a/pkg/compute/models/elasticips.go +++ b/pkg/compute/models/elasticips.go @@ -1323,8 +1323,8 @@ func (self *SElasticip) PerformAssociate(ctx context.Context, userCred mcclient. if lb.PendingDeleted { return input, httperrors.NewInvalidStatusError("cannot associate with pending deleted loadbalancer") } - seip, _ := lb.GetEip() - if seip != nil { + eips, _ := lb.GetEips() + if len(eips) > 0 { return input, httperrors.NewInvalidStatusError("loadbalancer is already associated with eip") } } diff --git a/pkg/compute/models/loadbalancers.go b/pkg/compute/models/loadbalancers.go index 7616bf01ae..d2f619801b 100644 --- a/pkg/compute/models/loadbalancers.go +++ b/pkg/compute/models/loadbalancers.go @@ -847,9 +847,18 @@ func (man *SLoadbalancerManager) FetchCustomizeColumns( log.Errorf("Fetch eips error: %v", err) return rows } - eipMap := map[string]*SElasticip{} + eipMap := map[string][]api.LbEip{} for i := range eips { - eipMap[eips[i].AssociateId] = &eips[i] + associateId := eips[i].AssociateId + _, ok := eipMap[associateId] + if !ok { + eipMap[associateId] = []api.LbEip{} + } + eipMap[associateId] = append(eipMap[associateId], api.LbEip{ + Eip: eips[i].IpAddr, + EipId: eips[i].Id, + EipMode: eips[i].Mode, + }) } bgMap, err := db.FetchIdNameMap2(LoadbalancerBackendGroupManager, backendGroupIds) @@ -898,11 +907,10 @@ func (man *SLoadbalancerManager) FetchCustomizeColumns( } for i := range rows { - eip, ok := eipMap[lbIds[i]] + eips, ok := eipMap[lbIds[i]] if ok { - rows[i].Eip = eip.IpAddr - rows[i].EipMode = eip.Mode - rows[i].EipId = eip.Id + rows[i].Eips = eips + rows[i].Eip = eips[0].Eip } bg, ok := bgMap[backendGroupIds[i]] if ok { @@ -1239,56 +1247,82 @@ func (lb *SLoadbalancer) syncLoadbalancerNetwork(ctx context.Context, userCred m } func (self *SLoadbalancer) DeleteEip(ctx context.Context, userCred mcclient.TokenCredential, autoDelete bool) error { - eip, err := self.GetEip() + eips, err := self.GetEips() if err != nil { log.Errorf("Delete eip fail for get Eip %s", err) return err } - if eip == nil { - return nil - } - if eip.Mode == api.EIP_MODE_INSTANCE_PUBLICIP { - err = eip.RealDelete(ctx, userCred) - if err != nil { - log.Errorf("Delete eip on delete server fail %s", err) - return errors.Wrap(err, "RealDelete") - } - } else { - err = eip.Dissociate(ctx, userCred) - if err != nil { - log.Errorf("Dissociate eip on delete server fail %s", err) - return errors.Wrap(err, "Dissociate") - } - if autoDelete { + for _, eip := range eips { + if eip.Mode == api.EIP_MODE_INSTANCE_PUBLICIP { err = eip.RealDelete(ctx, userCred) if err != nil { log.Errorf("Delete eip on delete server fail %s", err) return errors.Wrap(err, "RealDelete") } + } else { + err = eip.Dissociate(ctx, userCred) + if err != nil { + log.Errorf("Dissociate eip on delete server fail %s", err) + return errors.Wrap(err, "Dissociate") + } + if autoDelete { + err = eip.RealDelete(ctx, userCred) + if err != nil { + log.Errorf("Delete eip on delete server fail %s", err) + return errors.Wrap(err, "RealDelete") + } + } } } + return nil } -func (self *SLoadbalancer) GetEip() (*SElasticip, error) { - return ElasticipManager.getEip(api.EIP_ASSOCIATE_TYPE_LOADBALANCER, self.Id, "") +func (self *SLoadbalancer) GetEips() ([]SElasticip, error) { + q := ElasticipManager.Query().Equals("associate_id", self.Id).Equals("associate_type", api.EIP_ASSOCIATE_TYPE_LOADBALANCER) + ret := []SElasticip{} + err := db.FetchModelObjects(ElasticipManager, q, &ret) + if err != nil { + return nil, err + } + return ret, nil } -func (self *SLoadbalancer) SyncLoadbalancerEip(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, extEip cloudprovider.ICloudEIP) compare.SyncResult { +func (self *SLoadbalancer) SyncLoadbalancerEips(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, extEips []cloudprovider.ICloudEIP) compare.SyncResult { result := compare.SyncResult{} - eip, err := self.GetEip() + eips, err := self.GetEips() if err != nil { result.Error(fmt.Errorf("getEip error %s", err)) return result } - if eip == nil && extEip == nil { - // do nothing - } else if eip == nil && extEip != nil { - // add + removed := []SElasticip{} + commondb := []SElasticip{} + commonext := []cloudprovider.ICloudEIP{} + added := []cloudprovider.ICloudEIP{} + + err = compare.CompareSets(eips, extEips, &removed, &commondb, &commonext, &added) + if err != nil { + result.Error(err) + return result + } + + for i := 0; i < len(removed); i++ { + err = removed[i].Dissociate(ctx, userCred) + if err != nil { + result.DeleteError(err) + } else { + result.Delete() + } + } + + for i := 0; i < len(commondb); i++ { + result.Update() + } + for i := 0; i < len(added); i++ { region, _ := self.GetRegion() - neip, err := ElasticipManager.getEipByExtEip(ctx, userCred, extEip, provider, region, provider.GetOwnerId()) + neip, err := ElasticipManager.getEipByExtEip(ctx, userCred, added[i], provider, region, provider.GetOwnerId()) if err != nil { log.Errorf("getEipByExtEip error %v", err) result.AddError(err) @@ -1301,46 +1335,6 @@ func (self *SLoadbalancer) SyncLoadbalancerEip(ctx context.Context, userCred mcc result.Add() } } - } else if eip != nil && extEip == nil { - // remove - err = eip.Dissociate(ctx, userCred) - if err != nil { - result.DeleteError(err) - } else { - result.Delete() - } - } else { - // sync - if eip.IpAddr != extEip.GetIpAddr() { - // remove then add - err = eip.Dissociate(ctx, userCred) - if err != nil { - // fail to remove - result.DeleteError(err) - } else { - result.Delete() - region, _ := self.GetRegion() - neip, err := ElasticipManager.getEipByExtEip(ctx, userCred, extEip, provider, region, provider.GetOwnerId()) - if err != nil { - result.AddError(err) - } else { - err = neip.AssociateLoadbalancer(ctx, userCred, self) - if err != nil { - result.AddError(err) - } else { - result.Add() - } - } - } - } else { - // do nothing - err := eip.SyncWithCloudEip(ctx, userCred, provider, extEip, provider.GetOwnerId()) - if err != nil { - result.UpdateError(err) - } else { - result.Update() - } - } } return result @@ -1666,11 +1660,11 @@ func (lb *SLoadbalancer) IsEipAssociable() error { return errors.Wrap(err, "ValidateAssociateEip") } - eip, err := lb.GetEip() + eips, err := lb.GetEips() if err != nil { return errors.Wrap(err, "GetElasticIp") } - if eip != nil { + if len(eips) > 0 { return httperrors.NewInvalidStatusError("already associate with eip") } return nil @@ -1765,16 +1759,16 @@ func (lb *SLoadbalancer) PerformDissociateEip(ctx context.Context, userCred mccl return nil, httperrors.NewUnsupportOperationError("not support managed lb") } - eip, err := lb.GetEip() + eips, err := lb.GetEips() if err != nil { log.Errorf("Fail to get Eip %s", err) return nil, httperrors.NewGeneralError(err) } - if eip == nil { + if len(eips) == 0 { return nil, httperrors.NewInvalidStatusError("No eip to dissociate") } - err = db.IsObjectRbacAllowed(ctx, eip, userCred, policy.PolicyActionGet) + err = db.IsObjectRbacAllowed(ctx, &eips[0], userCred, policy.PolicyActionGet) if err != nil { return nil, errors.Wrap(err, "eip is not accessible") } diff --git a/vendor/modules.txt b/vendor/modules.txt index b9b0a4d852..fc64594d88 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1849,7 +1849,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.20250606110734-0a60d09de2c5 +# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250613110939-e90f66e6775d ## 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/cloudprovider/resources.go b/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/resources.go index 1a26df0c46..4e99e54479 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/resources.go +++ b/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/resources.go @@ -722,7 +722,7 @@ type ICloudLoadbalancer interface { GetChargeType() string GetEgressMbps() int - GetIEIP() (ICloudEIP, error) + GetIEIPs() ([]ICloudEIP, error) Delete(ctx context.Context) error diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/loadbalancer.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/loadbalancer.go index c53734e3d4..6dd184c820 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/loadbalancer.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/loadbalancer.go @@ -297,7 +297,7 @@ func (lb *SLoadbalancer) GetILoadBalancerBackendGroupById(groupId string) (cloud return nil, cloudprovider.ErrNotFound } -func (lb *SLoadbalancer) GetIEIP() (cloudprovider.ICloudEIP, error) { +func (lb *SLoadbalancer) GetIEIPs() ([]cloudprovider.ICloudEIP, error) { if lb.AddressType == "internet" { eip := SEipAddress{ region: lb.region, @@ -315,17 +315,18 @@ func (lb *SLoadbalancer) GetIEIP() (cloudprovider.ICloudEIP, error) { case api.LB_CHARGE_TYPE_BY_TRAFFIC: eip.InternetChargeType = InternetChargeByTraffic } - return &eip, nil + return []cloudprovider.ICloudEIP{&eip}, nil } - eips, total, err := lb.region.GetEips("", lb.LoadBalancerId, "", 0, 1) + eips, _, err := lb.region.GetEips("", lb.LoadBalancerId, "", 0, 1) if err != nil { return nil, errors.Wrapf(err, "lb.region.GetEips(%s)", lb.LoadBalancerId) } - if total != 1 { - return nil, cloudprovider.ErrNotFound + ret := []cloudprovider.ICloudEIP{} + for i := range eips { + eips[i].region = lb.region + ret = append(ret, &eips[i]) } - eips[0].region = lb.region - return &eips[0], nil + return ret, nil } func (region *SRegion) loadbalancerOperation(loadbalancerId, status string) error { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/loadbalancerbackend.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/loadbalancerbackend.go index a3b61bc4d0..bbe3fdfefe 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/loadbalancerbackend.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/loadbalancerbackend.go @@ -41,7 +41,7 @@ func (backend *SLoadbalancerBackend) GetName() string { } func (backend *SLoadbalancerBackend) GetId() string { - return fmt.Sprintf("%s/%s", backend.lbbg.VServerGroupId, backend.ServerId) + return fmt.Sprintf("%s/%s/%s/%d", backend.lbbg.VServerGroupId, backend.ServerId, backend.ServerIp, backend.Port) } func (backend *SLoadbalancerBackend) GetGlobalId() string { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/apsara/loadbalancer.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/apsara/loadbalancer.go index d439956230..711e043ad1 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/apsara/loadbalancer.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/apsara/loadbalancer.go @@ -300,7 +300,7 @@ func (lb *SLoadbalancer) GetILoadBalancerBackendGroupById(groupId string) (cloud return nil, cloudprovider.ErrNotFound } -func (lb *SLoadbalancer) GetIEIP() (cloudprovider.ICloudEIP, error) { +func (lb *SLoadbalancer) GetIEIPs() ([]cloudprovider.ICloudEIP, error) { if lb.AddressType == "internet" { eip := SEipAddress{ region: lb.region, @@ -313,17 +313,18 @@ func (lb *SLoadbalancer) GetIEIP() (cloudprovider.ICloudEIP, error) { Bandwidth: lb.Bandwidth, InternetChargeType: lb.InternetChargeType, } - return &eip, nil + return []cloudprovider.ICloudEIP{&eip}, nil } - eips, total, err := lb.region.GetEips("", lb.LoadBalancerId, 0, 1) + eips, _, err := lb.region.GetEips("", lb.LoadBalancerId, 0, 1) if err != nil { return nil, errors.Wrapf(err, "lb.region.GetEips(%s)", lb.LoadBalancerId) } - if total != 1 { - return nil, cloudprovider.ErrNotFound + ret := []cloudprovider.ICloudEIP{} + for i := range eips { + eips[i].region = lb.region + ret = append(ret, &eips[i]) } - eips[0].region = lb.region - return &eips[0], nil + return ret, nil } func (region *SRegion) loadbalancerOperation(loadbalancerId, status string) error { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/eip.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/eip.go index 5566fc3251..75a0e4cc5f 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/eip.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/eip.go @@ -113,6 +113,8 @@ func (self *SEipAddress) GetAssociationType() string { switch net.InterfaceType { case "nat_gateway": return api.EIP_ASSOCIATE_TYPE_NAT_GATEWAY + case "network_load_balancer": + return api.EIP_ASSOCIATE_TYPE_LOADBALANCER default: return net.InterfaceType } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/loadbalancer.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/loadbalancer.go index 7703902940..8af26a46fa 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/loadbalancer.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/loadbalancer.go @@ -284,8 +284,20 @@ func (self *SElb) GetILoadBalancerListenerById(listenerId string) (cloudprovider return lis, nil } -func (self *SElb) GetIEIP() (cloudprovider.ICloudEIP, error) { - return nil, nil +func (self *SElb) GetIEIPs() ([]cloudprovider.ICloudEIP, error) { + ret := []cloudprovider.ICloudEIP{} + for _, zone := range self.AvailabilityZones { + for _, addr := range zone.LoadBalancerAddresses { + if len(addr.IPAddress) > 0 && strings.Contains(addr.AllocationID, "eip") { + eip, err := self.region.GetEipByIpAddress(addr.IPAddress) + if err != nil { + return nil, err + } + ret = append(ret, eip) + } + } + } + return ret, nil } func (self *SRegion) DeleteElb(id string) error { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/azure/loadbalancer.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/azure/loadbalancer.go index 40c9db43b0..8011a48b28 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/azure/loadbalancer.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/azure/loadbalancer.go @@ -188,21 +188,22 @@ func (self *SLoadbalancer) GetEgressMbps() int { return 0 } -func (self *SLoadbalancer) GetIEIP() (cloudprovider.ICloudEIP, error) { +func (self *SLoadbalancer) GetIEIPs() ([]cloudprovider.ICloudEIP, error) { properties, err := self.GetProperties() if err != nil { return nil, errors.Wrapf(err, "GetProperties") } + ret := []cloudprovider.ICloudEIP{} for _, front := range properties.FrontendIPConfigurations { if len(front.Properties.PublicIPAddress.ID) > 0 { eip, err := self.region.GetEip(front.Properties.PublicIPAddress.ID) if err != nil { return nil, err } - return eip, nil + ret = append(ret, eip) } } - return nil, cloudprovider.ErrNotFound + return ret, nil } func (self *SLoadbalancer) Delete(ctx context.Context) error { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/eip.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/eip.go index 14249afc7b..155379ec1f 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/eip.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/eip.go @@ -50,11 +50,11 @@ type SAddress struct { func (region *SRegion) GetEips(address string, maxResults int, pageToken string) ([]SAddress, error) { eips := []SAddress{} params := map[string]string{} - filters := []string{"addressType=EXTERNAL"} + filters := []string{`(addressType eq "EXTERNAL")`} if len(address) > 0 { - filters = append(filters, fmt.Sprintf(`address="%s"`, address)) + filters = append(filters, fmt.Sprintf(`(address eq "%s")`, address)) } - params["filter"] = strings.Join(filters, " ADN ") + params["filter"] = strings.Join(filters, "") resource := fmt.Sprintf("regions/%s/addresses", region.Name) return eips, region.List(resource, params, maxResults, pageToken, &eips) } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/globalloadbalancer.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/globalloadbalancer.go index b6b43a7851..579147b798 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/globalloadbalancer.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/globalloadbalancer.go @@ -107,12 +107,12 @@ func (self *SGlobalLoadbalancer) GetProjectId() string { return "" } -func (self *SGlobalLoadbalancer) GetIEIP() (cloudprovider.ICloudEIP, error) { +func (self *SGlobalLoadbalancer) GetIEIPs() ([]cloudprovider.ICloudEIP, error) { frs, err := self.GetForwardingRules() if err != nil { log.Errorf("GetAddress.GetForwardingRules %s", err) } - + ret := []cloudprovider.ICloudEIP{} for i := range frs { if strings.ToLower(frs[i].LoadBalancingScheme) == "external" { eips, err := self.region.GetEips(frs[i].IPAddress) @@ -120,13 +120,13 @@ func (self *SGlobalLoadbalancer) GetIEIP() (cloudprovider.ICloudEIP, error) { log.Errorf("GetEips %s", err) } - if len(eips) > 0 { - return &eips[0], nil + for j := range eips { + eips[j].region = self.region + ret = append(ret, &eips[j]) } } } - - return nil, nil + return ret, nil } func (self *SGlobalLoadbalancer) GetAddress() string { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/loadbalancer.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/loadbalancer.go index 0f170fc360..100f59da90 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/loadbalancer.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/google/loadbalancer.go @@ -242,26 +242,27 @@ func (self *SLoadbalancer) GetEgressMbps() int { return 0 } -func (self *SLoadbalancer) GetIEIP() (cloudprovider.ICloudEIP, error) { +func (self *SLoadbalancer) GetIEIPs() ([]cloudprovider.ICloudEIP, error) { frs, err := self.GetForwardingRules() if err != nil { log.Errorf("GetAddress.GetForwardingRules %s", err) } + ret := []cloudprovider.ICloudEIP{} for i := range frs { if strings.ToLower(frs[i].LoadBalancingScheme) == "external" { eips, err := self.region.GetEips(frs[i].IPAddress, 0, "") if err != nil { log.Errorf("GetEips %s", err) } - - if len(eips) > 0 { - return &eips[0], nil + for j := range eips { + eips[j].region = self.region + ret = append(ret, &eips[j]) } } } - return nil, nil + return ret, nil } func (self *SLoadbalancer) Delete(ctx context.Context) error { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/hcso/loadbalancer.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/hcso/loadbalancer.go index fa6230e981..1c63dd4f4a 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/hcso/loadbalancer.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/hcso/loadbalancer.go @@ -86,12 +86,12 @@ type Pool struct { ID string `json:"id"` } -func (self *SLoadbalancer) GetIEIP() (cloudprovider.ICloudEIP, error) { +func (self *SLoadbalancer) GetIEIPs() ([]cloudprovider.ICloudEIP, error) { if self.GetEip() == nil { return nil, nil } - return self.eip, nil + return []cloudprovider.ICloudEIP{self.eip}, nil } func (self *SLoadbalancer) GetId() string { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/loadbalancer.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/loadbalancer.go index fa32a88b01..76264d5f50 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/loadbalancer.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/loadbalancer.go @@ -93,7 +93,8 @@ type Pool struct { Id string `json:"id"` } -func (self *SLoadbalancer) GetEip() (*SEipAddress, error) { +func (self *SLoadbalancer) GetIEIPs() ([]cloudprovider.ICloudEIP, error) { + ret := []cloudprovider.ICloudEIP{} for _, ip := range self.Publicips { if ip.IpVersion != "4" { continue @@ -102,17 +103,9 @@ func (self *SLoadbalancer) GetEip() (*SEipAddress, error) { if err != nil { return nil, err } - return eip, nil + ret = append(ret, eip) } - return nil, cloudprovider.ErrNotFound -} - -func (self *SLoadbalancer) GetIEIP() (cloudprovider.ICloudEIP, error) { - eip, err := self.GetEip() - if err != nil { - return nil, err - } - return eip, nil + return ret, nil } func (self *SLoadbalancer) GetId() string { @@ -212,19 +205,10 @@ func (self *SLoadbalancer) GetLoadbalancerSpec() string { } func (self *SLoadbalancer) GetChargeType() string { - eip, _ := self.GetEip() - if eip != nil { - return eip.GetInternetChargeType() - } return api.EIP_CHARGE_TYPE_BY_TRAFFIC } func (self *SLoadbalancer) GetEgressMbps() int { - eip, _ := self.GetEip() - if eip != nil { - return eip.GetBandwidth() - } - return 0 } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/loadbalancer_base.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/loadbalancer_base.go index 5f026db30c..d7fa6f876a 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/loadbalancer_base.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/loadbalancer_base.go @@ -23,7 +23,7 @@ type SLoadbalancerBase struct { SVirtualResourceBase } -func (lb *SLoadbalancerBase) GetIEIP() (cloudprovider.ICloudEIP, error) { +func (lb *SLoadbalancerBase) GetIEIPs() ([]cloudprovider.ICloudEIP, error) { return nil, nil } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/openstack/instance.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/openstack/instance.go index 0b874c3bb3..bacce05fd0 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/openstack/instance.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/openstack/instance.go @@ -828,7 +828,7 @@ func (region *SRegion) LiveMigrateVM(instanceId string, hostName string) error { return nil } -//仅live-migration +// 仅live-migration func (region *SRegion) ListServerMigration(instanceId string) error { resource := fmt.Sprintf("/servers/%s/migrations", instanceId) _, err := region.ecsGet(resource) @@ -838,7 +838,7 @@ func (region *SRegion) ListServerMigration(instanceId string) error { return nil } -//仅live-migration +// 仅live-migration func (region *SRegion) DeleteMigration(instanceId string, migrationId string) error { resource := fmt.Sprintf("/servers/%s/migrations/%s", instanceId, migrationId) _, err := region.ecsDelete(resource) @@ -848,7 +848,7 @@ func (region *SRegion) DeleteMigration(instanceId string, migrationId string) er return nil } -//仅live-migration +// 仅live-migration func (region *SRegion) ForceCompleteMigration(instanceId string, migrationId string) error { params := jsonutils.NewDict() params.Add(jsonutils.JSONNull, "force_complete") diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/openstack/loadbalbacer.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/openstack/loadbalbacer.go index 45ab6cadb4..453a463ada 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/openstack/loadbalbacer.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/openstack/loadbalbacer.go @@ -182,7 +182,7 @@ func (lb *SLoadbalancer) GetAddress() string { } func (lb *SLoadbalancer) GetAddressType() string { - eip, err := lb.GetIEIP() + eip, err := lb.GetIEIPs() if err != nil { return api.LB_ADDR_TYPE_INTRANET } @@ -368,13 +368,10 @@ func (lb *SLoadbalancer) GetLoadbalancerSpec() string { } func (lb *SLoadbalancer) GetChargeType() string { - eip, err := lb.GetIEIP() + _, err := lb.GetIEIPs() if err != nil { log.Errorf("lb.GetIEIP(): %s", err) } - if err != nil { - return eip.GetInternetChargeType() - } return api.EIP_CHARGE_TYPE_BY_TRAFFIC } @@ -407,14 +404,14 @@ func (lb *SLoadbalancer) GetILoadBalancerBackendGroupById(poolId string) (cloudp return spool, nil } -func (lb *SLoadbalancer) GetIEIP() (cloudprovider.ICloudEIP, error) { +func (lb *SLoadbalancer) GetIEIPs() ([]cloudprovider.ICloudEIP, error) { eips, err := lb.region.GetEips("") if err != nil { return nil, errors.Wrapf(err, "lb.region.GetEips()") } for _, eip := range eips { if eip.PortId == lb.VipPortID { - return &eip, nil + return []cloudprovider.ICloudEIP{&eip}, nil } } return nil, nil diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/loadbalancer.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/loadbalancer.go index 431d0b3ce3..73ab5b1f3e 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/loadbalancer.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/loadbalancer.go @@ -309,16 +309,16 @@ func (self *SLoadbalancer) GetILoadBalancerBackendGroups() ([]cloudprovider.IClo return ret, nil } -func (self *SLoadbalancer) GetIEIP() (cloudprovider.ICloudEIP, error) { +func (self *SLoadbalancer) GetIEIPs() ([]cloudprovider.ICloudEIP, error) { if self.LoadBalancerType == "OPEN" && len(self.LoadBalancerVips) > 0 { - return &SEipAddress{ + return []cloudprovider.ICloudEIP{&SEipAddress{ region: self.region, AddressId: self.LoadBalancerId, AddressIp: self.LoadBalancerVips[0], AddressType: EIP_STATUS_BIND, InstanceId: self.LoadBalancerId, CreatedTime: self.CreateTime, - }, nil + }}, nil } return nil, nil } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/remotefile/loadbalancer.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/remotefile/loadbalancer.go index a547e295ee..a3e60b7683 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/remotefile/loadbalancer.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/remotefile/loadbalancer.go @@ -79,7 +79,7 @@ func (self *SLoadbalancer) GetEgressMbps() int { return self.Bandwidth } -func (self *SLoadbalancer) GetIEIP() (cloudprovider.ICloudEIP, error) { +func (self *SLoadbalancer) GetIEIPs() ([]cloudprovider.ICloudEIP, error) { return nil, cloudprovider.ErrNotImplemented }