From 2a3a85f3a3d666133b117a65254f96ed7442c83c Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Fri, 19 Feb 2021 18:59:36 +0800 Subject: [PATCH] fix: get region nil pointer error --- pkg/multicloud/aws/aws.go | 14 +++++++++++++- pkg/multicloud/aws/organizations.go | 9 ++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/pkg/multicloud/aws/aws.go b/pkg/multicloud/aws/aws.go index 9d42a238cb..c4785d4ff3 100644 --- a/pkg/multicloud/aws/aws.go +++ b/pkg/multicloud/aws/aws.go @@ -198,7 +198,7 @@ func (self *SAwsClient) fetchRegions() error { return nil } - if describeRegionResult == nil || time.Now().After(describeRegionResultCacheAt.Add(time.Second*3600*describeRegionExpireHours)) { + if describeRegionResult == nil || describeRegionResultCacheAt.IsZero() || time.Now().After(describeRegionResultCacheAt.Add(time.Hour*describeRegionExpireHours)) { s, err := self.getDefaultSession() if err != nil { return errors.Wrap(err, "getDefaultSession") @@ -397,6 +397,12 @@ func (client *SAwsClient) fetchBuckets() error { // 只是使用fetchRegions初始化好的self.iregions. 本身并不从云服务器厂商拉取region信息 func (self *SAwsClient) GetRegions() []SRegion { + err := self.fetchRegions() + if err != nil { + log.Errorf("fetchRegions fail %s", err) + return nil + } + regions := make([]SRegion, len(self.iregions)) for i := 0; i < len(regions); i += 1 { region := self.iregions[i].(*SRegion) @@ -410,6 +416,12 @@ func (self *SAwsClient) GetIRegions() []cloudprovider.ICloudRegion { } func (self *SAwsClient) GetRegion(regionId string) *SRegion { + err := self.fetchRegions() + if err != nil { + log.Errorf("fetchRegions fail %s", err) + return nil + } + if len(regionId) == 0 { regionId = AWS_INTERNATIONAL_DEFAULT_REGION switch self.accessUrl { diff --git a/pkg/multicloud/aws/organizations.go b/pkg/multicloud/aws/organizations.go index af8d6e9053..66dc61b79b 100644 --- a/pkg/multicloud/aws/organizations.go +++ b/pkg/multicloud/aws/organizations.go @@ -78,12 +78,11 @@ func (r *SRegion) ListAccounts() ([]SAccount, error) { } func (self *SAwsClient) GetSubAccounts() ([]cloudprovider.SSubAccount, error) { - // todo: implement me - err := self.fetchRegions() - if err != nil { - return nil, errors.Wrap(err, "fetchRegions") + defRegion := self.getDefaultRegion() + if defRegion == nil { + return nil, errors.Wrap(errors.ErrInvalidStatus, "no valid default region") } - accounts, err := self.getDefaultRegion().ListAccounts() + accounts, err := defRegion.ListAccounts() if err != nil { // find errors if strings.Contains(err.Error(), "AWSOrganizationsNotInUseException") || strings.Contains(err.Error(), "AccessDeniedException") {