Skip to content

Commit

Permalink
Add developer hints
Browse files Browse the repository at this point in the history
We've evolved a lot over time, and we could start nudging developers
to use the now-recommended approaches and avoid the less-recommended
approaches (without breaking compatability).

Introduce a "hints" package that enables this.
  • Loading branch information
justinsb committed Feb 5, 2024
1 parent 2a2b561 commit d5c6992
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 0 deletions.
33 changes: 33 additions & 0 deletions pkg/hints/log.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package hints

import (
"context"
"fmt"
"os"

"k8s.io/klog/v2"
)

// EnvRecommendationsAreStrict is the environment variable that can be set
// to make developer recommendations a panic. It can be set by developers
// while developing to help them keep up with changes to
// kubebuilder-declarative-pattern and any upstream changes.
const EnvRecommendationsAreStrict = "FAIL_ON_DEVELOPER_RECOMMENDATIONS"

// DeveloperRecommendation will log a recommendation for developers;
// helping developers keep up with changes here and upstream.
// If EnvRecommendationsAreStrict is set, we will panic.
func DeveloperRecommendation(ctx context.Context, msg string, keysAndValues ...any) {
log := klog.FromContext(ctx)
log.Info(msg, keysAndValues...)
if os.Getenv(EnvRecommendationsAreStrict) != "" {
s := fmt.Sprintf("recommendation for developers with %s environment variable set, so treating as a failure: %s", EnvRecommendationsAreStrict, msg)
for i := 0; (i + 1) < len(keysAndValues); i++ {
if i != 0 {
s += ", "
}
s += fmt.Sprintf("%v:%v", keysAndValues[i], keysAndValues[i+1])
}
panic(s)
}
}
2 changes: 2 additions & 0 deletions pkg/patterns/declarative/pkg/applier/applylib.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"k8s.io/client-go/dynamic"
"k8s.io/klog/v2"
"sigs.k8s.io/kubebuilder-declarative-pattern/applylib/applyset"
"sigs.k8s.io/kubebuilder-declarative-pattern/pkg/hints"
)

type ApplysetOptions struct {
Expand Down Expand Up @@ -57,6 +58,7 @@ func (a *ApplySetApplier) Apply(ctx context.Context, opt ApplierOptions) error {

dynamicClient := opt.DynamicClient
if dynamicClient == nil {
hints.DeveloperRecommendation(context.Background(), "consider setting ApplierOptions.DynamicClient", "applierOptions", opt)
d, err := dynamic.NewForConfig(opt.RESTConfig)
if err != nil {
return fmt.Errorf("error building dynamic client: %w", err)
Expand Down
2 changes: 2 additions & 0 deletions pkg/patterns/declarative/watch.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import (
"sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/source"
"sigs.k8s.io/kubebuilder-declarative-pattern/commonclient"
"sigs.k8s.io/kubebuilder-declarative-pattern/pkg/hints"
"sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/declarative/pkg/watch"
)

Expand Down Expand Up @@ -96,6 +97,7 @@ func WatchChildren(options WatchChildrenOptions) error {
httpClient = options.HTTPClient
} else {
if options.RESTConfig != nil {
hints.DeveloperRecommendation(context.Background(), "consider setting WatchChildrenOptions.HTTPClient, if setting RESTConfig", "options", options)
hc, err := rest.HTTPClientFor(options.RESTConfig)
if err != nil {
return err
Expand Down

0 comments on commit d5c6992

Please sign in to comment.