Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use controller-runtime structured logging #156

Merged
merged 1 commit into from
Mar 15, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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