mirror of
https://github.com/hanzo-fi/stack.git
synced 2026-10-30 20:34:43 +00:00
80 lines
2.3 KiB
Go
80 lines
2.3 KiB
Go
package internal
|
|
|
|
import (
|
|
"reflect"
|
|
|
|
"github.com/formancehq/operator/api/formance.com/v1beta1"
|
|
"github.com/formancehq/stack/components/agent/internal/generated"
|
|
sharedlogging "github.com/formancehq/stack/libs/go-libs/logging"
|
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
"k8s.io/client-go/tools/cache"
|
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
|
)
|
|
|
|
func convertUnstructured[T client.Object](v any) T {
|
|
var t T
|
|
t = reflect.New(reflect.TypeOf(t).Elem()).Interface().(T)
|
|
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(
|
|
v.(*unstructured.Unstructured).Object, t); err != nil {
|
|
panic(err)
|
|
}
|
|
return t
|
|
}
|
|
|
|
func VersionsEventHandler(logger sharedlogging.Logger, membershipClient MembershipClient) cache.ResourceEventHandler {
|
|
return cache.ResourceEventHandlerFuncs{
|
|
AddFunc: func(obj interface{}) {
|
|
|
|
version := convertUnstructured[*v1beta1.Versions](obj)
|
|
|
|
logger.Infof("Detect versions '%s' added", version.Name)
|
|
if err := membershipClient.Send(&generated.Message{
|
|
Message: &generated.Message_AddedVersion{
|
|
AddedVersion: &generated.AddedVersion{
|
|
Name: version.Name,
|
|
Versions: version.Spec,
|
|
},
|
|
},
|
|
}); err != nil {
|
|
logger.Errorf("Unable to send version update: %s", err)
|
|
}
|
|
},
|
|
UpdateFunc: func(oldObj, newObj interface{}) {
|
|
|
|
oldVersions := convertUnstructured[*v1beta1.Versions](oldObj)
|
|
newVersions := convertUnstructured[*v1beta1.Versions](newObj)
|
|
|
|
if reflect.DeepEqual(oldVersions.Spec, newVersions.Spec) {
|
|
return
|
|
}
|
|
|
|
logger.Infof("Detect versions '%s' modified", newVersions.Name)
|
|
if err := membershipClient.Send(&generated.Message{
|
|
Message: &generated.Message_UpdatedVersion{
|
|
UpdatedVersion: &generated.UpdatedVersion{
|
|
Name: newVersions.Name,
|
|
Versions: newVersions.Spec,
|
|
},
|
|
},
|
|
}); err != nil {
|
|
logger.Errorf("Unable to send version update: %s", err)
|
|
}
|
|
},
|
|
DeleteFunc: func(obj interface{}) {
|
|
version := convertUnstructured[*v1beta1.Versions](obj)
|
|
|
|
logger.Infof("Detect versions '%s' as deleted", version.Name)
|
|
if err := membershipClient.Send(&generated.Message{
|
|
Message: &generated.Message_DeletedVersion{
|
|
DeletedVersion: &generated.DeletedVersion{
|
|
Name: version.Name,
|
|
},
|
|
},
|
|
}); err != nil {
|
|
logger.Errorf("Unable to send version update: %s", err)
|
|
}
|
|
},
|
|
}
|
|
}
|