diff --git a/pkg/registry/apis/provisioning/webhooks/pullrequest/comment.go b/pkg/registry/apis/provisioning/webhooks/pullrequest/comment.go index 9229df5a433..3d028efbaec 100644 --- a/pkg/registry/apis/provisioning/webhooks/pullrequest/comment.go +++ b/pkg/registry/apis/provisioning/webhooks/pullrequest/comment.go @@ -10,16 +10,18 @@ import ( ) type commenter struct { - templateDashboard *template.Template - templateTable *template.Template - templateRenderInfo *template.Template + templateDashboard *template.Template + templateTable *template.Template + templateRenderInfo *template.Template + showImageRendererNote bool } -func NewCommenter() Commenter { +func NewCommenter(showImageRendererNote bool) Commenter { return &commenter{ - templateDashboard: template.Must(template.New("dashboard").Parse(commentTemplateSingleDashboard)), - templateTable: template.Must(template.New("table").Parse(commentTemplateTable)), - templateRenderInfo: template.Must(template.New("setup").Parse(commentTemplateMissingImageRenderer)), + templateDashboard: template.Must(template.New("dashboard").Parse(commentTemplateSingleDashboard)), + templateTable: template.Must(template.New("table").Parse(commentTemplateTable)), + templateRenderInfo: template.Must(template.New("setup").Parse(commentTemplateMissingImageRenderer)), + showImageRendererNote: showImageRendererNote, } } @@ -53,7 +55,7 @@ func (c *commenter) generateComment(_ context.Context, info changeInfo) (string, } } - if info.MissingImageRenderer { + if info.MissingImageRenderer && c.showImageRendererNote { if err := c.templateRenderInfo.Execute(&buf, info); err != nil { return "", fmt.Errorf("unable to execute template: %w", err) } @@ -101,9 +103,8 @@ and {{ .SkippedFiles }} more files. {{ end}} ` -// TODO: this should expand and show links to setup docs const commentTemplateMissingImageRenderer = ` -NOTE: The image renderer is not configured +NOTE: To enable dashboard previews in pull requests, refer to the [image rendering setup documentation](https://grafana.com/docs/grafana/latest/observability-as-code/provision-resources/git-sync-setup/#configure-webhooks-and-image-rendering). ` // TODO: does this have some value? diff --git a/pkg/registry/apis/provisioning/webhooks/pullrequest/comment_test.go b/pkg/registry/apis/provisioning/webhooks/pullrequest/comment_test.go index afcdb945a8c..7339b75710f 100644 --- a/pkg/registry/apis/provisioning/webhooks/pullrequest/comment_test.go +++ b/pkg/registry/apis/provisioning/webhooks/pullrequest/comment_test.go @@ -21,7 +21,7 @@ func TestCommenter_Comment_FailedToComment(t *testing.T) { repo := NewMockPullRequestRepo(t) repo.On("CommentPullRequest", context.Background(), 1, mock.Anything).Return(errors.New("failed")) - commenter := NewCommenter() + commenter := NewCommenter(false) err := commenter.Comment(context.Background(), repo, 1, changeInfo{}) require.Error(t, err) } @@ -138,9 +138,78 @@ func TestGenerateComment(t *testing.T) { require.NoError(t, err) repo.On("CommentPullRequest", context.Background(), 1, string(expect)).Return(nil) - commenter := NewCommenter() + commenter := NewCommenter(false) err = commenter.Comment(context.Background(), repo, 1, tc.Input) require.NoError(t, err) }) } } + +func TestCommenter_ShowImageRendererNote(t *testing.T) { + t.Run("note appears when showImageRendererNote is true", func(t *testing.T) { + repo := NewMockPullRequestRepo(t) + info := changeInfo{ + GrafanaBaseURL: "http://host/", + Changes: []fileChangeInfo{ + { + Parsed: &resources.ParsedResource{ + Info: &repository.FileInfo{ + Path: "file.json", + }, + Action: v0alpha1.ResourceActionUpdate, + GVK: schema.GroupVersionKind{Kind: "Dashboard"}, + }, + Title: "Existing Dashboard", + GrafanaURL: "http://grafana/d/uid", + PreviewURL: "http://grafana/admin/preview", + }, + }, + MissingImageRenderer: true, + } + + var capturedComment string + repo.On("CommentPullRequest", context.Background(), 1, mock.MatchedBy(func(comment string) bool { + capturedComment = comment + return true + })).Return(nil) + + commenter := NewCommenter(true) + err := commenter.Comment(context.Background(), repo, 1, info) + require.NoError(t, err) + require.Contains(t, capturedComment, "NOTE: To enable dashboard previews") + require.Contains(t, capturedComment, "https://grafana.com/docs/grafana/latest/observability-as-code/provision-resources/git-sync-setup/#configure-webhooks-and-image-rendering") + }) + + t.Run("note does not appear when showImageRendererNote is false", func(t *testing.T) { + repo := NewMockPullRequestRepo(t) + info := changeInfo{ + GrafanaBaseURL: "http://host/", + Changes: []fileChangeInfo{ + { + Parsed: &resources.ParsedResource{ + Info: &repository.FileInfo{ + Path: "file.json", + }, + Action: v0alpha1.ResourceActionUpdate, + GVK: schema.GroupVersionKind{Kind: "Dashboard"}, + }, + Title: "Existing Dashboard", + GrafanaURL: "http://grafana/d/uid", + PreviewURL: "http://grafana/admin/preview", + }, + }, + MissingImageRenderer: true, + } + + var capturedComment string + repo.On("CommentPullRequest", context.Background(), 1, mock.MatchedBy(func(comment string) bool { + capturedComment = comment + return true + })).Return(nil) + + commenter := NewCommenter(false) + err := commenter.Comment(context.Background(), repo, 1, info) + require.NoError(t, err) + require.NotContains(t, capturedComment, "NOTE: To enable dashboard previews") + }) +} diff --git a/pkg/registry/apis/provisioning/webhooks/pullrequest/testdata/update-dashboard-missing-renderer.md b/pkg/registry/apis/provisioning/webhooks/pullrequest/testdata/update-dashboard-missing-renderer.md index 79d31c86cee..1f48d70c931 100755 --- a/pkg/registry/apis/provisioning/webhooks/pullrequest/testdata/update-dashboard-missing-renderer.md +++ b/pkg/registry/apis/provisioning/webhooks/pullrequest/testdata/update-dashboard-missing-renderer.md @@ -2,6 +2,4 @@ Hey there! 🎉 Grafana spotted some changes to your dashboard. -See the [original](http://grafana/d/uid) and [preview](http://grafana/admin/preview) of file.json. - -NOTE: The image renderer is not configured \ No newline at end of file +See the [original](http://grafana/d/uid) and [preview](http://grafana/admin/preview) of file.json. \ No newline at end of file diff --git a/pkg/registry/apis/provisioning/webhooks/pullrequest/worker.go b/pkg/registry/apis/provisioning/webhooks/pullrequest/worker.go index 9e15e63ab12..a39d63ad259 100644 --- a/pkg/registry/apis/provisioning/webhooks/pullrequest/worker.go +++ b/pkg/registry/apis/provisioning/webhooks/pullrequest/worker.go @@ -38,7 +38,7 @@ func ProvidePullRequestWorker( parsers := resources.NewParserFactory(clients) screenshotRenderer := NewScreenshotRenderer(renderer, blobstore) evaluator := NewEvaluator(screenshotRenderer, parsers, urlProvider, registry) - commenter := NewCommenter() + commenter := NewCommenter(cfg.ProvisioningAllowImageRendering) return NewPullRequestWorker(evaluator, commenter, registry) } diff --git a/pkg/registry/apis/provisioning/webhooks/register.go b/pkg/registry/apis/provisioning/webhooks/register.go index e19eaff18de..bfda4a67da4 100644 --- a/pkg/registry/apis/provisioning/webhooks/register.go +++ b/pkg/registry/apis/provisioning/webhooks/register.go @@ -88,7 +88,7 @@ func ProvideWebhooksWithImages( ) evaluator := pullrequest.NewEvaluator(screenshotRenderer, parsers, urlProvider, registry) - commenter := pullrequest.NewCommenter() + commenter := pullrequest.NewCommenter(cfg.ProvisioningAllowImageRendering) pullRequestWorker := pullrequest.NewPullRequestWorker(evaluator, commenter, registry) return NewWebhookExtraWithImages(