From 8b62c4de73980788097894914a7495ffb93deb62 Mon Sep 17 00:00:00 2001 From: Camila Macedo Date: Fri, 3 Jul 2020 18:23:30 +0100 Subject: [PATCH] removal: new cmd for Helm projects --- .travis.yml | 5 - Makefile | 7 +- .../fragments/remove-new-cmd-for-helm.yaml | 17 ++ cmd/operator-sdk/main.go | 11 + cmd/operator-sdk/new/cmd.go | 70 +------ hack/tests/e2e-helm.sh | 193 ------------------ internal/flags/apiflags/flags.go | 17 ++ .../content/en/docs/cli/operator-sdk_new.md | 49 +---- .../en/docs/new-cli/operator-sdk_new.md | 49 +---- 9 files changed, 65 insertions(+), 353 deletions(-) create mode 100644 changelog/fragments/remove-new-cmd-for-helm.yaml delete mode 100755 hack/tests/e2e-helm.sh diff --git a/.travis.yml b/.travis.yml index 8f3c8e788bf..8ecfd9d100e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -161,11 +161,6 @@ jobs: services: - docker - # Build and test helm - - <<: *test - name: Helm on Kubernetes - script: make test-e2e-helm - ## Image deploy/push stage jobs ## # Build and deploy arm64 ansible-operator docker image diff --git a/Makefile b/Makefile index 6ec1104f283..dc23d7ef5b8 100644 --- a/Makefile +++ b/Makefile @@ -256,9 +256,9 @@ test-subcommand-olm-install: ./hack/tests/subcommand-olm-install.sh # E2E tests. -.PHONY: test-e2e test-e2e-go test-e2e-go-new test-e2e-ansible test-e2e-ansible-molecule test-e2e-helm +.PHONY: test-e2e test-e2e-go test-e2e-go-new test-e2e-ansible test-e2e-ansible-molecule -test-e2e: test-e2e-go test-e2e-go-new test-e2e-ansible test-e2e-ansible-molecule test-e2e-helm ## Run the e2e tests +test-e2e: test-e2e-go test-e2e-go-new test-e2e-ansible test-e2e-ansible-molecule ## Run the e2e tests test-e2e-go: ./hack/tests/e2e-go.sh $(ARGS) @@ -272,9 +272,6 @@ test-e2e-ansible: image-build-ansible test-e2e-ansible-molecule: image-build-ansible ./hack/tests/e2e-ansible-molecule.sh -test-e2e-helm: image-build-helm - ./hack/tests/e2e-helm.sh - # Integration tests. .PHONY: test-integration diff --git a/changelog/fragments/remove-new-cmd-for-helm.yaml b/changelog/fragments/remove-new-cmd-for-helm.yaml new file mode 100644 index 00000000000..8520734ef58 --- /dev/null +++ b/changelog/fragments/remove-new-cmd-for-helm.yaml @@ -0,0 +1,17 @@ +# entries is a list of entries to include in +# release notes and/or the migration guide +entries: + - description: > + The `operator-sdk new` command no longer supports scaffolding new Helm projects with the `--type=Helm` flag. + To scaffold new projects, users are expected to use `operator-sdk init --plugins=helm.operator-sdk.io/v1` as part of the + [new CLI]((https://sdk.operatorframework.io/docs/new-cli)) for Helm operators. + + See `operator-sdk init --plugins=helm.operator-sdk.io/v1 -h` and the following doc on how to scaffold a new project + https://sdk.operatorframework.io/docs/helm/quickstart/. To migrate existing projects to the new layout see: + https://sdk.operatorframework.io/docs/helm/migration. + + kind: "removal" + + # Is this a breaking change? + breaking: false + diff --git a/cmd/operator-sdk/main.go b/cmd/operator-sdk/main.go index 76b4ee6a4ec..514a95febb9 100644 --- a/cmd/operator-sdk/main.go +++ b/cmd/operator-sdk/main.go @@ -51,6 +51,17 @@ func main() { "https://sdk.operatorframework.io/docs/golang/migration/project_migration_guide/\n" projutil.PrintDeprecationWarning(depMsg) } + + //nolint:lll + if operatorType == projutil.OperatorTypeHelm { + depMsg := "Operator SDK has a new CLI and project layout that is aligned with Kubebuilder.\n" + + "See `operator-sdk init --plugins=helm.operator-sdk.io/v1 -h` and the following doc on how to scaffold a new project:\n" + + "https://sdk.operatorframework.io/docs/helm/quickstart/\n" + + "To migrate existing projects to the new layout see:\n" + + "https://sdk.operatorframework.io/docs/helm/migration\n" + projutil.PrintDeprecationWarning(depMsg) + } + if err := cli.RunLegacy(); err != nil { log.Fatal(err) } diff --git a/cmd/operator-sdk/new/cmd.go b/cmd/operator-sdk/new/cmd.go index d4397c0d712..ce91820ca52 100644 --- a/cmd/operator-sdk/new/cmd.go +++ b/cmd/operator-sdk/new/cmd.go @@ -28,7 +28,6 @@ import ( "github.com/operator-framework/operator-sdk/internal/genutil" "github.com/operator-framework/operator-sdk/internal/scaffold" "github.com/operator-framework/operator-sdk/internal/scaffold/ansible" - "github.com/operator-framework/operator-sdk/internal/scaffold/helm" "github.com/operator-framework/operator-sdk/internal/scaffold/input" "github.com/operator-framework/operator-sdk/internal/util/projutil" ) @@ -56,44 +55,12 @@ generates a default directory layout based on the input . $ operator-sdk new app-operator --type=ansible \ --api-version=app.example.com/v1alpha1 \ --kind=AppService - - # Helm project - $ operator-sdk new app-operator --type=helm \ - --api-version=app.example.com/v1alpha1 \ - --kind=AppService - - $ operator-sdk new app-operator --type=helm \ - --api-version=app.example.com/v1alpha1 \ - --kind=AppService \ - --helm-chart=myrepo/app - - $ operator-sdk new app-operator --type=helm \ - --helm-chart=myrepo/app - - $ operator-sdk new app-operator --type=helm \ - --helm-chart=myrepo/app \ - --helm-chart-version=1.2.3 - - $ operator-sdk new app-operator --type=helm \ - --helm-chart=app \ - --helm-chart-repo=https://charts.mycompany.com/ - - $ operator-sdk new app-operator --type=helm \ - --helm-chart=app \ - --helm-chart-repo=https://charts.mycompany.com/ \ - --helm-chart-version=1.2.3 - - $ operator-sdk new app-operator --type=helm \ - --helm-chart=/path/to/local/chart-directories/app/ - - $ operator-sdk new app-operator --type=helm \ - --helm-chart=/path/to/local/chart-archives/app-1.2.3.tgz `, RunE: newFunc, } newCmd.Flags().StringVar(&operatorType, "type", "", - "Type of operator to initialize (choices: \"ansible\" or \"helm\")") + "Type of operator to initialize (choices: \"ansible\")") if err := newCmd.MarkFlagRequired("type"); err != nil { log.Fatalf("Failed to mark `type` flag for `new` subcommand as required") } @@ -111,7 +78,7 @@ generates a default directory layout based on the input . "Generate a playbook skeleton. (Only used for --type ansible)") // Initialize flagSet struct with common flags - apiFlags.AddTo(newCmd.Flags()) + apiFlags.AddToNew(newCmd.Flags()) return newCmd } @@ -140,35 +107,6 @@ func newFunc(cmd *cobra.Command, args []string) error { if err := doAnsibleScaffold(); err != nil { log.Fatal(err) } - case projutil.OperatorTypeHelm: - // create the project dir - err := os.MkdirAll(projectName, 0755) - if err != nil { - log.Fatal(err) - } - // go inside of the project dir - err = os.Chdir(filepath.Join(projutil.MustGetwd(), projectName)) - if err != nil { - log.Fatal(err) - } - - cfg := input.Config{ - AbsProjectPath: filepath.Join(projutil.MustGetwd()), - ProjectName: projectName, - } - - createOpts := helm.CreateChartOptions{ - ResourceAPIVersion: apiFlags.APIVersion, - ResourceKind: apiFlags.Kind, - Chart: apiFlags.HelmChartRef, - Version: apiFlags.HelmChartVersion, - Repo: apiFlags.HelmChartRepo, - CRDVersion: apiFlags.CrdVersion, - } - - if err := helm.Init(cfg, createOpts); err != nil { - log.Fatal(err) - } } //todo: remove before 1.0.0 if gitInit { @@ -303,8 +241,8 @@ func doAnsibleScaffold() error { } func verifyFlags() error { - if operatorType != projutil.OperatorTypeAnsible && operatorType != projutil.OperatorTypeHelm { - return fmt.Errorf("value of --type can only be `ansible`, or `helm`: %v", + if operatorType != projutil.OperatorTypeAnsible { + return fmt.Errorf("value of --type can only be `ansible`: %v", projutil.ErrUnknownOperatorType{Type: operatorType}) } if operatorType != projutil.OperatorTypeAnsible && generatePlaybook { diff --git a/hack/tests/e2e-helm.sh b/hack/tests/e2e-helm.sh deleted file mode 100755 index 8703c2e0ac6..00000000000 --- a/hack/tests/e2e-helm.sh +++ /dev/null @@ -1,193 +0,0 @@ -#!/usr/bin/env bash - -set -eux - -source hack/lib/test_lib.sh -source hack/lib/image_lib.sh - -DEST_IMAGE="quay.io/example/nginx-operator:v0.0.2" -ROOTDIR="$(pwd)" -TMPDIR="$(mktemp -d)" -trap_add 'rm -rf $TMPDIR' EXIT - -test_namespace="test-e2e-helm" - -deploy_operator() { - kubectl create -f "$OPERATORDIR/deploy/crds/helm.example.com_nginxes_crd.yaml" - kubectl create -f "$OPERATORDIR/deploy/service_account.yaml" - kubectl create -f "$OPERATORDIR/deploy/cluster_role.yaml" - kubectl create -f "$OPERATORDIR/deploy/cluster_role_binding.yaml" - kubectl create -f "$OPERATORDIR/deploy/cluster_operator.yaml" - kubectl create namespace ${test_namespace} -} - -remove_operator() { - kubectl delete --ignore-not-found namespace ${test_namespace} - kubectl delete --ignore-not-found=true -f "$OPERATORDIR/deploy/service_account.yaml" - kubectl delete --ignore-not-found=true -f "$OPERATORDIR/deploy/cluster_role.yaml" - kubectl delete --ignore-not-found=true -f "$OPERATORDIR/deploy/cluster_role_binding.yaml" - kubectl delete --ignore-not-found=true -f "$OPERATORDIR/deploy/crds/helm.example.com_nginxes_crd.yaml" - kubectl delete --ignore-not-found=true -f "$OPERATORDIR/deploy/cluster_operator.yaml" -} - -test_operator() { - # kind has an issue with certain image registries (ex. redhat's), so use a - # different test pod image. - local metrics_test_image="fedora:latest" - - # wait for operator pod to run - if ! timeout 1m kubectl rollout status deployment/nginx-operator; - then - kubectl logs deployment/nginx-operator - exit 1 - fi - - # verify that metrics service was created - if ! timeout 60s bash -c -- "until kubectl get service/nginx-operator-metrics > /dev/null 2>&1; do sleep 1; done"; - then - echo "Failed to get metrics service" - kubectl logs deployment/nginx-operator - exit 1 - fi - - - # verify that the metrics endpoint exists - if ! timeout 1m bash -c -- "until kubectl run --attach --rm --restart=Never test-metrics --image=${metrics_test_image} -- curl -sfo /dev/null http://nginx-operator-metrics:8383/metrics; do sleep 1; done"; - then - echo "Failed to verify that metrics endpoint exists" - kubectl logs deployment/nginx-operator - exit 1 - fi - - # create CR - kubectl create --namespace=${test_namespace} -f deploy/crds/helm.example.com_v1alpha1_nginx_cr.yaml - trap_add "kubectl delete --namespace=${test_namespace} --ignore-not-found -f ${OPERATORDIR}/deploy/crds/helm.example.com_v1alpha1_nginx_cr.yaml" EXIT - if ! timeout 1m bash -c -- "until kubectl get --namespace=${test_namespace} nginxes.helm.example.com example-nginx -o jsonpath='{..status.deployedRelease.name}' | grep 'example-nginx'; do sleep 1; done"; - then - kubectl logs deployment/nginx-operator - exit 1 - fi - - # verify that the custom resource metrics endpoint exists - if ! timeout 1m bash -c -- "until kubectl run --attach --rm --restart=Never test-cr-metrics --image=${metrics_test_image} -- curl -sfo /dev/null http://nginx-operator-metrics:8686/metrics; do sleep 1; done"; - then - echo "Failed to verify that custom resource metrics endpoint exists" - kubectl logs deployment/nginx-operator - exit 1 - fi - - header_text "verify that the servicemonitor is created" - if ! timeout 1m bash -c -- "until kubectl get servicemonitors/nginx-operator-metrics > /dev/null 2>&1; do sleep 1; done"; - then - error_text "FAIL: Failed to get service monitor" - operator_logs - exit 1 - fi - - release_name=$(kubectl get --namespace=${test_namespace} nginxes.helm.example.com example-nginx -o jsonpath="{..status.deployedRelease.name}") - nginx_deployment=$(kubectl get --namespace=${test_namespace} deployment -l "app.kubernetes.io/instance=${release_name}" -o jsonpath="{..metadata.name}") - - if ! timeout 1m kubectl rollout --namespace=${test_namespace} status deployment/${nginx_deployment}; - then - kubectl describe --namespace=${test_namespace} pods -l "app.kubernetes.io/instance=${release_name}" - kubectl describe --namespace=${test_namespace} deployments ${nginx_deployment} - kubectl logs deployment/nginx-operator - exit 1 - fi - - nginx_service=$(kubectl get --namespace=${test_namespace} service -l "app.kubernetes.io/instance=${release_name}" -o jsonpath="{..metadata.name}") - kubectl get --namespace=${test_namespace} service ${nginx_service} - - # scale deployment replicas to 2 and verify the - # deployment automatically scales back down to 1. - kubectl scale --namespace=${test_namespace} deployment/${nginx_deployment} --replicas=2 - if ! timeout 1m bash -c -- "until test \$(kubectl get --namespace=${test_namespace} deployment/${nginx_deployment} -o jsonpath='{..spec.replicas}') -eq 1; do sleep 1; done"; - then - kubectl describe --namespace=${test_namespace} pods -l "app.kubernetes.io/instance=${release_name}" - kubectl describe --namespace=${test_namespace} deployments ${nginx_deployment} - kubectl logs deployment/nginx-operator - exit 1 - fi - - # update CR to replicaCount=2 and verify the deployment - # automatically scales up to 2 replicas. - kubectl patch --namespace=${test_namespace} nginxes.helm.example.com example-nginx -p '[{"op":"replace","path":"/spec/replicaCount","value":2}]' --type=json - if ! timeout 1m bash -c -- "until test \$(kubectl get --namespace=${test_namespace} deployment/${nginx_deployment} -o jsonpath='{..spec.replicas}') -eq 2; do sleep 1; done"; - then - kubectl describe --namespace=${test_namespace} pods -l "app.kubernetes.io/instance=${release_name}" - kubectl describe --namespace=${test_namespace} deployments ${nginx_deployment} - kubectl logs deployment/nginx-operator - exit 1 - fi - - kubectl delete --namespace=${test_namespace} -f deploy/crds/helm.example.com_v1alpha1_nginx_cr.yaml --wait=true - kubectl logs deployment/nginx-operator | grep "Uninstalled release" | grep "${release_name}" -} - -# create and build the operator -pushd "$TMPDIR" -log=$(operator-sdk new nginx-operator \ - --api-version=helm.example.com/v1alpha1 \ - --kind=Nginx \ - --type=helm \ - 2>&1) -echo $log -if echo $log | grep -q "failed to generate RBAC rules"; then - echo FAIL expected successful generation of RBAC rules - exit 1 -fi - -install_service_monitor_crd - -pushd nginx-operator -sed -i".bak" -E -e 's/(FROM quay.io\/operator-framework\/helm-operator)(:.*)?/\1:dev/g' build/Dockerfile; rm -f build/Dockerfile.bak -operator-sdk build "$DEST_IMAGE" -# If using a kind cluster, load the image into all nodes. -load_image_if_kind "$DEST_IMAGE" -sed -i".bak" -E -e "s|REPLACE_IMAGE|$DEST_IMAGE|g" deploy/operator.yaml; rm -f deploy/operator.yaml.bak -sed -i".bak" -E -e 's|Always|Never|g' deploy/operator.yaml; rm -f deploy/operator.yaml.bak - -kubectl create --dry-run -f "deploy/operator.yaml" -o json | jq '((.spec.template.spec.containers[] | select(.name == "nginx-operator").env[]) | select(.name == "WATCH_NAMESPACE")) |= {"name":"WATCH_NAMESPACE", "value":""}' | kubectl create --dry-run -f - -o yaml > deploy/cluster_operator.yaml -kubectl create --dry-run -f "deploy/role.yaml" -o json | jq '.kind = "ClusterRole"' | kubectl create --dry-run -f - -o yaml > deploy/cluster_role.yaml -kubectl create --dry-run -f "deploy/role_binding.yaml" -o json | jq '.subjects[0].namespace= "default"' | jq '.roleRef.kind= "ClusterRole"' | jq '.kind = "ClusterRoleBinding"' | kubectl create --dry-run -f - -o yaml > deploy/cluster_role_binding.yaml - -# kind has an issue with certain image registries (ex. redhat's), so use a -# different test pod image. -METRICS_TEST_IMAGE="fedora:latest" -docker pull "$METRICS_TEST_IMAGE" -# If using a kind cluster, load the metrics test image into all nodes. -load_image_if_kind "$METRICS_TEST_IMAGE" - -OPERATORDIR="$(pwd)" - -deploy_operator -trap_add 'remove_operator' EXIT -test_operator -remove_operator - -echo "###" -echo "### Base image testing passed" -echo "### Now testing migrate to hybrid operator" -echo "###" - -operator-sdk migrate --repo=github.com/example-inc/nginx-operator - -if [[ ! -e build/Dockerfile.sdkold ]]; -then - echo FAIL the old Dockerfile should have been renamed to Dockerfile.sdkold - exit 1 -fi - -add_go_mod_replace "github.com/operator-framework/operator-sdk" "$ROOTDIR" -# Build the project to resolve dependency versions in the modfile. -go build ./... - -operator-sdk build "$DEST_IMAGE" -# If using a kind cluster, load the image into all nodes. -load_image_if_kind "$DEST_IMAGE" - -deploy_operator -test_operator - -popd -popd diff --git a/internal/flags/apiflags/flags.go b/internal/flags/apiflags/flags.go index 7be4d5c2ca0..f531952dcbe 100644 --- a/internal/flags/apiflags/flags.go +++ b/internal/flags/apiflags/flags.go @@ -34,6 +34,23 @@ type APIFlags struct { HelmChartRepo string } +// AddToNew - Add the reconcile period and watches file flags to the the flagset +// helpTextPrefix will allow you add a prefix to default help text. Joined by a space. +// It has just the flags valid for Ansible +func (f *APIFlags) AddToNew(flagSet *pflag.FlagSet) { + flagSet.StringVar(&f.APIVersion, "api-version", "", + "Kubernetes apiVersion and has a format of $GROUP_NAME/$VERSION (e.g app.example.com/v1alpha1)") + + flagSet.StringVar(&f.Kind, "kind", "", + "Kubernetes resource Kind name. (e.g AppService)") + + flagSet.BoolVar(&f.SkipGeneration, "skip-generation", false, + "Skip generation of deepcopy and OpenAPI code and OpenAPI CRD specs") + + flagSet.StringVar(&f.CrdVersion, "crd-version", gencrd.DefaultCRDVersion, + "CRD version to generate") +} + // AddTo - Add the reconcile period and watches file flags to the the flagset // helpTextPrefix will allow you add a prefix to default help text. Joined by a space. func (f *APIFlags) AddTo(flagSet *pflag.FlagSet) { diff --git a/website/content/en/docs/cli/operator-sdk_new.md b/website/content/en/docs/cli/operator-sdk_new.md index 70cda0ab7ac..f6c695bed3b 100644 --- a/website/content/en/docs/cli/operator-sdk_new.md +++ b/website/content/en/docs/cli/operator-sdk_new.md @@ -29,53 +29,18 @@ operator-sdk new [flags] --api-version=app.example.com/v1alpha1 \ --kind=AppService - # Helm project - $ operator-sdk new app-operator --type=helm \ - --api-version=app.example.com/v1alpha1 \ - --kind=AppService - - $ operator-sdk new app-operator --type=helm \ - --api-version=app.example.com/v1alpha1 \ - --kind=AppService \ - --helm-chart=myrepo/app - - $ operator-sdk new app-operator --type=helm \ - --helm-chart=myrepo/app - - $ operator-sdk new app-operator --type=helm \ - --helm-chart=myrepo/app \ - --helm-chart-version=1.2.3 - - $ operator-sdk new app-operator --type=helm \ - --helm-chart=app \ - --helm-chart-repo=https://charts.mycompany.com/ - - $ operator-sdk new app-operator --type=helm \ - --helm-chart=app \ - --helm-chart-repo=https://charts.mycompany.com/ \ - --helm-chart-version=1.2.3 - - $ operator-sdk new app-operator --type=helm \ - --helm-chart=/path/to/local/chart-directories/app/ - - $ operator-sdk new app-operator --type=helm \ - --helm-chart=/path/to/local/chart-archives/app-1.2.3.tgz - ``` ### Options ``` - --api-version string Kubernetes apiVersion and has a format of $GROUP_NAME/$VERSION (e.g app.example.com/v1alpha1) - --crd-version string CRD version to generate (default "v1") - --generate-playbook Generate a playbook skeleton. (Only used for --type ansible) - --helm-chart string Initialize helm operator with existing helm chart (, /, or local path). Valid only for --type helm - --helm-chart-repo string Chart repository URL for the requested helm chart, Valid only for --type helm - --helm-chart-version string Specific version of the helm chart (default is latest version). Valid only for --type helm - -h, --help help for new - --kind string Kubernetes resource Kind name. (e.g AppService) - --skip-generation Skip generation of deepcopy and OpenAPI code and OpenAPI CRD specs - --type string Type of operator to initialize (choices: "ansible" or "helm") + --api-version string Kubernetes apiVersion and has a format of $GROUP_NAME/$VERSION (e.g app.example.com/v1alpha1) + --crd-version string CRD version to generate (default "v1") + --generate-playbook Generate a playbook skeleton. (Only used for --type ansible) + -h, --help help for new + --kind string Kubernetes resource Kind name. (e.g AppService) + --skip-generation Skip generation of deepcopy and OpenAPI code and OpenAPI CRD specs + --type string Type of operator to initialize (choices: "ansible") ``` ### SEE ALSO diff --git a/website/content/en/docs/new-cli/operator-sdk_new.md b/website/content/en/docs/new-cli/operator-sdk_new.md index 00d7dd00e8c..a639c6e81bc 100644 --- a/website/content/en/docs/new-cli/operator-sdk_new.md +++ b/website/content/en/docs/new-cli/operator-sdk_new.md @@ -29,53 +29,18 @@ operator-sdk new [flags] --api-version=app.example.com/v1alpha1 \ --kind=AppService - # Helm project - $ operator-sdk new app-operator --type=helm \ - --api-version=app.example.com/v1alpha1 \ - --kind=AppService - - $ operator-sdk new app-operator --type=helm \ - --api-version=app.example.com/v1alpha1 \ - --kind=AppService \ - --helm-chart=myrepo/app - - $ operator-sdk new app-operator --type=helm \ - --helm-chart=myrepo/app - - $ operator-sdk new app-operator --type=helm \ - --helm-chart=myrepo/app \ - --helm-chart-version=1.2.3 - - $ operator-sdk new app-operator --type=helm \ - --helm-chart=app \ - --helm-chart-repo=https://charts.mycompany.com/ - - $ operator-sdk new app-operator --type=helm \ - --helm-chart=app \ - --helm-chart-repo=https://charts.mycompany.com/ \ - --helm-chart-version=1.2.3 - - $ operator-sdk new app-operator --type=helm \ - --helm-chart=/path/to/local/chart-directories/app/ - - $ operator-sdk new app-operator --type=helm \ - --helm-chart=/path/to/local/chart-archives/app-1.2.3.tgz - ``` ### Options ``` - --api-version string Kubernetes apiVersion and has a format of $GROUP_NAME/$VERSION (e.g app.example.com/v1alpha1) - --crd-version string CRD version to generate (default "v1") - --generate-playbook Generate a playbook skeleton. (Only used for --type ansible) - --helm-chart string Initialize helm operator with existing helm chart (, /, or local path). Valid only for --type helm - --helm-chart-repo string Chart repository URL for the requested helm chart, Valid only for --type helm - --helm-chart-version string Specific version of the helm chart (default is latest version). Valid only for --type helm - -h, --help help for new - --kind string Kubernetes resource Kind name. (e.g AppService) - --skip-generation Skip generation of deepcopy and OpenAPI code and OpenAPI CRD specs - --type string Type of operator to initialize (choices: "ansible" or "helm") + --api-version string Kubernetes apiVersion and has a format of $GROUP_NAME/$VERSION (e.g app.example.com/v1alpha1) + --crd-version string CRD version to generate (default "v1") + --generate-playbook Generate a playbook skeleton. (Only used for --type ansible) + -h, --help help for new + --kind string Kubernetes resource Kind name. (e.g AppService) + --skip-generation Skip generation of deepcopy and OpenAPI code and OpenAPI CRD specs + --type string Type of operator to initialize (choices: "ansible") ``` ### Options inherited from parent commands