From 316e4314edccfff2a9cb02342aa5d75f860813c6 Mon Sep 17 00:00:00 2001 From: Natasha Sarkar Date: Fri, 19 Feb 2021 10:46:18 -0800 Subject: [PATCH] added openapi fetch command to get schema from local cluster --- kustomize/commands/openapi/fetch/fetch.go | 73 +++++++++++++++++++++++ kustomize/commands/openapi/openapi.go | 2 + kustomize/go.mod | 2 + 3 files changed, 77 insertions(+) create mode 100644 kustomize/commands/openapi/fetch/fetch.go diff --git a/kustomize/commands/openapi/fetch/fetch.go b/kustomize/commands/openapi/fetch/fetch.go new file mode 100644 index 000000000..332b0e855 --- /dev/null +++ b/kustomize/commands/openapi/fetch/fetch.go @@ -0,0 +1,73 @@ +package fetch + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "os/exec" + "time" + + "github.com/spf13/cobra" +) + +// NewCmdFetch makes a new fetch command. +func NewCmdFetch(w io.Writer) *cobra.Command { + infoCmd := cobra.Command{ + Use: "fetch", + Short: `Fetches the OpenAPI specification from the current kubernetes cluster specified +in the user's kubeconfig`, + Example: `kustomize openapi fetch`, + Run: func(cmd *cobra.Command, args []string) { + printSchema(w) + }, + Hidden: true, + } + + return &infoCmd +} + +func printSchema(w io.Writer) { + fmt.Fprintln(w, "Fetching schema from cluster") + errMsg := ` +Error fetching schema from cluster. +Please make sure port 8081 is available, kubectl is installed, and its context is set correctly. +Installation and setup instructions: https://kubernetes.io/docs/tasks/tools/install-kubectl/` + + command := exec.Command("kubectl", []string{"proxy", "--port=8081", "&"}...) + var stderr bytes.Buffer + command.Stderr = &stderr + err := command.Start() + defer killProcess(command) + + // give the proxy a second to start up + time.Sleep(time.Second) + + if err != nil || stderr.String() != "" { + fmt.Fprintln(w, err, stderr.String()+errMsg) + return + } + + commandCurl := exec.Command("curl", []string{"http://localhost:8081/openapi/v2"}...) + var stdout bytes.Buffer + commandCurl.Stdout = &stdout + commandCurl.Stderr = &stderr + err = commandCurl.Run() + if err != nil || stdout.String() == "" { + fmt.Fprintln(w, err, stderr.String()+errMsg) + return + } + + // format and output + var jsonSchema map[string]interface{} + output := stdout.Bytes() + json.Unmarshal(output, &jsonSchema) + output, _ = json.MarshalIndent(jsonSchema, "", " ") + fmt.Fprintln(w, string(output)) +} + +func killProcess(command *exec.Cmd) { + if command.Process != nil { + command.Process.Kill() + } +} diff --git a/kustomize/commands/openapi/openapi.go b/kustomize/commands/openapi/openapi.go index 9bb713f4e..d60442cfe 100644 --- a/kustomize/commands/openapi/openapi.go +++ b/kustomize/commands/openapi/openapi.go @@ -8,6 +8,7 @@ import ( "github.com/spf13/cobra" "sigs.k8s.io/kustomize/cmd/config/configcobra" + "sigs.k8s.io/kustomize/kustomize/v4/commands/openapi/fetch" "sigs.k8s.io/kustomize/kustomize/v4/commands/openapi/info" ) @@ -22,6 +23,7 @@ func NewCmdOpenAPI(w io.Writer) *cobra.Command { } openApiCmd.AddCommand(info.NewCmdInfo(w)) + openApiCmd.AddCommand(fetch.NewCmdFetch(w)) configcobra.AddCommands(openApiCmd, "openapi") return openApiCmd diff --git a/kustomize/go.mod b/kustomize/go.mod index b57578b61..aeda133d8 100644 --- a/kustomize/go.mod +++ b/kustomize/go.mod @@ -23,3 +23,5 @@ replace sigs.k8s.io/kustomize/api => ../api replace sigs.k8s.io/kustomize/cmd/config => ../cmd/config replace sigs.k8s.io/kustomize/kyaml => ../kyaml + +replace sigs.k8s.io/kustomize/kustomize/v4/commands => ./commands