From 77cd1ba269b239fc54a36e265bf1bb9648c1f886 Mon Sep 17 00:00:00 2001 From: ioito Date: Tue, 14 May 2019 15:51:03 +0800 Subject: [PATCH] =?UTF-8?q?=E9=99=90=E5=88=B6=E6=B7=BB=E5=8A=A0=E5=90=8C?= =?UTF-8?q?=E4=B8=80=E4=B8=AAvpc=E5=BA=95=E4=B8=8B=E7=9A=84=E8=99=9A?= =?UTF-8?q?=E6=8B=9F=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/models/guests.go | 19 +++++++ .../models/loadbalancerbackendgroups.go | 49 +++++++++++++++---- 2 files changed, 59 insertions(+), 9 deletions(-) diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 3fe4a2e38d..0466e850a6 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -629,6 +629,25 @@ func (guest *SGuest) NetworkCount() (int, error) { return guest.GetNetworksQuery("").CountWithError() } +func (guest *SGuest) GetVpc() (*SVpc, error) { + q := guest.GetNetworksQuery("") + guestnic := &SGuestnetwork{} + err := q.First(guestnic) + if err != nil { + return nil, err + } + guestnic.SetModelManager(GuestnetworkManager) + network := guestnic.GetNetwork() + if network == nil { + return nil, fmt.Errorf("failed to found network for guest %s(%s)", guest.Name, guest.Id) + } + vpc := network.GetVpc() + if vpc == nil { + return nil, fmt.Errorf("failed to found vpc for network %s(%s)", network.Name, network.Id) + } + return vpc, nil +} + func (guest *SGuest) GetNetworks(netId string) ([]SGuestnetwork, error) { guestnics := make([]SGuestnetwork, 0) q := guest.GetNetworksQuery(netId).Asc("index") diff --git a/pkg/compute/models/loadbalancerbackendgroups.go b/pkg/compute/models/loadbalancerbackendgroups.go index 0c3fe4b441..8e465d9cfd 100644 --- a/pkg/compute/models/loadbalancerbackendgroups.go +++ b/pkg/compute/models/loadbalancerbackendgroups.go @@ -248,17 +248,48 @@ func (lbbg *SLoadbalancerBackendGroup) GetDetailsUsableBackendList(ctx context.C for _, backend := range backends { backendIds = append(backendIds, backend.BackendId) } - q := GuestManager.Query().NotIn("id", backendIds) - host := HostManager.Query().SubQuery() - zone := ZoneManager.Query().SubQuery() - cloudregion := CloudregionManager.Query().SubQuery() - q = q.Join(host, sqlchemy.Equals(host.Field("id"), q.Field("host_id"))). - Join(zone, sqlchemy.Equals(host.Field("zone_id"), zone.Field("id"))). - Join(cloudregion, sqlchemy.Equals(zone.Field("cloudregion_id"), cloudregion.Field("id"))). - Filter(sqlchemy.Equals(cloudregion.Field("id"), lbbg.CloudregionId)) + vpcId := "" + lb := lbbg.GetLoadbalancer() + if lb != nil && len(lb.VpcId) > 0 { + vpcId = lb.VpcId + } + if len(vpcId) == 0 { + for _, backend := range backends { + if backend.Status == api.LB_STATUS_ENABLED { + if guest := backend.GetGuest(); guest != nil { + vpc, err := guest.GetVpc() + if err != nil { + return nil, err + } + vpcId = vpc.Id + break + } + } + } + } + q := GuestManager.Query() + hosts := HostManager.Query().SubQuery() + guestnetworks := GuestnetworkManager.Query().SubQuery() + networks := NetworkManager.Query().SubQuery() + wires := WireManager.Query().SubQuery() + vpcs := VpcManager.Query().SubQuery() + zones := ZoneManager.Query().SubQuery() + cloudregions := CloudregionManager.Query().SubQuery() + q = q.Join(hosts, sqlchemy.Equals(hosts.Field("id"), q.Field("host_id"))). + Join(zones, sqlchemy.Equals(hosts.Field("zone_id"), zones.Field("id"))). + Join(cloudregions, sqlchemy.Equals(zones.Field("cloudregion_id"), cloudregions.Field("id"))). + Filter(sqlchemy.Equals(cloudregions.Field("id"), lbbg.CloudregionId)). + Filter(sqlchemy.NotIn(q.Field("id"), backendIds)) + if len(vpcId) > 0 { + q = q.Join(guestnetworks, sqlchemy.Equals(guestnetworks.Field("guest_id"), q.Field("id"))). + Join(networks, sqlchemy.Equals(networks.Field("id"), guestnetworks.Field("network_id"))). + Join(wires, sqlchemy.Equals(wires.Field("id"), networks.Field("wire_id"))). + Join(vpcs, sqlchemy.Equals(vpcs.Field("id"), wires.Field("vpc_id"))). + Filter(sqlchemy.Equals(vpcs.Field("id"), vpcId)) + } q = q.In("status", lbbg.GetRegion().GetDriver().GetBackendStatusForAdd()) if len(lbbg.ManagerId) > 0 { - q = q.Filter(sqlchemy.Equals(host.Field("manager_id"), lbbg.ManagerId)) + q = q.Filter(sqlchemy.Equals(hosts.Field("manager_id"), lbbg.ManagerId)) q.Filter(sqlchemy.NOT(sqlchemy.IsNullOrEmpty(q.Field("external_id")))) } result := &struct {