Merge pull request #3669 from ioito/hotfix/qx-secgroup-list-filter-by-guest

fix: 安全组列表添加server过滤参数
This commit is contained in:
yunion-ci-robot
2019-11-15 18:40:21 +08:00
committed by GitHub
4 changed files with 35 additions and 4 deletions
+4
View File
@@ -27,6 +27,7 @@ import (
func init() {
type SecGroupsListOptions struct {
Equals string `help:"Secgroup ID or Name, filter secgroups whose rules equals the specified one"`
Server string `help:"Filter secgroups bound to specified server"`
options.BaseListOptions
}
@@ -43,6 +44,9 @@ func init() {
if len(args.Equals) > 0 {
params.Add(jsonutils.NewString(args.Equals), "equals")
}
if len(args.Server) > 0 {
params.Add(jsonutils.NewString(args.Server), "server")
}
result, err := modules.SecGroups.List(s, params)
if err != nil {
return err
+5
View File
@@ -23,3 +23,8 @@ shared_projects:
description: 项目名称或ID
description: 共享到的项目列表, 仅scope=project有效
server:
name: server
in: query
type: string
description: Filter secgroups bound to specified server
+5
View File
@@ -77,3 +77,8 @@ type SSecgroupCreateInput struct {
Description string
Rules []SSecgroupRuleCreateInput
}
type SSecgroupListFilterInput struct {
Equals string
Server string
}
+21 -4
View File
@@ -71,11 +71,12 @@ type SSecurityGroup struct {
}
func (manager *SSecurityGroupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) {
equalSecgroup, _ := query.GetString("equals")
if len(equalSecgroup) > 0 {
_secgroup, err := manager.FetchByIdOrName(userCred, equalSecgroup)
input := api.SSecgroupListFilterInput{}
query.Unmarshal(&input)
if len(input.Equals) > 0 {
_secgroup, err := manager.FetchByIdOrName(userCred, input.Equals)
if err != nil {
return nil, httperrors.NewInputParameterError("Failed fetching secgroup %s", equalSecgroup)
return nil, httperrors.NewInputParameterError("Failed fetching secgroup %s", input.Equals)
}
secgroup := _secgroup.(*SSecurityGroup)
sq := manager.Query().NotEquals("id", secgroup.Id)
@@ -93,6 +94,22 @@ func (manager *SSecurityGroupManager) ListItemFilter(ctx context.Context, q *sql
}
q = q.In("id", secgroupIds)
}
if len(input.Server) > 0 {
guest, err := GuestManager.FetchByIdOrName(userCred, input.Server)
if err != nil {
if err != sql.ErrNoRows {
return nil, httperrors.NewResourceNotFoundError("failed to found server %s", input.Server)
}
return nil, httperrors.NewGeneralError(err)
}
serverId := guest.GetId()
sq1 := GuestManager.Query("secgrp_id").Equals("id", serverId).SubQuery()
sq2 := GuestsecgroupManager.Query("secgroup_id").Equals("guest_id", serverId).SubQuery()
q = q.Filter(sqlchemy.OR(
sqlchemy.In(q.Field("id"), sq1),
sqlchemy.In(q.Field("id"), sq2),
))
}
return q, nil
}