From da0fb0b0c7d2cf82daa4bad0cdb68c7178cad8d1 Mon Sep 17 00:00:00 2001 From: Tomasz Janiszewski Date: Thu, 13 Jul 2023 19:03:56 +0200 Subject: [PATCH] refactor(pg): store empty map as {} not null --- central/cluster/store/cluster/postgres/store.go | 2 +- central/deployment/store/postgres/store.go | 6 +++--- central/namespace/store/postgres/store.go | 4 ++-- central/rbac/k8srole/internal/store/postgres/store.go | 4 ++-- .../rbac/k8srolebinding/internal/store/postgres/store.go | 4 ++-- central/serviceaccount/internal/store/postgres/store.go | 4 ++-- pkg/postgres/pgutils/utils.go | 8 ++++++++ .../pg-table-bindings/multitest/postgres/store.go | 2 +- tools/generate-helpers/pg-table-bindings/store.go.tpl | 2 ++ .../pg-table-bindings/test/postgres/store.go | 2 +- .../pg-table-bindings/testuuidkey/postgres/store.go | 2 +- 11 files changed, 25 insertions(+), 15 deletions(-) diff --git a/central/cluster/store/cluster/postgres/store.go b/central/cluster/store/cluster/postgres/store.go index b75f439e93297..7708258e5d0b6 100644 --- a/central/cluster/store/cluster/postgres/store.go +++ b/central/cluster/store/cluster/postgres/store.go @@ -125,7 +125,7 @@ func insertIntoClusters(_ context.Context, batch *pgx.Batch, obj *storage.Cluste // parent primary keys start pgutils.NilOrUUID(obj.GetId()), obj.GetName(), - obj.GetLabels(), + pgutils.EmptyOrMap(obj.GetLabels()), serialized, } diff --git a/central/deployment/store/postgres/store.go b/central/deployment/store/postgres/store.go index 31632c30fc578..972bb7126e630 100644 --- a/central/deployment/store/postgres/store.go +++ b/central/deployment/store/postgres/store.go @@ -129,12 +129,12 @@ func insertIntoDeployments(ctx context.Context, batch *pgx.Batch, obj *storage.D obj.GetNamespace(), pgutils.NilOrUUID(obj.GetNamespaceId()), obj.GetOrchestratorComponent(), - obj.GetLabels(), - obj.GetPodLabels(), + pgutils.EmptyOrMap(obj.GetLabels()), + pgutils.EmptyOrMap(obj.GetPodLabels()), pgutils.NilOrTime(obj.GetCreated()), pgutils.NilOrUUID(obj.GetClusterId()), obj.GetClusterName(), - obj.GetAnnotations(), + pgutils.EmptyOrMap(obj.GetAnnotations()), obj.GetPriority(), obj.GetImagePullSecrets(), obj.GetServiceAccount(), diff --git a/central/namespace/store/postgres/store.go b/central/namespace/store/postgres/store.go index 0c52469343917..c6a8df93e4a01 100644 --- a/central/namespace/store/postgres/store.go +++ b/central/namespace/store/postgres/store.go @@ -127,8 +127,8 @@ func insertIntoNamespaces(_ context.Context, batch *pgx.Batch, obj *storage.Name obj.GetName(), pgutils.NilOrUUID(obj.GetClusterId()), obj.GetClusterName(), - obj.GetLabels(), - obj.GetAnnotations(), + pgutils.EmptyOrMap(obj.GetLabels()), + pgutils.EmptyOrMap(obj.GetAnnotations()), serialized, } diff --git a/central/rbac/k8srole/internal/store/postgres/store.go b/central/rbac/k8srole/internal/store/postgres/store.go index 271b87e9056d9..0428de9bed7f6 100644 --- a/central/rbac/k8srole/internal/store/postgres/store.go +++ b/central/rbac/k8srole/internal/store/postgres/store.go @@ -129,8 +129,8 @@ func insertIntoK8sRoles(_ context.Context, batch *pgx.Batch, obj *storage.K8SRol pgutils.NilOrUUID(obj.GetClusterId()), obj.GetClusterName(), obj.GetClusterRole(), - obj.GetLabels(), - obj.GetAnnotations(), + pgutils.EmptyOrMap(obj.GetLabels()), + pgutils.EmptyOrMap(obj.GetAnnotations()), serialized, } diff --git a/central/rbac/k8srolebinding/internal/store/postgres/store.go b/central/rbac/k8srolebinding/internal/store/postgres/store.go index 922c535b30cae..533147f8821cd 100644 --- a/central/rbac/k8srolebinding/internal/store/postgres/store.go +++ b/central/rbac/k8srolebinding/internal/store/postgres/store.go @@ -129,8 +129,8 @@ func insertIntoRoleBindings(ctx context.Context, batch *pgx.Batch, obj *storage. pgutils.NilOrUUID(obj.GetClusterId()), obj.GetClusterName(), obj.GetClusterRole(), - obj.GetLabels(), - obj.GetAnnotations(), + pgutils.EmptyOrMap(obj.GetLabels()), + pgutils.EmptyOrMap(obj.GetAnnotations()), pgutils.NilOrUUID(obj.GetRoleId()), serialized, } diff --git a/central/serviceaccount/internal/store/postgres/store.go b/central/serviceaccount/internal/store/postgres/store.go index 90ec47fa8b101..25cf4f786f057 100644 --- a/central/serviceaccount/internal/store/postgres/store.go +++ b/central/serviceaccount/internal/store/postgres/store.go @@ -128,8 +128,8 @@ func insertIntoServiceAccounts(_ context.Context, batch *pgx.Batch, obj *storage obj.GetNamespace(), obj.GetClusterName(), pgutils.NilOrUUID(obj.GetClusterId()), - obj.GetLabels(), - obj.GetAnnotations(), + pgutils.EmptyOrMap(obj.GetLabels()), + pgutils.EmptyOrMap(obj.GetAnnotations()), serialized, } diff --git a/pkg/postgres/pgutils/utils.go b/pkg/postgres/pgutils/utils.go index 0d5e7a8556a4f..b4c55d440787c 100644 --- a/pkg/postgres/pgutils/utils.go +++ b/pkg/postgres/pgutils/utils.go @@ -76,6 +76,14 @@ func NilOrUUID(value string) *uuid.UUID { return &id } +// EmptyOrMap allows for map to be stored explicit as 'null' (string) rather than null or empty object. +func EmptyOrMap[K comparable, V any, M map[K]V](m M) interface{} { + if m == nil { + return "null" + } + return m +} + // CreateTableFromModel executes input create statement using the input connection. func CreateTableFromModel(ctx context.Context, db *gorm.DB, createStmt *postgres.CreateStmts) { // Partitioned tables are not supported by Gorm migration or models diff --git a/tools/generate-helpers/pg-table-bindings/multitest/postgres/store.go b/tools/generate-helpers/pg-table-bindings/multitest/postgres/store.go index 5a9115b133f86..ea4de332e6d78 100644 --- a/tools/generate-helpers/pg-table-bindings/multitest/postgres/store.go +++ b/tools/generate-helpers/pg-table-bindings/multitest/postgres/store.go @@ -110,7 +110,7 @@ func insertIntoTestStructs(ctx context.Context, batch *pgx.Batch, obj *storage.T obj.GetUint64(), obj.GetInt64(), obj.GetFloat(), - obj.GetLabels(), + pgutils.EmptyOrMap(obj.GetLabels()), pgutils.NilOrTime(obj.GetTimestamp()), obj.GetEnum(), obj.GetEnums(), diff --git a/tools/generate-helpers/pg-table-bindings/store.go.tpl b/tools/generate-helpers/pg-table-bindings/store.go.tpl index 729c434079c1e..ccfd0c9c03886 100644 --- a/tools/generate-helpers/pg-table-bindings/store.go.tpl +++ b/tools/generate-helpers/pg-table-bindings/store.go.tpl @@ -205,6 +205,8 @@ func {{ template "insertFunctionName" $schema }}({{ if eq (len $schema.Children) pgutils.NilOrTime({{$field.Getter "obj"}}), {{- else if eq $field.SQLType "uuid" }} pgutils.NilOrUUID({{$field.Getter "obj"}}), + {{- else if eq $field.DataType "map" }} + pgutils.EmptyOrMap({{$field.Getter "obj"}}), {{- else }} {{$field.Getter "obj"}},{{end}} {{- end}} diff --git a/tools/generate-helpers/pg-table-bindings/test/postgres/store.go b/tools/generate-helpers/pg-table-bindings/test/postgres/store.go index 29edcbcaf9ba5..7ad742261cf08 100644 --- a/tools/generate-helpers/pg-table-bindings/test/postgres/store.go +++ b/tools/generate-helpers/pg-table-bindings/test/postgres/store.go @@ -111,7 +111,7 @@ func insertIntoTestSingleKeyStructs(_ context.Context, batch *pgx.Batch, obj *st obj.GetUint64(), obj.GetInt64(), obj.GetFloat(), - obj.GetLabels(), + pgutils.EmptyOrMap(obj.GetLabels()), pgutils.NilOrTime(obj.GetTimestamp()), obj.GetEnum(), obj.GetEnums(), diff --git a/tools/generate-helpers/pg-table-bindings/testuuidkey/postgres/store.go b/tools/generate-helpers/pg-table-bindings/testuuidkey/postgres/store.go index d04999614df11..d7bd996857591 100644 --- a/tools/generate-helpers/pg-table-bindings/testuuidkey/postgres/store.go +++ b/tools/generate-helpers/pg-table-bindings/testuuidkey/postgres/store.go @@ -111,7 +111,7 @@ func insertIntoTestSingleUUIDKeyStructs(_ context.Context, batch *pgx.Batch, obj obj.GetUint64(), obj.GetInt64(), obj.GetFloat(), - obj.GetLabels(), + pgutils.EmptyOrMap(obj.GetLabels()), pgutils.NilOrTime(obj.GetTimestamp()), obj.GetEnum(), obj.GetEnums(),