fix: avoid qcloud secgroup cache name not sync

This commit is contained in:
Qu Xuan
2020-10-09 10:46:59 +08:00
parent 65cfd4108f
commit 35e57a8336
4 changed files with 50 additions and 33 deletions
+10 -2
View File
@@ -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
}
+27 -23
View File
@@ -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 {
+12 -7
View File
@@ -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 {
+1 -1
View File
@@ -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
}