forked from treeverse/lakeFS
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparser.go
148 lines (132 loc) · 4.34 KB
/
parser.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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package retention
import (
"errors"
"fmt"
"github.com/go-openapi/strfmt"
"github.com/treeverse/lakefs/api/gen/models"
"github.com/treeverse/lakefs/catalog"
)
const (
hoursInADay = 24
daysInAWeek = 7
hoursMinAllowExpiration = 2
)
var (
ErrExpirationNotSet = errors.New("expiration must specify at least one field")
ErrExpirationMinimalAllowable = errors.New("minimal allowable expiration")
ErrExpirationMissingRequiredField = errors.New("missing required expiration field")
)
func ParseTimePeriod(model models.TimePeriod) (catalog.TimePeriodHours, error) {
ret := catalog.TimePeriodHours(hoursInADay * (model.Days + 7*model.Weeks))
if ret < catalog.TimePeriodHours(hoursMinAllowExpiration) {
return catalog.TimePeriodHours(0), fmt.Errorf("%w is %d hours", ErrExpirationMinimalAllowable, hoursMinAllowExpiration)
}
return ret, nil
}
func RenderTimePeriod(timePeriod catalog.TimePeriodHours) *models.TimePeriod {
// Time periods are used for deletion, so safest to round them UP
totalDays := (timePeriod + hoursInADay - 1) / hoursInADay
return &models.TimePeriod{Weeks: int32(totalDays / daysInAWeek), Days: int32(totalDays % daysInAWeek)}
}
func ParseExpiration(model models.RetentionPolicyRuleExpiration) (*catalog.Expiration, error) {
ret := catalog.Expiration{}
if model.All != nil {
hours, err := ParseTimePeriod(*model.All)
if err != nil {
return nil, fmt.Errorf("expiration all: %w", err)
}
ret.All = &hours
}
if model.Noncurrent != nil {
hours, err := ParseTimePeriod(*model.Noncurrent)
if err != nil {
return nil, fmt.Errorf("expiration noncurrent: %w", err)
}
ret.Noncurrent = &hours
}
if model.Uncommitted != nil {
hours, err := ParseTimePeriod(*model.Uncommitted)
if err != nil {
return nil, fmt.Errorf("expiration uncommitted: %w", err)
}
ret.Uncommitted = &hours
}
if ret.All == nil && ret.Noncurrent == nil && ret.Uncommitted == nil {
return nil, ErrExpirationNotSet
}
return &ret, nil
}
func RenderExpiration(expiration *catalog.Expiration) *models.RetentionPolicyRuleExpiration {
ret := models.RetentionPolicyRuleExpiration{}
if expiration.All != nil {
ret.All = RenderTimePeriod(*expiration.All)
}
if expiration.Noncurrent != nil {
ret.Noncurrent = RenderTimePeriod(*expiration.Noncurrent)
}
if expiration.Uncommitted != nil {
ret.Uncommitted = RenderTimePeriod(*expiration.Uncommitted)
}
return &ret
}
func ParseRule(model models.RetentionPolicyRule) (*catalog.Rule, error) {
rule := catalog.Rule{}
rule.Enabled = *model.Status == "enabled"
if model.Filter == nil {
rule.FilterPrefix = ""
} else {
rule.FilterPrefix = model.Filter.Prefix
}
if model.Expiration == nil {
return nil, ErrExpirationMissingRequiredField
}
expiration, err := ParseExpiration(*model.Expiration)
if err != nil {
return nil, err
}
rule.Expiration = *expiration
return &rule, nil
}
var (
Enabled = "enabled"
Disabled = "disabled"
)
func RenderRule(rule *catalog.Rule) *models.RetentionPolicyRule {
ret := models.RetentionPolicyRule{}
if rule.Enabled {
ret.Status = &Enabled
} else {
ret.Status = &Disabled
}
if rule.FilterPrefix != "" {
ret.Filter = &models.RetentionPolicyRuleFilter{Prefix: rule.FilterPrefix}
}
ret.Expiration = RenderExpiration(&rule.Expiration)
return &ret
}
func ParsePolicy(model models.RetentionPolicy) (*catalog.Policy, error) {
rules := make([]catalog.Rule, 0, len(model.Rules))
for index, modelRule := range model.Rules {
rule, err := ParseRule(*modelRule)
if err != nil {
return nil, fmt.Errorf("rule %d: %w", index, err)
}
rules = append(rules, *rule)
}
return &catalog.Policy{Description: model.Description, Rules: rules}, nil
}
func RenderPolicy(policy *catalog.Policy) *models.RetentionPolicy {
modelRules := make([]*models.RetentionPolicyRule, 0, len(policy.Rules))
for i := range policy.Rules {
modelRules = append(modelRules, RenderRule(&policy.Rules[i]))
}
return &models.RetentionPolicy{Description: policy.Description, Rules: modelRules}
}
// PolicyWithCreationDate never converted in, only out
func RenderPolicyWithCreationDate(policy *catalog.PolicyWithCreationTime) *models.RetentionPolicyWithCreationDate {
serializableCreationDate := strfmt.DateTime(policy.CreatedAt)
return &models.RetentionPolicyWithCreationDate{
RetentionPolicy: *RenderPolicy(&policy.Policy),
CreationDate: &serializableCreationDate,
}
}