mirror of
https://github.com/kyverno/kyverno.git
synced 2025-03-05 15:37:19 +00:00
Added a time_add() filter to add duration and absolute time (#5817)
* time_add Signed-off-by: Vishal Choudhary <contactvishaltech@gmail.com> * output is RFC3339 only now Signed-off-by: Vishal Choudhary <contactvishaltech@gmail.com> * added note to timeadd Signed-off-by: Vishal Choudhary <contactvishaltech@gmail.com> * added time_convert Signed-off-by: Vishal Choudhary <contactvishaltech@gmail.com> * removed blank string timezone Signed-off-by: Vishal Choudhary <contactvishaltech@gmail.com> * renamed to time_parse Signed-off-by: Vishal Choudhary <contactvishaltech@gmail.com> Signed-off-by: Vishal Choudhary <contactvishaltech@gmail.com> Co-authored-by: shuting <shuting@nirmata.com> Co-authored-by: Charles-Edouard Brétéché <charled.breteche@gmail.com>
This commit is contained in:
parent
c10649fc2f
commit
bb6005a7a3
2 changed files with 144 additions and 0 deletions
|
@ -81,6 +81,8 @@ var (
|
||||||
objectFromLists = "object_from_lists"
|
objectFromLists = "object_from_lists"
|
||||||
random = "random"
|
random = "random"
|
||||||
x509_decode = "x509_decode"
|
x509_decode = "x509_decode"
|
||||||
|
timeAdd = "time_add"
|
||||||
|
timeParse = "time_parse"
|
||||||
timeToCron = "time_to_cron"
|
timeToCron = "time_to_cron"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -502,6 +504,31 @@ func GetFunctions() []*FunctionEntry {
|
||||||
ReturnType: []JpType{JpString},
|
ReturnType: []JpType{JpString},
|
||||||
Note: "converts an absolute time (RFC 3339) to a cron expression (string).",
|
Note: "converts an absolute time (RFC 3339) to a cron expression (string).",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Entry: &gojmespath.FunctionEntry{
|
||||||
|
Name: timeAdd,
|
||||||
|
Arguments: []ArgSpec{
|
||||||
|
{Types: []JpType{JpString}},
|
||||||
|
{Types: []JpType{JpString}},
|
||||||
|
{Types: []JpType{JpString}},
|
||||||
|
},
|
||||||
|
Handler: jpTimeAdd,
|
||||||
|
},
|
||||||
|
ReturnType: []JpType{JpString},
|
||||||
|
Note: "adds duration (third string) to a time value (second string) of a specified layout (first string)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Entry: &gojmespath.FunctionEntry{
|
||||||
|
Name: timeParse,
|
||||||
|
Arguments: []ArgSpec{
|
||||||
|
{Types: []JpType{JpString}},
|
||||||
|
{Types: []JpType{JpString}},
|
||||||
|
},
|
||||||
|
Handler: jpTimeParse,
|
||||||
|
},
|
||||||
|
ReturnType: []JpType{JpString},
|
||||||
|
Note: "changes a time value of a given layout to RFC 3339",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1131,3 +1158,60 @@ func jpTimeToCron(arguments []interface{}) (interface{}, error) {
|
||||||
|
|
||||||
return cron, nil
|
return cron, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func jpTimeAdd(arguments []interface{}) (interface{}, error) {
|
||||||
|
var err error
|
||||||
|
layout, err := validateArg("", arguments, 0, reflect.String)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ts, err := validateArg("", arguments, 1, reflect.String)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
dr, err := validateArg("", arguments, 2, reflect.String)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var t time.Time
|
||||||
|
if layout.String() != "" {
|
||||||
|
t, err = time.Parse(layout.String(), ts.String())
|
||||||
|
} else {
|
||||||
|
t, err = time.Parse(time.RFC3339, ts.String())
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var d time.Duration
|
||||||
|
d, err = time.ParseDuration(dr.String())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return t.Add(d).Format(time.RFC3339), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func jpTimeParse(arguments []interface{}) (interface{}, error) {
|
||||||
|
var err error
|
||||||
|
layout, err := validateArg("", arguments, 0, reflect.String)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ts, err := validateArg("", arguments, 1, reflect.String)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var t time.Time
|
||||||
|
t, err = time.Parse(layout.String(), ts.String())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return t.Format(time.RFC3339), nil
|
||||||
|
}
|
||||||
|
|
|
@ -1579,3 +1579,63 @@ func Test_TimeToCron(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_TimeAdd(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
test string
|
||||||
|
expectedResult string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
test: "time_add('', '2021-01-02T15:04:05-07:00', '3h')",
|
||||||
|
expectedResult: "2021-01-02T18:04:05-07:00",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: "time_add('Mon Jan 02 15:04:05 MST 2006', 'Sat Jan 02 15:04:05 MST 2021', '5h30m40s')",
|
||||||
|
expectedResult: "2021-01-02T20:34:45Z",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for i, tc := range testCases {
|
||||||
|
t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) {
|
||||||
|
query, err := New(tc.test)
|
||||||
|
assert.NilError(t, err)
|
||||||
|
|
||||||
|
res, err := query.Search("")
|
||||||
|
assert.NilError(t, err)
|
||||||
|
|
||||||
|
result, ok := res.(string)
|
||||||
|
assert.Assert(t, ok)
|
||||||
|
|
||||||
|
assert.Equal(t, result, tc.expectedResult)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_TimeParse(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
test string
|
||||||
|
expectedResult string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
test: "time_parse('2006-01-02T15:04:05Z07:00', '2021-01-02T15:04:05-07:00')",
|
||||||
|
expectedResult: "2021-01-02T15:04:05-07:00",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: "time_parse('Mon Jan 02 15:04:05 MST 2006', 'Sat Jan 02 15:04:05 MST 2021')",
|
||||||
|
expectedResult: "2021-01-02T15:04:05Z",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for i, tc := range testCases {
|
||||||
|
t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) {
|
||||||
|
query, err := New(tc.test)
|
||||||
|
assert.NilError(t, err)
|
||||||
|
|
||||||
|
res, err := query.Search("")
|
||||||
|
assert.NilError(t, err)
|
||||||
|
|
||||||
|
result, ok := res.(string)
|
||||||
|
assert.Assert(t, ok)
|
||||||
|
|
||||||
|
assert.Equal(t, result, tc.expectedResult)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue