Skip to content

Commit 4aa7211

Browse files
committed
feat: allow customization of CNPG group-version
Signed-off-by: Leonardo Cecchi <[email protected]>
1 parent 080f1b9 commit 4aa7211

File tree

6 files changed

+109
-26
lines changed

6 files changed

+109
-26
lines changed

internal/cmd/instance/main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ func NewCmd() *cobra.Command {
3838
_ = viper.BindEnv("pod-name", "POD_NAME")
3939
_ = viper.BindEnv("pgdata", "PGDATA")
4040
_ = viper.BindEnv("spool-directory", "SPOOL_DIRECTORY")
41+
_ = viper.BindEnv("custom-cnpg-group", "CUSTOM_CNPG_GROUP")
42+
_ = viper.BindEnv("custom-cnpg-version", "CUSTOM_CNPG_VERSIONXS")
4143

4244
return cmd
4345
}

internal/cnpgi/instance/manager.go

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,34 +8,30 @@ import (
88
"github.com/spf13/viper"
99
corev1 "k8s.io/api/core/v1"
1010
"k8s.io/apimachinery/pkg/runtime"
11+
"k8s.io/apimachinery/pkg/runtime/schema"
1112
"k8s.io/apimachinery/pkg/types"
1213
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
1314
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
1415
ctrl "sigs.k8s.io/controller-runtime"
1516
"sigs.k8s.io/controller-runtime/pkg/client"
1617
"sigs.k8s.io/controller-runtime/pkg/log"
18+
"sigs.k8s.io/controller-runtime/pkg/scheme"
1719

1820
barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1"
1921
extendedclient "github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/instance/internal/client"
2022
)
2123

22-
var scheme = runtime.NewScheme()
23-
24-
func init() {
25-
utilruntime.Must(barmancloudv1.AddToScheme(scheme))
26-
utilruntime.Must(cnpgv1.AddToScheme(scheme))
27-
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
28-
}
29-
3024
// Start starts the sidecar informers and CNPG-i server
3125
func Start(ctx context.Context) error {
32-
setupLog := log.FromContext(ctx)
33-
setupLog.Info("Starting barman cloud instance plugin")
34-
3526
podName := viper.GetString("pod-name")
3627
clusterName := viper.GetString("cluster-name")
3728
namespace := viper.GetString("namespace")
3829

30+
scheme := generateScheme(ctx)
31+
32+
setupLog := log.FromContext(ctx)
33+
setupLog.Info("Starting barman cloud instance plugin")
34+
3935
controllerOptions := ctrl.Options{
4036
Scheme: scheme,
4137
Client: client.Options{
@@ -89,3 +85,35 @@ func Start(ctx context.Context) error {
8985

9086
return nil
9187
}
88+
89+
// generateScheme creates a runtime.Scheme object with all the
90+
// definition needed to support the sidecar. This allows
91+
// the plugin to be used in every CNPG-based operator.
92+
func generateScheme(ctx context.Context) *runtime.Scheme {
93+
result := runtime.NewScheme()
94+
95+
utilruntime.Must(barmancloudv1.AddToScheme(result))
96+
utilruntime.Must(clientgoscheme.AddToScheme(result))
97+
98+
cnpgGroup := viper.GetString("custom-cnpg-group")
99+
cnpgVersion := viper.GetString("custom-cnpg-version")
100+
if len(cnpgGroup) == 0 {
101+
cnpgGroup = cnpgv1.SchemeGroupVersion.Group
102+
}
103+
if len(cnpgVersion) == 0 {
104+
cnpgVersion = cnpgv1.SchemeGroupVersion.Version
105+
}
106+
107+
// Proceed with custom registration of the CNPG scheme
108+
schemeGroupVersion := schema.GroupVersion{Group: cnpgGroup, Version: cnpgVersion}
109+
schemeBuilder := &scheme.Builder{GroupVersion: schemeGroupVersion}
110+
schemeBuilder.Register(&cnpgv1.Cluster{}, &cnpgv1.ClusterList{})
111+
schemeBuilder.Register(&cnpgv1.Backup{}, &cnpgv1.BackupList{})
112+
schemeBuilder.Register(&cnpgv1.ScheduledBackup{}, &cnpgv1.ScheduledBackupList{})
113+
utilruntime.Must(schemeBuilder.AddToScheme(result))
114+
115+
schemeLog := log.FromContext(ctx)
116+
schemeLog.Info("CNPG types registration", "schemeGroupVersion", schemeGroupVersion)
117+
118+
return result
119+
}

internal/cnpgi/operator/config/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ func getClusterGVK() schema.GroupVersionKind {
113113
func NewFromClusterJSON(clusterJSON []byte) (*PluginConfiguration, error) {
114114
var result cnpgv1.Cluster
115115

116-
if err := decoder.DecodeObject(clusterJSON, &result, getClusterGVK()); err != nil {
116+
if err := decoder.DecodeObjectLenient(clusterJSON, &result); err != nil {
117117
return nil, err
118118
}
119119

internal/cnpgi/operator/lifecycle.go

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"strings"
78

89
cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1"
9-
"github.com/cloudnative-pg/cloudnative-pg/pkg/utils"
1010
"github.com/cloudnative-pg/cnpg-i-machinery/pkg/pluginhelper/decoder"
1111
"github.com/cloudnative-pg/cnpg-i-machinery/pkg/pluginhelper/object"
1212
"github.com/cloudnative-pg/cnpg-i/pkg/lifecycle"
@@ -79,10 +79,9 @@ func (impl LifecycleImplementation) LifecycleHook(
7979
}
8080

8181
var cluster cnpgv1.Cluster
82-
if err := decoder.DecodeObject(
82+
if err := decoder.DecodeObjectLenient(
8383
request.GetClusterDefinition(),
8484
&cluster,
85-
cnpgv1.SchemeGroupVersion.WithKind("Cluster"),
8685
); err != nil {
8786
return nil, err
8887
}
@@ -184,7 +183,7 @@ func reconcileJob(
184183
}
185184

186185
var job batchv1.Job
187-
if err := decoder.DecodeObject(
186+
if err := decoder.DecodeObjectStrict(
188187
request.GetObjectDefinition(),
189188
&job,
190189
batchv1.SchemeGroupVersion.WithKind("Job"),
@@ -197,7 +196,7 @@ func reconcileJob(
197196
WithValues("jobName", job.Name)
198197
contextLogger.Debug("starting job reconciliation")
199198

200-
if job.Spec.Template.Labels[utils.JobRoleLabelName] != "full-recovery" {
199+
if getCNPGJobRole(&job) != "full-recovery" {
201200
contextLogger.Debug("job is not a recovery job, skipping")
202201
return nil, nil
203202
}
@@ -307,6 +306,14 @@ func reconcilePodSpec(
307306
Name: "SPOOL_DIRECTORY",
308307
Value: "/controller/wal-restore-spool",
309308
},
309+
{
310+
Name: "CUSTOM_CNPG_GROUP",
311+
Value: cluster.GetObjectKind().GroupVersionKind().Group,
312+
},
313+
{
314+
Name: "CUSTOM_CNPG_VERSION",
315+
Value: cluster.GetObjectKind().GroupVersionKind().Version,
316+
},
310317
}
311318

312319
envs = append(envs, additionalEnvs...)
@@ -455,3 +462,15 @@ func InjectPluginSidecarPodSpec(
455462

456463
return nil
457464
}
465+
466+
// getCNPGJobRole gets the role associated to a CNPG job
467+
func getCNPGJobRole(job *batchv1.Job) string {
468+
const jobRoleLabelSuffix = "/jobRole"
469+
for k, v := range job.Spec.Template.Labels {
470+
if strings.HasSuffix(k, jobRoleLabelSuffix) {
471+
return v
472+
}
473+
}
474+
475+
return ""
476+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package operator
2+
3+
import (
4+
"fmt"
5+
6+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
7+
"k8s.io/apimachinery/pkg/runtime"
8+
"k8s.io/utils/ptr"
9+
)
10+
11+
// setOwnerReference explicitly set the owner reference between an
12+
// owner object and a controller one.
13+
//
14+
// Important: this function won't use any registered scheme and will
15+
// fail unless the metadata has been correctly set into the owner
16+
// object.
17+
func setOwnerReference(owner, controlled metav1.Object) error {
18+
ro, ok := owner.(runtime.Object)
19+
if !ok {
20+
return fmt.Errorf("%T is not a runtime.Object, cannot call setOwnerReference", owner)
21+
}
22+
23+
if len(ro.DeepCopyObject().GetObjectKind().GroupVersionKind().Group) == 0 {
24+
return fmt.Errorf("%T metadata have not been set, cannot call setOwnerReference", owner)
25+
}
26+
27+
controlled.SetOwnerReferences([]metav1.OwnerReference{
28+
metav1.OwnerReference{
29+
APIVersion: ro.GetObjectKind().GroupVersionKind().GroupVersion().String(),
30+
Kind: ro.GetObjectKind().GroupVersionKind().Kind,
31+
Name: owner.GetName(),
32+
UID: owner.GetUID(),
33+
BlockOwnerDeletion: ptr.To(true),
34+
Controller: ptr.To(true),
35+
},
36+
})
37+
38+
return nil
39+
}

internal/cnpgi/operator/reconciler.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
rbacv1 "k8s.io/api/rbac/v1"
1212
"k8s.io/apimachinery/pkg/api/equality"
1313
apierrs "k8s.io/apimachinery/pkg/api/errors"
14-
ctrl "sigs.k8s.io/controller-runtime"
1514
"sigs.k8s.io/controller-runtime/pkg/client"
1615

1716
barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1"
@@ -61,10 +60,10 @@ func (r ReconcilerImplementation) Pre(
6160

6261
contextLogger.Debug("parsing cluster definition")
6362
var cluster cnpgv1.Cluster
64-
if err := decoder.DecodeObject(
63+
if err := decoder.DecodeObjectLenient(
6564
request.GetResourceDefinition(),
6665
&cluster,
67-
cnpgv1.SchemeGroupVersion.WithKind("Cluster")); err != nil {
66+
); err != nil {
6867
return nil, err
6968
}
7069

@@ -142,11 +141,7 @@ func (r ReconcilerImplementation) ensureRole(
142141
"namespace", newRole.Namespace,
143142
)
144143

145-
if err := ctrl.SetControllerReference(
146-
cluster,
147-
newRole,
148-
r.Client.Scheme(),
149-
); err != nil {
144+
if err := setOwnerReference(cluster, newRole); err != nil {
150145
return err
151146
}
152147

@@ -193,7 +188,7 @@ func (r ReconcilerImplementation) createRoleBinding(
193188
cluster *cnpgv1.Cluster,
194189
) error {
195190
roleBinding := specs.BuildRoleBinding(cluster)
196-
if err := ctrl.SetControllerReference(cluster, roleBinding, r.Client.Scheme()); err != nil {
191+
if err := setOwnerReference(cluster, roleBinding); err != nil {
197192
return err
198193
}
199194
return r.Client.Create(ctx, roleBinding)

0 commit comments

Comments
 (0)