Skip to content

Commit

Permalink
Use controller-runtime structured logging
Browse files Browse the repository at this point in the history
Signed-off-by: Stefan Prodan <[email protected]>
  • Loading branch information
stefanprodan committed Mar 15, 2021
1 parent 099193c commit 78fa2d1
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 57 deletions.
36 changes: 22 additions & 14 deletions internal/server/event_handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,16 +106,17 @@ func (s *EventServer) handleEvent() func(w http.ResponseWriter, r *http.Request)

if len(alerts) == 0 {
s.logger.Info("Discarding event, no alerts found for the involved object",
"object", event.InvolvedObject.Namespace+"/"+event.InvolvedObject.Name,
"kind", event.InvolvedObject.Kind)
"reconciler kind", event.InvolvedObject.Kind,
"name", event.InvolvedObject.Name,
"namespace", event.InvolvedObject.Namespace)
w.WriteHeader(http.StatusAccepted)
return
}

s.logger.Info("Dispatching event",
"object", event.InvolvedObject.Namespace+"/"+event.InvolvedObject.Name,
"kind", event.InvolvedObject.Kind,
"message", event.Message)
s.logger.Info(fmt.Sprintf("Dispatching event: %s", event.Message),
"reconciler kind", event.InvolvedObject.Kind,
"name", event.InvolvedObject.Name,
"namespace", event.InvolvedObject.Namespace)

// dispatch notifications
for _, alert := range alerts {
Expand All @@ -125,7 +126,9 @@ func (s *EventServer) handleEvent() func(w http.ResponseWriter, r *http.Request)
err = s.kubeClient.Get(ctx, providerName, &provider)
if err != nil {
s.logger.Error(err, "failed to read provider",
"provider", providerName)
"reconciler kind", v1beta1.ProviderKind,
"name", providerName.Name,
"namespace", providerName.Namespace)
continue
}

Expand All @@ -138,8 +141,9 @@ func (s *EventServer) handleEvent() func(w http.ResponseWriter, r *http.Request)
err = s.kubeClient.Get(ctx, secretName, &secret)
if err != nil {
s.logger.Error(err, "failed to read secret",
"provider", providerName,
"secret", secretName.Name)
"reconciler kind", v1beta1.ProviderKind,
"name", providerName.Name,
"namespace", providerName.Namespace)
continue
}

Expand All @@ -154,16 +158,19 @@ func (s *EventServer) handleEvent() func(w http.ResponseWriter, r *http.Request)

if webhook == "" {
s.logger.Error(nil, "provider has no address",
"provider", providerName)
"reconciler kind", v1beta1.ProviderKind,
"name", providerName.Name,
"namespace", providerName.Namespace)
continue
}

factory := notifier.NewFactory(webhook, provider.Spec.Proxy, provider.Spec.Username, provider.Spec.Channel, token)
sender, err := factory.Notifier(provider.Spec.Type)
if err != nil {
s.logger.Error(err, "failed to initialise provider",
"provider", providerName,
"type", provider.Spec.Type)
"reconciler kind", v1beta1.ProviderKind,
"name", providerName.Name,
"namespace", providerName.Namespace)
continue
}

Expand All @@ -181,8 +188,9 @@ func (s *EventServer) handleEvent() func(w http.ResponseWriter, r *http.Request)
go func(n notifier.Interface, e recorder.Event) {
if err := n.Post(e); err != nil {
s.logger.Error(err, "failed to send notification",
"object", e.InvolvedObject.Namespace+"/"+e.InvolvedObject.Name,
"kind", e.InvolvedObject.Kind)
"reconciler kind", event.InvolvedObject.Kind,
"name", event.InvolvedObject.Name,
"namespace", event.InvolvedObject.Namespace)
}
}(sender, notification)
}
Expand Down
72 changes: 29 additions & 43 deletions internal/server/receiver_handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ func (s *ReceiverServer) handlePayload() func(w http.ResponseWriter, r *http.Req
ctx := context.Background()
digest := url.PathEscape(strings.TrimLeft(r.RequestURI, "/hook/"))

s.logger.Info("handling request", "digest", digest)
s.logger.Info(fmt.Sprintf("handling request: %s", digest))

var allReceivers v1beta1.ReceiverList
err := s.kubeClient.List(ctx, &allReceivers)
Expand All @@ -74,22 +74,25 @@ func (s *ReceiverServer) handlePayload() func(w http.ResponseWriter, r *http.Req

withErrors := false
for _, receiver := range receivers {
logger := s.logger.WithValues(
"reconciler kind", v1beta1.ReceiverKind,
"name", receiver.Name,
"namespace", receiver.Namespace)

if err := s.validate(ctx, receiver, r); err != nil {
s.logger.Error(err, "unable to validate payload",
"receiver", receiver.Name)
logger.Error(err, "unable to validate payload")
withErrors = true
continue
}

s.logger.Info("found matching receiver", "receiver", receiver.Name)
for _, resource := range receiver.Spec.Resources {
if err := s.annotate(ctx, resource, receiver.Namespace); err != nil {
s.logger.Error(err, "unable to annotate resource",
"receiver", receiver.Name)
logger.Error(err, fmt.Sprintf("unable to annotate resource '%s/%s.%s'",
resource.Kind, resource.Name, resource.Namespace))
withErrors = true
} else {
s.logger.Info("resource annotated", "receiver", receiver.Name,
"resource", resource.Name)
logger.Info(fmt.Sprintf("resource '%s/%s.%s' annotated",
resource.Kind, resource.Name, resource.Namespace))
}
}
}
Expand All @@ -108,6 +111,11 @@ func (s *ReceiverServer) validate(ctx context.Context, receiver v1beta1.Receiver
return fmt.Errorf("unable to read token, error: %w", err)
}

logger := s.logger.WithValues(
"reconciler kind", v1beta1.ReceiverKind,
"name", receiver.Name,
"namespace", receiver.Namespace)

switch receiver.Spec.Type {
case v1beta1.GenericReceiver:
return nil
Expand All @@ -119,12 +127,8 @@ func (s *ReceiverServer) validate(ctx context.Context, receiver v1beta1.Receiver

err = github.ValidateSignature(r.Header.Get("X-Signature"), b, []byte(token))
if err != nil {
return fmt.Errorf("unable to validate signature: %s", err)
return fmt.Errorf("unable to validate HMAC signature: %s", err)
}

s.logger.Info(
"handling event from generic-hmac wehbook",
"receiver", receiver.Name)
return nil
case v1beta1.GitHubReceiver:
payload, err := github.ValidatePayload(r, []byte(token))
Expand All @@ -137,7 +141,6 @@ func (s *ReceiverServer) validate(ctx context.Context, receiver v1beta1.Receiver
}

event := github.WebHookType(r)

if len(receiver.Spec.Events) > 0 {
allowed := false
for _, e := range receiver.Spec.Events {
Expand All @@ -151,7 +154,7 @@ func (s *ReceiverServer) validate(ctx context.Context, receiver v1beta1.Receiver
}
}

s.logger.Info("handling GitHub event: "+event, "receiver", receiver.Name)
logger.Info(fmt.Sprintf("handling GitHub event: %s", event))
return nil
case v1beta1.GitLabReceiver:
if r.Header.Get("X-Gitlab-Token") != token {
Expand All @@ -172,7 +175,7 @@ func (s *ReceiverServer) validate(ctx context.Context, receiver v1beta1.Receiver
}
}

s.logger.Info("handling GitLab event: "+event, "receiver", receiver.Name)
logger.Info(fmt.Sprintf("handling GitLab event: %s", event))
return nil
case v1beta1.BitbucketReceiver:
_, err := github.ValidatePayload(r, []byte(token))
Expand All @@ -181,7 +184,6 @@ func (s *ReceiverServer) validate(ctx context.Context, receiver v1beta1.Receiver
}

event := r.Header.Get("X-Event-Key")

if len(receiver.Spec.Events) > 0 {
allowed := false
for _, e := range receiver.Spec.Events {
Expand All @@ -195,7 +197,7 @@ func (s *ReceiverServer) validate(ctx context.Context, receiver v1beta1.Receiver
}
}

s.logger.Info("handling Bitbucket server event: "+event, "receiver", receiver.Name)
logger.Info(fmt.Sprintf("handling Bitbucket server event: %s", event))
return nil
case v1beta1.QuayReceiver:
type payload struct {
Expand All @@ -208,16 +210,14 @@ func (s *ReceiverServer) validate(ctx context.Context, receiver v1beta1.Receiver
return fmt.Errorf("cannot decode Quay webhook payload")
}

s.logger.Info(
fmt.Sprintf("handling event from %s", p.DockerUrl),
"receiver", receiver.Name)
logger.Info(fmt.Sprintf("handling Quay event from %s", p.DockerUrl))
return nil
case v1beta1.HarborReceiver:
if r.Header.Get("Authorization") != token {
return fmt.Errorf("the Harbor Authorization header value does not match the receiver token")
}

s.logger.Info("handling Harbor event", "receiver", receiver.Name)
logger.Info("handling Harbor event")
return nil
case v1beta1.DockerHubReceiver:
type payload struct {
Expand All @@ -233,9 +233,7 @@ func (s *ReceiverServer) validate(ctx context.Context, receiver v1beta1.Receiver
return fmt.Errorf("cannot decode DockerHub webhook payload")
}

s.logger.Info(
fmt.Sprintf("handling event from %s for tag %s", p.Repository.URL, p.PushData.Tag),
"receiver", receiver.Name)
logger.Info(fmt.Sprintf("handling DockerHub event from %s for tag %s", p.Repository.URL, p.PushData.Tag))
return nil
case v1beta1.GCRReceiver:
const (
Expand Down Expand Up @@ -276,42 +274,32 @@ func (s *ReceiverServer) validate(ctx context.Context, receiver v1beta1.Receiver
return fmt.Errorf("cannot decode GCR webhook body")
}

if strings.ToLower(d.Action) != insert {
s.logger.Info("action is not an insert, moving on")
return nil
}

s.logger.Info(
fmt.Sprintf("handling event from %s for tag %s", d.Digest, d.Tag),
"receiver", receiver.Name)
logger.Info(fmt.Sprintf("handling GCR event from %s for tag %s", d.Digest, d.Tag))
return nil
case v1beta1.NexusReceiver:
signature := r.Header.Get("X-Nexus-Webhook-Signature")
if len(signature) == 0 {
return fmt.Errorf("Signature is missing from header")
return fmt.Errorf("Nexus signature is missing from header")
}

b, err := ioutil.ReadAll(r.Body)
if err != nil {
return fmt.Errorf("cannot read payload. error: %s", err)
return fmt.Errorf("cannot read Nexus payload. error: %s", err)
}

if !verifyHmacSignature([]byte(token), signature, b) {
return fmt.Errorf("invalid nexus signature")
return fmt.Errorf("invalid Nexus signature")
}
type payload struct {
Action string `json:"action"`
RepositoryName string `json:"repositoryName"`
}
var p payload

if err := json.Unmarshal(b, &p); err != nil {
return fmt.Errorf("cannot decode Nexus webhook payload: %s", err)
}

s.logger.Info(
fmt.Sprintf("handling event from %s", p.RepositoryName),
"receiver", receiver.Name)
logger.Info(fmt.Sprintf("handling Nexus event from %s", p.RepositoryName))
return nil
case v1beta1.ACRReceiver:
type target struct {
Expand All @@ -329,9 +317,7 @@ func (s *ReceiverServer) validate(ctx context.Context, receiver v1beta1.Receiver
return fmt.Errorf("cannot decode ACR webhook payload: %s", err)
}

s.logger.Info(
fmt.Sprintf("handling event from %s for tag %s", p.Target.Repository, p.Target.Tag),
"receiver", receiver.Name)
logger.Info(fmt.Sprintf("handling ACR event from %s for tag %s", p.Target.Repository, p.Target.Tag))
return nil
}

Expand Down

0 comments on commit 78fa2d1

Please sign in to comment.