From 35e57a83361c2ea932a0d867d5da812a47386abb Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Fri, 9 Oct 2020 10:46:59 +0800 Subject: [PATCH] fix: avoid qcloud secgroup cache name not sync --- pkg/multicloud/qcloud/region.go | 12 ++++- pkg/multicloud/qcloud/securitygroup.go | 50 +++++++++++--------- pkg/multicloud/qcloud/shell/securitygroup.go | 19 +++++--- pkg/multicloud/qcloud/vpc.go | 2 +- 4 files changed, 50 insertions(+), 33 deletions(-) diff --git a/pkg/multicloud/qcloud/region.go b/pkg/multicloud/qcloud/region.go index 0ed8862dbc..2b0680a8e0 100644 --- a/pkg/multicloud/qcloud/region.go +++ b/pkg/multicloud/qcloud/region.go @@ -931,11 +931,19 @@ func (region *SRegion) GetIBucketByName(name string) (cloudprovider.ICloudBucket } func (self *SRegion) GetISecurityGroupById(secgroupId string) (cloudprovider.ICloudSecurityGroup, error) { - return self.GetSecurityGroupDetails(secgroupId) + secgroups, total, err := self.GetSecurityGroups([]string{secgroupId}, "", "", 0, 1) + if err != nil { + return nil, errors.Wrapf(err, "GetSecurityGroups(%s)", secgroupId) + } + if total < 1 { + return nil, cloudprovider.ErrNotFound + } + secgroups[0].region = self + return &secgroups[0], nil } func (self *SRegion) GetISecurityGroupByName(opts *cloudprovider.SecurityGroupFilterOptions) (cloudprovider.ICloudSecurityGroup, error) { - secgroups, total, err := self.GetSecurityGroups(opts.VpcId, opts.Name, 0, 0) + secgroups, total, err := self.GetSecurityGroups([]string{}, opts.VpcId, opts.Name, 0, 0) if err != nil { return nil, err } diff --git a/pkg/multicloud/qcloud/securitygroup.go b/pkg/multicloud/qcloud/securitygroup.go index 7839b85482..249dd65f85 100644 --- a/pkg/multicloud/qcloud/securitygroup.go +++ b/pkg/multicloud/qcloud/securitygroup.go @@ -72,7 +72,7 @@ type SSecurityGroup struct { SecurityGroupPolicySet SecurityGroupPolicySet } -func (self *SRegion) GetSecurityGroups(vpcId string, name string, offset int, limit int) ([]SSecurityGroup, int, error) { +func (self *SRegion) GetSecurityGroups(ids []string, vpcId string, name string, offset int, limit int) ([]SSecurityGroup, int, error) { if limit > 50 || limit <= 0 { limit = 50 } @@ -85,19 +85,21 @@ func (self *SRegion) GetSecurityGroups(vpcId string, name string, offset int, li params["Filters.0.Values.0"] = name } - body, err := self.vpcRequest("DescribeSecurityGroups", params) + for idx, id := range ids { + params[fmt.Sprintf("SecurityGroupIds.%d", idx)] = id + } + + resp, err := self.vpcRequest("DescribeSecurityGroups", params) if err != nil { - log.Errorf("GetSecurityGroups fail %s", err) - return nil, 0, err + return nil, 0, errors.Wrapf(err, "DescribeSecurityGroups") } secgrps := make([]SSecurityGroup, 0) - err = body.Unmarshal(&secgrps, "SecurityGroupSet") + err = resp.Unmarshal(&secgrps, "SecurityGroupSet") if err != nil { - log.Errorf("Unmarshal security groups fail %s", err) - return nil, 0, err + return nil, 0, errors.Wrapf(err, "resp.Unmarshal") } - total, _ := body.Float("TotalCount") + total, _ := resp.Float("TotalCount") return secgrps, int(total), nil } @@ -239,19 +241,19 @@ func (self *SecurityGroupPolicy) getAddressRules(rule cloudprovider.SecurityRule } func (self *SSecurityGroup) GetRules() ([]cloudprovider.SecurityRule, error) { - secgroup, err := self.region.GetSecurityGroupDetails(self.SecurityGroupId) + policySet, err := self.region.DescribeSecurityGroupPolicies(self.SecurityGroupId) if err != nil { return nil, err } - for i := 0; i < len(secgroup.SecurityGroupPolicySet.Egress); i++ { - secgroup.SecurityGroupPolicySet.Egress[i].direction = "out" + for i := 0; i < len(policySet.Egress); i++ { + policySet.Egress[i].direction = "out" } - for i := 0; i < len(secgroup.SecurityGroupPolicySet.Ingress); i++ { - secgroup.SecurityGroupPolicySet.Ingress[i].direction = "in" + for i := 0; i < len(policySet.Ingress); i++ { + policySet.Ingress[i].direction = "in" } originRules := []SecurityGroupPolicy{} - originRules = append(originRules, secgroup.SecurityGroupPolicySet.Egress...) - originRules = append(originRules, secgroup.SecurityGroupPolicySet.Ingress...) + originRules = append(originRules, policySet.Egress...) + originRules = append(originRules, policySet.Ingress...) for i := 0; i < len(originRules); i++ { originRules[i].region = self.region } @@ -272,11 +274,14 @@ func (self *SSecurityGroup) IsEmulated() bool { } func (self *SSecurityGroup) Refresh() error { - group, err := self.region.GetSecurityGroupDetails(self.SecurityGroupId) + groups, total, err := self.region.GetSecurityGroups([]string{self.SecurityGroupId}, "", "", 0, 0) if err != nil { return err } - return jsonutils.Update(self, group) + if total < 1 { + return cloudprovider.ErrNotFound + } + return jsonutils.Update(self, groups[0]) } func (self *SSecurityGroup) deleteRules(rules []cloudprovider.SecurityRule, direction string) error { @@ -392,7 +397,7 @@ func (self *SRegion) AddRule(secgroupId string, policyIndex int, rule cloudprovi return nil } -func (self *SRegion) GetSecurityGroupDetails(secGroupId string) (*SSecurityGroup, error) { +func (self *SRegion) DescribeSecurityGroupPolicies(secGroupId string) (*SecurityGroupPolicySet, error) { params := make(map[string]string) params["Region"] = self.Region params["SecurityGroupId"] = secGroupId @@ -403,13 +408,12 @@ func (self *SRegion) GetSecurityGroupDetails(secGroupId string) (*SSecurityGroup return nil, err } - secgrp := SSecurityGroup{SecurityGroupId: secGroupId, region: self} - err = body.Unmarshal(&secgrp.SecurityGroupPolicySet, "SecurityGroupPolicySet") + policies := SecurityGroupPolicySet{} + err = body.Unmarshal(&policies, "SecurityGroupPolicySet") if err != nil { - log.Errorf("Unmarshal security group details fail %s", err) - return nil, err + return nil, errors.Wrapf(err, "body.Unmarshal") } - return &secgrp, nil + return &policies, nil } func (self *SRegion) DeleteSecurityGroup(secGroupId string) error { diff --git a/pkg/multicloud/qcloud/shell/securitygroup.go b/pkg/multicloud/qcloud/shell/securitygroup.go index 426ec71553..227e203c0e 100644 --- a/pkg/multicloud/qcloud/shell/securitygroup.go +++ b/pkg/multicloud/qcloud/shell/securitygroup.go @@ -25,12 +25,14 @@ import ( func init() { type SecurityGroupListOptions struct { - Name string `help:"Secgroup Name"` - Limit int `help:"page size"` - Offset int `help:"page offset"` + Ids []string `help:"Secgroup Ids"` + VpcId string `help:"Vpc Id"` + Name string `help:"Secgroup Name"` + Limit int `help:"page size"` + Offset int `help:"page offset"` } shellutils.R(&SecurityGroupListOptions{}, "security-group-list", "List SecurityGroup", func(cli *qcloud.SRegion, args *SecurityGroupListOptions) error { - secgrps, total, err := cli.GetSecurityGroups("", args.Name, args.Limit, args.Offset) + secgrps, total, err := cli.GetSecurityGroups(args.Ids, args.VpcId, args.Name, args.Limit, args.Offset) if err != nil { return err } @@ -42,12 +44,15 @@ func init() { ID string `help:"SecurityGroup ID"` } shellutils.R(&SecurityGroupOptions{}, "security-group-show", "Show SecurityGroup", func(cli *qcloud.SRegion, args *SecurityGroupOptions) error { - secgroup, err := cli.GetSecurityGroupDetails(args.ID) + secgroups, _, err := cli.GetSecurityGroups([]string{args.ID}, "", "", 0, 1) if err != nil { return err } - printObject(secgroup) - return nil + if len(secgroups) == 1 { + printObject(secgroups[0]) + return nil + } + return cloudprovider.ErrNotFound }) shellutils.R(&SecurityGroupOptions{}, "security-group-delete", "Delete SecurityGroup", func(cli *qcloud.SRegion, args *SecurityGroupOptions) error { diff --git a/pkg/multicloud/qcloud/vpc.go b/pkg/multicloud/qcloud/vpc.go index efb18fc6cf..12c3b8bdd0 100644 --- a/pkg/multicloud/qcloud/vpc.go +++ b/pkg/multicloud/qcloud/vpc.go @@ -86,7 +86,7 @@ func (self *SVpc) Delete() error { func (self *SVpc) GetISecurityGroups() ([]cloudprovider.ICloudSecurityGroup, error) { secgroups := make([]SSecurityGroup, 0) for { - parts, total, err := self.region.GetSecurityGroups(self.VpcId, "", len(secgroups), 50) + parts, total, err := self.region.GetSecurityGroups([]string{}, self.VpcId, "", len(secgroups), 50) if err != nil { return nil, err }