Implement GitLab receiver

This commit is contained in:
stefanprodan 2020-07-04 08:32:12 +03:00
parent 28e8477e29
commit a2ced40e9e
1 changed files with 31 additions and 3 deletions

View File

@ -19,13 +19,13 @@ package server
import (
"context"
"fmt"
"github.com/google/go-github/v32/github"
corev1 "k8s.io/api/core/v1"
"net/http"
"net/url"
"os"
"strings"
"github.com/google/go-github/v32/github"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
@ -61,10 +61,12 @@ func (s *ReceiverServer) handlePayload() func(w http.ResponseWriter, r *http.Req
return
}
withErrors := false
for _, receiver := range receivers {
if err := s.validate(ctx, receiver, r); err != nil {
s.logger.Error(err, "unable to validate payload",
"receiver", receiver.Name)
withErrors = true
continue
}
@ -73,12 +75,19 @@ func (s *ReceiverServer) handlePayload() func(w http.ResponseWriter, r *http.Req
if err := s.annotate(ctx, resource, receiver.Namespace); err != nil {
s.logger.Error(err, "unable to annotate resource",
"receiver", receiver.Name)
withErrors = true
} else {
s.logger.Info("resource annotated", "receiver", receiver.Name,
"resource", resource.Name)
}
}
}
if withErrors {
w.WriteHeader(http.StatusBadRequest)
} else {
w.WriteHeader(http.StatusOK)
}
}
}
@ -119,6 +128,25 @@ func (s *ReceiverServer) validate(ctx context.Context, receiver v1alpha1.Receive
s.logger.Info("handling GitHub event: "+event, "receiver", receiver.Name)
return nil
case v1alpha1.GitLabReceiver:
if r.Header.Get("X-Gitlab-Token") != token {
return fmt.Errorf("the GitLab token does not match")
}
event := r.Header.Get("X-Gitlab-Event")
if len(receiver.Spec.Events) > 0 {
allowed := false
for _, e := range receiver.Spec.Events {
if strings.ToLower(event) == strings.ToLower(e) {
allowed = true
break
}
}
if !allowed {
return fmt.Errorf("GitLab event '%s' is not authorised", event)
}
}
s.logger.Info("handling GitLab event: "+event, "receiver", receiver.Name)
return nil
}
return nil
@ -140,7 +168,7 @@ func (s *ReceiverServer) token(ctx context.Context, receiver v1alpha1.Receiver)
if val, ok := secret.Data["token"]; ok {
token = string(val)
} else {
return "", fmt.Errorf("invalid '%s' secret data: required fields 'token'", secretName)
return "", fmt.Errorf("invalid '%s' secret data: required field 'token'", secretName)
}
return token, nil