mirror of
https://github.com/cloudnative-pg/plugin-barman-cloud.git
synced 2026-03-10 12:42:20 +01:00
Compare commits
10 Commits
4f2e4fac48
...
557b261b25
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
557b261b25 | ||
|
|
064eac2199 | ||
|
|
2c8d0aa8c4 | ||
|
|
a8b214c460 | ||
|
|
604fb9c430 | ||
|
|
fa546eae05 | ||
|
|
ad8a1767a7 | ||
|
|
97675a7685 | ||
|
|
1eeed9f783 | ||
|
|
6ec77fb159 |
2
.github/workflows/barman-base-image.yml
vendored
2
.github/workflows/barman-base-image.yml
vendored
@ -27,7 +27,7 @@ jobs:
|
||||
- name: Install Dagger
|
||||
env:
|
||||
# renovate: datasource=github-tags depName=dagger/dagger versioning=semver
|
||||
DAGGER_VERSION: 0.19.9
|
||||
DAGGER_VERSION: 0.19.10
|
||||
run: |
|
||||
curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh
|
||||
- name: Publish a barman-base
|
||||
|
||||
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@ -44,7 +44,7 @@ jobs:
|
||||
- name: Install Dagger
|
||||
env:
|
||||
# renovate: datasource=github-tags depName=dagger/dagger versioning=semver
|
||||
DAGGER_VERSION: 0.19.9
|
||||
DAGGER_VERSION: 0.19.10
|
||||
run: |
|
||||
curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh
|
||||
- name: Run CI task
|
||||
|
||||
2
.github/workflows/release-please.yml
vendored
2
.github/workflows/release-please.yml
vendored
@ -31,7 +31,7 @@ jobs:
|
||||
- name: Install Dagger
|
||||
env:
|
||||
# renovate: datasource=github-tags depName=dagger/dagger versioning=semver
|
||||
DAGGER_VERSION: 0.19.9
|
||||
DAGGER_VERSION: 0.19.10
|
||||
run: |
|
||||
curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh
|
||||
- name: Create image and manifest
|
||||
|
||||
2
.github/workflows/release-publish.yml
vendored
2
.github/workflows/release-publish.yml
vendored
@ -21,7 +21,7 @@ jobs:
|
||||
- name: Install Dagger
|
||||
env:
|
||||
# renovate: datasource=github-tags depName=dagger/dagger versioning=semver
|
||||
DAGGER_VERSION: 0.19.9
|
||||
DAGGER_VERSION: 0.19.10
|
||||
run: |
|
||||
curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh
|
||||
- name: Create image and manifest
|
||||
|
||||
2
Makefile
2
Makefile
@ -159,7 +159,7 @@ GOLANGCI_LINT = $(LOCALBIN)/golangci-lint
|
||||
|
||||
## Tool Versions
|
||||
KUSTOMIZE_VERSION ?= v5.4.3
|
||||
CONTROLLER_TOOLS_VERSION ?= v0.16.1
|
||||
CONTROLLER_TOOLS_VERSION ?= v0.19.0
|
||||
ENVTEST_VERSION ?= release-0.19
|
||||
GOLANGCI_LINT_VERSION ?= v1.64.8
|
||||
|
||||
|
||||
10
Taskfile.yml
10
Taskfile.yml
@ -21,7 +21,7 @@ tasks:
|
||||
# renovate: datasource=git-refs depName=golangci-lint lookupName=https://github.com/sagikazarmark/daggerverse currentValue=main
|
||||
DAGGER_GOLANGCI_LINT_SHA: 5dcc7e4c4cd5ed230046955f42e27f2166545155
|
||||
# renovate: datasource=docker depName=golangci/golangci-lint versioning=semver
|
||||
GOLANGCI_LINT_VERSION: v2.7.2
|
||||
GOLANGCI_LINT_VERSION: v2.8.0
|
||||
cmds:
|
||||
- >
|
||||
GITHUB_REF= dagger -sc "github.com/sagikazarmark/daggerverse/golangci-lint@${DAGGER_GOLANGCI_LINT_SHA}
|
||||
@ -129,7 +129,7 @@ tasks:
|
||||
desc: Run go test
|
||||
env:
|
||||
# renovate: datasource=docker depName=golang versioning=semver
|
||||
GOLANG_IMAGE_VERSION: 1.25.5
|
||||
GOLANG_IMAGE_VERSION: 1.25.6
|
||||
# renovate: datasource=git-refs depname=kubernetes packageName=https://github.com/kubernetes/kubernetes versioning=semver
|
||||
K8S_VERSION: 1.31.0
|
||||
# renovate: datasource=git-refs depName=controller-runtime packageName=https://github.com/kubernetes-sigs/controller-runtime versioning=semver
|
||||
@ -206,7 +206,7 @@ tasks:
|
||||
- start-build-network
|
||||
vars:
|
||||
# renovate: datasource=github-tags depName=dagger/dagger versioning=semver
|
||||
DAGGER_VERSION: 0.19.9
|
||||
DAGGER_VERSION: 0.19.10
|
||||
DAGGER_ENGINE_IMAGE: registry.dagger.io/engine:v{{ .DAGGER_VERSION }}
|
||||
cmds:
|
||||
- >
|
||||
@ -306,7 +306,7 @@ tasks:
|
||||
- start-kind-cluster
|
||||
vars:
|
||||
# renovate: datasource=docker depName=golang versioning=semver
|
||||
GOLANG_IMAGE_VERSION: 1.25.5
|
||||
GOLANG_IMAGE_VERSION: 1.25.6
|
||||
KUBECONFIG_PATH:
|
||||
sh: mktemp -t kubeconfig-XXXXX
|
||||
env:
|
||||
@ -325,7 +325,7 @@ tasks:
|
||||
- build-images
|
||||
vars:
|
||||
# renovate: datasource=docker depName=golang versioning=semver
|
||||
GOLANG_IMAGE_VERSION: 1.25.5
|
||||
GOLANG_IMAGE_VERSION: 1.25.6
|
||||
env:
|
||||
_EXPERIMENTAL_DAGGER_RUNNER_HOST: docker-container://{{ .DAGGER_ENGINE_CONTAINER_NAME }}
|
||||
cmds:
|
||||
|
||||
@ -94,6 +94,9 @@ type RecoveryWindow struct {
|
||||
|
||||
// The last failed backup time
|
||||
LastFailedBackupTime *metav1.Time `json:"lastFailedBackupTime,omitempty"`
|
||||
|
||||
// The last time a WAL file was successfully archived by this plugin
|
||||
LastArchivedWALTime *metav1.Time `json:"lastArchivedWALTime,omitempty"`
|
||||
}
|
||||
|
||||
// +kubebuilder:object:root=true
|
||||
|
||||
@ -169,6 +169,10 @@ func (in *RecoveryWindow) DeepCopyInto(out *RecoveryWindow) {
|
||||
in, out := &in.LastFailedBackupTime, &out.LastFailedBackupTime
|
||||
*out = (*in).DeepCopy()
|
||||
}
|
||||
if in.LastArchivedWALTime != nil {
|
||||
in, out := &in.LastArchivedWALTime, &out.LastArchivedWALTime
|
||||
*out = (*in).DeepCopy()
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RecoveryWindow.
|
||||
|
||||
@ -676,6 +676,11 @@ spec:
|
||||
restored.
|
||||
format: date-time
|
||||
type: string
|
||||
lastArchivedWALTime:
|
||||
description: The last time a WAL file was successfully archived
|
||||
by this plugin
|
||||
format: date-time
|
||||
type: string
|
||||
lastFailedBackupTime:
|
||||
description: The last failed backup time
|
||||
format: date-time
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
# Build the manager binary
|
||||
FROM --platform=$BUILDPLATFORM golang:1.25.5 AS gobuilder
|
||||
FROM --platform=$BUILDPLATFORM golang:1.25.6 AS gobuilder
|
||||
ARG TARGETOS
|
||||
ARG TARGETARCH
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
# Both components are built before going into a distroless container
|
||||
|
||||
# Build the manager binary
|
||||
FROM --platform=$BUILDPLATFORM golang:1.25.5 AS gobuilder
|
||||
FROM --platform=$BUILDPLATFORM golang:1.25.6 AS gobuilder
|
||||
ARG TARGETOS
|
||||
ARG TARGETARCH
|
||||
|
||||
@ -36,7 +36,7 @@ RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache
|
||||
# Use plugin-barman-cloud-base to get the dependencies.
|
||||
# pip will build everything inside /usr, so we copy every file into a new
|
||||
# destination that will then be copied into the distroless container
|
||||
FROM ghcr.io/cloudnative-pg/plugin-barman-cloud-base:3.16.2-202512221525 AS pythonbuilder
|
||||
FROM ghcr.io/cloudnative-pg/plugin-barman-cloud-base:3.17.0-202601131704 AS pythonbuilder
|
||||
# Prepare a new /usr/ directory with the files we'll need in the final image
|
||||
RUN mkdir /new-usr/ && \
|
||||
cp -r --parents /usr/local/lib/ /usr/lib/*-linux-gnu/ /usr/local/bin/ \
|
||||
|
||||
2
go.mod
2
go.mod
@ -2,7 +2,7 @@ module github.com/cloudnative-pg/plugin-barman-cloud
|
||||
|
||||
go 1.25.0
|
||||
|
||||
toolchain go1.25.5
|
||||
toolchain go1.25.6
|
||||
|
||||
require (
|
||||
github.com/cert-manager/cert-manager v1.19.2
|
||||
|
||||
@ -25,6 +25,7 @@ import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/cloudnative-pg/barman-cloud/pkg/archiver"
|
||||
@ -38,7 +39,10 @@ import (
|
||||
walUtils "github.com/cloudnative-pg/machinery/pkg/fileutils/wals"
|
||||
"github.com/cloudnative-pg/machinery/pkg/log"
|
||||
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
"k8s.io/client-go/util/retry"
|
||||
"k8s.io/utils/ptr"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
|
||||
barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1"
|
||||
@ -67,6 +71,11 @@ func (e *SpoolManagementError) Unwrap() error {
|
||||
return e.err
|
||||
}
|
||||
|
||||
const (
|
||||
// walStatusUpdateThrottle is the minimum time between status updates for WAL archiving
|
||||
walStatusUpdateThrottle = 5 * time.Minute
|
||||
)
|
||||
|
||||
// WALServiceImplementation is the implementation of the WAL Service
|
||||
type WALServiceImplementation struct {
|
||||
wal.UnimplementedWALServer
|
||||
@ -75,6 +84,9 @@ type WALServiceImplementation struct {
|
||||
SpoolDirectory string
|
||||
PGDataPath string
|
||||
PGWALPath string
|
||||
// LastStatusUpdate tracks the last time we updated the status for each ObjectStore+ServerName
|
||||
// Key format: "namespace/objectStoreName/serverName"
|
||||
LastStatusUpdate *sync.Map
|
||||
}
|
||||
|
||||
// GetCapabilities implements the WALService interface
|
||||
@ -102,6 +114,37 @@ func (w WALServiceImplementation) GetCapabilities(
|
||||
}, nil
|
||||
}
|
||||
|
||||
// shouldUpdateStatus checks if we should update the status based on the throttle.
|
||||
// It returns true if walStatusUpdateThrottle minutes have passed since the last update, or if this is the first update.
|
||||
func (w WALServiceImplementation) shouldUpdateStatus(objectStoreKey client.ObjectKey, serverName string) bool {
|
||||
if w.LastStatusUpdate == nil {
|
||||
return true
|
||||
}
|
||||
|
||||
key := fmt.Sprintf("%s/%s", objectStoreKey.String(), serverName)
|
||||
lastUpdate, ok := w.LastStatusUpdate.Load(key)
|
||||
if !ok {
|
||||
return true
|
||||
}
|
||||
|
||||
lastUpdateTime, ok := lastUpdate.(time.Time)
|
||||
if !ok {
|
||||
return true
|
||||
}
|
||||
|
||||
return time.Since(lastUpdateTime) >= walStatusUpdateThrottle
|
||||
}
|
||||
|
||||
// recordStatusUpdate records that we just updated the status for a given ObjectStore and server.
|
||||
func (w WALServiceImplementation) recordStatusUpdate(objectStoreKey client.ObjectKey, serverName string) {
|
||||
if w.LastStatusUpdate == nil {
|
||||
return
|
||||
}
|
||||
|
||||
key := fmt.Sprintf("%s/%s", objectStoreKey.String(), serverName)
|
||||
w.LastStatusUpdate.Store(key, time.Now())
|
||||
}
|
||||
|
||||
// Archive implements the WALService interface
|
||||
func (w WALServiceImplementation) Archive(
|
||||
ctx context.Context,
|
||||
@ -220,6 +263,28 @@ func (w WALServiceImplementation) Archive(
|
||||
}
|
||||
}
|
||||
|
||||
// Update the last archived WAL time in the ObjectStore status
|
||||
// Only update if walStatusUpdateThrottle minutes have passed since the last update to avoid hitting the API server too often
|
||||
objectStoreKey := configuration.GetBarmanObjectKey()
|
||||
if w.shouldUpdateStatus(objectStoreKey, configuration.ServerName) {
|
||||
contextLogger.Debug("Updating last archived WAL time", "serverName", configuration.ServerName)
|
||||
if err := setLastArchivedWALTime(
|
||||
ctx,
|
||||
w.Client,
|
||||
objectStoreKey,
|
||||
configuration.ServerName,
|
||||
time.Now(),
|
||||
); err != nil {
|
||||
// Log the error but don't fail the archive operation
|
||||
contextLogger.Error(err, "Error updating last archived WAL time in ObjectStore status")
|
||||
} else {
|
||||
contextLogger.Debug("Successfully updated last archived WAL time")
|
||||
w.recordStatusUpdate(objectStoreKey, configuration.ServerName)
|
||||
}
|
||||
} else {
|
||||
contextLogger.Debug("Skipping status update due to throttle", "serverName", configuration.ServerName)
|
||||
}
|
||||
|
||||
return &wal.WALArchiveResult{}, nil
|
||||
}
|
||||
|
||||
@ -509,3 +574,30 @@ func isEndOfWALStream(results []barmanRestorer.Result) bool {
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// SetLastArchivedWALTime sets the last archived WAL time in the
|
||||
// passed object store, for the passed server name.
|
||||
func setLastArchivedWALTime(
|
||||
ctx context.Context,
|
||||
c client.Client,
|
||||
objectStoreKey client.ObjectKey,
|
||||
serverName string,
|
||||
lastArchivedWALTime time.Time,
|
||||
) error {
|
||||
return retry.RetryOnConflict(retry.DefaultBackoff, func() error {
|
||||
var objectStore barmancloudv1.ObjectStore
|
||||
|
||||
if err := c.Get(ctx, objectStoreKey, &objectStore); err != nil {
|
||||
return err
|
||||
}
|
||||
recoveryWindow := objectStore.Status.ServerRecoveryWindow[serverName]
|
||||
recoveryWindow.LastArchivedWALTime = ptr.To(metav1.NewTime(lastArchivedWALTime))
|
||||
|
||||
if objectStore.Status.ServerRecoveryWindow == nil {
|
||||
objectStore.Status.ServerRecoveryWindow = make(map[string]barmancloudv1.RecoveryWindow)
|
||||
}
|
||||
objectStore.Status.ServerRecoveryWindow[serverName] = recoveryWindow
|
||||
|
||||
return c.Status().Update(ctx, &objectStore)
|
||||
})
|
||||
}
|
||||
|
||||
@ -51,6 +51,7 @@ var (
|
||||
firstRecoverabilityPointMetricName = buildFqName("first_recoverability_point")
|
||||
lastAvailableBackupTimestampMetricName = buildFqName("last_available_backup_timestamp")
|
||||
lastFailedBackupTimestampMetricName = buildFqName("last_failed_backup_timestamp")
|
||||
lastArchivedWALTimestampMetricName = buildFqName("last_archived_wal_timestamp")
|
||||
)
|
||||
|
||||
func (m metricsImpl) GetCapabilities(
|
||||
@ -97,6 +98,11 @@ func (m metricsImpl) Define(
|
||||
Help: "The last failed backup as a unix timestamp",
|
||||
ValueType: &metrics.MetricType{Type: metrics.MetricType_TYPE_GAUGE},
|
||||
},
|
||||
{
|
||||
FqName: lastArchivedWALTimestampMetricName,
|
||||
Help: "The last archived WAL timestamp as a unix timestamp",
|
||||
ValueType: &metrics.MetricType{Type: metrics.MetricType_TYPE_GAUGE},
|
||||
},
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
@ -136,6 +142,10 @@ func (m metricsImpl) Collect(
|
||||
FqName: lastFailedBackupTimestampMetricName,
|
||||
Value: 0,
|
||||
},
|
||||
{
|
||||
FqName: lastArchivedWALTimestampMetricName,
|
||||
Value: 0,
|
||||
},
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
@ -143,6 +153,7 @@ func (m metricsImpl) Collect(
|
||||
var firstRecoverabilityPoint float64
|
||||
var lastAvailableBackup float64
|
||||
var lastFailedBackup float64
|
||||
var lastArchivedWAL float64
|
||||
if x.FirstRecoverabilityPoint != nil {
|
||||
firstRecoverabilityPoint = float64(x.FirstRecoverabilityPoint.Unix())
|
||||
}
|
||||
@ -152,6 +163,9 @@ func (m metricsImpl) Collect(
|
||||
if x.LastFailedBackupTime != nil {
|
||||
lastFailedBackup = float64(x.LastFailedBackupTime.Unix())
|
||||
}
|
||||
if x.LastArchivedWALTime != nil {
|
||||
lastArchivedWAL = float64(x.LastArchivedWALTime.Unix())
|
||||
}
|
||||
|
||||
return &metrics.CollectMetricsResult{
|
||||
Metrics: []*metrics.CollectMetric{
|
||||
@ -167,6 +181,10 @@ func (m metricsImpl) Collect(
|
||||
FqName: lastFailedBackupTimestampMetricName,
|
||||
Value: lastFailedBackup,
|
||||
},
|
||||
{
|
||||
FqName: lastArchivedWALTimestampMetricName,
|
||||
Value: lastArchivedWAL,
|
||||
},
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
@ -22,10 +22,11 @@ package instance
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"time"
|
||||
|
||||
cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1"
|
||||
"github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/metadata"
|
||||
"k8s.io/utils/ptr"
|
||||
"time"
|
||||
|
||||
"github.com/cloudnative-pg/cnpg-i/pkg/metrics"
|
||||
barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1"
|
||||
@ -117,7 +118,7 @@ var _ = Describe("Metrics Collect method", func() {
|
||||
res, err := m.Collect(ctx, req)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(res).ToNot(BeNil())
|
||||
Expect(res.Metrics).To(HaveLen(3))
|
||||
Expect(res.Metrics).To(HaveLen(4))
|
||||
|
||||
// Verify the metrics
|
||||
metricsMap := make(map[string]float64)
|
||||
@ -131,6 +132,13 @@ var _ = Describe("Metrics Collect method", func() {
|
||||
|
||||
expectedLastBackup, _ := metricsMap[lastAvailableBackupTimestampMetricName]
|
||||
Expect(expectedLastBackup).To(BeNumerically("~", float64(objectStore.Status.ServerRecoveryWindow[clusterName].LastSuccessfulBackupTime.Unix()), 1))
|
||||
|
||||
// Check that unset timestamps are 0
|
||||
expectedLastFailedBackup, _ := metricsMap[lastFailedBackupTimestampMetricName]
|
||||
Expect(expectedLastFailedBackup).To(BeZero())
|
||||
|
||||
expectedLastArchivedWAL, _ := metricsMap[lastArchivedWALTimestampMetricName]
|
||||
Expect(expectedLastArchivedWAL).To(BeZero())
|
||||
})
|
||||
|
||||
It("should return an error if the object store is not found", func() {
|
||||
|
||||
@ -21,6 +21,7 @@ package instance
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sync"
|
||||
|
||||
"github.com/cloudnative-pg/cnpg-i-machinery/pkg/pluginhelper/http"
|
||||
"github.com/cloudnative-pg/cnpg-i/pkg/backup"
|
||||
@ -47,11 +48,12 @@ type CNPGI struct {
|
||||
func (c *CNPGI) Start(ctx context.Context) error {
|
||||
enrich := func(server *grpc.Server) error {
|
||||
wal.RegisterWALServer(server, common.WALServiceImplementation{
|
||||
InstanceName: c.InstanceName,
|
||||
Client: c.Client,
|
||||
SpoolDirectory: c.SpoolDirectory,
|
||||
PGDataPath: c.PGDataPath,
|
||||
PGWALPath: c.PGWALPath,
|
||||
InstanceName: c.InstanceName,
|
||||
Client: c.Client,
|
||||
SpoolDirectory: c.SpoolDirectory,
|
||||
PGDataPath: c.PGDataPath,
|
||||
PGWALPath: c.PGWALPath,
|
||||
LastStatusUpdate: &sync.Map{},
|
||||
})
|
||||
backup.RegisterBackupServer(server, BackupServiceImplementation{
|
||||
Client: c.Client,
|
||||
|
||||
@ -353,30 +353,31 @@ func reconcilePodSpec(
|
||||
sidecarTemplate corev1.Container,
|
||||
config sidecarConfiguration,
|
||||
) error {
|
||||
envs := []corev1.EnvVar{
|
||||
{
|
||||
envs := make([]corev1.EnvVar, 0, 5+len(config.env))
|
||||
envs = append(envs,
|
||||
corev1.EnvVar{
|
||||
Name: "NAMESPACE",
|
||||
Value: cluster.Namespace,
|
||||
},
|
||||
{
|
||||
corev1.EnvVar{
|
||||
Name: "CLUSTER_NAME",
|
||||
Value: cluster.Name,
|
||||
},
|
||||
{
|
||||
corev1.EnvVar{
|
||||
// TODO: should we really use this one?
|
||||
// should we mount an emptyDir volume just for that?
|
||||
Name: "SPOOL_DIRECTORY",
|
||||
Value: "/controller/wal-restore-spool",
|
||||
},
|
||||
{
|
||||
corev1.EnvVar{
|
||||
Name: "CUSTOM_CNPG_GROUP",
|
||||
Value: cluster.GetObjectKind().GroupVersionKind().Group,
|
||||
},
|
||||
{
|
||||
corev1.EnvVar{
|
||||
Name: "CUSTOM_CNPG_VERSION",
|
||||
Value: cluster.GetObjectKind().GroupVersionKind().Version,
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
envs = append(envs, config.env...)
|
||||
|
||||
|
||||
@ -22,6 +22,7 @@ package restore
|
||||
import (
|
||||
"context"
|
||||
"path"
|
||||
"sync"
|
||||
|
||||
"github.com/cloudnative-pg/cnpg-i-machinery/pkg/pluginhelper/http"
|
||||
restore "github.com/cloudnative-pg/cnpg-i/pkg/restore/job"
|
||||
@ -49,11 +50,12 @@ func (c *CNPGI) Start(ctx context.Context) error {
|
||||
|
||||
enrich := func(server *grpc.Server) error {
|
||||
wal.RegisterWALServer(server, common.WALServiceImplementation{
|
||||
InstanceName: c.InstanceName,
|
||||
Client: c.Client,
|
||||
SpoolDirectory: c.SpoolDirectory,
|
||||
PGDataPath: c.PGDataPath,
|
||||
PGWALPath: path.Join(c.PGDataPath, "pg_wal"),
|
||||
InstanceName: c.InstanceName,
|
||||
Client: c.Client,
|
||||
SpoolDirectory: c.SpoolDirectory,
|
||||
PGDataPath: c.PGDataPath,
|
||||
PGWALPath: path.Join(c.PGDataPath, "pg_wal"),
|
||||
LastStatusUpdate: &sync.Map{},
|
||||
})
|
||||
|
||||
restore.RegisterRestoreJobHooksServer(server, &JobHookImpl{
|
||||
|
||||
@ -206,7 +206,7 @@ When a backup fails, follow these steps in order:
|
||||
plugins:
|
||||
- name: barman-cloud.cloudnative-pg.io
|
||||
parameters:
|
||||
barmanObjectStore: <your-objectstore-name>
|
||||
barmanObjectName: <your-objectstore-name>
|
||||
```
|
||||
|
||||
c. **Check plugin deployment is running**:
|
||||
|
||||
@ -206,7 +206,7 @@ When a backup fails, follow these steps in order:
|
||||
plugins:
|
||||
- name: barman-cloud.cloudnative-pg.io
|
||||
parameters:
|
||||
barmanObjectStore: <your-objectstore-name>
|
||||
barmanObjectName: <your-objectstore-name>
|
||||
```
|
||||
|
||||
c. **Check plugin deployment is running**:
|
||||
|
||||
@ -206,7 +206,7 @@ When a backup fails, follow these steps in order:
|
||||
plugins:
|
||||
- name: barman-cloud.cloudnative-pg.io
|
||||
parameters:
|
||||
barmanObjectStore: <your-objectstore-name>
|
||||
barmanObjectName: <your-objectstore-name>
|
||||
```
|
||||
|
||||
c. **Check plugin deployment is running**:
|
||||
|
||||
@ -206,7 +206,7 @@ When a backup fails, follow these steps in order:
|
||||
plugins:
|
||||
- name: barman-cloud.cloudnative-pg.io
|
||||
parameters:
|
||||
barmanObjectStore: <your-objectstore-name>
|
||||
barmanObjectName: <your-objectstore-name>
|
||||
```
|
||||
|
||||
c. **Check plugin deployment is running**:
|
||||
|
||||
@ -206,7 +206,7 @@ When a backup fails, follow these steps in order:
|
||||
plugins:
|
||||
- name: barman-cloud.cloudnative-pg.io
|
||||
parameters:
|
||||
barmanObjectStore: <your-objectstore-name>
|
||||
barmanObjectName: <your-objectstore-name>
|
||||
```
|
||||
|
||||
c. **Check plugin deployment is running**:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user