From b0f6068e2f22842c6e18b0886911eccbf9d56fec Mon Sep 17 00:00:00 2001 From: Ishan Arya Date: Tue, 21 Jun 2022 19:23:22 +0530 Subject: [PATCH 1/5] feat: add json schema conditional validations --- modules/kubernetes/config_schema.json | 50 +++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/modules/kubernetes/config_schema.json b/modules/kubernetes/config_schema.json index a5aefb79..c0392d2a 100644 --- a/modules/kubernetes/config_schema.json +++ b/modules/kubernetes/config_schema.json @@ -28,7 +28,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 From eb019edb145794a0ec0a290f45b38f9bbbbf1ee6 Mon Sep 17 00:00:00 2001 From: Ishan Arya Date: Wed, 29 Jun 2022 12:57:54 +0530 Subject: [PATCH 2/5] test: add JSONSchema tests --- modules/kubernetes/config_schema_test.go | 115 +++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 modules/kubernetes/config_schema_test.go diff --git a/modules/kubernetes/config_schema_test.go b/modules/kubernetes/config_schema_test.go new file mode 100644 index 00000000..18cf42b4 --- /dev/null +++ b/modules/kubernetes/config_schema_test.go @@ -0,0 +1,115 @@ +package kubernetes + +import ( + "testing" + "fmt" + + "github.com/xeipuuv/gojsonschema" + "github.com/stretchr/testify/assert" + "github.com/odpf/entropy/pkg/errors" +) + +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) + fmt.Println(result) + 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()) + }) + } +} From 1e638e7cfb3a6b42ca5009702b6a9b9f87047c6a Mon Sep 17 00:00:00 2001 From: Ishan Arya Date: Wed, 29 Jun 2022 13:00:47 +0530 Subject: [PATCH 3/5] fix: linting issues --- modules/kubernetes/config_schema_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/kubernetes/config_schema_test.go b/modules/kubernetes/config_schema_test.go index 18cf42b4..8c1cc8e6 100644 --- a/modules/kubernetes/config_schema_test.go +++ b/modules/kubernetes/config_schema_test.go @@ -102,7 +102,6 @@ func TestModule_KubernetesJSONSchema(t *testing.T) { c := gojsonschema.NewStringLoader(tt.Case) result, err := schema.Validate(c) - fmt.Println(result) if tt.wantErr != nil { assert.Error(t, err) assert.True(t, errors.Is(err, tt.wantErr)) From 8d3bbfb392ddd910d656e85a650c755bff551282 Mon Sep 17 00:00:00 2001 From: Ishan Arya Date: Wed, 29 Jun 2022 13:03:01 +0530 Subject: [PATCH 4/5] fix: remove unnecessary imports --- modules/kubernetes/config_schema_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/kubernetes/config_schema_test.go b/modules/kubernetes/config_schema_test.go index 8c1cc8e6..8b04a59f 100644 --- a/modules/kubernetes/config_schema_test.go +++ b/modules/kubernetes/config_schema_test.go @@ -2,8 +2,7 @@ package kubernetes import ( "testing" - "fmt" - + "github.com/xeipuuv/gojsonschema" "github.com/stretchr/testify/assert" "github.com/odpf/entropy/pkg/errors" From edb997241f9f2d4295397df1b2146be3d713eab0 Mon Sep 17 00:00:00 2001 From: Rohil Surana Date: Fri, 1 Jul 2022 15:33:15 +0800 Subject: [PATCH 5/5] fix(kubernetes): add check for host field for URI format and http/s prefix --- modules/kubernetes/config_schema.json | 4 +- modules/kubernetes/config_schema_test.go | 58 ++++++++++++------------ 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/modules/kubernetes/config_schema.json b/modules/kubernetes/config_schema.json index c0392d2a..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", diff --git a/modules/kubernetes/config_schema_test.go b/modules/kubernetes/config_schema_test.go index 8b04a59f..e5994a73 100644 --- a/modules/kubernetes/config_schema_test.go +++ b/modules/kubernetes/config_schema_test.go @@ -1,94 +1,94 @@ package kubernetes import ( + "errors" "testing" - - "github.com/xeipuuv/gojsonschema" + "github.com/stretchr/testify/assert" - "github.com/odpf/entropy/pkg/errors" + "github.com/xeipuuv/gojsonschema" ) func TestModule_KubernetesJSONSchema(t *testing.T) { - tests := []struct{ - Case string + tests := []struct { + Case string wantErr error - want bool + want bool }{ { - Case : `{ - "host": "http:0.0.0.0:1234", + Case: `{ + "host": "http://0.0.0.0:1234", "insecure": true, "token": "token" }`, wantErr: nil, - want: true, + want: true, }, { - Case : `{ - "host": "http:0.0.0.0:1234", + Case: `{ + "host": "http://0.0.0.0:1234", "insecure": false, "token": "token" }`, wantErr: nil, - want: false, + want: false, }, { - Case : `{ - "host": "http:0.0.0.0:1234", + Case: `{ + "host": "http://0.0.0.0:1234", "insecure": false, "cluster_ca_certificate": "c_ca_cert", "token": "token" }`, wantErr: nil, - want: true, + want: true, }, { - Case : `{ - "host": "http:0.0.0.0:1234", + Case: `{ + "host": "http://0.0.0.0:1234", "cluster_ca_certificate": "c_ca_cert", "token": "token" }`, wantErr: nil, - want: true, + want: true, }, { - Case : `{ - "host": "http:0.0.0.0:1234", + Case: `{ + "host": "http://0.0.0.0:1234", "insecure": true, "client_key": "c_key", "client_certificate": "c_cert" }`, wantErr: nil, - want: true, + want: true, }, { - Case : ` "host": "http:0.0.0.0:1234", + Case: ` "host": "http://0.0.0.0:1234", "insecure": true, "client_key": "c_key" }`, wantErr: nil, - want: false, + want: false, }, { - Case : `{ - "host": "http:0.0.0.0:1234", + Case: `{ + "host": "http://0.0.0.0:1234", "insecure": true, "token": "token", "client_key": "c_key", "client_certificate": "c_cert" }`, wantErr: nil, - want: false, + want: false, }, { - Case : `{ - "host": "http:0.0.0.0:1234", + Case: `{ + "host": "http://0.0.0.0:1234", "insecure": true, "token": "token", "client_key": "c_key" }`, wantErr: nil, - want: true, + want: true, }, } loader := gojsonschema.NewStringLoader(configSchema)