-
Notifications
You must be signed in to change notification settings - Fork 86
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Remove importance of order of rule in RestoreSession (#795)
Tasks: - [x] Remove importance of rule order - [x] Add validator to ensure followings, - [x] There is at most one rule with empty targetHosts field. - [x] No two rule with non-empty targetHosts matches for a host. - [x] If snapshot is specified in a rule then paths is not specified. - [x] Update concept doc to make rules behavior clear Fixes: #790
- Loading branch information
1 parent
886649e
commit a8f3172
Showing
10 changed files
with
155 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,69 @@ | ||
package v1beta1 | ||
|
||
import "fmt" | ||
|
||
// TODO: complete | ||
func (r BackupSession) IsValid() error { | ||
return nil | ||
} | ||
|
||
// TODO: complete | ||
func (r RestoreSession) IsValid() error { | ||
// ========== spec.Rules validation================ | ||
// We must ensure following: | ||
// 1. There is at most one rule with empty targetHosts field. | ||
// 2. No two rules with non-emtpy targetHosts matches for a host. | ||
// 3. If snapshot field is specified in a rule then paths is not specified. | ||
|
||
// ensure the there is at most one rule with source | ||
var ruleIdx []int | ||
for i, rule := range r.Spec.Rules { | ||
if len(rule.TargetHosts) == 0 { | ||
ruleIdx = append(ruleIdx, i) | ||
} | ||
} | ||
if len(ruleIdx) > 1 { | ||
return fmt.Errorf("\n\t"+ | ||
"Error: Invalid RestoreSession specification.\n\t"+ | ||
"Reason: %s.\n\t"+ | ||
"Hints: There can be at most one rule with empty targetHosts.", multipleRuleWithEmptyTargetHostError(ruleIdx)) | ||
} | ||
|
||
// ensure that no two rules with non-emtpy targetHosts matches for a host | ||
res := make(map[string]int, 0) | ||
for i, rule := range r.Spec.Rules { | ||
for _, host := range rule.TargetHosts { | ||
v, ok := res[host] | ||
if ok { | ||
return fmt.Errorf("\n\t"+ | ||
"Error: Invalid RestoreSession specification.\n\t"+ | ||
"Reason: Multiple rules (rule[%d] and rule[%d]) match for host %q.\n\t"+ | ||
"Hints: There could be only one matching rule for a host.", v, i, host) | ||
} else { | ||
res[host] = i | ||
} | ||
} | ||
} | ||
|
||
// ensure that path is not specified in a rule if snapshot field is specified | ||
for i, rule := range r.Spec.Rules { | ||
if len(rule.Snapshots) != 0 && len(rule.Paths) != 0 { | ||
return fmt.Errorf("\n\t"+ | ||
"Error: Invalid RestoreSession specification.\n\t"+ | ||
"Reason: Both 'snapshots' and 'paths' fileds are specified in rule[%d].\n\t"+ | ||
"Hints: A snpashot contains backup data of only one directory. So, you can't specify 'paths' if you specify snapshot field.", i) | ||
} | ||
} | ||
return nil | ||
} | ||
|
||
func multipleRuleWithEmptyTargetHostError(ruleIndexes []int) string { | ||
ids := "" | ||
for i, idx := range ruleIndexes { | ||
ids += fmt.Sprintf("rule[%d]", idx) | ||
if i < len(ruleIndexes)-1 { | ||
ids += ", " | ||
} | ||
} | ||
return fmt.Sprintf("%d rules found with empty targetHosts (Rules: %s)", len(ruleIndexes), ids) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters