cloudmux icon indicating copy to clipboard operation
cloudmux copied to clipboard

创建安全组规则之后返回的对象无法提供正确的GlobalId

Open qiaodeli111 opened this issue 11 months ago • 3 comments

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

qiaodeli111 avatar Jan 15 '25 08:01 qiaodeli111

是哪个云,目前CreateRule是单个rule规则一个个创建的

ioito avatar Feb 11 '25 07:02 ioito

天翼云,测试的情况是如果并发创建,最终返回的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") }

qiaodeli111 avatar May 08 '25 06:05 qiaodeli111

https://github.com/yunionio/cloudmux/pull/1283 试下这个

ioito avatar Jun 06 '25 04:06 ioito