mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-10-24 02:26:39 +08:00
Merge pull request #1284 in YUNIONIO/onecloud from ~WANYAOQI/onecloud:feature/wyq/server-filter-by-vpc to release/2.8.0
* commit '11776d2781b8ea1500e1db4aec9f32f8a2df9e90': filter by not in secgroup servers filter by vpc
This commit is contained in:
@@ -345,16 +345,28 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ
|
||||
|
||||
secgrpFilter, _ := queryDict.GetString("secgroup")
|
||||
if len(secgrpFilter) > 0 {
|
||||
var notIn = false
|
||||
// HACK FOR NOT IN SECGROUP
|
||||
if strings.HasPrefix(secgrpFilter, "!") {
|
||||
secgrpFilter = secgrpFilter[1:]
|
||||
notIn = true
|
||||
}
|
||||
secgrp, _ := SecurityGroupManager.FetchByIdOrName(nil, secgrpFilter)
|
||||
if secgrp == nil {
|
||||
return nil, httperrors.NewResourceNotFoundError("secgroup %s not found", secgrpFilter)
|
||||
}
|
||||
q = q.Filter(
|
||||
sqlchemy.OR(
|
||||
sqlchemy.In(q.Field("id"), GuestsecgroupManager.Query("guest_id").Equals("secgroup_id", secgrp.GetId()).SubQuery()),
|
||||
sqlchemy.Equals(q.Field("secgrp_id"), secgrp.GetId()),
|
||||
),
|
||||
)
|
||||
|
||||
if notIn {
|
||||
filter1 := sqlchemy.NotIn(q.Field("id"),
|
||||
GuestsecgroupManager.Query("guest_id").Equals("secgroup_id", secgrp.GetId()).SubQuery())
|
||||
filter2 := sqlchemy.NotEquals(q.Field("secgrp_id"), secgrp.GetId())
|
||||
q = q.Filter(sqlchemy.AND(filter1, filter2))
|
||||
} else {
|
||||
filter1 := sqlchemy.In(q.Field("id"),
|
||||
GuestsecgroupManager.Query("guest_id").Equals("secgroup_id", secgrp.GetId()).SubQuery())
|
||||
filter2 := sqlchemy.Equals(q.Field("secgrp_id"), secgrp.GetId())
|
||||
q = q.Filter(sqlchemy.OR(filter1, filter2))
|
||||
}
|
||||
}
|
||||
|
||||
zoneFilter, _ := queryDict.GetString("zone")
|
||||
@@ -396,6 +408,23 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ
|
||||
q = q.In("host_id", sq)
|
||||
}
|
||||
|
||||
vpcFilter, err := queryDict.GetString("vpc")
|
||||
if err == nil {
|
||||
IVpc, err := VpcManager.FetchByIdOrName(userCred, vpcFilter)
|
||||
if err != nil {
|
||||
return nil, httperrors.NewResourceNotFoundError("Vpc %s not found", vpcFilter)
|
||||
}
|
||||
vpc := IVpc.(*SVpc)
|
||||
guestnetwork := GuestnetworkManager.Query().SubQuery()
|
||||
network := NetworkManager.Query().SubQuery()
|
||||
wire := WireManager.Query().SubQuery()
|
||||
sq := guestnetwork.Query(guestnetwork.Field("guest_id")).Join(network,
|
||||
sqlchemy.Equals(guestnetwork.Field("network_id"), network.Field("id"))).
|
||||
Join(wire, sqlchemy.Equals(network.Field("wire_id"), wire.Field("id"))).
|
||||
Filter(sqlchemy.Equals(wire.Field("vpc_id"), vpc.Id)).SubQuery()
|
||||
q = q.In("id", sq)
|
||||
}
|
||||
|
||||
diskFilter, _ := queryDict.GetString("disk")
|
||||
if len(diskFilter) > 0 {
|
||||
diskI, _ := DiskManager.FetchByIdOrName(userCred, diskFilter)
|
||||
@@ -1348,6 +1377,17 @@ func (self *SGuest) moreExtraInfo(extra *jsonutils.JSONDict) *jsonutils.JSONDict
|
||||
extra.Add(jsonutils.JSONTrue, "can_recycle")
|
||||
}
|
||||
|
||||
guestnetworks, _ := self.GetNetworks("")
|
||||
if len(guestnetworks) > 0 {
|
||||
guestnetwork := guestnetworks[0]
|
||||
network := guestnetwork.GetNetwork()
|
||||
if network != nil {
|
||||
vpc := network.GetVpc()
|
||||
extra.Set("vpc_id", jsonutils.NewString(vpc.Id))
|
||||
extra.Set("vpc", jsonutils.NewString(vpc.Name))
|
||||
}
|
||||
}
|
||||
|
||||
return extra
|
||||
}
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ type ServerListOptions struct {
|
||||
WithoutEip *bool `help:"Show Servers without EIP"`
|
||||
OsType string `help:"OS Type" choices:"linux|windows|vmware"`
|
||||
OrderByDisk string `help:"Order by disk" choices:"asc|desc"`
|
||||
Vpc string `help:"Vpc id or name"`
|
||||
|
||||
ResourceType string `help:"Resource type" choices:"shared|prepaid|dedicated"`
|
||||
|
||||
|
||||
Reference in New Issue
Block a user