diff --git a/cmd/climc/shell/servers.go b/cmd/climc/shell/servers.go index 0a3b49acfb..845c02a16c 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 c5dec34277..8ecba69d47 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -205,49 +205,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() @@ -264,7 +275,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")))). @@ -272,11 +283,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() @@ -906,11 +927,7 @@ func (self *SGuest) GetCustomizeColumns(ctx context.Context, userCred mcclient.T // extra.Add(jsonutils.NewString(self.getFlavorName()), "flavor") extra.Add(jsonutils.NewString(self.getKeypairName()), "keypair") extra.Add(jsonutils.NewInt(int64(self.getExtBandwidth())), "ext_bw") - zone := self.getZone() - if zone != nil { - extra.Add(jsonutils.NewString(zone.Id), "zone_id") - extra.Add(jsonutils.NewString(zone.Name), "zone") - } + extra.Add(jsonutils.NewString(self.GetSecgroupName()), "secgroup") if self.PendingDeleted { @@ -918,6 +935,28 @@ func (self *SGuest) GetCustomizeColumns(ctx context.Context, userCred mcclient.T extra.Add(jsonutils.NewString(timeutils.FullIsoTime(pendingDeletedAt)), "auto_delete_at") } + return self.moreExtraInfo(extra) +} + +func (self *SGuest) moreExtraInfo(extra *jsonutils.JSONDict) *jsonutils.JSONDict { + zone := self.getZone() + if zone != nil { + extra.Add(jsonutils.NewString(zone.GetId()), "zone_id") + extra.Add(jsonutils.NewString(zone.GetName()), "zone") + if len(zone.ExternalId) > 0 { + extra.Add(jsonutils.NewString(zone.ExternalId), "zone_external_id") + } + + region := zone.GetRegion() + if region != nil { + extra.Add(jsonutils.NewString(region.Id), "region_id") + extra.Add(jsonutils.NewString(region.Name), "region") + + if len(region.ExternalId) > 0 { + extra.Add(jsonutils.NewString(region.ExternalId), "region_external_id") + } + } + } return extra } @@ -948,14 +987,7 @@ func (self *SGuest) GetExtraDetails(ctx context.Context, userCred mcclient.Token } extra.Add(jsonutils.NewString(self.getAdminSecurityRules()), "admin_security_rules") } - zone := self.getZone() - if zone != nil { - extra.Add(jsonutils.NewString(zone.GetId()), "zone_id") - extra.Add(jsonutils.NewString(zone.GetName()), "zone") - extra.Add(jsonutils.NewString(zone.GetRegion().GetName()), "region") - extra.Add(jsonutils.NewString(zone.GetRegion().GetId()), "region_id") - } - return extra + return self.moreExtraInfo(extra) } func (self *SGuest) getNetworksDetails() string { diff --git a/pkg/mcclient/mcclient.go b/pkg/mcclient/mcclient.go index 45ee26bc1c..b537ae1a40 100644 --- a/pkg/mcclient/mcclient.go +++ b/pkg/mcclient/mcclient.go @@ -311,10 +311,12 @@ func (this *Client) SetProject(tenantId, tenantName string, token TokenCredentia func (this *Client) NewSession(region, zone, endpointType string, token TokenCredential, apiVersion string) *ClientSession { cata := token.GetServiceCatalog() - if cata == nil { - log.Fatalf("Missing service catalog in token") + if this.serviceCatalog == nil { + if cata == nil { + log.Fatalf("Missing service catalog in token") + } + this.serviceCatalog = cata } - this.serviceCatalog = cata return &ClientSession{client: this, region: region, zone: zone, endpointType: endpointType, token: token, apiVersion: apiVersion,