diff --git a/changelog/fragments/generate-crds-non-go.yaml b/changelog/fragments/generate-crds-non-go.yaml new file mode 100644 index 0000000000..2b936cc0f8 --- /dev/null +++ b/changelog/fragments/generate-crds-non-go.yaml @@ -0,0 +1,7 @@ +entries: + - description: > + The `generate crds` subcommand now checks for the existence of the + `pkg/apis` directory and logs a descriptive fatal error message if + it does not exist or is not a directory. + + kind: "bugfix" diff --git a/cmd/operator-sdk/generate/crds.go b/cmd/operator-sdk/generate/crds.go index a81d2122ac..e678ac2aa6 100644 --- a/cmd/operator-sdk/generate/crds.go +++ b/cmd/operator-sdk/generate/crds.go @@ -16,12 +16,15 @@ package generate import ( "fmt" - - gencrd "github.com/operator-framework/operator-sdk/internal/generate/crd" - "github.com/operator-framework/operator-sdk/internal/genutil" + "os" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + + gencrd "github.com/operator-framework/operator-sdk/internal/generate/crd" + "github.com/operator-framework/operator-sdk/internal/genutil" + "github.com/operator-framework/operator-sdk/internal/scaffold" + "github.com/operator-framework/operator-sdk/internal/util/projutil" ) var ( @@ -54,6 +57,16 @@ func crdsFunc(cmd *cobra.Command, args []string) error { if len(args) != 0 { return fmt.Errorf("command %s doesn't accept any arguments", cmd.CommandPath()) } + projutil.MustInProjectRoot() + + stat, err := os.Stat(scaffold.ApisDir) + if os.IsNotExist(err) { + log.Fatalf("Failed to generate CRDs; directory %q not found.", scaffold.ApisDir) + } else if err != nil { + log.Fatalf("Failed to generate CRDs; stat: %v", err) + } else if !stat.IsDir() { + log.Fatalf("Failed to generate CRDs; expected %q to be a directory.", scaffold.ApisDir) + } // Skip usage printing on error, since this command will never fail from // improper CLI usage.