创建安全组规则之后返回的对象无法提供正确的GlobalId
What happened: 使用rule,err := secgroup.CreateRule(rule_opts)创建多个安全组规则,之后使用rule.GetGlobalId(),得到的id是相同的。
但是如果通过GetRules()得到rule对象,然后再查看它们的globalid,可以确定创建出来的rule的id都是唯一的。
Environment: yunion.io/x/cloudmux v0.0.0-20240929084537-95ed5a2d6298
是哪个云,目前CreateRule是单个rule规则一个个创建的
天翼云,测试的情况是如果并发创建,最终返回的ISecurityGroupRule对象是一样的。如果中间稍微隔些时间,可以正常获取ISecurityGroupRule对象。
func (self *SSecurityGroup) CreateRule(opts *cloudprovider.SecurityGroupRuleCreateOptions) (cloudprovider.ISecurityGroupRule, error) { ruleIds := []string{} for _, rule := range self.SecurityGroupRuleList { if !utils.IsInStringArray(rule.Id, ruleIds) { ruleIds = append(ruleIds, rule.Id) } } err := self.region.CreateSecurityGroupRule(self.Id, opts) if err != nil { return nil, errors.Wrapf(err, "CreateSecurityGroupRule") } for i := 0; i < 3; i++ { err := self.Refresh() if err != nil { return nil, errors.Wrapf(err, "Refresh") } for i := range self.SecurityGroupRuleList { if !utils.IsInStringArray(self.SecurityGroupRuleList[i].Id, ruleIds) { self.SecurityGroupRuleList[i].secgroup = self return &self.SecurityGroupRuleList[i], nil } } time.Sleep(time.Second * 3) } return nil, errors.Wrapf(cloudprovider.ErrNotFound, "after created") }
https://github.com/yunionio/cloudmux/pull/1283 试下这个