From 313a8983608b2f0cc3e72080bfb5a14525f941a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Sat, 13 Apr 2019 19:55:09 +0800 Subject: [PATCH] Hotfix/qx cloudprovider info (#368) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 通用返回cloudprovider info信息 * 通用返回cloudprovider info信息 --- pkg/compute/models/cloudregionresource.go | 37 ++++++++++++++++ pkg/compute/models/loadbalanceracls.go | 22 +++++++++- .../models/loadbalancerbackendgroups.go | 6 ++- pkg/compute/models/loadbalancerbackends.go | 20 ++++++++- .../models/loadbalancercertificates.go | 21 ++++++++- .../models/loadbalancerlistenerrules.go | 7 ++- pkg/compute/models/loadbalancerlisteners.go | 23 +++++----- pkg/compute/models/loadbalancers.go | 44 ++++++++++++------- pkg/compute/models/managedresource.go | 27 ++++++++++++ pkg/compute/models/zoneresource.go | 38 ++++++++++++++++ 10 files changed, 213 insertions(+), 32 deletions(-) create mode 100644 pkg/compute/models/cloudregionresource.go create mode 100644 pkg/compute/models/zoneresource.go diff --git a/pkg/compute/models/cloudregionresource.go b/pkg/compute/models/cloudregionresource.go new file mode 100644 index 0000000000..5b662e4206 --- /dev/null +++ b/pkg/compute/models/cloudregionresource.go @@ -0,0 +1,37 @@ +package models + +import ( + "context" + + "yunion.io/x/jsonutils" + "yunion.io/x/log" + "yunion.io/x/onecloud/pkg/mcclient" +) + +type SCloudregionResourceBase struct { + CloudregionId string `width:"36" charset:"ascii" nullable:"false" list:"admin" default:"default" create:"optional"` +} + +func (self *SCloudregionResourceBase) GetRegion() *SCloudregion { + region, err := CloudregionManager.FetchById(self.CloudregionId) + if err != nil { + log.Errorf("failed to find cloudregion %s error: %v", self.CloudregionId, err) + return nil + } + return region.(*SCloudregion) +} + +func (self *SCloudregionResourceBase) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict { + region := self.GetRegion() + if region == nil { + return nil + } + info := map[string]string{ + "region": region.GetName(), + "region_id": region.GetId(), + } + if len(region.ExternalId) > 0 { + info["region_ext_id"] = fetchExternalId(region.ExternalId) + } + return jsonutils.Marshal(info).(*jsonutils.JSONDict) +} diff --git a/pkg/compute/models/loadbalanceracls.go b/pkg/compute/models/loadbalanceracls.go index f6b7abc425..b37875a797 100644 --- a/pkg/compute/models/loadbalanceracls.go +++ b/pkg/compute/models/loadbalanceracls.go @@ -120,9 +120,9 @@ func init() { type SLoadbalancerAcl struct { db.SSharableVirtualResourceBase SManagedResourceBase + SCloudregionResourceBase - CloudregionId string `width:"36" charset:"ascii" nullable:"false" list:"admin" default:"default" create:"required"` - AclEntries *SLoadbalancerAclEntries `list:"user" update:"user" create:"required"` + AclEntries *SLoadbalancerAclEntries `list:"user" update:"user" create:"required"` } func loadbalancerAclsValidateAclEntries(data *jsonutils.JSONDict, update bool) (*jsonutils.JSONDict, error) { @@ -222,6 +222,24 @@ func (lbacl *SLoadbalancerAcl) GetIRegion() (cloudprovider.ICloudRegion, error) return provider.GetIRegionById(region.ExternalId) } +func (lbacl *SLoadbalancerAcl) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict { + extra := lbacl.SSharableVirtualResourceBase.GetCustomizeColumns(ctx, userCred, query) + providerInfo := lbacl.SManagedResourceBase.GetCustomizeColumns(ctx, userCred, query) + if providerInfo != nil { + extra.Update(providerInfo) + } + regionInfo := lbacl.SCloudregionResourceBase.GetCustomizeColumns(ctx, userCred, query) + if regionInfo != nil { + extra.Update(regionInfo) + } + return extra +} + +func (lbacl *SLoadbalancerAcl) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*jsonutils.JSONDict, error) { + extra := lbacl.GetCustomizeColumns(ctx, userCred, query) + return extra, nil +} + func (lbacl *SLoadbalancerAcl) AllowPerformPatch(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data *jsonutils.JSONDict) bool { return lbacl.IsOwner(userCred) || db.IsAdminAllowPerform(userCred, lbacl, "patch") } diff --git a/pkg/compute/models/loadbalancerbackendgroups.go b/pkg/compute/models/loadbalancerbackendgroups.go index 91be91d4c5..b51ca927b1 100644 --- a/pkg/compute/models/loadbalancerbackendgroups.go +++ b/pkg/compute/models/loadbalancerbackendgroups.go @@ -55,8 +55,8 @@ func init() { type SLoadbalancerBackendGroup struct { db.SVirtualResourceBase SManagedResourceBase + SCloudregionResourceBase - CloudregionId string `width:"36" charset:"ascii" nullable:"false" list:"admin" default:"default" create:"optional"` Type string `width:"36" charset:"ascii" nullable:"false" list:"user" default:"normal" create:"optional"` LoadbalancerId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"optional"` } @@ -262,6 +262,10 @@ func (lbbg *SLoadbalancerBackendGroup) GetCustomizeColumns(ctx context.Context, } extra.Set("loadbalancer", jsonutils.NewString(lb.GetName())) } + regionInfo := lbbg.SCloudregionResourceBase.GetCustomizeColumns(ctx, userCred, query) + if regionInfo != nil { + extra.Update(regionInfo) + } return extra } diff --git a/pkg/compute/models/loadbalancerbackends.go b/pkg/compute/models/loadbalancerbackends.go index 72781b45ae..f914ad1daa 100644 --- a/pkg/compute/models/loadbalancerbackends.go +++ b/pkg/compute/models/loadbalancerbackends.go @@ -54,8 +54,8 @@ func init() { type SLoadbalancerBackend struct { db.SVirtualResourceBase SManagedResourceBase + SCloudregionResourceBase - CloudregionId string `width:"36" charset:"ascii" nullable:"false" list:"admin" default:"default" create:"optional"` BackendGroupId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"optional"` BackendId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"optional"` BackendType string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"optional"` @@ -228,6 +228,24 @@ func (lbb *SLoadbalancerBackend) PostCreate(ctx context.Context, userCred mcclie } } +func (lbb *SLoadbalancerBackend) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict { + extra := lbb.SVirtualResourceBase.GetCustomizeColumns(ctx, userCred, query) + providerInfo := lbb.SManagedResourceBase.GetCustomizeColumns(ctx, userCred, query) + if providerInfo != nil { + extra.Update(providerInfo) + } + regionInfo := lbb.SCloudregionResourceBase.GetCustomizeColumns(ctx, userCred, query) + if regionInfo != nil { + extra.Update(regionInfo) + } + return extra +} + +func (lbb *SLoadbalancerBackend) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*jsonutils.JSONDict, error) { + extra := lbb.GetCustomizeColumns(ctx, userCred, query) + return extra, nil +} + func (lbb *SLoadbalancerBackend) StartLoadBalancerBackendCreateTask(ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string) error { task, err := taskman.TaskManager.NewTask(ctx, "LoadbalancerBackendCreateTask", lbb, userCred, nil, parentTaskId, "", nil) if err != nil { diff --git a/pkg/compute/models/loadbalancercertificates.go b/pkg/compute/models/loadbalancercertificates.go index e75a63599e..a1738930fb 100644 --- a/pkg/compute/models/loadbalancercertificates.go +++ b/pkg/compute/models/loadbalancercertificates.go @@ -64,6 +64,7 @@ func init() { type SLoadbalancerCertificate struct { db.SVirtualResourceBase SManagedResourceBase + SCloudregionResourceBase Certificate string `create:"required" list:"user" update:"user"` PrivateKey string `create:"required" list:"admin" update:"user"` @@ -77,8 +78,6 @@ type SLoadbalancerCertificate struct { NotAfter time.Time `create:"optional" list:"user" update:"user"` CommonName string `create:"optional" list:"user" update:"user"` SubjectAlternativeNames string `create:"optional" list:"user" update:"user"` - - CloudregionId string `width:"36" charset:"ascii" nullable:"false" list:"admin" default:"default" create:"optional"` } func (man *SLoadbalancerCertificateManager) pendingDeleteSubs(ctx context.Context, userCred mcclient.TokenCredential, q *sqlchemy.SQuery) { @@ -227,6 +226,24 @@ func (lbcert *SLoadbalancerCertificate) PostCreate(ctx context.Context, userCred } } +func (lbcert *SLoadbalancerCertificate) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict { + extra := lbcert.SVirtualResourceBase.GetCustomizeColumns(ctx, userCred, query) + providerInfo := lbcert.SManagedResourceBase.GetCustomizeColumns(ctx, userCred, query) + if providerInfo != nil { + extra.Update(providerInfo) + } + regionInfo := lbcert.SCloudregionResourceBase.GetCustomizeColumns(ctx, userCred, query) + if regionInfo != nil { + extra.Update(regionInfo) + } + return extra +} + +func (lbcert *SLoadbalancerCertificate) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*jsonutils.JSONDict, error) { + extra := lbcert.GetCustomizeColumns(ctx, userCred, query) + return extra, nil +} + func (lbcert *SLoadbalancerCertificate) StartLoadBalancerCertificateCreateTask(ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string) error { task, err := taskman.TaskManager.NewTask(ctx, "LoadbalancerCertificateCreateTask", lbcert, userCred, nil, parentTaskId, "", nil) if err != nil { diff --git a/pkg/compute/models/loadbalancerlistenerrules.go b/pkg/compute/models/loadbalancerlistenerrules.go index d5b51777d9..1821532a1b 100644 --- a/pkg/compute/models/loadbalancerlistenerrules.go +++ b/pkg/compute/models/loadbalancerlistenerrules.go @@ -54,8 +54,8 @@ func init() { type SLoadbalancerListenerRule struct { db.SVirtualResourceBase SManagedResourceBase + SCloudregionResourceBase - CloudregionId string `width:"36" charset:"ascii" nullable:"false" list:"admin" default:"default" create:"optional"` ListenerId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"optional"` BackendGroupId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"optional" update:"user"` @@ -249,6 +249,11 @@ func (lbr *SLoadbalancerListenerRule) GetCustomizeColumns(ctx context.Context, u return extra } extra.Set("backend_group", jsonutils.NewString(lbbg.GetName())) + + regionInfo := lbr.SCloudregionResourceBase.GetCustomizeColumns(ctx, userCred, query) + if regionInfo != nil { + extra.Update(regionInfo) + } return extra } diff --git a/pkg/compute/models/loadbalancerlisteners.go b/pkg/compute/models/loadbalancerlisteners.go index 38b04601dc..98e980d4ae 100644 --- a/pkg/compute/models/loadbalancerlisteners.go +++ b/pkg/compute/models/loadbalancerlisteners.go @@ -104,8 +104,8 @@ type SLoadbalancerHTTPSListener struct { type SLoadbalancerListener struct { db.SVirtualResourceBase SManagedResourceBase + SCloudregionResourceBase - CloudregionId string `width:"36" charset:"ascii" nullable:"false" list:"admin" default:"default" create:"optional"` LoadbalancerId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"optional"` ListenerType string `width:"16" charset:"ascii" nullable:"false" list:"user" create:"required"` ListenerPort int `nullable:"false" list:"user" create:"required"` @@ -500,16 +500,19 @@ func (lblis *SLoadbalancerListener) GetCustomizeColumns(ctx context.Context, use extra.Set("loadbalancer", jsonutils.NewString(lb.GetName())) } { - if lblis.BackendGroupId == "" { - return extra + if lblis.BackendGroupId != "" { + lbbg, err := LoadbalancerBackendGroupManager.FetchById(lblis.BackendGroupId) + if err != nil { + log.Errorf("loadbalancer listener %s(%s): fetch backend group (%s) error: %s", + lblis.Name, lblis.Id, lblis.BackendGroupId, err) + return extra + } + extra.Set("backend_group", jsonutils.NewString(lbbg.GetName())) } - lbbg, err := LoadbalancerBackendGroupManager.FetchById(lblis.BackendGroupId) - if err != nil { - log.Errorf("loadbalancer listener %s(%s): fetch backend group (%s) error: %s", - lblis.Name, lblis.Id, lblis.BackendGroupId, err) - return extra - } - extra.Set("backend_group", jsonutils.NewString(lbbg.GetName())) + } + regionInfo := lblis.SCloudregionResourceBase.GetCustomizeColumns(ctx, userCred, query) + if regionInfo != nil { + extra.Update(regionInfo) } return extra } diff --git a/pkg/compute/models/loadbalancers.go b/pkg/compute/models/loadbalancers.go index 50c293f024..c71e24e41b 100644 --- a/pkg/compute/models/loadbalancers.go +++ b/pkg/compute/models/loadbalancers.go @@ -65,14 +65,14 @@ func init() { type SLoadbalancer struct { db.SVirtualResourceBase SManagedResourceBase + SCloudregionResourceBase + SZoneResourceBase - Address string `width:"16" charset:"ascii" nullable:"true" list:"user" create:"optional"` - AddressType string `width:"16" charset:"ascii" nullable:"false" list:"user" create:"optional"` - NetworkType string `width:"16" charset:"ascii" nullable:"false" list:"user" create:"optional"` - NetworkId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"optional"` - VpcId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"optional"` - ZoneId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"optional"` - CloudregionId string `width:"36" charset:"ascii" nullable:"false" list:"admin" default:"default" create:"optional"` + Address string `width:"16" charset:"ascii" nullable:"true" list:"user" create:"optional"` + AddressType string `width:"16" charset:"ascii" nullable:"false" list:"user" create:"optional"` + NetworkType string `width:"16" charset:"ascii" nullable:"false" list:"user" create:"optional"` + NetworkId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"optional"` + VpcId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"optional"` ChargeType string `list:"user" get:"user" create:"optional"` LoadbalancerSpec string `list:"user" get:"user" create:"optional"` @@ -407,16 +407,30 @@ func (lb *SLoadbalancer) ValidateUpdateData(ctx context.Context, userCred mcclie func (lb *SLoadbalancer) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict { extra := lb.SVirtualResourceBase.GetCustomizeColumns(ctx, userCred, query) - if lb.BackendGroupId == "" { - return extra + providerInfo := lb.SManagedResourceBase.GetCustomizeColumns(ctx, userCred, query) + if providerInfo != nil { + extra.Update(providerInfo) } - lbbg, err := LoadbalancerBackendGroupManager.FetchById(lb.BackendGroupId) - if err != nil { - log.Errorf("loadbalancer %s(%s): fetch backend group (%s) error: %s", - lb.Name, lb.Id, lb.BackendGroupId, err) - return extra + + zoneInfo := lb.SZoneResourceBase.GetCustomizeColumns(ctx, userCred, query) + if zoneInfo != nil { + extra.Update(zoneInfo) + } else { + regionInfo := lb.SCloudregionResourceBase.GetCustomizeColumns(ctx, userCred, query) + if regionInfo != nil { + extra.Update(regionInfo) + } + } + + if lb.BackendGroupId != "" { + lbbg, err := LoadbalancerBackendGroupManager.FetchById(lb.BackendGroupId) + if err != nil { + log.Errorf("loadbalancer %s(%s): fetch backend group (%s) error: %s", + lb.Name, lb.Id, lb.BackendGroupId, err) + return extra + } + extra.Set("backend_group", jsonutils.NewString(lbbg.GetName())) } - extra.Set("backend_group", jsonutils.NewString(lbbg.GetName())) return extra } diff --git a/pkg/compute/models/managedresource.go b/pkg/compute/models/managedresource.go index a264c98b8f..7eb175069c 100644 --- a/pkg/compute/models/managedresource.go +++ b/pkg/compute/models/managedresource.go @@ -15,6 +15,7 @@ package models import ( + "context" "database/sql" "fmt" "strings" @@ -26,6 +27,7 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/httperrors" + "yunion.io/x/onecloud/pkg/mcclient" ) type SManagedResourceBase struct { @@ -47,6 +49,31 @@ func (self *SManagedResourceBase) GetCloudaccount() *SCloudaccount { return cp.GetCloudaccount() } +func (self *SManagedResourceBase) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict { + provider := self.GetCloudprovider() + if provider == nil { + return nil + } + info := map[string]string{ + "manager": provider.GetName(), + "manager_id": provider.GetId(), + "provider": provider.Provider, + } + if len(provider.ProjectId) > 0 { + info["manager_project_id"] = provider.ProjectId + tc, err := db.TenantCacheManager.FetchTenantById(appctx.Background, provider.ProjectId) + if err == nil { + info["manager_project"] = tc.GetName() + } + } + + account := provider.GetCloudaccount() + info["account"] = account.GetName() + info["account_id"] = account.GetId() + + return jsonutils.Marshal(info).(*jsonutils.JSONDict) +} + func (self *SManagedResourceBase) GetProviderFactory() (cloudprovider.ICloudProviderFactory, error) { provider := self.GetCloudprovider() if provider == nil { diff --git a/pkg/compute/models/zoneresource.go b/pkg/compute/models/zoneresource.go new file mode 100644 index 0000000000..efa427b74c --- /dev/null +++ b/pkg/compute/models/zoneresource.go @@ -0,0 +1,38 @@ +package models + +import ( + "context" + + "yunion.io/x/jsonutils" + "yunion.io/x/onecloud/pkg/mcclient" +) + +type SZoneResourceBase struct { + ZoneId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"optional"` +} + +func (self *SZoneResourceBase) GetZone() *SZone { + return ZoneManager.FetchZoneById(self.ZoneId) +} + +func (self *SZoneResourceBase) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict { + zone := self.GetZone() + if zone == nil { + return nil + } + info := map[string]string{ + "zone": zone.GetName(), + "zone_id": zone.GetId(), + } + if len(zone.ExternalId) > 0 { + info["zone_ext_id"] = fetchExternalId(zone.ExternalId) + } + if region := zone.GetRegion(); region != nil { + info["region"] = region.GetName() + info["region_id"] = region.GetId() + if len(region.ExternalId) > 0 { + info["region_ext_id"] = fetchExternalId(region.ExternalId) + } + } + return jsonutils.Marshal(info).(*jsonutils.JSONDict) +}