fix: filter guest by multiple ips with exact match (#23039)

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
This commit is contained in:
Jian Qiu
2025-08-08 17:56:10 +08:00
committed by GitHub
co-authored by Qiu Jian
parent b4e3d17178
commit 9a3871014e
2 changed files with 27 additions and 11 deletions
+15 -7
View File
@@ -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"),
))
+12 -4
View File
@@ -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])
}
}