From be94424d71f738a8620a90e341d20eb301d41154 Mon Sep 17 00:00:00 2001 From: fanmin shi Date: Thu, 1 Mar 2018 10:47:12 -0800 Subject: [PATCH 1/2] cmd: move error.go as its own pkg --- commands/operator-sdk/cmd/build.go | 13 +++++++------ commands/operator-sdk/cmd/generate/k8s.go | 17 +++++++++++++---- commands/operator-sdk/cmd/new.go | 13 +++++++------ commands/operator-sdk/{cmd => error}/error.go | 2 +- 4 files changed, 28 insertions(+), 17 deletions(-) rename commands/operator-sdk/{cmd => error}/error.go (96%) diff --git a/commands/operator-sdk/cmd/build.go b/commands/operator-sdk/cmd/build.go index 2187167746..c9361f7ade 100644 --- a/commands/operator-sdk/cmd/build.go +++ b/commands/operator-sdk/cmd/build.go @@ -6,6 +6,7 @@ import ( "os" "os/exec" + cmdError "github.com/coreos/operator-sdk/commands/operator-sdk/error" "github.com/coreos/operator-sdk/pkg/generator" "github.com/spf13/cobra" @@ -40,13 +41,13 @@ const ( func buildFunc(cmd *cobra.Command, args []string) { if len(args) != 1 { - ExitWithError(ExitBadArgs, fmt.Errorf("new command needs 1 argument.")) + cmdError.ExitWithError(cmdError.ExitBadArgs, fmt.Errorf("new command needs 1 argument.")) } bcmd := exec.Command(build) o, err := bcmd.CombinedOutput() if err != nil { - ExitWithError(ExitError, fmt.Errorf("failed to build: (%v)", string(o))) + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to build: (%v)", string(o))) } fmt.Fprintln(os.Stdout, string(o)) @@ -55,19 +56,19 @@ func buildFunc(cmd *cobra.Command, args []string) { dbcmd.Env = append(os.Environ(), fmt.Sprintf("IMAGE=%v", image)) o, err = dbcmd.CombinedOutput() if err != nil { - ExitWithError(ExitError, fmt.Errorf("failed to output build image %v: (%v)", image, string(o))) + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to output build image %v: (%v)", image, string(o))) } fmt.Fprintln(os.Stdout, string(o)) c := &generator.Config{} fp, err := ioutil.ReadFile(configYaml) if err != nil { - ExitWithError(ExitError, fmt.Errorf("failed to read config file %v: (%v)", configYaml, err)) + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to read config file %v: (%v)", configYaml, err)) } if err = yaml.Unmarshal(fp, c); err != nil { - ExitWithError(ExitError, fmt.Errorf("failed to unmarshal config file %v: (%v)", configYaml, err)) + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to unmarshal config file %v: (%v)", configYaml, err)) } if err = generator.RenderDeployFiles(c, image); err != nil { - ExitWithError(ExitError, fmt.Errorf("failed to generate deploy/operator.yaml: (%v)", err)) + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to generate deploy/operator.yaml: (%v)", err)) } } diff --git a/commands/operator-sdk/cmd/generate/k8s.go b/commands/operator-sdk/cmd/generate/k8s.go index 6dd835903f..2f3e8c4579 100644 --- a/commands/operator-sdk/cmd/generate/k8s.go +++ b/commands/operator-sdk/cmd/generate/k8s.go @@ -1,6 +1,11 @@ package generate -import "github.com/spf13/cobra" +import ( + "fmt" + + cmdError "github.com/coreos/operator-sdk/commands/operator-sdk/error" + "github.com/spf13/cobra" +) func NewGenerateK8SCmd() *cobra.Command { return &cobra.Command{ @@ -9,8 +14,12 @@ func NewGenerateK8SCmd() *cobra.Command { Long: `k8s generator generates code for custom resource given the API spec to comply with kube-API requirements. `, - Run: func(cmd *cobra.Command, args []string) { - panic("UNIMPLEMENTED") - }, + Run: k8sFunc, + } +} + +func k8sFunc(cmd *cobra.Command, args []string) { + if len(args) != 0 { + cmdError.ExitWithError(cmdError.ExitBadArgs, fmt.Errorf("k8s command doesn't accept any inputs.")) } } diff --git a/commands/operator-sdk/cmd/new.go b/commands/operator-sdk/cmd/new.go index e43f4a623a..76e2e90fb5 100644 --- a/commands/operator-sdk/cmd/new.go +++ b/commands/operator-sdk/cmd/new.go @@ -6,6 +6,7 @@ import ( "path/filepath" "strings" + cmdError "github.com/coreos/operator-sdk/commands/operator-sdk/error" "github.com/coreos/operator-sdk/pkg/generator" "github.com/spf13/cobra" @@ -52,21 +53,21 @@ const ( func newFunc(cmd *cobra.Command, args []string) { if len(args) != 1 { - ExitWithError(ExitBadArgs, fmt.Errorf("new command needs 1 argument.")) + cmdError.ExitWithError(cmdError.ExitBadArgs, fmt.Errorf("new command needs 1 argument.")) } parse(args) verifyFlags() g := generator.NewGenerator(apiVersion, kind, projectName, repoPath()) err := g.Render() if err != nil { - ExitWithError(ExitError, fmt.Errorf("failed to create project %v: %v", projectName, err)) + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to create project %v: %v", projectName, err)) } } func parse(args []string) { projectName = args[0] if len(projectName) == 0 { - ExitWithError(ExitBadArgs, fmt.Errorf("project-name must not be empty")) + cmdError.ExitWithError(cmdError.ExitBadArgs, fmt.Errorf("project-name must not be empty")) } } @@ -74,15 +75,15 @@ func parse(args []string) { func repoPath() string { gp := os.Getenv(gopath) if len(gp) == 0 { - ExitWithError(ExitError, fmt.Errorf("$GOPATH env not set")) + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("$GOPATH env not set")) } wd, err := os.Getwd() if err != nil { - ExitWithError(ExitError, fmt.Errorf("failed to determine the full path of the current directory: %v", err)) + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to determine the full path of the current directory: %v", err)) } // check if this project's repository path is rooted under $GOPATH if !strings.HasPrefix(wd, gp) { - ExitWithError(ExitError, fmt.Errorf("project's repository path (%v) is not rooted under GOPATH (%v)", wd, gp)) + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("project's repository path (%v) is not rooted under GOPATH (%v)", wd, gp)) } // compute the repo path by stripping "$GOPATH/src/" from the path of the current directory. rp := filepath.Join(string(wd[len(filepath.Join(gp, src)):]), projectName) diff --git a/commands/operator-sdk/cmd/error.go b/commands/operator-sdk/error/error.go similarity index 96% rename from commands/operator-sdk/cmd/error.go rename to commands/operator-sdk/error/error.go index c79c430bdf..3774af97a6 100644 --- a/commands/operator-sdk/cmd/error.go +++ b/commands/operator-sdk/error/error.go @@ -1,4 +1,4 @@ -package cmd +package error import ( "fmt" From bfa0be714634c6c67cba2d76c488e1a286189469 Mon Sep 17 00:00:00 2001 From: fanmin shi Date: Thu, 1 Mar 2018 11:09:45 -0800 Subject: [PATCH 2/2] cmd: implemnt k8s command --- commands/operator-sdk/cmd/generate/k8s.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/commands/operator-sdk/cmd/generate/k8s.go b/commands/operator-sdk/cmd/generate/k8s.go index 2f3e8c4579..616cffbac2 100644 --- a/commands/operator-sdk/cmd/generate/k8s.go +++ b/commands/operator-sdk/cmd/generate/k8s.go @@ -1,12 +1,20 @@ package generate import ( + "errors" "fmt" + "os" + "os/exec" cmdError "github.com/coreos/operator-sdk/commands/operator-sdk/error" + "github.com/spf13/cobra" ) +const ( + k8sGenerated = "./tmp/codegen/update-generated.sh" +) + func NewGenerateK8SCmd() *cobra.Command { return &cobra.Command{ Use: "k8s", @@ -20,6 +28,13 @@ to comply with kube-API requirements. func k8sFunc(cmd *cobra.Command, args []string) { if len(args) != 0 { - cmdError.ExitWithError(cmdError.ExitBadArgs, fmt.Errorf("k8s command doesn't accept any inputs.")) + cmdError.ExitWithError(cmdError.ExitBadArgs, errors.New("k8s command doesn't accept any arguments.")) + } + + kcmd := exec.Command(k8sGenerated) + o, err := kcmd.CombinedOutput() + if err != nil { + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to perform code-generation for CustomResources: (%v)", string(o))) } + fmt.Fprintln(os.Stdout, string(o)) }