├── .circleci └── config.yml ├── .dockerignore ├── .github ├── CODEOWNERS ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── enhancement-request.md ├── PULL_REQUEST_TEMPLATE.md ├── new-branch.png ├── release-drafter.yml └── workflows │ ├── release-drafter.yml │ └── release-on-master.yml ├── .gitignore ├── .golangci.yml ├── .goreleaser.yml ├── .pre-commit-config.yaml ├── CONTRIBUTING.md ├── Dispatchfile ├── Dockerfile ├── Dockerfile.goreleaser ├── LICENSE ├── Makefile ├── OWNERS ├── PROJECT ├── README.md ├── RELEASE.md ├── SECURITY_CONTACTS ├── STYLEGUIDE.md ├── build ├── Dockerfile └── test-images.sh ├── cmd ├── kubectl-kudo │ └── main.go └── manager │ └── main.go ├── code-of-conduct.md ├── config └── crds │ ├── README.md │ ├── kudo.dev_instances.yaml │ ├── kudo.dev_operators.yaml │ └── kudo.dev_operatorversions.yaml ├── development.md ├── go.mod ├── go.sum ├── hack ├── boilerplate.go.txt ├── check-commit-signed-off.sh ├── deploy-dev-prereqs.sh ├── generate_krew.sh ├── gh-md-toc.sh ├── install-golangcilint.sh ├── run-e2e-tests.sh ├── run-integration-tests.sh ├── run-kuttl-tests.sh ├── run-operator-tests.sh ├── run-upgrade-tests.sh ├── update-manifests.sh ├── update-webhook-config.sh ├── update_codegen.sh ├── update_kep_overview.sh ├── verify-generate.sh └── verify-go-clean.sh ├── keps ├── 0000-kep-template.md ├── 0001-kep-process.md ├── 0002-dynamic-instances.md ├── 0003-kep-cli.md ├── 0004-add-testing-infrastructure.md ├── 0005-cluster-resources-for-crds.md ├── 0006-stable-kafka-example.md ├── 0007-cli-generation.md ├── 0008-operator-testing.md ├── 0009-operator-toolkit.md ├── 0010-package-manager.md ├── 0012-operator-extensions.md ├── 0013-external-specs.md ├── 0014-pull-request-process.md ├── 0015-repository-management.md ├── 0017-pipe-tasks.md ├── 0018-controller-overhaul.md ├── 0019-package-api-versioning.md ├── 0020-manual-plan-execution.md ├── 0021-kudo-upgrade.md ├── 0022-diagnostics-bundle.md ├── 0023-enable-disable-features.md ├── 0024-parameter-enhancement.md ├── 0025-template-to-yaml-function.md ├── 0026-reading-parameter-values-from-a-file.md ├── 0027-pod-restart-controls.md ├── 0029-operator-dependencies.md ├── 0030-immutable-parameters.md ├── 0031-namespace-management.md ├── 0032-community-repository-management.md ├── 0033-structured-parameters.md ├── 0034-instance-health.md ├── 0035-json-schema-export.md └── README.md ├── logo ├── kudo_horizontal_color.png ├── kudo_horizontal_color@2x.png ├── kudo_horizontal_dark.png ├── kudo_horizontal_dark@2x.png ├── kudo_horizontal_light.png ├── kudo_horizontal_light@2x.png ├── kudo_stacked_color.png ├── kudo_stacked_color@2x.png ├── kudo_stacked_dark.png ├── kudo_stacked_dark@2x.png ├── kudo_stacked_light.png └── kudo_stacked_light@2x.png ├── pkg ├── apis │ ├── addtoscheme_kudo_v1alpha1.go │ ├── apis.go │ └── kudo │ │ ├── group.go │ │ └── v1beta1 │ │ ├── doc.go │ │ ├── instance_types.go │ │ ├── instance_types_helpers.go │ │ ├── instance_types_helpers_test.go │ │ ├── operator_types.go │ │ ├── operator_types_helpers.go │ │ ├── operatorversion_types.go │ │ ├── operatorversion_types_helpers.go │ │ ├── parameter_types.go │ │ ├── parameter_types_helpers.go │ │ ├── parameter_types_helpers_test.go │ │ ├── register.go │ │ └── zz_generated.deepcopy.go ├── client │ ├── clientset │ │ └── versioned │ │ │ ├── clientset.go │ │ │ ├── doc.go │ │ │ ├── fake │ │ │ ├── clientset_generated.go │ │ │ ├── doc.go │ │ │ └── register.go │ │ │ ├── scheme │ │ │ ├── doc.go │ │ │ └── register.go │ │ │ └── typed │ │ │ └── kudo │ │ │ └── v1beta1 │ │ │ ├── doc.go │ │ │ ├── fake │ │ │ ├── doc.go │ │ │ ├── fake_instance.go │ │ │ ├── fake_kudo_client.go │ │ │ ├── fake_operator.go │ │ │ └── fake_operatorversion.go │ │ │ ├── generated_expansion.go │ │ │ ├── instance.go │ │ │ ├── kudo_client.go │ │ │ ├── operator.go │ │ │ └── operatorversion.go │ ├── informers │ │ └── externalversions │ │ │ ├── factory.go │ │ │ ├── generic.go │ │ │ ├── internalinterfaces │ │ │ └── factory_interfaces.go │ │ │ └── kudo │ │ │ ├── interface.go │ │ │ └── v1beta1 │ │ │ ├── instance.go │ │ │ ├── interface.go │ │ │ ├── operator.go │ │ │ └── operatorversion.go │ └── listers │ │ └── kudo │ │ └── v1beta1 │ │ ├── expansion_generated.go │ │ ├── instance.go │ │ ├── operator.go │ │ └── operatorversion.go ├── controller │ ├── instance │ │ ├── instance_controller.go │ │ ├── instance_controller_test.go │ │ └── resolver_incluster.go │ ├── operator │ │ └── operator_controller.go │ └── operatorversion │ │ └── operatorversion_controller.go ├── engine │ ├── doc.go │ ├── renderer │ │ ├── consts.go │ │ ├── dependencies.go │ │ ├── dependencies_test.go │ │ ├── doc.go │ │ ├── engine.go │ │ ├── engine_test.go │ │ ├── enhancer.go │ │ ├── enhancer_test.go │ │ ├── functions.go │ │ ├── parser.go │ │ └── parser_test.go │ ├── resource │ │ ├── object_key.go │ │ └── object_key_test.go │ ├── task │ │ ├── doc.go │ │ ├── env_file.go │ │ ├── podexec │ │ │ └── pod_exec.go │ │ ├── render.go │ │ ├── task.go │ │ ├── task_apply.go │ │ ├── task_apply_test.go │ │ ├── task_delete.go │ │ ├── task_delete_test.go │ │ ├── task_dummy.go │ │ ├── task_dummy_test.go │ │ ├── task_kudo_operator.go │ │ ├── task_kudo_operator_test.go │ │ ├── task_pipe.go │ │ ├── task_pipe_test.go │ │ ├── task_test.go │ │ ├── task_toggle.go │ │ └── task_toggle_test.go │ ├── types.go │ └── workflow │ │ ├── doc.go │ │ ├── engine.go │ │ └── engine_test.go ├── feature │ ├── doc.go │ └── feature.go ├── kubernetes │ ├── client.go │ └── status │ │ ├── health.go │ │ ├── health_test.go │ │ ├── readiness.go │ │ └── readiness_test.go ├── kudoctl │ ├── clog │ │ ├── log.go │ │ └── log_test.go │ ├── cmd │ │ ├── diagnostics.go │ │ ├── diagnostics │ │ │ ├── collectors.go │ │ │ ├── diagnostics.go │ │ │ ├── diagnostics_test.go │ │ │ ├── gziphelper.go │ │ │ ├── gziphelper_test.go │ │ │ ├── print.go │ │ │ ├── print_test.go │ │ │ ├── processing_context.go │ │ │ ├── resource_funcs.go │ │ │ ├── runner.go │ │ │ ├── runner_helper.go │ │ │ ├── testdata │ │ │ │ ├── child_instance.yaml │ │ │ │ ├── child_operator.yaml │ │ │ │ ├── child_operatorversion.yaml │ │ │ │ ├── cluster_role.yaml │ │ │ │ ├── cow_pod.yaml │ │ │ │ ├── kudo_default_serviceaccount.yaml │ │ │ │ ├── kudo_ns.yaml │ │ │ │ ├── kudo_pod.yaml │ │ │ │ ├── kudo_serviceaccounts.yaml │ │ │ │ ├── kudo_services.yaml │ │ │ │ ├── kudo_statefulsets.yaml │ │ │ │ ├── zk_instance.yaml │ │ │ │ ├── zk_operator.yaml │ │ │ │ ├── zk_operatorversion.yaml │ │ │ │ ├── zk_pods.yaml │ │ │ │ ├── zk_pvcs.yaml │ │ │ │ ├── zk_pvs.yaml │ │ │ │ ├── zk_service_accounts.yaml │ │ │ │ ├── zk_services.yaml │ │ │ │ └── zk_statefulsets.yaml │ │ │ ├── testhelper_test.go │ │ │ └── writers.go │ │ ├── generate │ │ │ ├── maintainer.go │ │ │ ├── maintainer_test.go │ │ │ ├── operator.go │ │ │ ├── operator_test.go │ │ │ ├── parameter.go │ │ │ ├── parameter_test.go │ │ │ ├── plans.go │ │ │ ├── plans_test.go │ │ │ ├── task.go │ │ │ ├── task_test.go │ │ │ └── testdata │ │ │ │ ├── maintainer.golden │ │ │ │ ├── parameter.golden │ │ │ │ ├── plan.golden │ │ │ │ └── task.golden │ │ ├── get.go │ │ ├── get │ │ │ ├── get.go │ │ │ ├── get_test.go │ │ │ └── testdata │ │ │ │ ├── get-all.json.golden │ │ │ │ ├── get-all.txt.golden │ │ │ │ ├── get-all.yaml.golden │ │ │ │ ├── get-instances.json.golden │ │ │ │ ├── get-instances.txt.golden │ │ │ │ ├── get-instances.yaml.golden │ │ │ │ ├── get-operators.json.golden │ │ │ │ ├── get-operators.txt.golden │ │ │ │ ├── get-operators.yaml.golden │ │ │ │ ├── get-operatorversions.json.golden │ │ │ │ ├── get-operatorversions.txt.golden │ │ │ │ └── get-operatorversions.yaml.golden │ │ ├── init.go │ │ ├── init_integration_test.go │ │ ├── init_test.go │ │ ├── install.go │ │ ├── install │ │ │ ├── install.go │ │ │ └── install_test.go │ │ ├── install_test.go │ │ ├── output │ │ │ └── output.go │ │ ├── package.go │ │ ├── package_add.go │ │ ├── package_add_maintainer.go │ │ ├── package_add_parameter.go │ │ ├── package_add_plan.go │ │ ├── package_add_task.go │ │ ├── package_create.go │ │ ├── package_list.go │ │ ├── package_list_params.go │ │ ├── package_list_params_test.go │ │ ├── package_list_plans.go │ │ ├── package_list_plans_test.go │ │ ├── package_list_tasks.go │ │ ├── package_list_tasks_test.go │ │ ├── package_new.go │ │ ├── package_new_test.go │ │ ├── package_test.go │ │ ├── package_verify.go │ │ ├── package_verify_test.go │ │ ├── params │ │ │ ├── parser.go │ │ │ └── parser_test.go │ │ ├── plan.go │ │ ├── plan │ │ │ ├── plan_history.go │ │ │ ├── plan_status.go │ │ │ ├── plan_status_test.go │ │ │ ├── plan_trigger.go │ │ │ └── testdata │ │ │ │ ├── planstatus.json.golden │ │ │ │ ├── planstatus.txt.golden │ │ │ │ └── planstatus.yaml.golden │ │ ├── prompt │ │ │ ├── operator.go │ │ │ └── prompt.go │ │ ├── repo.go │ │ ├── repo_add.go │ │ ├── repo_add_test.go │ │ ├── repo_context.go │ │ ├── repo_context_test.go │ │ ├── repo_index.go │ │ ├── repo_index_test.go │ │ ├── repo_list.go │ │ ├── repo_list_test.go │ │ ├── repo_remove.go │ │ ├── repo_remove_test.go │ │ ├── root.go │ │ ├── root_test.go │ │ ├── search.go │ │ ├── search_test.go │ │ ├── test.go │ │ ├── testdata │ │ │ ├── deploy-kudo-ns.yaml.golden │ │ │ ├── deploy-kudo-sa.yaml.golden │ │ │ ├── deploy-kudo.json.golden │ │ │ ├── deploy-kudo.yaml.golden │ │ │ ├── index.yaml │ │ │ ├── index.yaml.golden │ │ │ ├── invalid-params.golden │ │ │ ├── invalid-params.json.golden │ │ │ ├── invalid-params.txt.golden │ │ │ ├── invalid-params.yaml.golden │ │ │ ├── invalidzk │ │ │ │ ├── operator.yaml │ │ │ │ ├── params.yaml │ │ │ │ └── templates │ │ │ │ │ ├── pdb.yaml │ │ │ │ │ ├── services.yaml │ │ │ │ │ ├── statefulset.yaml │ │ │ │ │ └── validation.yaml │ │ │ ├── merge-index.yaml.golden │ │ │ ├── merge.yaml │ │ │ ├── newop │ │ │ │ ├── operator.yaml.golden │ │ │ │ └── params.yaml.golden │ │ │ ├── params-list.golden │ │ │ ├── plans-list.golden │ │ │ ├── plans-with-tasks-list.golden │ │ │ ├── repo-list.golden │ │ │ ├── search1.golden │ │ │ ├── search2.golden │ │ │ ├── search3.golden │ │ │ ├── skip-check-add-list.golden │ │ │ └── tasks-list.golden │ │ ├── uninstall.go │ │ ├── uninstall_test.go │ │ ├── update.go │ │ ├── update_test.go │ │ ├── upgrade.go │ │ ├── upgrade_test.go │ │ ├── verify │ │ │ ├── verify.go │ │ │ └── verify_test.go │ │ └── version.go │ ├── env │ │ ├── environment.go │ │ └── environment_test.go │ ├── files │ │ └── file.go │ ├── http │ │ ├── http_client.go │ │ └── http_client_test.go │ ├── kube │ │ └── config.go │ ├── kudohome │ │ ├── home.go │ │ └── home_test.go │ ├── kudoinit │ │ ├── crd │ │ │ ├── README.md │ │ │ ├── bindata.go │ │ │ └── crds.go │ │ ├── manager │ │ │ └── manager.go │ │ ├── migration │ │ │ ├── migration.go │ │ │ └── migration_helper.go │ │ ├── options.go │ │ ├── prereq │ │ │ ├── namespace.go │ │ │ ├── namespace_test.go │ │ │ ├── prereqs_test.go │ │ │ ├── serviceaccount.go │ │ │ ├── serviceaccount_test.go │ │ │ ├── tinyca.go │ │ │ ├── webhook.go │ │ │ └── webhook_test.go │ │ ├── setup │ │ │ ├── setup.go │ │ │ └── wait.go │ │ └── types.go │ ├── packages │ │ ├── convert │ │ │ ├── parameters.go │ │ │ └── resources.go │ │ ├── install │ │ │ ├── doc.go │ │ │ ├── namespace.go │ │ │ ├── namespace_test.go │ │ │ ├── package.go │ │ │ ├── package_test.go │ │ │ └── testdata │ │ │ │ ├── namespace.yaml │ │ │ │ └── rendered-namespace.yaml.golden │ │ ├── reader │ │ │ ├── parser.go │ │ │ ├── parser_test.go │ │ │ ├── read_dir.go │ │ │ ├── reader_tar.go │ │ │ └── reader_test.go │ │ ├── resolver │ │ │ ├── resolver.go │ │ │ ├── resolver_incluster.go │ │ │ ├── resolver_incluster_test.go │ │ │ ├── resolver_local.go │ │ │ ├── resolver_local_test.go │ │ │ ├── resolver_test.go │ │ │ └── resolver_url.go │ │ ├── testdata │ │ │ ├── zk-crd-golden1 │ │ │ │ ├── instance.golden │ │ │ │ ├── operator.golden │ │ │ │ └── operatorversion.golden │ │ │ ├── zk-crd-golden2 │ │ │ │ ├── instance.golden │ │ │ │ ├── operator.golden │ │ │ │ └── operatorversion.golden │ │ │ ├── zk.tgz │ │ │ └── zk │ │ │ │ ├── operator.yaml │ │ │ │ ├── params.yaml │ │ │ │ └── templates │ │ │ │ ├── pdb.yaml │ │ │ │ ├── services.yaml │ │ │ │ ├── statefulset.yaml │ │ │ │ ├── subfolder │ │ │ │ └── statefulset2.yaml │ │ │ │ └── validation.yaml │ │ ├── types.go │ │ ├── verifier.go │ │ ├── verifier │ │ │ ├── plan │ │ │ │ ├── verify_references.go │ │ │ │ └── verify_references_test.go │ │ │ ├── task │ │ │ │ ├── verify_build.go │ │ │ │ ├── verify_build_test.go │ │ │ │ ├── verify_references.go │ │ │ │ └── verify_references_test.go │ │ │ └── template │ │ │ │ ├── parser.go │ │ │ │ ├── parser_test.go │ │ │ │ ├── verify_extended_parameters.go │ │ │ │ ├── verify_extended_parameters_test.go │ │ │ │ ├── verify_namespace.go │ │ │ │ ├── verify_namespace_test.go │ │ │ │ ├── verify_parameters.go │ │ │ │ ├── verify_parameters_test.go │ │ │ │ ├── verify_references.go │ │ │ │ ├── verify_references_test.go │ │ │ │ ├── verify_render.go │ │ │ │ └── verify_render_test.go │ │ └── writer │ │ │ ├── writer_tar.go │ │ │ └── writer_test.go │ ├── resources │ │ ├── dependencies │ │ │ ├── doc.go │ │ │ ├── resolve.go │ │ │ ├── resolve_test.go │ │ │ └── testdata │ │ │ │ ├── operator-with-dependencies.tgz │ │ │ │ └── operator-with-dependencies │ │ │ │ ├── child-operator │ │ │ │ ├── operator.yaml │ │ │ │ └── params.yaml │ │ │ │ └── parent-operator │ │ │ │ ├── operator.yaml │ │ │ │ └── params.yaml │ │ ├── install │ │ │ ├── instance.go │ │ │ └── operator.go │ │ └── upgrade │ │ │ ├── operatorversion.go │ │ │ └── operatorversion_test.go │ ├── util │ │ ├── kudo │ │ │ ├── kudo.go │ │ │ └── kudo_test.go │ │ └── repo │ │ │ ├── digest.go │ │ │ ├── index.go │ │ │ ├── index_test.go │ │ │ ├── repo.go │ │ │ ├── repo_operator.go │ │ │ ├── repo_test.go │ │ │ ├── resolver_repo.go │ │ │ ├── resolver_repo_test.go │ │ │ └── testdata │ │ │ ├── flink-index.yaml.golden │ │ │ ├── repositories.yaml.golden │ │ │ └── zk.tar.gz │ └── verifier │ │ └── result.go ├── test │ └── fake │ │ └── client.go ├── util │ ├── convert │ │ ├── convert.go │ │ └── convert_test.go │ └── kudo │ │ ├── labels.go │ │ ├── versions.go │ │ └── versions_test.go ├── version │ ├── base.go │ ├── version.go │ └── version_test.go └── webhook │ ├── instance_admission.go │ ├── instance_admission_integration_test.go │ └── instance_admission_test.go ├── test ├── Dockerfile ├── README.md ├── cert │ ├── ca.crt │ ├── tls.crt │ └── tls.key ├── e2e │ ├── apply-delete-apply │ │ ├── 00-assert.yaml │ │ ├── 00-install.yaml │ │ └── operator │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ └── configmap.yaml │ ├── cli-install-uninstall │ │ ├── 00-assert.yaml │ │ ├── 00-install.yaml │ │ ├── 01-assert.yaml │ │ ├── 01-errors.yaml │ │ ├── 01-uninstall.yaml │ │ └── first-operator │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ ├── cleanup.yaml │ │ │ └── deployment.yaml │ ├── dependencies-hash │ │ ├── 00-assert.yaml │ │ ├── 00-install.yaml │ │ ├── 01-assert.yaml │ │ ├── 01-update-replicas.yaml │ │ ├── 02-assert.yaml │ │ ├── 02-update-param.yaml │ │ ├── 03-assert.yaml │ │ ├── 03-update-replicas-again.yaml │ │ ├── 04-assert.yaml │ │ ├── 05-assert.yaml │ │ ├── 05-update-param-and-replica.yaml │ │ └── dep-operator │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ ├── configmap.yaml │ │ │ └── deployment.yaml │ ├── immutable-parameter-with-default │ │ ├── 00-assert.yaml │ │ ├── 00-install.yaml │ │ └── immutable-param │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ └── deployment.yaml │ ├── immutable-parameter │ │ ├── 00-assert.yaml │ │ ├── 00-install.yaml │ │ ├── 01-assert.yaml │ │ ├── 01-fail-to-update-param.yaml │ │ └── immutable-param │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ └── deployment.yaml │ ├── kind-config.yaml │ ├── plan-trigger │ │ ├── 00-assert.yaml │ │ ├── 00-install.yaml │ │ ├── 01-assert.yaml │ │ ├── 01-trigger.yaml │ │ └── feature-operator │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ └── configmap.yaml │ ├── readiness │ │ ├── 00-assert.yaml │ │ ├── 00-install.yaml │ │ ├── 01-assert.yaml │ │ ├── 01-updatedeployment.yaml │ │ └── first-operator │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ └── deployment.yaml │ ├── terminal-failed-job │ │ ├── 00-assert.yaml │ │ ├── 00-install.yaml │ │ ├── 01-assert.yaml │ │ ├── 01-install-timeout.yaml │ │ ├── failjob-operator │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ │ └── failjob.yaml │ │ └── job-timeout-operator │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ └── timeoutjob.yaml │ ├── toggle-task │ │ ├── 00-assert.yaml │ │ ├── 00-install.yaml │ │ ├── 01-assert.yaml │ │ ├── 01-errors.yaml │ │ ├── 01-update.yaml │ │ ├── 02-assert.yaml │ │ ├── 02-update.yaml │ │ ├── README.md │ │ └── feature-operator │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ └── configmap.yaml │ ├── update-with-upgrade │ │ ├── 00-assert.yaml │ │ ├── 00-install.yaml │ │ ├── 01-assert.yaml │ │ ├── 01-upgrade-operator-version.yaml │ │ ├── update-with-upgrade-v1 │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ │ ├── configmap-deployed.yaml │ │ │ │ ├── configmap-updated.yaml │ │ │ │ └── configmap-upgraded.yaml │ │ └── update-with-upgrade-v2 │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ ├── configmap-deployed.yaml │ │ │ ├── configmap-updated.yaml │ │ │ └── configmap-upgraded.yaml │ └── upgrade │ │ ├── 00-assert.yaml │ │ ├── 00-install.yaml │ │ ├── 01-assert.yaml │ │ ├── 01-upgrade.yaml │ │ ├── first-operator-v2 │ │ ├── operator.yaml │ │ ├── params.yaml │ │ └── templates │ │ │ ├── configmap.yaml │ │ │ └── deployment.yaml │ │ └── first-operator │ │ ├── operator.yaml │ │ ├── params.yaml │ │ └── templates │ │ └── deployment.yaml ├── integration │ ├── cli-install │ │ ├── 00-assert.yaml │ │ ├── 00-install.yaml │ │ ├── 01-assert.yaml │ │ ├── 01-upgrade.yaml │ │ └── cli-install-operator │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ └── deployment.yaml │ ├── create-operator-in-operator │ │ ├── 00-dream.yaml │ │ ├── 01-assert.yaml │ │ └── 01-install.yaml │ ├── dependencies-package-create │ │ ├── 00-install.yaml │ │ └── operator-with-dependencies │ │ │ ├── child-operator │ │ │ ├── operator.yaml │ │ │ └── params.yaml │ │ │ └── parent-operator │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ └── child-params.yaml │ ├── first-operator-test │ │ ├── 00-assert.yaml │ │ ├── 00-install.yaml │ │ ├── 01-assert.yaml │ │ ├── 01-errors.yaml │ │ ├── 01-scale.yaml │ │ └── first-operator │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ └── deployment.yaml │ ├── immutable-client-ip │ │ ├── 00-assert.yaml │ │ ├── 00-install-instance.yaml │ │ ├── 01-assert.yaml │ │ └── 01-update-parameter.yaml │ ├── install-existing-crds-in-operator │ │ ├── 00-assert.yaml │ │ ├── 00-install-operator.yaml │ │ └── crd-operator │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ └── crd.yaml │ ├── instance-controller-param-change-custom-trigger │ │ ├── 00-assert.yaml │ │ ├── 00-setup.yaml │ │ ├── 01-assert.yaml │ │ └── 01-update-instance.yaml │ ├── instance-controller-param-change-fallback-to-deploy │ │ ├── 00-assert.yaml │ │ ├── 00-setup.yaml │ │ ├── 01-assert.yaml │ │ └── 01-update-instance.yaml │ ├── instance-controller-param-change-no-trigger │ │ ├── 00-assert.yaml │ │ ├── 00-setup.yaml │ │ ├── 01-assert.yaml │ │ └── 01-update-instance.yaml │ ├── instance-controller-upgrade-fallback-to-deploy │ │ ├── 00-assert.yaml │ │ ├── 00-setup.yaml │ │ ├── 01-assert.yaml │ │ └── 01-upgrade-instance.yaml │ ├── instance-controller-upgrade-fallback-to-update │ │ ├── 00-assert.yaml │ │ ├── 00-setup.yaml │ │ ├── 01-assert.yaml │ │ └── 01-upgrade-instance.yaml │ ├── instance-controller-upgrade │ │ ├── 00-assert.yaml │ │ ├── 00-setup.yaml │ │ ├── 01-assert.yaml │ │ └── 01-upgrade-instance.yaml │ ├── invalid-crd-install │ │ ├── 00-assert.yaml │ │ ├── 00-install.yaml │ │ └── op-with-crd │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ └── invalid-crd.yaml │ ├── operator-test │ │ ├── 00-assert.yaml │ │ ├── 00-install.yaml │ │ ├── 01-assert.yaml │ │ └── 01-upgrade.yaml │ ├── operator-with-custom-crd │ │ ├── 00-assert.yaml │ │ ├── 00-install-crd.yaml │ │ └── operator │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ ├── crd.yaml │ │ │ └── sm.yaml │ ├── operator-with-dependencies │ │ ├── 01-assert.yaml │ │ ├── 01-install.yaml │ │ ├── child-operator │ │ │ ├── operator.yaml │ │ │ └── params.yaml │ │ └── parent-operator │ │ │ ├── operator.yaml │ │ │ └── params.yaml │ ├── operator-with-subdirectory-resources │ │ ├── 00-assert.yaml │ │ ├── 00-install.yaml │ │ └── operator │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ ├── deployments │ │ │ └── deployment.yaml │ │ │ └── service │ │ │ └── service.yaml │ ├── parameter-types-operator │ │ ├── 01-assert.yaml │ │ ├── 01-install.yaml │ │ └── operator │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ └── deployment.yaml │ ├── parameter-types │ │ ├── 01-assert.yaml │ │ └── 01-install.yaml │ ├── parse-param-operator-in-operator │ │ ├── 00-dream.yaml │ │ ├── 01-assert.yaml │ │ └── 01-install.yaml │ ├── remove-pod-container │ │ ├── 00-assert.yaml │ │ ├── 00-errors.yaml │ │ ├── 00-install.yaml │ │ ├── 01-assert.yaml │ │ ├── 01-update.yaml │ │ ├── 02-assert.yaml │ │ ├── 02-errors.yaml │ │ ├── 02-update_param.yaml │ │ └── dual-pod-operator │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ └── deployment.yaml │ ├── rendering-error-plan-failed │ │ ├── 00-assert.yaml │ │ └── 00-install.yaml │ ├── step-delete │ │ ├── 00-assert.yaml │ │ ├── 00-install-instance.yaml │ │ ├── 01-assert.yaml │ │ └── 01-upgrade.yaml │ ├── update-command │ │ ├── 00-install.yaml │ │ ├── 01-assert.yaml │ │ ├── 02-assert.yaml │ │ └── 02-update.yaml │ ├── update-parameters │ │ ├── 00-assert.yaml │ │ ├── 00-install.yaml │ │ ├── 01-assert.yaml │ │ ├── 01-update.yaml │ │ ├── 02-assert.yaml │ │ └── 02-update.yaml │ ├── upgrade-command │ │ ├── 00-assert.yaml │ │ ├── 00-install.yaml │ │ ├── 01-assert.yaml │ │ ├── 01-upgrade.yaml │ │ ├── first-operator │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ │ └── configmap.yaml │ │ └── second-operator │ │ │ ├── operator.yaml │ │ │ ├── params.yaml │ │ │ └── templates │ │ │ └── configmap.yaml │ └── upgrade-with-dependencies │ │ ├── 00-assert.yaml │ │ ├── 00-errors.yaml │ │ ├── 00-install.yaml │ │ ├── 01-assert.yaml │ │ ├── 01-upgrade.yaml │ │ ├── dependency │ │ ├── operator.yaml │ │ └── params.yaml │ │ ├── operator-1.0 │ │ ├── operator.yaml │ │ └── params.yaml │ │ └── operator-2.0 │ │ ├── operator.yaml │ │ └── params.yaml ├── kudo-e2e-test.yaml.tmpl ├── kudo-integration-test.yaml ├── kudo-upgrade-test.yaml.tmpl ├── manifests │ ├── configmap-operator.yaml │ ├── instance-admission-webhook.yaml │ ├── test-operator.yaml │ └── toy-operator.yaml ├── run_tests.sh └── upgrade │ ├── cert-manager-detection │ ├── 00-assert.yaml │ ├── 00-install-cert-manager-0-16-0.yaml │ ├── 01-assert.yaml │ ├── 01-install-kudo.yaml │ ├── 02-errors.yaml │ ├── 02-remove-kudo.yaml │ ├── 03-errors.yaml │ ├── 03-uninstall-cert-manager-0-16-0.yaml │ ├── 05-assert.yaml │ ├── 05-install-cert-manager-1-0-3.yaml │ ├── 06-assert.yaml │ ├── 06-install-kudo.yaml │ ├── 99-errors.yaml │ ├── 99-remove-kudo.yaml │ └── cert-manager │ │ ├── cert-manager-0.16.0.yaml │ │ └── cert-manager-1.0.3.yaml │ └── upgrade-to-current │ ├── 00-assert.yaml │ ├── 00-install-old-kudo.yaml │ ├── 01-assert.yaml │ ├── 01-install-operator.yaml │ ├── 02-assert.yaml │ ├── 02-upgrade-kudo.yaml │ ├── 03-assert.yaml │ ├── 03-upgrade-operator.yaml │ ├── 99-errors.yaml │ ├── 99-remove-kudo.yaml │ ├── download-kudo.sh │ ├── simple-op-0.1.0 │ ├── operator.yaml │ ├── params.yaml │ └── templates │ │ └── deployment.yaml │ └── simple-op-0.2.0 │ ├── operator.yaml │ ├── params.yaml │ └── templates │ └── deployment.yaml └── tools.go /.dockerignore: -------------------------------------------------------------------------------- 1 | .circleci 2 | .github 3 | .git 4 | bin 5 | docs 6 | hack/code-gen 7 | hack/controller-gen 8 | dist 9 | keps 10 | logo 11 | site -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # This is a comment. 2 | # Each line is a file pattern followed by one or more owners. 3 | 4 | # These owners will be the default owners for everything in 5 | # the repo. Unless a later match takes precedence, 6 | # @global-owner1 and @global-owner2 will be requested for 7 | # review when someone opens a pull request. 8 | * @kensipe @alenkacz @zen-dog 9 | 10 | # In this example, @doctocat owns any files in the build/logs 11 | # directory at the root of the repository and any of its 12 | # subdirectories. 13 | /pkg/test/ @jbarrick-mesosphere 14 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/enhancement-request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Enhancement Request 3 | about: Suggest an enhancement to the KUDO project 4 | title: '' 5 | labels: kind/enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | 13 | 14 | **What would you like to be added**: 15 | 16 | **Why is this needed**: 17 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 7 | 8 | **What this PR does / why we need it**: 9 | 10 | 11 | 15 | Fixes # 16 | -------------------------------------------------------------------------------- /.github/new-branch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kudobuilder/kudo/50ef72329f0e76ae57b33ae552605b7e39198336/.github/new-branch.png -------------------------------------------------------------------------------- /.github/release-drafter.yml: -------------------------------------------------------------------------------- 1 | name-template: 'kudo-v$NEXT_MINOR_VERSION Draft' 2 | tag-template: 'v$NEXT_MINOR_VERSION-draft' 3 | categories: 4 | - title: '🚀 Highlights' 5 | labels: 6 | - 'release/highlight' 7 | - title: '⚠️ Breaking Changes' 8 | labels: 9 | - 'release/breaking-change' 10 | - title: '🐛 Bug Fixes' 11 | labels: 12 | - 'release/bugfix' 13 | change-template: '- $TITLE (#$NUMBER)' 14 | template: | 15 | This is a draft for the next release. 16 | 17 | Please do not edit this file directly, use it as a template in the next release. 18 | 19 | ## Changes 20 | 21 | $CHANGES 22 | 23 | ## Supported Kubernetes Versions 24 | 25 | This release of KUDO is using the Kubernetes API 1.19 and is compatible with Kubernetes versions 1.17, 1.18, and 1.19. 26 | 27 | ## Contributors 28 | 29 | $CONTRIBUTORS 30 | -------------------------------------------------------------------------------- /.github/workflows/release-drafter.yml: -------------------------------------------------------------------------------- 1 | name: Release Drafter 2 | 3 | on: 4 | push: 5 | # branches to consider in the event; optional, defaults to all 6 | branches: 7 | - main 8 | 9 | jobs: 10 | update_release_draft: 11 | runs-on: ubuntu-latest 12 | steps: 13 | # Drafts your next Release notes as Pull Requests are merged into "main" 14 | - uses: release-drafter/release-drafter@v5 15 | with: 16 | # (Optional) specify config name to use, relative to .github/. Default: release-drafter.yml 17 | config-name: release-drafter.yml 18 | env: 19 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 20 | -------------------------------------------------------------------------------- /.golangci.yml: -------------------------------------------------------------------------------- 1 | linters: 2 | auto-fix: false 3 | enable: 4 | - deadcode 5 | - dupl 6 | - errcheck 7 | - goconst 8 | - gocritic 9 | - gocyclo 10 | - gofmt 11 | - goimports 12 | - golint 13 | - gosec 14 | - gosimple 15 | - ineffassign 16 | - lll 17 | - misspell 18 | - nakedret 19 | - scopelint 20 | - staticcheck 21 | - structcheck 22 | - stylecheck 23 | - unconvert 24 | - unparam 25 | - unused 26 | - varcheck 27 | run: 28 | timeout: 3m 29 | build-tags: 30 | - integration 31 | skip-dirs: 32 | # autogenerated clientset by client-gen 33 | - pkg/client 34 | linters-settings: 35 | errcheck: 36 | check-type-assertions: true 37 | lll: 38 | line-length: 250 39 | dupl: 40 | threshold: 400 41 | goimports: 42 | local-prefixes: github.com/kudobuilder/kudo 43 | issues: 44 | # ignore gosec for test files 45 | exclude-rules: 46 | - path: _test\.go 47 | linters: 48 | - gosec -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | # Git hooks for KUDO. Install with 2 | # pre-commit install -t pre-commit -t commit-msg 3 | repos: 4 | - repo: local 5 | hooks: 6 | - id: golangci-lint 7 | name: golangci-lint 8 | description: Check that source code is linted 9 | entry: make lint 10 | language: system 11 | stages: [commit] 12 | - repo: local 13 | hooks: 14 | - id: signed-off-commits 15 | name: signed-off-commits 16 | description: Check that commit messages include a 'Signed-off-by' line 17 | entry: ./hack/check-commit-signed-off.sh 18 | language: script 19 | stages: [commit-msg] 20 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Build the manager binary 2 | FROM golang:1.15 as builder 3 | 4 | # Setting arguments 5 | ARG ldflags_arg 6 | 7 | 8 | # Copy in the go src 9 | WORKDIR /go/src/github.com/kudobuilder/kudo 10 | COPY pkg/ pkg/ 11 | COPY cmd/ cmd/ 12 | COPY go.mod go.mod 13 | COPY go.sum go.sum 14 | ENV GO111MODULE on 15 | 16 | # Build with ldflags set 17 | RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o manager \ 18 | -ldflags "${ldflags_arg}" github.com/kudobuilder/kudo/cmd/manager 19 | 20 | # Copy the controller-manager into a thin image 21 | FROM scratch 22 | WORKDIR /root/ 23 | COPY --from=builder /go/src/github.com/kudobuilder/kudo/manager . 24 | ENTRYPOINT ["./manager"] 25 | -------------------------------------------------------------------------------- /Dockerfile.goreleaser: -------------------------------------------------------------------------------- 1 | FROM scratch 2 | WORKDIR /root/ 3 | COPY manager /root 4 | ENTRYPOINT ["./manager"] 5 | -------------------------------------------------------------------------------- /OWNERS: -------------------------------------------------------------------------------- 1 | maintainers: 2 | - alenkacz 3 | kudo-core-maintainers: 4 | - runyontr 5 | - zen-dog 6 | - zmalik 7 | kuttl-maintainers: 8 | - jmccormick2001 9 | - kensipe 10 | -------------------------------------------------------------------------------- /PROJECT: -------------------------------------------------------------------------------- 1 | version: "1" 2 | domain: k8s.io 3 | repo: github.com/kudobuilder/kudo 4 | -------------------------------------------------------------------------------- /SECURITY_CONTACTS: -------------------------------------------------------------------------------- 1 | # Defined below are the security contacts for this repo. 2 | # 3 | # They are the contact point for the Product Security Team to reach out 4 | # to for triaging and handling of incoming issues. 5 | # 6 | # The below names agree to abide by the 7 | # [Embargo Policy](https://github.com/kubernetes/sig-release/blob/master/security-release-process-documentation/security-release-process.md#embargo-policy) 8 | # and will be removed and replaced if they violate that agreement. 9 | # 10 | # DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE 11 | # INSTRUCTIONS AT https://kubernetes.io/security/ 12 | 13 | gerred 14 | joerg84 15 | -------------------------------------------------------------------------------- /build/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG GOLANG_VERSION=1.16 2 | FROM golang:${GOLANG_VERSION} 3 | ARG KUBEBUILDER_VERSION=2.3.1 4 | 5 | # Download and install Kubebuilder 6 | 7 | # download the release, extract and move it in one step, to reduce layer size 8 | RUN curl --fail -L -O https://github.com/kubernetes-sigs/kubebuilder/releases/download/v${KUBEBUILDER_VERSION}/kubebuilder_${KUBEBUILDER_VERSION}_linux_amd64.tar.gz && \ 9 | tar -zxvf kubebuilder_${KUBEBUILDER_VERSION}_linux_amd64.tar.gz && \ 10 | rm -f kubebuilder_${KUBEBUILDER_VERSION}_linux_amd64.tar.gz && \ 11 | mv kubebuilder_${KUBEBUILDER_VERSION}_linux_amd64 /usr/local/kubebuilder 12 | 13 | # update your PATH to include /usr/local/kubebuilder/bin 14 | ENV PATH $PATH:/usr/local/kubebuilder/bin 15 | -------------------------------------------------------------------------------- /build/test-images.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | docker build --build-arg GOLANG_VERSION=1.15 -t kudobuilder/golang:1.15 . 4 | docker push kudobuilder/golang:1.15 5 | 6 | docker build --build-arg GOLANG_VERSION=latest -t kudobuilder/golang:latest . 7 | docker push kudobuilder/golang:latest 8 | -------------------------------------------------------------------------------- /cmd/kubectl-kudo/main.go: -------------------------------------------------------------------------------- 1 | // Copyright 2018 The Patras-SDK Authors 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | package main 16 | 17 | import ( 18 | "os" 19 | 20 | "github.com/kudobuilder/kudo/pkg/kudoctl/cmd" 21 | ) 22 | 23 | func main() { 24 | if err := cmd.NewKudoctlCmd().Execute(); err != nil { 25 | os.Exit(-1) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /config/crds/README.md: -------------------------------------------------------------------------------- 1 | # CRD manifests 2 | 3 | These files are generated by `controller-gen` from the structs in the `pkg/apis` directory. 4 | And in turn they are the source for the `pkg/kudoctl/kudoinit/crds` package. 5 | -------------------------------------------------------------------------------- /hack/boilerplate.go.txt: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | */ -------------------------------------------------------------------------------- /hack/check-commit-signed-off.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -o errexit 4 | set -o nounset 5 | set -o pipefail 6 | 7 | file="$1" 8 | 9 | signedoff_regex='^Signed-off-by: ' 10 | 11 | if [ "$(grep -c "$signedoff_regex" "$file")" != "1" ]; then 12 | printf >&2 "Signed-off-by line is missing.\n" 13 | exit 1 14 | fi 15 | -------------------------------------------------------------------------------- /hack/deploy-dev-prereqs.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | if ! command -v kubectl &> /dev/null 4 | then 5 | echo "required kubectl command NOT found" 6 | exit 1 7 | fi 8 | 9 | # cache folder 10 | MANCACHE=hack/manifest-gen 11 | 12 | if [ ! -d "$MANCACHE" ] 13 | then 14 | echo "manifests do not exist." 15 | echo "you must run 'make generate-manifests' or './hack/update-manifests.sh'" 16 | exit 1 17 | fi 18 | 19 | 20 | kubectl apply -f "$MANCACHE"/ 21 | kubectl apply -f config/crds 22 | 23 | echo "Finished" -------------------------------------------------------------------------------- /hack/install-golangcilint.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -o errexit 4 | set -o nounset 5 | set -o pipefail 6 | 7 | GOLANGCILINT_VERSION=$1 8 | 9 | curl -sSfL "https://raw.githubusercontent.com/golangci/golangci-lint/${GOLANGCILINT_VERSION}/install.sh" | sh -s -- -b "$(go env GOPATH)/bin" "${GOLANGCILINT_VERSION}" 10 | -------------------------------------------------------------------------------- /hack/run-kuttl-tests.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -o errexit 4 | set -o nounset 5 | set -o pipefail 6 | set -o xtrace 7 | 8 | INTEGRATION_OUTPUT_JUNIT=${INTEGRATION_OUTPUT_JUNIT:-false} 9 | TEST_ONLY=${TEST_ONLY:+"--test $TEST_ONLY"} 10 | 11 | if [ "$INTEGRATION_OUTPUT_JUNIT" == true ] 12 | then 13 | echo "Running integration tests with junit output" 14 | mkdir -p reports/ 15 | go get github.com/jstemmer/go-junit-report 16 | go run ./cmd/kubectl-kudo test --config test/kudo-integration-test.yaml ${TEST_ONLY} 2>&1 |tee /dev/fd/2 |go-junit-report -set-exit-code > reports/kudo_test_report.xml 17 | else 18 | echo "Running integration tests without junit output" 19 | go run ./cmd/kubectl-kudo test --config test/kudo-integration-test.yaml ${TEST_ONLY} 20 | fi 21 | -------------------------------------------------------------------------------- /hack/verify-generate.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -o nounset 4 | set -o pipefail 5 | # intentionally not setting 'set -o errexit' because we want to print custom error messages 6 | 7 | # versions of tools 8 | echo "controller-gen $(controller-gen --version)" 9 | go-bindata -version 10 | 11 | # make sure make generate can be invoked 12 | make generate 13 | RETVAL=$? 14 | if [[ ${RETVAL} != 0 ]]; then 15 | echo "Invoking 'make generate' ends with non-zero exit code." 16 | exit 1 17 | fi 18 | 19 | git diff --exit-code --quiet 20 | RETVAL=$? 21 | 22 | if [[ ${RETVAL} != 0 ]]; then 23 | echo "Running 'make generate' produces changes to the current git status. Maybe you forgot to check-in your updated generated files?" 24 | echo "The current diff: $(git diff)" 25 | exit 1 26 | fi 27 | 28 | echo "Verifying 'make generate' was successful! ヽ(•‿•)ノ" 29 | exit 0 30 | -------------------------------------------------------------------------------- /hack/verify-go-clean.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ##### 4 | # Used to ensure that running `go mod tidy` results in a non-dirty repository. 5 | # Used to verify that dependency changes have been cleaned 6 | ##### 7 | 8 | set -o nounset 9 | set -o pipefail 10 | # intentionally not setting 'set -o errexit' because we want to print custom error messages 11 | 12 | # versions of tools 13 | echo "$(go version)" 14 | 15 | # make sure make generate can be invoked 16 | go mod tidy 17 | RETVAL=$? 18 | if [[ ${RETVAL} != 0 ]]; then 19 | echo "Invoking 'go mod tidy' ends with non-zero exit code." 20 | exit 1 21 | fi 22 | 23 | git diff --exit-code --quiet 24 | RETVAL=$? 25 | 26 | if [[ ${RETVAL} != 0 ]]; then 27 | echo "Running 'go mod tidy' produces changes to the current git status. Maybe you forgot to clean go.mod after changing dependencies?" 28 | echo "The current diff:" 29 | git diff 30 | exit 1 31 | fi 32 | 33 | echo "Verifying 'go mod tidy' was successful! ヽ(•‿•)ノ" 34 | exit 0 35 | -------------------------------------------------------------------------------- /logo/kudo_horizontal_color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kudobuilder/kudo/50ef72329f0e76ae57b33ae552605b7e39198336/logo/kudo_horizontal_color.png -------------------------------------------------------------------------------- /logo/kudo_horizontal_color@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kudobuilder/kudo/50ef72329f0e76ae57b33ae552605b7e39198336/logo/kudo_horizontal_color@2x.png -------------------------------------------------------------------------------- /logo/kudo_horizontal_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kudobuilder/kudo/50ef72329f0e76ae57b33ae552605b7e39198336/logo/kudo_horizontal_dark.png -------------------------------------------------------------------------------- /logo/kudo_horizontal_dark@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kudobuilder/kudo/50ef72329f0e76ae57b33ae552605b7e39198336/logo/kudo_horizontal_dark@2x.png -------------------------------------------------------------------------------- /logo/kudo_horizontal_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kudobuilder/kudo/50ef72329f0e76ae57b33ae552605b7e39198336/logo/kudo_horizontal_light.png -------------------------------------------------------------------------------- /logo/kudo_horizontal_light@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kudobuilder/kudo/50ef72329f0e76ae57b33ae552605b7e39198336/logo/kudo_horizontal_light@2x.png -------------------------------------------------------------------------------- /logo/kudo_stacked_color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kudobuilder/kudo/50ef72329f0e76ae57b33ae552605b7e39198336/logo/kudo_stacked_color.png -------------------------------------------------------------------------------- /logo/kudo_stacked_color@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kudobuilder/kudo/50ef72329f0e76ae57b33ae552605b7e39198336/logo/kudo_stacked_color@2x.png -------------------------------------------------------------------------------- /logo/kudo_stacked_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kudobuilder/kudo/50ef72329f0e76ae57b33ae552605b7e39198336/logo/kudo_stacked_dark.png -------------------------------------------------------------------------------- /logo/kudo_stacked_dark@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kudobuilder/kudo/50ef72329f0e76ae57b33ae552605b7e39198336/logo/kudo_stacked_dark@2x.png -------------------------------------------------------------------------------- /logo/kudo_stacked_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kudobuilder/kudo/50ef72329f0e76ae57b33ae552605b7e39198336/logo/kudo_stacked_light.png -------------------------------------------------------------------------------- /logo/kudo_stacked_light@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kudobuilder/kudo/50ef72329f0e76ae57b33ae552605b7e39198336/logo/kudo_stacked_light@2x.png -------------------------------------------------------------------------------- /pkg/apis/addtoscheme_kudo_v1alpha1.go: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | */ 15 | 16 | package apis 17 | 18 | import "github.com/kudobuilder/kudo/pkg/apis/kudo/v1beta1" 19 | 20 | func init() { 21 | // Register the types with the Scheme so the components can map objects to GroupVersionKinds and back 22 | AddToSchemes = append(AddToSchemes, v1beta1.SchemeBuilder.AddToScheme) 23 | } 24 | -------------------------------------------------------------------------------- /pkg/apis/apis.go: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | */ 15 | 16 | // Package apis contains Kubernetes API groups. 17 | package apis 18 | 19 | import ( 20 | "k8s.io/apimachinery/pkg/runtime" 21 | ) 22 | 23 | // AddToSchemes may be used to add all resources defined in the project to a Scheme 24 | var AddToSchemes runtime.SchemeBuilder 25 | 26 | // AddToScheme adds all Resources to the Scheme 27 | func AddToScheme(s *runtime.Scheme) error { 28 | return AddToSchemes.AddToScheme(s) 29 | } 30 | -------------------------------------------------------------------------------- /pkg/apis/kudo/group.go: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | */ 15 | 16 | // Package kudo contains kudo API versions 17 | package kudo 18 | -------------------------------------------------------------------------------- /pkg/apis/kudo/v1beta1/doc.go: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | */ 15 | 16 | // Package v1beta1 contains API Schema definitions for the kudo v1beta1 API group 17 | // +k8s:openapi-gen=true 18 | // +k8s:deepcopy-gen=package,register 19 | // +k8s:conversion-gen=github.com/kudobuilder/kudo/pkg/apis/kudo 20 | // +k8s:defaulter-gen=TypeMeta 21 | // +groupName=kudo.dev 22 | package v1beta1 23 | -------------------------------------------------------------------------------- /pkg/apis/kudo/v1beta1/operator_types_helpers.go: -------------------------------------------------------------------------------- 1 | package v1beta1 2 | 3 | import ( 4 | "context" 5 | 6 | "k8s.io/apimachinery/pkg/types" 7 | "sigs.k8s.io/controller-runtime/pkg/client" 8 | ) 9 | 10 | func GetOperator(name, ns string, c client.Client) (*Operator, error) { 11 | o := &Operator{} 12 | err := c.Get(context.TODO(), types.NamespacedName{Name: name, Namespace: ns}, o) 13 | if err != nil { 14 | return nil, err 15 | } 16 | return o, nil 17 | } 18 | -------------------------------------------------------------------------------- /pkg/client/clientset/versioned/doc.go: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | */ 15 | // Code generated by client-gen. DO NOT EDIT. 16 | 17 | // This package has the automatically generated clientset. 18 | package versioned 19 | -------------------------------------------------------------------------------- /pkg/client/clientset/versioned/fake/doc.go: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | */ 15 | // Code generated by client-gen. DO NOT EDIT. 16 | 17 | // This package has the automatically generated fake clientset. 18 | package fake 19 | -------------------------------------------------------------------------------- /pkg/client/clientset/versioned/scheme/doc.go: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | */ 15 | // Code generated by client-gen. DO NOT EDIT. 16 | 17 | // This package contains the scheme of the automatically generated clientset. 18 | package scheme 19 | -------------------------------------------------------------------------------- /pkg/client/clientset/versioned/typed/kudo/v1beta1/doc.go: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | */ 15 | // Code generated by client-gen. DO NOT EDIT. 16 | 17 | // This package has the automatically generated typed clients. 18 | package v1beta1 19 | -------------------------------------------------------------------------------- /pkg/client/clientset/versioned/typed/kudo/v1beta1/fake/doc.go: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | */ 15 | // Code generated by client-gen. DO NOT EDIT. 16 | 17 | // Package fake has the automatically generated clients. 18 | package fake 19 | -------------------------------------------------------------------------------- /pkg/client/clientset/versioned/typed/kudo/v1beta1/generated_expansion.go: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | */ 15 | // Code generated by client-gen. DO NOT EDIT. 16 | 17 | package v1beta1 18 | 19 | type InstanceExpansion interface{} 20 | 21 | type OperatorExpansion interface{} 22 | 23 | type OperatorVersionExpansion interface{} 24 | -------------------------------------------------------------------------------- /pkg/engine/doc.go: -------------------------------------------------------------------------------- 1 | package engine 2 | 3 | /** 4 | 5 | Package engine contains all the submodules of the KUDO plan execution engine. Main submodules are: 6 | 7 | 1. renderer contains the template rendering engine 8 | 2. workflow contains the workflow engine 9 | 3. tasks contains the available task implementations 10 | 11 | */ 12 | -------------------------------------------------------------------------------- /pkg/engine/renderer/doc.go: -------------------------------------------------------------------------------- 1 | package renderer 2 | 3 | /** 4 | 5 | Package renderer implements the rendering engine of the KUDO execution engine. The engine will takes a template (typically KUDOs custom resources) and a parameter map as an input and will render the templates. 6 | 7 | */ 8 | -------------------------------------------------------------------------------- /pkg/engine/renderer/functions.go: -------------------------------------------------------------------------------- 1 | package renderer 2 | 3 | import "gopkg.in/yaml.v2" 4 | 5 | // ToYaml takes any value, and returns its YAML representation as a string. 6 | func ToYaml(v interface{}) (string, error) { 7 | out, err := yaml.Marshal(v) 8 | return string(out), err 9 | } 10 | -------------------------------------------------------------------------------- /pkg/engine/task/doc.go: -------------------------------------------------------------------------------- 1 | package task 2 | 3 | /* 4 | 5 | Package task contains all available tasks of the KUDO plan execution engine. 6 | 7 | To create a new task, the following steps need to be performed: 8 | 9 | 1. Create the task Go file and tests, implementing the Tasker interface. New task has to implement the Run() method. Keep in mind that it supposed to be idempotent and will be called multiple time (on each controller reconciliation). 10 | 2. Introduce a new API level tasks spec and add it to the `TaskSpec` in operatorversion_types.go 11 | 3. Extend the Build() method in the task package to convert your task spec into a Tasker object 12 | 13 | */ 14 | -------------------------------------------------------------------------------- /pkg/engine/task/task_dummy.go: -------------------------------------------------------------------------------- 1 | package task 2 | 3 | import ( 4 | "errors" 5 | ) 6 | 7 | // DummyTask is a task that can fail or succeed on demand 8 | type DummyTask struct { 9 | Name string 10 | WantErr bool 11 | Fatal bool 12 | Done bool 13 | } 14 | 15 | // Run method for the tDummyTask. It has no side effects and returns a dummy error if WantErr is true 16 | func (dt DummyTask) Run(ctx Context) (bool, error) { 17 | if dt.WantErr { 18 | err := errors.New("dummy error") 19 | if dt.Fatal { 20 | err = fatalExecutionError(err, dummyTaskError, ctx.Meta) 21 | } 22 | return false, err 23 | } 24 | 25 | return dt.Done, nil 26 | } 27 | -------------------------------------------------------------------------------- /pkg/engine/workflow/doc.go: -------------------------------------------------------------------------------- 1 | package workflow 2 | 3 | /** 4 | 5 | Package workflow implement the KUDO workflow engine. Its main entry point is the `Execute` method which takes an active plan, engine metadata and executes it by looping through plans phases and steps and executing the respective tasks. 6 | */ 7 | -------------------------------------------------------------------------------- /pkg/feature/doc.go: -------------------------------------------------------------------------------- 1 | package feature 2 | 3 | /* 4 | 5 | Package feature implements feature gating for KUDO based on the Kubernetes feature gating packages. 6 | 7 | */ 8 | -------------------------------------------------------------------------------- /pkg/feature/feature.go: -------------------------------------------------------------------------------- 1 | package feature 2 | 3 | import ( 4 | "k8s.io/apimachinery/pkg/util/runtime" 5 | "k8s.io/component-base/featuregate" 6 | ) 7 | 8 | var ( 9 | DefaultMutableFeatureGate featuregate.MutableFeatureGate = featuregate.NewFeatureGate() 10 | 11 | DefaultFeatureGate featuregate.FeatureGate = DefaultMutableFeatureGate 12 | ) 13 | 14 | func init() { 15 | runtime.Must(DefaultMutableFeatureGate.Add(defaultKUDOFeatureGates)) 16 | } 17 | 18 | var defaultKUDOFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{} 19 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/gziphelper.go: -------------------------------------------------------------------------------- 1 | package diagnostics 2 | 3 | import ( 4 | "io" 5 | 6 | "compress/gzip" 7 | ) 8 | 9 | // streamGzipper - a helper for gzipping a stream 10 | type streamGzipper struct { 11 | w io.Writer 12 | } 13 | 14 | func newGzipWriter(w io.Writer) *streamGzipper { 15 | return &streamGzipper{ 16 | w: w, 17 | } 18 | } 19 | 20 | // write - gzip the provided stream by sequential reads into the underlying bytes buffer and gzipping the bytes 21 | func (z *streamGzipper) write(r io.ReadCloser) error { 22 | zw := gzip.NewWriter(z.w) 23 | var err error 24 | var written int64 25 | for { 26 | written, err = io.Copy(zw, r) 27 | if err != nil || written == 0 { 28 | _ = zw.Close() 29 | _ = r.Close() 30 | break 31 | } 32 | } 33 | if err == io.EOF { 34 | return nil 35 | } 36 | return err 37 | } 38 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/runner.go: -------------------------------------------------------------------------------- 1 | package diagnostics 2 | 3 | // collector - generic interface for diagnostic data collection 4 | // implementors are expected to return only fatal errors and handle non-fatal ones themselves 5 | type collector interface { 6 | collect(printer *nonFailingPrinter) error 7 | } 8 | 9 | // runner - sequential runner for Collectors reducing error checking boilerplate code 10 | type runner struct { 11 | collectors []collector 12 | } 13 | 14 | func (r *runner) addCollector(c collector) { 15 | r.collectors = append(r.collectors, c) 16 | } 17 | 18 | func (r *runner) addObjDump(v interface{}, dir stringGetter, name string) { 19 | r.addCollector(&objCollector{ 20 | obj: v, 21 | parentDir: dir, 22 | name: name, 23 | }) 24 | } 25 | 26 | func (r *runner) run(printer *nonFailingPrinter) error { 27 | for _, c := range r.collectors { 28 | if err := c.collect(printer); err != nil { 29 | return err 30 | } 31 | } 32 | return nil 33 | } 34 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/child_instance.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | labels: 5 | kudo.dev/operator: zookeeper-instance-child 6 | name: zookeeper-instance-child-instance 7 | namespace: my-namespace 8 | ownerReferences: 9 | - uid: 4c46f7a2-3571-4047-9a15-be5043c6b357 10 | spec: 11 | operatorVersion: 12 | name: zookeeper-instance-child-0.1.0 13 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/child_operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Operator 3 | metadata: 4 | name: zookeeper-instance-child 5 | namespace: my-namespace 6 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/child_operatorversion.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: OperatorVersion 3 | metadata: 4 | name: zookeeper-instance-child-0.1.0 5 | namespace: my-namespace 6 | spec: 7 | operator: 8 | kind: Operator 9 | name: zookeeper-instance-child 10 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/cluster_role.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: rbac.authorization.k8s.io/v1 2 | kind: ClusterRole 3 | metadata: 4 | name: cluster-admin 5 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/cow_pod.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: cowsay-instance-deployment-6bb9f8dfd6-5cm72 5 | namespace: my-namespace 6 | spec: 7 | containers: 8 | - name: nginx 9 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/kudo_default_serviceaccount.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ServiceAccount 3 | metadata: 4 | name: default 5 | namespace: kudo-system 6 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/kudo_ns.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Namespace 3 | metadata: 4 | labels: 5 | app: kudo-manager 6 | name: kudo-system 7 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/kudo_pod.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | labels: 5 | app: kudo-manager 6 | name: kudo-controller-manager-0 7 | namespace: kudo-system 8 | spec: 9 | containers: 10 | - name: manager -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/kudo_serviceaccounts.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ServiceAccountList 3 | items: 4 | - apiVersion: v1 5 | kind: ServiceAccount 6 | metadata: 7 | labels: 8 | app: kudo-manager 9 | name: kudo-manager 10 | namespace: kudo-system 11 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/kudo_services.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ServiceList 3 | items: 4 | - apiVersion: v1 5 | kind: Service 6 | metadata: 7 | labels: 8 | app: kudo-manager 9 | name: kudo-controller-manager-service 10 | namespace: kudo-system -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/kudo_statefulsets.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: StatefulSetList 3 | items: 4 | - apiVersion: apps/v1 5 | kind: StatefulSet 6 | metadata: 7 | labels: 8 | app: kudo-manager 9 | name: kudo-controller-manager 10 | namespace: kudo-system -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/zk_instance.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | labels: 5 | kudo.dev/operator: zookeeper 6 | name: zookeeper-instance 7 | namespace: my-namespace 8 | uid: 4c46f7a2-3571-4047-9a15-be5043c6b357 9 | spec: 10 | operatorVersion: 11 | name: zookeeper-0.3.0 12 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/zk_operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Operator 3 | metadata: 4 | name: zookeeper 5 | namespace: my-namespace 6 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/zk_operatorversion.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: OperatorVersion 3 | metadata: 4 | name: zookeeper-0.3.0 5 | namespace: my-namespace 6 | spec: 7 | operator: 8 | kind: Operator 9 | name: zookeeper 10 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/zk_pods.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: PodList 3 | items: 4 | - apiVersion: v1 5 | kind: Pod 6 | metadata: 7 | labels: 8 | kudo.dev/operator: zookeeper 9 | name: zookeeper-instance-zookeeper-0 10 | namespace: my-namespace 11 | spec: 12 | containers: 13 | - name: kubernetes-zookeeper 14 | - name: pause-debug 15 | - apiVersion: v1 16 | kind: Pod 17 | metadata: 18 | labels: 19 | kudo.dev/operator: zookeeper 20 | name: zookeeper-instance-zookeeper-1 21 | namespace: my-namespace 22 | spec: 23 | containers: 24 | - name: kubernetes-zookeeper 25 | - apiVersion: v1 26 | kind: Pod 27 | metadata: 28 | labels: 29 | kudo.dev/operator: zookeeper 30 | name: zookeeper-instance-zookeeper-2 31 | namespace: my-namespace 32 | spec: 33 | containers: 34 | - name: kubernetes-zookeeper 35 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/zk_pvcs.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: PersistentVolumeClaimList 3 | items: 4 | - apiVersion: v1 5 | kind: PersistentVolumeClaim 6 | metadata: 7 | labels: 8 | kudo.dev/operator: zookeeper 9 | name: zk-datadir-zk-zookeeper-0 10 | namespace: default 11 | - apiVersion: v1 12 | kind: PersistentVolumeClaim 13 | metadata: 14 | labels: 15 | kudo.dev/operator: zookeeper 16 | name: zk-datadir-zk-zookeeper-1 17 | namespace: default 18 | - apiVersion: v1 19 | kind: PersistentVolumeClaim 20 | metadata: 21 | labels: 22 | kudo.dev/operator: zookeeper 23 | name: zk-datadir-zk-zookeeper-2 24 | namespace: default 25 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/zk_pvs.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: PersistentVolumeList 3 | items: 4 | - apiVersion: v1 5 | kind: PersistentVolume 6 | metadata: 7 | name: pvc-37800340-a87f-4607-896e-da091174def7 8 | - apiVersion: v1 9 | kind: PersistentVolume 10 | metadata: 11 | name: pvc-ac2ffdd6-362a-4204-82b9-1249b2dbf3be 12 | - apiVersion: v1 13 | kind: PersistentVolume 14 | metadata: 15 | name: pvc-dd49319a-03bb-4135-8798-71ceb7bfcbc2 16 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/zk_service_accounts.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ServiceAccountList 3 | items: 4 | - apiVersion: v1 5 | kind: ServiceAccount 6 | metadata: 7 | name: default 8 | namespace: my-namespace 9 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/zk_services.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ServiceList 3 | items: 4 | - apiVersion: v1 5 | kind: Service 6 | metadata: 7 | labels: 8 | kudo.dev/operator: zookeeper 9 | name: zookeeper-instance-cs 10 | namespace: my-namespace 11 | - apiVersion: v1 12 | kind: Service 13 | metadata: 14 | labels: 15 | kudo.dev/operator: zookeeper 16 | name: zookeeper-instance-hs 17 | namespace: my-namespace 18 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testdata/zk_statefulsets.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: StatefulSetList 3 | items: 4 | - apiVersion: apps/v1 5 | kind: StatefulSet 6 | metadata: 7 | labels: 8 | kudo.dev/operator: zookeeper 9 | name: zookeeper-instance-zookeeper 10 | namespace: my-namespace 11 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/testhelper_test.go: -------------------------------------------------------------------------------- 1 | package diagnostics 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/spf13/afero" 7 | ) 8 | 9 | const ( 10 | testLog = "2020/05/25 08:00:55 Ein Fichtenbaum steht einsam im Norden auf kahler Höh" 11 | testLogGZipped = "\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff2202\xd070\xd572U0\xb0\xb020" + 12 | "\xb025Up\xcd\xccSp\xcbL\xce(I\xcdKJ,\xcdU(.I\xcd(QH\xcd\xcc+N\xccU\xc8\xccU\xf0" + 13 | "\xcb/JI\xcdSH,MS\xc8N\xcc\xc8I-R\xf08\xbc-\x03\x10\x00\x00\xff\xff'\b\x1b\xe7J\x00\x00\x00" 14 | ) 15 | 16 | var errFakeTestError = fmt.Errorf("fake test error") 17 | 18 | // failingFs is a wrapper of afero.Fs to simulate a specific file creation failure for printer 19 | type failingFs struct { 20 | afero.Fs 21 | failOn string 22 | } 23 | 24 | func (s *failingFs) Create(name string) (afero.File, error) { 25 | if name == s.failOn { 26 | return nil, errFakeTestError 27 | } 28 | return s.Fs.Create(name) 29 | } 30 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/diagnostics/writers.go: -------------------------------------------------------------------------------- 1 | package diagnostics 2 | 3 | import ( 4 | "io" 5 | 6 | "k8s.io/apimachinery/pkg/runtime" 7 | "k8s.io/cli-runtime/pkg/printers" 8 | ) 9 | 10 | type objYamlWriter struct { 11 | obj runtime.Object 12 | } 13 | 14 | func (w objYamlWriter) write(file io.Writer) error { 15 | printer := printers.YAMLPrinter{} 16 | return printer.PrintObj(w.obj, file) 17 | } 18 | 19 | type byteWriter struct { 20 | b []byte 21 | } 22 | 23 | func (w byteWriter) write(file io.Writer) error { 24 | _, err := file.Write(w.b) 25 | return err 26 | } 27 | 28 | type gzipStreamWriter struct { 29 | stream io.ReadCloser 30 | } 31 | 32 | func (w gzipStreamWriter) write(file io.Writer) error { 33 | return newGzipWriter(file).write(w.stream) 34 | } 35 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/generate/maintainer.go: -------------------------------------------------------------------------------- 1 | package generate 2 | 3 | import ( 4 | "github.com/spf13/afero" 5 | 6 | kudoapi "github.com/kudobuilder/kudo/pkg/apis/kudo/v1beta1" 7 | "github.com/kudobuilder/kudo/pkg/kudoctl/packages/reader" 8 | ) 9 | 10 | // AddMaintainer adds a maintainer to the operator.yaml 11 | func AddMaintainer(fs afero.Fs, path string, m *kudoapi.Maintainer) error { 12 | 13 | pf, err := reader.PackageFilesFromDir(fs, path) 14 | if err != nil { 15 | return err 16 | } 17 | o := pf.Operator 18 | 19 | o.Maintainers = append(o.Maintainers, m) 20 | 21 | return writeOperator(fs, path, o) 22 | } 23 | 24 | // MaintainerList provides a list of operator maintainers 25 | func MaintainerList(fs afero.Fs, path string) ([]*kudoapi.Maintainer, error) { 26 | pf, err := reader.PackageFilesFromDir(fs, path) 27 | if err != nil { 28 | return nil, err 29 | } 30 | 31 | return pf.Operator.Maintainers, nil 32 | } 33 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/generate/parameter.go: -------------------------------------------------------------------------------- 1 | package generate 2 | 3 | import ( 4 | "github.com/spf13/afero" 5 | 6 | "github.com/kudobuilder/kudo/pkg/kudoctl/packages" 7 | "github.com/kudobuilder/kudo/pkg/kudoctl/packages/reader" 8 | ) 9 | 10 | // AddParameter writes a parameter to the params.yaml file 11 | func AddParameter(fs afero.Fs, path string, p *packages.Parameter) error { 12 | 13 | pf, err := reader.PackageFilesFromDir(fs, path) 14 | if err != nil { 15 | return err 16 | } 17 | 18 | params := pf.Params 19 | params.Parameters = append(params.Parameters, *p) 20 | 21 | return writeParameters(fs, path, *params) 22 | } 23 | 24 | func ParameterNameList(fs afero.Fs, path string) (paramNames []string, err error) { 25 | pf, err := reader.PackageFilesFromDir(fs, path) 26 | if err != nil { 27 | return nil, err 28 | } 29 | 30 | for _, parameter := range pf.Params.Parameters { 31 | paramNames = append(paramNames, parameter.Name) 32 | } 33 | 34 | return paramNames, nil 35 | } 36 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/generate/testdata/parameter.golden: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - default: 1Gi 4 | description: Amount of memory to provide to Zookeeper pods 5 | immutable: false 6 | name: memory 7 | required: true 8 | - default: "0.25" 9 | description: Amount of cpu to provide to Zookeeper pods 10 | immutable: false 11 | name: cpus 12 | required: true 13 | - default: Bar 14 | name: Foo 15 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/get/testdata/get-all.txt.golden: -------------------------------------------------------------------------------- 1 | List of current installed operators including versions and instances in namespace "default": 2 | . 3 | └── some-operator 4 | └── some-operator-0.1.0 5 | └── test 6 | 7 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/get/testdata/get-all.yaml.golden: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: kudo.dev/v1beta1 3 | kind: Operator 4 | metadata: 5 | creationTimestamp: null 6 | name: some-operator 7 | namespace: default 8 | spec: 9 | description: A fancy Operator 10 | kudoVersion: 0.16.0 11 | status: {} 12 | 13 | --- 14 | apiVersion: kudo.dev/v1beta1 15 | kind: OperatorVersion 16 | metadata: 17 | creationTimestamp: null 18 | name: some-operator-0.1.0 19 | namespace: default 20 | spec: 21 | operator: 22 | apiVersion: kudo.dev/v1beta1 23 | kind: Operator 24 | name: some-operator 25 | version: 0.1.0 26 | status: {} 27 | 28 | --- 29 | apiVersion: kudo.dev/v1beta1 30 | kind: Instance 31 | metadata: 32 | creationTimestamp: null 33 | labels: 34 | operator: test 35 | name: test 36 | namespace: default 37 | spec: 38 | operatorVersion: 39 | name: some-operator-0.1.0 40 | planExecution: {} 41 | status: {} 42 | 43 | ... 44 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/get/testdata/get-instances.json.golden: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "kind": "Instance", 4 | "apiVersion": "kudo.dev/v1beta1", 5 | "metadata": { 6 | "name": "test", 7 | "namespace": "default", 8 | "creationTimestamp": null, 9 | "labels": { 10 | "operator": "test" 11 | } 12 | }, 13 | "spec": { 14 | "operatorVersion": { 15 | "name": "some-operator-0.1.0" 16 | }, 17 | "planExecution": {} 18 | }, 19 | "status": {} 20 | } 21 | ] 22 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/get/testdata/get-instances.txt.golden: -------------------------------------------------------------------------------- 1 | List of current installed instances in namespace "default": 2 | . 3 | └── test 4 | 5 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/get/testdata/get-instances.yaml.golden: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: kudo.dev/v1beta1 3 | kind: Instance 4 | metadata: 5 | creationTimestamp: null 6 | labels: 7 | operator: test 8 | name: test 9 | namespace: default 10 | spec: 11 | operatorVersion: 12 | name: some-operator-0.1.0 13 | planExecution: {} 14 | status: {} 15 | 16 | ... 17 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/get/testdata/get-operators.json.golden: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "kind": "Operator", 4 | "apiVersion": "kudo.dev/v1beta1", 5 | "metadata": { 6 | "name": "some-operator", 7 | "namespace": "default", 8 | "creationTimestamp": null 9 | }, 10 | "spec": { 11 | "description": "A fancy Operator", 12 | "kudoVersion": "0.16.0" 13 | }, 14 | "status": {} 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/get/testdata/get-operators.txt.golden: -------------------------------------------------------------------------------- 1 | List of current installed operators in namespace "default": 2 | . 3 | └── some-operator 4 | 5 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/get/testdata/get-operators.yaml.golden: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: kudo.dev/v1beta1 3 | kind: Operator 4 | metadata: 5 | creationTimestamp: null 6 | name: some-operator 7 | namespace: default 8 | spec: 9 | description: A fancy Operator 10 | kudoVersion: 0.16.0 11 | status: {} 12 | 13 | ... 14 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/get/testdata/get-operatorversions.json.golden: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "kind": "OperatorVersion", 4 | "apiVersion": "kudo.dev/v1beta1", 5 | "metadata": { 6 | "name": "some-operator-0.1.0", 7 | "namespace": "default", 8 | "creationTimestamp": null 9 | }, 10 | "spec": { 11 | "operator": { 12 | "kind": "Operator", 13 | "name": "some-operator", 14 | "apiVersion": "kudo.dev/v1beta1" 15 | }, 16 | "version": "0.1.0" 17 | }, 18 | "status": {} 19 | } 20 | ] 21 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/get/testdata/get-operatorversions.txt.golden: -------------------------------------------------------------------------------- 1 | List of current installed operatorversions in namespace "default": 2 | . 3 | └── some-operator-0.1.0 4 | 5 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/get/testdata/get-operatorversions.yaml.golden: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: kudo.dev/v1beta1 3 | kind: OperatorVersion 4 | metadata: 5 | creationTimestamp: null 6 | name: some-operator-0.1.0 7 | namespace: default 8 | spec: 9 | operator: 10 | apiVersion: kudo.dev/v1beta1 11 | kind: Operator 12 | name: some-operator 13 | version: 0.1.0 14 | status: {} 15 | 16 | ... 17 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/install/install_test.go: -------------------------------------------------------------------------------- 1 | package install 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/stretchr/testify/assert" 7 | ) 8 | 9 | func TestValidate(t *testing.T) { 10 | 11 | tests := []struct { 12 | args []string 13 | opts *Options 14 | err string 15 | }{ 16 | {args: nil, opts: &Options{}, err: "expecting exactly one argument - name of the package or path to install"}, 17 | {args: []string{"arg", "arg2"}, opts: &Options{}, err: "expecting exactly one argument - name of the package or path to install"}, 18 | {args: []string{}, opts: &Options{}, err: "expecting exactly one argument - name of the package or path to install"}, 19 | {args: []string{"arg"}, opts: &Options{ 20 | SkipInstance: true, 21 | InCluster: true, 22 | }, err: "you can't use skip-instance or repo option when installing from in-cluster operators"}, 23 | } 24 | 25 | for _, tt := range tests { 26 | err := validate(tt.args, tt.opts) 27 | if tt.err != "" { 28 | assert.EqualError(t, err, tt.err) 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/package_list_params_test.go: -------------------------------------------------------------------------------- 1 | package cmd 2 | 3 | import ( 4 | "bytes" 5 | "io/ioutil" 6 | "path/filepath" 7 | "testing" 8 | 9 | "github.com/stretchr/testify/assert" 10 | ) 11 | 12 | func TestParamsList(t *testing.T) { 13 | file := "params-list" 14 | out := &bytes.Buffer{} 15 | cmd := newPackageListParamsCmd(fs, out) 16 | if err := cmd.RunE(cmd, []string{"../packages/testdata/zk.tgz"}); err != nil { 17 | t.Fatal(err) 18 | } 19 | 20 | gp := filepath.Join("testdata", file+".golden") 21 | 22 | if *updateGolden { 23 | t.Log("update golden file") 24 | 25 | //nolint:gosec 26 | if err := ioutil.WriteFile(gp, out.Bytes(), 0644); err != nil { 27 | t.Fatalf("failed to update golden file: %s", err) 28 | } 29 | } 30 | g, err := ioutil.ReadFile(gp) 31 | if err != nil { 32 | t.Fatalf("failed reading .golden: %s", err) 33 | } 34 | 35 | assert.Equal(t, string(g), out.String(), "yaml does not match .golden file %s", gp) 36 | } 37 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/package_list_tasks_test.go: -------------------------------------------------------------------------------- 1 | package cmd 2 | 3 | import ( 4 | "bytes" 5 | "io/ioutil" 6 | "path/filepath" 7 | "testing" 8 | 9 | "github.com/stretchr/testify/assert" 10 | ) 11 | 12 | func TestPackageListTasks(t *testing.T) { 13 | file := "tasks-list" 14 | out := &bytes.Buffer{} 15 | cmd := newPackageListTasksCmd(fs, out) 16 | if err := cmd.RunE(cmd, []string{"../packages/testdata/zk.tgz"}); err != nil { 17 | t.Fatal(err) 18 | } 19 | 20 | gp := filepath.Join("testdata", file+".golden") 21 | 22 | if *updateGolden { 23 | t.Log("update golden file") 24 | 25 | //nolint:gosec 26 | if err := ioutil.WriteFile(gp, out.Bytes(), 0644); err != nil { 27 | t.Fatalf("failed to update golden file: %s", err) 28 | } 29 | } 30 | g, err := ioutil.ReadFile(gp) 31 | if err != nil { 32 | t.Fatalf("failed reading .golden: %s", err) 33 | } 34 | 35 | assert.Equal(t, out.String(), string(g), "does not match .golden file %s", gp) 36 | } 37 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/plan/testdata/planstatus.json.golden: -------------------------------------------------------------------------------- 1 | { 2 | "planStatus": { 3 | "deploy": { 4 | "name": "deploy", 5 | "status": "FATAL_ERROR", 6 | "lastUpdatedTimestamp": "2019-10-17T01:01:01Z", 7 | "phases": [ 8 | { 9 | "name": "deploy", 10 | "status": "FATAL_ERROR", 11 | "steps": [ 12 | { 13 | "name": "deploy", 14 | "message": "error detail", 15 | "status": "FATAL_ERROR" 16 | } 17 | ] 18 | } 19 | ] 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/plan/testdata/planstatus.txt.golden: -------------------------------------------------------------------------------- 1 | Plan(s) for "test" in namespace "default": 2 | . 3 | └── test (Operator-Version: "test-1.0" Active-Plan: "deploy") 4 | ├── Plan deploy ( strategy) [FATAL_ERROR], last updated 2019-10-17 01:01:01 5 | │   └── Phase deploy ( strategy) [FATAL_ERROR] 6 | │   └── Step deploy [FATAL_ERROR] (error detail) 7 | ├── Plan validate ( strategy) [NOT ACTIVE] 8 | │   └── Phase validate ( strategy) [NOT ACTIVE] 9 | │   └── Step validate [NOT ACTIVE] 10 | └── Plan zzzinvalid ( strategy) [NOT ACTIVE] 11 | └── Phase zzzinvalid ( strategy) [NOT ACTIVE] 12 | └── Step zzzinvalid [NOT ACTIVE] 13 | 14 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/plan/testdata/planstatus.yaml.golden: -------------------------------------------------------------------------------- 1 | planStatus: 2 | deploy: 3 | lastUpdatedTimestamp: "2019-10-17T01:01:01Z" 4 | name: deploy 5 | phases: 6 | - name: deploy 7 | status: FATAL_ERROR 8 | steps: 9 | - message: error detail 10 | name: deploy 11 | status: FATAL_ERROR 12 | status: FATAL_ERROR 13 | 14 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/root_test.go: -------------------------------------------------------------------------------- 1 | package cmd 2 | 3 | import ( 4 | "reflect" 5 | "testing" 6 | ) 7 | 8 | func TestNormalizationFuncGlobalExistence(t *testing.T) { 9 | root := NewKudoctlCmd() 10 | 11 | if root.Parent() != nil { 12 | t.Fatal("We expect the root command to be returned") 13 | } 14 | 15 | sub := root 16 | for sub.HasSubCommands() { 17 | sub = sub.Commands()[0] 18 | } 19 | 20 | // In case of failure of this test check this PR: spf13/cobra#110 21 | if reflect.ValueOf(sub.Flags().GetNormalizeFunc()).Pointer() != reflect.ValueOf(root.Flags().GetNormalizeFunc()).Pointer() { 22 | t.Fatal("child and root commands should have the same normalization functions") 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/index.yaml.golden: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | entries: 3 | zookeeper: 4 | - appVersion: 3.4.10 5 | digest: 3b25556108002d8e922bb381c936827d4e34586a57453c286b2d9ed39cb129aa 6 | maintainers: 7 | - email: avarkockova@mesosphere.com 8 | name: Alena Varkockova 9 | - email: runyontr@gmail.com 10 | name: Tom Runyon 11 | - email: kensipe@gmail.com 12 | name: Ken Sipe 13 | name: zookeeper 14 | operatorVersion: 0.1.0 15 | urls: 16 | - http://localhost/zookeeper-3.4.10_0.1.0.tgz 17 | generated: "2019-10-25T00:00:00Z" 18 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/invalid-params.golden: -------------------------------------------------------------------------------- 1 | Warnings 2 | parameter "Cpus" defined but not used. 3 | Errors 4 | parameter "Cpus" has a duplicate 5 | parameter "comma," contains invalid character ',' 6 | "operatorVersion" is required and must be semver 7 | plan "not-existing-plan" used in parameter "comma," is not defined 8 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/invalid-params.json.golden: -------------------------------------------------------------------------------- 1 | { 2 | "errors": [ 3 | "parameter \"Cpus\" has a duplicate", 4 | "parameter \"comma,\" contains invalid character ','", 5 | "\"operatorVersion\" is required and must be semver", 6 | "plan \"not-existing-plan\" used in parameter \"comma,\" is not defined" 7 | ], 8 | "warnings": [ 9 | "parameter \"Cpus\" defined but not used." 10 | ], 11 | "valid": false 12 | } 13 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/invalid-params.txt.golden: -------------------------------------------------------------------------------- 1 | Warnings 2 | parameter "Cpus" defined but not used. 3 | Errors 4 | parameter "Cpus" has a duplicate 5 | parameter "comma," contains invalid character ',' 6 | "operatorVersion" is required and must be semver 7 | plan "not-existing-plan" used in parameter "comma," is not defined 8 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/invalid-params.yaml.golden: -------------------------------------------------------------------------------- 1 | errors: 2 | - parameter "Cpus" has a duplicate 3 | - parameter "comma," contains invalid character ',' 4 | - '"operatorVersion" is required and must be semver' 5 | - plan "not-existing-plan" used in parameter "comma," is not defined 6 | valid: false 7 | warnings: 8 | - parameter "Cpus" defined but not used. 9 | 10 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/invalidzk/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: memory 4 | description: Amount of memory to provide to Zookeeper pods 5 | default: "1Gi" 6 | - name: cpus 7 | description: Amount of cpu to provide to Zookeeper pods 8 | default: "0.25" 9 | - name: Cpus 10 | description: Amount of cpu to provide to Zookeeper pods 11 | default: "0.25" 12 | - name: comma, 13 | description: Amount of cpu to provide to Zookeeper pods 14 | default: "0.25" 15 | trigger: not-existing-plan 16 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/invalidzk/templates/pdb.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: policy/v1beta1 2 | kind: PodDisruptionBudget 3 | metadata: 4 | name: {{ .Name }}-pdb 5 | namespace: {{ .Namespace }} 6 | labels: 7 | app: zookeeper 8 | zookeeper: {{ .Name }} 9 | spec: 10 | selector: 11 | matchLabels: 12 | app: zookeeper 13 | zookeeper: {{ .Name }} 14 | maxUnavailable: 1 15 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/invalidzk/templates/services.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: hs 5 | namespace: {{ .Namespace }} 6 | labels: 7 | app: zookeeper 8 | zookeeper: {{ .Name }} 9 | spec: 10 | ports: 11 | - port: 2888 12 | name: server 13 | - port: 3888 14 | name: leader-election 15 | clusterIP: None 16 | selector: 17 | app: zookeeper 18 | zookeeper: {{ .Name }} 19 | --- 20 | apiVersion: v1 21 | kind: Service 22 | metadata: 23 | name: cs 24 | namespace: {{ .Namespace }} 25 | labels: 26 | app: zookeeper 27 | zookeeper: {{ .Name }} 28 | spec: 29 | ports: 30 | - port: 2181 31 | name: client 32 | selector: 33 | app: zookeeper 34 | zookeeper: {{ .Name }} 35 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/invalidzk/templates/validation.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: batch/v1 2 | kind: Job 3 | metadata: 4 | name: zookeeper-validation 5 | spec: 6 | template: 7 | metadata: 8 | name: "validation" 9 | spec: 10 | restartPolicy: Never 11 | containers: 12 | - name: kubernetes-zookeeper 13 | imagePullPolicy: Always 14 | image: "k8s.gcr.io/kubernetes-zookeeper:1.0-3.4.10" 15 | env: 16 | - name: CONN 17 | value: zk-zk-0.zk-hs:2181,zk-zk-1.zk-hs:2181,zk-zk-2.zk-hs:2181 18 | resources: 19 | requests: 20 | memory: "{{ .Params.memory }}" 21 | cpu: "{{ .Params.cpus }}" 22 | command: 23 | - sh 24 | - -c 25 | - "/opt/zookeeper/bin/zkCLI.sh \ 26 | --server $CONN \ 27 | ls /" 28 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/newop/operator.yaml.golden: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | appVersion: 0.1.0 3 | kubernetesVersion: 0.16.0 4 | kudoVersion: not-built-on-release 5 | maintainers: 6 | - email: MyEmail@invalid 7 | name: My Name 8 | name: newop 9 | operatorVersion: 0.1.0 10 | plans: 11 | deploy: 12 | phases: 13 | - name: deploy 14 | steps: 15 | - name: deploy 16 | tasks: 17 | - deploy 18 | strategy: serial 19 | strategy: serial 20 | tasks: 21 | - kind: Apply 22 | name: deploy 23 | spec: {} 24 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/newop/params.yaml.golden: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: [] 3 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/params-list.golden: -------------------------------------------------------------------------------- 1 | Name Default Required Immutable 2 | cpus 0.25 true false 3 | memory 1Gi true false 4 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/plans-list.golden: -------------------------------------------------------------------------------- 1 | plans 2 | ├── deploy (serial) 3 | │   └── [phase] zookeeper (parallel) 4 | │   └── [step] everything 5 | │   ├── infra 6 | │   └── app 7 | └── validation (serial) 8 | └── [phase] connection (parallel) 9 | └── [step] connection 10 | └── validation 11 | 12 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/plans-with-tasks-list.golden: -------------------------------------------------------------------------------- 1 | plans 2 | ├── deploy (serial) 3 | │   └── [phase] zookeeper (parallel) 4 | │   └── [step] everything 5 | │   ├── [apply] infra 6 | │   │   ├── services.yaml 7 | │   │   └── pdb.yaml 8 | │   └── [apply] app 9 | │   ├── statefulset.yaml 10 | │   └── subfolder/statefulset2.yaml 11 | └── validation (serial) 12 | └── [phase] connection (parallel) 13 | └── [step] connection 14 | └── [apply] validation 15 | └── validation.yaml 16 | 17 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/repo-list.golden: -------------------------------------------------------------------------------- 1 | NAME URL 2 | *community https://kudo-repository.storage.googleapis.com/v1 3 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/search1.golden: -------------------------------------------------------------------------------- 1 | Name Operator Version App Version 2 | mysql 0.2.0 5.8 3 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/search2.golden: -------------------------------------------------------------------------------- 1 | Name Operator Version App Version 2 | mysql 0.2.0 5.8 3 | redis 0.1.0 5.0.1 4 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/search3.golden: -------------------------------------------------------------------------------- 1 | Name Operator Version App Version 2 | mysql 0.2.0 5.8 3 | 0.1.0 5.7 4 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/skip-check-add-list.golden: -------------------------------------------------------------------------------- 1 | NAME URL 2 | *community https://kudo-repository.storage.googleapis.com/v1 3 | foo badurl 4 | -------------------------------------------------------------------------------- /pkg/kudoctl/cmd/testdata/tasks-list.golden: -------------------------------------------------------------------------------- 1 | Name Kind Resources 2 | infra Apply [services.yaml pdb.yaml] 3 | app Apply [statefulset.yaml subfolder/statefulset2.yaml] 4 | validation Apply [validation.yaml] 5 | -------------------------------------------------------------------------------- /pkg/kudoctl/http/http_client_test.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | import ( 4 | "testing" 5 | ) 6 | 7 | func TestIsValidURL(t *testing.T) { 8 | 9 | tests := []struct { 10 | name string 11 | uri string 12 | want bool 13 | }{ 14 | {name: "string", uri: "foo", want: false}, 15 | {name: "http", uri: "http://kudo.dev", want: true}, 16 | {name: "https", uri: "https://kudo.dev", want: true}, 17 | {name: "no http prefix", uri: "kudo.dev", want: false}, 18 | } 19 | for _, tt := range tests { 20 | tt := tt 21 | 22 | t.Run(tt.name, func(t *testing.T) { 23 | if got := IsValidURL(tt.uri); got != tt.want { 24 | t.Errorf("IsValidURL() = %v, want %v", got, tt.want) 25 | } 26 | }) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /pkg/kudoctl/kudohome/home.go: -------------------------------------------------------------------------------- 1 | package kudohome 2 | 3 | import ( 4 | "os" 5 | "path/filepath" 6 | ) 7 | 8 | // Home describes the location of a CLI configuration. 9 | type Home string 10 | 11 | // String returns Home as a string with expansions $HOME == home 12 | func (h Home) String() string { 13 | return os.ExpandEnv(string(h)) 14 | } 15 | 16 | // Path returns Home with elements appended. 17 | func (h Home) path(elem ...string) string { 18 | p := []string{h.String()} 19 | p = append(p, elem...) 20 | return filepath.Join(p...) 21 | } 22 | 23 | // Repository returns the path to the local repository. 24 | func (h Home) Repository() string { 25 | return h.path("repository") 26 | } 27 | 28 | // RepositoryFile returns the path to the repositories.yaml file. 29 | func (h Home) RepositoryFile() string { 30 | return h.path("repository", "repositories.yaml") 31 | } 32 | -------------------------------------------------------------------------------- /pkg/kudoctl/kudohome/home_test.go: -------------------------------------------------------------------------------- 1 | package kudohome 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/stretchr/testify/assert" 7 | ) 8 | 9 | func TestKudoHome(t *testing.T) { 10 | h := Home("/a") 11 | 12 | assert.Equal(t, "/a", h.String()) 13 | assert.Equal(t, "/a/repository/repositories.yaml", h.RepositoryFile()) 14 | } 15 | -------------------------------------------------------------------------------- /pkg/kudoctl/kudoinit/crd/README.md: -------------------------------------------------------------------------------- 1 | # Embedded CRDs 2 | 3 | The CRDs provided by this package are embedded into the binary through the file `bindata.go`, 4 | generated by `go-bindata` invoked from the `make generate` target. -------------------------------------------------------------------------------- /pkg/kudoctl/kudoinit/migration/migration.go: -------------------------------------------------------------------------------- 1 | package migration 2 | 3 | // Migrater is the base interface for migrations. 4 | type Migrater interface { 5 | // CanMigrate checks if there are any conditions that would prevent this migration to run 6 | // This function should only return an error if it is sure that the migration can not be executed 7 | CanMigrate() error 8 | 9 | // Migrate executes the migration. The call must be idempotent and ignore already migrated resources 10 | // It can be called multiple times on the same cluster and encounter migrated and unmigrated resources. 11 | Migrate() error 12 | } 13 | -------------------------------------------------------------------------------- /pkg/kudoctl/kudoinit/prereq/prereqs_test.go: -------------------------------------------------------------------------------- 1 | package prereq 2 | 3 | import ( 4 | apiextensionfake "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake" 5 | "k8s.io/apimachinery/pkg/runtime" 6 | dynamicfake "k8s.io/client-go/dynamic/fake" 7 | "k8s.io/client-go/kubernetes/fake" 8 | 9 | "github.com/kudobuilder/kudo/pkg/kudoctl/kube" 10 | ) 11 | 12 | func getFakeClient() *kube.Client { 13 | client := fake.NewSimpleClientset() 14 | 15 | extClient := apiextensionfake.NewSimpleClientset() 16 | 17 | dynamicClient := dynamicfake.NewSimpleDynamicClient(runtime.NewScheme()) 18 | 19 | return &kube.Client{ 20 | KubeClient: client, 21 | ExtClient: extClient, 22 | DynamicClient: dynamicClient} 23 | } 24 | -------------------------------------------------------------------------------- /pkg/kudoctl/kudoinit/setup/wait.go: -------------------------------------------------------------------------------- 1 | package setup 2 | 3 | import ( 4 | "time" 5 | 6 | "github.com/kudobuilder/kudo/pkg/kudoctl/kube" 7 | 8 | "k8s.io/apimachinery/pkg/util/wait" 9 | 10 | "github.com/kudobuilder/kudo/pkg/kudoctl/kudoinit" 11 | ) 12 | 13 | // WatchKUDOUntilReady waits for the KUDO installation to become available. 14 | // 15 | // Returns no error if it exists. If the timeout was reached and it could not find the pod, it returns error. 16 | func WatchKUDOUntilReady(v kudoinit.InstallVerifier, client *kube.Client, timeout int64) error { 17 | return wait.PollImmediate(500*time.Millisecond, time.Duration(timeout)*time.Second, 18 | func() (bool, error) { 19 | return VerifyExistingInstallation(v, client, nil) 20 | }, 21 | ) 22 | } 23 | -------------------------------------------------------------------------------- /pkg/kudoctl/packages/install/doc.go: -------------------------------------------------------------------------------- 1 | // Package install provides function to install package resources 2 | // on a Kubernetes cluster. 3 | package install 4 | -------------------------------------------------------------------------------- /pkg/kudoctl/packages/install/testdata/namespace.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Namespace 3 | metadata: 4 | labels: 5 | ca.istio.io/override: "true" 6 | istio-injection: enabled 7 | katib-metricscollector-injection: enabled 8 | kudo.dev/instance-name: {{ .Name }} 9 | kudo.dev/app-version: {{ .AppVersion }} 10 | kudo.dev/param-foo: {{ .Params.foo }} 11 | -------------------------------------------------------------------------------- /pkg/kudoctl/packages/install/testdata/rendered-namespace.yaml.golden: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Namespace 3 | metadata: 4 | labels: 5 | ca.istio.io/override: "true" 6 | istio-injection: enabled 7 | katib-metricscollector-injection: enabled 8 | kudo.dev/instance-name: InstanceName 9 | kudo.dev/app-version: 1.0 10 | kudo.dev/param-foo: bar-param 11 | -------------------------------------------------------------------------------- /pkg/kudoctl/packages/resolver/resolver_local_test.go: -------------------------------------------------------------------------------- 1 | package resolver 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/spf13/afero" 8 | "github.com/stretchr/testify/assert" 9 | ) 10 | 11 | func TestLocalResolver_GetPackage(t *testing.T) { 12 | wd, _ := os.Getwd() 13 | f := newForFilesystem(afero.NewOsFs(), wd) 14 | pkg, err := f.ResolveDir("../testdata/zk") 15 | if err != nil { 16 | t.Errorf("PackageResolver.Resolve() error = %v", err) 17 | return 18 | } 19 | 20 | assert.EqualValues(t, "zookeeper", pkg.Operator.Name) 21 | } 22 | 23 | func TestLocalFinder_Failure(t *testing.T) { 24 | wd, _ := os.Getwd() 25 | f := newForFilesystem(afero.NewOsFs(), wd) 26 | _, err := f.ResolveDir("../testdata/zk-bad") 27 | assert.Errorf(t, err, "should have errored on bad folder name") 28 | } 29 | -------------------------------------------------------------------------------- /pkg/kudoctl/packages/resolver/resolver_test.go: -------------------------------------------------------------------------------- 1 | package resolver 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/spf13/afero" 8 | "github.com/stretchr/testify/assert" 9 | ) 10 | 11 | func TestManager_GetPackage(t *testing.T) { 12 | wd, _ := os.Getwd() 13 | 14 | m := &PackageResolver{ 15 | local: newForFilesystem(afero.NewOsFs(), wd), 16 | uri: nil, 17 | } 18 | pr, err := m.Resolve("../testdata/zk", "", "") 19 | if err != nil { 20 | t.Errorf("PackageResolver.Resolve() error = %v", err) 21 | return 22 | } 23 | 24 | assert.EqualValues(t, "zookeeper", pr.Resources.Operator.Name) 25 | } 26 | -------------------------------------------------------------------------------- /pkg/kudoctl/packages/testdata/zk-crd-golden1/instance.golden: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | labels: 5 | kudo.dev/operator: zookeeper 6 | name: zk1 7 | spec: 8 | operatorVersion: 9 | name: zookeeper-3.4.10-0.1.0 10 | type: OperatorVersions 11 | name: "zookeeper-0.1.0" 12 | -------------------------------------------------------------------------------- /pkg/kudoctl/packages/testdata/zk-crd-golden1/operator.golden: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Operator 3 | metadata: 4 | name: zookeeper 5 | spec: 6 | url: https://zookeeper.apache.org/ 7 | maintainers: 8 | - name: Alena Varkockova 9 | email: avarkockova@mesosphere.com 10 | - name: Tom Runyon 11 | email: runyontr@gmail.com 12 | - name: Ken Sipe 13 | email: kensipe@gmail.com 14 | kudoVersion: 0.2.0 15 | kubernetesVersion: 1.15.0 16 | -------------------------------------------------------------------------------- /pkg/kudoctl/packages/testdata/zk-crd-golden2/instance.golden: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | labels: 5 | kudo.dev/operator: zookeeper 6 | name: zk2 7 | spec: 8 | operatorVersion: 9 | name: zookeeper-3.4.10-0.1.0 10 | type: OperatorVersions 11 | name: "zookeeper-0.1.0" 12 | -------------------------------------------------------------------------------- /pkg/kudoctl/packages/testdata/zk-crd-golden2/operator.golden: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Operator 3 | metadata: 4 | name: zookeeper 5 | spec: 6 | url: https://zookeeper.apache.org/ 7 | maintainers: 8 | - name: Alena Varkockova 9 | email: avarkockova@mesosphere.com 10 | - name: Tom Runyon 11 | email: runyontr@gmail.com 12 | - name: Ken Sipe 13 | email: kensipe@gmail.com 14 | kudoVersion: 0.2.0 15 | kubernetesVersion: 1.15.0 16 | -------------------------------------------------------------------------------- /pkg/kudoctl/packages/testdata/zk.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kudobuilder/kudo/50ef72329f0e76ae57b33ae552605b7e39198336/pkg/kudoctl/packages/testdata/zk.tgz -------------------------------------------------------------------------------- /pkg/kudoctl/packages/testdata/zk/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: memory 4 | description: Amount of memory to provide to Zookeeper pods 5 | default: "1Gi" 6 | - name: cpus 7 | description: Amount of cpu to provide to Zookeeper pods 8 | default: "0.25" -------------------------------------------------------------------------------- /pkg/kudoctl/packages/testdata/zk/templates/pdb.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: policy/v1beta1 2 | kind: PodDisruptionBudget 3 | metadata: 4 | name: {{ .Name }}-pdb 5 | namespace: {{ .Namespace }} 6 | labels: 7 | app: zookeeper 8 | zookeeper: {{ .Name }} 9 | spec: 10 | selector: 11 | matchLabels: 12 | app: zookeeper 13 | zookeeper: {{ .Name }} 14 | maxUnavailable: 1 15 | -------------------------------------------------------------------------------- /pkg/kudoctl/packages/testdata/zk/templates/services.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: hs 5 | namespace: {{ .Namespace }} 6 | labels: 7 | app: zookeeper 8 | zookeeper: {{ .Name }} 9 | spec: 10 | ports: 11 | - port: 2888 12 | name: server 13 | - port: 3888 14 | name: leader-election 15 | clusterIP: None 16 | selector: 17 | app: zookeeper 18 | zookeeper: {{ .Name }} 19 | --- 20 | apiVersion: v1 21 | kind: Service 22 | metadata: 23 | name: cs 24 | namespace: {{ .Namespace }} 25 | labels: 26 | app: zookeeper 27 | zookeeper: {{ .Name }} 28 | spec: 29 | ports: 30 | - port: 2181 31 | name: client 32 | selector: 33 | app: zookeeper 34 | zookeeper: {{ .Name }} 35 | -------------------------------------------------------------------------------- /pkg/kudoctl/packages/testdata/zk/templates/validation.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: batch/v1 2 | kind: Job 3 | metadata: 4 | name: zookeeper-validation 5 | spec: 6 | template: 7 | metadata: 8 | name: "validation" 9 | spec: 10 | restartPolicy: Never 11 | containers: 12 | - name: kubernetes-zookeeper 13 | imagePullPolicy: Always 14 | image: "k8s.gcr.io/kubernetes-zookeeper:1.0-3.4.10" 15 | env: 16 | - name: CONN 17 | value: zk-zk-0.zk-hs:2181,zk-zk-1.zk-hs:2181,zk-zk-2.zk-hs:2181 18 | resources: 19 | requests: 20 | memory: "{{ .Params.memory }}" 21 | cpu: "{{ .Params.cpus }}" 22 | command: 23 | - sh 24 | - -c 25 | - "/opt/zookeeper/bin/zkCLI.sh \ 26 | --server $CONN \ 27 | ls /" 28 | -------------------------------------------------------------------------------- /pkg/kudoctl/packages/verifier.go: -------------------------------------------------------------------------------- 1 | package packages 2 | 3 | import "github.com/kudobuilder/kudo/pkg/kudoctl/verifier" 4 | 5 | // Verifier defines the interface for all parameter verifiers 6 | type Verifier interface { 7 | Verify(pf *Files) verifier.Result 8 | } 9 | -------------------------------------------------------------------------------- /pkg/kudoctl/resources/dependencies/doc.go: -------------------------------------------------------------------------------- 1 | // Package dependencies provides functions to resolve operator dependencies of 2 | // operator packages. 3 | package dependencies 4 | -------------------------------------------------------------------------------- /pkg/kudoctl/resources/dependencies/testdata/operator-with-dependencies.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kudobuilder/kudo/50ef72329f0e76ae57b33ae552605b7e39198336/pkg/kudoctl/resources/dependencies/testdata/operator-with-dependencies.tgz -------------------------------------------------------------------------------- /pkg/kudoctl/resources/dependencies/testdata/operator-with-dependencies/child-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "child" 3 | operatorVersion: "0.0.1" 4 | appVersion: "3.2.1" 5 | kubernetesVersion: 1.15.0 6 | maintainers: 7 | - name: zen-dog 8 | email: 9 | url: https://kudo.dev 10 | tasks: 11 | - name: deploy 12 | kind: Dummy 13 | spec: 14 | done: true 15 | wantErr: false 16 | 17 | plans: 18 | deploy: 19 | strategy: serial 20 | phases: 21 | - name: main 22 | strategy: parallel 23 | steps: 24 | - name: deploy 25 | tasks: 26 | - deploy 27 | -------------------------------------------------------------------------------- /pkg/kudoctl/resources/dependencies/testdata/operator-with-dependencies/child-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: deploy 4 | description: Triggers the deploy plan 5 | default: 1 6 | trigger: deploy -------------------------------------------------------------------------------- /pkg/kudoctl/resources/dependencies/testdata/operator-with-dependencies/parent-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "parent" 3 | operatorVersion: "0.1.0" 4 | kubernetesVersion: 1.15.0 5 | maintainers: 6 | - name: zen-dog 7 | email: 8 | url: https://kudo.dev 9 | tasks: 10 | - name: deploy-child 11 | kind: KudoOperator 12 | spec: 13 | package: "../child-operator" 14 | 15 | plans: 16 | deploy: 17 | strategy: serial 18 | phases: 19 | - name: main 20 | strategy: parallel 21 | steps: 22 | - name: deploy 23 | tasks: 24 | - deploy-child -------------------------------------------------------------------------------- /pkg/kudoctl/resources/dependencies/testdata/operator-with-dependencies/parent-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: deploy 4 | description: Triggers the deploy plan 5 | default: 1 6 | trigger: deploy -------------------------------------------------------------------------------- /pkg/kudoctl/util/repo/testdata/flink-index.yaml.golden: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | entries: 3 | flink: 4 | - appVersion: 0.7.0 5 | description: fancy description is here 6 | digest: 0787a078e64c73064287751b833d63ca3d1d284b4f494ebf670443683d5b96dd 7 | maintainers: 8 | - email: 9 | name: Fabian Baier 10 | - email: 11 | name: Tom Runyon 12 | - email: 13 | name: Ken Sipe 14 | name: flink 15 | operatorVersion: 0.3.0 16 | urls: 17 | - http://kudo.dev/flink 18 | generated: "2019-08-09T15:04:00Z" 19 | -------------------------------------------------------------------------------- /pkg/kudoctl/util/repo/testdata/repositories.yaml.golden: -------------------------------------------------------------------------------- 1 | context: community 2 | repoVersion: v1 3 | repositories: 4 | - name: community 5 | url: https://kudo-repository.storage.googleapis.com/v1 6 | -------------------------------------------------------------------------------- /pkg/kudoctl/util/repo/testdata/zk.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kudobuilder/kudo/50ef72329f0e76ae57b33ae552605b7e39198336/pkg/kudoctl/util/repo/testdata/zk.tar.gz -------------------------------------------------------------------------------- /test/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM kudobuilder/golang:1.15 2 | 3 | WORKDIR $GOPATH/src/github.com/kudobuilder/kudo 4 | 5 | # install docker 6 | RUN apt-get update && apt-get install -y \ 7 | apt-transport-https \ 8 | ca-certificates \ 9 | curl \ 10 | gnupg2 \ 11 | software-properties-common && curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - && \ 12 | add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" && \ 13 | apt-get update && apt-get install -y docker-ce-cli 14 | 15 | COPY Dockerfile Makefile go.mod go.sum ./ 16 | RUN make download 17 | COPY config/ config/ 18 | COPY pkg/ pkg/ 19 | COPY cmd/ cmd/ 20 | COPY hack/run-integration-tests.sh hack/run-integration-tests.sh 21 | COPY hack/run-kuttl-tests.sh hack/run-kuttl-tests.sh 22 | COPY hack/run-e2e-tests.sh hack/run-e2e-tests.sh 23 | COPY hack/run-operator-tests.sh hack/run-operator-tests.sh 24 | COPY hack/run-upgrade-tests.sh hack/run-upgrade-tests.sh 25 | COPY test/ test/ -------------------------------------------------------------------------------- /test/e2e/apply-delete-apply/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: configmap-instance 5 | spec: 6 | operatorVersion: 7 | name: configmap-operator-1.7.9-0.1.0 8 | status: 9 | planStatus: 10 | deploy: 11 | status: COMPLETE 12 | --- 13 | apiVersion: v1 14 | kind: ConfigMap 15 | metadata: 16 | name: test-configmap 17 | data: 18 | foo: bar -------------------------------------------------------------------------------- /test/e2e/apply-delete-apply/00-install.yaml: -------------------------------------------------------------------------------- 1 | # this is a test covering regression described in #1596 2 | # there was a race in apply-delete-apply where cache was not invalidated between delete and second apply 3 | # as a result configmap did not exist at the end of plan 4 | apiVersion: kuttl.dev/v1beta1 5 | kind: TestStep 6 | commands: 7 | - command: kubectl kudo install --instance configmap-instance ./operator 8 | namespaced: true 9 | -------------------------------------------------------------------------------- /test/e2e/apply-delete-apply/operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "configmap-operator" 3 | operatorVersion: "0.1.0" 4 | appVersion: "1.7.9" 5 | kubernetesVersion: 1.13.0 6 | maintainers: 7 | - name: Your name 8 | email: 9 | url: https://kudo.dev 10 | tasks: 11 | - name: apply 12 | kind: Apply 13 | spec: 14 | resources: 15 | - configmap.yaml 16 | - name: delete 17 | kind: Delete 18 | spec: 19 | resources: 20 | - configmap.yaml 21 | plans: 22 | deploy: 23 | strategy: serial 24 | phases: 25 | - name: main 26 | strategy: serial 27 | steps: 28 | - name: apply 29 | tasks: 30 | - apply 31 | - name: delete 32 | strategy: serial 33 | steps: 34 | - name: delete 35 | tasks: 36 | - delete 37 | - name: apply 38 | strategy: serial 39 | steps: 40 | - name: apply 41 | tasks: 42 | - apply 43 | -------------------------------------------------------------------------------- /test/e2e/apply-delete-apply/operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: replicas 4 | description: Number of replicas that should be run as part of the deployment 5 | default: 2 6 | -------------------------------------------------------------------------------- /test/e2e/apply-delete-apply/operator/templates/configmap.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: test-configmap 5 | data: 6 | foo: bar -------------------------------------------------------------------------------- /test/e2e/cli-install-uninstall/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: first-operator 5 | status: 6 | planStatus: 7 | deploy: 8 | status: COMPLETE 9 | --- 10 | apiVersion: apps/v1 11 | kind: Deployment 12 | metadata: 13 | name: nginx-deployment -------------------------------------------------------------------------------- /test/e2e/cli-install-uninstall/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance first-operator ./first-operator 5 | namespaced: true -------------------------------------------------------------------------------- /test/e2e/cli-install-uninstall/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Event 3 | message: 'Execution of plan cleanup finished with status COMPLETE' 4 | -------------------------------------------------------------------------------- /test/e2e/cli-install-uninstall/01-errors.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: first-operator 5 | --- 6 | apiVersion: apps/v1 7 | kind: Deployment 8 | metadata: 9 | name: nginx-deployment 10 | --- 11 | apiVersion: apps/v1 12 | kind: Deployment 13 | metadata: 14 | name: cleanup-deployment 15 | -------------------------------------------------------------------------------- /test/e2e/cli-install-uninstall/01-uninstall.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo uninstall --instance first-operator 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/e2e/cli-install-uninstall/first-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "first-operator" 3 | operatorVersion: "0.1.0" 4 | kubernetesVersion: 1.13.0 5 | maintainers: 6 | - name: Your name 7 | email: 8 | url: https://kudo.dev 9 | tasks: 10 | - name: app 11 | kind: Apply 12 | spec: 13 | resources: 14 | - deployment.yaml 15 | - name: cleanup 16 | kind: Apply 17 | spec: 18 | resources: 19 | - cleanup.yaml 20 | plans: 21 | deploy: 22 | strategy: serial 23 | phases: 24 | - name: main 25 | strategy: parallel 26 | steps: 27 | - name: everything 28 | tasks: 29 | - app 30 | cleanup: 31 | strategy: serial 32 | phases: 33 | - name: main 34 | strategy: parallel 35 | steps: 36 | - name: everything 37 | tasks: 38 | - cleanup 39 | -------------------------------------------------------------------------------- /test/e2e/cli-install-uninstall/first-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: replicas 4 | description: Number of replicas that should be run as part of the deployment 5 | default: 2 6 | - name: ports 7 | description: Ports to use for as part of the deployment 8 | default: 9 | - 80 10 | - 443 11 | type: array 12 | -------------------------------------------------------------------------------- /test/e2e/cli-install-uninstall/first-operator/templates/cleanup.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: cleanup-deployment 5 | spec: 6 | selector: 7 | matchLabels: 8 | app: nginx 9 | replicas: 1 10 | template: 11 | metadata: 12 | labels: 13 | app: nginx 14 | spec: 15 | containers: 16 | - name: nginx 17 | image: nginx:1.7.9 18 | ports: 19 | - containerPort: 80 20 | -------------------------------------------------------------------------------- /test/e2e/cli-install-uninstall/first-operator/templates/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | selector: 7 | matchLabels: 8 | app: nginx 9 | replicas: {{ .Params.replicas }} # tells deployment to run 2 pods matching the template 10 | template: 11 | metadata: 12 | labels: 13 | app: nginx 14 | spec: 15 | containers: 16 | - name: nginx 17 | image: nginx:1.7.9 18 | ports: 19 | {{ range .Params.ports }} 20 | - containerPort: {{ . }} 21 | {{ end }} 22 | -------------------------------------------------------------------------------- /test/e2e/dependencies-hash/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | replicas: 2 7 | template: 8 | metadata: 9 | annotations: 10 | kudo.dev/dependencies-hash: 6fa812afe527bdb6c9a5fbfcba8193bb 11 | kudo.dev/operator-version: 0.1.0 12 | spec: 13 | containers: 14 | - name: nginx 15 | image: nginx:1.7.9 16 | ports: 17 | - containerPort: 80 18 | --- 19 | apiVersion: kudo.dev/v1beta1 20 | kind: Instance 21 | status: 22 | planStatus: 23 | deploy: 24 | status: COMPLETE -------------------------------------------------------------------------------- /test/e2e/dependencies-hash/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance depop ./dep-operator 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/e2e/dependencies-hash/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | replicas: 3 7 | template: 8 | metadata: 9 | annotations: 10 | # This update to the deployment must have the same hash as 00-assert.yaml 11 | kudo.dev/dependencies-hash: 6fa812afe527bdb6c9a5fbfcba8193bb 12 | kudo.dev/operator-version: 0.1.0 13 | spec: 14 | containers: 15 | - name: nginx 16 | image: nginx:1.7.9 17 | ports: 18 | - containerPort: 80 19 | --- 20 | apiVersion: kudo.dev/v1beta1 21 | kind: Instance 22 | status: 23 | planStatus: 24 | update-replica: 25 | status: COMPLETE -------------------------------------------------------------------------------- /test/e2e/dependencies-hash/01-update-replicas.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: # Change a parameter that does *not* modify the config map dependency 4 | - command: kubectl kudo update --instance depop -p REPLICAS=3 5 | namespaced: true -------------------------------------------------------------------------------- /test/e2e/dependencies-hash/02-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: configdata 5 | data: 6 | valueA: ChangedValue 7 | --- 8 | apiVersion: kudo.dev/v1beta1 9 | kind: Instance 10 | status: 11 | planStatus: 12 | update-param: 13 | status: COMPLETE -------------------------------------------------------------------------------- /test/e2e/dependencies-hash/02-update-param.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: # Update a parameter that modifies the config map dependency but does not deploy the parent 4 | - command: kubectl kudo update --instance depop -p CONFIG_MAP_VALUE=ChangedValue 5 | namespaced: true -------------------------------------------------------------------------------- /test/e2e/dependencies-hash/03-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | replicas: 2 7 | template: 8 | metadata: 9 | annotations: 10 | # After the second update to replicas the hash should change, based on the last deployed version of the config map 11 | kudo.dev/dependencies-hash: da9f56a62d3c4af2596bebace008d845 12 | kudo.dev/operator-version: 0.1.0 13 | spec: 14 | containers: 15 | - name: nginx 16 | image: nginx:1.7.9 17 | ports: 18 | - containerPort: 80 19 | --- 20 | apiVersion: kudo.dev/v1beta1 21 | kind: Instance 22 | status: 23 | # We need to check for IN_PROGRESS here and for COMPLETE in the next step, as update-replica ran before and is still set to COMPLETE from the last run 24 | planStatus: 25 | update-replica: 26 | status: IN_PROGRESS -------------------------------------------------------------------------------- /test/e2e/dependencies-hash/03-update-replicas-again.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo update --instance depop -p REPLICAS=2 5 | namespaced: true -------------------------------------------------------------------------------- /test/e2e/dependencies-hash/04-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | status: 4 | planStatus: 5 | update-replica: 6 | status: COMPLETE -------------------------------------------------------------------------------- /test/e2e/dependencies-hash/05-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | replicas: 2 7 | template: 8 | metadata: 9 | annotations: 10 | # After this config map update the hash should change, as the deployment was applied as well 11 | kudo.dev/dependencies-hash: 1510654b540619228b477bdd56d44175 12 | kudo.dev/operator-version: 0.1.0 13 | spec: 14 | containers: 15 | - name: nginx 16 | image: nginx:1.7.9 17 | ports: 18 | - containerPort: 80 19 | --- 20 | apiVersion: kudo.dev/v1beta1 21 | kind: Instance 22 | status: 23 | planStatus: 24 | deploy: 25 | status: COMPLETE -------------------------------------------------------------------------------- /test/e2e/dependencies-hash/05-update-param-and-replica.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: # Update a parameter that modifies the config map dependency and deploys the parent 4 | - command: kubectl kudo update --instance depop -p OTHER_CONFIG_VALUE=SecondChangedValue 5 | namespaced: true -------------------------------------------------------------------------------- /test/e2e/dependencies-hash/dep-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: REPLICAS 4 | description: Number of replicas that should be run as part of the deployment 5 | default: 2 6 | trigger: update-replica 7 | - name: CONFIG_MAP_VALUE 8 | description: A parameter used in the config map 9 | default: FancyValue 10 | trigger: update-param 11 | - name: OTHER_CONFIG_VALUE 12 | description: A parameter used in the config map but deployed together with the normal deploy plan 13 | default: OtherFancyValue 14 | -------------------------------------------------------------------------------- /test/e2e/dependencies-hash/dep-operator/templates/configmap.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: configdata 5 | data: 6 | valueA: {{ .Params.CONFIG_MAP_VALUE }} 7 | valueB: {{ .Params.OTHER_CONFIG_VALUE }} -------------------------------------------------------------------------------- /test/e2e/dependencies-hash/dep-operator/templates/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | selector: 7 | matchLabels: 8 | app: nginx 9 | replicas: {{ .Params.REPLICAS }} 10 | template: 11 | metadata: 12 | labels: 13 | app: nginx 14 | spec: 15 | containers: 16 | - name: nginx 17 | image: nginx:{{ .AppVersion }} 18 | ports: 19 | - containerPort: 80 20 | volumes: 21 | - name: config 22 | configMap: 23 | name: configdata 24 | -------------------------------------------------------------------------------- /test/e2e/immutable-parameter-with-default/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: immutable-param 5 | status: 6 | planStatus: 7 | deploy: 8 | status: COMPLETE 9 | --- 10 | apiVersion: apps/v1 11 | kind: Deployment 12 | metadata: 13 | name: nginx-deployment 14 | spec: 15 | template: 16 | metadata: 17 | labels: 18 | fixedLabel: cannotchange -------------------------------------------------------------------------------- /test/e2e/immutable-parameter-with-default/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance immutable-param ./immutable-param 5 | namespaced: true -------------------------------------------------------------------------------- /test/e2e/immutable-parameter-with-default/immutable-param/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "immutable-param" 3 | operatorVersion: "0.1.0" 4 | kubernetesVersion: 1.13.0 5 | maintainers: 6 | - name: Your name 7 | email: 8 | url: https://kudo.dev 9 | tasks: 10 | - name: app 11 | kind: Apply 12 | spec: 13 | resources: 14 | - deployment.yaml 15 | plans: 16 | deploy: 17 | strategy: serial 18 | phases: 19 | - name: main 20 | strategy: parallel 21 | steps: 22 | - name: everything 23 | tasks: 24 | - app -------------------------------------------------------------------------------- /test/e2e/immutable-parameter-with-default/immutable-param/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: replicas 4 | description: Number of replicas that should be run as part of the deployment 5 | default: 2 6 | - name: unchangeable 7 | description: An unchangeable parameter 8 | required: true 9 | immutable: true 10 | default: "cannotchange" -------------------------------------------------------------------------------- /test/e2e/immutable-parameter-with-default/immutable-param/templates/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | selector: 7 | matchLabels: 8 | app: nginx 9 | replicas: {{ .Params.replicas }} # tells deployment to run 2 pods matching the template 10 | template: 11 | metadata: 12 | labels: 13 | app: nginx 14 | fixedLabel: {{ .Params.unchangeable }} 15 | spec: 16 | containers: 17 | - name: nginx 18 | image: nginx:1.7.9 19 | ports: 20 | - containerPort: 80 -------------------------------------------------------------------------------- /test/e2e/immutable-parameter/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: immutable-param 5 | status: 6 | planStatus: 7 | deploy: 8 | status: COMPLETE 9 | --- 10 | apiVersion: apps/v1 11 | kind: Deployment 12 | metadata: 13 | name: nginx-deployment 14 | spec: 15 | template: 16 | metadata: 17 | labels: 18 | fixedLabel: fixedvalue -------------------------------------------------------------------------------- /test/e2e/immutable-parameter/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance immutable-param ./immutable-param -p unchangeable=fixedvalue 5 | namespaced: true -------------------------------------------------------------------------------- /test/e2e/immutable-parameter/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | template: 7 | metadata: 8 | labels: 9 | fixedLabel: fixedvalue -------------------------------------------------------------------------------- /test/e2e/immutable-parameter/01-fail-to-update-param.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - script: '! kubectl kudo update --namespace $NAMESPACE --instance immutable-param -p unchangeable=changedvalue' 5 | ignoreFailure: false -------------------------------------------------------------------------------- /test/e2e/immutable-parameter/immutable-param/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "immutable-param" 3 | operatorVersion: "0.1.0" 4 | kubernetesVersion: 1.13.0 5 | maintainers: 6 | - name: Your name 7 | email: 8 | url: https://kudo.dev 9 | tasks: 10 | - name: app 11 | kind: Apply 12 | spec: 13 | resources: 14 | - deployment.yaml 15 | plans: 16 | deploy: 17 | strategy: serial 18 | phases: 19 | - name: main 20 | strategy: parallel 21 | steps: 22 | - name: everything 23 | tasks: 24 | - app -------------------------------------------------------------------------------- /test/e2e/immutable-parameter/immutable-param/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: replicas 4 | description: Number of replicas that should be run as part of the deployment 5 | default: 2 6 | - name: unchangeable 7 | description: An unchangeable parameter 8 | required: true 9 | immutable: true -------------------------------------------------------------------------------- /test/e2e/immutable-parameter/immutable-param/templates/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | selector: 7 | matchLabels: 8 | app: nginx 9 | replicas: {{ .Params.replicas }} # tells deployment to run 2 pods matching the template 10 | template: 11 | metadata: 12 | labels: 13 | app: nginx 14 | fixedLabel: {{ .Params.unchangeable }} 15 | spec: 16 | containers: 17 | - name: nginx 18 | image: nginx:1.7.9 19 | ports: 20 | - containerPort: 80 -------------------------------------------------------------------------------- /test/e2e/kind-config.yaml: -------------------------------------------------------------------------------- 1 | kind: Cluster 2 | apiVersion: kind.sigs.k8s.io/v1alpha4 3 | nodes: 4 | - role: control-plane 5 | kubeadmConfigPatches: 6 | - | 7 | kind: ClusterConfiguration 8 | controllerManager: 9 | extraArgs: 10 | "v": "4" -------------------------------------------------------------------------------- /test/e2e/plan-trigger/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | labels: 5 | kudo.dev/operator: feature-operator 6 | spec: 7 | operatorVersion: 8 | name: feature-operator-1.7.9-0.1.0 9 | status: 10 | planStatus: 11 | deploy: 12 | status: COMPLETE 13 | -------------------------------------------------------------------------------- /test/e2e/plan-trigger/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance feature-operator-instance ./feature-operator 5 | namespaced: true -------------------------------------------------------------------------------- /test/e2e/plan-trigger/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | labels: 5 | kudo.dev/operator: feature-operator 6 | spec: 7 | operatorVersion: 8 | name: feature-operator-1.7.9-0.1.0 9 | status: 10 | planStatus: 11 | deploy: 12 | status: COMPLETE 13 | custom: 14 | status: COMPLETE 15 | --- 16 | apiVersion: v1 17 | kind: ConfigMap 18 | metadata: 19 | name: feature-operator-cm 20 | data: 21 | foo: "1234" 22 | -------------------------------------------------------------------------------- /test/e2e/plan-trigger/01-trigger.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo plan trigger --instance feature-operator-instance --name custom 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/e2e/plan-trigger/feature-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "feature-operator" 3 | operatorVersion: "0.1.0" 4 | appVersion: "1.7.9" 5 | kubernetesVersion: 1.13.0 6 | maintainers: 7 | - name: Your name 8 | email: 9 | url: https://kudo.dev 10 | tasks: 11 | - name: deploy 12 | kind: Dummy 13 | spec: 14 | done: true 15 | wantErr: false 16 | - name: cm 17 | kind: Apply 18 | spec: 19 | resources: 20 | - configmap.yaml 21 | plans: 22 | deploy: 23 | strategy: serial 24 | phases: 25 | - name: main 26 | strategy: parallel 27 | steps: 28 | - name: everything 29 | tasks: 30 | - deploy 31 | custom: 32 | strategy: serial 33 | phases: 34 | - name: main 35 | strategy: parallel 36 | steps: 37 | - name: everything 38 | tasks: 39 | - cm -------------------------------------------------------------------------------- /test/e2e/plan-trigger/feature-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | -------------------------------------------------------------------------------- /test/e2e/plan-trigger/feature-operator/templates/configmap.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: feature-operator-cm 5 | namespace: {{ .Namespace }} 6 | data: 7 | foo: "1234" 8 | -------------------------------------------------------------------------------- /test/e2e/readiness/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: first-operator 5 | status: 6 | conditions: 7 | - type: Ready 8 | status: "True" 9 | planStatus: 10 | deploy: 11 | status: COMPLETE 12 | --- 13 | apiVersion: apps/v1 14 | kind: Deployment 15 | metadata: 16 | name: nginx-deployment -------------------------------------------------------------------------------- /test/e2e/readiness/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance first-operator ./first-operator 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/e2e/readiness/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: first-operator 5 | status: 6 | conditions: 7 | - type: Ready 8 | status: "False" -------------------------------------------------------------------------------- /test/e2e/readiness/01-updatedeployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | selector: 7 | matchLabels: 8 | app: nginx 9 | replicas: 2 10 | template: 11 | metadata: 12 | labels: 13 | app: nginx 14 | spec: 15 | containers: 16 | - name: nginx 17 | image: thisisnonexistingimage 18 | ports: 19 | - containerPort: 80 -------------------------------------------------------------------------------- /test/e2e/readiness/first-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "first-operator" 3 | operatorVersion: "0.1.0" 4 | appVersion: "1.7.9" 5 | kubernetesVersion: 1.13.0 6 | maintainers: 7 | - name: Your name 8 | email: 9 | url: https://kudo.dev 10 | tasks: 11 | - name: app 12 | kind: Apply 13 | spec: 14 | resources: 15 | - deployment.yaml 16 | plans: 17 | deploy: 18 | strategy: serial 19 | phases: 20 | - name: main 21 | strategy: parallel 22 | steps: 23 | - name: everything 24 | tasks: 25 | - app 26 | -------------------------------------------------------------------------------- /test/e2e/readiness/first-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: replicas 4 | description: Number of replicas that should be run as part of the deployment 5 | default: 2 6 | -------------------------------------------------------------------------------- /test/e2e/readiness/first-operator/templates/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | selector: 7 | matchLabels: 8 | app: nginx 9 | replicas: {{ .Params.replicas }} # tells deployment to run 2 pods matching the template 10 | template: 11 | metadata: 12 | labels: 13 | app: nginx 14 | spec: 15 | containers: 16 | - name: nginx 17 | image: nginx:{{ .AppVersion }} 18 | ports: 19 | - containerPort: 80 -------------------------------------------------------------------------------- /test/e2e/terminal-failed-job/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | labels: 5 | kudo.dev/operator: failjob-operator 6 | spec: 7 | operatorVersion: 8 | name: failjob-operator-1.7.9-0.1.0 9 | status: 10 | planStatus: 11 | deploy: 12 | status: FATAL_ERROR -------------------------------------------------------------------------------- /test/e2e/terminal-failed-job/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance failjob-operator-instance ./failjob-operator 5 | namespaced: true -------------------------------------------------------------------------------- /test/e2e/terminal-failed-job/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | labels: 5 | kudo.dev/operator: job-timeout-operator 6 | spec: 7 | operatorVersion: 8 | name: job-timeout-operator-1.7.9-0.1.0 9 | status: 10 | planStatus: 11 | deploy: 12 | status: FATAL_ERROR 13 | -------------------------------------------------------------------------------- /test/e2e/terminal-failed-job/01-install-timeout.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo uninstall --instance failjob-operator-instance 5 | namespaced: true 6 | - command: kubectl kudo install --instance job-timout-operator-instance ./job-timeout-operator 7 | namespaced: true -------------------------------------------------------------------------------- /test/e2e/terminal-failed-job/failjob-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "failjob-operator" 3 | operatorVersion: "0.1.0" 4 | appVersion: "1.7.9" 5 | kubernetesVersion: 1.13.0 6 | maintainers: 7 | - name: Your name 8 | email: 9 | url: https://kudo.dev 10 | tasks: 11 | - name: app 12 | kind: Apply 13 | spec: 14 | resources: 15 | - failjob.yaml 16 | plans: 17 | deploy: 18 | strategy: serial 19 | phases: 20 | - name: main 21 | strategy: parallel 22 | steps: 23 | - name: everything 24 | tasks: 25 | - app 26 | -------------------------------------------------------------------------------- /test/e2e/terminal-failed-job/failjob-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: -------------------------------------------------------------------------------- /test/e2e/terminal-failed-job/failjob-operator/templates/failjob.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: batch/v1 2 | kind: Job 3 | metadata: 4 | name: failing-job 5 | namespace: {{ .Namespace }} 6 | spec: 7 | template: 8 | spec: 9 | containers: 10 | - name: main 11 | image: alpine 12 | command: ["false"] 13 | restartPolicy: Never 14 | backoffLimit: 0 15 | -------------------------------------------------------------------------------- /test/e2e/terminal-failed-job/job-timeout-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "job-timeout-operator" 3 | operatorVersion: "0.1.0" 4 | appVersion: "1.7.9" 5 | kubernetesVersion: 1.13.0 6 | maintainers: 7 | - name: Your name 8 | email: 9 | url: https://kudo.dev 10 | tasks: 11 | - name: app 12 | kind: Apply 13 | spec: 14 | resources: 15 | - timeoutjob.yaml 16 | plans: 17 | deploy: 18 | strategy: serial 19 | phases: 20 | - name: main 21 | strategy: parallel 22 | steps: 23 | - name: everything 24 | tasks: 25 | - app 26 | -------------------------------------------------------------------------------- /test/e2e/terminal-failed-job/job-timeout-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: -------------------------------------------------------------------------------- /test/e2e/terminal-failed-job/job-timeout-operator/templates/timeoutjob.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: batch/v1 2 | kind: Job 3 | metadata: 4 | name: timeout-job 5 | namespace: {{ .Namespace }} 6 | spec: 7 | template: 8 | spec: 9 | containers: 10 | - name: main 11 | image: alpine 12 | command: ["sleep", "1000"] 13 | restartPolicy: Never 14 | backoffLimit: 3 15 | activeDeadlineSeconds: 60 16 | -------------------------------------------------------------------------------- /test/e2e/toggle-task/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | labels: 5 | kudo.dev/operator: feature-operator 6 | spec: 7 | operatorVersion: 8 | name: feature-operator-1.7.9-0.1.0 9 | status: 10 | planStatus: 11 | deploy: 12 | status: COMPLETE 13 | --- 14 | apiVersion: v1 15 | kind: ConfigMap 16 | metadata: 17 | name: feature-operator-cm 18 | data: 19 | foo: "1234" -------------------------------------------------------------------------------- /test/e2e/toggle-task/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance feature-operator-instance ./feature-operator 5 | namespaced: true -------------------------------------------------------------------------------- /test/e2e/toggle-task/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | labels: 5 | kudo.dev/operator: feature-operator 6 | spec: 7 | operatorVersion: 8 | name: feature-operator-1.7.9-0.1.0 9 | status: 10 | planStatus: 11 | deploy: 12 | status: COMPLETE 13 | -------------------------------------------------------------------------------- /test/e2e/toggle-task/01-errors.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: feature-operator-cm 5 | data: 6 | foo: "1234" 7 | 8 | -------------------------------------------------------------------------------- /test/e2e/toggle-task/01-update.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo update --instance feature-operator-instance -p enable_cm=false 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/e2e/toggle-task/02-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: feature-operator-cm 5 | data: 6 | foo: "1234" 7 | -------------------------------------------------------------------------------- /test/e2e/toggle-task/02-update.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo update --instance feature-operator-instance -p enable_cm=true 5 | namespaced: true -------------------------------------------------------------------------------- /test/e2e/toggle-task/README.md: -------------------------------------------------------------------------------- 1 | This test needs to be in the e2e section for now, as the integration test kuttl only starts a etcd and an api-server. 2 | 3 | As the DeleteTask that is used by this test is doing a ForegroundDelete which requires the garbage collector, it would 4 | fail as an integration test. -------------------------------------------------------------------------------- /test/e2e/toggle-task/feature-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "feature-operator" 3 | operatorVersion: "0.1.0" 4 | appVersion: "1.7.9" 5 | kubernetesVersion: 1.13.0 6 | maintainers: 7 | - name: Your name 8 | email: 9 | url: https://kudo.dev 10 | tasks: 11 | - name: app 12 | kind: Toggle 13 | spec: 14 | parameter: enable_cm 15 | resources: 16 | - configmap.yaml 17 | plans: 18 | deploy: 19 | strategy: serial 20 | phases: 21 | - name: main 22 | strategy: parallel 23 | steps: 24 | - name: everything 25 | tasks: 26 | - app 27 | -------------------------------------------------------------------------------- /test/e2e/toggle-task/feature-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: enable_cm 4 | description: If true, a configMap is created, if false it's removed 5 | default: true 6 | -------------------------------------------------------------------------------- /test/e2e/toggle-task/feature-operator/templates/configmap.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: feature-operator-cm 5 | namespace: {{ .Namespace }} 6 | data: 7 | foo: "1234" 8 | -------------------------------------------------------------------------------- /test/e2e/update-with-upgrade/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: test 5 | data: 6 | origin: deploy 7 | foo: bar 8 | -------------------------------------------------------------------------------- /test/e2e/update-with-upgrade/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance update-with-upgrade ./update-with-upgrade-v1 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/e2e/update-with-upgrade/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: test 5 | data: 6 | origin: upgrade 7 | foo: bar 8 | bar: baz 9 | -------------------------------------------------------------------------------- /test/e2e/update-with-upgrade/01-upgrade-operator-version.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo upgrade --instance update-with-upgrade ./update-with-upgrade-v2 -p bar=baz 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/e2e/update-with-upgrade/update-with-upgrade-v1/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: foo 4 | required: true 5 | default: "bar" 6 | -------------------------------------------------------------------------------- /test/e2e/update-with-upgrade/update-with-upgrade-v1/templates/configmap-deployed.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: test 5 | data: 6 | # This field is used to determine the plan which created the config map 7 | origin: deploy 8 | # This field introduces a dependency on a parameter 9 | foo: "{{ .Params.foo }}" 10 | -------------------------------------------------------------------------------- /test/e2e/update-with-upgrade/update-with-upgrade-v1/templates/configmap-updated.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: test 5 | data: 6 | # This field is used to determine the plan which created the config map 7 | origin: update 8 | # This field introduces a dependency on a parameter 9 | foo: "{{ .Params.foo }}" 10 | -------------------------------------------------------------------------------- /test/e2e/update-with-upgrade/update-with-upgrade-v1/templates/configmap-upgraded.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: test 5 | data: 6 | # This field is used to determine the plan which created the config map 7 | origin: upgrade 8 | # This field introduces a dependency on a parameter 9 | foo: "{{ .Params.foo }}" 10 | -------------------------------------------------------------------------------- /test/e2e/update-with-upgrade/update-with-upgrade-v2/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: foo 4 | required: true 5 | default: "bar" 6 | # NOTE: "bar" intentionally specifies no default, 7 | # so that upgrade is impossible without setting the value. 8 | - name: bar 9 | required: true 10 | -------------------------------------------------------------------------------- /test/e2e/update-with-upgrade/update-with-upgrade-v2/templates/configmap-deployed.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: test 5 | data: 6 | # This field is used to determine the plan which created the config map 7 | origin: deploy 8 | # This field introduces a dependency on a parameter 9 | foo: "{{ .Params.foo }}" 10 | bar: "{{ .Params.bar }}" 11 | -------------------------------------------------------------------------------- /test/e2e/update-with-upgrade/update-with-upgrade-v2/templates/configmap-updated.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: test 5 | data: 6 | # This field is used to determine the plan which created the config map 7 | origin: update 8 | # This field introduces a dependency on a parameter 9 | foo: "{{ .Params.foo }}" 10 | bar: "{{ .Params.bar }}" 11 | -------------------------------------------------------------------------------- /test/e2e/update-with-upgrade/update-with-upgrade-v2/templates/configmap-upgraded.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: test 5 | data: 6 | # This field is used to determine the plan which created the config map 7 | origin: upgrade 8 | # This field introduces a dependency on a parameter 9 | foo: "{{ .Params.foo }}" 10 | bar: "{{ .Params.bar }}" 11 | -------------------------------------------------------------------------------- /test/e2e/upgrade/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: upgrade-operator 5 | status: 6 | conditions: 7 | - type: Ready 8 | status: "True" 9 | planStatus: 10 | deploy: 11 | status: COMPLETE 12 | --- 13 | apiVersion: apps/v1 14 | kind: Deployment 15 | metadata: 16 | name: nginx-deployment -------------------------------------------------------------------------------- /test/e2e/upgrade/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance upgrade-operator ./first-operator 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/e2e/upgrade/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: upgrade-operator 5 | status: 6 | planStatus: 7 | deploy: 8 | status: COMPLETE 9 | --- 10 | apiVersion: apps/v1 11 | kind: Deployment 12 | metadata: 13 | name: nginx-deployment 14 | --- 15 | apiVersion: v1 16 | kind: ConfigMap 17 | metadata: 18 | name: test -------------------------------------------------------------------------------- /test/e2e/upgrade/01-upgrade.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo upgrade --instance upgrade-operator ./first-operator-v2 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/e2e/upgrade/first-operator-v2/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: replicas 4 | description: Number of replicas that should be run as part of the deployment 5 | default: 2 6 | -------------------------------------------------------------------------------- /test/e2e/upgrade/first-operator-v2/templates/configmap.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: test 5 | data: 6 | foo: bar -------------------------------------------------------------------------------- /test/e2e/upgrade/first-operator-v2/templates/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | selector: 7 | matchLabels: 8 | app: nginx 9 | replicas: {{ .Params.replicas }} # tells deployment to run 2 pods matching the template 10 | template: 11 | metadata: 12 | labels: 13 | app: nginx 14 | spec: 15 | containers: 16 | - name: nginx 17 | image: nginx:{{ .AppVersion }} 18 | ports: 19 | - containerPort: 80 -------------------------------------------------------------------------------- /test/e2e/upgrade/first-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "first-operator" 3 | operatorVersion: "0.1.0" 4 | appVersion: "1.7.9" 5 | kubernetesVersion: 1.17.0 6 | maintainers: 7 | - name: Your name 8 | email: 9 | url: https://kudo.dev 10 | tasks: 11 | - name: app 12 | kind: Apply 13 | spec: 14 | resources: 15 | - deployment.yaml 16 | plans: 17 | deploy: 18 | strategy: serial 19 | phases: 20 | - name: main 21 | strategy: parallel 22 | steps: 23 | - name: everything 24 | tasks: 25 | - app 26 | -------------------------------------------------------------------------------- /test/e2e/upgrade/first-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: replicas 4 | description: Number of replicas that should be run as part of the deployment 5 | default: 2 6 | -------------------------------------------------------------------------------- /test/e2e/upgrade/first-operator/templates/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | selector: 7 | matchLabels: 8 | app: nginx 9 | replicas: {{ .Params.replicas }} # tells deployment to run 2 pods matching the template 10 | template: 11 | metadata: 12 | labels: 13 | app: nginx 14 | spec: 15 | containers: 16 | - name: nginx 17 | image: nginx:{{ .AppVersion }} 18 | ports: 19 | - containerPort: 80 -------------------------------------------------------------------------------- /test/integration/cli-install/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | labels: 5 | kudo.dev/operator: cli-install-operator 6 | spec: 7 | operatorVersion: 8 | name: cli-install-operator-0.1.0 9 | status: 10 | planStatus: 11 | deploy: 12 | status: COMPLETE 13 | --- 14 | apiVersion: v1 15 | kind: Service 16 | metadata: 17 | labels: 18 | memory: "1Gi" 19 | cpu: "0.25" 20 | -------------------------------------------------------------------------------- /test/integration/cli-install/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance cli-install ./cli-install-operator 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/integration/cli-install/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | labels: 5 | kudo.dev/operator: cli-install-operator 6 | name: cli-install 7 | spec: 8 | operatorVersion: 9 | name: cli-install-operator-0.1.0 10 | status: 11 | planStatus: 12 | deploy: 13 | status: COMPLETE 14 | --- 15 | apiVersion: v1 16 | kind: Service 17 | metadata: 18 | labels: 19 | memory: "2Gi" 20 | cpu: "0.25" 21 | name: cli-install-operator 22 | -------------------------------------------------------------------------------- /test/integration/cli-install/01-upgrade.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: cli-install 5 | labels: 6 | kudo.dev/operator: cli-install-operator 7 | spec: 8 | operatorVersion: 9 | name: cli-install-operator-0.1.0 10 | parameters: 11 | memory: "2Gi" 12 | -------------------------------------------------------------------------------- /test/integration/cli-install/cli-install-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "cli-install-operator" 3 | operatorVersion: "0.1.0" 4 | kudoVersion: 0.3.0 5 | kubernetesVersion: 1.5.1 6 | maintainers: 7 | - name: Justin Taylor-Barrick 8 | email: jbarrick-mesosphere@mesosphere.com 9 | tasks: 10 | - name: infra 11 | kind: Apply 12 | spec: 13 | resources: 14 | - deployment.yaml 15 | plans: 16 | deploy: 17 | strategy: serial 18 | phases: 19 | - name: infra 20 | strategy: parallel 21 | steps: 22 | - name: everything 23 | tasks: 24 | - infra 25 | -------------------------------------------------------------------------------- /test/integration/cli-install/cli-install-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: memory 4 | description: Amount of memory to provide to Zookeeper pods 5 | default: "1Gi" 6 | - name: cpus 7 | description: Amount of cpu to provide to Zookeeper pods 8 | default: "0.25" 9 | -------------------------------------------------------------------------------- /test/integration/cli-install/cli-install-operator/templates/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: {{ .OperatorName }} 5 | namespace: {{ .Namespace }} 6 | labels: 7 | memory: "{{ .Params.memory }}" 8 | cpu: "{{ .Params.cpus }}" 9 | spec: 10 | ports: 11 | - port: 8080 12 | name: {{ .Name }} 13 | -------------------------------------------------------------------------------- /test/integration/create-operator-in-operator/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: oio-instance 5 | status: 6 | planStatus: 7 | deploy: 8 | status: COMPLETE 9 | --- 10 | apiVersion: kudo.dev/v1beta1 11 | kind: Instance 12 | metadata: 13 | name: inner-instance 14 | status: 15 | planStatus: 16 | deploy: 17 | status: COMPLETE 18 | --- 19 | apiVersion: v1 20 | kind: ConfigMap 21 | metadata: 22 | name: test-configmap 23 | data: 24 | foo: bar-xxx 25 | -------------------------------------------------------------------------------- /test/integration/create-operator-in-operator/01-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | labels: 5 | controller-tools.k8s.io: "1.0" 6 | kudo.dev/operator: operator-in-operator 7 | name: oio-instance 8 | spec: 9 | operatorVersion: 10 | name: operator-in-operator-v1 11 | kind: OperatorVersion 12 | -------------------------------------------------------------------------------- /test/integration/dependencies-package-create/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo package create ./operator-with-dependencies/parent-operator 5 | -------------------------------------------------------------------------------- /test/integration/dependencies-package-create/operator-with-dependencies/child-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "child" 3 | operatorVersion: "0.0.1" 4 | appVersion: "3.2.1" 5 | kubernetesVersion: 1.15.0 6 | maintainers: 7 | - name: zen-dog 8 | email: 9 | url: https://kudo.dev 10 | tasks: 11 | - name: deploy 12 | kind: Dummy 13 | spec: 14 | done: true 15 | wantErr: false 16 | 17 | plans: 18 | deploy: 19 | strategy: serial 20 | phases: 21 | - name: main 22 | strategy: parallel 23 | steps: 24 | - name: deploy 25 | tasks: 26 | - deploy 27 | -------------------------------------------------------------------------------- /test/integration/dependencies-package-create/operator-with-dependencies/child-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: deploy 4 | description: Triggers the deploy plan 5 | default: 1 6 | trigger: deploy -------------------------------------------------------------------------------- /test/integration/dependencies-package-create/operator-with-dependencies/parent-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "parent" 3 | operatorVersion: "0.1.0" 4 | kubernetesVersion: 1.15.0 5 | maintainers: 6 | - name: zen-dog 7 | email: 8 | url: https://kudo.dev 9 | tasks: 10 | - name: deploy-child 11 | kind: KudoOperator 12 | spec: 13 | package: "../child-operator" 14 | parameterFile: child-params.yaml 15 | 16 | plans: 17 | deploy: 18 | strategy: serial 19 | phases: 20 | - name: main 21 | strategy: parallel 22 | steps: 23 | - name: deploy 24 | tasks: 25 | - deploy-child -------------------------------------------------------------------------------- /test/integration/dependencies-package-create/operator-with-dependencies/parent-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: deploy 4 | description: Triggers the deploy plan 5 | default: 1 6 | trigger: deploy -------------------------------------------------------------------------------- /test/integration/dependencies-package-create/operator-with-dependencies/parent-operator/templates/child-params.yaml: -------------------------------------------------------------------------------- 1 | someChildParameter: "{{ .Params.deploy }}" -------------------------------------------------------------------------------- /test/integration/first-operator-test/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | replicas: 2 7 | template: 8 | spec: 9 | containers: 10 | - name: nginx 11 | image: nginx:1.7.9 12 | ports: 13 | - containerPort: 80 14 | -------------------------------------------------------------------------------- /test/integration/first-operator-test/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance first-operator ./first-operator 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/integration/first-operator-test/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | replicas: 4 7 | -------------------------------------------------------------------------------- /test/integration/first-operator-test/01-errors.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: first-operator 5 | spec: 6 | parameters: 7 | replicas: "2" 8 | -------------------------------------------------------------------------------- /test/integration/first-operator-test/01-scale.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: first-operator 5 | spec: 6 | parameters: 7 | replicas: "4" 8 | -------------------------------------------------------------------------------- /test/integration/first-operator-test/first-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "first-operator" 3 | operatorVersion: "0.1.0" 4 | appVersion: "1.7.9" 5 | kubernetesVersion: 1.13.0 6 | maintainers: 7 | - name: Your name 8 | email: 9 | url: https://kudo.dev 10 | tasks: 11 | - name: app 12 | kind: Apply 13 | spec: 14 | resources: 15 | - deployment.yaml 16 | plans: 17 | deploy: 18 | strategy: serial 19 | phases: 20 | - name: main 21 | strategy: parallel 22 | steps: 23 | - name: everything 24 | tasks: 25 | - app 26 | -------------------------------------------------------------------------------- /test/integration/first-operator-test/first-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: replicas 4 | description: Number of replicas that should be run as part of the deployment 5 | default: 2 6 | -------------------------------------------------------------------------------- /test/integration/first-operator-test/first-operator/templates/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | selector: 7 | matchLabels: 8 | app: nginx 9 | replicas: {{ .Params.replicas }} # tells deployment to run 2 pods matching the template 10 | template: 11 | metadata: 12 | labels: 13 | app: nginx 14 | spec: 15 | containers: 16 | - name: nginx 17 | image: nginx:{{ .AppVersion }} 18 | ports: 19 | - containerPort: 80 -------------------------------------------------------------------------------- /test/integration/immutable-client-ip/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: immutable-client-ip-instance 5 | status: 6 | planStatus: 7 | deploy: 8 | status: COMPLETE 9 | --- 10 | apiVersion: v1 11 | kind: Service 12 | metadata: 13 | name: svc 14 | spec: 15 | type: ClusterIP 16 | ports: 17 | - port: 80 18 | name: gossip 19 | selector: 20 | label: test 21 | -------------------------------------------------------------------------------- /test/integration/immutable-client-ip/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: immutable-client-ip-instance 5 | status: 6 | planStatus: 7 | deploy: 8 | status: COMPLETE 9 | --- 10 | apiVersion: v1 11 | kind: Service 12 | metadata: 13 | name: svc 14 | spec: 15 | type: ClusterIP 16 | ports: 17 | - port: 80 18 | name: gossip 19 | selector: 20 | label: hello 21 | -------------------------------------------------------------------------------- /test/integration/immutable-client-ip/01-update-parameter.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: immutable-client-ip-instance 5 | labels: 6 | operator: service-operator 7 | spec: 8 | parameters: 9 | LABEL: "hello" 10 | -------------------------------------------------------------------------------- /test/integration/install-existing-crds-in-operator/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: crd-instance 5 | status: 6 | planStatus: 7 | deploy: 8 | status: COMPLETE -------------------------------------------------------------------------------- /test/integration/install-existing-crds-in-operator/00-install-operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance crd-instance ./crd-operator 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/integration/install-existing-crds-in-operator/crd-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "crd-operator" 3 | operatorVersion: "0.1.0" 4 | kubernetesVersion: 1.13 5 | maintainers: 6 | - name: Your name 7 | email: 8 | url: https://kudo.dev 9 | tasks: 10 | - name: app 11 | kind: Apply 12 | spec: 13 | resources: 14 | - crd.yaml 15 | plans: 16 | deploy: 17 | strategy: serial 18 | phases: 19 | - name: main 20 | strategy: parallel 21 | steps: 22 | - name: everything 23 | tasks: 24 | - app 25 | -------------------------------------------------------------------------------- /test/integration/install-existing-crds-in-operator/crd-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: version 4 | description: Version of image 5 | default: 1.7.9 6 | -------------------------------------------------------------------------------- /test/integration/install-existing-crds-in-operator/crd-operator/templates/crd.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apiextensions.k8s.io/v1beta1 2 | kind: CustomResourceDefinition 3 | metadata: 4 | creationTimestamp: null 5 | labels: 6 | app: kudo-manager 7 | controller-tools.k8s.io: "1.0" 8 | name: abcs.kudo.dev 9 | spec: 10 | group: kudo.dev 11 | names: 12 | kind: Abc 13 | plural: abcs 14 | singular: abc 15 | scope: Namespaced 16 | version: v1beta1 -------------------------------------------------------------------------------- /test/integration/instance-controller-param-change-custom-trigger/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: icto-custom-trigger 5 | status: 6 | planStatus: 7 | deploy: 8 | status: COMPLETE -------------------------------------------------------------------------------- /test/integration/instance-controller-param-change-custom-trigger/00-setup.yaml: -------------------------------------------------------------------------------- 1 | # Create an OperatorVersion with a parameter and its corresponding trigger. 2 | # 3 | # The next step will update the parameter and verify that it triggers the 4 | # execution for the plan defined as a trigger. 5 | apiVersion: kudo.dev/v1beta1 6 | kind: OperatorVersion 7 | metadata: 8 | name: icto-custom-trigger 9 | spec: 10 | version: "1.0" 11 | parameters: 12 | - name: foo 13 | trigger: foo-changed 14 | plans: 15 | deploy: {} 16 | update: {} 17 | foo-changed: {} 18 | --- 19 | apiVersion: kudo.dev/v1beta1 20 | kind: Instance 21 | metadata: 22 | name: icto-custom-trigger 23 | labels: 24 | kudo.dev/operator: icto-custom-trigger 25 | spec: 26 | operatorVersion: 27 | name: icto-custom-trigger 28 | kind: OperatorVersion 29 | -------------------------------------------------------------------------------- /test/integration/instance-controller-param-change-custom-trigger/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: icto-custom-trigger 5 | status: 6 | planStatus: 7 | foo-changed: 8 | status: COMPLETE -------------------------------------------------------------------------------- /test/integration/instance-controller-param-change-custom-trigger/01-update-instance.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: icto-custom-trigger 5 | spec: 6 | parameters: 7 | foo: "new value" 8 | -------------------------------------------------------------------------------- /test/integration/instance-controller-param-change-fallback-to-deploy/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: icto-fallback-to-deploy 5 | status: 6 | planStatus: 7 | deploy: 8 | status: COMPLETE -------------------------------------------------------------------------------- /test/integration/instance-controller-param-change-fallback-to-deploy/00-setup.yaml: -------------------------------------------------------------------------------- 1 | # Create an OperatorVersion with a parameter without a trigger and without an 2 | # `update` plan. 3 | # 4 | # The next step will update the parameter and verify that it triggers plan execution for the `deploy` plan. 5 | apiVersion: kudo.dev/v1beta1 6 | kind: OperatorVersion 7 | metadata: 8 | name: icto-fallback-to-deploy 9 | spec: 10 | operator: 11 | name: icto-fallback-to-deploy 12 | kind: Operator 13 | version: "1.0" 14 | parameters: 15 | - name: foo 16 | plans: 17 | deploy: {} 18 | --- 19 | apiVersion: kudo.dev/v1beta1 20 | kind: Instance 21 | metadata: 22 | name: icto-fallback-to-deploy 23 | labels: 24 | kudo.dev/operator: icto-fallback-to-deploy 25 | spec: 26 | operatorVersion: 27 | name: icto-fallback-to-deploy 28 | kind: OperatorVersion 29 | -------------------------------------------------------------------------------- /test/integration/instance-controller-param-change-fallback-to-deploy/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: icto-fallback-to-deploy 5 | status: 6 | planStatus: 7 | deploy: 8 | status: COMPLETE 9 | -------------------------------------------------------------------------------- /test/integration/instance-controller-param-change-fallback-to-deploy/01-update-instance.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: icto-fallback-to-deploy 5 | spec: 6 | parameters: 7 | foo: "new value" 8 | -------------------------------------------------------------------------------- /test/integration/instance-controller-param-change-no-trigger/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: icto-no-trigger 5 | status: 6 | planStatus: 7 | deploy: 8 | status: COMPLETE 9 | -------------------------------------------------------------------------------- /test/integration/instance-controller-param-change-no-trigger/00-setup.yaml: -------------------------------------------------------------------------------- 1 | # Create an OperatorVersion with a parameter without a trigger and an `update` 2 | # plan. 3 | # 4 | # The next step will update the parameter and verify that it triggers the creation 5 | # of a `PlanExecution` for the `update` plan. 6 | apiVersion: kudo.dev/v1beta1 7 | kind: OperatorVersion 8 | metadata: 9 | name: icto-no-trigger 10 | spec: 11 | version: "1.0" 12 | parameters: 13 | - name: foo 14 | plans: 15 | deploy: {} 16 | update: {} 17 | --- 18 | apiVersion: kudo.dev/v1beta1 19 | kind: Instance 20 | metadata: 21 | name: icto-no-trigger 22 | labels: 23 | kudo.dev/operator: icto-no-trigger 24 | spec: 25 | operatorVersion: 26 | name: icto-no-trigger 27 | kind: OperatorVersion 28 | -------------------------------------------------------------------------------- /test/integration/instance-controller-param-change-no-trigger/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: icto-no-trigger 5 | status: 6 | planStatus: 7 | update: 8 | status: COMPLETE 9 | -------------------------------------------------------------------------------- /test/integration/instance-controller-param-change-no-trigger/01-update-instance.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: icto-no-trigger 5 | spec: 6 | parameters: 7 | foo: "new value" 8 | -------------------------------------------------------------------------------- /test/integration/instance-controller-upgrade-fallback-to-deploy/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: icto-upgrade-fallback-to-deploy 5 | status: 6 | planStatus: 7 | deploy: 8 | status: COMPLETE 9 | -------------------------------------------------------------------------------- /test/integration/instance-controller-upgrade-fallback-to-deploy/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: icto-upgrade-fallback-to-deploy 5 | status: 6 | planStatus: 7 | deploy: 8 | status: COMPLETE 9 | -------------------------------------------------------------------------------- /test/integration/instance-controller-upgrade-fallback-to-deploy/01-upgrade-instance.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: OperatorVersion 3 | metadata: 4 | name: icto-upgrade-fallback-to-deploy 5 | spec: 6 | operator: 7 | name: icto-upgrade 8 | kind: Operator 9 | version: "2.0" 10 | plans: 11 | deploy: {} 12 | --- 13 | apiVersion: kudo.dev/v1beta1 14 | kind: Instance 15 | metadata: 16 | name: icto-upgrade-fallback-to-deploy 17 | spec: 18 | operatorVersion: 19 | name: icto-upgrade-fallback-to-deploy 20 | kind: OperatorVersion 21 | -------------------------------------------------------------------------------- /test/integration/instance-controller-upgrade-fallback-to-update/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: icto-upgrade-fallback-to-update 5 | status: 6 | planStatus: 7 | deploy: 8 | status: COMPLETE 9 | -------------------------------------------------------------------------------- /test/integration/instance-controller-upgrade-fallback-to-update/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: icto-upgrade-fallback-to-update 5 | status: 6 | planStatus: 7 | update: 8 | status: COMPLETE 9 | -------------------------------------------------------------------------------- /test/integration/instance-controller-upgrade-fallback-to-update/01-upgrade-instance.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: OperatorVersion 3 | metadata: 4 | name: icto-upgrade-fallback-to-update 5 | spec: 6 | operator: 7 | name: icto-upgrade 8 | kind: Operator 9 | version: "2.0" 10 | plans: 11 | deploy: {} 12 | update: {} 13 | --- 14 | apiVersion: kudo.dev/v1beta1 15 | kind: Instance 16 | metadata: 17 | name: icto-upgrade-fallback-to-update 18 | spec: 19 | operatorVersion: 20 | name: icto-upgrade-fallback-to-update 21 | kind: OperatorVersion 22 | -------------------------------------------------------------------------------- /test/integration/instance-controller-upgrade/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: icto-upgrade 5 | status: 6 | planStatus: 7 | deploy: 8 | status: COMPLETE 9 | -------------------------------------------------------------------------------- /test/integration/instance-controller-upgrade/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: icto-upgrade 5 | status: 6 | planStatus: 7 | upgrade: 8 | status: COMPLETE -------------------------------------------------------------------------------- /test/integration/instance-controller-upgrade/01-upgrade-instance.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: OperatorVersion 3 | metadata: 4 | name: icto-upgrade-v2 5 | spec: 6 | operator: 7 | name: icto-upgrade 8 | kind: Operator 9 | version: "2.0" 10 | plans: 11 | deploy: {} 12 | update: {} 13 | upgrade: {} 14 | --- 15 | apiVersion: kudo.dev/v1beta1 16 | kind: Instance 17 | metadata: 18 | name: icto-upgrade 19 | spec: 20 | operatorVersion: 21 | name: icto-upgrade-v2 22 | kind: OperatorVersion 23 | -------------------------------------------------------------------------------- /test/integration/invalid-crd-install/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: op-with-crd 5 | spec: 6 | operatorVersion: 7 | name: op-with-crd-1.7.9-0.1.0 8 | status: 9 | planStatus: 10 | deploy: 11 | status: FATAL_ERROR -------------------------------------------------------------------------------- /test/integration/invalid-crd-install/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance op-with-crd ./op-with-crd 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/integration/invalid-crd-install/op-with-crd/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "op-with-crd" 3 | operatorVersion: "0.1.0" 4 | appVersion: "1.7.9" 5 | kubernetesVersion: 1.13.0 6 | maintainers: 7 | - name: Your name 8 | email: 9 | url: https://kudo.dev 10 | tasks: 11 | - name: app 12 | kind: Apply 13 | spec: 14 | resources: 15 | - invalid-crd.yaml 16 | plans: 17 | deploy: 18 | strategy: serial 19 | phases: 20 | - name: main 21 | strategy: parallel 22 | steps: 23 | - name: everything 24 | tasks: 25 | - app 26 | -------------------------------------------------------------------------------- /test/integration/invalid-crd-install/op-with-crd/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | -------------------------------------------------------------------------------- /test/integration/invalid-crd-install/op-with-crd/templates/invalid-crd.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: somecrd.invalid/v1 2 | kind: InvalidCrdType 3 | metadata: 4 | name: {{ .Name }}-resource 5 | namespace: {{ .Namespace }} 6 | spec: 7 | this: 8 | does-not: "matter" 9 | there-is-no: "such-crd" -------------------------------------------------------------------------------- /test/integration/operator-test/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx 5 | spec: 6 | replicas: 3 7 | template: 8 | spec: 9 | containers: 10 | - name: nginx 11 | image: nginx:1.7.9 12 | ports: 13 | - containerPort: 80 14 | -------------------------------------------------------------------------------- /test/integration/operator-test/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: operator-test-instance 5 | spec: 6 | operatorVersion: 7 | name: test-operator-1.0 8 | kind: OperatorVersion 9 | namespace: default 10 | -------------------------------------------------------------------------------- /test/integration/operator-test/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx 5 | spec: 6 | replicas: 4 7 | -------------------------------------------------------------------------------- /test/integration/operator-test/01-upgrade.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: operator-test-instance 5 | spec: 6 | parameters: 7 | REPLICAS: "4" 8 | -------------------------------------------------------------------------------- /test/integration/operator-with-custom-crd/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apiextensions.k8s.io/v1beta1 2 | kind: CustomResourceDefinition 3 | metadata: 4 | name: servicemonitors.monitoring.coreos.com 5 | --- 6 | apiVersion: kudo.dev/v1beta1 7 | kind: Instance 8 | metadata: 9 | name: crd-instance 10 | spec: 11 | operatorVersion: 12 | name: crd-operator-0.1.0 13 | status: 14 | planStatus: 15 | deploy: 16 | status: COMPLETE -------------------------------------------------------------------------------- /test/integration/operator-with-custom-crd/00-install-crd.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance crd-instance ./operator 5 | namespaced: true -------------------------------------------------------------------------------- /test/integration/operator-with-custom-crd/operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "crd-operator" 3 | operatorVersion: "0.1.0" 4 | kubernetesVersion: 1.13 5 | maintainers: 6 | - name: Your name 7 | email: 8 | url: https://kudo.dev 9 | tasks: 10 | - name: crd 11 | kind: Apply 12 | spec: 13 | resources: 14 | - crd.yaml 15 | - name: sm 16 | kind: Apply 17 | spec: 18 | resources: 19 | - sm.yaml 20 | plans: 21 | deploy: 22 | strategy: serial 23 | phases: 24 | - name: main 25 | strategy: serial 26 | steps: 27 | - name: crd 28 | tasks: 29 | - crd 30 | - name: everything 31 | tasks: 32 | - sm 33 | -------------------------------------------------------------------------------- /test/integration/operator-with-custom-crd/operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: -------------------------------------------------------------------------------- /test/integration/operator-with-custom-crd/operator/templates/sm.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: monitoring.coreos.com/v1 2 | kind: ServiceMonitor 3 | metadata: 4 | labels: 5 | app: prometheus-operator 6 | release: prometheus-kubeaddons 7 | name: spark-cluster-monitor 8 | spec: 9 | endpoints: 10 | - interval: 5s 11 | port: metrics 12 | selector: 13 | matchLabels: 14 | spark/servicemonitor: true -------------------------------------------------------------------------------- /test/integration/operator-with-dependencies/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: OperatorVersion 3 | metadata: 4 | name: parent-0.1.0 5 | spec: 6 | tasks: 7 | - name: deploy-child 8 | kind: KudoOperator 9 | spec: 10 | package: child 11 | --- 12 | apiVersion: kudo.dev/v1beta1 13 | kind: Instance 14 | metadata: 15 | name: dummy-instance 16 | status: 17 | planStatus: 18 | deploy: 19 | status: COMPLETE 20 | 21 | --- 22 | apiVersion: kudo.dev/v1beta1 23 | kind: Instance 24 | metadata: 25 | name: dummy-instance-child 26 | status: 27 | planStatus: 28 | deploy: 29 | status: COMPLETE 30 | -------------------------------------------------------------------------------- /test/integration/operator-with-dependencies/01-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance dummy-instance ./parent-operator 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/integration/operator-with-dependencies/child-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "child" 3 | operatorVersion: "0.0.1" 4 | appVersion: "3.2.1" 5 | kubernetesVersion: 1.15.0 6 | maintainers: 7 | - name: zen-dog 8 | email: 9 | url: https://kudo.dev 10 | tasks: 11 | - name: deploy 12 | kind: Dummy 13 | spec: 14 | done: true 15 | wantErr: false 16 | 17 | plans: 18 | deploy: 19 | strategy: serial 20 | phases: 21 | - name: main 22 | strategy: parallel 23 | steps: 24 | - name: deploy 25 | tasks: 26 | - deploy 27 | -------------------------------------------------------------------------------- /test/integration/operator-with-dependencies/child-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: deploy 4 | description: Triggers the deploy plan 5 | default: 1 6 | trigger: deploy -------------------------------------------------------------------------------- /test/integration/operator-with-dependencies/parent-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "parent" 3 | operatorVersion: "0.1.0" 4 | kubernetesVersion: 1.15.0 5 | maintainers: 6 | - name: zen-dog 7 | email: 8 | url: https://kudo.dev 9 | tasks: 10 | - name: deploy-child 11 | kind: KudoOperator 12 | spec: 13 | package: "../child-operator" 14 | 15 | plans: 16 | deploy: 17 | strategy: serial 18 | phases: 19 | - name: main 20 | strategy: parallel 21 | steps: 22 | - name: deploy 23 | tasks: 24 | - deploy-child -------------------------------------------------------------------------------- /test/integration/operator-with-dependencies/parent-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: deploy 4 | description: Triggers the deploy plan 5 | default: 1 6 | trigger: deploy -------------------------------------------------------------------------------- /test/integration/operator-with-subdirectory-resources/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | replicas: 2 7 | template: 8 | spec: 9 | containers: 10 | - name: nginx 11 | image: nginx:1.7.9 12 | ports: 13 | - containerPort: 80 14 | --- 15 | apiVersion: v1 16 | kind: Service 17 | metadata: 18 | name: my-service 19 | spec: 20 | selector: 21 | replicas: "2" 22 | -------------------------------------------------------------------------------- /test/integration/operator-with-subdirectory-resources/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance subdirectory ./operator 5 | namespaced: true -------------------------------------------------------------------------------- /test/integration/operator-with-subdirectory-resources/operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "subdir-operator" 3 | operatorVersion: "0.1.0" 4 | appVersion: "1.7.9" 5 | kubernetesVersion: 1.13 6 | maintainers: 7 | - name: Your name 8 | email: 9 | url: https://kudo.dev 10 | tasks: 11 | - name: deploy 12 | kind: Apply 13 | spec: 14 | resources: 15 | - deployments/deployment.yaml 16 | - service/service.yaml 17 | plans: 18 | deploy: 19 | strategy: serial 20 | phases: 21 | - name: main 22 | strategy: serial 23 | steps: 24 | - name: deploy 25 | tasks: 26 | - deploy -------------------------------------------------------------------------------- /test/integration/operator-with-subdirectory-resources/operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: -------------------------------------------------------------------------------- /test/integration/operator-with-subdirectory-resources/operator/templates/deployments/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | selector: 7 | matchLabels: 8 | app: nginx 9 | replicas: 2 10 | template: 11 | metadata: 12 | labels: 13 | app: nginx 14 | spec: 15 | containers: 16 | - name: nginx 17 | image: nginx:{{ .AppVersion }} 18 | ports: 19 | - containerPort: 80 -------------------------------------------------------------------------------- /test/integration/operator-with-subdirectory-resources/operator/templates/service/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: my-service 5 | spec: 6 | selector: 7 | replicas: "2" 8 | ports: 9 | - port: 8080 10 | name: {{ .Name }} -------------------------------------------------------------------------------- /test/integration/parameter-types-operator/01-assert.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: kudo.dev/v1beta1 3 | kind: Instance 4 | metadata: 5 | name: parameter-test-instance 6 | status: 7 | planStatus: 8 | deploy: 9 | status: IN_PROGRESS 10 | --- 11 | apiVersion: apps/v1 12 | kind: Deployment 13 | metadata: 14 | name: nginx-deployment 15 | labels: 16 | a: a 17 | b: b 18 | spec: 19 | replicas: 1 20 | template: 21 | spec: 22 | containers: 23 | - ports: 24 | - containerPort: 80 25 | - containerPort: 443 26 | -------------------------------------------------------------------------------- /test/integration/parameter-types-operator/01-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance parameter-test-instance ./operator 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/integration/parameter-types-operator/operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "operator" 3 | operatorVersion: "0.1.0" 4 | kudoVersion: 0.11 5 | kubernetesVersion: 1.15 6 | maintainers: 7 | - name: Jan Schlicht 8 | email: jan@d2iq.com 9 | tasks: 10 | - name: operator 11 | kind: Apply 12 | spec: 13 | resources: 14 | - deployment.yaml 15 | plans: 16 | deploy: 17 | strategy: serial 18 | phases: 19 | - name: dependencies 20 | steps: 21 | - name: operator 22 | tasks: 23 | - operator 24 | -------------------------------------------------------------------------------- /test/integration/parameter-types-operator/operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: LABELS 4 | description: "Deployment labels" 5 | default: 6 | a: a 7 | b: b 8 | type: map 9 | - name: PORTS 10 | description: "Nginx ports" 11 | default: 12 | - 80 13 | - 443 14 | type: array 15 | - name: PULL_POLICY 16 | type: string 17 | enum: 18 | - IfNotPresent 19 | - Always 20 | - Never 21 | default: IfNotPresent 22 | - name: REPLICAS 23 | type: integer 24 | default: 1 -------------------------------------------------------------------------------- /test/integration/parameter-types-operator/operator/templates/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | labels: 6 | {{ range $key, $value := .Params.LABELS }} 7 | {{ $key }}: {{ $value }} 8 | {{ end }} 9 | spec: 10 | selector: 11 | matchLabels: 12 | app: nginx 13 | replicas: {{ .Params.REPLICAS }} 14 | template: 15 | metadata: 16 | labels: 17 | app: nginx 18 | spec: 19 | containers: 20 | - name: nginx 21 | image: nginx:1.7.9 22 | imagePullPolicy: {{ .Params.PULL_POLICY }} 23 | ports: 24 | {{ range .Params.PORTS }} 25 | - containerPort: {{ . }} 26 | {{ end }} 27 | -------------------------------------------------------------------------------- /test/integration/parameter-types/01-assert.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: kudo.dev/v1beta1 3 | kind: Instance 4 | metadata: 5 | name: parameter-test-instance 6 | status: 7 | planStatus: 8 | deploy: 9 | status: IN_PROGRESS 10 | --- 11 | apiVersion: apps/v1 12 | kind: Deployment 13 | metadata: 14 | name: nginx-deployment 15 | labels: 16 | a: a 17 | b: b 18 | spec: 19 | replicas: 1 20 | template: 21 | spec: 22 | containers: 23 | - ports: 24 | - containerPort: 80 25 | - containerPort: 443 26 | -------------------------------------------------------------------------------- /test/integration/parse-param-operator-in-operator/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: dream1 5 | status: 6 | planStatus: 7 | deploy: 8 | status: IN_PROGRESS 9 | --- 10 | apiVersion: kudo.dev/v1beta1 11 | kind: Instance 12 | metadata: 13 | name: dream1 14 | status: 15 | planStatus: 16 | deploy: 17 | status: IN_PROGRESS 18 | --- 19 | apiVersion: apps/v1 20 | kind: Deployment 21 | metadata: 22 | name: nginx 23 | spec: 24 | replicas: 2 25 | template: 26 | spec: 27 | containers: 28 | - env: 29 | - name: PARAM_ENV 30 | value: "after" 31 | -------------------------------------------------------------------------------- /test/integration/parse-param-operator-in-operator/01-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | labels: 5 | controller-tools.k8s.io: "1.0" 6 | kudo.dev/operator: dream 7 | name: dream1 8 | spec: 9 | operatorVersion: 10 | name: dream-v1 11 | kind: OperatorVersion 12 | parameters: 13 | REPLICAS: "2" 14 | -------------------------------------------------------------------------------- /test/integration/remove-pod-container/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | replicas: 1 7 | template: 8 | spec: 9 | containers: 10 | - name: nginx 11 | image: nginx:1.7.9 12 | ports: 13 | - containerPort: 80 14 | - name: nginx2 15 | image: nginx:1.7.9 16 | ports: 17 | - containerPort: 8080 -------------------------------------------------------------------------------- /test/integration/remove-pod-container/00-errors.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | replicas: 1 7 | template: 8 | spec: 9 | priority: 100 -------------------------------------------------------------------------------- /test/integration/remove-pod-container/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance dual-pod ./dual-pod-operator -p WITH_PRIORITY="false" 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/integration/remove-pod-container/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | replicas: 1 7 | template: 8 | spec: 9 | priority: 100 10 | containers: 11 | - name: nginx 12 | image: nginx:1.7.9 13 | ports: 14 | - containerPort: 80 -------------------------------------------------------------------------------- /test/integration/remove-pod-container/01-update.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo update --instance dual-pod -p SECOND_CONTAINER="false" -p WITH_PRIORITY="true" 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/integration/remove-pod-container/02-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | replicas: 1 7 | template: 8 | spec: 9 | containers: 10 | - name: nginx 11 | image: nginx:1.7.9 12 | ports: 13 | - containerPort: 80 -------------------------------------------------------------------------------- /test/integration/remove-pod-container/02-errors.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | replicas: 1 7 | template: 8 | spec: 9 | priority: 100 -------------------------------------------------------------------------------- /test/integration/remove-pod-container/02-update_param.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo update --instance dual-pod -p WITH_PRIORITY="false" 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/integration/remove-pod-container/dual-pod-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "dual-pod-operator" 3 | operatorVersion: "0.1.0" 4 | appVersion: "1.7.9" 5 | kubernetesVersion: 1.13.0 6 | maintainers: 7 | - name: Your name 8 | email: 9 | url: https://kudo.dev 10 | tasks: 11 | - name: app 12 | kind: Apply 13 | spec: 14 | resources: 15 | - deployment.yaml 16 | plans: 17 | deploy: 18 | strategy: serial 19 | phases: 20 | - name: main 21 | strategy: parallel 22 | steps: 23 | - name: everything 24 | tasks: 25 | - app 26 | -------------------------------------------------------------------------------- /test/integration/remove-pod-container/dual-pod-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: SECOND_CONTAINER 4 | description: If the second container should be started 5 | default: true 6 | - name: WITH_PRIORITY 7 | description: If true, a priority is set 8 | default: true -------------------------------------------------------------------------------- /test/integration/remove-pod-container/dual-pod-operator/templates/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | selector: 7 | matchLabels: 8 | app: nginx 9 | replicas: 1 10 | template: 11 | metadata: 12 | labels: 13 | app: nginx 14 | spec: 15 | {{ if eq .Params.WITH_PRIORITY "true" }} 16 | priority: 100 17 | {{ end }} 18 | containers: 19 | - name: nginx 20 | image: nginx:{{ .AppVersion }} 21 | ports: 22 | - containerPort: 80 23 | {{ if eq .Params.SECOND_CONTAINER "true"}} 24 | - name: nginx2 25 | image: nginx:{{ .AppVersion }} 26 | ports: 27 | - containerPort: 8080 28 | {{ end }} -------------------------------------------------------------------------------- /test/integration/rendering-error-plan-failed/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: invalid1 5 | status: 6 | planStatus: 7 | deploy: 8 | status: FATAL_ERROR 9 | phases: 10 | - name: invalid-phase 11 | status: FATAL_ERROR 12 | -------------------------------------------------------------------------------- /test/integration/step-delete/00-assert.yaml: -------------------------------------------------------------------------------- 1 | # We only check the Instance here as the Job is deleted at the end of the step, so we cannot check for its existence. 2 | apiVersion: kudo.dev/v1beta1 3 | kind: Instance 4 | metadata: 5 | name: step-delete-instance 6 | status: 7 | planStatus: 8 | deploy: 9 | status: COMPLETE 10 | -------------------------------------------------------------------------------- /test/integration/step-delete/01-assert.yaml: -------------------------------------------------------------------------------- 1 | # We only check the Instance here as the Job is deleted at the end of the step, so we cannot check for its existence. 2 | apiVersion: kudo.dev/v1beta1 3 | kind: Instance 4 | metadata: 5 | name: step-delete-instance 6 | status: 7 | planStatus: 8 | deploy: 9 | status: COMPLETE 10 | -------------------------------------------------------------------------------- /test/integration/step-delete/01-upgrade.yaml: -------------------------------------------------------------------------------- 1 | # Set the hello label on the instance Job so that we verify that it was deleted (it is immutable). 2 | apiVersion: kudo.dev/v1beta1 3 | kind: Instance 4 | metadata: 5 | name: step-delete-instance 6 | spec: 7 | parameters: 8 | LABEL: "hello" 9 | -------------------------------------------------------------------------------- /test/integration/update-command/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | labels: 5 | controller-tools.k8s.io: "1.0" 6 | kudo.dev/operator: toy 7 | name: toy1 8 | spec: 9 | operatorVersion: 10 | name: toy-1.0.0 11 | kind: OperatorVersion 12 | namespace: default -------------------------------------------------------------------------------- /test/integration/update-command/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: toy1 5 | status: 6 | planStatus: 7 | deploy: 8 | status: COMPLETE -------------------------------------------------------------------------------- /test/integration/update-command/02-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: toy1 5 | spec: 6 | parameters: 7 | Param: after 8 | status: 9 | planStatus: 10 | deploy: 11 | status: COMPLETE -------------------------------------------------------------------------------- /test/integration/update-command/02-update.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo update --instance toy1 -p "Param=after" 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/integration/update-parameters/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: my-service 5 | spec: 6 | selector: 7 | param: "after" 8 | replicas: "1" 9 | --- 10 | apiVersion: kudo.dev/v1beta1 11 | kind: Instance 12 | metadata: 13 | name: toy1 14 | status: 15 | planStatus: 16 | deploy: 17 | status: COMPLETE 18 | -------------------------------------------------------------------------------- /test/integration/update-parameters/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | labels: 5 | kudo.dev/operator: toy 6 | name: toy1 7 | spec: 8 | operatorVersion: 9 | name: toy-1.0.0 10 | kind: OperatorVersion 11 | namespace: default 12 | parameters: 13 | Param: "after" 14 | Replicas: "1" 15 | -------------------------------------------------------------------------------- /test/integration/update-parameters/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: my-service 5 | spec: 6 | selector: 7 | replicas: "3" 8 | param: "after" 9 | --- 10 | apiVersion: kudo.dev/v1beta1 11 | kind: Instance 12 | metadata: 13 | name: toy1 14 | status: 15 | planStatus: 16 | scale: 17 | status: COMPLETE 18 | -------------------------------------------------------------------------------- /test/integration/update-parameters/01-update.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: toy1 5 | spec: 6 | parameters: 7 | Replicas: "3" 8 | status: 9 | planStatus: 10 | deploy: 11 | status: COMPLETE -------------------------------------------------------------------------------- /test/integration/update-parameters/02-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: my-service 5 | spec: 6 | selector: 7 | param: "long-after" 8 | replicas: "3" 9 | --- 10 | apiVersion: kudo.dev/v1beta1 11 | kind: Instance 12 | metadata: 13 | name: toy1 14 | status: 15 | planStatus: 16 | update: 17 | status: COMPLETE 18 | -------------------------------------------------------------------------------- /test/integration/update-parameters/02-update.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: toy1 5 | spec: 6 | parameters: 7 | Param: "long-after" 8 | -------------------------------------------------------------------------------- /test/integration/upgrade-command/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: upgrade-instance 5 | spec: 6 | operatorVersion: 7 | name: upgrade-operator-0.1.0 8 | status: 9 | planStatus: 10 | deploy: 11 | status: COMPLETE -------------------------------------------------------------------------------- /test/integration/upgrade-command/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance upgrade-instance ./first-operator 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/integration/upgrade-command/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: upgrade-instance 5 | spec: 6 | operatorVersion: 7 | name: upgrade-operator-0.2.0 8 | parameters: 9 | version: 1.7.10 10 | status: 11 | planStatus: 12 | deploy: 13 | status: COMPLETE -------------------------------------------------------------------------------- /test/integration/upgrade-command/01-upgrade.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo upgrade --instance upgrade-instance ./second-operator -p version=1.7.10 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/integration/upgrade-command/first-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "upgrade-operator" 3 | operatorVersion: "0.1.0" 4 | kubernetesVersion: 1.13 5 | maintainers: 6 | - name: Your name 7 | email: 8 | url: https://kudo.dev 9 | tasks: 10 | - name: app 11 | kind: Apply 12 | spec: 13 | resources: 14 | - configmap.yaml 15 | plans: 16 | deploy: 17 | strategy: serial 18 | phases: 19 | - name: main 20 | strategy: parallel 21 | steps: 22 | - name: everything 23 | tasks: 24 | - app 25 | -------------------------------------------------------------------------------- /test/integration/upgrade-command/first-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: version 4 | description: Version of image 5 | default: 1.7.9 6 | -------------------------------------------------------------------------------- /test/integration/upgrade-command/first-operator/templates/configmap.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: test6 5 | data: 6 | foo: bar-{{ .Params.version }} -------------------------------------------------------------------------------- /test/integration/upgrade-command/second-operator/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "upgrade-operator" 3 | operatorVersion: "0.2.0" 4 | kubernetesVersion: 1.13 5 | maintainers: 6 | - name: Your name 7 | email: 8 | url: https://kudo.dev 9 | tasks: 10 | - name: app 11 | kind: Apply 12 | spec: 13 | resources: 14 | - configmap.yaml 15 | plans: 16 | deploy: 17 | strategy: serial 18 | phases: 19 | - name: main 20 | strategy: parallel 21 | steps: 22 | - name: everything 23 | tasks: 24 | - app 25 | upgrade: 26 | strategy: serial 27 | phases: 28 | - name: upgrade 29 | strategy: parallel 30 | steps: 31 | - name: everything 32 | tasks: 33 | - app 34 | -------------------------------------------------------------------------------- /test/integration/upgrade-command/second-operator/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: version 4 | description: Version of image 5 | default: 1.7.9 6 | -------------------------------------------------------------------------------- /test/integration/upgrade-command/second-operator/templates/configmap.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: test6 5 | data: 6 | foo: bar-{{ .Params.version }} -------------------------------------------------------------------------------- /test/integration/upgrade-with-dependencies/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: operator-instance 5 | spec: 6 | operatorVersion: 7 | name: operator-1.0 8 | status: 9 | planStatus: 10 | deploy: 11 | status: COMPLETE -------------------------------------------------------------------------------- /test/integration/upgrade-with-dependencies/00-errors.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Operator 3 | metadata: 4 | name: dependency 5 | --- 6 | apiVersion: kudo.dev/v1beta1 7 | kind: OperatorVersion 8 | metadata: 9 | name: dependency-1.0 10 | -------------------------------------------------------------------------------- /test/integration/upgrade-with-dependencies/00-install.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo install --instance operator-instance ./operator-1.0 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/integration/upgrade-with-dependencies/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: operator-instance 5 | spec: 6 | operatorVersion: 7 | name: operator-2.0 8 | status: 9 | planStatus: 10 | upgrade: 11 | status: COMPLETE 12 | --- 13 | apiVersion: kudo.dev/v1beta1 14 | kind: Operator 15 | metadata: 16 | name: dependency 17 | --- 18 | apiVersion: kudo.dev/v1beta1 19 | kind: OperatorVersion 20 | metadata: 21 | name: dependency-1.0 22 | -------------------------------------------------------------------------------- /test/integration/upgrade-with-dependencies/01-upgrade.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo upgrade --instance operator-instance ./operator-2.0 5 | namespaced: true 6 | -------------------------------------------------------------------------------- /test/integration/upgrade-with-dependencies/dependency/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: dependency 3 | operatorVersion: "1.0" 4 | kubernetesVersion: 1.15.0 5 | maintainers: 6 | - name: nfnt 7 | email: 8 | url: https://kudo.dev 9 | tasks: 10 | - name: deploy 11 | kind: Dummy 12 | spec: 13 | done: true 14 | wantErr: false 15 | plans: 16 | deploy: 17 | strategy: serial 18 | phases: 19 | - name: main 20 | strategy: parallel 21 | steps: 22 | - name: deploy 23 | tasks: 24 | - deploy 25 | -------------------------------------------------------------------------------- /test/integration/upgrade-with-dependencies/dependency/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: deploy 4 | description: Triggers the deploy plan 5 | default: 1 6 | trigger: deploy 7 | -------------------------------------------------------------------------------- /test/integration/upgrade-with-dependencies/operator-1.0/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: operator 3 | operatorVersion: "1.0" 4 | kubernetesVersion: 1.15.0 5 | maintainers: 6 | - name: nfnt 7 | email: 8 | url: https://kudo.dev 9 | tasks: 10 | - name: deploy 11 | kind: Dummy 12 | spec: 13 | done: true 14 | wantErr: false 15 | plans: 16 | deploy: 17 | strategy: serial 18 | phases: 19 | - name: main 20 | strategy: parallel 21 | steps: 22 | - name: deploy 23 | tasks: 24 | - deploy 25 | -------------------------------------------------------------------------------- /test/integration/upgrade-with-dependencies/operator-1.0/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: deploy 4 | description: Triggers the deploy plan 5 | default: 1 6 | trigger: deploy 7 | -------------------------------------------------------------------------------- /test/integration/upgrade-with-dependencies/operator-2.0/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: operator 3 | operatorVersion: "2.0" 4 | kubernetesVersion: 1.15.0 5 | maintainers: 6 | - name: nfnt 7 | email: 8 | url: https://kudo.dev 9 | tasks: 10 | - name: dependency 11 | kind: KudoOperator 12 | spec: 13 | package: "../dependency" 14 | operatorVersion: "1.0" 15 | 16 | plans: 17 | upgrade: 18 | strategy: serial 19 | phases: 20 | - name: main 21 | strategy: parallel 22 | steps: 23 | - name: deploy 24 | tasks: 25 | - dependency -------------------------------------------------------------------------------- /test/integration/upgrade-with-dependencies/operator-2.0/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: deploy 4 | description: Triggers the deploy plan 5 | default: 1 6 | trigger: deploy 7 | -------------------------------------------------------------------------------- /test/kudo-e2e-test.yaml.tmpl: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestSuite 3 | testDirs: 4 | - ./test/e2e 5 | commands: 6 | - command: ./bin/kubectl-kudo init --wait --unsafe-self-signed-webhook-ca --kudo-image kudobuilder/controller:%version% --kudo-image-pull-policy Never 7 | startKIND: true 8 | kindContainers: 9 | - kudobuilder/controller:%version% 10 | kindConfig: ./test/e2e/kind-config.yaml 11 | timeout: 300 12 | skipDelete: true 13 | artifactsDir: reports/kind-logs -------------------------------------------------------------------------------- /test/kudo-integration-test.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestSuite 3 | crdDir: ./config/crds/ 4 | manifestDirs: 5 | - ./test/manifests/ 6 | testDirs: 7 | - ./test/integration 8 | commands: 9 | - command: |- 10 | sh -c ' 11 | KUDO_CERT_DIR="./test/cert" ./bin/manager 12 | ' 13 | background: true 14 | - command: sleep 5 15 | startControlPlane: true 16 | parallel: 4 17 | artifactsDir: reports/kind-logs -------------------------------------------------------------------------------- /test/kudo-upgrade-test.yaml.tmpl: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestSuite 3 | testDirs: 4 | - ./test/upgrade 5 | startKIND: true 6 | kindContainers: 7 | - kudobuilder/controller:%version% 8 | timeout: 300 9 | parallel: 1 10 | artifactsDir: reports/kind-logs -------------------------------------------------------------------------------- /test/upgrade/cert-manager-detection/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apiextensions.k8s.io/v1 2 | kind: CustomResourceDefinition 3 | metadata: 4 | name: issuers.cert-manager.io 5 | spec: 6 | versions: 7 | - name: v1alpha2 8 | - name: v1alpha3 9 | - name: v1beta1 10 | --- 11 | apiVersion: apps/v1 12 | kind: Deployment 13 | metadata: 14 | name: cert-manager-webhook 15 | namespace: cert-manager 16 | status: 17 | readyReplicas: 1 18 | --- 19 | apiVersion: v1 20 | kind: Secret 21 | metadata: 22 | name: cert-manager-webhook-ca 23 | namespace: cert-manager 24 | -------------------------------------------------------------------------------- /test/upgrade/cert-manager-detection/00-install-cert-manager-0-16-0.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl apply --validate=false -f cert-manager/cert-manager-0.16.0.yaml -------------------------------------------------------------------------------- /test/upgrade/cert-manager-detection/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: cert-manager.io/v1beta1 2 | kind: Issuer 3 | metadata: 4 | name: selfsigned-issuer 5 | namespace: kudo-system 6 | --- 7 | apiVersion: cert-manager.io/v1beta1 8 | kind: Certificate 9 | metadata: 10 | name: kudo-webhook-server-certificate 11 | namespace: kudo-system -------------------------------------------------------------------------------- /test/upgrade/cert-manager-detection/01-install-kudo.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: sleep 10 5 | - command: kubectl kudo init -v 4 --kudo-image kudobuilder/controller:test --kudo-image-pull-policy IfNotPresent --wait -------------------------------------------------------------------------------- /test/upgrade/cert-manager-detection/02-errors.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apiextensions.k8s.io/v1beta1 2 | kind: CustomResourceDefinition 3 | metadata: 4 | name: instances.kudo.dev 5 | spec: 6 | group: kudo.dev 7 | names: 8 | kind: Instance 9 | --- 10 | apiVersion: apiextensions.k8s.io/v1beta1 11 | kind: CustomResourceDefinition 12 | metadata: 13 | name: operators.kudo.dev 14 | spec: 15 | group: kudo.dev 16 | names: 17 | kind: Operator 18 | --- 19 | apiVersion: apiextensions.k8s.io/v1beta1 20 | kind: CustomResourceDefinition 21 | metadata: 22 | name: operatorversions.kudo.dev 23 | spec: 24 | group: kudo.dev 25 | names: 26 | kind: OperatorVersion 27 | -------------------------------------------------------------------------------- /test/upgrade/cert-manager-detection/02-remove-kudo.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - script: kubectl kudo init --upgrade --kudo-image kudobuilder/controller:test --kudo-image-pull-policy IfNotPresent --dry-run --output yaml | tee output.log | kubectl delete -f - -------------------------------------------------------------------------------- /test/upgrade/cert-manager-detection/03-errors.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apiextensions.k8s.io/v1 2 | kind: CustomResourceDefinition 3 | metadata: 4 | name: issuers.cert-manager.io 5 | spec: 6 | versions: 7 | - name: v1alpha2 8 | - name: v1alpha3 9 | - name: v1beta1 10 | --- 11 | apiVersion: apps/v1 12 | kind: Deployment 13 | metadata: 14 | name: cert-manager-webhook 15 | namespace: cert-manager 16 | status: 17 | readyReplicas: 1 18 | --- 19 | apiVersion: v1 20 | kind: Secret 21 | metadata: 22 | name: cert-manager-webhook-ca 23 | namespace: cert-manager -------------------------------------------------------------------------------- /test/upgrade/cert-manager-detection/03-uninstall-cert-manager-0-16-0.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl delete -f cert-manager/cert-manager-0.16.0.yaml -------------------------------------------------------------------------------- /test/upgrade/cert-manager-detection/05-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apiextensions.k8s.io/v1 2 | kind: CustomResourceDefinition 3 | metadata: 4 | name: issuers.cert-manager.io 5 | spec: 6 | versions: 7 | - name: v1alpha2 8 | - name: v1alpha3 9 | - name: v1beta1 10 | - name: v1 11 | --- 12 | apiVersion: apps/v1 13 | kind: Deployment 14 | metadata: 15 | name: cert-manager-webhook 16 | namespace: cert-manager 17 | status: 18 | readyReplicas: 1 19 | --- 20 | apiVersion: v1 21 | kind: Secret 22 | metadata: 23 | name: cert-manager-webhook-ca 24 | namespace: cert-manager -------------------------------------------------------------------------------- /test/upgrade/cert-manager-detection/05-install-cert-manager-1-0-3.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl apply --validate=false -f cert-manager/cert-manager-1.0.3.yaml -------------------------------------------------------------------------------- /test/upgrade/cert-manager-detection/06-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: cert-manager.io/v1 2 | kind: Issuer 3 | metadata: 4 | name: selfsigned-issuer 5 | namespace: kudo-system 6 | --- 7 | apiVersion: cert-manager.io/v1 8 | kind: Certificate 9 | metadata: 10 | name: kudo-webhook-server-certificate 11 | namespace: kudo-system -------------------------------------------------------------------------------- /test/upgrade/cert-manager-detection/06-install-kudo.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: sleep 20 5 | - command: kubectl kudo init -v 4 --kudo-image kudobuilder/controller:test --kudo-image-pull-policy IfNotPresent --wait -------------------------------------------------------------------------------- /test/upgrade/cert-manager-detection/99-errors.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apiextensions.k8s.io/v1beta1 2 | kind: CustomResourceDefinition 3 | metadata: 4 | name: instances.kudo.dev 5 | spec: 6 | group: kudo.dev 7 | names: 8 | kind: Instance 9 | --- 10 | apiVersion: apiextensions.k8s.io/v1beta1 11 | kind: CustomResourceDefinition 12 | metadata: 13 | name: operators.kudo.dev 14 | spec: 15 | group: kudo.dev 16 | names: 17 | kind: Operator 18 | --- 19 | apiVersion: apiextensions.k8s.io/v1beta1 20 | kind: CustomResourceDefinition 21 | metadata: 22 | name: operatorversions.kudo.dev 23 | spec: 24 | group: kudo.dev 25 | names: 26 | kind: OperatorVersion 27 | -------------------------------------------------------------------------------- /test/upgrade/cert-manager-detection/99-remove-kudo.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - script: kubectl kudo init --upgrade --kudo-image kudobuilder/controller:test --kudo-image-pull-policy IfNotPresent --dry-run --output yaml | tee output.log | kubectl delete -f - -------------------------------------------------------------------------------- /test/upgrade/upgrade-to-current/00-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: StatefulSet 3 | metadata: 4 | labels: 5 | app: kudo-manager 6 | control-plane: controller-manager 7 | name: kudo-controller-manager 8 | namespace: kudo-system 9 | spec: 10 | template: 11 | spec: 12 | containers: 13 | - image: kudobuilder/controller:v0.11.1 -------------------------------------------------------------------------------- /test/upgrade/upgrade-to-current/00-install-old-kudo.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: ./download-kudo.sh 0.11.1 5 | - command: ./old-kudo init --wait 6 | -------------------------------------------------------------------------------- /test/upgrade/upgrade-to-current/01-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | kind: Instance 3 | metadata: 4 | name: simple-op 5 | spec: 6 | operatorVersion: 7 | name: simple-op-0.1.0 8 | status: 9 | planStatus: 10 | deploy: 11 | status: COMPLETE 12 | --- 13 | apiVersion: kudo.dev/v1beta1 14 | kind: OperatorVersion 15 | metadata: 16 | name: simple-op-0.1.0 17 | spec: 18 | appVersion: 1.2.3 19 | version: 0.1.0 20 | operator: 21 | name: simple-op 22 | --- 23 | apiVersion: apps/v1 24 | kind: Deployment 25 | metadata: 26 | name: nginx-deployment 27 | spec: 28 | replicas: 2 -------------------------------------------------------------------------------- /test/upgrade/upgrade-to-current/01-install-operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: ./old-kudo install --instance simple-op ./simple-op-0.1.0 5 | namespaced: true -------------------------------------------------------------------------------- /test/upgrade/upgrade-to-current/02-assert.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: StatefulSet 3 | metadata: 4 | labels: 5 | app: kudo-manager 6 | control-plane: controller-manager 7 | name: kudo-controller-manager 8 | namespace: kudo-system 9 | spec: 10 | template: 11 | spec: 12 | containers: 13 | - image: kudobuilder/controller:test 14 | --- 15 | # Assert that the operator names are still the same as before 16 | apiVersion: kudo.dev/v1beta1 17 | kind: OperatorVersion 18 | metadata: 19 | name: simple-op-0.1.0 20 | spec: 21 | version: 0.1.0 22 | appVersion: 1.2.3 23 | operator: 24 | kind: Operator 25 | name: simple-op 26 | --- 27 | # Assert that the operator names are still the same as before 28 | apiVersion: kudo.dev/v1beta1 29 | kind: Instance 30 | metadata: 31 | name: simple-op 32 | spec: 33 | operatorVersion: 34 | name: simple-op-0.1.0 -------------------------------------------------------------------------------- /test/upgrade/upgrade-to-current/02-upgrade-kudo.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo init -v 4 --upgrade --kudo-image kudobuilder/controller:test --kudo-image-pull-policy IfNotPresent --unsafe-self-signed-webhook-ca --wait -------------------------------------------------------------------------------- /test/upgrade/upgrade-to-current/03-assert.yaml: -------------------------------------------------------------------------------- 1 | # Assert that the operator names are still the same as before 2 | apiVersion: kudo.dev/v1beta1 3 | kind: OperatorVersion 4 | metadata: 5 | name: simple-op-1.2.3-0.2.0 6 | spec: 7 | version: 0.2.0 8 | appVersion: 1.2.3 9 | operator: 10 | kind: Operator 11 | name: simple-op 12 | --- 13 | apiVersion: kudo.dev/v1beta1 14 | kind: Instance 15 | metadata: 16 | name: simple-op 17 | spec: 18 | operatorVersion: 19 | name: simple-op-1.2.3-0.2.0 20 | status: 21 | planStatus: 22 | deploy: 23 | status: COMPLETE 24 | --- 25 | apiVersion: apps/v1 26 | kind: Deployment 27 | metadata: 28 | name: nginx-deployment 29 | spec: 30 | replicas: 1 31 | template: 32 | metadata: 33 | labels: 34 | fixedLabel: fixedvalue -------------------------------------------------------------------------------- /test/upgrade/upgrade-to-current/03-upgrade-operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - command: kubectl kudo upgrade ./simple-op-0.2.0 --instance simple-op -p replicas=1 -p unchangeable=fixedvalue 5 | namespaced: true -------------------------------------------------------------------------------- /test/upgrade/upgrade-to-current/99-errors.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apiextensions.k8s.io/v1beta1 2 | kind: CustomResourceDefinition 3 | metadata: 4 | name: instances.kudo.dev 5 | spec: 6 | group: kudo.dev 7 | names: 8 | kind: Instance 9 | --- 10 | apiVersion: apiextensions.k8s.io/v1beta1 11 | kind: CustomResourceDefinition 12 | metadata: 13 | name: operators.kudo.dev 14 | spec: 15 | group: kudo.dev 16 | names: 17 | kind: Operator 18 | --- 19 | apiVersion: apiextensions.k8s.io/v1beta1 20 | kind: CustomResourceDefinition 21 | metadata: 22 | name: operatorversions.kudo.dev 23 | spec: 24 | group: kudo.dev 25 | names: 26 | kind: OperatorVersion 27 | -------------------------------------------------------------------------------- /test/upgrade/upgrade-to-current/99-remove-kudo.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kuttl.dev/v1beta1 2 | kind: TestStep 3 | commands: 4 | - script: kubectl kudo init --upgrade --kudo-image kudobuilder/controller:test --kudo-image-pull-policy IfNotPresent --unsafe-self-signed-webhook-ca --dry-run --output yaml | tee output.log | kubectl delete -f - -------------------------------------------------------------------------------- /test/upgrade/upgrade-to-current/download-kudo.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | PREV_KUDO_VERSION=$1 4 | 5 | echo "Downloading KUDO v${PREV_KUDO_VERSION}" 6 | 7 | # Download previous KUDO version for upgrade testing 8 | if [[ "$(uname)" == "Darwin" ]]; then 9 | curl -L https://github.com/kudobuilder/kudo/releases/download/v${PREV_KUDO_VERSION}/kubectl-kudo_${PREV_KUDO_VERSION}_darwin_x86_64 --output old-kudo 10 | elif [[ "$(expr substr $(uname -s) 1 5)" == "Linux" ]]; then 11 | curl -L https://github.com/kudobuilder/kudo/releases/download/v${PREV_KUDO_VERSION}/kubectl-kudo_${PREV_KUDO_VERSION}_linux_x86_64 --output old-kudo 12 | fi 13 | 14 | chmod +x old-kudo -------------------------------------------------------------------------------- /test/upgrade/upgrade-to-current/simple-op-0.1.0/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "simple-op" 3 | operatorVersion: "0.1.0" 4 | appVersion: "1.2.3" 5 | kubernetesVersion: 1.13.0 6 | maintainers: 7 | - name: Your name 8 | email: 9 | url: https://kudo.dev 10 | tasks: 11 | - name: app 12 | kind: Apply 13 | spec: 14 | resources: 15 | - deployment.yaml 16 | plans: 17 | deploy: 18 | strategy: serial 19 | phases: 20 | - name: main 21 | strategy: parallel 22 | steps: 23 | - name: everything 24 | tasks: 25 | - app -------------------------------------------------------------------------------- /test/upgrade/upgrade-to-current/simple-op-0.1.0/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: replicas 4 | description: Number of replicas that should be run as part of the deployment 5 | default: 2 -------------------------------------------------------------------------------- /test/upgrade/upgrade-to-current/simple-op-0.1.0/templates/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | selector: 7 | matchLabels: 8 | app: nginx 9 | replicas: {{ .Params.replicas }} # tells deployment to run 2 pods matching the template 10 | template: 11 | metadata: 12 | labels: 13 | app: nginx 14 | spec: 15 | containers: 16 | - name: nginx 17 | image: nginx:1.7.9 18 | ports: 19 | - containerPort: 80 -------------------------------------------------------------------------------- /test/upgrade/upgrade-to-current/simple-op-0.2.0/operator.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | name: "simple-op" 3 | operatorVersion: "0.2.0" 4 | appVersion: "1.2.3" 5 | kubernetesVersion: 1.15.0 6 | maintainers: 7 | - name: Your name 8 | email: 9 | url: https://kudo.dev 10 | tasks: 11 | - name: app 12 | kind: Apply 13 | spec: 14 | resources: 15 | - deployment.yaml 16 | plans: 17 | deploy: 18 | strategy: serial 19 | phases: 20 | - name: main 21 | strategy: parallel 22 | steps: 23 | - name: everything 24 | tasks: 25 | - app -------------------------------------------------------------------------------- /test/upgrade/upgrade-to-current/simple-op-0.2.0/params.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kudo.dev/v1beta1 2 | parameters: 3 | - name: replicas 4 | description: Number of replicas that should be run as part of the deployment 5 | default: 2 6 | - name: unchangeable 7 | description: An unchangeable parameter 8 | required: true 9 | immutable: true -------------------------------------------------------------------------------- /test/upgrade/upgrade-to-current/simple-op-0.2.0/templates/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | spec: 6 | selector: 7 | matchLabels: 8 | app: nginx 9 | replicas: {{ .Params.replicas }} # tells deployment to run 2 pods matching the template 10 | template: 11 | metadata: 12 | labels: 13 | app: nginx 14 | fixedLabel: {{ .Params.unchangeable }} 15 | spec: 16 | containers: 17 | - name: nginx 18 | image: nginx:1.7.9 19 | ports: 20 | - containerPort: 80 -------------------------------------------------------------------------------- /tools.go: -------------------------------------------------------------------------------- 1 | // +build tools 2 | 3 | // Package tools is used to import go modules that we use for tooling as dependencies. 4 | // For more information, please refer to: https://github.com/go-modules-by-example/index/blob/ac9bf72/010_tools/README.md 5 | package tools 6 | 7 | import ( 8 | _ "github.com/go-bindata/go-bindata/v3/go-bindata" 9 | _ "k8s.io/code-generator/cmd/client-gen" 10 | _ "k8s.io/code-generator/cmd/deepcopy-gen" 11 | _ "k8s.io/code-generator/cmd/defaulter-gen" 12 | _ "k8s.io/code-generator/cmd/informer-gen" 13 | _ "k8s.io/code-generator/cmd/lister-gen" 14 | _ "sigs.k8s.io/controller-tools/cmd/controller-gen" 15 | ) 16 | --------------------------------------------------------------------------------