From ea6ee30d2ea30f9e9df22002ce5f5a68fcb37ade Mon Sep 17 00:00:00 2001 From: Leonardo Cecchi Date: Wed, 2 Oct 2024 13:21:04 +0200 Subject: [PATCH] feat: sidecar injection and loading (#22) Signed-off-by: Leonardo Cecchi --- .golangci.yml | 2 +- cmd/instance/main.go | 129 ++++++------------ cmd/operator/main.go | 4 +- docs/examples/cluster-example.yaml | 2 + go.mod | 12 +- go.sum | 24 ++-- internal/cnpgi/instance/manager.go | 88 ++++++++++++ internal/cnpgi/instance/start.go | 13 +- internal/cnpgi/metadata/constants.go | 2 +- internal/cnpgi/operator/lifecycle.go | 32 ++++- internal/{ => operator}/controller/doc.go | 0 .../controller/objectstore_controller.go | 0 .../controller/objectstore_controller_test.go | 0 .../{ => operator}/controller/suite_test.go | 4 +- internal/{ => operator}/manager/manager.go | 10 +- kubernetes/kustomization.yaml | 4 +- 16 files changed, 192 insertions(+), 134 deletions(-) create mode 100644 internal/cnpgi/instance/manager.go rename internal/{ => operator}/controller/doc.go (100%) rename internal/{ => operator}/controller/objectstore_controller.go (100%) rename internal/{ => operator}/controller/objectstore_controller_test.go (100%) rename internal/{ => operator}/controller/suite_test.go (95%) rename internal/{ => operator}/manager/manager.go (96%) diff --git a/.golangci.yml b/.golangci.yml index 67f4b07..5148a0b 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -131,4 +131,4 @@ issues: - test exclude-files: - zz_generated.* - - internal/controller/suite_test.go + - internal/operator/controller/suite_test.go diff --git a/cmd/instance/main.go b/cmd/instance/main.go index 4eed69c..a228ce1 100644 --- a/cmd/instance/main.go +++ b/cmd/instance/main.go @@ -1,107 +1,58 @@ -// Package main is the implementation of the CNPG-i PostgreSQL sidecar +// Package main is the entrypoint of operator plugin package main import ( - "errors" + "fmt" "os" - cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/runtime" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" - clientgoscheme "k8s.io/client-go/kubernetes/scheme" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/cache" - "sigs.k8s.io/controller-runtime/pkg/client" + "github.com/cloudnative-pg/machinery/pkg/log" + "github.com/spf13/cobra" + "github.com/spf13/viper" - barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1" "github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/instance" ) -var ( - scheme = runtime.NewScheme() - setupLog = ctrl.Log.WithName("setup") -) - -func init() { - utilruntime.Must(clientgoscheme.AddToScheme(scheme)) - - utilruntime.Must(barmancloudv1.AddToScheme(scheme)) - // +kubebuilder:scaffold:scheme -} - func main() { - setupLog.Info("Starting barman cloud instance plugin") - namespace := mustGetEnv("NAMESPACE") - boName := mustGetEnv("BARMAN_OBJECT_NAME") - clusterName := mustGetEnv("CLUSTER_NAME") - instanceName := mustGetEnv("INSTANCE_NAME") + cobra.EnableTraverseRunHooks = true - mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - Cache: cache.Options{ - ByObject: map[client.Object]cache.ByObject{ - &barmancloudv1.ObjectStore{}: { - Field: fields.OneTermEqualSelector("metadata.name", boName), - Namespaces: map[string]cache.Config{ - namespace: {}, - }, - }, - &cnpgv1.Cluster{}: { - Field: fields.OneTermEqualSelector("metadata.name", clusterName), - Namespaces: map[string]cache.Config{ - namespace: {}, - }, - }, - }, + logFlags := &log.Flags{} + rootCmd := &cobra.Command{ + Use: "instance", + Short: "Starts the Barman Cloud CNPG-i sidecar plugin", + PersistentPreRunE: func(_ *cobra.Command, _ []string) error { + logFlags.ConfigureLogging() + return nil + }, + RunE: func(cmd *cobra.Command, _ []string) error { + requiredSettings := []string{ + "namespace", + "barman-object-name", + "cluster-name", + "pod-name", + "spool-directory", + } + + for _, k := range requiredSettings { + if len(viper.GetString(k)) == 0 { + return fmt.Errorf("missing required %s setting", k) + } + } + + return instance.Start(cmd.Context()) }, - }) - if err != nil { - setupLog.Error(err, "unable to start manager") - os.Exit(1) } - if err := mgr.Add(&instance.CNPGI{ - Client: mgr.GetClient(), - ClusterObjectKey: client.ObjectKey{ - Namespace: namespace, - Name: clusterName, - }, - BarmanObjectKey: client.ObjectKey{ - Namespace: namespace, - Name: boName, - }, - InstanceName: instanceName, - // TODO: improve - PGDataPath: mustGetEnv("PGDATA"), - PGWALPath: mustGetEnv("PGWAL"), - SpoolDirectory: mustGetEnv("SPOOL_DIRECTORY"), - ServerCertPath: mustGetEnv("SERVER_CERT"), - ServerKeyPath: mustGetEnv("SERVER_KEY"), - ClientCertPath: mustGetEnv("CLIENT_CERT"), - ServerAddress: mustGetEnv("SERVER_ADDRESS"), - PluginPath: mustGetEnv("PLUGIN_PATH"), - }); err != nil { - setupLog.Error(err, "unable to create CNPGI runnable") - os.Exit(1) - } + logFlags.AddFlags(rootCmd.PersistentFlags()) - if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { - setupLog.Error(err, "problem running manager") + _ = viper.BindEnv("namespace", "NAMESPACE") + _ = viper.BindEnv("barman-object-name", "BARMAN_OBJECT_NAME") + _ = viper.BindEnv("cluster-name", "CLUSTER_NAME") + _ = viper.BindEnv("pod-name", "POD_NAME") + _ = viper.BindEnv("pgdata", "PGDATA") + _ = viper.BindEnv("spool-directory", "SPOOL_DIRECTORY") + + if err := rootCmd.Execute(); err != nil { + fmt.Println(err) os.Exit(1) } } - -func mustGetEnv(envName string) string { - value := os.Getenv(envName) - if value == "" { - setupLog.Error( - errors.New("missing required env variable"), - "while fetching env variables", - "name", - envName, - ) - os.Exit(1) - } - return value -} diff --git a/cmd/operator/main.go b/cmd/operator/main.go index f0954e8..44b5ad9 100644 --- a/cmd/operator/main.go +++ b/cmd/operator/main.go @@ -10,10 +10,9 @@ import ( "github.com/sourcegraph/conc/pool" "github.com/spf13/cobra" "github.com/spf13/viper" - ctrl "sigs.k8s.io/controller-runtime" "github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/operator" - "github.com/cloudnative-pg/plugin-barman-cloud/internal/manager" + "github.com/cloudnative-pg/plugin-barman-cloud/internal/operator/manager" ) func main() { @@ -44,7 +43,6 @@ func newOperatorCommand() *cobra.Command { grpcServer := cmd.RunE cmd.RunE = func(cmd *cobra.Command, args []string) error { - ctrl.SetupSignalHandler() operatorPool := pool. New(). WithContext(cmd.Context()). diff --git a/docs/examples/cluster-example.yaml b/docs/examples/cluster-example.yaml index ea6a103..33983b8 100644 --- a/docs/examples/cluster-example.yaml +++ b/docs/examples/cluster-example.yaml @@ -7,6 +7,8 @@ spec: plugins: - name: barman-cloud.cloudnative-pg.io + parameters: + barmanObjectStore: minio-store storage: size: 1Gi diff --git a/go.mod b/go.mod index 12cb241..732001d 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,9 @@ go 1.22.0 require ( github.com/cloudnative-pg/barman-cloud v0.0.0-20240924124724-92831d48562a - github.com/cloudnative-pg/cloudnative-pg v1.24.0 + github.com/cloudnative-pg/cloudnative-pg v1.24.1-0.20241001084914-829808376542 github.com/cloudnative-pg/cnpg-i v0.0.0-20240924030516-c5636170f248 - github.com/cloudnative-pg/cnpg-i-machinery v0.0.0-20240926153929-09e2c6f6689b + github.com/cloudnative-pg/cnpg-i-machinery v0.0.0-20241002070940-e5495e9c5ed6 github.com/cloudnative-pg/machinery v0.0.0-20241001075747-34c8797af80f github.com/onsi/ginkgo/v2 v2.20.2 github.com/onsi/gomega v1.34.2 @@ -114,12 +114,12 @@ require ( gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.31.0 // indirect - k8s.io/apiserver v0.31.0 // indirect - k8s.io/component-base v0.31.0 // indirect + k8s.io/apiextensions-apiserver v0.31.1 // indirect + k8s.io/apiserver v0.31.1 // indirect + k8s.io/component-base v0.31.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/kube-openapi v0.0.0-20240903163716-9e1beecbcb38 // indirect - k8s.io/utils v0.0.0-20240902221715-702e33fdd3c3 // indirect + k8s.io/utils v0.0.0-20240921022957-49e7df575cb6 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect diff --git a/go.sum b/go.sum index e182c0a..ade4eed 100644 --- a/go.sum +++ b/go.sum @@ -16,12 +16,12 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cloudnative-pg/barman-cloud v0.0.0-20240924124724-92831d48562a h1:0v1ML9Eibfq3helbT9GtU0EstqFtG91k/MPO9azY5ME= github.com/cloudnative-pg/barman-cloud v0.0.0-20240924124724-92831d48562a/go.mod h1:Jm0tOp5oB7utpt8wz6RfSv31h1mThOtffjfyxVupriE= -github.com/cloudnative-pg/cloudnative-pg v1.24.0 h1:lY9IP/Gnh5ogNcFGoPnbD2eOiHdSdbdEp0PaUdOAMDQ= -github.com/cloudnative-pg/cloudnative-pg v1.24.0/go.mod h1:n7Qqax6os+x3+7Qu/GojUUeKlL1ELGV63dcO/tzIfB4= +github.com/cloudnative-pg/cloudnative-pg v1.24.1-0.20241001084914-829808376542 h1:IXf5lj+m4CBqzckQ9L/9hJ01JUoVw5N0FuPex0sVdVo= +github.com/cloudnative-pg/cloudnative-pg v1.24.1-0.20241001084914-829808376542/go.mod h1:L8M+kTGpz/eaLZj46+4sARvO/vDYlo/m1xOigI/ghBA= github.com/cloudnative-pg/cnpg-i v0.0.0-20240924030516-c5636170f248 h1:eUGzb7YNjVLilwhgZoe4hDOO70fci3oqb/ZzQFbN3xg= github.com/cloudnative-pg/cnpg-i v0.0.0-20240924030516-c5636170f248/go.mod h1:K9/4eAT3rh2bKIWyujoN8BIPRXa4d1Ls+eBY8PE8y6w= -github.com/cloudnative-pg/cnpg-i-machinery v0.0.0-20240926153929-09e2c6f6689b h1:T9G61tzOBoB5yvlDPULUoiUl6QxPmti3pkNFhQYGGQY= -github.com/cloudnative-pg/cnpg-i-machinery v0.0.0-20240926153929-09e2c6f6689b/go.mod h1:dV1+nE7jWENm/fcnKBeKsaScMz685rQPbPCCDydJgsY= +github.com/cloudnative-pg/cnpg-i-machinery v0.0.0-20241002070940-e5495e9c5ed6 h1:C4CU5fBTYTiJBPDqcgHpXSc5IvRTy+5KTaFZzdKHfAQ= +github.com/cloudnative-pg/cnpg-i-machinery v0.0.0-20241002070940-e5495e9c5ed6/go.mod h1:mHEVy/Guae+rij1qlgwHg+lyFKDX48qjTL4lAqE7OJs= github.com/cloudnative-pg/machinery v0.0.0-20241001075747-34c8797af80f h1:RgPmQJkuSu3eTdfd4T2K95RYQi57LHB2+Jfsu/faKOM= github.com/cloudnative-pg/machinery v0.0.0-20241001075747-34c8797af80f/go.mod h1:bWp1Es5zlxElg4Z/c5f0RKOkDcyNvDHdYIvNcPQU4WM= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -286,22 +286,22 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= k8s.io/api v0.31.1 h1:Xe1hX/fPW3PXYYv8BlozYqw63ytA92snr96zMW9gWTU= k8s.io/api v0.31.1/go.mod h1:sbN1g6eY6XVLeqNsZGLnI5FwVseTrZX7Fv3O26rhAaI= -k8s.io/apiextensions-apiserver v0.31.0 h1:fZgCVhGwsclj3qCw1buVXCV6khjRzKC5eCFt24kyLSk= -k8s.io/apiextensions-apiserver v0.31.0/go.mod h1:b9aMDEYaEe5sdK+1T0KU78ApR/5ZVp4i56VacZYEHxk= +k8s.io/apiextensions-apiserver v0.31.1 h1:L+hwULvXx+nvTYX/MKM3kKMZyei+UiSXQWciX/N6E40= +k8s.io/apiextensions-apiserver v0.31.1/go.mod h1:tWMPR3sgW+jsl2xm9v7lAyRF1rYEK71i9G5dRtkknoQ= k8s.io/apimachinery v0.31.1 h1:mhcUBbj7KUjaVhyXILglcVjuS4nYXiwC+KKFBgIVy7U= k8s.io/apimachinery v0.31.1/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= -k8s.io/apiserver v0.31.0 h1:p+2dgJjy+bk+B1Csz+mc2wl5gHwvNkC9QJV+w55LVrY= -k8s.io/apiserver v0.31.0/go.mod h1:KI9ox5Yu902iBnnyMmy7ajonhKnkeZYJhTZ/YI+WEMk= +k8s.io/apiserver v0.31.1 h1:Sars5ejQDCRBY5f7R3QFHdqN3s61nhkpaX8/k1iEw1c= +k8s.io/apiserver v0.31.1/go.mod h1:lzDhpeToamVZJmmFlaLwdYZwd7zB+WYRYIboqA1kGxM= k8s.io/client-go v0.31.1 h1:f0ugtWSbWpxHR7sjVpQwuvw9a3ZKLXX0u0itkFXufb0= k8s.io/client-go v0.31.1/go.mod h1:sKI8871MJN2OyeqRlmA4W4KM9KBdBUpDLu/43eGemCg= -k8s.io/component-base v0.31.0 h1:/KIzGM5EvPNQcYgwq5NwoQBaOlVFrghoVGr8lG6vNRs= -k8s.io/component-base v0.31.0/go.mod h1:TYVuzI1QmN4L5ItVdMSXKvH7/DtvIuas5/mm8YT3rTo= +k8s.io/component-base v0.31.1 h1:UpOepcrX3rQ3ab5NB6g5iP0tvsgJWzxTyAo20sgYSy8= +k8s.io/component-base v0.31.1/go.mod h1:WGeaw7t/kTsqpVTaCoVEtillbqAhF2/JgvO0LDOMa0w= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20240903163716-9e1beecbcb38 h1:1dWzkmJrrprYvjGwh9kEUxmcUV/CtNU8QM7h1FLWQOo= k8s.io/kube-openapi v0.0.0-20240903163716-9e1beecbcb38/go.mod h1:coRQXBK9NxO98XUv3ZD6AK3xzHCxV6+b7lrquKwaKzA= -k8s.io/utils v0.0.0-20240902221715-702e33fdd3c3 h1:b2FmK8YH+QEwq/Sy2uAEhmqL5nPfGYbJOcaqjeYYZoA= -k8s.io/utils v0.0.0-20240902221715-702e33fdd3c3/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20240921022957-49e7df575cb6 h1:MDF6h2H/h4tbzmtIKTuctcwZmY0tY9mD9fNT47QO6HI= +k8s.io/utils v0.0.0-20240921022957-49e7df575cb6/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 h1:2770sDpzrjjsAtVhSeUFseziht227YAWYHLGNM8QPwY= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= sigs.k8s.io/controller-runtime v0.19.0 h1:nWVM7aq+Il2ABxwiCizrVDSlmDcshi9llbaFbC0ji/Q= diff --git a/internal/cnpgi/instance/manager.go b/internal/cnpgi/instance/manager.go new file mode 100644 index 0000000..18e8ff4 --- /dev/null +++ b/internal/cnpgi/instance/manager.go @@ -0,0 +1,88 @@ +package instance + +import ( + "context" + "os" + "path" + + cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1" + "github.com/spf13/viper" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/cache" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/log" + + barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1" +) + +var scheme = runtime.NewScheme() + +func init() { + utilruntime.Must(barmancloudv1.AddToScheme(scheme)) + utilruntime.Must(cnpgv1.AddToScheme(scheme)) +} + +// Start starts the sidecar informers and CNPG-i server +func Start(ctx context.Context) error { + setupLog := log.FromContext(ctx) + setupLog.Info("Starting barman cloud instance plugin") + namespace := viper.GetString("namespace") + boName := viper.GetString("barman-object-name") + clusterName := viper.GetString("cluster-name") + podName := viper.GetString("pod-name") + + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ + Scheme: scheme, + Cache: cache.Options{ + ByObject: map[client.Object]cache.ByObject{ + &barmancloudv1.ObjectStore{}: { + Field: fields.OneTermEqualSelector("metadata.name", boName), + Namespaces: map[string]cache.Config{ + namespace: {}, + }, + }, + &cnpgv1.Cluster{}: { + Field: fields.OneTermEqualSelector("metadata.name", clusterName), + Namespaces: map[string]cache.Config{ + namespace: {}, + }, + }, + }, + }, + }) + if err != nil { + setupLog.Error(err, "unable to start manager") + os.Exit(1) + } + + if err := mgr.Add(&CNPGI{ + Client: mgr.GetClient(), + ClusterObjectKey: client.ObjectKey{ + Namespace: namespace, + Name: clusterName, + }, + BarmanObjectKey: client.ObjectKey{ + Namespace: namespace, + Name: boName, + }, + InstanceName: podName, + // TODO: improve + PGDataPath: viper.GetString("pgdata"), + PGWALPath: path.Join(viper.GetString("pgdata"), "pg_wal"), + SpoolDirectory: viper.GetString("spool-directory"), + PluginPath: viper.GetString("plugin-path"), + }); err != nil { + setupLog.Error(err, "unable to create CNPGI runnable") + return err + } + + if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { + setupLog.Error(err, "problem running manager") + return err + } + + return nil +} diff --git a/internal/cnpgi/instance/start.go b/internal/cnpgi/instance/start.go index f2f549f..3df9093 100644 --- a/internal/cnpgi/instance/start.go +++ b/internal/cnpgi/instance/start.go @@ -18,11 +18,6 @@ type CNPGI struct { PGDataPath string PGWALPath string SpoolDirectory string - ServerCertPath string - ServerKeyPath string - ClientCertPath string - // mutually exclusive with pluginPath - ServerAddress string // mutually exclusive with serverAddress PluginPath string InstanceName string @@ -49,12 +44,8 @@ func (c *CNPGI) Start(ctx context.Context) error { Client: c.Client, BarmanObjectKey: c.BarmanObjectKey, }, - Enrichers: []http.ServerEnricher{enrich}, - ServerCertPath: c.ServerCertPath, - ServerKeyPath: c.ServerKeyPath, - ClientCertPath: c.ClientCertPath, - ServerAddress: c.ServerAddress, - PluginPath: c.PluginPath, + Enrichers: []http.ServerEnricher{enrich}, + PluginPath: c.PluginPath, } return srv.Start(ctx) diff --git a/internal/cnpgi/metadata/constants.go b/internal/cnpgi/metadata/constants.go index 02361e2..2fa2fbf 100644 --- a/internal/cnpgi/metadata/constants.go +++ b/internal/cnpgi/metadata/constants.go @@ -4,7 +4,7 @@ import "github.com/cloudnative-pg/cnpg-i/pkg/identity" // PluginName is the name of the plugin from the instance manager // Point-of-view -const PluginName = "instance.barman-cloud.cloudnative-pg.io" +const PluginName = "barman-cloud.cloudnative-pg.io" // Data is the metadata of this plugin. var Data = identity.GetPluginMetadataResponse{ diff --git a/internal/cnpgi/operator/lifecycle.go b/internal/cnpgi/operator/lifecycle.go index 35e99e0..8781cdd 100644 --- a/internal/cnpgi/operator/lifecycle.go +++ b/internal/cnpgi/operator/lifecycle.go @@ -4,12 +4,15 @@ import ( "context" "errors" + "github.com/cloudnative-pg/cnpg-i-machinery/pkg/pluginhelper/common" "github.com/cloudnative-pg/cnpg-i-machinery/pkg/pluginhelper/decoder" "github.com/cloudnative-pg/cnpg-i-machinery/pkg/pluginhelper/object" "github.com/cloudnative-pg/cnpg-i/pkg/lifecycle" "github.com/cloudnative-pg/machinery/pkg/log" "github.com/spf13/viper" corev1 "k8s.io/api/core/v1" + + "github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/metadata" ) // LifecycleImplementation is the implementation of the lifecycle handler @@ -52,16 +55,40 @@ func (impl LifecycleImplementation) LifecycleHook( return nil, errors.New("no operation set") } + cluster, err := decoder.DecodeClusterJSON(request.GetClusterDefinition()) + if err != nil { + return nil, err + } + pod, err := decoder.DecodePodJSON(request.GetObjectDefinition()) if err != nil { return nil, err } + helper := common.NewPlugin( + *cluster, + metadata.PluginName, + ) + + // TODO: Validation of the plugin configuration + mutatedPod := pod.DeepCopy() err = object.InjectPluginSidecar(mutatedPod, &corev1.Container{ Name: "plugin-barman-cloud", Image: viper.GetString("sidecar-image"), - }, false) + Env: []corev1.EnvVar{ + { + Name: "BARMAN_OBJECT_NAME", + Value: helper.Parameters["barmanObjectStore"], + }, + { + // TODO: should we really use this one? + // should we mount an emptyDir volume just for that? + Name: "SPOOL_DIRECTORY", + Value: "/controller/wal-restore-spool", + }, + }, + }, true) if err != nil { return nil, err } @@ -71,8 +98,7 @@ func (impl LifecycleImplementation) LifecycleHook( return nil, err } - // TODO: change to debug - contextLogger.Info("generated patch", "content", string(patch)) + contextLogger.Debug("generated patch", "content", string(patch)) return &lifecycle.OperatorLifecycleResponse{ JsonPatch: patch, }, nil diff --git a/internal/controller/doc.go b/internal/operator/controller/doc.go similarity index 100% rename from internal/controller/doc.go rename to internal/operator/controller/doc.go diff --git a/internal/controller/objectstore_controller.go b/internal/operator/controller/objectstore_controller.go similarity index 100% rename from internal/controller/objectstore_controller.go rename to internal/operator/controller/objectstore_controller.go diff --git a/internal/controller/objectstore_controller_test.go b/internal/operator/controller/objectstore_controller_test.go similarity index 100% rename from internal/controller/objectstore_controller_test.go rename to internal/operator/controller/objectstore_controller_test.go diff --git a/internal/controller/suite_test.go b/internal/operator/controller/suite_test.go similarity index 95% rename from internal/controller/suite_test.go rename to internal/operator/controller/suite_test.go index 47b937c..2cbe841 100644 --- a/internal/controller/suite_test.go +++ b/internal/operator/controller/suite_test.go @@ -57,11 +57,11 @@ func TestControllers(t *testing.T) { var _ = BeforeSuite(func() { logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true))) - ctx, cancel = context.WithCancel(context.TODO()) + ctx, cancel = context.WithCancel(context.TODO()) By("bootstrapping test environment") testEnv = &envtest.Environment{ - CRDDirectoryPaths: []string{filepath.Join("..", "..", "config", "crd", "bases")}, + CRDDirectoryPaths: []string{filepath.Join("..", "..", "..", "config", "crd", "bases")}, ErrorIfCRDPathMissing: true, // The BinaryAssetsDirectory is only required if you want to run the tests directly diff --git a/internal/manager/manager.go b/internal/operator/manager/manager.go similarity index 96% rename from internal/manager/manager.go rename to internal/operator/manager/manager.go index b339f94..ad37848 100644 --- a/internal/manager/manager.go +++ b/internal/operator/manager/manager.go @@ -23,6 +23,7 @@ import ( "flag" // +kubebuilder:scaffold:imports + "github.com/cloudnative-pg/machinery/pkg/log" "github.com/spf13/viper" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" @@ -35,17 +36,14 @@ import ( "sigs.k8s.io/controller-runtime/pkg/webhook" barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1" - "github.com/cloudnative-pg/plugin-barman-cloud/internal/controller" + "github.com/cloudnative-pg/plugin-barman-cloud/internal/operator/controller" // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) // to ensure that exec-entrypoint and run can make use of them. _ "k8s.io/client-go/plugin/pkg/client/auth" ) -var ( - scheme = runtime.NewScheme() - setupLog = ctrl.Log.WithName("setup") -) +var scheme = runtime.NewScheme() func init() { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) @@ -56,6 +54,8 @@ func init() { // Start starts the manager func Start(ctx context.Context) error { + setupLog := log.FromContext(ctx) + var tlsOpts []func(*tls.Config) opts := zap.Options{ diff --git a/kubernetes/kustomization.yaml b/kubernetes/kustomization.yaml index eebeee0..31d8603 100644 --- a/kubernetes/kustomization.yaml +++ b/kubernetes/kustomization.yaml @@ -11,7 +11,9 @@ resources: - ../config/rbac images: - name: plugin-barman-cloud + newName: kind.local/github.com/cloudnative-pg/plugin-barman-cloud/cmd/operator + newTag: 634ab82d4f8b68ffada6033b7dff817bbed61a2fec8e05f9ebf74f5bedafb0dd secretGenerator: - literals: - - SIDECAR_IMAGE=plugin-sidecar + - SIDECAR_IMAGE=kind.local/github.com/cloudnative-pg/plugin-barman-cloud/cmd/instance:7173a2dcf3ce74e982ca3d35053de40fcec67b31d607a0d12547b4f9d09c535c name: plugin-barman-cloud