-
Notifications
You must be signed in to change notification settings - Fork 0
/
multi_region_policy.go
63 lines (55 loc) · 1.81 KB
/
multi_region_policy.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package multi_region_policy
import (
"sort"
)
func (p *MultiRegionPolicy) RegionEnabled(name string) bool {
for _, availableRegion := range p.GetEnabledRegions() {
if availableRegion == name {
return true
}
}
return false
}
func (p *MultiRegionPolicy) RegionsEnabled(regions []string) bool {
for _, name := range regions {
if !p.RegionEnabled(name) {
return false
}
}
return true
}
func (p *MultiRegionPolicy) CanReadFromRegion(readingRegion, dataRegion string, resFqn string) bool {
return readingRegion == dataRegion || (!p.forbiddingRuleExists(readingRegion, dataRegion, resFqn) && p.RegionEnabled(readingRegion))
}
func (p *MultiRegionPolicy) CanCreateInRegion(regionId string) bool {
return p.RegionEnabled(regionId)
}
func (p *MultiRegionPolicy) CanAccessDataFromRegion(readingRegion string, dataRegions []string, resFqn string) bool {
for _, dataRegion := range dataRegions {
if !p.CanReadFromRegion(readingRegion, dataRegion, resFqn) {
return false
}
}
return true
}
func (p *MultiRegionPolicy) ComputeSyncingRegions(resFqn string, owningRegion string) []string {
regions := p.GetEnabledRegions()
syncingRegions := make([]string, 0)
for _, region := range regions {
if region == owningRegion || !p.forbiddingRuleExists(region, owningRegion, resFqn) {
syncingRegions = append(syncingRegions, region)
}
}
sort.Strings(syncingRegions)
return syncingRegions
}
func (p *MultiRegionPolicy) forbiddingRuleExists(readingRegion, dataRegion string, resFqn string) bool {
for _, criteria := range p.GetCriteriaForDisabledSync() {
if (criteria.SourceRegion == "" || criteria.SourceRegion == dataRegion) &&
(criteria.DestRegion == "" || criteria.DestRegion == readingRegion) &&
(criteria.ResourceTypeName == "" || criteria.ResourceTypeName == resFqn) {
return true
}
}
return false
}