Repository: operator-framework/operator-sdk Branch: master Commit: 861d4bf353b3 Files: 941 Total size: 4.4 MB Directory structure: gitextract_zj60_vqy/ ├── .ci/ │ └── gpg/ │ ├── README.md │ ├── create-keyring.sh │ ├── pubring.auto │ └── secring.auto.gpg ├── .cncf-maintainers ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug-report.md │ │ ├── doc-report.md │ │ ├── feature-request.md │ │ └── support-question.md │ ├── ISSUE_TEMPLATE.md │ ├── PULL_REQUEST_TEMPLATE.md │ ├── dependabot.yml │ └── workflows/ │ ├── check-docs-only.sh │ ├── clean-unused-disk-space.sh │ ├── deploy.yml │ ├── freshen-images/ │ │ ├── build.sh │ │ ├── lib.sh │ │ └── tags.sh │ ├── freshen-images.yml │ ├── get_image_tags.sh │ ├── integration.yml │ ├── markdown-link-check-config.json │ ├── olm-check.yml │ ├── rerun.yml │ ├── test-go.yml │ ├── test-helm.yml │ ├── test-sample-go.yml │ └── test-sanity.yml ├── .gitignore ├── .gitmodules ├── .golangci.yml ├── .goreleaser.yml ├── CONTRIBUTING.MD ├── LICENSE ├── Makefile ├── OWNERS ├── OWNERS_ALIASES ├── README.md ├── SECURITY.md ├── changelog/ │ ├── fragments/ │ │ └── 00-template.yaml │ └── generated/ │ ├── v1.10.0.md │ ├── v1.11.0.md │ ├── v1.12.0.md │ ├── v1.13.0.md │ ├── v1.14.0.md │ ├── v1.15.0.md │ ├── v1.16.0.md │ ├── v1.17.0.md │ ├── v1.18.0.md │ ├── v1.19.0.md │ ├── v1.20.0.md │ ├── v1.21.0.md │ ├── v1.22.0.md │ ├── v1.23.0.md │ ├── v1.24.0.md │ ├── v1.25.0.md │ ├── v1.26.0.md │ ├── v1.27.0.md │ ├── v1.28.0.md │ ├── v1.29.0.md │ ├── v1.3.0.md │ ├── v1.30.0.md │ ├── v1.31.0.md │ ├── v1.32.0.md │ ├── v1.33.0.md │ ├── v1.34.0.md │ ├── v1.35.0.md │ ├── v1.36.0.md │ ├── v1.37.0.md │ ├── v1.38.0.md │ ├── v1.39.0.md │ ├── v1.39.1.md │ ├── v1.39.2.md │ ├── v1.4.0.md │ ├── v1.40.0.md │ ├── v1.41.0.md │ ├── v1.42.0.md │ ├── v1.42.1.md │ ├── v1.42.2.md │ ├── v1.5.0.md │ ├── v1.6.0.md │ ├── v1.6.1.md │ ├── v1.7.0.md │ ├── v1.7.1.md │ ├── v1.8.0.md │ └── v1.9.0.md ├── cmd/ │ ├── helm-operator/ │ │ └── main.go │ └── operator-sdk/ │ └── main.go ├── code-of-conduct.md ├── config/ │ └── crd/ │ └── bases/ │ └── _.yaml ├── go.mod ├── go.sum ├── hack/ │ ├── check-error-log-msg-format.sh │ ├── check-license.sh │ ├── check-links.sh │ ├── check-olm.sh │ ├── generate/ │ │ ├── cli-doc/ │ │ │ └── gen-cli-doc.go │ │ ├── cncf-maintainers/ │ │ │ └── main.go │ │ ├── migrate-markers.sh │ │ ├── olm_bindata.sh │ │ └── samples/ │ │ ├── generate_testdata.go │ │ └── internal/ │ │ ├── go/ │ │ │ ├── generate.go │ │ │ └── memcached-with-customization/ │ │ │ ├── e2e_test_code.go │ │ │ └── memcached_with_customization.go │ │ ├── helm/ │ │ │ ├── generate.go │ │ │ ├── memcached.go │ │ │ └── testdata/ │ │ │ └── memcached-0.0.2.tgz │ │ └── pkg/ │ │ ├── context.go │ │ └── utils.go │ ├── lib/ │ │ └── common.sh │ └── tests/ │ └── subcommand-olm-install.sh ├── images/ │ ├── custom-scorecard-tests/ │ │ ├── Dockerfile │ │ └── main.go │ ├── helm-operator/ │ │ └── Dockerfile │ ├── operator-sdk/ │ │ └── Dockerfile │ ├── scorecard-storage/ │ │ └── Dockerfile │ ├── scorecard-test/ │ │ ├── Dockerfile │ │ └── main.go │ ├── scorecard-test-kuttl/ │ │ ├── Dockerfile │ │ ├── entrypoint │ │ └── main.go │ └── scorecard-untar/ │ └── Dockerfile ├── internal/ │ ├── annotations/ │ │ ├── metrics/ │ │ │ ├── metrics.go │ │ │ ├── metrics_suite_test.go │ │ │ └── metrics_test.go │ │ └── scorecard/ │ │ └── scorecard.go │ ├── bindata/ │ │ └── olm/ │ │ ├── manifests.go │ │ └── versions.go │ ├── cmd/ │ │ ├── helm-operator/ │ │ │ ├── run/ │ │ │ │ └── cmd.go │ │ │ └── version/ │ │ │ ├── cmd.go │ │ │ ├── cmd_test.go │ │ │ └── version_suite_test.go │ │ └── operator-sdk/ │ │ ├── alpha/ │ │ │ └── config3alphato3/ │ │ │ ├── cmd.go │ │ │ ├── convert_config_3-alpha_to_3.go │ │ │ ├── convert_config_3-alpha_to_3_test.go │ │ │ └── suite_test.go │ │ ├── bundle/ │ │ │ ├── bundle_suite_test.go │ │ │ ├── cmd.go │ │ │ ├── cmd_test.go │ │ │ └── validate/ │ │ │ ├── cmd.go │ │ │ ├── cmd_suite_test.go │ │ │ ├── internal/ │ │ │ │ └── logger.go │ │ │ ├── optional.go │ │ │ ├── optional_test.go │ │ │ ├── validate.go │ │ │ └── validate_test.go │ │ ├── cleanup/ │ │ │ └── cmd.go │ │ ├── cli/ │ │ │ ├── cli.go │ │ │ ├── cli_suite_test.go │ │ │ ├── version.go │ │ │ └── version_test.go │ │ ├── generate/ │ │ │ ├── bundle/ │ │ │ │ ├── bundle.go │ │ │ │ └── cmd.go │ │ │ ├── cmd.go │ │ │ ├── internal/ │ │ │ │ ├── genutil.go │ │ │ │ ├── genutil_suite_test.go │ │ │ │ ├── manifests.go │ │ │ │ ├── manifests_test.go │ │ │ │ ├── relatedimages.go │ │ │ │ └── relatedimages_test.go │ │ │ ├── kustomize/ │ │ │ │ ├── cmd.go │ │ │ │ └── manifests.go │ │ │ └── packagemanifests/ │ │ │ ├── cmd.go │ │ │ ├── cmd_test.go │ │ │ ├── packagemanifests.go │ │ │ ├── packagemanifests_suite_test.go │ │ │ ├── packagemanifests_test.go │ │ │ └── testdata/ │ │ │ └── PROJECT │ │ ├── olm/ │ │ │ ├── cmd.go │ │ │ ├── cmd_test.go │ │ │ ├── install.go │ │ │ ├── install_test.go │ │ │ ├── olm_suite_test.go │ │ │ ├── status.go │ │ │ ├── status_test.go │ │ │ ├── uninstall.go │ │ │ └── uninstall_test.go │ │ ├── pkgmantobundle/ │ │ │ ├── cmd.go │ │ │ ├── cmd_test.go │ │ │ ├── pkgmantobundle_suite_test.go │ │ │ ├── pkgmantobundle_test.go │ │ │ └── testdata/ │ │ │ └── packagemanifests/ │ │ │ ├── 0.0.1/ │ │ │ │ ├── cache.example.com_memcacheds.yaml │ │ │ │ ├── memcached-operator-controller-manager-metrics-service_v1_service.yaml │ │ │ │ ├── memcached-operator-controller-manager_v1_serviceaccount.yaml │ │ │ │ ├── memcached-operator-manager-config_v1_configmap.yaml │ │ │ │ ├── memcached-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml │ │ │ │ ├── memcached-operator.clusterserviceversion.yaml │ │ │ │ └── scorecard-config.yaml │ │ │ ├── 0.0.2/ │ │ │ │ ├── cache.example.com_memcacheds.yaml │ │ │ │ ├── memcached-operator-controller-manager-metrics-service_v1_service.yaml │ │ │ │ ├── memcached-operator-controller-manager_v1_serviceaccount.yaml │ │ │ │ ├── memcached-operator-manager-config_v1_configmap.yaml │ │ │ │ ├── memcached-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml │ │ │ │ └── memcached-operator.clusterserviceversion.yaml │ │ │ └── memcached-operator.package.yaml │ │ ├── run/ │ │ │ ├── bundle/ │ │ │ │ └── cmd.go │ │ │ ├── bundleupgrade/ │ │ │ │ └── cmd.go │ │ │ ├── cmd.go │ │ │ ├── cmd_test.go │ │ │ ├── packagemanifests/ │ │ │ │ ├── packagemanifests.go │ │ │ │ ├── packagemanifests_suite_test.go │ │ │ │ └── packagemanifests_test.go │ │ │ └── run_suite_test.go │ │ └── scorecard/ │ │ ├── cmd.go │ │ ├── cmd_test.go │ │ ├── scorecard_suite_test.go │ │ └── xunit/ │ │ └── xunit.go │ ├── flags/ │ │ └── flags.go │ ├── generate/ │ │ ├── clusterserviceversion/ │ │ │ ├── bases/ │ │ │ │ ├── clusterserviceversion.go │ │ │ │ ├── definitions/ │ │ │ │ │ ├── ast.go │ │ │ │ │ ├── crd.go │ │ │ │ │ ├── crd_test.go │ │ │ │ │ ├── definitions.go │ │ │ │ │ ├── definitions_suite_test.go │ │ │ │ │ ├── definitions_test.go │ │ │ │ │ ├── markers.go │ │ │ │ │ ├── markers_test.go │ │ │ │ │ └── zz_generated.markerhelp.go │ │ │ │ ├── metadata.go │ │ │ │ └── metadata_test.go │ │ │ ├── clusterserviceversion.go │ │ │ ├── clusterserviceversion_suite_test.go │ │ │ ├── clusterserviceversion_test.go │ │ │ ├── clusterserviceversion_updaters.go │ │ │ └── clusterserviceversion_updaters_test.go │ │ ├── collector/ │ │ │ ├── clusterserviceversion.go │ │ │ ├── clusterserviceversion_test.go │ │ │ ├── collector_suite_test.go │ │ │ ├── filter.go │ │ │ └── manifests.go │ │ ├── internal/ │ │ │ └── genutil.go │ │ ├── packagemanifest/ │ │ │ ├── packagemanifest.go │ │ │ ├── packagemanifest_suite_test.go │ │ │ ├── packagemanifest_test.go │ │ │ └── packagemanifestfakes/ │ │ │ └── fake_generator.go │ │ └── testdata/ │ │ ├── clusterserviceversions/ │ │ │ ├── bases/ │ │ │ │ ├── memcached-operator-multiVersion.yaml │ │ │ │ ├── memcached-operator.clusterserviceversion.yaml │ │ │ │ └── with-ui-metadata.clusterserviceversion.yaml │ │ │ └── output/ │ │ │ ├── memcached-operator-multiVersion.yaml │ │ │ ├── memcached-operator.clusterserviceversion.yaml │ │ │ └── with-ui-metadata.clusterserviceversion.yaml │ │ ├── go/ │ │ │ ├── PROJECT │ │ │ ├── api/ │ │ │ │ ├── shared/ │ │ │ │ │ ├── doc.go │ │ │ │ │ └── memcached_types.go │ │ │ │ ├── v1alpha1/ │ │ │ │ │ ├── doc.go │ │ │ │ │ └── memcached_types.go │ │ │ │ └── v1alpha2/ │ │ │ │ ├── doc.go │ │ │ │ ├── dummy_types.go │ │ │ │ ├── memcached_types.go │ │ │ │ ├── memcachedrs_types.go │ │ │ │ └── motorcycle_types.go │ │ │ └── static/ │ │ │ ├── basic.multiversion.operator.yaml │ │ │ └── basic.operator.yaml │ │ └── memcached-operator.package.yaml │ ├── helm/ │ │ ├── client/ │ │ │ ├── actionconfig.go │ │ │ ├── client.go │ │ │ ├── client_test.go │ │ │ ├── doc.go │ │ │ ├── restclientgetter.go │ │ │ └── secrets_watch.go │ │ ├── controller/ │ │ │ ├── controller.go │ │ │ ├── doc.go │ │ │ ├── reconcile.go │ │ │ └── reconcile_test.go │ │ ├── flags/ │ │ │ ├── flag.go │ │ │ ├── flag_test.go │ │ │ └── suite_test.go │ │ ├── internal/ │ │ │ ├── diff/ │ │ │ │ └── diff.go │ │ │ └── types/ │ │ │ ├── doc.go │ │ │ ├── types.go │ │ │ └── types_test.go │ │ ├── manifestutil/ │ │ │ └── resource_policy.go │ │ ├── metrics/ │ │ │ └── metrics.go │ │ ├── release/ │ │ │ ├── doc.go │ │ │ ├── manager.go │ │ │ ├── manager_factory.go │ │ │ └── manager_test.go │ │ └── watches/ │ │ ├── watches.go │ │ └── watches_test.go │ ├── markers/ │ │ └── markers.go │ ├── olm/ │ │ ├── client/ │ │ │ ├── client.go │ │ │ ├── client_suite_test.go │ │ │ ├── client_test.go │ │ │ └── status.go │ │ ├── fbcutil/ │ │ │ ├── util.go │ │ │ └── util_test.go │ │ ├── installer/ │ │ │ ├── client.go │ │ │ ├── client_test.go │ │ │ ├── installer_suite_test.go │ │ │ └── manager.go │ │ └── operator/ │ │ ├── bundle/ │ │ │ └── install.go │ │ ├── bundleupgrade/ │ │ │ └── upgrade.go │ │ ├── config.go │ │ ├── helpers.go │ │ ├── install_mode.go │ │ ├── install_mode_test.go │ │ ├── operator_suite_test.go │ │ ├── packagemanifests/ │ │ │ └── install.go │ │ ├── registry/ │ │ │ ├── catalog.go │ │ │ ├── configmap/ │ │ │ │ ├── configmap.go │ │ │ │ ├── configmap_suite_test.go │ │ │ │ ├── configmap_test.go │ │ │ │ ├── deployment.go │ │ │ │ ├── deployment_test.go │ │ │ │ ├── registry.go │ │ │ │ ├── registry_test.go │ │ │ │ ├── service.go │ │ │ │ └── service_test.go │ │ │ ├── configmap.go │ │ │ ├── configmap_test.go │ │ │ ├── fbcindex/ │ │ │ │ ├── configMapWriter.go │ │ │ │ ├── fbc_registry_pod.go │ │ │ │ └── fbc_registry_pod_test.go │ │ │ ├── index/ │ │ │ │ ├── bundle_add_mode.go │ │ │ │ ├── registry_pod.go │ │ │ │ └── registry_pod_test.go │ │ │ ├── index_image.go │ │ │ ├── index_image_test.go │ │ │ ├── olm_resources.go │ │ │ ├── olm_resources_test.go │ │ │ ├── operator_installer.go │ │ │ ├── operator_installer_test.go │ │ │ └── registry_suite_test.go │ │ └── uninstall.go │ ├── plugins/ │ │ ├── helm/ │ │ │ └── v1/ │ │ │ ├── api.go │ │ │ ├── chartutil/ │ │ │ │ ├── chart.go │ │ │ │ ├── chart_test.go │ │ │ │ └── testdata/ │ │ │ │ ├── test-chart/ │ │ │ │ │ ├── .helmignore │ │ │ │ │ ├── Chart.yaml │ │ │ │ │ ├── templates/ │ │ │ │ │ │ ├── NOTES.txt │ │ │ │ │ │ ├── _helpers.tpl │ │ │ │ │ │ ├── deployment.yaml │ │ │ │ │ │ ├── ingress.yaml │ │ │ │ │ │ ├── service.yaml │ │ │ │ │ │ ├── serviceaccount.yaml │ │ │ │ │ │ └── tests/ │ │ │ │ │ │ └── test-connection.yaml │ │ │ │ │ └── values.yaml │ │ │ │ ├── test-chart-1.2.0.tgz │ │ │ │ └── test-chart-1.2.3.tgz │ │ │ ├── init.go │ │ │ ├── plugin.go │ │ │ └── scaffolds/ │ │ │ ├── api.go │ │ │ ├── doc.go │ │ │ ├── init.go │ │ │ └── internal/ │ │ │ └── templates/ │ │ │ ├── config/ │ │ │ │ ├── crd/ │ │ │ │ │ ├── crd.go │ │ │ │ │ └── kustomization.go │ │ │ │ ├── rbac/ │ │ │ │ │ ├── manager_role.go │ │ │ │ │ └── manager_role_test.go │ │ │ │ └── samples/ │ │ │ │ └── custom_resource.go │ │ │ ├── dockerfile.go │ │ │ ├── gitignore.go │ │ │ ├── makefile.go │ │ │ └── watches.go │ │ ├── manifests/ │ │ │ └── v2/ │ │ │ ├── api.go │ │ │ ├── init.go │ │ │ ├── plugin.go │ │ │ ├── templates/ │ │ │ │ └── config/ │ │ │ │ ├── manifests/ │ │ │ │ │ └── kustomization.go │ │ │ │ └── samples/ │ │ │ │ └── kustomization.go │ │ │ └── utils.go │ │ ├── plugins.go │ │ ├── scorecard/ │ │ │ └── v2/ │ │ │ ├── init.go │ │ │ └── plugin.go │ │ └── util/ │ │ ├── cleanup.go │ │ ├── legacy_keys.go │ │ └── message.go │ ├── registry/ │ │ ├── image.go │ │ ├── labels.go │ │ ├── labels_test.go │ │ ├── logger.go │ │ ├── registry_suite_test.go │ │ └── validate.go │ ├── scorecard/ │ │ ├── bundle.go │ │ ├── bundle_test.go │ │ ├── config.go │ │ ├── config_test.go │ │ ├── formatting.go │ │ ├── formatting_test.go │ │ ├── kubeclient.go │ │ ├── kubeclient_test.go │ │ ├── labels_test.go │ │ ├── run_test.go │ │ ├── scorecard.go │ │ ├── scorecard_suite_test.go │ │ ├── storage.go │ │ ├── tar.go │ │ ├── testconfigmap.go │ │ ├── testdata/ │ │ │ ├── bundle/ │ │ │ │ ├── manifests/ │ │ │ │ │ ├── cache.example.com_memcacheds_crd.yaml │ │ │ │ │ └── memcached-operator.clusterserviceversion.yaml │ │ │ │ ├── metadata/ │ │ │ │ │ └── annotations.yaml │ │ │ │ └── tests/ │ │ │ │ └── scorecard/ │ │ │ │ ├── config.yaml │ │ │ │ └── kuttl/ │ │ │ │ ├── kuttl-test.yaml │ │ │ │ └── list-pods/ │ │ │ │ ├── 00-assert.yaml │ │ │ │ └── 00-pod.yaml │ │ │ ├── generate-bundle-tarball.sh │ │ │ └── pod.yaml │ │ ├── testpod.go │ │ └── tests/ │ │ ├── basic.go │ │ ├── bundle_test.go │ │ ├── crhelper.go │ │ └── olm.go │ ├── testutils/ │ │ ├── olm.go │ │ ├── scorecard.go │ │ └── utils.go │ ├── util/ │ │ ├── bundleutil/ │ │ │ ├── bundleutil.go │ │ │ └── template.go │ │ ├── k8sutil/ │ │ │ ├── api.go │ │ │ ├── api_test.go │ │ │ ├── constants.go │ │ │ ├── k8sutil.go │ │ │ ├── k8sutil_test.go │ │ │ ├── object.go │ │ │ └── scan.go │ │ └── projutil/ │ │ ├── interactive_promt_util.go │ │ ├── interactive_promt_util_test.go │ │ ├── project_util.go │ │ └── projutil_test.go │ ├── validate/ │ │ ├── external.go │ │ ├── external_test.go │ │ ├── result.go │ │ ├── result_test.go │ │ ├── suite_test.go │ │ └── testdata/ │ │ ├── errors.sh │ │ ├── fails.sh │ │ └── passes.sh │ └── version/ │ └── version.go ├── netlify.toml ├── proposals/ │ ├── README.md │ ├── TEMPLATE.md │ ├── ansible-helm-addapi.md │ ├── ansible-operator-devex.md │ ├── ansible-operator-status.md │ ├── ansible-operator-testing.md │ ├── ansible-operator.md │ ├── automating-releases.md │ ├── cli-ux-phase1.md │ ├── helm-operator.md │ ├── hugo-doc-build.md │ ├── improve-csv-cli.md │ ├── improved-scorecard-config.md │ ├── kubebuilder-integration.md │ ├── kubernetes-1.17.md │ ├── leader-for-life.md │ ├── metering-operator-metrics.md │ ├── operator-testing-tool.md │ ├── qa-samples-proposal.md │ ├── scorecard-custom-tests-2.md │ ├── scorecard-plugin-system.md │ ├── sdk-code-annotations.md │ ├── sdk-integration-with-olm.md │ ├── tech-debt.md │ ├── tls-utilities.md │ └── upstream-osdk-features-into-controller-runtime.md ├── release/ │ ├── Makefile │ └── changelog/ │ ├── gen-changelog.go │ └── internal/ │ ├── changelog.go │ ├── changelog_test.go │ ├── fragment.go │ ├── fragment_test.go │ ├── migration_guide.go │ ├── migration_guide_test.go │ └── testdata/ │ ├── ignore/ │ │ ├── 00-template.yaml │ │ ├── more-fragments/ │ │ │ └── ignored.yaml │ │ └── non-yaml.txt │ ├── invalid_entry/ │ │ └── fragment1.yaml │ ├── invalid_yaml/ │ │ └── fragment1.yaml │ └── valid/ │ ├── fragment1.yaml │ └── fragment2.yml ├── test/ │ ├── common/ │ │ ├── sa_secret.go │ │ └── scorecard.go │ ├── e2e/ │ │ ├── go/ │ │ │ ├── cluster_test.go │ │ │ ├── local_test.go │ │ │ ├── scorecard_test.go │ │ │ └── suite_test.go │ │ └── helm/ │ │ ├── cluster_test.go │ │ ├── local_test.go │ │ ├── olm_test.go │ │ ├── scorecard_test.go │ │ └── suite_test.go │ └── integration/ │ ├── packagemanifests_test.go │ └── suite_test.go ├── testdata/ │ ├── go/ │ │ └── v4/ │ │ ├── memcached-operator/ │ │ │ ├── .devcontainer/ │ │ │ │ ├── devcontainer.json │ │ │ │ └── post-install.sh │ │ │ ├── .dockerignore │ │ │ ├── .github/ │ │ │ │ └── workflows/ │ │ │ │ ├── lint.yml │ │ │ │ ├── test-e2e.yml │ │ │ │ └── test.yml │ │ │ ├── .gitignore │ │ │ ├── .golangci.yml │ │ │ ├── Dockerfile │ │ │ ├── Makefile │ │ │ ├── PROJECT │ │ │ ├── README.md │ │ │ ├── api/ │ │ │ │ └── v1alpha1/ │ │ │ │ ├── groupversion_info.go │ │ │ │ ├── memcached_types.go │ │ │ │ └── zz_generated.deepcopy.go │ │ │ ├── bundle/ │ │ │ │ ├── manifests/ │ │ │ │ │ ├── cache.example.com_memcacheds.yaml │ │ │ │ │ ├── memcached-operator-controller-manager-metrics-monitor_monitoring.coreos.com_v1_servicemonitor.yaml │ │ │ │ │ ├── memcached-operator-controller-manager-metrics-service_v1_service.yaml │ │ │ │ │ ├── memcached-operator-memcached-admin-role_rbac.authorization.k8s.io_v1_clusterrole.yaml │ │ │ │ │ ├── memcached-operator-memcached-editor-role_rbac.authorization.k8s.io_v1_clusterrole.yaml │ │ │ │ │ ├── memcached-operator-memcached-viewer-role_rbac.authorization.k8s.io_v1_clusterrole.yaml │ │ │ │ │ ├── memcached-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml │ │ │ │ │ ├── memcached-operator-webhook-service_v1_service.yaml │ │ │ │ │ └── memcached-operator.clusterserviceversion.yaml │ │ │ │ ├── metadata/ │ │ │ │ │ └── annotations.yaml │ │ │ │ └── tests/ │ │ │ │ └── scorecard/ │ │ │ │ └── config.yaml │ │ │ ├── bundle.Dockerfile │ │ │ ├── cmd/ │ │ │ │ └── main.go │ │ │ ├── config/ │ │ │ │ ├── certmanager/ │ │ │ │ │ ├── certificate-metrics.yaml │ │ │ │ │ ├── certificate-webhook.yaml │ │ │ │ │ ├── issuer.yaml │ │ │ │ │ ├── kustomization.yaml │ │ │ │ │ └── kustomizeconfig.yaml │ │ │ │ ├── crd/ │ │ │ │ │ ├── bases/ │ │ │ │ │ │ └── cache.example.com_memcacheds.yaml │ │ │ │ │ ├── kustomization.yaml │ │ │ │ │ └── kustomizeconfig.yaml │ │ │ │ ├── default/ │ │ │ │ │ ├── cert_metrics_manager_patch.yaml │ │ │ │ │ ├── kustomization.yaml │ │ │ │ │ ├── manager_metrics_patch.yaml │ │ │ │ │ ├── manager_webhook_patch.yaml │ │ │ │ │ └── metrics_service.yaml │ │ │ │ ├── manager/ │ │ │ │ │ ├── kustomization.yaml │ │ │ │ │ └── manager.yaml │ │ │ │ ├── manifests/ │ │ │ │ │ ├── bases/ │ │ │ │ │ │ └── memcached-operator.clusterserviceversion.yaml │ │ │ │ │ └── kustomization.yaml │ │ │ │ ├── network-policy/ │ │ │ │ │ ├── allow-metrics-traffic.yaml │ │ │ │ │ ├── allow-webhook-traffic.yaml │ │ │ │ │ └── kustomization.yaml │ │ │ │ ├── prometheus/ │ │ │ │ │ ├── kustomization.yaml │ │ │ │ │ ├── monitor.yaml │ │ │ │ │ └── monitor_tls_patch.yaml │ │ │ │ ├── rbac/ │ │ │ │ │ ├── kustomization.yaml │ │ │ │ │ ├── leader_election_role.yaml │ │ │ │ │ ├── leader_election_role_binding.yaml │ │ │ │ │ ├── memcached_admin_role.yaml │ │ │ │ │ ├── memcached_editor_role.yaml │ │ │ │ │ ├── memcached_viewer_role.yaml │ │ │ │ │ ├── metrics_auth_role.yaml │ │ │ │ │ ├── metrics_auth_role_binding.yaml │ │ │ │ │ ├── metrics_reader_role.yaml │ │ │ │ │ ├── role.yaml │ │ │ │ │ ├── role_binding.yaml │ │ │ │ │ └── service_account.yaml │ │ │ │ ├── samples/ │ │ │ │ │ ├── cache_v1alpha1_memcached.yaml │ │ │ │ │ └── kustomization.yaml │ │ │ │ ├── scorecard/ │ │ │ │ │ ├── bases/ │ │ │ │ │ │ └── config.yaml │ │ │ │ │ ├── kustomization.yaml │ │ │ │ │ └── patches/ │ │ │ │ │ ├── basic.config.yaml │ │ │ │ │ └── olm.config.yaml │ │ │ │ └── webhook/ │ │ │ │ ├── kustomization.yaml │ │ │ │ ├── kustomizeconfig.yaml │ │ │ │ ├── manifests.yaml │ │ │ │ └── service.yaml │ │ │ ├── go.mod │ │ │ ├── go.sum │ │ │ ├── hack/ │ │ │ │ └── boilerplate.go.txt │ │ │ ├── internal/ │ │ │ │ ├── controller/ │ │ │ │ │ ├── memcached_controller.go │ │ │ │ │ ├── memcached_controller_test.go │ │ │ │ │ └── suite_test.go │ │ │ │ └── webhook/ │ │ │ │ └── v1alpha1/ │ │ │ │ ├── memcached_webhook.go │ │ │ │ ├── memcached_webhook_test.go │ │ │ │ └── webhook_suite_test.go │ │ │ └── test/ │ │ │ ├── e2e/ │ │ │ │ ├── e2e_suite_test.go │ │ │ │ └── e2e_test.go │ │ │ └── utils/ │ │ │ └── utils.go │ │ └── monitoring/ │ │ └── memcached-operator/ │ │ ├── .devcontainer/ │ │ │ ├── devcontainer.json │ │ │ └── post-install.sh │ │ ├── .dockerignore │ │ ├── .github/ │ │ │ └── workflows/ │ │ │ ├── lint.yml │ │ │ ├── test-e2e.yml │ │ │ └── test.yml │ │ ├── .gitignore │ │ ├── .golangci.yml │ │ ├── Dockerfile │ │ ├── Makefile │ │ ├── PROJECT │ │ ├── README.md │ │ ├── api/ │ │ │ └── v1alpha1/ │ │ │ ├── groupversion_info.go │ │ │ ├── memcached_types.go │ │ │ └── zz_generated.deepcopy.go │ │ ├── bundle/ │ │ │ ├── manifests/ │ │ │ │ ├── cache.example.com_memcacheds.yaml │ │ │ │ ├── memcached-operator-controller-manager-metrics-monitor_monitoring.coreos.com_v1_servicemonitor.yaml │ │ │ │ ├── memcached-operator-controller-manager-metrics-service_v1_service.yaml │ │ │ │ ├── memcached-operator-memcached-admin-role_rbac.authorization.k8s.io_v1_clusterrole.yaml │ │ │ │ ├── memcached-operator-memcached-editor-role_rbac.authorization.k8s.io_v1_clusterrole.yaml │ │ │ │ ├── memcached-operator-memcached-viewer-role_rbac.authorization.k8s.io_v1_clusterrole.yaml │ │ │ │ ├── memcached-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml │ │ │ │ ├── memcached-operator-prometheus-role-binding_rbac.authorization.k8s.io_v1_rolebinding.yaml │ │ │ │ ├── memcached-operator-prometheus-role_rbac.authorization.k8s.io_v1_role.yaml │ │ │ │ ├── memcached-operator-webhook-service_v1_service.yaml │ │ │ │ └── memcached-operator.clusterserviceversion.yaml │ │ │ ├── metadata/ │ │ │ │ └── annotations.yaml │ │ │ └── tests/ │ │ │ └── scorecard/ │ │ │ └── config.yaml │ │ ├── bundle.Dockerfile │ │ ├── cmd/ │ │ │ └── main.go │ │ ├── config/ │ │ │ ├── certmanager/ │ │ │ │ ├── certificate-metrics.yaml │ │ │ │ ├── certificate-webhook.yaml │ │ │ │ ├── issuer.yaml │ │ │ │ ├── kustomization.yaml │ │ │ │ └── kustomizeconfig.yaml │ │ │ ├── crd/ │ │ │ │ ├── bases/ │ │ │ │ │ └── cache.example.com_memcacheds.yaml │ │ │ │ ├── kustomization.yaml │ │ │ │ └── kustomizeconfig.yaml │ │ │ ├── default/ │ │ │ │ ├── cert_metrics_manager_patch.yaml │ │ │ │ ├── kustomization.yaml │ │ │ │ ├── manager_metrics_patch.yaml │ │ │ │ ├── manager_webhook_patch.yaml │ │ │ │ └── metrics_service.yaml │ │ │ ├── manager/ │ │ │ │ ├── kustomization.yaml │ │ │ │ └── manager.yaml │ │ │ ├── manifests/ │ │ │ │ ├── bases/ │ │ │ │ │ └── memcached-operator.clusterserviceversion.yaml │ │ │ │ └── kustomization.yaml │ │ │ ├── network-policy/ │ │ │ │ ├── allow-metrics-traffic.yaml │ │ │ │ ├── allow-webhook-traffic.yaml │ │ │ │ └── kustomization.yaml │ │ │ ├── prometheus/ │ │ │ │ ├── kustomization.yaml │ │ │ │ ├── monitor.yaml │ │ │ │ └── monitor_tls_patch.yaml │ │ │ ├── rbac/ │ │ │ │ ├── kustomization.yaml │ │ │ │ ├── leader_election_role.yaml │ │ │ │ ├── leader_election_role_binding.yaml │ │ │ │ ├── memcached_admin_role.yaml │ │ │ │ ├── memcached_editor_role.yaml │ │ │ │ ├── memcached_viewer_role.yaml │ │ │ │ ├── metrics_auth_role.yaml │ │ │ │ ├── metrics_auth_role_binding.yaml │ │ │ │ ├── metrics_reader_role.yaml │ │ │ │ ├── prometheus_role.yaml │ │ │ │ ├── prometheus_role_binding.yaml │ │ │ │ ├── role.yaml │ │ │ │ ├── role_binding.yaml │ │ │ │ └── service_account.yaml │ │ │ ├── samples/ │ │ │ │ ├── cache_v1alpha1_memcached.yaml │ │ │ │ └── kustomization.yaml │ │ │ ├── scorecard/ │ │ │ │ ├── bases/ │ │ │ │ │ └── config.yaml │ │ │ │ ├── kustomization.yaml │ │ │ │ └── patches/ │ │ │ │ ├── basic.config.yaml │ │ │ │ └── olm.config.yaml │ │ │ └── webhook/ │ │ │ ├── kustomization.yaml │ │ │ ├── kustomizeconfig.yaml │ │ │ ├── manifests.yaml │ │ │ └── service.yaml │ │ ├── docs/ │ │ │ └── monitoring/ │ │ │ ├── metrics.md │ │ │ └── runbooks/ │ │ │ ├── memcachedDeploymentSizeUndesired.md │ │ │ └── memcachedOperatorDown.md │ │ ├── go.mod │ │ ├── go.sum │ │ ├── hack/ │ │ │ └── boilerplate.go.txt │ │ ├── internal/ │ │ │ ├── controller/ │ │ │ │ ├── memcached_controller.go │ │ │ │ ├── memcached_controller_test.go │ │ │ │ └── suite_test.go │ │ │ └── webhook/ │ │ │ └── v1alpha1/ │ │ │ ├── memcached_webhook.go │ │ │ ├── memcached_webhook_test.go │ │ │ └── webhook_suite_test.go │ │ ├── monitoring/ │ │ │ ├── alerts.go │ │ │ ├── metrics.go │ │ │ ├── metricsdocs/ │ │ │ │ └── metricsdocs.go │ │ │ └── prom-rule-ci/ │ │ │ ├── prom-rules-tests.yaml │ │ │ ├── rule-spec-dumper.go │ │ │ └── verify-rules.sh │ │ └── test/ │ │ ├── e2e/ │ │ │ ├── e2e_suite_test.go │ │ │ └── e2e_test.go │ │ └── utils/ │ │ └── utils.go │ └── helm/ │ └── memcached-operator/ │ ├── .gitignore │ ├── Dockerfile │ ├── Makefile │ ├── PROJECT │ ├── bundle/ │ │ ├── manifests/ │ │ │ ├── cache.example.com_memcacheds.yaml │ │ │ ├── memcached-operator-controller-manager-metrics-monitor_monitoring.coreos.com_v1_servicemonitor.yaml │ │ │ ├── memcached-operator-controller-manager-metrics-service_v1_service.yaml │ │ │ ├── memcached-operator-memcached-admin-role_rbac.authorization.k8s.io_v1_clusterrole.yaml │ │ │ ├── memcached-operator-memcached-editor-role_rbac.authorization.k8s.io_v1_clusterrole.yaml │ │ │ ├── memcached-operator-memcached-viewer-role_rbac.authorization.k8s.io_v1_clusterrole.yaml │ │ │ ├── memcached-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml │ │ │ └── memcached-operator.clusterserviceversion.yaml │ │ ├── metadata/ │ │ │ └── annotations.yaml │ │ └── tests/ │ │ └── scorecard/ │ │ └── config.yaml │ ├── bundle.Dockerfile │ ├── config/ │ │ ├── crd/ │ │ │ ├── bases/ │ │ │ │ └── cache.example.com_memcacheds.yaml │ │ │ └── kustomization.yaml │ │ ├── default/ │ │ │ ├── kustomization.yaml │ │ │ ├── manager_metrics_patch.yaml │ │ │ └── metrics_service.yaml │ │ ├── manager/ │ │ │ ├── kustomization.yaml │ │ │ └── manager.yaml │ │ ├── manifests/ │ │ │ ├── bases/ │ │ │ │ └── memcached-operator.clusterserviceversion.yaml │ │ │ └── kustomization.yaml │ │ ├── network-policy/ │ │ │ ├── allow-metrics-traffic.yaml │ │ │ └── kustomization.yaml │ │ ├── prometheus/ │ │ │ ├── kustomization.yaml │ │ │ └── monitor.yaml │ │ ├── rbac/ │ │ │ ├── kustomization.yaml │ │ │ ├── leader_election_role.yaml │ │ │ ├── leader_election_role_binding.yaml │ │ │ ├── memcached_admin_role.yaml │ │ │ ├── memcached_editor_role.yaml │ │ │ ├── memcached_viewer_role.yaml │ │ │ ├── metrics_auth_role.yaml │ │ │ ├── metrics_auth_role_binding.yaml │ │ │ ├── metrics_reader_role.yaml │ │ │ ├── role.yaml │ │ │ ├── role_binding.yaml │ │ │ └── service_account.yaml │ │ ├── samples/ │ │ │ ├── cache_v1alpha1_memcached.yaml │ │ │ └── kustomization.yaml │ │ └── scorecard/ │ │ ├── bases/ │ │ │ └── config.yaml │ │ ├── kustomization.yaml │ │ └── patches/ │ │ ├── basic.config.yaml │ │ └── olm.config.yaml │ ├── helm-charts/ │ │ └── memcached/ │ │ ├── .helmignore │ │ ├── Chart.yaml │ │ ├── README.md │ │ ├── templates/ │ │ │ ├── NOTES.txt │ │ │ ├── _helpers.tpl │ │ │ ├── pdb.yaml │ │ │ ├── statefulset.yaml │ │ │ └── svc.yaml │ │ └── values.yaml │ └── watches.yaml ├── tools/ │ ├── scripts/ │ │ └── fetch │ └── tools.go └── website/ ├── assets/ │ └── scss/ │ ├── _breadcrumb.scss │ ├── _docs.scss │ ├── _footer.scss │ ├── _functions.scss │ ├── _global.scss │ ├── _header.scss │ ├── _homepage.scss │ ├── _reset.scss │ ├── _sidebar-tree.scss │ ├── _styles_project.scss │ ├── _type.scss │ └── _variables.scss ├── config.toml ├── content/ │ └── en/ │ ├── _index.html │ ├── build/ │ │ └── _index.html │ ├── community/ │ │ └── _index.md │ ├── docs/ │ │ ├── _index.md │ │ ├── advanced-topics/ │ │ │ ├── _index.md │ │ │ ├── custom-bundle-validation.md │ │ │ ├── multi-arch.md │ │ │ └── multi-sa.md │ │ ├── best-practices/ │ │ │ ├── _index.md │ │ │ ├── best-practices.md │ │ │ ├── common-recommendation.md │ │ │ ├── designing-lean-operators.md │ │ │ ├── managing-resources.md │ │ │ ├── multi-tenancy.md │ │ │ ├── observability-best-practices.md │ │ │ ├── pod-security-standards.md │ │ │ └── resource-pruning.md │ │ ├── building-operators/ │ │ │ ├── _index.md │ │ │ ├── ansible/ │ │ │ │ ├── OWNERS │ │ │ │ ├── _index.md │ │ │ │ ├── development-tips.md │ │ │ │ ├── installation.md │ │ │ │ ├── migration.md │ │ │ │ ├── quickstart.md │ │ │ │ ├── reference/ │ │ │ │ │ ├── _index.md │ │ │ │ │ ├── advanced_options.md │ │ │ │ │ ├── ansible-base-images.md │ │ │ │ │ ├── dependent-watches.md │ │ │ │ │ ├── finalizers.md │ │ │ │ │ ├── information-flow-ansible-operator.md │ │ │ │ │ ├── internal_metrics.md │ │ │ │ │ ├── proxy-vars.md │ │ │ │ │ ├── retroactively-owned-resources.md │ │ │ │ │ ├── scaffolding.md │ │ │ │ │ ├── watches.md │ │ │ │ │ └── webhooks.md │ │ │ │ ├── testing-guide.md │ │ │ │ └── tutorial.md │ │ │ ├── golang/ │ │ │ │ ├── _index.md │ │ │ │ ├── advanced-topics.md │ │ │ │ ├── crds-scope.md │ │ │ │ ├── installation.md │ │ │ │ ├── migration.md │ │ │ │ ├── operator-scope.md │ │ │ │ ├── quickstart.md │ │ │ │ ├── references/ │ │ │ │ │ ├── _index.md │ │ │ │ │ ├── client.md │ │ │ │ │ ├── event-filtering.md │ │ │ │ │ ├── logging.md │ │ │ │ │ ├── markers.md │ │ │ │ │ ├── openapi-validation.md │ │ │ │ │ └── proxy-vars.md │ │ │ │ ├── testing.md │ │ │ │ ├── tutorial.md │ │ │ │ └── webhook.md │ │ │ └── helm/ │ │ │ ├── _index.md │ │ │ ├── installation.md │ │ │ ├── migration.md │ │ │ ├── quickstart.md │ │ │ ├── reference/ │ │ │ │ ├── _index.md │ │ │ │ ├── advanced_features/ │ │ │ │ │ ├── _index.md │ │ │ │ │ ├── annotations.md │ │ │ │ │ ├── max_concurrent_reconciles.md │ │ │ │ │ └── override_values.md │ │ │ │ ├── proxy-vars.md │ │ │ │ └── watches.md │ │ │ └── tutorial.md │ │ ├── cli/ │ │ │ ├── _index.md │ │ │ ├── operator-sdk.md │ │ │ ├── operator-sdk_alpha.md │ │ │ ├── operator-sdk_alpha_config-3alpha-to-3.md │ │ │ ├── operator-sdk_alpha_generate.md │ │ │ ├── operator-sdk_bundle.md │ │ │ ├── operator-sdk_bundle_validate.md │ │ │ ├── operator-sdk_cleanup.md │ │ │ ├── operator-sdk_completion.md │ │ │ ├── operator-sdk_completion_bash.md │ │ │ ├── operator-sdk_completion_fish.md │ │ │ ├── operator-sdk_completion_powershell.md │ │ │ ├── operator-sdk_completion_zsh.md │ │ │ ├── operator-sdk_create.md │ │ │ ├── operator-sdk_create_api.md │ │ │ ├── operator-sdk_create_webhook.md │ │ │ ├── operator-sdk_edit.md │ │ │ ├── operator-sdk_generate.md │ │ │ ├── operator-sdk_generate_bundle.md │ │ │ ├── operator-sdk_generate_kustomize.md │ │ │ ├── operator-sdk_generate_kustomize_manifests.md │ │ │ ├── operator-sdk_init.md │ │ │ ├── operator-sdk_olm.md │ │ │ ├── operator-sdk_olm_install.md │ │ │ ├── operator-sdk_olm_status.md │ │ │ ├── operator-sdk_olm_uninstall.md │ │ │ ├── operator-sdk_pkgman-to-bundle.md │ │ │ ├── operator-sdk_run.md │ │ │ ├── operator-sdk_run_bundle-upgrade.md │ │ │ ├── operator-sdk_run_bundle.md │ │ │ ├── operator-sdk_scorecard.md │ │ │ └── operator-sdk_version.md │ │ ├── contribution-guidelines/ │ │ │ ├── _index.md │ │ │ ├── changelog.md │ │ │ ├── developer-guide.md │ │ │ ├── documentation.md │ │ │ ├── faq.md │ │ │ ├── issue-lifecycle.md │ │ │ ├── opening-pull-requests.md │ │ │ ├── plugins.md │ │ │ ├── releasing.md │ │ │ ├── reporting-issues.md │ │ │ └── testing.md │ │ ├── faqs/ │ │ │ └── _index.md │ │ ├── installation/ │ │ │ └── _index.md │ │ ├── olm-integration/ │ │ │ ├── _index.md │ │ │ ├── cli-overview.md │ │ │ ├── generation.md │ │ │ ├── quickstart-bundle.md │ │ │ ├── testing-deployment.md │ │ │ ├── tutorial-bundle.md │ │ │ └── tutorial-package-manifests.md │ │ ├── overview/ │ │ │ ├── _index.md │ │ │ ├── cheat-sheet.md │ │ │ ├── operator-capabilities.md │ │ │ └── project-layout.md │ │ ├── testing-operators/ │ │ │ ├── _index.md │ │ │ └── scorecard/ │ │ │ ├── _index.md │ │ │ ├── custom-tests.md │ │ │ └── kuttl-tests.md │ │ └── upgrading-sdk-version/ │ │ ├── _index.md │ │ ├── backport-policy.md │ │ ├── v0.1.0-migration-guide.md │ │ ├── v0.18.0.md │ │ ├── v0.19.0.md │ │ ├── v1.0.0.md │ │ ├── v1.1.0.md │ │ ├── v1.10.0.md │ │ ├── v1.11.0.md │ │ ├── v1.12.0.md │ │ ├── v1.13.0.md │ │ ├── v1.14.0.md │ │ ├── v1.15.0.md │ │ ├── v1.16.0.md │ │ ├── v1.17.0.md │ │ ├── v1.18.0.md │ │ ├── v1.19.0.md │ │ ├── v1.2.0.md │ │ ├── v1.20.0.md │ │ ├── v1.21.0.md │ │ ├── v1.22.0.md │ │ ├── v1.23.0.md │ │ ├── v1.24.0.md │ │ ├── v1.25.0.md │ │ ├── v1.26.0.md │ │ ├── v1.27.0.md │ │ ├── v1.28.0.md │ │ ├── v1.29.0.md │ │ ├── v1.3.0.md │ │ ├── v1.30.0.md │ │ ├── v1.31.0.md │ │ ├── v1.32.0.md │ │ ├── v1.33.0.md │ │ ├── v1.34.0.md │ │ ├── v1.35.0.md │ │ ├── v1.36.0.md │ │ ├── v1.37.0.md │ │ ├── v1.38.0.md │ │ ├── v1.39.0.md │ │ ├── v1.39.1.md │ │ ├── v1.39.2.md │ │ ├── v1.4.0.md │ │ ├── v1.40.0.md │ │ ├── v1.41.0.md │ │ ├── v1.42.0.md │ │ ├── v1.42.1.md │ │ ├── v1.42.2.md │ │ ├── v1.5.0.md │ │ ├── v1.6.0.md │ │ ├── v1.6.1.md │ │ ├── v1.7.0.md │ │ ├── v1.7.1.md │ │ ├── v1.8.0.md │ │ ├── v1.9.0.md │ │ └── version-upgrade-guide.md │ └── search.md ├── layouts/ │ ├── 404.html │ ├── _default/ │ │ ├── baseof.html │ │ └── single.html │ ├── build/ │ │ └── single.html │ ├── docs/ │ │ ├── baseof.html │ │ ├── list.html │ │ └── single.html │ ├── faq/ │ │ └── baseof.html │ ├── index.html │ ├── partials/ │ │ ├── footer.html │ │ ├── head.html │ │ ├── hooks/ │ │ │ ├── body-end.html │ │ │ └── head-end.html │ │ ├── navbar-version-selector.html │ │ ├── navbar.html │ │ ├── scripts.html │ │ └── section-index.html │ └── shortcodes/ │ ├── client-go-version.html │ ├── kube-version.html │ └── table.html └── scripts/ ├── set_menu_version.sh ├── update_branch_mappings.sh ├── update_download_url.sh └── update_latest_release_compat.sh ================================================ FILE CONTENTS ================================================ ================================================ FILE: .ci/gpg/README.md ================================================ # SDK GPG Keys ## Current *key*pers The keys are currently in the hands of [Joe Lanford](https://github.com/joelanford/). ## Transferring keys In order to transfer the keys to other members of the Operator SDK admins, following the following: 1. get public GPG key from the person(s) you will transfer to 2. import their key into your keyring ``` gpg --import KEY ``` 3. verify their identity, is this really their key. Video call can be useful for this. 4. sign their key ``` gpg --sign-key EMAIL-OF-USERS-KEY ``` 5. export the SDK public key ``` gpg --export --armor -o 3B2F1481D146238080B346BB052996E2A20B5C7E.pub .asc 3B2F1481D146238080B346BB052996E2A20B5C7 ``` 6. export the SDK private key ``` gpg --export-secret-key --armor -o 3B2F1481D146238080B346BB052996E2A2 0B5C7E.priv.asc 3B2F1481D146238080B346BB052996E2A20B5C7E ``` 7. export the SDK sub key ``` gpg --export-secret-subkeys --armor -o 3B2F1481D146238080B346BB052996 E2A20B5C7E.sub_priv.asc 3B2F1481D146238080B346BB052996E2A20B5C7E ``` 8. encrypt each key for the person ``` gpg --encrypt --sign --armor -r EMAIL-OF-USERS-KEY --output 052996E2A20B5C7E.subkey.private.asc.enc 052996E2A20B5C7E.subkey.private.asc ``` 9. send them the encrypted key to the user 10. user should be able to decrypt with their key. ## Updating expiration date There will be a few people that have the keys. Those people should be able to update the expiration date. This won't have to be done until November 8, 2025. You will want to update the date of the key: ``` gpg --edit-key (key id) ``` Once you're in the gpg console select the key , there are 2, you need to update both. I just pick a 3 year term. ``` gpg> expire (follow prompts) 3y gpg> save ``` You can use whatever term the team wants. One of the resources I used: [How to change the expiration date of a GPG key](https://www.g-loaded.eu/2010/11/01/change-expiration-date-gpg-key/) ## Sending keys to keyserver Once you have the keys updated, you should send them to a keyserver. I have a couple examples, not sure if both are needed. ``` gpg --keyserver keyserver.ubuntu.com --send-key 3B2F1481D146238080B346BB052996E2A20B5C7E gpg --keyserver pgp.mit.edu --send-key 3B2F1481D146238080B346BB052996E2A20B5C7E ``` I *think* you only need to send it to one server, most of the commands in my shell history use `pgp.mit.edu` ## Updating secring.auto.gpg Once you have the keys updated, you need to regenerate the keyrings that are stored in the [SDK repo](https://github.com/operator-framework/operator-sdk/tree/master/.ci/gpg). Use the SDK key to sign and encrypt it. You need to use `--local-user` to avoid GPG from using your own key. ``` gpg --cipher-algo AES256 --output secring.auto.gpg --local-user "cncf-operator-sdk@cncf.io" --sign --symmetric 3B2F1481D146238080B346BB052996E2A20B5C7E.sub_priv.asc ``` ## Updating pubring.auto This is the public keyring. It's simply the public key. Export the public key then rename it as `pubring.auto` ``` gpg --export --armor -o 3B2F1481D146238080B346BB052996E2A20B5C7E.pub.asc 3B2F1481D146238080B346BB052996E2A20B5C7E cp 3B2F1481D146238080B346BB052996E2A20B5C7E.pub.asc pubring.auto ``` ## CI usage of keys The GPG keys are stored in [.ci/gpg](https://github.com/operator-framework/operator-sdk/tree/master/.ci/gpg) of the Operator SDK repo. In Github settings, there is a `GPG_PASSWORD` environment variable. It is set here in the [Environments](https://github.com/operator-framework/operator-sdk/settings/environments/172302554/edit) tab. You need to be admin. The `GPG_PASSWORD` has been encrypted and handed to a few people. These people are the keepers of the password. ## Original process The original keys were setup using the following article. https://blogs.itemis.com/en/secure-your-travis-ci-releases-part-2-signature-with-openpgp ================================================ FILE: .ci/gpg/create-keyring.sh ================================================ #!/bin/bash DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" # Modified from https://blogs.itemis.com/en/secure-your-travis-ci-releases-part-2-signature-with-openpgp function err_exit() { echo "ERROR: ${1:-"Unknown Error"} Exiting." 1>&2 exit 1 } declare -r GPG_HOME="${DIR}/keyring" declare -r SECRING_AUTO="${GPG_HOME}/secring.auto" declare -r PUBRING_AUTO="${GPG_HOME}/pubring.auto" mkdir -p --mode 700 "$GPG_HOME" cp "${DIR}"/*.auto* "${GPG_HOME}" echo -e "\nImporting public keys..." { gpg --home "${GPG_HOME}" --import "${PUBRING_AUTO}" ; } || { err_exit "Could not import public key into gpg." ; } echo "Success!" echo -e "\nDecrypting secret key..." { # $GPG_PASSWORD is taken from the script's env (injected by CI). echo $GPG_PASSWORD | gpg --home "${GPG_HOME}" --decrypt \ --pinentry-mode loopback --batch \ --passphrase-fd 0 \ --output "${SECRING_AUTO}" \ "${SECRING_AUTO}".gpg ; \ } || { err_exit "Failed to decrypt secret key." ; } echo "Success!" echo -e "\nImporting private keys..." # { gpg --home "${GPG_HOME}" --import "${PUBRING_AUTO}" ; } || { err_exit "Could not import public key into gpg." ; } { gpg --home "${GPG_HOME}" --import "${SECRING_AUTO}" ; } || { err_exit "Could not import secret key into gpg." ; } echo "Success!" ================================================ FILE: .ci/gpg/pubring.auto ================================================ -----BEGIN PGP PUBLIC KEY BLOCK----- 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 TsHpyxJ86L++bxtv9JhE6w19geq68spOgobXuw== =pKuo -----END PGP PUBLIC KEY BLOCK----- ================================================ FILE: .cncf-maintainers ================================================ approvers: - OchiengEd - acornett21 - anik120 - camilamacedo86 - grokspawn - jberkhahn - joelanford - oceanc80 - rashmigottipati reviewers: - OchiengEd - acornett21 - anik120 - camilamacedo86 - grokspawn - jberkhahn - joelanford - oceanc80 - rashmigottipati ================================================ FILE: .github/ISSUE_TEMPLATE/bug-report.md ================================================ --- name: Bug Report about: If things aren't working as expected. title: '' labels: '' assignees: '' --- ## Bug Report #### What did you do? #### What did you expect to see? #### What did you see instead? Under which circumstances? #### Environment **Operator type:** **Kubernetes cluster type:** `$ operator-sdk version` `$ go version` (if language is Go) `$ kubectl version` #### Possible Solution #### Additional context ================================================ FILE: .github/ISSUE_TEMPLATE/doc-report.md ================================================ --- name: Doc Report about: Raise an issue with the documentation. title: '' labels: kind/documentation assignees: '' --- ### What is the URL of the document? ### Which section(s) is the issue in? ### What needs fixing? #### Additional context ================================================ FILE: .github/ISSUE_TEMPLATE/feature-request.md ================================================ --- name: Feature Request about: Suggest a feature title: '' labels: '' assignees: '' --- ## Feature Request #### Describe the problem you need a feature to resolve. #### Describe the solution you'd like. ================================================ FILE: .github/ISSUE_TEMPLATE/support-question.md ================================================ --- name: Support Question about: Any support questions you might have. title: '' labels: '' assignees: '' --- ## Type of question ## Question #### What did you do? #### What did you expect to see? #### What did you see instead? Under which circumstances? #### Environment **Operator type:** **Kubernetes cluster type:** `$ operator-sdk version` `$ go version` (if language is Go) `$ kubectl version` #### Additional context ================================================ FILE: .github/ISSUE_TEMPLATE.md ================================================ ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ **Description of the change:** **Motivation for the change:** **Checklist** If the pull request includes user-facing changes, extra documentation is required: - [ ] Add a new changelog fragment in `changelog/fragments` (see [`changelog/fragments/00-template.yaml`](https://github.com/operator-framework/operator-sdk/tree/master/changelog/fragments/00-template.yaml)) - [ ] Add or update relevant sections of the docs website in [`website/content/en/docs`](https://github.com/operator-framework/operator-sdk/tree/master/website/content/en/docs) ================================================ FILE: .github/dependabot.yml ================================================ version: 2 updates: - package-ecosystem: docker directory: "/images/custom-scorecard-tests" schedule: interval: daily - package-ecosystem: docker directory: "/images/helm-operator" schedule: interval: daily - package-ecosystem: docker directory: "/images/operator-sdk" schedule: interval: daily - package-ecosystem: docker directory: "/images/scorecard-test" schedule: interval: daily - package-ecosystem: docker directory: "/images/scorecard-test-kuttl" schedule: interval: daily - package-ecosystem: "github-actions" directory: "/" schedule: interval: daily ================================================ FILE: .github/workflows/check-docs-only.sh ================================================ #!/usr/bin/env bash set -e # If running in Github actions: this should be set to "github.base_ref". : ${1?"the first argument must be set to a commit-ish reference"} # Patterns to ignore. declare -a DOC_PATTERNS DOC_PATTERNS=( "(\.md)" "(\.MD)" "(\.png)" "(\.pdf)" "(netlify\.toml)" "(website/)" "(changelog/)" "(OWNERS)" "(OWNERS_ALIASES)" "(LICENSE)" ) if ! git diff --name-only $1 | grep -qvE "$(IFS="|"; echo "${DOC_PATTERNS[*]}")"; then echo "true" exit 0 fi ================================================ FILE: .github/workflows/clean-unused-disk-space.sh ================================================ #!/usr/bin/env bash set -e echo "Removing unused system files to gain more disk space" rm -fr /opt/hostedtoolcache cd /opt find . -maxdepth 1 -mindepth 1 '!' -path ./containerd '!' -path ./actionarchivecache '!' -path ./runner '!' -path ./runner-cache -exec rm -rf '{}' ';' ================================================ FILE: .github/workflows/deploy.yml ================================================ name: deploy on: push: branches: - '**' - '!dependabot/**' tags: - 'v*' - 'scorecard-kuttl/v*' pull_request: branches: [ master ] jobs: check_docs_only: name: check_docs_only runs-on: ubuntu-24.04 outputs: skip: ${{ steps.check_docs_only.outputs.skip }} steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - id: check_docs_only # Since PR's are squashed prior to merging to the branch checked out (default branch), # HEAD^ will resolve to the previous point in history. run: | REF="HEAD^" [[ -z "${{ github.base_ref }}" ]] || REF=$(git show-ref ${{ github.base_ref }} | head -1 | cut -d' ' -f2) echo "skip=$(.github/workflows/check-docs-only.sh $REF)" >> $GITHUB_OUTPUT # Job to test release steps. This will only create a release remotely if run on a tagged commit. goreleaser: name: goreleaser needs: check_docs_only # Run this job on a tag like 'vX.Y.Z' or on a branch or pull request with code changes. if: startsWith(github.ref, 'refs/tags/v') || ( needs.check_docs_only.outputs.skip != 'true' && !startsWith(github.ref, 'refs/tags/') ) runs-on: ubuntu-24.04 environment: deploy steps: - name: checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: install uses: actions/setup-go@v6 with: go-version-file: "go.mod" - name: gpg init if: ${{ github.event_name != 'pull_request' }} run: .ci/gpg/create-keyring.sh env: GPG_PASSWORD: ${{ secrets.GPG_PASSWORD }} - name: release run: | if [[ $GITHUB_REF != refs/tags/v* ]]; then export DRY_RUN=1 fi make release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Job matrix for image builds. Only pushes if a tag with prefix "v" is present. images: name: images needs: check_docs_only # Run this job on a tag like 'vX.Y.Z' or on a branch or pull request with code changes. if: startsWith(github.ref, 'refs/tags/v') || ( needs.check_docs_only.outputs.skip != 'true' && !startsWith(github.ref, 'refs/tags/') ) runs-on: ubuntu-24.04 environment: deploy strategy: matrix: id: ["operator-sdk", "helm-operator", "scorecard-test"] steps: - name: set up qemu uses: docker/setup-qemu-action@v4 - name: set up buildx uses: docker/setup-buildx-action@v4 - name: quay.io login if: ${{ github.event_name != 'pull_request' }} uses: docker/login-action@v4 with: username: ${{ secrets.QUAY_USERNAME }} password: ${{ secrets.QUAY_PASSWORD }} registry: quay.io # Check out repo before tag step for script. - name: checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: create tags id: tags run: | IMG=quay.io/${{ github.repository_owner }}/${{ matrix.id }} echo tags=$(.github/workflows/get_image_tags.sh "$IMG" "v") >> $GITHUB_OUTPUT - name: build and push uses: docker/build-push-action@v7 with: file: ./images/${{ matrix.id }}/Dockerfile context: . platforms: linux/amd64,linux/arm64,linux/ppc64le,linux/s390x # Push on tag, or master or latest branch push. push: ${{ (github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/master' || github.ref == 'refs/heads/latest')) }} tags: ${{ steps.tags.outputs.tags }} # scorecard-test-kuttl image build job. Only pushes if a tag with prefix "scorecard-kuttl/v" is present. image-scorecard-test-kuttl: name: image-scorecard-test-kuttl needs: check_docs_only # Run this job on a tag like 'scorecard-kuttl/vX.Y.Z' or on a branch or pull request with code changes. if: startsWith(github.ref, 'refs/tags/scorecard-kuttl/v') || ( needs.check_docs_only.outputs.skip != 'true' && !startsWith(github.ref, 'refs/tags/') ) runs-on: ubuntu-24.04 environment: deploy steps: - name: set up qemu uses: docker/setup-qemu-action@v4 - name: set up buildx uses: docker/setup-buildx-action@v4 - name: quay.io login if: ${{ github.event_name != 'pull_request' }} uses: docker/login-action@v4 with: username: ${{ secrets.QUAY_USERNAME }} password: ${{ secrets.QUAY_PASSWORD }} registry: quay.io # Check out repo before tag step for script. - name: checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: create tags id: tags run: | IMG=quay.io/${{ github.repository_owner }}/scorecard-test-kuttl echo tags=$(.github/workflows/get_image_tags.sh "$IMG" "scorecard-kuttl/v") >> $GITHUB_OUTPUT - name: build and push uses: docker/build-push-action@v7 with: file: ./images/scorecard-test-kuttl/Dockerfile context: . # s390x is not supported by the scorecard-test-kuttl base image. platforms: linux/amd64,linux/arm64,linux/ppc64le # Push on tag, or master branch push. push: ${{ (github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/master')) }} tags: ${{ steps.tags.outputs.tags }} ================================================ FILE: .github/workflows/freshen-images/build.sh ================================================ #!/usr/bin/env bash DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" source ${DIR}/lib.sh set -eu set -o pipefail # Comma-separated list of build platforms, ex. linux/s390x. # See 'docker buildx build --help' for --platform flag info. DEFAULT_PLATFORMS="linux/amd64,linux/arm64,linux/ppc64le,linux/s390x" # TODO(estroz): support scorecard-test-kuttl rebuilds. # DEFAULT_SCORECARD_KUTTL_PLATFORMS="linux/amd64,linux/arm64,linux/ppc64le" PLATFORMS= # Time window to compare image creation times against, relative to now. # --timespan should be set to this duration in seconds. DEFAULT_TIMESPAN=86400 # 24 hours in seconds TIMESPAN= # What to do with the image, either load (default) or push. IMAGE_DO=--load # Space-separated list of git tags. # The --tags arg can be comma-separated. TAGS= # ID of the image, ex. operator-sdk. IMAGE_ID= # Update all images. FORCE=0 while [[ $# -gt 0 ]]; do case $1 in --push) IMAGE_DO=$1 ;; --force) FORCE=1 ;; --tags) TAGS=($(echo $2 | sed -E 's/,/ /g')) shift ;; --image-id) IMAGE_ID=$2 shift ;; --platforms) PLATFORMS=$2 shift ;; --timespan) TIMESPAN=$2 shift ;; *) echo "Invalid flag $1"; exit 1 ;; esac shift done : ${IMAGE_ID:?--image-id is required} : ${TAGS:?--tags is required} # Set defaults. case $IMAGE_ID in scorecard-test-kuttl) # TODO(estroz): support scorecard-test-kuttl rebuilds. # PLATFORMS=${PLATFORMS:-$DEFAULT_SCORECARD_KUTTL_PLATFORMS} echo "$IMAGE_ID is not supported" exit 1 ;; *) PLATFORMS=${PLATFORMS:-$DEFAULT_PLATFORMS} ;; esac TIMESPAN=${TIMESPAN:-$DEFAULT_TIMESPAN} # Clone the operator-sdk repo into a temp dir with cleanup. tmp=$(mktemp -d --tmpdir freshen-images-tmp.XXXXXX) git clone https://github.com/operator-framework/operator-sdk.git $tmp trap "rm -rf $tmp" EXIT pushd $tmp # Build the image defined by IMAGE_ID for each tag for a set of platforms. for i in ${!TAGS[*]}; do if (($i=0)); then build_generic ${TAGS[$i]} $IMAGE_ID "$PLATFORMS" true else build_generic ${TAGS[$i]} $IMAGE_ID "$PLATFORMS" false fi done popd ================================================ FILE: .github/workflows/freshen-images/lib.sh ================================================ #!/usr/bin/env bash # _buildx runs "docker buildx build" in CI-output mode. function _buildx() { echo -e "\n$ docker buildx build --progress plain $@" docker buildx build --progress plain $@ } # _pull runs "docker pull". function _pull() { echo -e "\n$ docker pull $@" docker pull $@ } # cmp_times returns false if time $2 occurred within some timespan defined by TIMESPAN # relative to time $1. function cmp_times() { local base_seconds=$(date -d "$1" +%s) local img_time_seconds=$(date -d "$2" +%s) if (( $base_seconds - $TIMESPAN < $img_time_seconds )) || (( $FORCE )); then # return false return 1 fi # return true return 0 } # is_dockerfile_fresh returns false if at least one image in a "FROM" directive # in the Dockerfile at $1 has been freshly built within TIMESPAN relative to now, # or FORCE=1. function is_dockerfile_fresh() { local dockerfile=$1 # Strip flag from FROM to get image, which always precedes this flag if set. local docker_images=$(grep -oP "FROM (--platform=[^ ]+ )?\K([^ ]+)" $dockerfile) for img in $docker_images; do _pull $img local img_create_time=$(docker inspect --format '{{.Created}}' $img) if [[ "$img_create_time" == "0001-01-01T00:00:00Z" ]]; then echo "image creation time could be found for $img" exit 1 fi if ! cmp_times "$(date)" "$img_create_time"; then # return false echo "is_dockerfile_fresh returning 1 (false) for [$img]" return 1 fi done } # Build an image at path ./images/$2/Dockerfile checked out at git tag $1 # for all platforms in $3. Tag is assumed to be "v"+semver; the image is tagged # with the full semver string and with "v${major}.${minor}". # The build will only run if the Dockerfile is not fresh. function build_generic() { local tag=$1 local id=$2 local platforms=$3 local buildlatest=$4 local tag_maj_min="quay.io/operator-framework/${id}:$(echo $tag | grep -Eo "v[1-9]+\.[0-9]+")" local tag_full="quay.io/operator-framework/${id}:${tag}" local tag_latest="quay.io/operator-framework/${id}:latest" local dockerfile=./images/${id}/Dockerfile git checkout refs/tags/$tag if is_dockerfile_fresh "$dockerfile"; then echo "Skipping build of $dockerfile, it is FRESH!" else # dockerfile is not fresh, rebuildng image if $buildlatest; then echo "Rebuilding image [$tag_maj_min] and latest for [$platforms]" _buildx --builder=container --tag "$tag_maj_min" --tag "$tag_full" --tag "$tag_latest" --platform "$platforms" --file "$dockerfile" $IMAGE_DO . else echo "Rebuilding image [$tag_maj_min] for [$platforms]" _buildx --builder=container --tag "$tag_maj_min" --tag "$tag_full" --platform "$platforms" --file "$dockerfile" $IMAGE_DO . fi fi } ================================================ FILE: .github/workflows/freshen-images/tags.sh ================================================ #!/usr/bin/env bash set -eu set -o pipefail # Major version to select (default 1). MAJ=${1:-1} # Number of minor versions to select (default 2). NUM_MINORS=${2:-2} # Get unique "v${major}.${minor}" tags, then add the greatest patch version for each # to a list. declare -a LATEST_GIT_TAGS for tag in $(git tag --sort=-v:refname -l "v${MAJ}.*" | grep -Eo "v${MAJ}\.[^\.]+" | uniq | head -n $NUM_MINORS); do LATEST_GIT_TAGS+=( $(git tag --sort=-v:refname -l "$tag*" | head -n 1) ) done # Print tags in comma-separated form. echo ${LATEST_GIT_TAGS[@]} | sed -E 's/[ ]+/,/g' ================================================ FILE: .github/workflows/freshen-images.yml ================================================ name: freshen-images on: workflow_dispatch: inputs: force: description: Force rebuild of all images. default: '' required: false schedule: # Run at 11 am UTC every day. - cron: '0 11 * * *' jobs: git_tags: runs-on: ubuntu-24.04 outputs: git_tags: ${{ steps.tags.outputs.git_tags }} steps: - name: checkout uses: actions/checkout@v6 with: fetch-depth: 0 - id: tags run: echo "git_tags=$(.github/workflows/freshen-images/tags.sh)" >> $GITHUB_OUTPUT build: name: build needs: git_tags runs-on: ubuntu-24.04 environment: deploy strategy: matrix: # TODO(estroz): support scorecard-test-kuttl rebuilds. id: ["operator-sdk", "helm-operator", "scorecard-test"] steps: - name: set up qemu uses: docker/setup-qemu-action@v4 - name: set up buildx uses: docker/setup-buildx-action@v4 - name: quay.io login uses: docker/login-action@v4 with: username: ${{ secrets.QUAY_USERNAME }} password: ${{ secrets.QUAY_PASSWORD }} registry: quay.io - name: checkout uses: actions/checkout@v6 with: fetch-depth: 1 - name: build and push id: build_ids run: | .github/workflows/freshen-images/build.sh --push \ --image-id ${{ matrix.id }} \ --tags ${{ needs.git_tags.outputs.git_tags }} \ ${{ github.event.inputs.force != '' && '--force' || '' }} ================================================ FILE: .github/workflows/get_image_tags.sh ================================================ #!/usr/bin/env bash IMG="$1" TAG_PREFIX="$2" : ${IMG:?"\$1 must be set to an image tag"} : ${TAG_PREFIX:?"\$2 must be set to some tag prefix to pass to refs/tags/{prefix}*"} : ${GITHUB_REF:?"GITHUB_REF must be set to a git 'refs/' path in the environment (typically set by the Actions runner)"} if [[ $GITHUB_REF == refs/tags/${TAG_PREFIX}* ]]; then # Release tags. TAG="${GITHUB_REF#refs/tags/${TAG_PREFIX}}" # Prepend "v" if removed by the above variable operation, since $TAG should always be semver. [[ $TAG == v* ]] || TAG="v${TAG}" MAJOR_MINOR="${TAG%.*}" echo "${IMG}:${TAG},${IMG}:${MAJOR_MINOR}" elif [[ $GITHUB_REF == refs/tags/* ]]; then # Any other tag, which will not be pushed. TAG="$(echo "${GITHUB_REF#refs/tags/}" | sed -r 's|/+|-|g')-local" echo "${IMG}:${TAG}" elif [[ $GITHUB_REF == refs/heads/* ]]; then # Branch build. TAG="$(echo "${GITHUB_REF#refs/heads/}" | sed -r 's|/+|-|g')" echo "${IMG}:${TAG}" elif [[ $GITHUB_REF == refs/pull/* ]]; then # PR build. TAG="pr-$(echo "${GITHUB_REF}" | sed -E 's|refs/pull/([^/]+)/?.*|\1|')" echo "${IMG}:${TAG}" fi ================================================ FILE: .github/workflows/integration.yml ================================================ name: integration on: pull_request: {} jobs: check_docs_only: name: check_docs_only runs-on: ubuntu-24.04 outputs: skip: ${{ steps.check_docs_only.outputs.skip }} steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - id: check_docs_only # Since PR's are squashed prior to merging to the branch checked out (default branch), # HEAD^ will resolve to the previous point in history. run: | REF="HEAD^" [[ -z "${{ github.base_ref }}" ]] || REF=$(git show-ref ${{ github.base_ref }} | head -1 | cut -d' ' -f2) echo "skip=$(.github/workflows/check-docs-only.sh $REF)" >> $GITHUB_OUTPUT integration: name: integration runs-on: ubuntu-24.04 needs: check_docs_only if: needs.check_docs_only.outputs.skip != 'true' steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Cleanup Unused Disk Space run: | .github/workflows/clean-unused-disk-space.sh - uses: actions/setup-go@v6 with: go-version-file: "go.mod" - run: make test-e2e-integration ================================================ FILE: .github/workflows/markdown-link-check-config.json ================================================ { "ignorePatterns": [ { "pattern": "^https://github.com/.+" }, { "pattern": "^mailto:" } ], "httpHeaders": [ { "urls": ["https://docs.github.com"], "headers": { "User-Agent": "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:98.0) Gecko/20100101 Firefox/98.0" } } ] } ================================================ FILE: .github/workflows/olm-check.yml ================================================ name: olm-check on: pull_request: branches: - 'release-*' workflow_dispatch: jobs: check-olm-minor-releases: name: check-olm-minor-releases runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - id: run-check-olm run: ./hack/check-olm.sh ================================================ FILE: .github/workflows/rerun.yml ================================================ on: issue_comment: types: [created] jobs: rerun_tests: name: rerun_pr_tests if: ${{ github.event.issue.pull_request }} runs-on: ubuntu-24.04 steps: - uses: operator-framework/rerun-actions@v0.4.0 with: repo_token: ${{ secrets.GITHUB_TOKEN }} comment_id: ${{ github.event.comment.id }} ================================================ FILE: .github/workflows/test-go.yml ================================================ name: go on: pull_request: {} env: MEMCACHED_IMAGE: "memcached:1.4.36-alpine" jobs: check_docs_only: name: check_docs_only runs-on: ubuntu-24.04 outputs: skip: ${{ steps.check_docs_only.outputs.skip }} steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - id: check_docs_only # Since PR's are squashed prior to merging to the branch checked out (default branch), # HEAD^ will resolve to the previous point in history. run: | REF="HEAD^" [[ -z "${{ github.base_ref }}" ]] || REF=$(git show-ref ${{ github.base_ref }} | head -1 | cut -d' ' -f2) echo "skip=$(.github/workflows/check-docs-only.sh $REF)" >> $GITHUB_OUTPUT e2e: name: e2e runs-on: ubuntu-24.04 needs: check_docs_only if: needs.check_docs_only.outputs.skip != 'true' steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Cleanup Unused Disk Space run: | .github/workflows/clean-unused-disk-space.sh - uses: actions/setup-go@v6 with: go-version-file: "go.mod" - run: sudo rm -rf /usr/local/bin/kustomize - run: make test-e2e-go unit: name: unit runs-on: ubuntu-24.04 needs: check_docs_only if: needs.check_docs_only.outputs.skip != 'true' steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Cleanup Unused Disk Space run: | .github/workflows/clean-unused-disk-space.sh - uses: actions/setup-go@v6 with: go-version-file: "go.mod" - run: make test-unit - uses: shogo82148/actions-goveralls@v1 with: path-to-profile: coverage.out ================================================ FILE: .github/workflows/test-helm.yml ================================================ name: helm on: pull_request: {} jobs: check_docs_only: name: check_docs_only runs-on: ubuntu-24.04 outputs: skip: ${{ steps.check_docs_only.outputs.skip }} steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - id: check_docs_only # Since PR's are squashed prior to merging to the branch checked out (default branch), # HEAD^ will resolve to the previous point in history. run: | REF="HEAD^" [[ -z "${{ github.base_ref }}" ]] || REF=$(git show-ref ${{ github.base_ref }} | head -1 | cut -d' ' -f2) echo "skip=$(.github/workflows/check-docs-only.sh $REF)" >> $GITHUB_OUTPUT e2e: name: e2e runs-on: ubuntu-24.04 needs: check_docs_only if: needs.check_docs_only.outputs.skip != 'true' steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Cleanup Unused Disk Space run: | .github/workflows/clean-unused-disk-space.sh - uses: actions/setup-go@v6 with: go-version-file: "go.mod" - run: sudo rm -rf /usr/local/bin/kustomize - run: make test-e2e-helm ================================================ FILE: .github/workflows/test-sample-go.yml ================================================ name: memcached-sample on: pull_request: {} jobs: check_docs_only: name: check_docs_only runs-on: ubuntu-24.04 outputs: skip: ${{ steps.check_docs_only.outputs.skip }} steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - id: check_docs_only # Since PR's are squashed prior to merging to the branch checked out (default branch), # HEAD^ will resolve to the previous point in history. run: | REF="HEAD^" [[ -z "${{ github.base_ref }}" ]] || REF=$(git show-ref ${{ github.base_ref }} | head -1 | cut -d' ' -f2) echo "skip=$(.github/workflows/check-docs-only.sh $REF)" >> $GITHUB_OUTPUT e2e: name: e2e runs-on: ubuntu-24.04 needs: check_docs_only if: needs.check_docs_only.outputs.skip != 'true' steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Cleanup Unused Disk Space run: | .github/workflows/clean-unused-disk-space.sh - uses: actions/setup-go@v6 with: go-version-file: "go.mod" - run: sudo rm -rf /usr/local/bin/kustomize - run: make test-e2e-sample-go ================================================ FILE: .github/workflows/test-sanity.yml ================================================ name: sanity on: pull_request: {} jobs: check_docs_only: name: check_docs_only runs-on: ubuntu-24.04 outputs: skip: ${{ steps.check_docs_only.outputs.skip }} steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - id: check_docs_only # Since PR's are squashed prior to merging to the branch checked out (default branch), # HEAD^ will resolve to the previous point in history. run: | REF="HEAD^" [[ -z "${{ github.base_ref }}" ]] || REF=$(git show-ref ${{ github.base_ref }} | head -1 | cut -d' ' -f2) echo "skip=$(.github/workflows/check-docs-only.sh $REF)" >> $GITHUB_OUTPUT sanity: name: sanity runs-on: ubuntu-24.04 needs: check_docs_only if: needs.check_docs_only.outputs.skip != 'true' steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Cleanup Unused Disk Space run: | .github/workflows/clean-unused-disk-space.sh - uses: actions/setup-go@v6 with: go-version-file: "go.mod" id: go - run: sudo rm -rf /usr/local/bin/kustomize - run: make test-sanity docs: name: docs runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v6 with: fetch-depth: 0 submodules: recursive - run: make test-docs - uses: gaurav-nelson/github-action-markdown-link-check@v1 with: max-depth: 1 config-file: '.github/workflows/markdown-link-check-config.json' ================================================ FILE: .gitignore ================================================ # Folders .idea # Build artifacts /build /dist **/bin/ # Test artifacts **/testbin/ # CI GPG keyring /.ci/gpg/keyring # Website website/public/ website/resources/ website/node_modules/ website/tech-doc-hugo # Ignore molecule samples testdata if it be generated in the testdata/ diretory testdata/ansible/memcached-molecule-operator testdata/ansible/advanced-molecule-operator # Trash files *\.DS_Store # Created by https://www.toptal.com/developers/gitignore/api/go,vim,emacs,visualstudiocode # Edit at https://www.toptal.com/developers/gitignore?templates=go,vim,emacs,visualstudiocode ### Emacs ### # -*- mode: gitignore; -*- *~ \#*\# /.emacs.desktop /.emacs.desktop.lock *.elc auto-save-list tramp .\#* # Org-mode .org-id-locations *_archive # flymake-mode *_flymake.* # eshell files /eshell/history /eshell/lastdir # elpa packages /elpa/ # reftex files *.rel # AUCTeX auto folder /auto/ # cask packages .cask/ dist/ # Flycheck flycheck_*.el # server auth directory /server/ # projectiles files .projectile # directory configuration .dir-locals.el # network security /network-security.data ### Go ### # Binaries for programs and plugins *.exe *.exe~ *.dll *.so *.dylib # Test binary, built with `go test -c` *.test # Output of the go coverage tool, specifically when used with LiteIDE *.out ### Vim ### # Swap [._]*.s[a-v][a-z] !*.svg # comment out if you don't need vector files [._]*.sw[a-p] [._]s[a-rt-v][a-z] [._]ss[a-gi-z] [._]sw[a-p] # Session Session.vim Sessionx.vim # Temporary .netrwhist # Auto-generated tag files tags # Persistent undo [._]*.un~ ### VisualStudioCode ### .vscode/* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json *.code-workspace ### VisualStudioCode Patch ### # Ignore all local history of files .history .ionide # End of https://www.toptal.com/developers/gitignore/api/go,vim,emacs,visualstudiocode # Python cache (Ansible molecule) test/ansible/plugins/filter/__pycache__/ ================================================ FILE: .gitmodules ================================================ [submodule "website/themes/docsy"] path = website/themes/docsy url = https://github.com/asmacdo/docsy.git ================================================ FILE: .golangci.yml ================================================ version: "2" linters: enable: - dupl - ginkgolinter - goconst - gocyclo - gosec - misspell - nakedret - revive - unconvert - unparam exclusions: generated: lax presets: - comments - common-false-positives - legacy - std-error-handling rules: - linters: - revive text: should not use dot imports source: ginkgo|gomega - linters: - gosec text: G110|G601|G404|G204|G306 paths: - third_party$ - builtin$ - examples$ settings: revive: rules: - name: var-naming disabled: true formatters: enable: - goimports exclusions: generated: lax paths: - third_party$ - builtin$ - examples$ ================================================ FILE: .goreleaser.yml ================================================ # Global environment variables for builds. env: - CGO_ENABLED=0 - GO111MODULE=on - GOPROXY=https://proxy.golang.org|direct - REPO=github.com/operator-framework/operator-sdk - GO_BUILD_TAGS=containers_image_openpgp # Hooks to run before any build is run. before: hooks: - go version | grep --quiet "go1\.15\.5" || echo "Go binary version must be 1.15.5" - go mod download # Binary builds. builds: # operator-sdk build steps - id: operator-sdk main: ./cmd/operator-sdk binary: operator-sdk mod_timestamp: "{{ .CommitTimestamp }}" # containers_image_openpgp for containers/image flags: &build-flags - -tags=containers_image_openpgp asmflags: &build-asmflags - all=-trimpath={{ .Env.PWD }} gcflags: &build-gcflags - all=-trimpath={{ .Env.PWD }} ldflags: &build-ldflags - -X {{ .Env.REPO }}/internal/version.Version={{ .Env.SIMPLE_VERSION }} - -X {{ .Env.REPO }}/internal/version.GitVersion={{ .Env.GIT_VERSION }} - -X {{ .Env.REPO }}/internal/version.GitCommit={{ .Env.GIT_COMMIT }} - -X {{ .Env.REPO }}/internal/version.KubernetesVersion={{ .Env.K8S_VERSION }} - -X {{ .Env.REPO }}/internal/version.ImageVersion={{ .Env.IMAGE_VERSION }} targets: &build-targets - darwin_amd64 - darwin_arm64 - linux_amd64 - linux_arm64 - linux_ppc64le - linux_s390x # helm-operator build steps - id: helm-operator main: ./cmd/helm-operator binary: helm-operator mod_timestamp: "{{ .CommitTimestamp }}" flags: *build-flags asmflags: *build-asmflags gcflags: *build-gcflags ldflags: *build-ldflags targets: *build-targets # Use most recent tag and short commit for snapshot version. snapshot: name_template: "{{ .Env.GIT_VERSION }}" # We don't use archives, so skip creating them. archives: - format: binary name_template: "{{ .Binary }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}{{ if .Mips }}_{{ .Mips }}{{ end }}" checksum: name_template: "checksums.txt" # Sign the checksum file with the CI GPG key. signs: - signature: "${artifact}.asc" artifacts: checksum # Use the CI signing subkey A20B5C7E decrypted into .ci/gpg/keyring to sign the release. args: ["--home", ".ci/gpg/keyring", "-u", "A20B5C7E", "--output", "${signature}", "--detach-sign", "${artifact}"] # We use a custom changelog generator. changelog: # TODO(estroz): configure homebrew publishing # brews: # - name: operator-sdk # ids: # - operator-sdk # Uncomment for testing # release: # github: # owner: # name: operator-sdk ================================================ FILE: CONTRIBUTING.MD ================================================ # How to contribute Operator SDK is Apache 2.0 licensed and accepts contributions via GitHub pull requests. This document outlines some of the conventions on commit message formatting, contact points for developers, and other resources to help get contributions into operator-sdk. # Email and Chat - Email: [operator-framework][operator_framework] ## Getting started - Fork the repository on GitHub - See the [developer guide][developer-guide] for build instructions ## Reporting bugs and creating issues Reporting bugs is one of the best ways to contribute. However, a good bug report has some very specific qualities, so please read over our short document on [reporting issues][reporting-issues] before submitting a bug report. This document might contain links to known issues, another good reason to take a look there before reporting a bug. ## Contribution flow This is a rough outline of what a contributor's workflow looks like: - Create a topic branch from where to base the contribution. This is usually master. - Make commits of logical units. - Make sure commit messages are in the proper format (see below). - Push changes in a topic branch to a personal fork of the repository. - Submit a pull request to operator-framework/operator-sdk. - The PR must receive a LGTM from two maintainers found in the MAINTAINERS file. Thanks for contributing! ### Code style The coding style suggested by the Go community is used in operator-sdk. See the [style doc][golang-style-doc] for details. Please follow this style to make operator-sdk easy to review, maintain and develop. ### Format of the commit message We follow a rough convention for commit messages that is designed to answer two questions: what changed and why. The subject line should feature the what and the body of the commit should describe the why. ``` scripts: add the test-cluster command this uses tmux to setup a test cluster that can easily be killed and started for debugging. Fixes #38 ``` The format can be described more formally as follows: ``` :