Add events
This commit is contained in:
parent
9d4c56545e
commit
ec248f2d42
|
|
@ -9,6 +9,7 @@ import (
|
|||
|
||||
"github.com/VirtusLab/jenkins-operator/pkg/apis"
|
||||
"github.com/VirtusLab/jenkins-operator/pkg/controller/jenkins"
|
||||
"github.com/VirtusLab/jenkins-operator/pkg/event"
|
||||
"github.com/VirtusLab/jenkins-operator/pkg/log"
|
||||
"github.com/VirtusLab/jenkins-operator/version"
|
||||
|
||||
|
|
@ -79,8 +80,14 @@ func main() {
|
|||
fatal(err, "failed to setup scheme")
|
||||
}
|
||||
|
||||
// setup events
|
||||
events, err := event.New(cfg)
|
||||
if err != nil {
|
||||
fatal(err, "failed to create manager")
|
||||
}
|
||||
|
||||
// setup Jenkins controller
|
||||
if err := jenkins.Add(mgr, *local, *minikube); err != nil {
|
||||
if err := jenkins.Add(mgr, *local, *minikube, events); err != nil {
|
||||
fatal(err, "failed to setup controllers")
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,11 +9,13 @@ import (
|
|||
"github.com/VirtusLab/jenkins-operator/pkg/controller/jenkins/configuration/user"
|
||||
"github.com/VirtusLab/jenkins-operator/pkg/controller/jenkins/constants"
|
||||
"github.com/VirtusLab/jenkins-operator/pkg/controller/jenkins/plugins"
|
||||
"github.com/VirtusLab/jenkins-operator/pkg/event"
|
||||
"github.com/VirtusLab/jenkins-operator/pkg/log"
|
||||
|
||||
"github.com/go-logr/logr"
|
||||
"github.com/pkg/errors"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/api/errors"
|
||||
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||
"k8s.io/apimachinery/pkg/api/resource"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
|
|
@ -25,19 +27,26 @@ import (
|
|||
"sigs.k8s.io/controller-runtime/pkg/source"
|
||||
)
|
||||
|
||||
const (
|
||||
ReasonBaseConfigurationSuccess event.Reason = "BaseConfigurationSuccess"
|
||||
ReasonBaseConfigurationFailure event.Reason = "BaseConfigurationFailure"
|
||||
ReasonCRValidationFailure event.Reason = "CRValidationFailure"
|
||||
)
|
||||
|
||||
// Add creates a new Jenkins Controller and adds it to the Manager. The Manager will set fields on the Controller
|
||||
// and Start it when the Manager is Started.
|
||||
func Add(mgr manager.Manager, local, minikube bool) error {
|
||||
return add(mgr, newReconciler(mgr, local, minikube))
|
||||
func Add(mgr manager.Manager, local, minikube bool, events event.Recorder) error {
|
||||
return add(mgr, newReconciler(mgr, local, minikube, events))
|
||||
}
|
||||
|
||||
// newReconciler returns a new reconcile.Reconciler
|
||||
func newReconciler(mgr manager.Manager, local, minikube bool) reconcile.Reconciler {
|
||||
func newReconciler(mgr manager.Manager, local, minikube bool, events event.Recorder) reconcile.Reconciler {
|
||||
return &ReconcileJenkins{
|
||||
client: mgr.GetClient(),
|
||||
scheme: mgr.GetScheme(),
|
||||
local: local,
|
||||
minikube: minikube,
|
||||
events: events,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -85,6 +94,7 @@ type ReconcileJenkins struct {
|
|||
client client.Client
|
||||
scheme *runtime.Scheme
|
||||
local, minikube bool
|
||||
events event.Recorder
|
||||
}
|
||||
|
||||
// Reconcile it's a main reconciliation loop which maintain desired state based on Jenkins.Spec
|
||||
|
|
@ -93,7 +103,7 @@ func (r *ReconcileJenkins) Reconcile(request reconcile.Request) (reconcile.Resul
|
|||
logger.V(log.VDebug).Info("Reconciling Jenkins")
|
||||
|
||||
result, err := r.reconcile(request, logger)
|
||||
if err != nil && errors.IsConflict(err) {
|
||||
if err != nil && apierrors.IsConflict(err) {
|
||||
logger.V(log.VWarn).Info(err.Error())
|
||||
return reconcile.Result{Requeue: true}, nil
|
||||
} else if err != nil {
|
||||
|
|
@ -108,7 +118,7 @@ func (r *ReconcileJenkins) reconcile(request reconcile.Request, logger logr.Logg
|
|||
jenkins := &virtuslabv1alpha1.Jenkins{}
|
||||
err := r.client.Get(context.TODO(), request.NamespacedName, jenkins)
|
||||
if err != nil {
|
||||
if errors.IsNotFound(err) {
|
||||
if apierrors.IsNotFound(err) {
|
||||
// Request object not found, could have been deleted after reconcile request.
|
||||
// Owned objects are automatically garbage collected. For additional cleanup logic use finalizers.
|
||||
// Return and don't requeue
|
||||
|
|
@ -128,16 +138,19 @@ func (r *ReconcileJenkins) reconcile(request reconcile.Request, logger logr.Logg
|
|||
|
||||
valid, err := baseConfiguration.Validate(jenkins)
|
||||
if err != nil {
|
||||
return reconcile.Result{}, err
|
||||
r.events.Emitf(jenkins, event.TypeWarning, ReasonBaseConfigurationFailure, "Base configuration failed: %s", err)
|
||||
return reconcile.Result{}, errors.Wrap(err, "Base configuration failed")
|
||||
}
|
||||
if !valid {
|
||||
logger.V(log.VWarn).Info("Validation of user configuration failed, please correct Jenkins CR")
|
||||
r.events.Emit(jenkins, event.TypeWarning, ReasonCRValidationFailure, "Base CR validation failed")
|
||||
logger.V(log.VWarn).Info("Validation of base configuration failed, please correct Jenkins CR")
|
||||
return reconcile.Result{}, nil // don't requeue
|
||||
}
|
||||
|
||||
result, jenkinsClient, err := baseConfiguration.Reconcile()
|
||||
if err != nil {
|
||||
return reconcile.Result{}, err
|
||||
r.events.Emitf(jenkins, event.TypeWarning, ReasonBaseConfigurationFailure, "Base configuration failed: %s", err)
|
||||
return reconcile.Result{}, errors.Wrap(err, "Base configuration failed")
|
||||
}
|
||||
if result.Requeue {
|
||||
return result, nil
|
||||
|
|
@ -151,9 +164,9 @@ func (r *ReconcileJenkins) reconcile(request reconcile.Request, logger logr.Logg
|
|||
if err != nil {
|
||||
return reconcile.Result{}, err
|
||||
}
|
||||
r.events.Emit(jenkins, event.TypeNormal, ReasonBaseConfigurationSuccess, "Base configuration completed")
|
||||
logger.Info("Base configuration completed time has been updated")
|
||||
}
|
||||
|
||||
// Reconcile user configuration
|
||||
userConfiguration := user.New(r.client, jenkinsClient, logger, jenkins)
|
||||
|
||||
|
|
@ -163,12 +176,13 @@ func (r *ReconcileJenkins) reconcile(request reconcile.Request, logger logr.Logg
|
|||
}
|
||||
if !valid {
|
||||
logger.V(log.VWarn).Info("Validation of user configuration failed, please correct Jenkins CR")
|
||||
r.events.Emit(jenkins, event.TypeWarning, ReasonCRValidationFailure, "User CR validation failed")
|
||||
return reconcile.Result{}, nil // don't requeue
|
||||
}
|
||||
|
||||
result, err = userConfiguration.Reconcile()
|
||||
if err != nil {
|
||||
return reconcile.Result{}, err
|
||||
return reconcile.Result{}, errors.Wrap(err, "Base configuration failed")
|
||||
}
|
||||
if result.Requeue {
|
||||
return result, nil
|
||||
|
|
@ -188,7 +202,7 @@ func (r *ReconcileJenkins) reconcile(request reconcile.Request, logger logr.Logg
|
|||
return reconcile.Result{}, nil
|
||||
}
|
||||
|
||||
func (r *ReconcileJenkins) buildLogger(jenkinsName string) logr.Logger {
|
||||
func (*ReconcileJenkins) buildLogger(jenkinsName string) logr.Logger {
|
||||
return log.Log.WithValues("cr", jenkinsName)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,71 @@
|
|||
package event
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/VirtusLab/jenkins-operator/pkg/controller/jenkins/constants"
|
||||
|
||||
"github.com/golang/glog"
|
||||
"k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/client-go/kubernetes"
|
||||
"k8s.io/client-go/kubernetes/scheme"
|
||||
typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
|
||||
"k8s.io/client-go/rest"
|
||||
"k8s.io/client-go/tools/record"
|
||||
)
|
||||
|
||||
const (
|
||||
// Information only and will not cause any problems
|
||||
TypeNormal = Type("Normal")
|
||||
// These events are to warn that something might go wrong
|
||||
TypeWarning = Type("Warning")
|
||||
)
|
||||
|
||||
type Type string
|
||||
type Reason string
|
||||
|
||||
type Recorder interface {
|
||||
Emit(object runtime.Object, eventType Type, reason Reason, message string)
|
||||
Emitf(object runtime.Object, eventType Type, reason Reason, format string, args ...interface{})
|
||||
}
|
||||
|
||||
type recorder struct {
|
||||
recorder record.EventRecorder
|
||||
}
|
||||
|
||||
func New(config *rest.Config) (Recorder, error) {
|
||||
eventRecorder, err := initializeEventRecorder(config)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &recorder{
|
||||
recorder: eventRecorder,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func initializeEventRecorder(config *rest.Config) (record.EventRecorder, error) {
|
||||
client, err := kubernetes.NewForConfig(config)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
eventBroadcaster := record.NewBroadcaster()
|
||||
eventBroadcaster.StartLogging(glog.Infof)
|
||||
eventBroadcaster.StartRecordingToSink(
|
||||
&typedcorev1.EventSinkImpl{
|
||||
Interface: client.CoreV1().Events("")})
|
||||
eventRecorder := eventBroadcaster.NewRecorder(
|
||||
scheme.Scheme,
|
||||
v1.EventSource{
|
||||
Component: constants.OperatorName})
|
||||
return eventRecorder, nil
|
||||
}
|
||||
|
||||
func (r recorder) Emit(object runtime.Object, eventType Type, reason Reason, message string) {
|
||||
r.recorder.Event(object, string(eventType), string(reason), message)
|
||||
}
|
||||
|
||||
func (r recorder) Emitf(object runtime.Object, eventType Type, reason Reason, format string, args ...interface{}) {
|
||||
r.recorder.Event(object, string(eventType), string(reason), fmt.Sprintf(format, args...))
|
||||
}
|
||||
Loading…
Reference in New Issue