keel/pkg/http/tracked_endpoint.go

112 lines
2.6 KiB
Go
Raw Normal View History

2019-04-28 16:03:52 +00:00
package http
2019-05-26 16:12:54 +00:00
import (
"encoding/json"
"fmt"
"net/http"
"time"
"github.com/keel-hq/keel/types"
)
2019-04-28 16:03:52 +00:00
type trackedImage struct {
Image string `json:"image"`
Trigger string `json:"trigger"`
2019-05-09 15:58:05 +00:00
PollSchedule string `json:"pollSchedule"`
2019-04-28 16:03:52 +00:00
Provider string `json:"provider"`
Namespace string `json:"namespace"`
Policy string `json:"policy"`
2019-05-09 15:58:05 +00:00
Registry string `json:"registry"`
2019-04-28 16:03:52 +00:00
}
func (s *TriggerServer) trackedHandler(resp http.ResponseWriter, req *http.Request) {
trackedImages, err := s.providers.TrackedImages()
var imgs []trackedImage
for _, img := range trackedImages {
imgs = append(imgs, trackedImage{
Image: img.Image.Name(),
Trigger: img.Trigger.String(),
PollSchedule: img.PollSchedule,
Provider: img.Provider,
Namespace: img.Namespace,
Policy: img.Policy.Name(),
2019-05-09 15:58:05 +00:00
Registry: img.Image.Registry(),
2019-04-28 16:03:52 +00:00
})
}
response(&imgs, 200, err, resp, req)
}
2019-05-26 16:12:54 +00:00
type trackRequest struct {
Provider string `json:"provider"`
Identifier string `json:"identifier"`
Trigger string `json:"trigger"`
Schedule string `json:"schedule"`
}
func (s *TriggerServer) trackSetHandler(resp http.ResponseWriter, req *http.Request) {
var trackReq trackRequest
dec := json.NewDecoder(req.Body)
defer req.Body.Close()
err := dec.Decode(&trackReq)
if err != nil {
resp.WriteHeader(http.StatusBadRequest)
fmt.Fprintf(resp, "%s", err)
return
}
switch trackReq.Provider {
case types.ProviderTypeKubernetes.String():
// ok
default:
http.Error(resp, "unsupported provider, supported: 'kubernetes'", http.StatusBadRequest)
return
}
switch trackReq.Trigger {
case "default", "poll":
// ok
default:
http.Error(resp, "unknown trigger type, supported: 'default', 'poll'", http.StatusBadRequest)
return
}
if trackReq.Schedule != "" {
_, err = time.ParseDuration(trackReq.Schedule)
if err != nil {
resp.WriteHeader(http.StatusBadRequest)
fmt.Fprintf(resp, "%s", err)
return
}
} else {
trackReq.Schedule = types.KeelPollDefaultSchedule
}
for _, v := range s.grc.Values() {
if v.Identifier == trackReq.Identifier {
labels := v.GetLabels()
delete(labels, types.KeelTriggerLabel)
v.SetLabels(labels)
ann := v.GetAnnotations()
ann[types.KeelTriggerLabel] = trackReq.Trigger
ann[types.KeelPollScheduleAnnotation] = trackReq.Schedule
v.SetAnnotations(ann)
err := s.kubernetesClient.Update(v)
response(&APIResponse{Status: "updated"}, 200, err, resp, req)
return
}
}
resp.WriteHeader(http.StatusNotFound)
fmt.Fprintf(resp, "resource with identifier '%s' not found", trackReq.Identifier)
}