Skip to content

Commit e5248c1

Browse files
authored
skupper init: validate site name and router number (#1423)
* add validators for router numbers and site name in skupper init
1 parent 659023d commit e5248c1

3 files changed

Lines changed: 166 additions & 0 deletions

File tree

cmd/skupper/skupper.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"github.com/skupperproject/skupper/pkg/network"
77
"github.com/skupperproject/skupper/pkg/utils/configs"
8+
"github.com/skupperproject/skupper/pkg/utils/validator"
89
"os"
910
"reflect"
1011
"strconv"
@@ -451,6 +452,16 @@ installation that can then be connected to other skupper installations`,
451452
return fmt.Errorf("for the console to work with this user or password, the --console-auth option must be set to internal")
452453
}
453454

455+
ok, err := validator.NewStringValidator().Evaluate(routerCreateOpts.SkupperName)
456+
if !ok {
457+
return fmt.Errorf("invalid skupper site name: %s", err.Error())
458+
}
459+
460+
ok, err = validator.NewNumberValidator().Evaluate(routerCreateOpts.Routers)
461+
if !ok {
462+
return fmt.Errorf("invalid number for routers: %s", err.Error())
463+
}
464+
454465
return skupperCli.Create(cmd, args)
455466
},
456467
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package validator
2+
3+
import (
4+
"fmt"
5+
"regexp"
6+
)
7+
8+
type Validator interface {
9+
Evaluate(value interface{}) (bool, error)
10+
}
11+
12+
//
13+
14+
type StringValidator struct {
15+
Expression *regexp.Regexp
16+
}
17+
18+
func NewStringValidator() *StringValidator {
19+
re, err := regexp.Compile("^\\S*$")
20+
if err != nil {
21+
fmt.Printf("Error compiling regex: %v", err)
22+
return nil
23+
}
24+
return &StringValidator{
25+
Expression: re,
26+
}
27+
}
28+
29+
func (s StringValidator) Evaluate(value interface{}) (bool, error) {
30+
v, ok := value.(string)
31+
32+
if !ok {
33+
return false, fmt.Errorf("value is not a string")
34+
}
35+
36+
if s.Expression.MatchString(v) {
37+
return true, nil
38+
}
39+
40+
return false, fmt.Errorf("value contains spaces")
41+
}
42+
43+
//
44+
45+
type NumberValidator struct {
46+
PositiveInt bool
47+
}
48+
49+
func NewNumberValidator() *NumberValidator {
50+
return &NumberValidator{
51+
PositiveInt: true,
52+
}
53+
}
54+
55+
func (i NumberValidator) Evaluate(value interface{}) (bool, error) {
56+
57+
v, ok := value.(int)
58+
59+
if !ok {
60+
return false, fmt.Errorf("value is not an integer")
61+
}
62+
63+
if i.PositiveInt {
64+
if v >= 0 {
65+
return true, nil
66+
}
67+
return false, fmt.Errorf("value is not positive")
68+
}
69+
return true, nil
70+
}
71+
72+
///
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package validator
2+
3+
import (
4+
"gotest.tools/assert"
5+
"reflect"
6+
"regexp"
7+
"testing"
8+
)
9+
10+
func TestNewStringValidator(t *testing.T) {
11+
12+
t.Run("Test String Validator constructor", func(t *testing.T) {
13+
14+
validRegexp, _ := regexp.Compile("^\\S*$")
15+
expectedResult := &StringValidator{validRegexp}
16+
actualResult := NewStringValidator()
17+
assert.Assert(t, reflect.DeepEqual(actualResult, expectedResult))
18+
})
19+
}
20+
21+
func TestStringValidator_Evaluate(t *testing.T) {
22+
type test struct {
23+
name string
24+
value interface{}
25+
result bool
26+
}
27+
28+
testTable := []test{
29+
{name: "empty string", value: "", result: true},
30+
{name: "valid value", value: "provided-value", result: true},
31+
{name: "string with spaces", value: "provided value", result: false},
32+
{name: "string with numbers", value: "site123", result: true},
33+
{name: "number", value: 123, result: false},
34+
{name: "nil value", value: nil, result: false},
35+
}
36+
37+
for _, test := range testTable {
38+
t.Run(test.name, func(t *testing.T) {
39+
40+
stringValidator := NewStringValidator()
41+
expectedResult := test.result
42+
actualResult, _ := stringValidator.Evaluate(test.value)
43+
assert.Assert(t, reflect.DeepEqual(actualResult, expectedResult))
44+
})
45+
}
46+
}
47+
48+
func TestNewNumberValidator(t *testing.T) {
49+
50+
t.Run("Test Positive Int Validator constructor", func(t *testing.T) {
51+
52+
expectedResult := &NumberValidator{PositiveInt: true}
53+
actualResult := NewNumberValidator()
54+
assert.Assert(t, reflect.DeepEqual(actualResult, expectedResult))
55+
})
56+
}
57+
58+
func TestIntegerValidator_Evaluate(t *testing.T) {
59+
type test struct {
60+
name string
61+
value interface{}
62+
result bool
63+
}
64+
65+
testTable := []test{
66+
{name: "empty string", value: "", result: false},
67+
{name: "value greater than zero", value: 235, result: true},
68+
{name: "zero value", value: 0, result: true},
69+
{name: "negative number", value: -2, result: false},
70+
{name: "not valid characters", value: "abc", result: false},
71+
{name: "nil value", value: nil, result: false},
72+
}
73+
74+
for _, test := range testTable {
75+
t.Run(test.name, func(t *testing.T) {
76+
77+
numberValidator := NewNumberValidator()
78+
expectedResult := test.result
79+
actualResult, _ := numberValidator.Evaluate(test.value)
80+
assert.Assert(t, reflect.DeepEqual(actualResult, expectedResult))
81+
})
82+
}
83+
}

0 commit comments

Comments
 (0)