From 9a3871014eda00cd4385ec1d12d0d5507f6fdbba Mon Sep 17 00:00:00 2001 From: Jian Qiu Date: Fri, 8 Aug 2025 17:56:10 +0800 Subject: [PATCH] fix: filter guest by multiple ips with exact match (#23039) Co-authored-by: Qiu Jian --- pkg/compute/models/guests.go | 22 +++++++++++++++------- pkg/compute/models/hosts.go | 16 ++++++++++++---- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index fbda6a5f85..ba5769795d 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -427,12 +427,20 @@ func (manager *SGuestManager) ListItemFilter( } if len(query.IpAddrs) > 0 { + // 如果只有一个ip地址,则使用正则匹配,否则使用等于匹配 + cmpFunc := sqlchemy.Equals + if len(query.IpAddrs) == 1 { + cmpFunc = func(f sqlchemy.IQueryField, v interface{}) sqlchemy.ICondition { + return sqlchemy.Regexp(f, v.(string)) + } + } + grpnets := GroupnetworkManager.Query().SubQuery() vipq := GroupguestManager.Query("guest_id") conditions := []sqlchemy.ICondition{} for _, ipAddr := range query.IpAddrs { - conditions = append(conditions, sqlchemy.Regexp(grpnets.Field("ip_addr"), ipAddr)) - conditions = append(conditions, sqlchemy.Regexp(grpnets.Field("ip6_addr"), ipAddr)) + conditions = append(conditions, cmpFunc(grpnets.Field("ip_addr"), ipAddr)) + conditions = append(conditions, cmpFunc(grpnets.Field("ip6_addr"), ipAddr)) } vipq = vipq.Join(grpnets, sqlchemy.Equals(grpnets.Field("group_id"), vipq.Field("group_id"))).Filter( sqlchemy.OR(conditions...), @@ -441,7 +449,7 @@ func (manager *SGuestManager) ListItemFilter( grpeips := ElasticipManager.Query().Equals("associate_type", api.EIP_ASSOCIATE_TYPE_INSTANCE_GROUP).SubQuery() conditions = []sqlchemy.ICondition{} for _, ipAddr := range query.IpAddrs { - conditions = append(conditions, sqlchemy.Regexp(grpeips.Field("ip_addr"), ipAddr)) + conditions = append(conditions, cmpFunc(grpeips.Field("ip_addr"), ipAddr)) } vipeipq := GroupguestManager.Query("guest_id") vipeipq = vipeipq.Join(grpeips, sqlchemy.Equals(grpeips.Field("associate_id"), vipeipq.Field("group_id"))).Filter( @@ -451,15 +459,15 @@ func (manager *SGuestManager) ListItemFilter( gnQ := GuestnetworkManager.Query("guest_id") conditions = []sqlchemy.ICondition{} for _, ipAddr := range query.IpAddrs { - conditions = append(conditions, sqlchemy.Regexp(gnQ.Field("ip_addr"), ipAddr)) - conditions = append(conditions, sqlchemy.Regexp(gnQ.Field("ip6_addr"), ipAddr)) + conditions = append(conditions, cmpFunc(gnQ.Field("ip_addr"), ipAddr)) + conditions = append(conditions, cmpFunc(gnQ.Field("ip6_addr"), ipAddr)) } gn := gnQ.Filter(sqlchemy.OR(conditions...)) guestEipQ := ElasticipManager.Query("associate_id").Equals("associate_type", api.EIP_ASSOCIATE_TYPE_SERVER) conditions = []sqlchemy.ICondition{} for _, ipAddr := range query.IpAddrs { - conditions = append(conditions, sqlchemy.Regexp(guestEipQ.Field("ip_addr"), ipAddr)) + conditions = append(conditions, cmpFunc(guestEipQ.Field("ip_addr"), ipAddr)) } guestEip := guestEipQ.Filter(sqlchemy.OR(conditions...)) @@ -467,7 +475,7 @@ func (manager *SGuestManager) ListItemFilter( conditions = []sqlchemy.ICondition{} for _, ipAddr := range query.IpAddrs { conditions = append(conditions, sqlchemy.AND( - sqlchemy.Regexp(metadataQ.Field("value"), ipAddr), + cmpFunc(metadataQ.Field("value"), ipAddr), sqlchemy.Equals(metadataQ.Field("key"), "sync_ips"), sqlchemy.Equals(metadataQ.Field("obj_type"), "server"), )) diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 9aa6ba3ac0..d9684f7735 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -287,18 +287,24 @@ func (manager *SHostManager) ListItemFilter( } } if len(query.AnyIp) > 0 { + cmpFunc := sqlchemy.Equals + if len(query.AnyIp) == 1 { + cmpFunc = func(f sqlchemy.IQueryField, v interface{}) sqlchemy.ICondition { + return sqlchemy.Regexp(f, v.(string)) + } + } hnQ := HostnetworkManager.Query("baremetal_id") //.Contains("ip_addr", query.AnyIp).SubQuery() conditions := []sqlchemy.ICondition{} for _, ip := range query.AnyIp { - conditions = append(conditions, sqlchemy.Contains(hnQ.Field("ip_addr"), ip)) + conditions = append(conditions, cmpFunc(hnQ.Field("ip_addr"), ip)) } hn := hnQ.Filter( sqlchemy.OR(conditions...), ) conditions = []sqlchemy.ICondition{} for _, ip := range query.AnyIp { - conditions = append(conditions, sqlchemy.Contains(q.Field("access_ip"), ip)) - conditions = append(conditions, sqlchemy.Contains(q.Field("ipmi_ip"), ip)) + conditions = append(conditions, cmpFunc(q.Field("access_ip"), ip)) + conditions = append(conditions, cmpFunc(q.Field("ipmi_ip"), ip)) } conditions = append(conditions, sqlchemy.In(q.Field("id"), hn)) q = q.Filter(sqlchemy.OR( @@ -455,8 +461,10 @@ func (manager *SHostManager) ListItemFilter( for f, vars := range fieldQueryMap { vars = stringutils2.FilterEmpty(vars) - if len(vars) > 0 { + if len(vars) > 1 { q = q.In(f, vars) + } else if len(vars) == 1 { + q = q.Regexp(f, vars[0]) } }