package notifications import ( "context" "fmt" "time" "github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2" "github.com/mailgun/mailgun-go/v3" "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" k8sclient "sigs.k8s.io/controller-runtime/pkg/client" ) const content = `

%s

%s

CR name: %s
Phase: %s
Powered by Jenkins Operator <3
` // MailGun is a sending emails notification service type MailGun struct { k8sClient k8sclient.Client } func (m MailGun) getStatusColor(logLevel v1alpha2.NotificationLogLevel) StatusColor { switch logLevel { case v1alpha2.NotificationLogLevelInfo: return "blue" case v1alpha2.NotificationLogLevelWarning: return "red" default: return "gray" } } // Send is function for sending directly to API func (m MailGun) Send(event Event, config v1alpha2.Notification) error { secret := &corev1.Secret{} selector := config.Mailgun.APIKeySecretKeySelector err := m.k8sClient.Get(context.TODO(), types.NamespacedName{Name: selector.Name, Namespace: event.Jenkins.Namespace}, secret) if err != nil { return errors.WithStack(err) } secretValue := string(secret.Data[selector.Key]) if secretValue == "" { return errors.Errorf("Mailgun API secret is empty in secret '%s/%s[%s]", event.Jenkins.Namespace, selector.Name, selector.Key) } mg := mailgun.NewMailgun(config.Mailgun.Domain, secretValue) var statusMessage string if config.Verbose { message := event.Message + "" statusMessage = message } else { statusMessage = event.Message } htmlMessage := fmt.Sprintf(content, m.getStatusColor(event.LogLevel), notificationTitle(event), statusMessage, event.Jenkins.Name, event.Phase) msg := mg.NewMessage(fmt.Sprintf("Jenkins Operator Notifier <%s>", config.Mailgun.From), notificationTitle(event), "", config.Mailgun.Recipient) msg.SetHtml(htmlMessage) ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() _, _, err = mg.Send(ctx, msg) return err }