From 74f0d51aee3c3e4ae7178ce5d763d96333b9c84a Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Wed, 19 May 2021 19:25:35 +0800 Subject: [PATCH] fix(region): check sku request error --- pkg/apis/compute/loadbalancercertificate.go | 2 + pkg/compute/models/cloudproviders.go | 1 + .../models/loadbalancercertificates.go | 8 ++- pkg/compute/models/purge.go | 57 +++++++++++++++++++ pkg/compute/models/skus_tools.go | 3 + 5 files changed, 69 insertions(+), 2 deletions(-) diff --git a/pkg/apis/compute/loadbalancercertificate.go b/pkg/apis/compute/loadbalancercertificate.go index 692a020eed..34294fbcbf 100644 --- a/pkg/apis/compute/loadbalancercertificate.go +++ b/pkg/apis/compute/loadbalancercertificate.go @@ -21,6 +21,8 @@ type LoadbalancerCertificateDetails struct { SLoadbalancerCertificate LbListenerCount int `json:"lb_listener_count"` + // 证书内容是否完整 + IsComplete bool `json:"is_complete"` } type LoadbalancerCertificateResourceInfo struct { diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index 76580fcb9d..60d32c92ff 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -1436,6 +1436,7 @@ func (self *SCloudprovider) RealDelete(ctx context.Context, userCred mcclient.To LoadbalancerBackendGroupManager, CachedLoadbalancerAclManager, CachedLoadbalancerCertificateManager, + LoadbalancerCertificateManager, NatGatewayManager, DBInstanceManager, DBInstanceBackupManager, diff --git a/pkg/compute/models/loadbalancercertificates.go b/pkg/compute/models/loadbalancercertificates.go index b20bbbfa62..3cd0944a06 100644 --- a/pkg/compute/models/loadbalancercertificates.go +++ b/pkg/compute/models/loadbalancercertificates.go @@ -22,7 +22,6 @@ import ( "encoding/hex" "encoding/pem" "fmt" - "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/errors" @@ -77,7 +76,7 @@ type SLoadbalancerCertificate struct { func (lbcert *SLoadbalancerCertificate) GetCachedCerts() ([]SCachedLoadbalancerCertificate, error) { ret := []SCachedLoadbalancerCertificate{} - q := CachedLoadbalancerCertificateManager.Query().Equals("certificate_id", lbcert.Id) + q := CachedLoadbalancerCertificateManager.Query().Equals("certificate_id", lbcert.Id).IsFalse("pending_deleted") err := db.FetchModelObjects(CachedLoadbalancerCertificateManager, q, &ret) if err != nil { return nil, err @@ -131,6 +130,10 @@ func (lbcert *SLoadbalancerCertificate) GetExtraDetails( return api.LoadbalancerCertificateDetails{}, nil } +func (lbcert *SLoadbalancerCertificate) IsComplete() bool { + return lbcert.PrivateKey != "" && lbcert.Certificate != "" +} + func (manager *SLoadbalancerCertificateManager) FetchCustomizeColumns( ctx context.Context, userCred mcclient.TokenCredential, @@ -146,6 +149,7 @@ func (manager *SLoadbalancerCertificateManager) FetchCustomizeColumns( for i := range rows { rows[i] = api.LoadbalancerCertificateDetails{ SharableVirtualResourceDetails: virtRows[i], + IsComplete: objs[i].(*SLoadbalancerCertificate).IsComplete(), } } diff --git a/pkg/compute/models/purge.go b/pkg/compute/models/purge.go index a76e121365..23e43ea699 100644 --- a/pkg/compute/models/purge.go +++ b/pkg/compute/models/purge.go @@ -31,6 +31,8 @@ import ( "yunion.io/x/onecloud/pkg/util/rbacutils" ) +var LB_CERTS_TO_BE_PURGE = map[string][]string{} + type IPurgeableManager interface { Keyword() string purgeAll(ctx context.Context, userCred mcclient.TokenCredential, providerId string) error @@ -195,12 +197,23 @@ func (manager *SCachedLoadbalancerCertificateManager) purgeAll(ctx context.Conte if err != nil { return err } + + lbcertIds := []string{} + if certs, ok := LB_CERTS_TO_BE_PURGE[providerId]; ok { + lbcertIds = certs + } + for i := range lbcs { err := lbcs[i].purge(ctx, userCred) if err != nil { return err } + + if len(lbcs[i].CertificateId) > 0 && !utils.IsInStringArray(lbcs[i].CertificateId, lbcertIds) { + lbcertIds = append(lbcertIds, lbcs[i].CertificateId) + } } + LB_CERTS_TO_BE_PURGE[providerId] = lbcertIds return nil } @@ -216,6 +229,50 @@ func (lbcert *SCachedLoadbalancerCertificate) purge(ctx context.Context, userCre return lbcert.DoPendingDelete(ctx, userCred) } +func (manager *SLoadbalancerCertificateManager) purgeAll(ctx context.Context, userCred mcclient.TokenCredential, providerId string) error { + if certs, ok := LB_CERTS_TO_BE_PURGE[providerId]; ok { + lbcs := make([]SLoadbalancerCertificate, 0) + err := db.FetchModelObjects(manager, manager.Query().In("id", certs), &lbcs) + if err != nil { + return err + } + for i := range lbcs { + err := lbcs[i].purge(ctx, userCred) + if err != nil { + return err + } + } + + delete(LB_CERTS_TO_BE_PURGE, providerId) + } + return nil +} + +func (lbcert *SLoadbalancerCertificate) purge(ctx context.Context, userCred mcclient.TokenCredential) error { + lockman.LockObject(ctx, lbcert) + defer lockman.ReleaseObject(ctx, lbcert) + + if !lbcert.PendingDeleted { + // 内容完整的证书不需要删除 + if lbcert.IsComplete() { + return nil + } + + caches, err := lbcert.GetCachedCerts() + if err != nil { + return errors.Wrap(err, "GetCachedCerts") + } + + if len(caches) > 0 { + log.Debugf("the lb cert %s (%s) is in use.can not purge.", lbcert.Name, lbcert.Id) + return nil + } + return lbcert.DoPendingDelete(ctx, userCred) + } + + return nil +} + func (manager *SCachedLoadbalancerAclManager) purgeAll(ctx context.Context, userCred mcclient.TokenCredential, providerId string) error { lbacls := make([]SCachedLoadbalancerAcl, 0) err := fetchByManagerId(manager, providerId, &lbacls) diff --git a/pkg/compute/models/skus_tools.go b/pkg/compute/models/skus_tools.go index 11193488a7..cf3279bc3a 100644 --- a/pkg/compute/models/skus_tools.go +++ b/pkg/compute/models/skus_tools.go @@ -357,6 +357,9 @@ func (self *SSkuResourcesMeta) _get(url string) ([]jsonutils.JSONObject, error) } jsonContent, err := self.request(url) + if err != nil { + return nil, errors.Wrapf(err, "request %s", url) + } var ret []jsonutils.JSONObject err = jsonContent.Unmarshal(&ret) if err != nil {