diff --git a/internal/cmd/instance/main.go b/internal/cmd/instance/main.go index 090660e..8c02b47 100644 --- a/internal/cmd/instance/main.go +++ b/internal/cmd/instance/main.go @@ -22,6 +22,7 @@ func NewCmd() *cobra.Command { "cluster-name", "pod-name", "spool-directory", + "server-name", } for _, k := range requiredSettings { @@ -40,6 +41,7 @@ func NewCmd() *cobra.Command { _ = viper.BindEnv("pod-name", "POD_NAME") _ = viper.BindEnv("pgdata", "PGDATA") _ = viper.BindEnv("spool-directory", "SPOOL_DIRECTORY") + _ = viper.BindEnv("server-name", "SERVER_NAME") return cmd } diff --git a/internal/cmd/restore/main.go b/internal/cmd/restore/main.go index bc79b1e..16d45eb 100644 --- a/internal/cmd/restore/main.go +++ b/internal/cmd/restore/main.go @@ -23,6 +23,8 @@ func NewCmd() *cobra.Command { "cluster-name", "pod-name", "spool-directory", + "barman-object-name", + "server-name", } for _, k := range requiredSettings { @@ -40,6 +42,8 @@ func NewCmd() *cobra.Command { _ = viper.BindEnv("pod-name", "POD_NAME") _ = viper.BindEnv("pgdata", "PGDATA") _ = viper.BindEnv("spool-directory", "SPOOL_DIRECTORY") + _ = viper.BindEnv("barman-object-name", "BARMAN_OBJECT_NAME") + _ = viper.BindEnv("server-name", "SERVER_NAME") return cmd } diff --git a/internal/cnpgi/common/wal.go b/internal/cnpgi/common/wal.go index 9d9e5fd..fa212b9 100644 --- a/internal/cnpgi/common/wal.go +++ b/internal/cnpgi/common/wal.go @@ -24,6 +24,7 @@ import ( // WALServiceImplementation is the implementation of the WAL Service type WALServiceImplementation struct { + ServerName string BarmanObjectKey client.ObjectKey ClusterObjectKey client.ObjectKey Client client.Client @@ -72,16 +73,6 @@ func (w WALServiceImplementation) Archive( return nil, err } - // TODO: refactor this code elsewhere - serverName := cluster.Name - for _, plugin := range cluster.Spec.Plugins { - if plugin.IsEnabled() && plugin.Name == metadata.PluginName { - if pluginServerName, ok := plugin.Parameters["serverName"]; ok { - serverName = pluginServerName - } - } - } - var objectStore barmancloudv1.ObjectStore if err := w.Client.Get(ctx, w.BarmanObjectKey, &objectStore); err != nil { return nil, err @@ -111,7 +102,7 @@ func (w WALServiceImplementation) Archive( return nil, err } - options, err := arch.BarmanCloudWalArchiveOptions(ctx, &objectStore.Spec.Configuration, serverName) + options, err := arch.BarmanCloudWalArchiveOptions(ctx, &objectStore.Spec.Configuration, w.ServerName) if err != nil { return nil, err } @@ -164,17 +155,7 @@ func (w WALServiceImplementation) Restore( } env = MergeEnv(env, credentialsEnv) - // TODO: refactor this code elsewhere - serverName := cluster.Name - for _, plugin := range cluster.Spec.Plugins { - if plugin.IsEnabled() && plugin.Name == metadata.PluginName { - if pluginServerName, ok := plugin.Parameters["serverName"]; ok { - serverName = pluginServerName - } - } - } - - options, err := barmanCommand.CloudWalRestoreOptions(ctx, barmanConfiguration, serverName) + options, err := barmanCommand.CloudWalRestoreOptions(ctx, barmanConfiguration, w.ServerName) if err != nil { return nil, fmt.Errorf("while getting barman-cloud-wal-restore options: %w", err) } diff --git a/internal/cnpgi/instance/backup.go b/internal/cnpgi/instance/backup.go index 9ebe96a..5e1e042 100644 --- a/internal/cnpgi/instance/backup.go +++ b/internal/cnpgi/instance/backup.go @@ -31,6 +31,7 @@ type BackupServiceImplementation struct { ClusterObjectKey client.ObjectKey Client client.Client InstanceName string + ServerName string backup.UnimplementedBackupServer } @@ -111,21 +112,12 @@ func (b BackupServiceImplementation) Backup( return nil, err } - serverName := cluster.Name - for _, plugin := range cluster.Spec.Plugins { - if plugin.IsEnabled() && plugin.Name == metadata.PluginName { - if pluginServerName, ok := plugin.Parameters["serverName"]; ok { - serverName = pluginServerName - } - } - } - backupName := fmt.Sprintf("backup-%v", pgTime.ToCompactISO8601(time.Now())) if err = backupCmd.Take( ctx, backupName, - serverName, + b.ServerName, env, barmanCloudExecutor{}, postgres.BackupTemporaryDirectory, @@ -137,7 +129,7 @@ func (b BackupServiceImplementation) Backup( executedBackupInfo, err := backupCmd.GetExecutedBackupInfo( ctx, backupName, - serverName, + b.ServerName, barmanCloudExecutor{}, env) if err != nil { diff --git a/internal/cnpgi/instance/manager.go b/internal/cnpgi/instance/manager.go index dfcb75c..0c4dfa2 100644 --- a/internal/cnpgi/instance/manager.go +++ b/internal/cnpgi/instance/manager.go @@ -81,6 +81,7 @@ func Start(ctx context.Context) error { Name: clusterName, }, BarmanObjectKey: barmanObjectKey, + ServerName: viper.GetString("server-name"), InstanceName: podName, // TODO: improve PGDataPath: viper.GetString("pgdata"), diff --git a/internal/cnpgi/instance/start.go b/internal/cnpgi/instance/start.go index 535cd22..ce1c6d3 100644 --- a/internal/cnpgi/instance/start.go +++ b/internal/cnpgi/instance/start.go @@ -16,6 +16,7 @@ import ( type CNPGI struct { Client client.Client BarmanObjectKey client.ObjectKey + ServerName string ClusterObjectKey client.ObjectKey PGDataPath string PGWALPath string @@ -31,6 +32,7 @@ func (c *CNPGI) Start(ctx context.Context) error { wal.RegisterWALServer(server, common.WALServiceImplementation{ BarmanObjectKey: c.BarmanObjectKey, ClusterObjectKey: c.ClusterObjectKey, + ServerName: c.ServerName, InstanceName: c.InstanceName, Client: c.Client, SpoolDirectory: c.SpoolDirectory, @@ -40,6 +42,7 @@ func (c *CNPGI) Start(ctx context.Context) error { backup.RegisterBackupServer(server, BackupServiceImplementation{ Client: c.Client, BarmanObjectKey: c.BarmanObjectKey, + ServerName: c.ServerName, ClusterObjectKey: c.ClusterObjectKey, InstanceName: c.InstanceName, }) diff --git a/internal/cnpgi/operator/config/config.go b/internal/cnpgi/operator/config/config.go index 53e0de3..9215cda 100644 --- a/internal/cnpgi/operator/config/config.go +++ b/internal/cnpgi/operator/config/config.go @@ -45,6 +45,7 @@ func (e *ConfigurationError) IsEmpty() bool { // PluginConfiguration is the configuration of the plugin type PluginConfiguration struct { BarmanObjectName string + ServerName string RecoveryBarmanObjectName string RecoveryBarmanServerName string } @@ -56,6 +57,15 @@ func NewFromCluster(cluster *cnpgv1.Cluster) *PluginConfiguration { metadata.PluginName, ) + serverName := cluster.Name + for _, plugin := range cluster.Spec.Plugins { + if plugin.IsEnabled() && plugin.Name == metadata.PluginName { + if pluginServerName, ok := plugin.Parameters["serverName"]; ok { + serverName = pluginServerName + } + } + } + recoveryServerName := "" recoveryBarmanObjectName := "" @@ -70,6 +80,7 @@ func NewFromCluster(cluster *cnpgv1.Cluster) *PluginConfiguration { result := &PluginConfiguration{ // used for the backup/archive BarmanObjectName: helper.Parameters["barmanObjectName"], + ServerName: serverName, // used for restore/wal_restore RecoveryBarmanServerName: recoveryServerName, RecoveryBarmanObjectName: recoveryBarmanObjectName, diff --git a/internal/cnpgi/operator/lifecycle.go b/internal/cnpgi/operator/lifecycle.go index 8155b37..0f60b77 100644 --- a/internal/cnpgi/operator/lifecycle.go +++ b/internal/cnpgi/operator/lifecycle.go @@ -115,6 +115,13 @@ func reconcileJob( return nil, nil } + // Since we're recoverying from an existing object store, + // we set our primary object store name to the recovery one. + // This won't be needed anymore when wal-restore will be able + // to check two object stores + pluginConfiguration.BarmanObjectName = pluginConfiguration.RecoveryBarmanObjectName + pluginConfiguration.ServerName = pluginConfiguration.RecoveryBarmanServerName + var job batchv1.Job if err := decoder.DecodeObject( request.GetObjectDefinition(), @@ -175,10 +182,14 @@ func reconcilePod( mutatedPod := pod.DeepCopy() - if err := reconcilePodSpec(pluginConfiguration, cluster, &mutatedPod.Spec, "postgres", corev1.Container{ - Args: []string{"instance"}, - }); err != nil { - return nil, fmt.Errorf("while reconciling pod spec for pod: %w", err) + if len(pluginConfiguration.BarmanObjectName) != 0 { + if err := reconcilePodSpec(pluginConfiguration, cluster, &mutatedPod.Spec, "postgres", corev1.Container{ + Args: []string{"instance"}, + }); err != nil { + return nil, fmt.Errorf("while reconciling pod spec for pod: %w", err) + } + } else { + contextLogger.Debug("No need to mutate instance with no backup & archiving confniguration") } patch, err := object.CreatePatch(mutatedPod, pod) @@ -212,6 +223,10 @@ func reconcilePodSpec( Name: "BARMAN_OBJECT_NAME", Value: cfg.BarmanObjectName, }, + { + Name: "SERVER_NAME", + Value: cfg.ServerName, + }, { // TODO: should we really use this one? // should we mount an emptyDir volume just for that? diff --git a/internal/cnpgi/restore/identity.go b/internal/cnpgi/restore/identity.go index 6e70eec..2308898 100644 --- a/internal/cnpgi/restore/identity.go +++ b/internal/cnpgi/restore/identity.go @@ -38,6 +38,13 @@ func (i IdentityImplementation) GetPluginCapabilities( }, }, }, + { + Type: &identity.PluginCapability_Service_{ + Service: &identity.PluginCapability_Service{ + Type: identity.PluginCapability_Service_TYPE_WAL_SERVICE, + }, + }, + }, }, }, nil } diff --git a/internal/cnpgi/restore/manager.go b/internal/cnpgi/restore/manager.go index 4bf1866..ac00640 100644 --- a/internal/cnpgi/restore/manager.go +++ b/internal/cnpgi/restore/manager.go @@ -86,6 +86,7 @@ func Start(ctx context.Context) error { Client: mgr.GetClient(), PGDataPath: viper.GetString("pgdata"), InstanceName: viper.GetString("pod-name"), + ServerName: viper.GetString("server-name"), }); err != nil { setupLog.Error(err, "unable to create CNPGI runnable") return err diff --git a/internal/cnpgi/restore/start.go b/internal/cnpgi/restore/start.go index 263d382..2d5411f 100644 --- a/internal/cnpgi/restore/start.go +++ b/internal/cnpgi/restore/start.go @@ -22,6 +22,7 @@ type CNPGI struct { Client client.Client PGDataPath string InstanceName string + ServerName string } // Start starts the GRPC service @@ -38,6 +39,7 @@ func (c *CNPGI) Start(ctx context.Context) error { SpoolDirectory: c.SpoolDirectory, PGDataPath: c.PGDataPath, PGWALPath: path.Join(c.PGDataPath, "pg_wal"), + ServerName: c.ServerName, }) restore.RegisterRestoreJobHooksServer(server, &JobHookImpl{