mirror of
https://github.com/cloudnative-pg/plugin-barman-cloud.git
synced 2026-09-04 22:22:21 +02:00
Compare commits
5 Commits
9ec4c7b912
...
2a14ed371f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2a14ed371f | ||
|
|
6f712151df | ||
|
|
f459a30472 | ||
|
|
6a55a361a3 | ||
|
|
62b579101f |
20
Taskfile.yml
20
Taskfile.yml
@ -67,6 +67,26 @@ tasks:
|
||||
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/commitlint@${DAGGER_COMMITLINT_SHA}
|
||||
lint --source . --args "--from=origin/main" stdout
|
||||
|
||||
pip-compile-sidecar:
|
||||
desc: Regenerate containers/sidecar-requirements.txt with the same Python version as the sidecar image
|
||||
cmds:
|
||||
- >
|
||||
GITHUB_REF= dagger call --no-mod
|
||||
container from --address=debian:trixie-slim
|
||||
with-env-variable --name=DEBIAN_FRONTEND --value=noninteractive
|
||||
with-exec --args="apt-get,update,-qq"
|
||||
with-exec --args="apt-get,install,-y,-qq,python3,python3-venv,python3-pip,gcc,libpq-dev"
|
||||
with-exec --args="pip,install,--quiet,--break-system-packages,pip-tools,click<8.5.0"
|
||||
with-directory --path=/work --source=containers
|
||||
with-workdir --path=/work
|
||||
with-exec --args="pip-compile,--allow-unsafe,--generate-hashes,--output-file=sidecar-requirements.txt,--strip-extras,sidecar-requirements.in"
|
||||
file --path=/work/sidecar-requirements.txt
|
||||
export --path=containers/sidecar-requirements.txt
|
||||
sources:
|
||||
- containers/sidecar-requirements.in
|
||||
generates:
|
||||
- containers/sidecar-requirements.txt
|
||||
|
||||
uncommitted:
|
||||
desc: Check for uncommitted changes
|
||||
deps:
|
||||
|
||||
@ -36,6 +36,9 @@ import (
|
||||
// DefaultTTLSeconds is the default TTL in seconds of cache entries
|
||||
const DefaultTTLSeconds = 10
|
||||
|
||||
// DefaultCleanupIntervalSeconds is the default interval in seconds for cache cleanup
|
||||
const DefaultCleanupIntervalSeconds = 30
|
||||
|
||||
type cachedEntry struct {
|
||||
entry client.Object
|
||||
fetchUnixTime int64
|
||||
@ -49,18 +52,30 @@ func (e *cachedEntry) isExpired() bool {
|
||||
// ExtendedClient is an extended client that is capable of caching multiple secrets without relying on informers
|
||||
type ExtendedClient struct {
|
||||
client.Client
|
||||
cachedObjects []cachedEntry
|
||||
mux *sync.Mutex
|
||||
cachedObjects []cachedEntry
|
||||
mux *sync.Mutex
|
||||
cleanupInterval time.Duration
|
||||
cleanupDone chan struct{} // Signals when cleanup routine exits
|
||||
}
|
||||
|
||||
// NewExtendedClient returns an extended client capable of caching secrets on the 'Get' operation
|
||||
// NewExtendedClient returns an extended client capable of caching secrets on the 'Get' operation.
|
||||
// It starts a background goroutine that periodically cleans up expired cache entries.
|
||||
// The cleanup routine will stop when the provided context is cancelled.
|
||||
func NewExtendedClient(
|
||||
ctx context.Context,
|
||||
baseClient client.Client,
|
||||
) client.Client {
|
||||
return &ExtendedClient{
|
||||
Client: baseClient,
|
||||
mux: &sync.Mutex{},
|
||||
ec := &ExtendedClient{
|
||||
Client: baseClient,
|
||||
mux: &sync.Mutex{},
|
||||
cleanupInterval: DefaultCleanupIntervalSeconds * time.Second,
|
||||
cleanupDone: make(chan struct{}),
|
||||
}
|
||||
|
||||
// Start the background cleanup routine
|
||||
go ec.startCleanupRoutine(ctx)
|
||||
|
||||
return ec
|
||||
}
|
||||
|
||||
func (e *ExtendedClient) isObjectCached(obj client.Object) bool {
|
||||
@ -208,3 +223,55 @@ func (e *ExtendedClient) Patch(
|
||||
|
||||
return e.Client.Patch(ctx, obj, patch, opts...)
|
||||
}
|
||||
|
||||
// startCleanupRoutine periodically removes expired entries from the cache.
|
||||
// It runs until the context is cancelled.
|
||||
func (e *ExtendedClient) startCleanupRoutine(ctx context.Context) {
|
||||
defer close(e.cleanupDone)
|
||||
contextLogger := log.FromContext(ctx).WithName("extended_client_cleanup")
|
||||
ticker := time.NewTicker(e.cleanupInterval)
|
||||
defer ticker.Stop()
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
contextLogger.Debug("stopping cache cleanup routine")
|
||||
return
|
||||
case <-ticker.C:
|
||||
// Check context before cleanup to avoid unnecessary work during shutdown
|
||||
if ctx.Err() != nil {
|
||||
return
|
||||
}
|
||||
e.cleanupExpiredEntries(ctx)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// cleanupExpiredEntries removes all expired entries from the cache.
|
||||
func (e *ExtendedClient) cleanupExpiredEntries(ctx context.Context) {
|
||||
contextLogger := log.FromContext(ctx).WithName("extended_client_cleanup")
|
||||
|
||||
e.mux.Lock()
|
||||
defer e.mux.Unlock()
|
||||
|
||||
initialCount := len(e.cachedObjects)
|
||||
if initialCount == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
// Create a new slice with only non-expired entries
|
||||
validEntries := make([]cachedEntry, 0, initialCount)
|
||||
for _, entry := range e.cachedObjects {
|
||||
if !entry.isExpired() {
|
||||
validEntries = append(validEntries, entry)
|
||||
}
|
||||
}
|
||||
|
||||
removedCount := initialCount - len(validEntries)
|
||||
if removedCount > 0 {
|
||||
e.cachedObjects = validEntries
|
||||
contextLogger.Debug("cleaned up expired cache entries",
|
||||
"removedCount", removedCount,
|
||||
"remainingCount", len(validEntries))
|
||||
}
|
||||
}
|
||||
|
||||
@ -20,6 +20,7 @@ SPDX-License-Identifier: Apache-2.0
|
||||
package client
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
@ -59,6 +60,7 @@ var _ = Describe("ExtendedClient Get", func() {
|
||||
extendedClient *ExtendedClient
|
||||
secretInClient *corev1.Secret
|
||||
objectStore *barmancloudv1.ObjectStore
|
||||
cancelCtx context.CancelFunc
|
||||
)
|
||||
|
||||
BeforeEach(func() {
|
||||
@ -79,7 +81,14 @@ var _ = Describe("ExtendedClient Get", func() {
|
||||
baseClient := fake.NewClientBuilder().
|
||||
WithScheme(scheme).
|
||||
WithObjects(secretInClient, objectStore).Build()
|
||||
extendedClient = NewExtendedClient(baseClient).(*ExtendedClient)
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
cancelCtx = cancel
|
||||
extendedClient = NewExtendedClient(ctx, baseClient).(*ExtendedClient)
|
||||
})
|
||||
|
||||
AfterEach(func() {
|
||||
// Cancel the context to stop the cleanup routine
|
||||
cancelCtx()
|
||||
})
|
||||
|
||||
It("returns secret from cache if not expired", func(ctx SpecContext) {
|
||||
@ -164,3 +173,141 @@ var _ = Describe("ExtendedClient Get", func() {
|
||||
Expect(objectStore.GetResourceVersion()).To(Equal("from cache"))
|
||||
})
|
||||
})
|
||||
|
||||
var _ = Describe("ExtendedClient Cache Cleanup", func() {
|
||||
var (
|
||||
extendedClient *ExtendedClient
|
||||
cancelCtx context.CancelFunc
|
||||
)
|
||||
|
||||
BeforeEach(func() {
|
||||
baseClient := fake.NewClientBuilder().
|
||||
WithScheme(scheme).
|
||||
Build()
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
cancelCtx = cancel
|
||||
extendedClient = NewExtendedClient(ctx, baseClient).(*ExtendedClient)
|
||||
})
|
||||
|
||||
AfterEach(func() {
|
||||
cancelCtx()
|
||||
})
|
||||
|
||||
It("cleans up expired entries", func(ctx SpecContext) {
|
||||
// Add some expired entries
|
||||
expiredSecret1 := &corev1.Secret{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Namespace: "default",
|
||||
Name: "expired-secret-1",
|
||||
},
|
||||
}
|
||||
expiredSecret2 := &corev1.Secret{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Namespace: "default",
|
||||
Name: "expired-secret-2",
|
||||
},
|
||||
}
|
||||
validSecret := &corev1.Secret{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Namespace: "default",
|
||||
Name: "valid-secret",
|
||||
},
|
||||
}
|
||||
|
||||
// Add expired entries (2 minutes ago)
|
||||
addToCache(extendedClient, expiredSecret1, time.Now().Add(-2*time.Minute).Unix())
|
||||
addToCache(extendedClient, expiredSecret2, time.Now().Add(-2*time.Minute).Unix())
|
||||
// Add valid entry (just now)
|
||||
addToCache(extendedClient, validSecret, time.Now().Unix())
|
||||
|
||||
Expect(extendedClient.cachedObjects).To(HaveLen(3))
|
||||
|
||||
// Trigger cleanup
|
||||
extendedClient.cleanupExpiredEntries(ctx)
|
||||
|
||||
// Only the valid entry should remain
|
||||
Expect(extendedClient.cachedObjects).To(HaveLen(1))
|
||||
Expect(extendedClient.cachedObjects[0].entry.GetName()).To(Equal("valid-secret"))
|
||||
})
|
||||
|
||||
It("does nothing when all entries are valid", func(ctx SpecContext) {
|
||||
validSecret1 := &corev1.Secret{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Namespace: "default",
|
||||
Name: "valid-secret-1",
|
||||
},
|
||||
}
|
||||
validSecret2 := &corev1.Secret{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Namespace: "default",
|
||||
Name: "valid-secret-2",
|
||||
},
|
||||
}
|
||||
|
||||
addToCache(extendedClient, validSecret1, time.Now().Unix())
|
||||
addToCache(extendedClient, validSecret2, time.Now().Unix())
|
||||
|
||||
Expect(extendedClient.cachedObjects).To(HaveLen(2))
|
||||
|
||||
// Trigger cleanup
|
||||
extendedClient.cleanupExpiredEntries(ctx)
|
||||
|
||||
// Both entries should remain
|
||||
Expect(extendedClient.cachedObjects).To(HaveLen(2))
|
||||
})
|
||||
|
||||
It("does nothing when cache is empty", func(ctx SpecContext) {
|
||||
Expect(extendedClient.cachedObjects).To(BeEmpty())
|
||||
|
||||
// Trigger cleanup
|
||||
extendedClient.cleanupExpiredEntries(ctx)
|
||||
|
||||
Expect(extendedClient.cachedObjects).To(BeEmpty())
|
||||
})
|
||||
|
||||
It("removes all entries when all are expired", func(ctx SpecContext) {
|
||||
expiredSecret1 := &corev1.Secret{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Namespace: "default",
|
||||
Name: "expired-secret-1",
|
||||
},
|
||||
}
|
||||
expiredSecret2 := &corev1.Secret{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Namespace: "default",
|
||||
Name: "expired-secret-2",
|
||||
},
|
||||
}
|
||||
|
||||
addToCache(extendedClient, expiredSecret1, time.Now().Add(-2*time.Minute).Unix())
|
||||
addToCache(extendedClient, expiredSecret2, time.Now().Add(-2*time.Minute).Unix())
|
||||
|
||||
Expect(extendedClient.cachedObjects).To(HaveLen(2))
|
||||
|
||||
// Trigger cleanup
|
||||
extendedClient.cleanupExpiredEntries(ctx)
|
||||
|
||||
Expect(extendedClient.cachedObjects).To(BeEmpty())
|
||||
})
|
||||
|
||||
It("stops cleanup routine when context is cancelled", func() {
|
||||
// Create a new client with a short cleanup interval for testing
|
||||
baseClient := fake.NewClientBuilder().
|
||||
WithScheme(scheme).
|
||||
Build()
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
ec := NewExtendedClient(ctx, baseClient).(*ExtendedClient)
|
||||
ec.cleanupInterval = 10 * time.Millisecond
|
||||
|
||||
// Cancel the context immediately
|
||||
cancel()
|
||||
|
||||
// Verify the cleanup routine actually stops by waiting for the done channel
|
||||
select {
|
||||
case <-ec.cleanupDone:
|
||||
// Success: cleanup routine exited as expected
|
||||
case <-time.After(1 * time.Second):
|
||||
Fail("cleanup routine did not stop within timeout")
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
@ -80,7 +80,7 @@ func Start(ctx context.Context) error {
|
||||
return err
|
||||
}
|
||||
|
||||
customCacheClient := extendedclient.NewExtendedClient(mgr.GetClient())
|
||||
customCacheClient := extendedclient.NewExtendedClient(ctx, mgr.GetClient())
|
||||
|
||||
if err := mgr.Add(&CNPGI{
|
||||
Client: customCacheClient,
|
||||
|
||||
@ -54,7 +54,47 @@ Both checks are required before proceeding with the installation.
|
||||
|
||||
## Installing the Barman Cloud Plugin
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
import { InstallationSnippet, ManifestVersion } from '@site/src/components/Installation';
|
||||
import { HelmInstallationSnippet } from '@site/src/components/HelmInstallation';
|
||||
|
||||
<Tabs groupId="install-method" queryString>
|
||||
<TabItem value="helm" label="Helm Chart" default>
|
||||
|
||||
The plugin can be installed using the provided [Helm chart](https://github.com/cloudnative-pg/charts/tree/main/charts/plugin-barman-cloud).
|
||||
This installs the latest published chart release; to test an unreleased
|
||||
development snapshot instead, switch to the [**Manifest (kubectl)**](./?install-method=kubectl#installing-the-barman-cloud-plugin) tab.
|
||||
|
||||
<HelmInstallationSnippet />
|
||||
|
||||
Example output:
|
||||
|
||||
```output
|
||||
Release "plugin-barman-cloud" does not exist. Installing it now.
|
||||
NAME: plugin-barman-cloud
|
||||
LAST DEPLOYED: Wed Jul 1 09:05:16 2026
|
||||
NAMESPACE: cnpg-system
|
||||
STATUS: deployed
|
||||
REVISION: 1
|
||||
DESCRIPTION: Install complete
|
||||
TEST SUITE: None
|
||||
```
|
||||
|
||||
Finally, check that the deployment is up and running:
|
||||
|
||||
```sh
|
||||
kubectl -n cnpg-system rollout status deploy/plugin-barman-cloud
|
||||
```
|
||||
|
||||
Example output:
|
||||
|
||||
```output
|
||||
deployment "plugin-barman-cloud" successfully rolled out
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="kubectl" label="Manifest (kubectl)">
|
||||
|
||||
Install the plugin using `kubectl` by applying the manifest for <ManifestVersion />:
|
||||
|
||||
@ -85,8 +125,7 @@ issuer.cert-manager.io/selfsigned-issuer created
|
||||
Finally, check that the deployment is up and running:
|
||||
|
||||
```sh
|
||||
kubectl rollout status deployment \
|
||||
-n cnpg-system barman-cloud
|
||||
kubectl -n cnpg-system rollout status deploy/barman-cloud
|
||||
```
|
||||
|
||||
Example output:
|
||||
@ -95,6 +134,11 @@ Example output:
|
||||
deployment "barman-cloud" successfully rolled out
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
---
|
||||
|
||||
This confirms that the plugin is deployed and ready to use.
|
||||
|
||||
## Testing the latest development snapshot
|
||||
|
||||
@ -485,14 +485,10 @@ If problems persist:
|
||||
|
||||
### Plugin Limitations
|
||||
|
||||
1. **Installation method**: Currently only supports manifest and Kustomize
|
||||
installation ([#351](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/351) -
|
||||
Helm chart requested)
|
||||
|
||||
2. **Sidecar resource sharing**: The plugin sidecar container shares pod
|
||||
1. **Sidecar resource sharing**: The plugin sidecar container shares pod
|
||||
resources with PostgreSQL
|
||||
|
||||
3. **Plugin restart behavior**: Restarting the sidecar container requires
|
||||
2. **Plugin restart behavior**: Restarting the sidecar container requires
|
||||
restarting the entire PostgreSQL pod
|
||||
|
||||
## Recap of General Debugging Steps
|
||||
@ -588,4 +584,3 @@ kubectl get secret -n <namespace> <secret-name> -o jsonpath='{.data}' | jq 'keys
|
||||
* **"NoSuchBucket"** — Verify the bucket exists and the endpoint URL is correct.
|
||||
* **"Connection timeout"** — Check network connectivity and firewall rules.
|
||||
* **"SSL certificate problem"** — For self-signed certificates, verify the CA bundle configuration.
|
||||
|
||||
|
||||
36
web/src/components/HelmInstallation/index.tsx
Normal file
36
web/src/components/HelmInstallation/index.tsx
Normal file
@ -0,0 +1,36 @@
|
||||
import {ReactElement} from 'react';
|
||||
import CodeBlock from '@theme/CodeBlock';
|
||||
import {useActiveVersion, useLatestVersion} from '@docusaurus/plugin-content-docs/client';
|
||||
|
||||
// HelmInstallationSnippet is the Helm command to install the plugin.
|
||||
//
|
||||
// - Latest release: no override. The chart already defaults to
|
||||
// itself.
|
||||
// - Older release: pin image.tag and sidecarImage.tag to that
|
||||
// version. We check this again on every build using
|
||||
// useLatestVersion, so an old page updates itself once a newer
|
||||
// version ships.
|
||||
// - Dev docs: also no override, but this does NOT install a dev
|
||||
// build. Setting the tag alone would not be enough, since the
|
||||
// chart's own templates (CRDs, RBAC...) can be older than what
|
||||
// main needs. Use the kubectl method to test a dev build.
|
||||
export function HelmInstallationSnippet(): ReactElement<null> {
|
||||
const activeVersion = useActiveVersion('default');
|
||||
const latestVersion = useLatestVersion('default');
|
||||
const isOlderRelease = activeVersion
|
||||
&& activeVersion.name !== 'current'
|
||||
&& activeVersion.name !== latestVersion.name;
|
||||
const setArgs = isOlderRelease
|
||||
? ` \\
|
||||
--set image.tag=v${activeVersion.name} \\
|
||||
--set sidecarImage.tag=v${activeVersion.name}`
|
||||
: '';
|
||||
return (
|
||||
<CodeBlock language="sh">
|
||||
{`helm repo add cnpg https://cloudnative-pg.github.io/charts --force-update
|
||||
helm upgrade --install plugin-barman-cloud \\
|
||||
--namespace cnpg-system${setArgs} \\
|
||||
cnpg/plugin-barman-cloud`}
|
||||
</CodeBlock>
|
||||
);
|
||||
}
|
||||
@ -1,5 +1,7 @@
|
||||
import {ReactElement} from 'react';
|
||||
import CodeBlock from '@theme/CodeBlock';
|
||||
import Link from '@docusaurus/Link';
|
||||
import {useLocation} from '@docusaurus/router';
|
||||
import {useActiveVersion} from '@docusaurus/plugin-content-docs/client';
|
||||
|
||||
// DEV_MANIFEST_URL is the URL of the manifest.yaml on the main branch of the plugin repo.
|
||||
@ -31,14 +33,17 @@ export function ManifestVersion(): ReactElement<null> {
|
||||
: <>the latest development snapshot from the <code>main</code> branch</>;
|
||||
}
|
||||
|
||||
// DevSnapshotSection offers the main-branch manifest as an alternative;
|
||||
// on the Dev docs the main install already is that manifest, so hide it.
|
||||
// DevSnapshotSection shows how to test the main-branch manifest. On
|
||||
// the Dev docs, the kubectl install above already does that, so we
|
||||
// hide this section there. (The Helm tab there installs the latest
|
||||
// release, not a dev build.)
|
||||
export function DevSnapshotSection(): ReactElement {
|
||||
const activeVersion = useActiveVersion('default');
|
||||
const {pathname} = useLocation();
|
||||
if (!activeVersion || activeVersion.name === 'current') {
|
||||
return (
|
||||
<p>The <a href="#installing-the-barman-cloud-plugin">install
|
||||
command above</a> already applies the latest development
|
||||
<p>The <Link to={`${pathname}?install-method=kubectl#installing-the-barman-cloud-plugin`}>kubectl
|
||||
install command above</Link> already applies the latest development
|
||||
snapshot from the <code>main</code> branch.</p>
|
||||
);
|
||||
}
|
||||
|
||||
@ -54,7 +54,45 @@ Both checks are required before proceeding with the installation.
|
||||
|
||||
## Installing the Barman Cloud Plugin
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
import { InstallationSnippet, ManifestVersion } from '@site/src/components/Installation';
|
||||
import { HelmInstallationSnippet } from '@site/src/components/HelmInstallation';
|
||||
|
||||
<Tabs groupId="install-method">
|
||||
<TabItem value="helm" label="Helm Chart" default>
|
||||
|
||||
The plugin can be installed using the provided [Helm chart](https://github.com/cloudnative-pg/charts/tree/main/charts/plugin-barman-cloud):
|
||||
|
||||
<HelmInstallationSnippet />
|
||||
|
||||
Example output:
|
||||
|
||||
```output
|
||||
Release "plugin-barman-cloud" does not exist. Installing it now.
|
||||
NAME: plugin-barman-cloud
|
||||
LAST DEPLOYED: Wed Jul 1 09:05:16 2026
|
||||
NAMESPACE: cnpg-system
|
||||
STATUS: deployed
|
||||
REVISION: 1
|
||||
DESCRIPTION: Install complete
|
||||
TEST SUITE: None
|
||||
```
|
||||
|
||||
Finally, check that the deployment is up and running:
|
||||
|
||||
```sh
|
||||
kubectl -n cnpg-system rollout status deploy/plugin-barman-cloud
|
||||
```
|
||||
|
||||
Example output:
|
||||
|
||||
```output
|
||||
deployment "plugin-barman-cloud" successfully rolled out
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="kubectl" label="Manifest (kubectl)">
|
||||
|
||||
Install the plugin using `kubectl` by applying the manifest for <ManifestVersion />:
|
||||
|
||||
@ -85,8 +123,7 @@ issuer.cert-manager.io/selfsigned-issuer created
|
||||
Finally, check that the deployment is up and running:
|
||||
|
||||
```sh
|
||||
kubectl rollout status deployment \
|
||||
-n cnpg-system barman-cloud
|
||||
kubectl -n cnpg-system rollout status deploy/barman-cloud
|
||||
```
|
||||
|
||||
Example output:
|
||||
@ -95,6 +132,11 @@ Example output:
|
||||
deployment "barman-cloud" successfully rolled out
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
---
|
||||
|
||||
This confirms that the plugin is deployed and ready to use.
|
||||
|
||||
## Testing the latest development snapshot
|
||||
|
||||
@ -485,14 +485,10 @@ If problems persist:
|
||||
|
||||
### Plugin Limitations
|
||||
|
||||
1. **Installation method**: Currently only supports manifest and Kustomize
|
||||
installation ([#351](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/351) -
|
||||
Helm chart requested)
|
||||
|
||||
2. **Sidecar resource sharing**: The plugin sidecar container shares pod
|
||||
1. **Sidecar resource sharing**: The plugin sidecar container shares pod
|
||||
resources with PostgreSQL
|
||||
|
||||
3. **Plugin restart behavior**: Restarting the sidecar container requires
|
||||
2. **Plugin restart behavior**: Restarting the sidecar container requires
|
||||
restarting the entire PostgreSQL pod
|
||||
|
||||
## Recap of General Debugging Steps
|
||||
@ -588,4 +584,3 @@ kubectl get secret -n <namespace> <secret-name> -o jsonpath='{.data}' | jq 'keys
|
||||
* **"NoSuchBucket"** — Verify the bucket exists and the endpoint URL is correct.
|
||||
* **"Connection timeout"** — Check network connectivity and firewall rules.
|
||||
* **"SSL certificate problem"** — For self-signed certificates, verify the CA bundle configuration.
|
||||
|
||||
|
||||
@ -54,7 +54,45 @@ Both checks are required before proceeding with the installation.
|
||||
|
||||
## Installing the Barman Cloud Plugin
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
import { InstallationSnippet, ManifestVersion } from '@site/src/components/Installation';
|
||||
import { HelmInstallationSnippet } from '@site/src/components/HelmInstallation';
|
||||
|
||||
<Tabs groupId="install-method">
|
||||
<TabItem value="helm" label="Helm Chart" default>
|
||||
|
||||
The plugin can be installed using the provided [Helm chart](https://github.com/cloudnative-pg/charts/tree/main/charts/plugin-barman-cloud):
|
||||
|
||||
<HelmInstallationSnippet />
|
||||
|
||||
Example output:
|
||||
|
||||
```output
|
||||
Release "plugin-barman-cloud" does not exist. Installing it now.
|
||||
NAME: plugin-barman-cloud
|
||||
LAST DEPLOYED: Wed Jul 1 09:05:16 2026
|
||||
NAMESPACE: cnpg-system
|
||||
STATUS: deployed
|
||||
REVISION: 1
|
||||
DESCRIPTION: Install complete
|
||||
TEST SUITE: None
|
||||
```
|
||||
|
||||
Finally, check that the deployment is up and running:
|
||||
|
||||
```sh
|
||||
kubectl -n cnpg-system rollout status deploy/plugin-barman-cloud
|
||||
```
|
||||
|
||||
Example output:
|
||||
|
||||
```output
|
||||
deployment "plugin-barman-cloud" successfully rolled out
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="kubectl" label="Manifest (kubectl)">
|
||||
|
||||
Install the plugin using `kubectl` by applying the manifest for <ManifestVersion />:
|
||||
|
||||
@ -85,8 +123,7 @@ issuer.cert-manager.io/selfsigned-issuer created
|
||||
Finally, check that the deployment is up and running:
|
||||
|
||||
```sh
|
||||
kubectl rollout status deployment \
|
||||
-n cnpg-system barman-cloud
|
||||
kubectl -n cnpg-system rollout status deploy/barman-cloud
|
||||
```
|
||||
|
||||
Example output:
|
||||
@ -95,6 +132,9 @@ Example output:
|
||||
deployment "barman-cloud" successfully rolled out
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
This confirms that the plugin is deployed and ready to use.
|
||||
|
||||
## Testing the latest development snapshot
|
||||
|
||||
@ -485,14 +485,10 @@ If problems persist:
|
||||
|
||||
### Plugin Limitations
|
||||
|
||||
1. **Installation method**: Currently only supports manifest and Kustomize
|
||||
installation ([#351](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/351) -
|
||||
Helm chart requested)
|
||||
|
||||
2. **Sidecar resource sharing**: The plugin sidecar container shares pod
|
||||
1. **Sidecar resource sharing**: The plugin sidecar container shares pod
|
||||
resources with PostgreSQL
|
||||
|
||||
3. **Plugin restart behavior**: Restarting the sidecar container requires
|
||||
2. **Plugin restart behavior**: Restarting the sidecar container requires
|
||||
restarting the entire PostgreSQL pod
|
||||
|
||||
## Recap of General Debugging Steps
|
||||
@ -588,4 +584,3 @@ kubectl get secret -n <namespace> <secret-name> -o jsonpath='{.data}' | jq 'keys
|
||||
* **"NoSuchBucket"** — Verify the bucket exists and the endpoint URL is correct.
|
||||
* **"Connection timeout"** — Check network connectivity and firewall rules.
|
||||
* **"SSL certificate problem"** — For self-signed certificates, verify the CA bundle configuration.
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user