89 lines
2.4 KiB
Go
89 lines
2.4 KiB
Go
package http
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/keel-hq/keel/types"
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
var newAzureWebhooksCounter = prometheus.NewCounterVec(
|
|
prometheus.CounterOpts{
|
|
Name: "azure_webhook_requests_total",
|
|
Help: "How many /v1/webhooks/azure requests processed, partitioned by image.",
|
|
},
|
|
[]string{"image"},
|
|
)
|
|
|
|
func init() {
|
|
prometheus.MustRegister(newAzureWebhooksCounter)
|
|
}
|
|
|
|
// Example of azure trigger
|
|
// {
|
|
// "id": "cb8c3971-9adc-488b-bdd8-43cbb4974ff5",
|
|
// "timestamp": "2017-11-17T16:52:01.343145347Z",
|
|
// "action": "push",
|
|
// "target": {
|
|
// "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
|
|
// "size": 524,
|
|
// "digest": "sha256:80f0d5c8786bb9e621a45ece0db56d11cdc624ad20da9fe62e9d25490f331d7d",
|
|
// "length": 524,
|
|
// "repository": "hello-world",
|
|
// "tag": "v1"
|
|
// },
|
|
// "request": {
|
|
// "id": "3cbb6949-7549-4fa1-86cd-a6d5451dffc7",
|
|
// "host": "myregistry.azurecr.io",
|
|
// "method": "PUT",
|
|
// "useragent": "docker/17.09.0-ce go/go1.8.3 git-commit/afdb6d4 kernel/4.10.0-27-generic os/linux arch/amd64 UpstreamClient(Docker-Client/17.09.0-ce \\(linux\\))"
|
|
// }
|
|
//}
|
|
|
|
type azureWebhook struct {
|
|
Target struct {
|
|
Repository string `json:"repository"`
|
|
Tag string `json:"tag"`
|
|
Digest string `json:"digest"`
|
|
} `json:"target"`
|
|
Request struct {
|
|
Host string `json:"host"`
|
|
} `json:"request"`
|
|
}
|
|
|
|
func (s *TriggerServer) azureHandler(resp http.ResponseWriter, req *http.Request) {
|
|
aw := azureWebhook{}
|
|
if err := json.NewDecoder(req.Body).Decode(&aw); err != nil {
|
|
log.WithFields(log.Fields{
|
|
"error": err,
|
|
}).Error("trigger.azureHandler: failed to decode request")
|
|
resp.WriteHeader(http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
if aw.Target.Tag == "" {
|
|
resp.WriteHeader(http.StatusBadRequest)
|
|
fmt.Fprintf(resp, "tag cannot be empty")
|
|
return
|
|
}
|
|
|
|
// for every updated tag generating event
|
|
var DockerURL = aw.Request.Host + "/" + aw.Target.Repository
|
|
event := types.Event{}
|
|
event.CreatedAt = time.Now()
|
|
event.TriggerName = "azure"
|
|
event.Repository.Name = DockerURL // need to build this url..
|
|
event.Repository.Tag = aw.Target.Tag
|
|
event.Repository.Digest = aw.Target.Digest
|
|
s.trigger(event)
|
|
newAzureWebhooksCounter.With(prometheus.Labels{"image": event.Repository.Name}).Inc()
|
|
|
|
resp.WriteHeader(http.StatusOK)
|
|
return
|
|
}
|