From 11776d2781b8ea1500e1db4aec9f32f8a2df9e90 Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Wed, 20 Mar 2019 11:59:20 +0800 Subject: [PATCH] filter by not in secgroup --- pkg/compute/models/guests.go | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index b80e2d875b..579453d8e2 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -344,16 +344,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")