mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
fix: filter guest by multiple ips with exact match (#23039)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
This commit is contained in:
@@ -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"),
|
||||
))
|
||||
|
||||
@@ -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])
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user