diff --git a/modules/kubernetes/config_schema.json b/modules/kubernetes/config_schema.json index a5aefb79..ac7e1d0f 100644 --- a/modules/kubernetes/config_schema.json +++ b/modules/kubernetes/config_schema.json @@ -4,7 +4,9 @@ "type": "object", "properties": { "host": { - "type": "string" + "type": "string", + "format": "uri", + "pattern": "^https?://" }, "insecure": { "type": "boolean", @@ -28,7 +30,53 @@ "default": 100000000 } }, - "required": [ - "host" + "allOf": [ + { + "oneOf": [ + { + "required": [ + "token" + ] + }, + { + "allOf": [ + { + "required": [ + "client_key" + ] + }, + { + "required": [ + "client_certificate" + ] + } + ] + } + ] + }, + { + "oneOf": [ + { + "required": [ + "cluster_ca_certificate" + ] + }, + { + "properties": { + "insecure": { + "const": true + } + }, + "required": [ + "insecure" + ] + } + ] + }, + { + "required": [ + "host" + ] + } ] } \ No newline at end of file diff --git a/modules/kubernetes/config_schema_test.go b/modules/kubernetes/config_schema_test.go new file mode 100644 index 00000000..e5994a73 --- /dev/null +++ b/modules/kubernetes/config_schema_test.go @@ -0,0 +1,113 @@ +package kubernetes + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/xeipuuv/gojsonschema" +) + +func TestModule_KubernetesJSONSchema(t *testing.T) { + tests := []struct { + Case string + wantErr error + want bool + }{ + { + Case: `{ + "host": "http://0.0.0.0:1234", + "insecure": true, + "token": "token" + }`, + wantErr: nil, + want: true, + }, + { + Case: `{ + "host": "http://0.0.0.0:1234", + "insecure": false, + "token": "token" + }`, + wantErr: nil, + want: false, + }, + { + Case: `{ + "host": "http://0.0.0.0:1234", + "insecure": false, + "cluster_ca_certificate": "c_ca_cert", + "token": "token" + }`, + wantErr: nil, + want: true, + }, + { + Case: `{ + "host": "http://0.0.0.0:1234", + "cluster_ca_certificate": "c_ca_cert", + "token": "token" + }`, + wantErr: nil, + want: true, + }, + { + Case: `{ + "host": "http://0.0.0.0:1234", + "insecure": true, + "client_key": "c_key", + "client_certificate": "c_cert" + }`, + wantErr: nil, + want: true, + }, + { + Case: ` "host": "http://0.0.0.0:1234", + "insecure": true, + "client_key": "c_key" + }`, + wantErr: nil, + want: false, + }, + { + Case: `{ + "host": "http://0.0.0.0:1234", + "insecure": true, + "token": "token", + "client_key": "c_key", + "client_certificate": "c_cert" + }`, + wantErr: nil, + want: false, + }, + { + Case: `{ + "host": "http://0.0.0.0:1234", + "insecure": true, + "token": "token", + "client_key": "c_key" + }`, + wantErr: nil, + want: true, + }, + } + loader := gojsonschema.NewStringLoader(configSchema) + schema, _ := gojsonschema.NewSchema(loader) + + for _, tt := range tests { + tt := tt + t.Run(tt.Case, func(t *testing.T) { + t.Parallel() + + c := gojsonschema.NewStringLoader(tt.Case) + result, err := schema.Validate(c) + if tt.wantErr != nil { + assert.Error(t, err) + assert.True(t, errors.Is(err, tt.wantErr)) + } else { + assert.NoError(t, err) + } + assert.Equal(t, tt.want, result.Valid()) + }) + } +}