mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-01 15:07:17 +08:00
Merge pull request #3102 from ioito/hotfix/qx-network-filter-by-zones
fix: network支持多个zone过滤
This commit is contained in:
@@ -29,15 +29,15 @@ func init() {
|
||||
type NetworkListOptions struct {
|
||||
options.BaseListOptions
|
||||
|
||||
Ip string `help:"search networks that contain this IP"`
|
||||
Zone string `help:"search networks in a zone"`
|
||||
Wire string `help:"search networks belongs to a wire" json:"-"`
|
||||
Host string `help:"search networks attached to a host"`
|
||||
Vpc string `help:"search networks belongs to a VPC"`
|
||||
Region string `help:"search networks belongs to a CloudRegion" json:"cloudregion"`
|
||||
City string `help:"search networks belongs to a city"`
|
||||
Usable *bool `help:"search usable networks"`
|
||||
ServerType string `help:"search networks belongs to a ServerType" choices:"guest|baremetal|container|pxe|ipmi"`
|
||||
Ip string `help:"search networks that contain this IP"`
|
||||
Zone []string `help:"search networks in zones"`
|
||||
Wire string `help:"search networks belongs to a wire" json:"-"`
|
||||
Host string `help:"search networks attached to a host"`
|
||||
Vpc string `help:"search networks belongs to a VPC"`
|
||||
Region string `help:"search networks belongs to a CloudRegion" json:"cloudregion"`
|
||||
City string `help:"search networks belongs to a city"`
|
||||
Usable *bool `help:"search usable networks"`
|
||||
ServerType string `help:"search networks belongs to a ServerType" choices:"guest|baremetal|container|pxe|ipmi"`
|
||||
}
|
||||
R(&NetworkListOptions{}, "network-list", "List networks", func(s *mcclient.ClientSession, opts *NetworkListOptions) error {
|
||||
params, err := options.ListStructToParams(opts)
|
||||
|
||||
@@ -1626,26 +1626,53 @@ func (manager *SNetworkManager) ListItemFilter(ctx context.Context, q *sqlchemy.
|
||||
return nil, err
|
||||
}
|
||||
|
||||
zoneStr, _ := query.GetString("zone")
|
||||
if len(zoneStr) > 0 {
|
||||
zoneObj, err := ZoneManager.FetchByIdOrName(userCred, zoneStr)
|
||||
zones := jsonutils.GetQueryStringArray(query, "zone")
|
||||
if len(zones) > 0 {
|
||||
zq := ZoneManager.Query().SubQuery()
|
||||
regions := CloudregionManager.Query().SubQuery()
|
||||
zoneQ := zq.Query(zq.Field("id"), regions.Field("id"), regions.Field("provider")).
|
||||
Join(regions, sqlchemy.Equals(zq.Field("cloudregion_id"), regions.Field("id"))).
|
||||
Filter(
|
||||
sqlchemy.OR(
|
||||
sqlchemy.In(zq.Field("id"), zones),
|
||||
sqlchemy.In(zq.Field("name"), zones),
|
||||
),
|
||||
)
|
||||
rows, err := zoneQ.Rows()
|
||||
if err != nil {
|
||||
return nil, httperrors.NewNotFoundError("Zone %s not found", zoneStr)
|
||||
return nil, err
|
||||
}
|
||||
zone := zoneObj.(*SZone)
|
||||
region := zone.GetRegion()
|
||||
if utils.IsInStringArray(region.Provider, api.REGIONAL_NETWORK_PROVIDERS) {
|
||||
wires := WireManager.Query().SubQuery()
|
||||
vpcs := VpcManager.Query().SubQuery()
|
||||
|
||||
sq := wires.Query(wires.Field("id")).
|
||||
Join(vpcs, sqlchemy.Equals(wires.Field("vpc_id"), vpcs.Field("id"))).
|
||||
Filter(sqlchemy.Equals(vpcs.Field("cloudregion_id"), region.Id))
|
||||
q = q.Filter(sqlchemy.In(q.Field("wire_id"), sq.SubQuery()))
|
||||
} else {
|
||||
sq := WireManager.Query("id").Equals("zone_id", zoneObj.GetId())
|
||||
q = q.Filter(sqlchemy.In(q.Field("wire_id"), sq.SubQuery()))
|
||||
defer rows.Close()
|
||||
|
||||
regionIds := []string{}
|
||||
zoneIds := []string{}
|
||||
for rows.Next() {
|
||||
var zoneId, regionId, provider sql.NullString
|
||||
err = rows.Scan(&zoneId, ®ionId, &provider)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(provider.String) > 0 && utils.IsInStringArray(provider.String, api.REGIONAL_NETWORK_PROVIDERS) {
|
||||
if !utils.IsInStringArray(regionId.String, regionIds) {
|
||||
regionIds = append(regionIds, regionId.String)
|
||||
}
|
||||
} else {
|
||||
zoneIds = append(zoneIds, zoneId.String)
|
||||
}
|
||||
}
|
||||
|
||||
wires := WireManager.Query().SubQuery()
|
||||
vpcs := VpcManager.Query().SubQuery()
|
||||
sq := wires.Query(wires.Field("id")).
|
||||
Join(vpcs, sqlchemy.Equals(wires.Field("vpc_id"), vpcs.Field("id"))).
|
||||
Filter(
|
||||
sqlchemy.OR(
|
||||
sqlchemy.In(wires.Field("zone_id"), zoneIds),
|
||||
sqlchemy.In(vpcs.Field("cloudregion_id"), regionIds),
|
||||
),
|
||||
)
|
||||
q = q.In("wire_id", sq.SubQuery())
|
||||
}
|
||||
|
||||
vpcStr, _ := query.GetString("vpc")
|
||||
|
||||
Reference in New Issue
Block a user