diff --git a/pkg/apis/compute/vpcs_const.go b/pkg/apis/compute/vpcs_const.go index e8d5538845..d914ac4b29 100644 --- a/pkg/apis/compute/vpcs_const.go +++ b/pkg/apis/compute/vpcs_const.go @@ -53,6 +53,7 @@ type VpcListInput struct { ManagedResourceListInput UsableResourceListInput + UsableVpcResourceListInput // filter by globalvpc Globalvpc string `json:"globalvpc"` diff --git a/pkg/compute/models/vpcs.go b/pkg/compute/models/vpcs.go index 478ed81d71..408b6b2537 100644 --- a/pkg/compute/models/vpcs.go +++ b/pkg/compute/models/vpcs.go @@ -794,7 +794,9 @@ func (manager *SVpcManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQue return nil, err } - if query.Usable != nil && *query.Usable { + usable := (query.Usable != nil && *query.Usable) + vpcUsable := (query.UsableVpc != nil && *query.UsableVpc) + if vpcUsable || usable { regions := CloudregionManager.Query().SubQuery() cloudproviders := CloudproviderManager.Query().SubQuery() providerSQ := cloudproviders.Query(cloudproviders.Field("id")).Filter( @@ -814,14 +816,17 @@ func (manager *SVpcManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQue ), ), ) - wires := WireManager.Query().SubQuery() - networks := NetworkManager.Query().SubQuery() - sq := wires.Query(wires.Field("vpc_id")).Join(networks, sqlchemy.Equals(wires.Field("id"), networks.Field("wire_id"))).Filter( - sqlchemy.Equals(networks.Field("status"), api.NETWORK_STATUS_AVAILABLE), - ) + if usable { + wires := WireManager.Query().SubQuery() + networks := NetworkManager.Query().SubQuery() - q = q.In("id", sq.SubQuery()) + sq := wires.Query(wires.Field("vpc_id")).Join(networks, sqlchemy.Equals(wires.Field("id"), networks.Field("wire_id"))).Filter( + sqlchemy.Equals(networks.Field("status"), api.NETWORK_STATUS_AVAILABLE), + ) + + q = q.In("id", sq.SubQuery()) + } } globalVpcStr := query.Globalvpc