mirror of
https://github.com/cloudnative-pg/plugin-barman-cloud.git
synced 2026-01-12 13:43:10 +01:00
feat: sidecar injection and loading (#22)
Signed-off-by: Leonardo Cecchi <leonardo.cecchi@enterprisedb.com>
This commit is contained in:
parent
dd6548c4a2
commit
ea6ee30d2e
@ -131,4 +131,4 @@ issues:
|
|||||||
- test
|
- test
|
||||||
exclude-files:
|
exclude-files:
|
||||||
- zz_generated.*
|
- zz_generated.*
|
||||||
- internal/controller/suite_test.go
|
- internal/operator/controller/suite_test.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
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1"
|
"github.com/cloudnative-pg/machinery/pkg/log"
|
||||||
"k8s.io/apimachinery/pkg/fields"
|
"github.com/spf13/cobra"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"github.com/spf13/viper"
|
||||||
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"
|
|
||||||
|
|
||||||
barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1"
|
|
||||||
"github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/instance"
|
"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() {
|
func main() {
|
||||||
setupLog.Info("Starting barman cloud instance plugin")
|
cobra.EnableTraverseRunHooks = true
|
||||||
namespace := mustGetEnv("NAMESPACE")
|
|
||||||
boName := mustGetEnv("BARMAN_OBJECT_NAME")
|
|
||||||
clusterName := mustGetEnv("CLUSTER_NAME")
|
|
||||||
instanceName := mustGetEnv("INSTANCE_NAME")
|
|
||||||
|
|
||||||
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
|
logFlags := &log.Flags{}
|
||||||
Scheme: scheme,
|
rootCmd := &cobra.Command{
|
||||||
Cache: cache.Options{
|
Use: "instance",
|
||||||
ByObject: map[client.Object]cache.ByObject{
|
Short: "Starts the Barman Cloud CNPG-i sidecar plugin",
|
||||||
&barmancloudv1.ObjectStore{}: {
|
PersistentPreRunE: func(_ *cobra.Command, _ []string) error {
|
||||||
Field: fields.OneTermEqualSelector("metadata.name", boName),
|
logFlags.ConfigureLogging()
|
||||||
Namespaces: map[string]cache.Config{
|
return nil
|
||||||
namespace: {},
|
|
||||||
},
|
},
|
||||||
},
|
RunE: func(cmd *cobra.Command, _ []string) error {
|
||||||
&cnpgv1.Cluster{}: {
|
requiredSettings := []string{
|
||||||
Field: fields.OneTermEqualSelector("metadata.name", clusterName),
|
"namespace",
|
||||||
Namespaces: map[string]cache.Config{
|
"barman-object-name",
|
||||||
namespace: {},
|
"cluster-name",
|
||||||
},
|
"pod-name",
|
||||||
},
|
"spool-directory",
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
setupLog.Error(err, "unable to start manager")
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := mgr.Add(&instance.CNPGI{
|
for _, k := range requiredSettings {
|
||||||
Client: mgr.GetClient(),
|
if len(viper.GetString(k)) == 0 {
|
||||||
ClusterObjectKey: client.ObjectKey{
|
return fmt.Errorf("missing required %s setting", k)
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
|
return instance.Start(cmd.Context())
|
||||||
setupLog.Error(err, "problem running manager")
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
logFlags.AddFlags(rootCmd.PersistentFlags())
|
||||||
|
|
||||||
|
_ = 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)
|
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
|
|
||||||
}
|
|
||||||
|
|||||||
@ -10,10 +10,9 @@ import (
|
|||||||
"github.com/sourcegraph/conc/pool"
|
"github.com/sourcegraph/conc/pool"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/viper"
|
"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/cnpgi/operator"
|
||||||
"github.com/cloudnative-pg/plugin-barman-cloud/internal/manager"
|
"github.com/cloudnative-pg/plugin-barman-cloud/internal/operator/manager"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@ -44,7 +43,6 @@ func newOperatorCommand() *cobra.Command {
|
|||||||
grpcServer := cmd.RunE
|
grpcServer := cmd.RunE
|
||||||
|
|
||||||
cmd.RunE = func(cmd *cobra.Command, args []string) error {
|
cmd.RunE = func(cmd *cobra.Command, args []string) error {
|
||||||
ctrl.SetupSignalHandler()
|
|
||||||
operatorPool := pool.
|
operatorPool := pool.
|
||||||
New().
|
New().
|
||||||
WithContext(cmd.Context()).
|
WithContext(cmd.Context()).
|
||||||
|
|||||||
@ -7,6 +7,8 @@ spec:
|
|||||||
|
|
||||||
plugins:
|
plugins:
|
||||||
- name: barman-cloud.cloudnative-pg.io
|
- name: barman-cloud.cloudnative-pg.io
|
||||||
|
parameters:
|
||||||
|
barmanObjectStore: minio-store
|
||||||
|
|
||||||
storage:
|
storage:
|
||||||
size: 1Gi
|
size: 1Gi
|
||||||
|
|||||||
12
go.mod
12
go.mod
@ -4,9 +4,9 @@ go 1.22.0
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/cloudnative-pg/barman-cloud v0.0.0-20240924124724-92831d48562a
|
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 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/cloudnative-pg/machinery v0.0.0-20241001075747-34c8797af80f
|
||||||
github.com/onsi/ginkgo/v2 v2.20.2
|
github.com/onsi/ginkgo/v2 v2.20.2
|
||||||
github.com/onsi/gomega v1.34.2
|
github.com/onsi/gomega v1.34.2
|
||||||
@ -114,12 +114,12 @@ require (
|
|||||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
k8s.io/apiextensions-apiserver v0.31.0 // indirect
|
k8s.io/apiextensions-apiserver v0.31.1 // indirect
|
||||||
k8s.io/apiserver v0.31.0 // indirect
|
k8s.io/apiserver v0.31.1 // indirect
|
||||||
k8s.io/component-base v0.31.0 // indirect
|
k8s.io/component-base v0.31.1 // indirect
|
||||||
k8s.io/klog/v2 v2.130.1 // indirect
|
k8s.io/klog/v2 v2.130.1 // indirect
|
||||||
k8s.io/kube-openapi v0.0.0-20240903163716-9e1beecbcb38 // 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/apiserver-network-proxy/konnectivity-client v0.30.3 // indirect
|
||||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
|
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
|
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
|
||||||
|
|||||||
24
go.sum
24
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/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 h1:0v1ML9Eibfq3helbT9GtU0EstqFtG91k/MPO9azY5ME=
|
||||||
github.com/cloudnative-pg/barman-cloud v0.0.0-20240924124724-92831d48562a/go.mod h1:Jm0tOp5oB7utpt8wz6RfSv31h1mThOtffjfyxVupriE=
|
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.1-0.20241001084914-829808376542 h1:IXf5lj+m4CBqzckQ9L/9hJ01JUoVw5N0FuPex0sVdVo=
|
||||||
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/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 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 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-20241002070940-e5495e9c5ed6 h1:C4CU5fBTYTiJBPDqcgHpXSc5IvRTy+5KTaFZzdKHfAQ=
|
||||||
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/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 h1:RgPmQJkuSu3eTdfd4T2K95RYQi57LHB2+Jfsu/faKOM=
|
||||||
github.com/cloudnative-pg/machinery v0.0.0-20241001075747-34c8797af80f/go.mod h1:bWp1Es5zlxElg4Z/c5f0RKOkDcyNvDHdYIvNcPQU4WM=
|
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=
|
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=
|
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 h1:Xe1hX/fPW3PXYYv8BlozYqw63ytA92snr96zMW9gWTU=
|
||||||
k8s.io/api v0.31.1/go.mod h1:sbN1g6eY6XVLeqNsZGLnI5FwVseTrZX7Fv3O26rhAaI=
|
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.1 h1:L+hwULvXx+nvTYX/MKM3kKMZyei+UiSXQWciX/N6E40=
|
||||||
k8s.io/apiextensions-apiserver v0.31.0/go.mod h1:b9aMDEYaEe5sdK+1T0KU78ApR/5ZVp4i56VacZYEHxk=
|
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 h1:mhcUBbj7KUjaVhyXILglcVjuS4nYXiwC+KKFBgIVy7U=
|
||||||
k8s.io/apimachinery v0.31.1/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo=
|
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.1 h1:Sars5ejQDCRBY5f7R3QFHdqN3s61nhkpaX8/k1iEw1c=
|
||||||
k8s.io/apiserver v0.31.0/go.mod h1:KI9ox5Yu902iBnnyMmy7ajonhKnkeZYJhTZ/YI+WEMk=
|
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 h1:f0ugtWSbWpxHR7sjVpQwuvw9a3ZKLXX0u0itkFXufb0=
|
||||||
k8s.io/client-go v0.31.1/go.mod h1:sKI8871MJN2OyeqRlmA4W4KM9KBdBUpDLu/43eGemCg=
|
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.1 h1:UpOepcrX3rQ3ab5NB6g5iP0tvsgJWzxTyAo20sgYSy8=
|
||||||
k8s.io/component-base v0.31.0/go.mod h1:TYVuzI1QmN4L5ItVdMSXKvH7/DtvIuas5/mm8YT3rTo=
|
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 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
|
||||||
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
|
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 h1:1dWzkmJrrprYvjGwh9kEUxmcUV/CtNU8QM7h1FLWQOo=
|
||||||
k8s.io/kube-openapi v0.0.0-20240903163716-9e1beecbcb38/go.mod h1:coRQXBK9NxO98XUv3ZD6AK3xzHCxV6+b7lrquKwaKzA=
|
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-20240921022957-49e7df575cb6 h1:MDF6h2H/h4tbzmtIKTuctcwZmY0tY9mD9fNT47QO6HI=
|
||||||
k8s.io/utils v0.0.0-20240902221715-702e33fdd3c3/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
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 h1:2770sDpzrjjsAtVhSeUFseziht227YAWYHLGNM8QPwY=
|
||||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
|
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=
|
sigs.k8s.io/controller-runtime v0.19.0 h1:nWVM7aq+Il2ABxwiCizrVDSlmDcshi9llbaFbC0ji/Q=
|
||||||
|
|||||||
88
internal/cnpgi/instance/manager.go
Normal file
88
internal/cnpgi/instance/manager.go
Normal file
@ -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
|
||||||
|
}
|
||||||
@ -18,11 +18,6 @@ type CNPGI struct {
|
|||||||
PGDataPath string
|
PGDataPath string
|
||||||
PGWALPath string
|
PGWALPath string
|
||||||
SpoolDirectory string
|
SpoolDirectory string
|
||||||
ServerCertPath string
|
|
||||||
ServerKeyPath string
|
|
||||||
ClientCertPath string
|
|
||||||
// mutually exclusive with pluginPath
|
|
||||||
ServerAddress string
|
|
||||||
// mutually exclusive with serverAddress
|
// mutually exclusive with serverAddress
|
||||||
PluginPath string
|
PluginPath string
|
||||||
InstanceName string
|
InstanceName string
|
||||||
@ -50,10 +45,6 @@ func (c *CNPGI) Start(ctx context.Context) error {
|
|||||||
BarmanObjectKey: c.BarmanObjectKey,
|
BarmanObjectKey: c.BarmanObjectKey,
|
||||||
},
|
},
|
||||||
Enrichers: []http.ServerEnricher{enrich},
|
Enrichers: []http.ServerEnricher{enrich},
|
||||||
ServerCertPath: c.ServerCertPath,
|
|
||||||
ServerKeyPath: c.ServerKeyPath,
|
|
||||||
ClientCertPath: c.ClientCertPath,
|
|
||||||
ServerAddress: c.ServerAddress,
|
|
||||||
PluginPath: c.PluginPath,
|
PluginPath: c.PluginPath,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import "github.com/cloudnative-pg/cnpg-i/pkg/identity"
|
|||||||
|
|
||||||
// PluginName is the name of the plugin from the instance manager
|
// PluginName is the name of the plugin from the instance manager
|
||||||
// Point-of-view
|
// 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.
|
// Data is the metadata of this plugin.
|
||||||
var Data = identity.GetPluginMetadataResponse{
|
var Data = identity.GetPluginMetadataResponse{
|
||||||
|
|||||||
@ -4,12 +4,15 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"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/decoder"
|
||||||
"github.com/cloudnative-pg/cnpg-i-machinery/pkg/pluginhelper/object"
|
"github.com/cloudnative-pg/cnpg-i-machinery/pkg/pluginhelper/object"
|
||||||
"github.com/cloudnative-pg/cnpg-i/pkg/lifecycle"
|
"github.com/cloudnative-pg/cnpg-i/pkg/lifecycle"
|
||||||
"github.com/cloudnative-pg/machinery/pkg/log"
|
"github.com/cloudnative-pg/machinery/pkg/log"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
|
||||||
|
"github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/metadata"
|
||||||
)
|
)
|
||||||
|
|
||||||
// LifecycleImplementation is the implementation of the lifecycle handler
|
// LifecycleImplementation is the implementation of the lifecycle handler
|
||||||
@ -52,16 +55,40 @@ func (impl LifecycleImplementation) LifecycleHook(
|
|||||||
return nil, errors.New("no operation set")
|
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())
|
pod, err := decoder.DecodePodJSON(request.GetObjectDefinition())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
helper := common.NewPlugin(
|
||||||
|
*cluster,
|
||||||
|
metadata.PluginName,
|
||||||
|
)
|
||||||
|
|
||||||
|
// TODO: Validation of the plugin configuration
|
||||||
|
|
||||||
mutatedPod := pod.DeepCopy()
|
mutatedPod := pod.DeepCopy()
|
||||||
err = object.InjectPluginSidecar(mutatedPod, &corev1.Container{
|
err = object.InjectPluginSidecar(mutatedPod, &corev1.Container{
|
||||||
Name: "plugin-barman-cloud",
|
Name: "plugin-barman-cloud",
|
||||||
Image: viper.GetString("sidecar-image"),
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -71,8 +98,7 @@ func (impl LifecycleImplementation) LifecycleHook(
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: change to debug
|
contextLogger.Debug("generated patch", "content", string(patch))
|
||||||
contextLogger.Info("generated patch", "content", string(patch))
|
|
||||||
return &lifecycle.OperatorLifecycleResponse{
|
return &lifecycle.OperatorLifecycleResponse{
|
||||||
JsonPatch: patch,
|
JsonPatch: patch,
|
||||||
}, nil
|
}, nil
|
||||||
|
|||||||
@ -61,7 +61,7 @@ var _ = BeforeSuite(func() {
|
|||||||
|
|
||||||
By("bootstrapping test environment")
|
By("bootstrapping test environment")
|
||||||
testEnv = &envtest.Environment{
|
testEnv = &envtest.Environment{
|
||||||
CRDDirectoryPaths: []string{filepath.Join("..", "..", "config", "crd", "bases")},
|
CRDDirectoryPaths: []string{filepath.Join("..", "..", "..", "config", "crd", "bases")},
|
||||||
ErrorIfCRDPathMissing: true,
|
ErrorIfCRDPathMissing: true,
|
||||||
|
|
||||||
// The BinaryAssetsDirectory is only required if you want to run the tests directly
|
// The BinaryAssetsDirectory is only required if you want to run the tests directly
|
||||||
@ -23,6 +23,7 @@ import (
|
|||||||
"flag"
|
"flag"
|
||||||
|
|
||||||
// +kubebuilder:scaffold:imports
|
// +kubebuilder:scaffold:imports
|
||||||
|
"github.com/cloudnative-pg/machinery/pkg/log"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||||
@ -35,17 +36,14 @@ import (
|
|||||||
"sigs.k8s.io/controller-runtime/pkg/webhook"
|
"sigs.k8s.io/controller-runtime/pkg/webhook"
|
||||||
|
|
||||||
barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1"
|
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.)
|
// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
|
||||||
// to ensure that exec-entrypoint and run can make use of them.
|
// to ensure that exec-entrypoint and run can make use of them.
|
||||||
_ "k8s.io/client-go/plugin/pkg/client/auth"
|
_ "k8s.io/client-go/plugin/pkg/client/auth"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var scheme = runtime.NewScheme()
|
||||||
scheme = runtime.NewScheme()
|
|
||||||
setupLog = ctrl.Log.WithName("setup")
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
|
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
|
||||||
@ -56,6 +54,8 @@ func init() {
|
|||||||
|
|
||||||
// Start starts the manager
|
// Start starts the manager
|
||||||
func Start(ctx context.Context) error {
|
func Start(ctx context.Context) error {
|
||||||
|
setupLog := log.FromContext(ctx)
|
||||||
|
|
||||||
var tlsOpts []func(*tls.Config)
|
var tlsOpts []func(*tls.Config)
|
||||||
|
|
||||||
opts := zap.Options{
|
opts := zap.Options{
|
||||||
@ -11,7 +11,9 @@ resources:
|
|||||||
- ../config/rbac
|
- ../config/rbac
|
||||||
images:
|
images:
|
||||||
- name: plugin-barman-cloud
|
- name: plugin-barman-cloud
|
||||||
|
newName: kind.local/github.com/cloudnative-pg/plugin-barman-cloud/cmd/operator
|
||||||
|
newTag: 634ab82d4f8b68ffada6033b7dff817bbed61a2fec8e05f9ebf74f5bedafb0dd
|
||||||
secretGenerator:
|
secretGenerator:
|
||||||
- literals:
|
- literals:
|
||||||
- SIDECAR_IMAGE=plugin-sidecar
|
- SIDECAR_IMAGE=kind.local/github.com/cloudnative-pg/plugin-barman-cloud/cmd/instance:7173a2dcf3ce74e982ca3d35053de40fcec67b31d607a0d12547b4f9d09c535c
|
||||||
name: plugin-barman-cloud
|
name: plugin-barman-cloud
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user