mirror of
https://github.com/kyverno/kyverno.git
synced 2025-03-31 03:45:17 +00:00
test: add a couple pattern unit tests (#6252)
* test: add a couple pattern unit tests Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com> * more Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com> * more Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com> --------- Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>
This commit is contained in:
parent
71edb10fcf
commit
cfd4501dcc
6 changed files with 414 additions and 167 deletions
|
@ -138,7 +138,7 @@ func validateNilPattern(log logr.Logger, value interface{}) bool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func validateMapPattern(log logr.Logger, value interface{}, typedPattern map[string]interface{}) bool {
|
func validateMapPattern(log logr.Logger, value interface{}, _ map[string]interface{}) bool {
|
||||||
// verify the type of the resource value is map[string]interface,
|
// verify the type of the resource value is map[string]interface,
|
||||||
// we only check for existence of object, not the equality of content and value
|
// we only check for existence of object, not the equality of content and value
|
||||||
_, ok := value.(map[string]interface{})
|
_, ok := value.(map[string]interface{})
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package pattern
|
package pattern
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/go-logr/logr"
|
||||||
"github.com/kyverno/kyverno/pkg/engine/operator"
|
"github.com/kyverno/kyverno/pkg/engine/operator"
|
||||||
"github.com/kyverno/kyverno/pkg/logging"
|
"github.com/kyverno/kyverno/pkg/logging"
|
||||||
"gotest.tools/assert"
|
"gotest.tools/assert"
|
||||||
|
@ -11,13 +11,6 @@ import (
|
||||||
|
|
||||||
var logger = logging.GlobalLogger()
|
var logger = logging.GlobalLogger()
|
||||||
|
|
||||||
func TestValidateValueWithPattern_Bool(t *testing.T) {
|
|
||||||
assert.Assert(t, Validate(logger, true, true))
|
|
||||||
assert.Assert(t, !Validate(logger, true, false))
|
|
||||||
assert.Assert(t, !Validate(logger, false, true))
|
|
||||||
assert.Assert(t, Validate(logger, false, false))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestValidateString_AsteriskTest(t *testing.T) {
|
func TestValidateString_AsteriskTest(t *testing.T) {
|
||||||
pattern := "*"
|
pattern := "*"
|
||||||
value := "anything"
|
value := "anything"
|
||||||
|
@ -60,164 +53,6 @@ func TestValidateString_QuestionMark(t *testing.T) {
|
||||||
assert.Assert(t, !compareString(logger, value, pattern, operator.Equal))
|
assert.Assert(t, !compareString(logger, value, pattern, operator.Equal))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestValidateValueWithPattern_BoolInJson(t *testing.T) {
|
|
||||||
rawPattern := []byte(`
|
|
||||||
{
|
|
||||||
"key": true
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
rawValue := []byte(`
|
|
||||||
{
|
|
||||||
"key": true
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
var pattern, value map[string]interface{}
|
|
||||||
err := json.Unmarshal(rawPattern, &pattern)
|
|
||||||
assert.Assert(t, err)
|
|
||||||
err = json.Unmarshal(rawValue, &value)
|
|
||||||
assert.Assert(t, err)
|
|
||||||
|
|
||||||
assert.Assert(t, Validate(logger, value["key"], pattern["key"]))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestValidateValueWithPattern_NullPatternStringValue(t *testing.T) {
|
|
||||||
rawPattern := []byte(`
|
|
||||||
{
|
|
||||||
"key": null
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
rawValue := []byte(`
|
|
||||||
{
|
|
||||||
"key": "value"
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
var pattern, value map[string]interface{}
|
|
||||||
err := json.Unmarshal(rawPattern, &pattern)
|
|
||||||
assert.Assert(t, err)
|
|
||||||
err = json.Unmarshal(rawValue, &value)
|
|
||||||
assert.Assert(t, err)
|
|
||||||
|
|
||||||
assert.Assert(t, !Validate(logger, value["key"], pattern["key"]))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestValidateValueWithPattern_NullPatternDefaultString(t *testing.T) {
|
|
||||||
rawPattern := []byte(`
|
|
||||||
{
|
|
||||||
"key": null
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
rawValue := []byte(`
|
|
||||||
{
|
|
||||||
"key": ""
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
var pattern, value map[string]interface{}
|
|
||||||
err := json.Unmarshal(rawPattern, &pattern)
|
|
||||||
assert.Assert(t, err)
|
|
||||||
err = json.Unmarshal(rawValue, &value)
|
|
||||||
assert.Assert(t, err)
|
|
||||||
|
|
||||||
assert.Assert(t, Validate(logger, value["key"], pattern["key"]))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestValidateValueWithPattern_NullPatternDefaultFloat(t *testing.T) {
|
|
||||||
rawPattern := []byte(`
|
|
||||||
{
|
|
||||||
"key": null
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
rawValue := []byte(`
|
|
||||||
{
|
|
||||||
"key": 0.0
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
var pattern, value map[string]interface{}
|
|
||||||
err := json.Unmarshal(rawPattern, &pattern)
|
|
||||||
assert.Assert(t, err)
|
|
||||||
err = json.Unmarshal(rawValue, &value)
|
|
||||||
assert.Assert(t, err)
|
|
||||||
|
|
||||||
assert.Assert(t, Validate(logger, value["key"], pattern["key"]))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestValidateValueWithPattern_NullPatternDefaultInt(t *testing.T) {
|
|
||||||
rawPattern := []byte(`
|
|
||||||
{
|
|
||||||
"key": null
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
rawValue := []byte(`
|
|
||||||
{
|
|
||||||
"key": 0
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
var pattern, value map[string]interface{}
|
|
||||||
err := json.Unmarshal(rawPattern, &pattern)
|
|
||||||
assert.Assert(t, err)
|
|
||||||
err = json.Unmarshal(rawValue, &value)
|
|
||||||
assert.Assert(t, err)
|
|
||||||
|
|
||||||
assert.Assert(t, Validate(logger, value["key"], pattern["key"]))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestValidateValueWithPattern_NullPatternDefaultBool(t *testing.T) {
|
|
||||||
rawPattern := []byte(`
|
|
||||||
{
|
|
||||||
"key": null
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
rawValue := []byte(`
|
|
||||||
{
|
|
||||||
"key": false
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
var pattern, value map[string]interface{}
|
|
||||||
err := json.Unmarshal(rawPattern, &pattern)
|
|
||||||
assert.Assert(t, err)
|
|
||||||
err = json.Unmarshal(rawValue, &value)
|
|
||||||
assert.Assert(t, err)
|
|
||||||
|
|
||||||
assert.Assert(t, Validate(logger, value["key"], pattern["key"]))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestValidateValueWithPattern_StringsLogicalOr(t *testing.T) {
|
|
||||||
pattern := "192.168.88.1 | 10.100.11.*"
|
|
||||||
value := "10.100.11.54"
|
|
||||||
assert.Assert(t, Validate(logger, value, pattern))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestValidateValueWithPattern_StringsLogicalAnd(t *testing.T) {
|
|
||||||
pattern := ">1 & <20"
|
|
||||||
value := "10"
|
|
||||||
assert.Assert(t, Validate(logger, value, pattern))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestValidateValueWithPattern_StringsAllLogicalOperators(t *testing.T) {
|
|
||||||
pattern := ">1 & <20 | >31 & <33"
|
|
||||||
value := "10"
|
|
||||||
assert.Assert(t, Validate(logger, value, pattern))
|
|
||||||
value = "32"
|
|
||||||
assert.Assert(t, Validate(logger, value, pattern))
|
|
||||||
value = "21"
|
|
||||||
assert.Assert(t, !Validate(logger, value, pattern))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestValidateValueWithPattern_EqualTwoFloats(t *testing.T) {
|
|
||||||
assert.Assert(t, Validate(logger, 7.0, 7.000))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestValidateValueWithNilPattern_NullPatternStringValue(t *testing.T) {
|
func TestValidateValueWithNilPattern_NullPatternStringValue(t *testing.T) {
|
||||||
assert.Assert(t, !validateNilPattern(logger, "value"))
|
assert.Assert(t, !validateNilPattern(logger, "value"))
|
||||||
}
|
}
|
||||||
|
@ -404,3 +239,410 @@ func TestValidateKernelVersion_NotEquals(t *testing.T) {
|
||||||
assert.Assert(t, !validateStringPatterns(logger, "5.10.84-1", "!5.10.84-1 & !5.15.2-1"))
|
assert.Assert(t, !validateStringPatterns(logger, "5.10.84-1", "!5.10.84-1 & !5.15.2-1"))
|
||||||
assert.Assert(t, !validateStringPatterns(logger, "5.15.2-1", "!5.10.84-1 & !5.15.2-1"))
|
assert.Assert(t, !validateStringPatterns(logger, "5.15.2-1", "!5.10.84-1 & !5.15.2-1"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestValidate(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
value interface{}
|
||||||
|
pattern interface{}
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
want bool
|
||||||
|
}{{
|
||||||
|
args: args{
|
||||||
|
value: true,
|
||||||
|
pattern: true,
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: true,
|
||||||
|
pattern: false,
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: false,
|
||||||
|
pattern: true,
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: false,
|
||||||
|
pattern: false,
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: "value",
|
||||||
|
pattern: nil,
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: "",
|
||||||
|
pattern: nil,
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: 0.0,
|
||||||
|
pattern: nil,
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: 0,
|
||||||
|
pattern: nil,
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: false,
|
||||||
|
pattern: nil,
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: "10.100.11.54",
|
||||||
|
pattern: "192.168.88.1 | 10.100.11.*",
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: "10",
|
||||||
|
pattern: ">1 & <20",
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: "10",
|
||||||
|
pattern: ">1 & <20 | >31 & <33",
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: "32",
|
||||||
|
pattern: ">1 & <20 | >31 & <33",
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: "21",
|
||||||
|
pattern: ">1 & <20 | >31 & <33",
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: 7.0,
|
||||||
|
pattern: 7.000,
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: 10,
|
||||||
|
pattern: 10,
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: 8,
|
||||||
|
pattern: 10,
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: int64(10),
|
||||||
|
pattern: int64(10),
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: int64(8),
|
||||||
|
pattern: int64(10),
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: nil,
|
||||||
|
pattern: []interface{}{},
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: nil,
|
||||||
|
pattern: []string{},
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: map[string]interface{}{
|
||||||
|
"a": true,
|
||||||
|
},
|
||||||
|
pattern: map[string]interface{}{
|
||||||
|
"a": true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: map[string]interface{}{
|
||||||
|
"a": true,
|
||||||
|
},
|
||||||
|
pattern: map[string]interface{}{
|
||||||
|
"b": false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: nil,
|
||||||
|
pattern: false,
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: 8.0,
|
||||||
|
pattern: 8,
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: 8.1,
|
||||||
|
pattern: 8,
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: "8",
|
||||||
|
pattern: 8,
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: "8.1",
|
||||||
|
pattern: 8,
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: false,
|
||||||
|
pattern: 8,
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
args: args{
|
||||||
|
value: 8,
|
||||||
|
pattern: 8.0,
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: 8,
|
||||||
|
pattern: 8.1,
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: int64(8),
|
||||||
|
pattern: 8.0,
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: int64(8),
|
||||||
|
pattern: 8.1,
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: "8",
|
||||||
|
pattern: 8.0,
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: "8.1",
|
||||||
|
pattern: 8.1,
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: "abc",
|
||||||
|
pattern: 8.1,
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: false,
|
||||||
|
pattern: 8.0,
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if got := Validate(logr.Discard(), tt.args.value, tt.args.pattern); got != tt.want {
|
||||||
|
t.Errorf("Validate() = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_convertNumberToString(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
value interface{}
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
want string
|
||||||
|
wantErr bool
|
||||||
|
}{{
|
||||||
|
args: args{
|
||||||
|
value: nil,
|
||||||
|
},
|
||||||
|
want: "0",
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: "123",
|
||||||
|
},
|
||||||
|
want: "123",
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: "",
|
||||||
|
},
|
||||||
|
want: "",
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: "abc",
|
||||||
|
},
|
||||||
|
want: "abc",
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: 0.0,
|
||||||
|
},
|
||||||
|
want: "0.000000",
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: 3.10,
|
||||||
|
},
|
||||||
|
want: "3.100000",
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: -3.10,
|
||||||
|
},
|
||||||
|
want: "-3.100000",
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: -3,
|
||||||
|
},
|
||||||
|
want: "-3",
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: 3,
|
||||||
|
},
|
||||||
|
want: "3",
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: 0,
|
||||||
|
},
|
||||||
|
want: "0",
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: int64(-3),
|
||||||
|
},
|
||||||
|
want: "-3",
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: int64(3),
|
||||||
|
},
|
||||||
|
want: "3",
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: int64(0),
|
||||||
|
},
|
||||||
|
want: "0",
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: false,
|
||||||
|
},
|
||||||
|
wantErr: true,
|
||||||
|
},
|
||||||
|
// TODO: Add test cases.
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
got, err := convertNumberToString(tt.args.value)
|
||||||
|
if (err != nil) != tt.wantErr {
|
||||||
|
t.Errorf("convertNumberToString() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if got != tt.want {
|
||||||
|
t.Errorf("convertNumberToString() = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_validateMapPattern(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
value interface{}
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
want bool
|
||||||
|
}{{
|
||||||
|
args: args{
|
||||||
|
value: nil,
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: true,
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: 8,
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: "",
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: "abc",
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: map[string]interface{}(nil),
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: map[string]interface{}{},
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}, {
|
||||||
|
args: args{
|
||||||
|
value: map[string]interface{}{
|
||||||
|
"a": true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
}}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if got := validateMapPattern(logr.Discard(), tt.args.value, nil); got != tt.want {
|
||||||
|
t.Errorf("validateMapPattern() = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
# A command can only run a single command, not a pipeline and not a script. The program called must exist on the system where the test is run.
|
||||||
|
apiVersion: kuttl.dev/v1beta1
|
||||||
|
kind: TestStep
|
||||||
|
commands:
|
||||||
|
- command: sleep 3
|
Loading…
Add table
Reference in a new issue