112 lines
2.6 KiB
Go
112 lines
2.6 KiB
Go
package http
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/keel-hq/keel/types"
|
|
)
|
|
|
|
type trackedImage struct {
|
|
Image string `json:"image"`
|
|
Trigger string `json:"trigger"`
|
|
PollSchedule string `json:"pollSchedule"`
|
|
Provider string `json:"provider"`
|
|
Namespace string `json:"namespace"`
|
|
Policy string `json:"policy"`
|
|
Registry string `json:"registry"`
|
|
}
|
|
|
|
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(),
|
|
Registry: img.Image.Registry(),
|
|
})
|
|
}
|
|
|
|
response(&imgs, 200, err, resp, req)
|
|
}
|
|
|
|
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)
|
|
}
|