From 0d6a9f33c60e69ec3733d2fa6cf0d7b07571a2f3 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Thu, 23 Aug 2018 13:32:11 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=EF=BC=9A=E9=80=9A?= =?UTF-8?q?=E8=BF=87cloud=20provider=E6=9D=A5=E8=BF=87=E6=BB=A4=E8=99=9A?= =?UTF-8?q?=E6=8B=9F=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() From e681012fd0d160f9d567887a12d3351de8f795b7 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Thu, 23 Aug 2018 18:22:47 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E8=99=9A=E6=8B=9F=E6=9C=BA=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0region=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/models/guests.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 7b91be0760..142cd8688f 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -910,6 +910,12 @@ func (self *SGuest) GetCustomizeColumns(ctx context.Context, userCred mcclient.T if zone != nil { extra.Add(jsonutils.NewString(zone.Id), "zone_id") extra.Add(jsonutils.NewString(zone.Name), "zone") + + region := zone.GetRegion() + if region != nil { + extra.Add(jsonutils.NewString(region.Id), "region_id") + extra.Add(jsonutils.NewString(region.Name), "region") + } } extra.Add(jsonutils.NewString(self.getSecgroupName()), "secgroup") @@ -951,6 +957,12 @@ func (self *SGuest) GetExtraDetails(ctx context.Context, userCred mcclient.Token if zone != nil { extra.Add(jsonutils.NewString(zone.GetId()), "zone_id") extra.Add(jsonutils.NewString(zone.GetName()), "zone") + + region := zone.GetRegion() + if region != nil { + extra.Add(jsonutils.NewString(region.Id), "region_id") + extra.Add(jsonutils.NewString(region.Name), "region") + } } return extra } From ac4275f48afcdc0b3bfb61cd99aecbff7b49fd53 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Thu, 23 Aug 2018 20:11:10 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0guest=E7=9A=84region=5Fex?= =?UTF-8?q?ternal=5Fid=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/models/guests.go | 45 ++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 142cd8688f..d47ff0e5f8 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -906,17 +906,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") - region := zone.GetRegion() - if region != nil { - extra.Add(jsonutils.NewString(region.Id), "region_id") - extra.Add(jsonutils.NewString(region.Name), "region") - } - } extra.Add(jsonutils.NewString(self.getSecgroupName()), "secgroup") if self.PendingDeleted { @@ -924,6 +914,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 } @@ -953,18 +965,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") - - region := zone.GetRegion() - if region != nil { - extra.Add(jsonutils.NewString(region.Id), "region_id") - extra.Add(jsonutils.NewString(region.Name), "region") - } - } - return extra + return self.moreExtraInfo(extra) } func (self *SGuest) getNetworksDetails() string { From 8ead2a64711c01c2fb56b9443337bbae8cef47a4 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Thu, 23 Aug 2018 20:20:00 +0800 Subject: [PATCH 4/5] minor fixes --- pkg/compute/models/guests.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 2297cba2ca..8ecba69d47 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -928,7 +928,7 @@ func (self *SGuest) GetCustomizeColumns(ctx context.Context, userCred mcclient.T extra.Add(jsonutils.NewString(self.getKeypairName()), "keypair") extra.Add(jsonutils.NewInt(int64(self.getExtBandwidth())), "ext_bw") - extra.Add(jsonutils.NewString(self.getSecgroupName()), "secgroup") + extra.Add(jsonutils.NewString(self.GetSecgroupName()), "secgroup") if self.PendingDeleted { pendingDeletedAt := self.PendingDeletedAt.Add(time.Second * time.Duration(options.Options.PendingDeleteExpireSeconds)) From 644e19e23f8fde1e758f54541f5cd549b1ed33fc Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Fri, 24 Aug 2018 11:47:46 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=9Aclient=20newsess?= =?UTF-8?q?ion=E6=97=B6=E5=80=99=EF=BC=8C=E5=A6=82=E6=9E=9Ctoken=E6=B2=A1?= =?UTF-8?q?=E6=9C=89service=20catalog=EF=BC=8C=E5=AF=BC=E8=87=B4fatal=20er?= =?UTF-8?q?ror?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/mcclient/mcclient.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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,