diff --git a/pkg/apis/compute/guests.go b/pkg/apis/compute/guests.go index 04fb50d195..932081f5ad 100644 --- a/pkg/apis/compute/guests.go +++ b/pkg/apis/compute/guests.go @@ -58,6 +58,9 @@ type ServerListInput struct { // enum: asc,desc // OrderByDisk string `json:"order_by_disk"` + // 根据ip查找机器 + IpAddr string `json:"ip_addr"` + // 列出可以挂载指定EIP的主机 UsableServerForEip string `json:"usable_server_for_eip"` diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index b82d49122e..4952763112 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -355,6 +355,17 @@ func (manager *SGuestManager) ListItemFilter( q = q.In("host_id", sq) } + if len(query.IpAddr) > 0 { + gn := GuestnetworkManager.Query("guest_id").Contains("ip_addr", query.IpAddr).SubQuery() + guestEip := ElasticipManager.Query("associate_id").Equals("associate_type", api.EIP_ASSOCIATE_TYPE_SERVER).Contains("ip_addr", query.IpAddr).SubQuery() + q = q.LeftJoin(gn, sqlchemy.Equals(q.Field("id"), gn.Field("guest_id"))) + q = q.LeftJoin(guestEip, sqlchemy.Equals(q.Field("id"), guestEip.Field("associate_id"))) + q = q.Filter(sqlchemy.OR( + sqlchemy.IsNotNull(gn.Field("guest_id")), + sqlchemy.IsNotNull(guestEip.Field("associate_id")), + )) + } + diskFilter := query.AttachableServersForDisk if len(diskFilter) > 0 { diskI, _ := DiskManager.FetchByIdOrName(userCred, diskFilter) diff --git a/pkg/mcclient/options/servers.go b/pkg/mcclient/options/servers.go index 539ffdc01e..d93a25ad11 100644 --- a/pkg/mcclient/options/servers.go +++ b/pkg/mcclient/options/servers.go @@ -52,6 +52,7 @@ type ServerListOptions struct { WithoutUserMeta *bool `help:"Show Servers without user metadata"` Group string `help:"Instance Group ID or Name"` HostSn string `help:"Host SN"` + IpAddr string `help:"Fileter by ip"` OrderByDisk string `help:"Order by disk size" choices:"asc|desc"` OrderByHost string `help:"Order by host name" choices:"asc|desc"`