From 6992dd51efb60a7552c9c661b94589470a4acc2d Mon Sep 17 00:00:00 2001 From: Travis Raines Date: Fri, 5 Nov 2021 11:18:06 -0700 Subject: [PATCH 1/7] feat(reader) handle _transform field Handle the Kong state _transform field, which indicates whether data should pass through applicable transforms when imported into Kong. As deck passes data through the admin API, it will always pass through transforms. deck rejects the state if _transform=false, as it cannot satisfy this request. --- file/kong_json_schema.json | 3 +++ file/reader.go | 9 ++++++++ file/reader_test.go | 41 +++++++++++++++++++++++++++++++++++ file/types.go | 1 + file/zz_generated.deepcopy.go | 5 +++++ 5 files changed, 59 insertions(+) diff --git a/file/kong_json_schema.json b/file/kong_json_schema.json index 9f048732d..877f36d35 100644 --- a/file/kong_json_schema.json +++ b/file/kong_json_schema.json @@ -17,6 +17,9 @@ }, "type": "object" }, + "_transform": { + "type": "boolean" + }, "_workspace": { "type": "string" }, diff --git a/file/reader.go b/file/reader.go index 682756f99..d96b1c462 100644 --- a/file/reader.go +++ b/file/reader.go @@ -32,6 +32,7 @@ func GetContentFromFiles(filenames []string) (*Content, error) { return getContent(filenames) } +// GetForKonnect process the fileContent and renders a RawState and KonnectRawState func GetForKonnect(fileContent *Content, opt RenderConfig) (*utils.KongRawState, *utils.KonnectRawState, error) { var builder stateBuilder // setup @@ -39,6 +40,10 @@ func GetForKonnect(fileContent *Content, opt RenderConfig) (*utils.KongRawState, builder.currentState = opt.CurrentState builder.kongVersion = opt.KongVersion + if fileContent.Transform != nil && !*fileContent.Transform { + return nil, nil, fmt.Errorf("_transform: false is not supported") + } + kongState, konnectState, err := builder.build() if err != nil { return nil, nil, fmt.Errorf("building state: %w", err) @@ -58,6 +63,10 @@ func Get(fileContent *Content, opt RenderConfig, dumpConfig dump.Config) (*utils builder.selectTags = dumpConfig.SelectorTags } + if fileContent.Transform != nil && !*fileContent.Transform { + return nil, fmt.Errorf("_transform: false is not supported") + } + state, _, err := builder.build() if err != nil { return nil, fmt.Errorf("building state: %w", err) diff --git a/file/reader_test.go b/file/reader_test.go index 7feb0b0bd..f08d4d43f 100644 --- a/file/reader_test.go +++ b/file/reader_test.go @@ -2,6 +2,7 @@ package file import ( "bytes" + "errors" "io/ioutil" "os" "reflect" @@ -71,6 +72,46 @@ func TestReadKongStateFromStdinFailsToParseText(t *testing.T) { assert.Nil(c) } +func TestTransformNotFalse(t *testing.T) { + filenames := []string{"-"} + assert := assert.New(t) + assert.Equal("-", filenames[0]) + + var content bytes.Buffer + content.Write([]byte("_transform: false\nservices:\n- host: test.com\n name: test service\n")) + + tmpfile, err := ioutil.TempFile("", "example") + if err != nil { + panic(err) + } + defer os.Remove(tmpfile.Name()) + + if _, err := tmpfile.Write(content.Bytes()); err != nil { + panic(err) + } + + if _, err := tmpfile.Seek(0, 0); err != nil { + panic(err) + } + + oldStdin := os.Stdin + defer func() { os.Stdin = oldStdin }() // Restore original Stdin + + os.Stdin = tmpfile + + c, err := GetContentFromFiles(filenames) + if err != nil { + panic(err) + } + parsed, err := Get(c, RenderConfig{}) + assert.Equal(err, errors.New("_transform: false is not supported")) + assert.Nil(parsed) + + parsed, _, err = GetForKonnect(c, RenderConfig{}) + assert.Equal(err, errors.New("_transform: false is not supported")) + assert.Nil(parsed) +} + func TestReadKongStateFromStdin(t *testing.T) { filenames := []string{"-"} assert := assert.New(t) diff --git a/file/types.go b/file/types.go index 4afeb5c4b..d1f0fca4e 100644 --- a/file/types.go +++ b/file/types.go @@ -598,6 +598,7 @@ func (s FServicePackage) sortKey() string { // +k8s:deepcopy-gen=true type Content struct { FormatVersion string `json:"_format_version,omitempty" yaml:"_format_version,omitempty"` + Transform *bool `json:"_transform,omitempty" yaml:"_transform,omitempty"` Info *Info `json:"_info,omitempty" yaml:"_info,omitempty"` Workspace string `json:"_workspace,omitempty" yaml:"_workspace,omitempty"` diff --git a/file/zz_generated.deepcopy.go b/file/zz_generated.deepcopy.go index 3102c1518..58ae4b1be 100644 --- a/file/zz_generated.deepcopy.go +++ b/file/zz_generated.deepcopy.go @@ -28,6 +28,11 @@ import ( // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Content) DeepCopyInto(out *Content) { *out = *in + if in.Transform != nil { + in, out := &in.Transform, &out.Transform + *out = new(bool) + **out = **in + } if in.Info != nil { in, out := &in.Info, &out.Info *out = new(Info) From 8392c06d8ba809f7541e5a49a02612b076720b4f Mon Sep 17 00:00:00 2001 From: Travis Raines Date: Wed, 24 Nov 2021 13:36:59 -0800 Subject: [PATCH 2/7] pr: apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: MichaƂ Flendrich --- file/reader.go | 2 +- file/reader_test.go | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/file/reader.go b/file/reader.go index d96b1c462..a5003bbc7 100644 --- a/file/reader.go +++ b/file/reader.go @@ -32,7 +32,7 @@ func GetContentFromFiles(filenames []string) (*Content, error) { return getContent(filenames) } -// GetForKonnect process the fileContent and renders a RawState and KonnectRawState +// GetForKonnect processes the fileContent and renders a RawState and KonnectRawState func GetForKonnect(fileContent *Content, opt RenderConfig) (*utils.KongRawState, *utils.KonnectRawState, error) { var builder stateBuilder // setup diff --git a/file/reader_test.go b/file/reader_test.go index f08d4d43f..c8d6acc5f 100644 --- a/file/reader_test.go +++ b/file/reader_test.go @@ -75,7 +75,6 @@ func TestReadKongStateFromStdinFailsToParseText(t *testing.T) { func TestTransformNotFalse(t *testing.T) { filenames := []string{"-"} assert := assert.New(t) - assert.Equal("-", filenames[0]) var content bytes.Buffer content.Write([]byte("_transform: false\nservices:\n- host: test.com\n name: test service\n")) From 85e1ab87beb3bbaaa883bb59983ba11b36481352 Mon Sep 17 00:00:00 2001 From: Travis Raines Date: Wed, 24 Nov 2021 13:45:39 -0800 Subject: [PATCH 3/7] pr: define static errors --- file/reader.go | 11 ++++++++--- file/reader_test.go | 5 ++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/file/reader.go b/file/reader.go index a5003bbc7..7cee498e8 100644 --- a/file/reader.go +++ b/file/reader.go @@ -9,6 +9,11 @@ import ( "github.com/kong/deck/utils" ) +var ( + ErrorTransformFalseNotSupported = fmt.Errorf("_transform: false is not supported") + ErrorFilenameEmpty = fmt.Errorf("filename cannot be empty") +) + // RenderConfig contains necessary information to render a correct // KongConfig from a file. type RenderConfig struct { @@ -26,7 +31,7 @@ type RenderConfig struct { // or if there is any error during processing. func GetContentFromFiles(filenames []string) (*Content, error) { if len(filenames) == 0 { - return nil, fmt.Errorf("filename cannot be empty") + return nil, ErrorFilenameEmpty } return getContent(filenames) @@ -41,7 +46,7 @@ func GetForKonnect(fileContent *Content, opt RenderConfig) (*utils.KongRawState, builder.kongVersion = opt.KongVersion if fileContent.Transform != nil && !*fileContent.Transform { - return nil, nil, fmt.Errorf("_transform: false is not supported") + return nil, nil, ErrorTransformFalseNotSupported } kongState, konnectState, err := builder.build() @@ -64,7 +69,7 @@ func Get(fileContent *Content, opt RenderConfig, dumpConfig dump.Config) (*utils } if fileContent.Transform != nil && !*fileContent.Transform { - return nil, fmt.Errorf("_transform: false is not supported") + return nil, ErrorTransformFalseNotSupported } state, _, err := builder.build() diff --git a/file/reader_test.go b/file/reader_test.go index c8d6acc5f..3eb6c37af 100644 --- a/file/reader_test.go +++ b/file/reader_test.go @@ -2,7 +2,6 @@ package file import ( "bytes" - "errors" "io/ioutil" "os" "reflect" @@ -103,11 +102,11 @@ func TestTransformNotFalse(t *testing.T) { panic(err) } parsed, err := Get(c, RenderConfig{}) - assert.Equal(err, errors.New("_transform: false is not supported")) + assert.Equal(err, ErrorTransformFalseNotSupported) assert.Nil(parsed) parsed, _, err = GetForKonnect(c, RenderConfig{}) - assert.Equal(err, errors.New("_transform: false is not supported")) + assert.Equal(err, ErrorTransformFalseNotSupported) assert.Nil(parsed) } From 04bf898927561947b5da4f592235cb4258583f6a Mon Sep 17 00:00:00 2001 From: Travis Raines Date: Wed, 24 Nov 2021 13:49:45 -0800 Subject: [PATCH 4/7] pr: docstrings --- file/reader.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/file/reader.go b/file/reader.go index 7cee498e8..ae47821a8 100644 --- a/file/reader.go +++ b/file/reader.go @@ -10,8 +10,10 @@ import ( ) var ( + // ErrorTransformFalseNotSupported indicates that no transform mode is not supported ErrorTransformFalseNotSupported = fmt.Errorf("_transform: false is not supported") - ErrorFilenameEmpty = fmt.Errorf("filename cannot be empty") + // ErrorFilenameEmpty indicates that you must provide a filename + ErrorFilenameEmpty = fmt.Errorf("filename cannot be empty") ) // RenderConfig contains necessary information to render a correct From 67b9c81768881501486d00cc9abcd0b8eacb6624 Mon Sep 17 00:00:00 2001 From: Travis Raines Date: Wed, 24 Nov 2021 13:58:27 -0800 Subject: [PATCH 5/7] pr: simplify test --- file/reader_test.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/file/reader_test.go b/file/reader_test.go index 3eb6c37af..62bb6ca92 100644 --- a/file/reader_test.go +++ b/file/reader_test.go @@ -75,16 +75,13 @@ func TestTransformNotFalse(t *testing.T) { filenames := []string{"-"} assert := assert.New(t) - var content bytes.Buffer - content.Write([]byte("_transform: false\nservices:\n- host: test.com\n name: test service\n")) - tmpfile, err := ioutil.TempFile("", "example") if err != nil { panic(err) } defer os.Remove(tmpfile.Name()) - if _, err := tmpfile.Write(content.Bytes()); err != nil { + if _, err := tmpfile.WriteString("_transform: false\nservices:\n- host: test.com\n name: test service\n"); err != nil { panic(err) } From 5c988a57c501f3e8a7afb1023e5c17563476049a Mon Sep 17 00:00:00 2001 From: Travis Raines Date: Wed, 24 Nov 2021 14:02:10 -0800 Subject: [PATCH 6/7] pr: handle updated function signature --- file/reader_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/file/reader_test.go b/file/reader_test.go index 62bb6ca92..9069dc3eb 100644 --- a/file/reader_test.go +++ b/file/reader_test.go @@ -7,6 +7,7 @@ import ( "reflect" "testing" + "github.com/kong/deck/dump" "github.com/kong/go-kong/kong" "github.com/stretchr/testify/assert" ) @@ -98,7 +99,7 @@ func TestTransformNotFalse(t *testing.T) { if err != nil { panic(err) } - parsed, err := Get(c, RenderConfig{}) + parsed, err := Get(c, RenderConfig{}, dump.Config{}) assert.Equal(err, ErrorTransformFalseNotSupported) assert.Nil(parsed) From 4dc48ffc18c338b7ebf85c72d0ff59b3ce81b40b Mon Sep 17 00:00:00 2001 From: Travis Raines Date: Wed, 24 Nov 2021 14:05:33 -0800 Subject: [PATCH 7/7] pr: begone line length linter --- file/reader_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/file/reader_test.go b/file/reader_test.go index 9069dc3eb..8288443a7 100644 --- a/file/reader_test.go +++ b/file/reader_test.go @@ -82,7 +82,8 @@ func TestTransformNotFalse(t *testing.T) { } defer os.Remove(tmpfile.Name()) - if _, err := tmpfile.WriteString("_transform: false\nservices:\n- host: test.com\n name: test service\n"); err != nil { + _, err = tmpfile.WriteString("_transform: false\nservices:\n- host: test.com\n name: test service\n") + if err != nil { panic(err) }