fix(region): azure secgroup rule not allow with same priority and direction

This commit is contained in:
Qu Xuan
2020-12-19 14:47:03 +08:00
parent 638b64867d
commit 6aeea0f9bd
3 changed files with 66 additions and 1 deletions
+16
View File
@@ -372,3 +372,19 @@ func CompareRules(
common = append(inCommon, outCommon...)
return
}
func SortUniqPriority(rules SecurityRuleSet) []SecurityRule {
sort.Sort(rules)
priMap := map[int]bool{}
for i := range rules {
for {
_, ok := priMap[rules[i].Priority]
if !ok {
priMap[rules[i].Priority] = true
break
}
rules[i].Priority = rules[i].Priority - 1
}
}
return rules
}
@@ -233,3 +233,39 @@ func TestAzureRuleSync(t *testing.T) {
check(t, "outDels", outDels, d.OutDels)
}
}
func TestAzureUniqPriorityRuleSync(t *testing.T) {
cases := []struct {
in cloudprovider.SecurityRuleSet
out cloudprovider.SecurityRuleSet
}{
{
in: cloudprovider.SecurityRuleSet{
remoteRuleWithName("", "out:allow icmp", 99),
remoteRuleWithName("", "out:allow tcp 100-200", 99),
remoteRuleWithName("", "out:allow udp 200-300", 99),
},
out: cloudprovider.SecurityRuleSet{
remoteRuleWithName("", "out:allow icmp", 99),
remoteRuleWithName("", "out:allow tcp 100-200", 98),
remoteRuleWithName("", "out:allow udp 200-300", 97),
},
},
}
for _, c := range cases {
rules := cloudprovider.SortUniqPriority(c.in)
if len(c.out) != len(rules) {
t.Fatalf("invalid output")
}
for i := range rules {
if rules[i].String() != c.out[i].String() {
t.Fatalf("rule shoud be %s not %s", c.out[i].String(), rules[i].String())
}
if rules[i].Priority != c.out[i].Priority {
t.Fatalf("rule %s priority should be %d not %d", rules[i].String(), c.out[i].Priority, rules[i].Priority)
}
}
}
}
+14 -1
View File
@@ -479,6 +479,19 @@ func (self *SSecurityGroup) SetRules(rules []cloudprovider.SecurityRule) error {
}
func (self *SSecurityGroup) SyncRules(common, inAdds, outAdds, inDels, outDels []cloudprovider.SecurityRule) error {
rules := append(common, append(inAdds, outAdds...)...)
for i := range common {
switch common[i].Direction {
case secrules.DIR_IN:
inAdds = append(inAdds, common[i])
case secrules.DIR_OUT:
outAdds = append(outAdds, common[i])
default:
return fmt.Errorf("invalid rule %s direction %s", common[i].String(), common[i].Direction)
}
}
// Azure 不允许同方向的规则优先级相同
inRules := cloudprovider.SortUniqPriority(inAdds)
outRules := cloudprovider.SortUniqPriority(outAdds)
rules := append(inRules, outRules...)
return self.SetRules(rules)
}