diff --git a/pkg/http/harbor_webhook_trigger.go b/pkg/http/harbor_webhook_trigger.go index 8630dd59..2ccddfb8 100644 --- a/pkg/http/harbor_webhook_trigger.go +++ b/pkg/http/harbor_webhook_trigger.go @@ -4,8 +4,8 @@ import ( "encoding/json" "fmt" "net/http" - "time" "regexp" + "time" "github.com/keel-hq/keel/types" "github.com/prometheus/client_golang/prometheus" @@ -46,7 +46,6 @@ func init() { // "repo_type": "private" // } // } -} type harborWebhook struct { Type string `json:"type"` @@ -69,51 +68,60 @@ type harborWebhook struct { } func (s *TriggerServer) harborHandler(resp http.ResponseWriter, req *http.Request) { - qw := harborWebhook{} - if err := json.NewDecoder(req.Body).Decode(&qw); err != nil { + hn := harborWebhook{} + if err := json.NewDecoder(req.Body).Decode(&hn); err != nil { log.WithFields(log.Fields{ "error": err, }).Error("trigger.harborHandler: failed to decode request") resp.WriteHeader(http.StatusBadRequest) return } + log.WithFields(log.Fields{ + "event": hn, + }).Debug("harborHandler: received event, looking for a pushImage tag") - if qw.type == "pushImage" { - if qw.ResourceURL == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(resp, "ResourceURL cannot be empty") + if hn.Type == "pushImage" { + + //go trough all the ressource arrays + for _, e := range hn.EventData.Resources { + fmt.Println("Push found!") + //Split the combined : into seperate fields + splitRegexp := regexp.MustCompile("(.*):(.*)") + splitString := splitRegexp.FindAllStringSubmatch(e.ResourceURL, -1) + DockerURL := splitString[0][1] + tag := splitString[0][2] + + if len(DockerURL) == 0 { + resp.WriteHeader(http.StatusBadRequest) + fmt.Fprintf(resp, "DockerURL cannot be empty") + return + } + + if len(tag) == 0 { + resp.WriteHeader(http.StatusBadRequest) + fmt.Fprintf(resp, "tags cannot be empty") + return + } + + //create event + event := types.Event{} + event.CreatedAt = time.Now() + event.TriggerName = "harbor" + event.Repository.Name = DockerURL + event.Repository.Tag = tag + + log.WithFields(log.Fields{ + "action": hn.Type, + "tag": tag, + "repository": DockerURL, + "digest": e.Digest, + }).Debug("harborHandler: got registry notification, processing") + + s.trigger(event) + newHarborWebhooksCounter.With(prometheus.Labels{"image": event.Repository.Name}).Inc() + + resp.WriteHeader(http.StatusOK) return } - //Split the combined : into seperate fields - split_regexp := regexp.MustCompile("(.*):(.*)") - split_string := split_regexp.FindAllStringSubmatch(qw.ResourceURL,-1) - DockerURL := split_string[0][1] - tag := split_string[0][2] - - if len(DockerURL) == 0 { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(resp, "DockerURL cannot be empty") - return - } - - if len(tag) == 0 { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(resp, "tags cannot be empty") - return - } - - //create event - event := types.Event{} - event.CreatedAt = time.Now() - event.TriggerName = "harbor" - event.Repository.Name = DockerURL - event.Repository.Tag = tag - - s.trigger(event) - newHarborWebhooksCounter.With(prometheus.Labels{"image": event.Repository.Name}).Inc() - } - - resp.WriteHeader(http.StatusOK) - return } diff --git a/pkg/http/harbor_webhook_trigger_test.go b/pkg/http/harbor_webhook_trigger_test.go index 669e328f..8a47d0c4 100644 --- a/pkg/http/harbor_webhook_trigger_test.go +++ b/pkg/http/harbor_webhook_trigger_test.go @@ -16,7 +16,7 @@ var fakeHarborWebhook = ` { "resources": [ { "digest": "sha256:b4758aaed11c155a476b9857e1178f157759c99cb04c907a04993f5481eff848", - "tag": "2.1.6", + "tag": "1.2.3", "resource_url": "quay.io/mynamespace/repository:1.2.3" } ], @@ -31,7 +31,7 @@ var fakeHarborWebhook = ` { } ` -func TestQuayWebhookHandler(t *testing.T) { +func TestHarborWebhookHandler(t *testing.T) { fp := &fakeProvider{} srv, teardown := NewTestingServer(fp)