Skip to content

Commit

Permalink
Finalizer (#26)
Browse files Browse the repository at this point in the history
* initial work on finalizers

* working on finalizers

* finalizers working!

* chore: code cleanup
  • Loading branch information
ekristen committed Oct 14, 2022
1 parent d9c46c9 commit 1c3a01e
Show file tree
Hide file tree
Showing 9 changed files with 145 additions and 63 deletions.
4 changes: 1 addition & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ go 1.18

require (
github.com/acorn-io/baaah v0.0.0-20220711235249-cb4eb828afed
github.com/ibuildthecloud/baaah v0.0.0-20220419175848-b53f32e0abbc
github.com/rancher/wrangler v1.0.0
github.com/sirupsen/logrus v1.9.0
github.com/urfave/cli/v2 v2.19.2
Expand All @@ -29,7 +28,6 @@ require (
github.com/go-openapi/jsonreference v0.19.5 // indirect
github.com/go-openapi/swag v0.19.14 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/gnostic v0.5.7-v3refs // indirect
github.com/google/go-cmp v0.5.6 // indirect
Expand Down Expand Up @@ -81,4 +79,4 @@ require (
sigs.k8s.io/yaml v1.3.0 // indirect
)

replace github.com/acorn-io/baaah => github.com/ibuildthecloud/baaah-1 v0.0.0-20220712223440-b9025ece7c7c
replace github.com/acorn-io/baaah => github.com/ekristen/baaah v0.0.0-20221012162152-f357e22d8e2c
19 changes: 8 additions & 11 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,12 @@ github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4Kfc
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/ekristen/baaah v0.0.0-20221012012205-6139c6ec3b4b h1:lA2/EjmdhV0lRytTdVjDBam5gd36obcGYEcn+PP5ci0=
github.com/ekristen/baaah v0.0.0-20221012012205-6139c6ec3b4b/go.mod h1:CSj9RfR9Ab5LsLmdAcJlrMtyz0tD1kfqAKiLnbkXDg0=
github.com/ekristen/baaah v0.0.0-20221012161733-54b21e1c63c8 h1:zayi1RREc7iQ+dovqs72HWm4xtODaeW/v3MeAWkSKag=
github.com/ekristen/baaah v0.0.0-20221012161733-54b21e1c63c8/go.mod h1:CSj9RfR9Ab5LsLmdAcJlrMtyz0tD1kfqAKiLnbkXDg0=
github.com/ekristen/baaah v0.0.0-20221012162152-f357e22d8e2c h1:C5z3noqm0W3FZtaMutGGQJYsY3wdbKufhUD7FZ73c5k=
github.com/ekristen/baaah v0.0.0-20221012162152-f357e22d8e2c/go.mod h1:CSj9RfR9Ab5LsLmdAcJlrMtyz0tD1kfqAKiLnbkXDg0=
github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk=
Expand Down Expand Up @@ -325,10 +331,8 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ibuildthecloud/baaah v0.0.0-20220419175848-b53f32e0abbc h1:JQS1vrPrXvfwYS8sOLJaDvZADjw7YVST+OUdl7cK7qY=
github.com/ibuildthecloud/baaah v0.0.0-20220419175848-b53f32e0abbc/go.mod h1:6PcvDD56yieuT5hmhoxDEzUW4nDL5T1dscJ/Ax7fvI4=
github.com/ibuildthecloud/baaah-1 v0.0.0-20220712223440-b9025ece7c7c h1:dk9jN+0/TSo0nPWomHgMfvwaIA6JFpVZPMDeAiingJA=
github.com/ibuildthecloud/baaah-1 v0.0.0-20220712223440-b9025ece7c7c/go.mod h1:CSj9RfR9Ab5LsLmdAcJlrMtyz0tD1kfqAKiLnbkXDg0=
github.com/ibuildthecloud/baaah v0.0.0-20220721061854-ace1137938e6 h1:6HDUieBuCZqtboHPpdoQ3+DsTuf6pFC9rmUdmiZbyZQ=
github.com/ibuildthecloud/baaah v0.0.0-20220721061854-ace1137938e6/go.mod h1:CSj9RfR9Ab5LsLmdAcJlrMtyz0tD1kfqAKiLnbkXDg0=
github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
Expand Down Expand Up @@ -496,7 +500,6 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
Expand Down Expand Up @@ -539,10 +542,6 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
github.com/urfave/cli/v2 v2.11.0 h1:c6bD90aLd2iEsokxhxkY5Er0zA2V9fId2aJfwmrF+do=
github.com/urfave/cli/v2 v2.11.0/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo=
github.com/urfave/cli/v2 v2.11.2 h1:FVfNg4m3vbjbBpLYxW//WjxUoHvJ9TlppXcqY9Q9ZfA=
github.com/urfave/cli/v2 v2.11.2/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo=
github.com/urfave/cli/v2 v2.19.2 h1:eXu5089gqqiDQKSnFW+H/FhjrxRGztwSxlTsVK7IuqQ=
github.com/urfave/cli/v2 v2.19.2/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
Expand Down Expand Up @@ -592,7 +591,6 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
Expand Down Expand Up @@ -804,7 +802,6 @@ golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220209214540-3681064d5158 h1:rm+CHSpPEEW2IsXUib1ThaHIjuBVZjxNgSKmBLFfD4c=
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
Expand Down
6 changes: 3 additions & 3 deletions hack/silence.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ kind: Silence
metadata:
name: testing
spec:
url: http://192.168.10.48:9093
startsAt: 2022-07-12T00:00:00Z
endsAt: 2022-07-18T23:00:00Z
url: http://192.168.11.76:9093
startsAt: 2022-10-14T00:00:00Z
endsAt: 2022-10-17T13:20:00Z
createdBy: alertmanager-controller
comment: "automated silence"
matchers:
Expand Down
1 change: 1 addition & 0 deletions pkg/commands/controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ func init() {
Usage: "controller",
Action: cmd.Execute,
Flags: global.Flags(),
Before: global.Before,
}

common.RegisterCommand(cliCmd)
Expand Down
5 changes: 3 additions & 2 deletions pkg/commands/global/global.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,9 @@ func Flags() []cli.Flag {

func Before(c *cli.Context) error {
formatter := &logrus.TextFormatter{
DisableColors: c.Bool("log-disable-color"),
FullTimestamp: c.Bool("log-full-timestamp"),
DisableColors: c.Bool("log-disable-color"),
FullTimestamp: c.Bool("log-full-timestamp"),
TimestampFormat: "2006-01-02T15:04:05.999999999Z07:00",
}
if c.Bool("log-caller") {
logrus.SetReportCaller(true)
Expand Down
13 changes: 5 additions & 8 deletions pkg/controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ import (
"context"

"github.com/acorn-io/baaah"
"github.com/acorn-io/baaah/pkg/apply"
"github.com/acorn-io/baaah/pkg/restconfig"
"github.com/acorn-io/baaah/pkg/router"
v1 "github.com/ekristen/alertmanager-controller/pkg/apis/alertmanager.ekristen.dev/v1"
"github.com/ekristen/alertmanager-controller/pkg/crds"
"github.com/ekristen/alertmanager-controller/pkg/scheme"
"github.com/ibuildthecloud/baaah/pkg/crds"
"github.com/rancher/wrangler/pkg/apply"
"k8s.io/apimachinery/pkg/runtime"
kclient "sigs.k8s.io/controller-runtime/pkg/client"
)
Expand All @@ -31,24 +31,21 @@ func New() (*Controller, error) {
return nil, err
}

apply, err := apply.NewForConfig(cfg)
if err != nil {
return nil, err
}

client, err := kclient.New(cfg, kclient.Options{
Scheme: scheme.Scheme,
})
if err != nil {
return nil, err
}

apply := apply.New(client)

routes(router, client)

return &Controller{
Router: router,
Scheme: scheme.Scheme,
apply: apply.WithDynamicLookup(),
apply: apply,
}, nil
}

Expand Down
1 change: 1 addition & 0 deletions pkg/controller/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ import (

func routes(router *router.Router, client kclient.Client) {
router.Type(&v1.Silence{}).Middleware(silence.AttachClient(client)).Middleware(silence.SkipExpired).Middleware(silence.SkipInvalidSpec).HandlerFunc(silence.ManageSilence)
router.Type(&v1.Silence{}).FinalizeFunc("alertmanager.ekristen.dev/silence", silence.RemoveSilence)
}
113 changes: 77 additions & 36 deletions pkg/controller/silence/silence.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,58 +84,56 @@ func ManageSilence(req router.Request, resp router.Response) error {

if silence.Status.ID == "" {
client := req.Ctx.Value(clientKey).(kclient.Client)
s2 := &v1.Silence{}
if err := client.Get(req.Ctx, kclient.ObjectKey{Namespace: silence.GetNamespace(), Name: silence.GetName()}, s2); err != nil {

logrus.Debug("handle: no id, progressing")
jsonData, err := json.Marshal(silence.Spec)
if err != nil {
return err
}
if s2.Status.ID == "" {
logrus.Info("handle: no id, progressing")
jsonData, err := json.Marshal(silence.Spec)
if err != nil {
return err
}

logrus.Info("handle: creating silence")
amResp, err := http.Post(fmt.Sprintf("%s/api/v2/silences", amURL), "application/json", bytes.NewBuffer(jsonData))
logrus.Debug("handle: creating silence")
amResp, err := http.Post(fmt.Sprintf("%s/api/v2/silences", amURL), "application/json", bytes.NewBuffer(jsonData))
if err != nil {
silence.Status.State = "error-http"
cond.Error(err)
resp.Objects(silence)
resp.RetryAfter(time.Second * 30)
return nil
}

if amResp.StatusCode > 399 {
errorContent, err := ioutil.ReadAll(amResp.Body)
if err != nil {
silence.Status.State = "error-http"
cond.Error(err)
resp.Objects(silence)
resp.RetryAfter(time.Minute * 2)
return nil
return err
}

if amResp.StatusCode > 399 {
errorContent, err := ioutil.ReadAll(amResp.Body)
if err != nil {
return err
}

silence.Status.State = fmt.Sprintf("error-status-%d", amResp.StatusCode)
silence.Status.State = fmt.Sprintf("error-status-%d", amResp.StatusCode)

cond.Error(errors.New(string(errorContent)))
cond.Error(errors.New(string(errorContent)))

resp.RetryAfter(time.Minute * 2)
resp.Objects(silence)

return nil
}
resp.RetryAfter(time.Second * 30)
resp.Objects(silence)

var silenceResp SilenceCreateResponse
return nil
}

if err := json.NewDecoder(amResp.Body).Decode(&silenceResp); err != nil {
return err
}
var silenceResp SilenceCreateResponse

logrus.Info("handle: saving silence response")
if err := json.NewDecoder(amResp.Body).Decode(&silenceResp); err != nil {
return err
}

silence.Status.ID = silenceResp.SilenceID
logrus.Info("handle: saving silence response")

fmt.Println(silence.Status)
resp.Objects(silence)
silence.Status.ID = silenceResp.SilenceID

if err := client.Status().Update(req.Ctx, silence, &kclient.UpdateOptions{}); err != nil {
return nil
}

resp.Objects(silence)

return nil
}

logrus.Info("handle: querying existing silence")
Expand Down Expand Up @@ -183,3 +181,46 @@ func ManageSilence(req router.Request, resp router.Response) error {

return nil
}

func RemoveSilence(req router.Request, resp router.Response) error {
silence := req.Object.(*v1.Silence)

today := time.Now()
tomorrow := silence.Spec.EndsAt.Time

if tomorrow.After(today) {
amURL := strings.TrimSuffix(silence.Spec.URL, "/")

amReq, err := http.NewRequest("DELETE", fmt.Sprintf("%s/api/v2/silence/%s", amURL, silence.Status.ID), nil)
if err != nil {
silence.Status.State = "error"
resp.RetryAfter(time.Minute * 2)
resp.Objects(silence)

return err
}

amResp, err := http.DefaultClient.Do(amReq)
if err != nil {
silence.Status.State = "error"
resp.RetryAfter(time.Minute * 2)
resp.Objects(silence)

return err
}

if amResp.StatusCode > 399 {
silence.Status.State = "error"
resp.RetryAfter(time.Minute * 2)
resp.Objects(silence)

return err
}
}

return nil
}

func ManageSilence2(req router.Request, resp router.Response) error {
return nil
}
46 changes: 46 additions & 0 deletions pkg/crds/crds.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package crds

import (
"context"

"github.com/acorn-io/baaah/pkg/restconfig"
"github.com/rancher/wrangler/pkg/crd"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
kclient "sigs.k8s.io/controller-runtime/pkg/client"
)

func Create(ctx context.Context, scheme *runtime.Scheme, gvs ...schema.GroupVersion) error {
var wranglerCRDs []crd.CRD

for _, gv := range gvs {
for kind := range scheme.KnownTypes(gv) {
gvk := gv.WithKind(kind)
obj, err := scheme.New(gvk)
if err != nil {
return err
}
_, isObj := obj.(kclient.Object)
_, isListObj := obj.(kclient.ObjectList)
if isObj && !isListObj {
wranglerCRDs = append(wranglerCRDs, crd.CRD{
GVK: gvk,
SchemaObject: obj,
Status: true,
}.WithColumnsFromStruct(obj))
}
}
}

restConfig, err := restconfig.New(scheme)
if err != nil {
return err
}

factory, err := crd.NewFactoryFromClient(restConfig)
if err != nil {
return err
}

return factory.BatchCreateCRDs(ctx, wranglerCRDs...).BatchWait()
}

0 comments on commit 1c3a01e

Please sign in to comment.