Skip to content

Commit

Permalink
feat(convert): convert to KIC (#1050)
Browse files Browse the repository at this point in the history
  • Loading branch information
Tieske committed Feb 29, 2024
1 parent a18140f commit 4743c24
Show file tree
Hide file tree
Showing 32 changed files with 11,194 additions and 64 deletions.
11 changes: 9 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,17 @@ _testmain.go
*.test
*.prof

# Apple cruft
.DS_Store

# for this repo only
deck
dist/
docs/cli-docs/

# vscode editor files
.vscode/
# editor files
.vscode/
.idea/

# generated test 'actuals'
kong2kic/testdata/**/*-actual.*
126 changes: 126 additions & 0 deletions cmd/file_kong2kic.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
package cmd

import (
"fmt"
"log"
"strings"

"github.com/kong/deck/kong2kic"
"github.com/kong/go-apiops/logbasics"
"github.com/kong/go-database-reconciler/pkg/file"
"github.com/spf13/cobra"
)

var (
cmdKong2KicInputFilename string
cmdKong2KicOutputFilename string
cmdKong2KicOutputFormat string
cmdKong2KicClassName string
cmdKong2KicIngress bool
cmdKong2KicVersion string
)

// Executes the CLI command "kong2kic"
func executeKong2Kic(cmd *cobra.Command, _ []string) error {
_ = sendAnalytics("file-kong2kic", "", modeLocal)
var (
outputContent *file.Content
err error
outputFileFormat file.Format
yamlOrJSON string
)

kong2kic.ClassName = cmdKong2KicClassName
verbosity, _ := cmd.Flags().GetInt("verbose")
logbasics.Initialize(log.LstdFlags, verbosity)

inputContent, err := file.GetContentFromFiles([]string{cmdKong2KicInputFilename}, false)
if err != nil {
return fmt.Errorf("failed reading input file '%s'; %w", cmdKong2KicInputFilename, err)
}

outputFileFormat, yamlOrJSON, err = validateInput(cmdKong2KicOutputFormat)
if err != nil {
return err
}

outputContent = inputContent.DeepCopy()
err = kong2kic.WriteContentToFile(outputContent, cmdKong2KicOutputFilename, outputFileFormat, yamlOrJSON)
if err != nil {
return fmt.Errorf("failed converting Kong to Ingress '%s'; %w", cmdKong2KicInputFilename, err)
}

return nil
}

func validateInput(cmdKong2KicOutputFormat string) (
outputFileFormat file.Format,
yamlOrJSON string,
err error,
) {
outputFormat := strings.ToUpper(cmdKong2KicOutputFormat)
version := cmdKong2KicVersion
ingress := cmdKong2KicIngress

// if cmdKong2KicVersion is not 2 or 3 set an error
if version != "2" && version != "3" {
err = fmt.Errorf("invalid KIC version '%s'. Please use --help for more information", version)
} else {
switch {
case version == "3" && !ingress:
outputFileFormat = kong2kic.KICV3GATEWAY
case version == "3" && ingress:
outputFileFormat = kong2kic.KICV3INGRESS
case version == "2" && !ingress:
outputFileFormat = kong2kic.KICV2GATEWAY
case version == "2" && ingress:
outputFileFormat = kong2kic.KICV2INGRESS
default:
err = fmt.Errorf("invalid combination of parameters. Please use --help for more information")
}

if outputFormat == file.YAML {
yamlOrJSON = file.YAML
} else if outputFormat == file.JSON {
yamlOrJSON = file.JSON
}
}

return outputFileFormat, yamlOrJSON, err
}

//
//
// Define the CLI data for the kong2kic command
//
//

func newKong2KicCmd() *cobra.Command {
kong2KicCmd := &cobra.Command{
Use: "kong2kic",
Short: "Convert Kong configuration files to Kong Ingress Controller (KIC) manifests",
Long: `Convert Kong configuration files to Kong Ingress Controller (KIC) manifests.
The kong2kic subcommand transforms Kong’s configuration files, written in the deck format,
into Kubernetes manifests suitable for the Kong Ingress Controller. By default kong2kic generates
manifests for KIC v3.x using the Kubernetes Gateway API. Only HTTP/HTTPS routes are supported.`,
RunE: executeKong2Kic,
Args: cobra.NoArgs,
}

kong2KicCmd.Flags().StringVarP(&cmdKong2KicInputFilename, "state", "s", "-",
"decK file to process. Use - to read from stdin.")
kong2KicCmd.Flags().StringVarP(&cmdKong2KicOutputFilename, "output-file", "o", "-",
"Output file to write. Use - to write to stdout.")
kong2KicCmd.Flags().StringVarP(&cmdKong2KicOutputFormat, "format", "f", "yaml",
"Output file format: json or yaml.")
kong2KicCmd.Flags().StringVar(&cmdKong2KicVersion, "kic-version", "3",
"Generate manifests for KIC v3 or v2. Possible values are 2 or 3.")
kong2KicCmd.Flags().StringVar(&cmdKong2KicClassName, "class-name", "kong",
`Value to use for "kubernetes.io/ingress.class" ObjectMeta.Annotations and for
"parentRefs.name" in the case of HTTPRoute.`)
kong2KicCmd.Flags().BoolVar(&cmdKong2KicIngress, "ingress", false,
`Use Kubernetes Ingress API manifests instead of Gateway API manifests.`)

return kong2KicCmd
}
1 change: 1 addition & 0 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,7 @@ It can be used to export, import, or sync entities to Kong.`,
fileCmd.AddCommand(newNamespaceCmd())
fileCmd.AddCommand(newConvertCmd(false))
fileCmd.AddCommand(newValidateCmd(false, false)) // file-based validation
fileCmd.AddCommand(newKong2KicCmd())
}
return rootCmd
}
Expand Down
1 change: 1 addition & 0 deletions convert/convert_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,7 @@ func Test_Convert(t *testing.T) {
wantErr: true,
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
inputFiles := tt.args.inputFilenames
Expand Down
75 changes: 45 additions & 30 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module github.com/kong/deck

go 1.21.1
go 1.21.6

replace github.com/yudai/gojsondiff v1.0.0 => github.com/Kong/gojsondiff v1.3.0

Expand All @@ -10,7 +10,7 @@ require (
github.com/daveshanley/vacuum v0.5.0
github.com/fatih/color v1.15.0
github.com/google/go-cmp v0.6.0
github.com/kong/go-apiops v0.1.29
github.com/kong/go-apiops v0.1.30
github.com/kong/go-database-reconciler v1.7.0
github.com/kong/go-kong v0.51.1-0.20240125175037-0c077f5b9ac7
github.com/mitchellh/go-homedir v1.1.0
Expand All @@ -19,24 +19,43 @@ require (
github.com/spf13/viper v1.18.2
github.com/stretchr/testify v1.8.4
golang.org/x/sync v0.6.0
k8s.io/api v0.29.1
k8s.io/apiextensions-apiserver v0.29.1
k8s.io/apimachinery v0.29.1
k8s.io/code-generator v0.29.1
sigs.k8s.io/gateway-api v1.0.0
sigs.k8s.io/yaml v1.4.0
)

require (
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/hashicorp/go-memdb v1.3.4 // indirect
github.com/hashicorp/go-retryablehttp v0.7.5 // indirect
github.com/hexops/gotextdiff v1.0.3 // indirect
github.com/imdario/mergo v0.3.16 // indirect
github.com/pb33f/libopenapi v0.13.11 // indirect
github.com/pb33f/libopenapi-validator v0.0.28 // indirect
github.com/shirou/gopsutil/v3 v3.24.1 // indirect
github.com/ssgelm/cookiejarparser v1.0.1 // indirect
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)

require (
atomicgo.dev/cursor v0.2.0 // indirect
atomicgo.dev/keyboard v0.2.9 // indirect
atomicgo.dev/schedule v0.1.0 // indirect
dario.cat/mergo v1.0.0 // indirect
github.com/Kong/go-diff v1.2.2 // indirect
github.com/Kong/gojsondiff v1.3.2 // indirect
github.com/adrg/strutil v0.2.3 // indirect
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
github.com/adrg/strutil v0.3.0 // indirect
github.com/containerd/console v1.0.3 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/dlclark/regexp2 v1.10.0 // indirect
github.com/dop251/goja v0.0.0-20231027120936-b396bb4c349d // indirect
github.com/dop251/goja_nodejs v0.0.0-20231022114343-5c1f9037c9ab // indirect
github.com/dop251/goja_nodejs v0.0.0-20231122114759-e84d9a924c5c // indirect
github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936 // indirect
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
Expand All @@ -45,33 +64,31 @@ require (
github.com/go-logr/logr v1.4.1 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-openapi/jsonpointer v0.19.6 // indirect
github.com/go-openapi/jsonreference v0.20.2 // indirect
github.com/go-openapi/swag v0.22.3 // indirect
github.com/go-openapi/jsonpointer v0.20.2 // indirect
github.com/go-openapi/jsonreference v0.20.4 // indirect
github.com/go-openapi/swag v0.22.7 // indirect
github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/google/gnostic-models v0.6.8 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gookit/color v1.5.4 // indirect
github.com/gosimple/slug v1.13.1
github.com/gosimple/unidecode v1.0.1 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
github.com/hashicorp/go-memdb v1.3.4 // indirect
github.com/hashicorp/go-retryablehttp v0.7.5 // indirect
github.com/hashicorp/golang-lru v0.5.4 // indirect
github.com/hashicorp/golang-lru v1.0.2 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hexops/gotextdiff v1.0.3 // indirect
github.com/imdario/mergo v0.3.16 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/invopop/yaml v0.1.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/kong/go-slugify v1.0.0 // indirect
github.com/kong/kubernetes-ingress-controller/v3 v3.1.0
github.com/kong/semver/v4 v4.0.1 // indirect
github.com/lithammer/fuzzysearch v1.1.8 // indirect
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
Expand All @@ -82,49 +99,47 @@ require (
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/mozillazg/go-unidecode v0.2.0 // indirect
github.com/pb33f/libopenapi v0.13.11 // indirect
github.com/pb33f/libopenapi-validator v0.0.28 // indirect
github.com/pelletier/go-toml/v2 v2.1.0 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
github.com/pterm/pterm v0.12.70 // indirect
github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect
github.com/pterm/pterm v0.12.77 // indirect
github.com/rivo/uniseg v0.4.4 // indirect
github.com/sagikazarmark/locafero v0.4.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect
github.com/shirou/gopsutil/v3 v3.24.1 // indirect
github.com/shoenig/go-m1cpu v0.1.6 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/afero v1.11.0 // indirect
github.com/spf13/cast v1.6.0 // indirect
github.com/ssgelm/cookiejarparser v1.0.1 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
github.com/tidwall/gjson v1.17.0 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.0 // indirect
github.com/tidwall/pretty v1.2.1 // indirect
github.com/tklauser/go-sysconf v0.3.12 // indirect
github.com/tklauser/numcpus v0.6.1 // indirect
github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect
github.com/yusufpapurcu/wmi v1.2.3 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect
golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect
golang.org/x/mod v0.14.0 // indirect
golang.org/x/net v0.19.0 // indirect
golang.org/x/net v0.20.0 // indirect
golang.org/x/sys v0.17.0 // indirect
golang.org/x/term v0.17.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/tools v0.16.1 // indirect
google.golang.org/protobuf v1.31.0 // indirect
golang.org/x/tools v0.17.0 // indirect
google.golang.org/protobuf v1.32.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 // indirect
k8s.io/klog/v2 v2.110.1 // indirect
k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect
k8s.io/kube-openapi v0.0.0-20240103051144-eec4567ac022 // indirect
k8s.io/utils v0.0.0-20240102154912-e7106e64919e // indirect
sigs.k8s.io/controller-runtime v0.17.0 // indirect
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
)

0 comments on commit 4743c24

Please sign in to comment.