Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
e0148cb
fix(core): return error instead of panicking in WithOwner mutator
flemzord Jun 9, 2026
b8936d5
fix(core): propagate conversion error in GetAllStackDependencies
flemzord Jun 9, 2026
d08f5de
fix(settings): propagate marshal error in GetAs
flemzord Jun 9, 2026
28ee590
fix(resourcereferences): propagate SetNestedMap error in Reconcile
flemzord Jun 9, 2026
e1835ac
fix(benthos): propagate config map hashing error
flemzord Jun 9, 2026
481d817
fix(api): return parse error from URI.UnmarshalJSON instead of panicking
flemzord Jun 9, 2026
bd995b9
fix(api): use utilruntime.Must for init-time equality registration
flemzord Jun 9, 2026
6f5f0aa
fix(client): use utilruntime.Must for scheme registration in init
flemzord Jun 9, 2026
638445b
fix(core): remove dead CopyDir helper
flemzord Jun 9, 2026
fe4f195
fix(core): log and drop event instead of panicking when listing stack…
flemzord Jun 9, 2026
d114050
fix(core): log and drop event instead of panicking on kind resolution…
flemzord Jun 9, 2026
aa9b68d
fix(core): skip stack instead of panicking when listing modules in Wi…
flemzord Jun 9, 2026
cf331c6
fix(core): log and drop event instead of panicking in Versions Update…
flemzord Jun 9, 2026
df6b49c
fix(core): make LowerCamelCaseKind return an error instead of panicking
flemzord Jun 9, 2026
7e13e83
fix(core): make LowerCaseKind return an error instead of panicking
flemzord Jun 9, 2026
8372265
fix(brokers): return error from GetPublisherEnvVars on unhandled mode
flemzord Jun 9, 2026
f981f54
fix(stacks): propagate module conversion error in setModulesCondition
flemzord Jun 9, 2026
e6da8c5
fix(resourcereferences): log and drop event instead of panicking in w…
flemzord Jun 9, 2026
118e902
fix(auths): return error from HashFromHash instead of panicking
flemzord Jun 9, 2026
e796868
fix(core): make HashFromConfigMaps return an error instead of panicking
flemzord Jun 9, 2026
e42733c
fix(benthos): propagate builtin-template read errors instead of panic…
flemzord Jun 9, 2026
17fbb35
fix(kubectl-stacks): return marshal error in enable instead of panicking
flemzord Jun 9, 2026
0ea8348
fix(kubectl-stacks): return marshal error in disable instead of panic…
flemzord Jun 9, 2026
aa8bff9
fix(kubectl-stacks): return marshal error in setDebug instead of pani…
flemzord Jun 9, 2026
e9eb6a7
fix(kubectl-stacks): return marshal error in lockStack instead of pan…
flemzord Jun 9, 2026
397b1f2
fix(kubectl-stacks): return marshal error in unlockStack instead of p…
flemzord Jun 9, 2026
284c381
fix(kubectl-stacks): join deferred unlock error in upgrade instead of…
flemzord Jun 9, 2026
b46b091
fix(kubectl-stacks): move scheme registration from init to main
flemzord Jun 9, 2026
6b68f1f
chore: refresh settings catalog
flemzord Jun 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions api/formance.com/v1beta1/shared.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"golang.org/x/mod/semver"
"k8s.io/apimachinery/pkg/api/equality"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"sigs.k8s.io/controller-runtime/pkg/client"

"github.com/formancehq/go-libs/v5/pkg/types/pointer"
Expand Down Expand Up @@ -343,7 +344,7 @@ func (u *URI) UnmarshalJSON(data []byte) error {

v, err := url.Parse(s)
if err != nil {
panic(err)
return err
}

*u = URI{
Expand Down Expand Up @@ -372,7 +373,7 @@ func ParseURL(v string) (*URI, error) {
}

func init() {
if err := equality.Semantic.AddFunc(func(a, b *URI) bool {
utilruntime.Must(equality.Semantic.AddFunc(func(a, b *URI) bool {
if a == nil && b != nil {
return false
}
Expand All @@ -383,9 +384,7 @@ func init() {
return true
}
return a.String() == b.String()
}); err != nil {
panic(err)
}
}))
}

const (
Expand Down
32 changes: 16 additions & 16 deletions docs/09-Configuration reference/settings.catalog.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"key": "auth.issuers",
"valueType": "string",
"sources": [
"internal/resources/auths/deployment.go:69",
"internal/resources/auths/deployment.go:77",
"internal/resources/auths/env.go:34"
]
},
Expand Down Expand Up @@ -366,7 +366,7 @@
"key": "ledger.api.bulk-max-size",
"valueType": "int",
"sources": [
"internal/resources/ledgers/deployments.go:123"
"internal/resources/ledgers/deployments.go:128"
]
},
{
Expand All @@ -387,8 +387,8 @@
"key": "ledger.experimental-exporters",
"valueType": "bool",
"sources": [
"internal/resources/ledgers/deployments.go:149",
"internal/resources/ledgers/deployments.go:264"
"internal/resources/ledgers/deployments.go:154",
"internal/resources/ledgers/deployments.go:269"
]
},
{
Expand Down Expand Up @@ -416,8 +416,8 @@
"key": "ledger.schema-enforcement-mode",
"valueType": "string",
"sources": [
"internal/resources/ledgers/deployments.go:131",
"internal/resources/ledgers/deployments.go:239"
"internal/resources/ledgers/deployments.go:136",
"internal/resources/ledgers/deployments.go:244"
]
},
{
Expand All @@ -435,7 +435,7 @@
}
],
"sources": [
"internal/resources/ledgers/deployments.go:209"
"internal/resources/ledgers/deployments.go:214"
]
},
{
Expand All @@ -453,7 +453,7 @@
}
],
"sources": [
"internal/resources/ledgers/deployments.go:248"
"internal/resources/ledgers/deployments.go:253"
]
},
{
Expand All @@ -479,7 +479,7 @@
}
],
"sources": [
"internal/resources/ledgers/deployments.go:221"
"internal/resources/ledgers/deployments.go:226"
]
},
{
Expand Down Expand Up @@ -519,14 +519,14 @@
"key": "namespace.annotations",
"valueType": "map[string]string",
"sources": [
"internal/resources/stacks/init.go:173"
"internal/resources/stacks/init.go:177"
]
},
{
"key": "namespace.labels",
"valueType": "map[string]string",
"sources": [
"internal/resources/stacks/init.go:154"
"internal/resources/stacks/init.go:158"
]
},
{
Expand Down Expand Up @@ -562,7 +562,7 @@
"valueType": "int",
"default": "10",
"sources": [
"internal/resources/orchestrations/deployments.go:173"
"internal/resources/orchestrations/deployments.go:182"
]
},
{
Expand Down Expand Up @@ -650,23 +650,23 @@
"key": "temporal.dsn",
"valueType": "uri",
"sources": [
"internal/resources/orchestrations/deployments.go:80",
"internal/resources/orchestrations/deployments.go:84",
"internal/resources/payments/deployments.go:43"
]
},
{
"key": "temporal.tls.crt",
"valueType": "string",
"sources": [
"internal/resources/orchestrations/deployments.go:124",
"internal/resources/orchestrations/deployments.go:128",
"internal/resources/payments/deployments.go:81"
]
},
{
"key": "temporal.tls.key",
"valueType": "string",
"sources": [
"internal/resources/orchestrations/deployments.go:129",
"internal/resources/orchestrations/deployments.go:133",
"internal/resources/payments/deployments.go:89"
]
},
Expand All @@ -675,7 +675,7 @@
"valueType": "bool",
"default": "false",
"sources": [
"internal/resources/transactionplane/deployments.go:125"
"internal/resources/transactionplane/deployments.go:134"
]
}
]
Expand Down
12 changes: 6 additions & 6 deletions internal/core/module.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,18 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"
)

func LowerCamelCaseKind(ctx Context, ob client.Object) string {
func LowerCamelCaseKind(ctx Context, ob client.Object) (string, error) {
kinds, _, err := ctx.GetScheme().ObjectKinds(ob)
if err != nil {
panic(err)
return "", err
}
return strcase.ToLowerCamel(kinds[0].Kind)
return strcase.ToLowerCamel(kinds[0].Kind), nil
}

func LowerCaseKind(ctx Context, ob client.Object) string {
func LowerCaseKind(ctx Context, ob client.Object) (string, error) {
kinds, _, err := ctx.GetScheme().ObjectKinds(ob)
if err != nil {
panic(err)
return "", err
}
return strings.ToLower(kinds[0].Kind)
return strings.ToLower(kinds[0].Kind), nil
}
13 changes: 9 additions & 4 deletions internal/core/reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -403,16 +403,19 @@ func WithModuleReconciler[T v1beta1.Module](fn func(ctx Context, stack *v1beta1.
func WithWatchVersions[T client.Object](options *ReconcilerOptions[T]) {

reconcileModule := func(ctx context.Context, mgr Manager, target client.Object, versionFileName string, limitingInterface workqueue.TypedRateLimitingInterface[reconcile.Request]) {
logger := log.FromContext(ctx)
stackList := &v1beta1.StackList{}
if err := mgr.GetClient().List(ctx, stackList, client.MatchingFields{
".spec.versionsFromFile": versionFileName,
}); err != nil {
panic(err)
logger.Error(err, "listing stacks for versions file, dropping event", "versionsFile", versionFileName)
return
}

kinds, _, err := mgr.GetScheme().ObjectKinds(target)
if err != nil {
panic(err)
logger.Error(err, "resolving object kind, dropping event", "target", fmt.Sprintf("%T", target))
return
}

for _, stack := range stackList.Items {
Expand All @@ -421,7 +424,8 @@ func WithWatchVersions[T client.Object](options *ReconcilerOptions[T]) {
if err := mgr.GetClient().List(ctx, list, client.MatchingFields{
"stack": stack.Name,
}); err != nil {
panic(err)
logger.Error(err, "listing modules for stack, skipping it", "stack", stack.Name)
continue
}

for _, item := range list.Items {
Expand All @@ -446,7 +450,8 @@ func WithWatchVersions[T client.Object](options *ReconcilerOptions[T]) {

kinds, _, err := mgr.GetScheme().ObjectKinds(target)
if err != nil {
panic(err)
log.FromContext(ctx).Error(err, "resolving object kind, dropping event", "target", fmt.Sprintf("%T", target))
return
}
kind := strings.ToLower(kinds[0].Kind)
if oldObject.Spec[kind] == newObject.Spec[kind] {
Expand Down
2 changes: 1 addition & 1 deletion internal/core/stacks.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ func GetAllStackDependencies(ctx Context, stackName string, to any) error {
for _, item := range list.Items {
t := reflect.New(objectType.Elem()).Interface().(client.Object)
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(item.Object, t); err != nil {
panic(err)
return errors.Wrapf(err, "converting unstructured object '%s' to %s", item.GetName(), objectType)
}
ret = reflect.Append(ret, reflect.ValueOf(t))
}
Expand Down
35 changes: 4 additions & 31 deletions internal/core/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ import (
"encoding/base64"
"encoding/json"
"fmt"
"io/fs"
"path/filepath"
"reflect"
"runtime"
"strings"
Expand All @@ -26,14 +24,14 @@ import (
"github.com/formancehq/go-libs/v5/pkg/types/pointer"
)

func HashFromConfigMaps(configMaps ...*corev1.ConfigMap) string {
func HashFromConfigMaps(configMaps ...*corev1.ConfigMap) (string, error) {
digest := sha256.New()
for _, configMap := range configMaps {
if err := json.NewEncoder(digest).Encode(configMap.Data); err != nil {
panic(err)
return "", err
}
}
return base64.StdEncoding.EncodeToString(digest.Sum(nil))
return base64.StdEncoding.EncodeToString(digest.Sum(nil)), nil
}

func HashFromResources(resources ...*unstructured.Unstructured) string {
Expand All @@ -48,27 +46,6 @@ func HashFromResources(resources ...*unstructured.Unstructured) string {
return base64.StdEncoding.EncodeToString(digest.Sum(nil))
}

func CopyDir(f fs.FS, root, path string, ret *map[string]string) {
dirEntries, err := fs.ReadDir(f, path)
if err != nil {
panic(err)
}
for _, dirEntry := range dirEntries {
dirEntryPath := filepath.Join(path, dirEntry.Name())
if dirEntry.IsDir() {
CopyDir(f, root, dirEntryPath, ret)
} else {
fileContent, err := fs.ReadFile(f, dirEntryPath)
if err != nil {
panic(err)
}
sanitizedPath := strings.TrimPrefix(dirEntryPath, root)
sanitizedPath = strings.TrimPrefix(sanitizedPath, "/")
(*ret)[sanitizedPath] = string(fileContent)
}
}
}

type ObjectMutator[T any] func(t T) error

func WithController[T client.Object](scheme *k8sruntime.Scheme, owner client.Object) ObjectMutator[T] {
Expand All @@ -84,11 +61,7 @@ func WithController[T client.Object](scheme *k8sruntime.Scheme, owner client.Obj

func WithOwner[T client.Object](scheme *k8sruntime.Scheme, owner client.Object) ObjectMutator[T] {
return func(t T) error {
if err := controllerutil.SetOwnerReference(owner, t, scheme); err != nil {
panic(err)
}

return nil
return controllerutil.SetOwnerReference(owner, t, scheme)
}
}

Expand Down
24 changes: 18 additions & 6 deletions internal/resources/auths/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,24 +22,32 @@ import (
"github.com/formancehq/operator/v3/internal/resources/settings"
)

func HashFromHash(o ...string) string {
func HashFromHash(o ...string) (string, error) {
digest := sha256.New()
for _, h := range o {
if err := json.NewEncoder(digest).Encode(h); err != nil {
panic(err)
return "", err
}
}
return base64.StdEncoding.EncodeToString(digest.Sum(nil))
return base64.StdEncoding.EncodeToString(digest.Sum(nil)), nil
}

func createDeployment(ctx Context, stack *v1beta1.Stack, auth *v1beta1.Auth, database *v1beta1.Database,
configMap *corev1.ConfigMap, imageConfiguration *registries.ImageConfiguration, version string, clients []*v1beta1.AuthClient) error {
configHash, err := HashFromConfigMaps(configMap)
if err != nil {
return err
}
annotations := map[string]string{
"config-hash": HashFromConfigMaps(configMap),
"config-hash": configHash,
}

env := make([]corev1.EnvVar, 0)
otlpEnv, err := settings.GetOTELEnvVars(ctx, stack.Name, LowerCamelCaseKind(ctx, auth), " ")
serviceName, err := LowerCamelCaseKind(ctx, auth)
if err != nil {
return err
}
otlpEnv, err := settings.GetOTELEnvVars(ctx, stack.Name, serviceName, " ")
if err != nil {
return err
}
Expand Down Expand Up @@ -132,7 +140,11 @@ func createDeployment(ctx Context, stack *v1beta1.Stack, auth *v1beta1.Auth, dat
}
return acc
}, hashList)
annotations["auth-clients-secrets"] = HashFromHash(hashList...)
authClientsSecretsHash, err := HashFromHash(hashList...)
if err != nil {
return err
}
annotations["auth-clients-secrets"] = authClientsSecretsHash
for _, client := range clients {
if client.Spec.SecretFromSecret != nil {
env = append(env, AuthClientSecretToEnvVars(client))
Expand Down
Loading