From 0d6a9f33c60e69ec3733d2fa6cf0d7b07571a2f3 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Thu, 23 Aug 2018 13:32:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=EF=BC=9A=E9=80=9A=E8=BF=87cl?= =?UTF-8?q?oud=20provider=E6=9D=A5=E8=BF=87=E6=BB=A4=E8=99=9A=E6=8B=9F?= =?UTF-8?q?=E6=9C=BA=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/climc/shell/servers.go | 4 +++ pkg/compute/models/guests.go | 61 ++++++++++++++++++++++++------------ 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/cmd/climc/shell/servers.go b/cmd/climc/shell/servers.go index fe663182b6..f0d74b5d59 100644 --- a/cmd/climc/shell/servers.go +++ b/cmd/climc/shell/servers.go @@ -64,6 +64,7 @@ func init() { Secgroup string `help:"Secgroup ID or Name"` AdminSecgroup string `help:"AdminSecgroup ID or Name"` Hypervisor string `help:"Show server of hypervisor" choices:"kvm|esxi|container|baremetal|aliyun"` + Manager string `help:"Show servers imported from manager"` BaseListOptions } R(&ServerListOptions{}, "server-list", "List virtual servers", func(s *mcclient.ClientSession, args *ServerListOptions) error { @@ -98,6 +99,9 @@ func init() { if len(args.Hypervisor) > 0 { params.Add(jsonutils.NewString(args.Hypervisor), "hypervisor") } + if len(args.Manager) > 0 { + params.Add(jsonutils.NewString(args.Manager), "manager") + } result, err := modules.Servers.List(s, params) if err != nil { return err diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 401bdbd1b0..7b91be0760 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -202,49 +202,60 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ if len(hypervisor) > 0 { q = q.Equals("hypervisor", hypervisor) } + hostFilter, _ := queryDict.GetString("host") - zoneFilter, _ := queryDict.GetString("zone") - wireFilter, _ := queryDict.GetString("wire") - networkFilter, _ := queryDict.GetString("network") - diskFilter, _ := queryDict.GetString("disk") - var sq *sqlchemy.SSubQuery if len(hostFilter) > 0 { host, _ := HostManager.FetchByIdOrName("", hostFilter) if host == nil { - return nil, httperrors.NewResourceNotFoundError(fmt.Sprintf("host %s not found", hostFilter)) + return nil, httperrors.NewResourceNotFoundError("host %s not found", hostFilter) } - sq = HostManager.Query("id").Equals("id", host.GetId()).SubQuery() - } else if len(zoneFilter) > 0 { + q = q.Equals("host_id", host.GetId()) + } + + zoneFilter, _ := queryDict.GetString("zone") + if len(zoneFilter) > 0 { zone, _ := ZoneManager.FetchByIdOrName("", zoneFilter) if zone == nil { - return nil, httperrors.NewResourceNotFoundError(fmt.Sprintf("zone %s not found", zoneFilter)) + return nil, httperrors.NewResourceNotFoundError("zone %s not found", zoneFilter) } hostTable := HostManager.Query().SubQuery() zoneTable := ZoneManager.Query().SubQuery() - sq = hostTable.Query(hostTable.Field("id")).Join(zoneTable, + sq := hostTable.Query(hostTable.Field("id")).Join(zoneTable, sqlchemy.Equals(zoneTable.Field("id"), hostTable.Field("zone_id"))).Filter(sqlchemy.Equals(zoneTable.Field("id"), zone.GetId())).SubQuery() - } else if len(wireFilter) > 0 { + q = q.In("host_id", sq) + } + + wireFilter, _ := queryDict.GetString("wire") + if len(wireFilter) > 0 { wire, _ := WireManager.FetchByIdOrName("", wireFilter) if wire == nil { - return nil, httperrors.NewResourceNotFoundError(fmt.Sprintf("wire %s not found", wireFilter)) + return nil, httperrors.NewResourceNotFoundError("wire %s not found", wireFilter) } hostTable := HostManager.Query().SubQuery() hostWire := HostwireManager.Query().SubQuery() - sq = hostTable.Query(hostTable.Field("id")).Join(hostWire, sqlchemy.Equals(hostWire.Field("host_id"), hostTable.Field("id"))).Filter(sqlchemy.Equals(hostWire.Field("wire_id"), wire.GetId())).SubQuery() - } else if len(networkFilter) > 0 { + sq := hostTable.Query(hostTable.Field("id")).Join(hostWire, sqlchemy.Equals(hostWire.Field("host_id"), hostTable.Field("id"))).Filter(sqlchemy.Equals(hostWire.Field("wire_id"), wire.GetId())).SubQuery() + q = q.In("host_id", sq) + } + + networkFilter, _ := queryDict.GetString("network") + if len(networkFilter) > 0 { netI, _ := NetworkManager.FetchByIdOrName(userCred.GetProjectId(), networkFilter) if netI == nil { - return nil, httperrors.NewResourceNotFoundError(fmt.Sprintf("network %s not found", networkFilter)) + return nil, httperrors.NewResourceNotFoundError("network %s not found", networkFilter) } net := netI.(*SNetwork) hostTable := HostManager.Query().SubQuery() hostWire := HostwireManager.Query().SubQuery() - sq = hostTable.Query(hostTable.Field("id")).Join(hostWire, + sq := hostTable.Query(hostTable.Field("id")).Join(hostWire, sqlchemy.Equals(hostWire.Field("host_id"), hostTable.Field("id"))).Filter(sqlchemy.Equals(hostWire.Field("wire_id"), net.WireId)).SubQuery() - } else if len(diskFilter) > 0 { + q = q.In("host_id", sq) + } + + diskFilter, _ := queryDict.GetString("disk") + if len(diskFilter) > 0 { diskI, _ := DiskManager.FetchByIdOrName(userCred.GetProjectId(), diskFilter) if diskI == nil { - return nil, httperrors.NewResourceNotFoundError(fmt.Sprintf("disk %s not found", diskFilter)) + return nil, httperrors.NewResourceNotFoundError("disk %s not found", diskFilter) } disk := diskI.(*SDisk) guestdisks := GuestdiskManager.Query().SubQuery() @@ -261,7 +272,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ hosts := HostManager.Query().SubQuery() hoststorages := HoststorageManager.Query().SubQuery() storages := StorageManager.Query().SubQuery() - sq = hosts.Query(hosts.Field("id")). + sq := hosts.Query(hosts.Field("id")). Join(hoststorages, sqlchemy.AND( sqlchemy.Equals(hoststorages.Field("host_id"), hosts.Field("id")), sqlchemy.IsFalse(hoststorages.Field("deleted")))). @@ -269,11 +280,21 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ sqlchemy.Equals(storages.Field("id"), hoststorages.Field("storage_id")), sqlchemy.IsFalse(storages.Field("deleted")))). Filter(sqlchemy.Equals(storages.Field("id"), disk.StorageId)).SubQuery() + q = q.In("host_id", sq) } } - if sq != nil { + + managerFilter, _ := queryDict.GetString("manager") + if len(managerFilter) > 0 { + managerI, _ := CloudproviderManager.FetchByIdOrName(userCred.GetProjectId(), managerFilter) + if managerI == nil { + return nil, httperrors.NewResourceNotFoundError("cloud provider %s not found", managerFilter) + } + hosts := HostManager.Query().SubQuery() + sq := hosts.Query(hosts.Field("id")).Equals("manager_id", managerI.GetId()).SubQuery() q = q.In("host_id", sq) } + gpu, _ := queryDict.GetString("gpu") if len(gpu) != 0 { isodev := IsolatedDeviceManager.Query().SubQuery()