Skip to content

Commit 0a203b7

Browse files
authored
add blurb about recorder to golang tutorial and sample (#6384)
Signed-off-by: jberkhahn <[email protected]>
1 parent 46c8c4e commit 0a203b7

File tree

6 files changed

+100
-53
lines changed

6 files changed

+100
-53
lines changed

hack/generate/samples/internal/go/memcached-with-customization/memcached_with_customization.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ func (mh *Memcached) Run() {
144144
mh.uncommentManifestsKustomizationv3()
145145
}
146146

147+
mh.customizingMain()
148+
147149
mh.implementingE2ETests()
148150

149151
cmd := exec.Command("go", "mod", "tidy")
@@ -480,7 +482,7 @@ func (mh *Memcached) implementingMonitoring() {
480482
mh.customizingController()
481483

482484
log.Infof("customizing Main")
483-
mh.customizingMain()
485+
mh.customizingMainMonitoring()
484486

485487
log.Infof("customizing Dockerfile")
486488
mh.customizingDockerfile()
@@ -784,10 +786,26 @@ func (mh *Memcached) customizingController() {
784786
pkg.CheckError("adding metric incrementation", err)
785787
}
786788

787-
// customizingMain will customize main.go to register metrics
789+
// customizingMain will add comments to main
788790
func (mh *Memcached) customizingMain() {
789791
var mainPath string
790792

793+
if mh.isV3() {
794+
mainPath = filepath.Join(mh.ctx.Dir, "main.go")
795+
} else {
796+
mainPath = filepath.Join(mh.ctx.Dir, "cmd", "main.go")
797+
}
798+
799+
err := kbutil.InsertCode(mainPath,
800+
"Scheme: mgr.GetScheme(),",
801+
mainRecorderFragment)
802+
pkg.CheckError("adding recorder fragment", err)
803+
}
804+
805+
// customizingMainMonitoring will customize main.go to register metrics
806+
func (mh *Memcached) customizingMainMonitoring() {
807+
var mainPath string
808+
791809
marker := "\"github.com/example/memcached-operator/"
792810
if mh.isV3() {
793811
mainPath = filepath.Join(mh.ctx.Dir, "main.go")
@@ -1385,6 +1403,10 @@ const controllerPrometheusRuleFragment = `
13851403
memcached := &cachev1alpha1.Memcached{}
13861404
err = r.Get(ctx, req.NamespacedName, memcached)`
13871405

1406+
const mainRecorderFragment = `
1407+
// Add a Recorder to the reconciler.
1408+
// This allows the operator author to emit events during reconcilliation.`
1409+
13881410
const monitoringv1ImportFragment = `
13891411
13901412
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"

testdata/go/v3/memcached-operator/main.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,10 @@ func main() {
9090
}
9191

9292
if err = (&controllers.MemcachedReconciler{
93-
Client: mgr.GetClient(),
94-
Scheme: mgr.GetScheme(),
93+
Client: mgr.GetClient(),
94+
Scheme: mgr.GetScheme(),
95+
// Add a Recorder to the reconciler.
96+
// This allows the operator author to emit events during reconcilliation.
9597
Recorder: mgr.GetEventRecorderFor("memcached-controller"),
9698
}).SetupWithManager(mgr); err != nil {
9799
setupLog.Error(err, "unable to create controller", "controller", "Memcached")

testdata/go/v3/monitoring/memcached-operator/main.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,10 @@ func main() {
9797
}
9898

9999
if err = (&controllers.MemcachedReconciler{
100-
Client: mgr.GetClient(),
101-
Scheme: mgr.GetScheme(),
100+
Client: mgr.GetClient(),
101+
Scheme: mgr.GetScheme(),
102+
// Add a Recorder to the reconciler.
103+
// This allows the operator author to emit events during reconcilliation.
102104
Recorder: mgr.GetEventRecorderFor("memcached-controller"),
103105
}).SetupWithManager(mgr); err != nil {
104106
setupLog.Error(err, "unable to create controller", "controller", "Memcached")

testdata/go/v4-alpha/memcached-operator/cmd/main.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,10 @@ func main() {
9090
}
9191

9292
if err = (&controller.MemcachedReconciler{
93-
Client: mgr.GetClient(),
94-
Scheme: mgr.GetScheme(),
93+
Client: mgr.GetClient(),
94+
Scheme: mgr.GetScheme(),
95+
// Add a Recorder to the reconciler.
96+
// This allows the operator author to emit events during reconcilliation.
9597
Recorder: mgr.GetEventRecorderFor("memcached-controller"),
9698
}).SetupWithManager(mgr); err != nil {
9799
setupLog.Error(err, "unable to create controller", "controller", "Memcached")

testdata/go/v4-alpha/monitoring/memcached-operator/cmd/main.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,10 @@ func main() {
9797
}
9898

9999
if err = (&controller.MemcachedReconciler{
100-
Client: mgr.GetClient(),
101-
Scheme: mgr.GetScheme(),
100+
Client: mgr.GetClient(),
101+
Scheme: mgr.GetScheme(),
102+
// Add a Recorder to the reconciler.
103+
// This allows the operator author to emit events during reconcilliation.
102104
Recorder: mgr.GetEventRecorderFor("memcached-controller"),
103105
}).SetupWithManager(mgr); err != nil {
104106
setupLog.Error(err, "unable to create controller", "controller", "Memcached")

website/content/en/docs/building-operators/golang/tutorial.md

Lines changed: 60 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,23 @@ For this example replace the generated controller file `controllers/memcached_co
190190
**Note**: The next two subsections explain how the controller watches resources and how the reconcile loop is triggered.
191191
If you'd like to skip this section, head to the [deploy](#run-the-operator) section to see how to run the operator.
192192

193+
### Setup a Recorder
194+
195+
First, add a recorder when you initialize the Memcached reconciler in `main.go`.
196+
197+
```Go
198+
if err = (&controllers.MemcachedReconciler{
199+
Client: mgr.GetClient(),
200+
Scheme: mgr.GetScheme(),
201+
Recorder: mgr.GetEventRecorderFor("memcached-controller"),
202+
}).SetupWithManager(mgr); err != nil {
203+
setupLog.Error(err, "unable to create controller", "controller", "Memcached")
204+
os.Exit(1)
205+
}
206+
```
207+
208+
This recorder will be used within the reconcile method of the controller to emit events.
209+
193210
### Resources watched by the Controller
194211

195212
The `SetupWithManager()` function in `controllers/memcached_controller.go` specifies how the controller is built to watch a CR and other resources that are owned and managed by that controller.
@@ -490,56 +507,56 @@ Next, check out the following:
490507
1. The [advanced topics][advanced-topics] doc for more use cases and under-the-hood details.
491508

492509

493-
[legacy-quickstart-doc]:https://v0-19-x.sdk.operatorframework.io/docs/golang/legacy/quickstart/
494-
[migration-guide]:/docs/building-operators/golang/migration
495-
[install-guide]:/docs/building-operators/golang/installation
496-
[image-reg-config]:/docs/olm-integration/cli-overview#private-bundle-and-catalog-image-registries
497-
[enqueue_requests_from_map_func]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/handler#EnqueueRequestsFromMapFunc
498-
[event_handler_godocs]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/handler#hdr-EventHandlers
499-
[event_filtering]:/docs/building-operators/golang/references/event-filtering/
500-
[controller_options]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/controller#Options
501-
[controller_godocs]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/controller
502-
[operator_scope]:/docs/building-operators/golang/operator-scope/
503-
[kubebuilder_layout_doc]:https://book.kubebuilder.io/cronjob-tutorial/basic-project.html
504-
[go_mod_wiki]: https://github.com/golang/go/wiki/Modules
505-
[doc_client_api]:/docs/building-operators/golang/references/client/
506-
[manager_go_doc]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/manager#Manager
507-
[request-go-doc]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/reconcile#Request
508-
[result_go_doc]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/reconcile#Result
509-
[multi-namespaced-cache-builder]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/cache#MultiNamespacedCacheBuilder
510-
[kubebuilder_entrypoint_doc]: https://book.kubebuilder.io/cronjob-tutorial/empty-main.html
510+
[API-groups]:https://kubernetes.io/docs/concepts/overview/kubernetes-api/#api-groups
511+
[activate_modules]: https://github.com/golang/go/wiki/Modules#how-to-install-and-activate-module-support
512+
[advanced-topics]: /docs/building-operators/golang/advanced-topics/
511513
[api_terms_doc]: https://book.kubebuilder.io/cronjob-tutorial/gvks.html
512-
[kb_controller_doc]: https://book.kubebuilder.io/cronjob-tutorial/controller-overview.html
513-
[kb_api_doc]: https://book.kubebuilder.io/cronjob-tutorial/new-api.html
514+
[builder_godocs]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/builder#example-Builder
515+
[conditionals]: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties
516+
[controller-runtime]: https://github.com/kubernetes-sigs/controller-runtime
517+
[controller_godocs]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/controller
518+
[controller_options]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/controller#Options
514519
[controller_tools]: https://sigs.k8s.io/controller-tools
515-
[doc-validation-schema]: https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#specifying-a-structural-schema
516-
[generating-crd]: https://book.kubebuilder.io/reference/generating-crd.html
517-
[markers]: https://book.kubebuilder.io/reference/markers.html
518520
[crd-markers]: https://book.kubebuilder.io/reference/markers/crd-validation.html
519-
[memcached_controller]: https://github.com/operator-framework/operator-sdk/blob/latest/testdata/go/v3/memcached-operator/controllers/memcached_controller.go
520-
[builder_godocs]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/builder#example-Builder
521-
[activate_modules]: https://github.com/golang/go/wiki/Modules#how-to-install-and-activate-module-support
522-
[advanced-topics]: /docs/building-operators/golang/advanced-topics/
523521
[create_a_webhook]: /docs/building-operators/golang/webhook
524-
[status_marker]: https://book.kubebuilder.io/reference/generating-crd.html#status
525-
[status_subresource]: https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#status-subresource
526-
[API-groups]:https://kubernetes.io/docs/concepts/overview/kubernetes-api/#api-groups
527-
[legacy_CLI]:https://v0-19-x.sdk.operatorframework.io/docs/cli/
528-
[role-based-access-control]: https://cloud.google.com/kubernetes-engine/docs/how-to/role-based-access-control#iam-rolebinding-bootstrap
529-
[multigroup-kubebuilder-doc]: https://book.kubebuilder.io/migration/multi-group.html
522+
[deploy-image-plugin-doc]: https://master.book.kubebuilder.io/plugins/deploy-image-plugin-v1-alpha.html
530523
[doc-bundle]:https://github.com/operator-framework/operator-registry/blob/v1.16.1/docs/design/operator-bundle.md#operator-bundle
531-
[tutorial-bundle]:/docs/olm-integration/tutorial-bundle
532-
[quickstart-bundle]:/docs/olm-integration/quickstart-bundle
533524
[doc-olm]:/docs/olm-integration/tutorial-bundle/#enabling-olm
534-
[conditionals]: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties
525+
[doc-validation-schema]: https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#specifying-a-structural-schema
526+
[doc_client_api]:/docs/building-operators/golang/references/client/
527+
[enqueue_requests_from_map_func]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/handler#EnqueueRequestsFromMapFunc
528+
[event_filtering]:/docs/building-operators/golang/references/event-filtering/
529+
[event_handler_godocs]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/handler#hdr-EventHandlers
530+
[generating-crd]: https://book.kubebuilder.io/reference/generating-crd.html
531+
[go_mod_wiki]: https://github.com/golang/go/wiki/Modules
532+
[image-reg-config]:/docs/olm-integration/cli-overview#private-bundle-and-catalog-image-registries
533+
[install-guide]:/docs/building-operators/golang/installation
534+
[k8s-doc-deleting-cascade]: https://kubernetes.io/docs/concepts/architecture/garbage-collection/#cascading-deletion
535+
[k8s-doc-owner-ref]: https://kubernetes.io/docs/concepts/overview/working-with-objects/owners-dependents/
536+
[kb-doc-gkvs]: https://book.kubebuilder.io/cronjob-tutorial/gvks.html
537+
[kb_api_doc]: https://book.kubebuilder.io/cronjob-tutorial/new-api.html
538+
[kb_controller_doc]: https://book.kubebuilder.io/cronjob-tutorial/controller-overview.html
539+
[kubebuilder_entrypoint_doc]: https://book.kubebuilder.io/cronjob-tutorial/empty-main.html
540+
[kubebuilder_layout_doc]:https://book.kubebuilder.io/cronjob-tutorial/basic-project.html
535541
[kubernetes-extend-api]: https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/
536-
[reconcile-godoc]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/reconcile
537-
[rbac-k8s-doc]: https://kubernetes.io/docs/reference/access-authn-authz/rbac/
542+
[legacy-quickstart-doc]:https://v0-19-x.sdk.operatorframework.io/docs/golang/legacy/quickstart/
543+
[legacy_CLI]:https://v0-19-x.sdk.operatorframework.io/docs/cli
544+
[manager_go_doc]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/manager#Manager
545+
[markers]: https://book.kubebuilder.io/reference/markers.html
546+
[memcached_controller]: https://github.com/operator-framework/operator-sdk/blob/latest/testdata/go/v3/memcached-operator/controllers/memcached_controller.go
547+
[migration-guide]:/docs/building-operators/golang/migration
548+
[multi-namespaced-cache-builder]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/cache#MultiNamespacedCacheBuilder
549+
[multigroup-kubebuilder-doc]: https://book.kubebuilder.io/migration/multi-group.html
538550
[olm-integration]: /docs/olm-integration
539551
[openapi-validation]: /docs/building-operators/golang/references/openapi-validation
540-
[controller-runtime]: https://github.com/kubernetes-sigs/controller-runtime
541-
[kb-doc-gkvs]: https://book.kubebuilder.io/cronjob-tutorial/gvks.html
552+
[operator_scope]:/docs/building-operators/golang/operator-scope/
553+
[quickstart-bundle]:/docs/olm-integration/quickstart-bundle
554+
[rbac-k8s-doc]: https://kubernetes.io/docs/reference/access-authn-authz/rbac/
542555
[rbac_markers]: https://book.kubebuilder.io/reference/markers/rbac.html
543-
[k8s-doc-owner-ref]: https://kubernetes.io/docs/concepts/overview/working-with-objects/owners-dependents/
544-
[k8s-doc-deleting-cascade]: https://kubernetes.io/docs/concepts/architecture/garbage-collection/#cascading-deletion
545-
[deploy-image-plugin-doc]: https://master.book.kubebuilder.io/plugins/deploy-image-plugin-v1-alpha.html
556+
[reconcile-godoc]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/reconcile
557+
[request-go-doc]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/reconcile#Request
558+
[result_go_doc]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/reconcile#Result
559+
[role-based-access-control]: https://cloud.google.com/kubernetes-engine/docs/how-to/role-based-access-control#iam-rolebinding-bootstrap
560+
[status_marker]: https://book.kubebuilder.io/reference/generating-crd.html#status
561+
[status_subresource]: https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#status-subresource
562+
[tutorial-bundle]:/docs/olm-integration/tutorial-bundle

0 commit comments

Comments
 (0)