mirror of
https://github.com/cloudnative-pg/plugin-barman-cloud.git
synced 2026-09-06 15:02:21 +02:00
Merge branch 'main' into rkth/azure-workload-identity
This commit is contained in:
commit
4632011ea4
10
.github/workflows/ci.yml
vendored
10
.github/workflows/ci.yml
vendored
@ -8,12 +8,13 @@ permissions: read-all
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
ci:
|
ci:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ${{ vars.CI_RUNNERS || 'ubuntu-latest' }}
|
||||||
permissions:
|
permissions:
|
||||||
packages: write
|
packages: write
|
||||||
contents: write
|
contents: write
|
||||||
steps:
|
steps:
|
||||||
- name: Cleanup Disk
|
- name: Cleanup Disk
|
||||||
|
if: vars.CI_RUNNERS == '' || vars.CI_RUNNERS == 'ubuntu-latest'
|
||||||
uses: jlumbroso/free-disk-space@v1.3.1
|
uses: jlumbroso/free-disk-space@v1.3.1
|
||||||
with:
|
with:
|
||||||
android: true
|
android: true
|
||||||
@ -23,6 +24,7 @@ jobs:
|
|||||||
large-packages: false
|
large-packages: false
|
||||||
swap-storage: false
|
swap-storage: false
|
||||||
- name: Cleanup docker cache
|
- name: Cleanup docker cache
|
||||||
|
if: vars.CI_RUNNERS == '' || vars.CI_RUNNERS == 'ubuntu-latest'
|
||||||
run: |
|
run: |
|
||||||
echo "-------------Disk info before cleanup----------------"
|
echo "-------------Disk info before cleanup----------------"
|
||||||
df -h
|
df -h
|
||||||
@ -32,7 +34,7 @@ jobs:
|
|||||||
df -h
|
df -h
|
||||||
echo "-----------------------------------------------------"
|
echo "-----------------------------------------------------"
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v7.0.1
|
||||||
# We need the full history for the commitlint task
|
# We need the full history for the commitlint task
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
@ -40,11 +42,11 @@ jobs:
|
|||||||
- name: Install QEMU static binaries
|
- name: Install QEMU static binaries
|
||||||
uses: docker/setup-qemu-action@v4
|
uses: docker/setup-qemu-action@v4
|
||||||
- name: Install Task
|
- name: Install Task
|
||||||
uses: arduino/setup-task@v2
|
uses: arduino/setup-task@v3.0.0
|
||||||
- name: Install Dagger
|
- name: Install Dagger
|
||||||
env:
|
env:
|
||||||
# renovate: datasource=github-tags depName=dagger/dagger versioning=semver
|
# renovate: datasource=github-tags depName=dagger/dagger versioning=semver
|
||||||
DAGGER_VERSION: 0.20.6
|
DAGGER_VERSION: 0.21.7
|
||||||
run: |
|
run: |
|
||||||
curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh
|
curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh
|
||||||
- name: Run CI task
|
- name: Run CI task
|
||||||
|
|||||||
8
.github/workflows/publish-docs.yml
vendored
8
.github/workflows/publish-docs.yml
vendored
@ -20,15 +20,15 @@ permissions: read-all
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ${{ vars.CI_RUNNERS || 'ubuntu-latest' }}
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v7.0.1
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v6
|
uses: actions/setup-node@v7
|
||||||
with:
|
with:
|
||||||
# Use the latest LTS version of Node.js already installed on the runner.
|
# Use the latest LTS version of Node.js already installed on the runner.
|
||||||
node-version: latest
|
node-version: latest
|
||||||
@ -60,7 +60,7 @@ jobs:
|
|||||||
name: github-pages
|
name: github-pages
|
||||||
url: ${{ steps.deployment.outputs.page_url }}
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
needs: build
|
needs: build
|
||||||
runs-on: ubuntu-latest
|
runs-on: ${{ vars.CI_RUNNERS || 'ubuntu-latest' }}
|
||||||
steps:
|
steps:
|
||||||
- name: Deploy to GitHub Pages
|
- name: Deploy to GitHub Pages
|
||||||
id: deployment
|
id: deployment
|
||||||
|
|||||||
10
.github/workflows/release-please.yml
vendored
10
.github/workflows/release-please.yml
vendored
@ -9,7 +9,7 @@ permissions: read-all
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release-please:
|
release-please:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ${{ vars.CI_RUNNERS || 'ubuntu-latest' }}
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
@ -19,19 +19,19 @@ jobs:
|
|||||||
# We'll use the cli until there's a fix for
|
# We'll use the cli until there's a fix for
|
||||||
# https://github.com/googleapis/release-please/issues/2280.
|
# https://github.com/googleapis/release-please/issues/2280.
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v7.0.1
|
||||||
- name: Install node
|
- name: Install node
|
||||||
uses: actions/setup-node@v6
|
uses: actions/setup-node@v7
|
||||||
with:
|
with:
|
||||||
node-version: 24
|
node-version: 24
|
||||||
- name: Install QEMU static binaries
|
- name: Install QEMU static binaries
|
||||||
uses: docker/setup-qemu-action@v4
|
uses: docker/setup-qemu-action@v4
|
||||||
- name: Install Task
|
- name: Install Task
|
||||||
uses: arduino/setup-task@v2
|
uses: arduino/setup-task@v3.0.0
|
||||||
- name: Install Dagger
|
- name: Install Dagger
|
||||||
env:
|
env:
|
||||||
# renovate: datasource=github-tags depName=dagger/dagger versioning=semver
|
# renovate: datasource=github-tags depName=dagger/dagger versioning=semver
|
||||||
DAGGER_VERSION: 0.20.6
|
DAGGER_VERSION: 0.21.7
|
||||||
run: |
|
run: |
|
||||||
curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh
|
curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh
|
||||||
- name: Create image and manifest
|
- name: Create image and manifest
|
||||||
|
|||||||
8
.github/workflows/release-publish.yml
vendored
8
.github/workflows/release-publish.yml
vendored
@ -7,21 +7,21 @@ permissions: read-all
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release-publish-artifacts:
|
release-publish-artifacts:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ${{ vars.CI_RUNNERS || 'ubuntu-latest' }}
|
||||||
permissions:
|
permissions:
|
||||||
packages: write
|
packages: write
|
||||||
contents: write
|
contents: write
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v7.0.1
|
||||||
- name: Install QEMU static binaries
|
- name: Install QEMU static binaries
|
||||||
uses: docker/setup-qemu-action@v4
|
uses: docker/setup-qemu-action@v4
|
||||||
- name: Install Task
|
- name: Install Task
|
||||||
uses: arduino/setup-task@v2
|
uses: arduino/setup-task@v3.0.0
|
||||||
- name: Install Dagger
|
- name: Install Dagger
|
||||||
env:
|
env:
|
||||||
# renovate: datasource=github-tags depName=dagger/dagger versioning=semver
|
# renovate: datasource=github-tags depName=dagger/dagger versioning=semver
|
||||||
DAGGER_VERSION: 0.20.6
|
DAGGER_VERSION: 0.21.7
|
||||||
run: |
|
run: |
|
||||||
curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh
|
curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh
|
||||||
- name: Create image and manifest
|
- name: Create image and manifest
|
||||||
|
|||||||
@ -16,7 +16,7 @@ linters:
|
|||||||
- gocyclo
|
- gocyclo
|
||||||
- goheader
|
- goheader
|
||||||
- gomoddirectives
|
- gomoddirectives
|
||||||
- gomodguard
|
- gomodguard_v2
|
||||||
- goprintffuncname
|
- goprintffuncname
|
||||||
- gosec
|
- gosec
|
||||||
- govet
|
- govet
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
{
|
{
|
||||||
".": "0.12.0"
|
".": "0.13.0"
|
||||||
}
|
}
|
||||||
|
|||||||
31
CHANGELOG.md
31
CHANGELOG.md
@ -1,5 +1,36 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [0.13.0](https://github.com/cloudnative-pg/plugin-barman-cloud/compare/v0.12.0...v0.13.0) (2026-06-10)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* Configure k8s recommended labels on subresources ([#865](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/865)) ([4bbaf18](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/4bbaf18cd30174229d98e23151d2d257c90b561a)), closes [#545](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/545)
|
||||||
|
* Pass additionalCommandArgs to barman-cloud-restore ([#914](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/914)) ([c5f149b](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/c5f149b86a38fd2af33045d785c2e9a69a7e340a)), closes [#821](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/821)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Add lz4 compression support for base backups ([#868](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/868)) ([e30154b](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/e30154b938b053f688b5ab520000233e164df6b6)), closes [#867](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/867)
|
||||||
|
* Classify WAL restore errors with precise gRPC statuses ([#927](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/927)) ([aaf6120](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/aaf6120eaaf96d805d26fe4550b1f9c14dd8e02f))
|
||||||
|
* **deps:** Update all non-major go dependencies ([#877](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/877)) ([a81f6e3](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/a81f6e3d73ee348df22439f2daf062f4be598910))
|
||||||
|
* **deps:** Update all non-major go dependencies ([#898](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/898)) ([acdbfb8](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/acdbfb8b10f93cf52f874ec893905709d9bcaa8b))
|
||||||
|
* **deps:** Update all non-major go dependencies to 5d46599 ([#940](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/940)) ([40aa4b2](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/40aa4b21b88e2e323226c391078240d365653de9))
|
||||||
|
* **deps:** Update all non-major go dependencies to 8e1642e ([#939](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/939)) ([f708825](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/f7088258fd0ca1bca2e7dc15753be495d7dcc022))
|
||||||
|
* **deps:** Update all non-major go dependencies to bd68198 ([#950](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/950)) ([787d2b3](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/787d2b35ad4f86a0c125e4996194ec8fe7957de7))
|
||||||
|
* **deps:** Update documentation dependencies to v3.10.1 ([#878](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/878)) ([6cf473d](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/6cf473d5e8a16e204364b53bb0718d541c8c99ac))
|
||||||
|
* **deps:** Update k8s.io/utils digest to ff6756f ([#894](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/894)) ([b7389e1](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/b7389e18e5ec216a601722bb6686b11c49745b03))
|
||||||
|
* **deps:** Update kubernetes monorepo to v0.35.4 ([#853](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/853)) ([21f811a](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/21f811a3f22b8f87ca9230a131f57f832c086fcf))
|
||||||
|
* **deps:** Update kubernetes monorepo to v0.36.1 ([#909](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/909)) ([99eb4a3](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/99eb4a3fe5f4503c76f9afea08164d8e511c4f5b))
|
||||||
|
* **deps:** Update module github.com/cloudnative-pg/cloudnative-pg to v1.29.1 [security] ([#902](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/902)) ([ba5063f](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/ba5063f01393309459e02c30078c34b429f8f21b))
|
||||||
|
* **deps:** Update module github.com/cloudnative-pg/machinery to v0.5.0 ([#925](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/925)) ([ef4b711](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/ef4b7111372877eed087b9178d157dd0d1084bf8))
|
||||||
|
* **deps:** Update module github.com/onsi/ginkgo/v2 to v2.28.2 ([#874](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/874)) ([8cb32e5](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/8cb32e5a5153347a6b05bf63816bcbc9d94f4d67))
|
||||||
|
* **deps:** Update module google.golang.org/grpc to v1.81.0 ([#884](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/884)) ([6fdecfd](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/6fdecfde21b7a5cd05bc3f53895243fbf8537770))
|
||||||
|
* **deps:** Update module sigs.k8s.io/controller-runtime to v0.24.0 ([#880](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/880)) ([58f4fed](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/58f4fed40ba788f76f706e148bebf1892a2dd609))
|
||||||
|
* **deps:** Update module sigs.k8s.io/controller-runtime to v0.24.1 ([#910](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/910)) ([9be87b0](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/9be87b0d9c87c0df7f1f72caa33bf848fbc16582))
|
||||||
|
* **docs:** Update broken link to CloudNativePG documentation ([#904](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/904)) ([43f92fb](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/43f92fbcf1f57d95bbca22cb63c9697d75fc0dbc)), closes [#729](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/729)
|
||||||
|
* **scheme:** Register meta types for CNPG scheme group version ([#943](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/943)) ([bb7845d](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/bb7845dd621115026744c9f1b32cb2fd0cb4a729)), closes [#942](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/942)
|
||||||
|
|
||||||
## [0.12.0](https://github.com/cloudnative-pg/plugin-barman-cloud/compare/v0.11.0...v0.12.0) (2026-04-13)
|
## [0.12.0](https://github.com/cloudnative-pg/plugin-barman-cloud/compare/v0.11.0...v0.12.0) (2026-04-13)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -2,4 +2,4 @@
|
|||||||
# responsible for code in a repository. For details, please refer to
|
# responsible for code in a repository. For details, please refer to
|
||||||
# https://docs.github.com/en/free-pro-team@latest/github/creating-cloning-and-archiving-repositories/about-code-owners
|
# https://docs.github.com/en/free-pro-team@latest/github/creating-cloning-and-archiving-repositories/about-code-owners
|
||||||
|
|
||||||
* @cloudnative-pg/maintainers
|
* @leonardoce @mnencia @gbartolini @fcanovai @armru @NiccoloFei
|
||||||
|
|||||||
48
Taskfile.yml
48
Taskfile.yml
@ -7,9 +7,9 @@ output: prefixed
|
|||||||
# Variables that are shared across tasks.
|
# Variables that are shared across tasks.
|
||||||
vars:
|
vars:
|
||||||
GO_VERSION:
|
GO_VERSION:
|
||||||
sh: sed -n 's/^toolchain go//p' go.mod
|
sh: sed -n 's/^toolchain go//p' go.mod | grep . || sed -n 's/^go //p' go.mod
|
||||||
# renovate: datasource=docker depName=kindest/node versioning=semver
|
# renovate: datasource=docker depName=kindest/node versioning=semver
|
||||||
E2E_KUBERNETES_VERSION: v1.35.1
|
E2E_KUBERNETES_VERSION: v1.36.1
|
||||||
E2E_CLUSTER_NAME: barman-cloud-plugin-e2e-{{.E2E_KUBERNETES_VERSION}}
|
E2E_CLUSTER_NAME: barman-cloud-plugin-e2e-{{.E2E_KUBERNETES_VERSION}}
|
||||||
REGISTRY_NETWORK: barman-cloud-plugin
|
REGISTRY_NETWORK: barman-cloud-plugin
|
||||||
REGISTRY_NAME: registry.barman-cloud-plugin
|
REGISTRY_NAME: registry.barman-cloud-plugin
|
||||||
@ -21,9 +21,9 @@ tasks:
|
|||||||
desc: Run golangci-lint
|
desc: Run golangci-lint
|
||||||
env:
|
env:
|
||||||
# renovate: datasource=git-refs depName=golangci-lint lookupName=https://github.com/sagikazarmark/daggerverse currentValue=main
|
# renovate: datasource=git-refs depName=golangci-lint lookupName=https://github.com/sagikazarmark/daggerverse currentValue=main
|
||||||
DAGGER_GOLANGCI_LINT_SHA: 5dcc7e4c4cd5ed230046955f42e27f2166545155
|
DAGGER_GOLANGCI_LINT_SHA: ff27cd50f6b4eed2e3753c520632cd6099e1ce52
|
||||||
# renovate: datasource=docker depName=golangci/golangci-lint versioning=semver
|
# renovate: datasource=docker depName=golangci/golangci-lint versioning=semver
|
||||||
GOLANGCI_LINT_VERSION: v2.11.4
|
GOLANGCI_LINT_VERSION: v2.12.2
|
||||||
cmds:
|
cmds:
|
||||||
- >
|
- >
|
||||||
GITHUB_REF= dagger -sc "github.com/sagikazarmark/daggerverse/golangci-lint@${DAGGER_GOLANGCI_LINT_SHA}
|
GITHUB_REF= dagger -sc "github.com/sagikazarmark/daggerverse/golangci-lint@${DAGGER_GOLANGCI_LINT_SHA}
|
||||||
@ -46,7 +46,7 @@ tasks:
|
|||||||
- wordlist-ordered
|
- wordlist-ordered
|
||||||
env:
|
env:
|
||||||
# renovate: datasource=git-refs depName=spellcheck lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
# renovate: datasource=git-refs depName=spellcheck lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||||
DAGGER_SPELLCHECK_SHA: f84ac0c681fcfff4d6f138bf53d44d023f615b48
|
DAGGER_SPELLCHECK_SHA: f7187c307f2ba79290efbfff5ce436b956162c53
|
||||||
cmds:
|
cmds:
|
||||||
- >
|
- >
|
||||||
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/spellcheck@${DAGGER_SPELLCHECK_SHA}
|
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/spellcheck@${DAGGER_SPELLCHECK_SHA}
|
||||||
@ -60,7 +60,7 @@ tasks:
|
|||||||
desc: Check for conventional commits
|
desc: Check for conventional commits
|
||||||
env:
|
env:
|
||||||
# renovate: datasource=git-refs depName=commitlint lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
# renovate: datasource=git-refs depName=commitlint lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||||
DAGGER_COMMITLINT_SHA: f84ac0c681fcfff4d6f138bf53d44d023f615b48
|
DAGGER_COMMITLINT_SHA: f7187c307f2ba79290efbfff5ce436b956162c53
|
||||||
cmds:
|
cmds:
|
||||||
- >
|
- >
|
||||||
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/commitlint@${DAGGER_COMMITLINT_SHA}
|
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/commitlint@${DAGGER_COMMITLINT_SHA}
|
||||||
@ -74,7 +74,7 @@ tasks:
|
|||||||
- wordlist-ordered
|
- wordlist-ordered
|
||||||
env:
|
env:
|
||||||
# renovate: datasource=git-refs depName=uncommitted lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
# renovate: datasource=git-refs depName=uncommitted lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||||
DAGGER_UNCOMMITTED_SHA: f84ac0c681fcfff4d6f138bf53d44d023f615b48
|
DAGGER_UNCOMMITTED_SHA: f7187c307f2ba79290efbfff5ce436b956162c53
|
||||||
cmds:
|
cmds:
|
||||||
- GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/uncommitted@${DAGGER_UNCOMMITTED_SHA} check-uncommitted --source . stdout
|
- GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/uncommitted@${DAGGER_UNCOMMITTED_SHA} check-uncommitted --source . stdout
|
||||||
sources:
|
sources:
|
||||||
@ -86,7 +86,7 @@ tasks:
|
|||||||
- controller-gen
|
- controller-gen
|
||||||
env:
|
env:
|
||||||
# renovate: datasource=git-refs depName=crd-gen-refs lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
# renovate: datasource=git-refs depName=crd-gen-refs lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||||
DAGGER_CRDGENREF_SHA: f84ac0c681fcfff4d6f138bf53d44d023f615b48
|
DAGGER_CRDGENREF_SHA: f7187c307f2ba79290efbfff5ce436b956162c53
|
||||||
# renovate: datasource=go depName=github.com/elastic/crd-ref-docs
|
# renovate: datasource=go depName=github.com/elastic/crd-ref-docs
|
||||||
CRDREFDOCS_VERSION: v0.3.0
|
CRDREFDOCS_VERSION: v0.3.0
|
||||||
cmds:
|
cmds:
|
||||||
@ -122,7 +122,7 @@ tasks:
|
|||||||
docusaurus-version-is-aligned:
|
docusaurus-version-is-aligned:
|
||||||
desc: Verify that a documentation version exists for the current version of the plugin
|
desc: Verify that a documentation version exists for the current version of the plugin
|
||||||
cmds:
|
cmds:
|
||||||
- $(dagger -s call -m dagger/check-doc-version has-version-documentation --src .)
|
- $(GITHUB_REF= dagger -s call -m dagger/check-doc-version has-version-documentation --src .)
|
||||||
src:
|
src:
|
||||||
- .release-please-manifest.json
|
- .release-please-manifest.json
|
||||||
- ./web/versions.json
|
- ./web/versions.json
|
||||||
@ -133,7 +133,7 @@ tasks:
|
|||||||
# renovate: datasource=git-refs depname=kubernetes packageName=https://github.com/kubernetes/kubernetes versioning=semver
|
# renovate: datasource=git-refs depname=kubernetes packageName=https://github.com/kubernetes/kubernetes versioning=semver
|
||||||
K8S_VERSION: 1.31.0
|
K8S_VERSION: 1.31.0
|
||||||
# renovate: datasource=git-refs depName=controller-runtime packageName=https://github.com/kubernetes-sigs/controller-runtime versioning=semver
|
# renovate: datasource=git-refs depName=controller-runtime packageName=https://github.com/kubernetes-sigs/controller-runtime versioning=semver
|
||||||
SETUP_ENVTEST_VERSION: 0.23.3
|
SETUP_ENVTEST_VERSION: 0.24.1
|
||||||
cmds:
|
cmds:
|
||||||
- >
|
- >
|
||||||
GITHUB_REF= dagger -s call -m ./dagger/gotest
|
GITHUB_REF= dagger -s call -m ./dagger/gotest
|
||||||
@ -206,7 +206,7 @@ tasks:
|
|||||||
- start-build-network
|
- start-build-network
|
||||||
vars:
|
vars:
|
||||||
# renovate: datasource=github-tags depName=dagger/dagger versioning=semver
|
# renovate: datasource=github-tags depName=dagger/dagger versioning=semver
|
||||||
DAGGER_VERSION: 0.20.6
|
DAGGER_VERSION: 0.21.7
|
||||||
DAGGER_ENGINE_IMAGE: registry.dagger.io/engine:v{{ .DAGGER_VERSION }}
|
DAGGER_ENGINE_IMAGE: registry.dagger.io/engine:v{{ .DAGGER_VERSION }}
|
||||||
cmds:
|
cmds:
|
||||||
- >
|
- >
|
||||||
@ -263,7 +263,7 @@ tasks:
|
|||||||
run: once
|
run: once
|
||||||
vars:
|
vars:
|
||||||
# renovate: datasource=git-refs depName=kind lookupName=https://github.com/kubernetes-sigs/kind versioning=semver
|
# renovate: datasource=git-refs depName=kind lookupName=https://github.com/kubernetes-sigs/kind versioning=semver
|
||||||
KIND_VERSION: v0.31.0
|
KIND_VERSION: v0.32.0
|
||||||
cmds:
|
cmds:
|
||||||
- go install sigs.k8s.io/kind@{{.KIND_VERSION}}
|
- go install sigs.k8s.io/kind@{{.KIND_VERSION}}
|
||||||
- kind version | grep -q {{.KIND_VERSION}}
|
- kind version | grep -q {{.KIND_VERSION}}
|
||||||
@ -360,18 +360,20 @@ tasks:
|
|||||||
SIDECAR_IMAGE_NAME: ghcr.io/{{.GITHUB_REPOSITORY}}-sidecar{{if not (hasPrefix "refs/tags/v" .GITHUB_REF)}}-testing{{end}}
|
SIDECAR_IMAGE_NAME: ghcr.io/{{.GITHUB_REPOSITORY}}-sidecar{{if not (hasPrefix "refs/tags/v" .GITHUB_REF)}}-testing{{end}}
|
||||||
# remove /merge suffix from the branch name. This is a workaround for the GitHub workflow on PRs,
|
# remove /merge suffix from the branch name. This is a workaround for the GitHub workflow on PRs,
|
||||||
# where the branch name is suffixed with /merge. Prepend pr- to the branch name on PRs.
|
# where the branch name is suffixed with /merge. Prepend pr- to the branch name on PRs.
|
||||||
IMAGE_VERSION: '{{regexReplaceAll "(\\d+)/merge" .GITHUB_REF_NAME "pr-${1}"}}'
|
# Any remaining "/" (e.g. from namespaced branches like "dev/foo") is replaced with "-" since
|
||||||
|
# "/" is not a valid character in a Docker tag.
|
||||||
|
IMAGE_VERSION: '{{replace "/" "-" (regexReplaceAll "(\\d+)/merge" .GITHUB_REF_NAME "pr-${1}")}}'
|
||||||
env:
|
env:
|
||||||
# renovate: datasource=git-refs depName=docker lookupName=https://github.com/purpleclay/daggerverse currentValue=main
|
# renovate: datasource=git-refs depName=docker lookupName=https://github.com/purpleclay/daggerverse currentValue=main
|
||||||
DAGGER_DOCKER_SHA: ee12c1a4a2630e194ec20c5a9959183e3a78c192
|
DAGGER_DOCKER_SHA: ee12c1a4a2630e194ec20c5a9959183e3a78c192
|
||||||
cmds:
|
cmds:
|
||||||
- >
|
- >
|
||||||
dagger call -m github.com/purpleclay/daggerverse/docker@${DAGGER_DOCKER_SHA}
|
GITHUB_REF= dagger call -m github.com/purpleclay/daggerverse/docker@${DAGGER_DOCKER_SHA}
|
||||||
--registry ghcr.io --username $REGISTRY_USER --password env:REGISTRY_PASSWORD
|
--registry ghcr.io --username $REGISTRY_USER --password env:REGISTRY_PASSWORD
|
||||||
build --dir . --file containers/Dockerfile.plugin --args GO_VERSION={{.GO_VERSION}} --platform linux/amd64 --platform linux/arm64
|
build --dir . --file containers/Dockerfile.plugin --args GO_VERSION={{.GO_VERSION}} --platform linux/amd64 --platform linux/arm64
|
||||||
publish --ref {{.PLUGIN_IMAGE_NAME}} --tags {{.IMAGE_VERSION}}
|
publish --ref {{.PLUGIN_IMAGE_NAME}} --tags {{.IMAGE_VERSION}}
|
||||||
- >
|
- >
|
||||||
dagger call -m github.com/purpleclay/daggerverse/docker@${DAGGER_DOCKER_SHA}
|
GITHUB_REF= dagger call -m github.com/purpleclay/daggerverse/docker@${DAGGER_DOCKER_SHA}
|
||||||
--registry ghcr.io --username $REGISTRY_USER --password env:REGISTRY_PASSWORD
|
--registry ghcr.io --username $REGISTRY_USER --password env:REGISTRY_PASSWORD
|
||||||
build --dir . --file containers/Dockerfile.sidecar --args GO_VERSION={{.GO_VERSION}} --platform linux/amd64 --platform linux/arm64
|
build --dir . --file containers/Dockerfile.sidecar --args GO_VERSION={{.GO_VERSION}} --platform linux/amd64 --platform linux/arm64
|
||||||
publish --ref {{.SIDECAR_IMAGE_NAME}} --tags {{.IMAGE_VERSION}}
|
publish --ref {{.SIDECAR_IMAGE_NAME}} --tags {{.IMAGE_VERSION}}
|
||||||
@ -381,7 +383,7 @@ tasks:
|
|||||||
run: once
|
run: once
|
||||||
env:
|
env:
|
||||||
# renovate: datasource=git-refs depName=controller-gen lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
# renovate: datasource=git-refs depName=controller-gen lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||||
DAGGER_CONTROLLER_GEN_SHA: f84ac0c681fcfff4d6f138bf53d44d023f615b48
|
DAGGER_CONTROLLER_GEN_SHA: f7187c307f2ba79290efbfff5ce436b956162c53
|
||||||
cmds:
|
cmds:
|
||||||
- >
|
- >
|
||||||
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/controller-gen@${DAGGER_CONTROLLER_GEN_SHA}
|
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/controller-gen@${DAGGER_CONTROLLER_GEN_SHA}
|
||||||
@ -450,19 +452,21 @@ tasks:
|
|||||||
SIDECAR_IMAGE_NAME: ghcr.io/{{.GITHUB_REPOSITORY}}-sidecar{{if not (hasPrefix "refs/tags/v" .GITHUB_REF)}}-testing{{end}}
|
SIDECAR_IMAGE_NAME: ghcr.io/{{.GITHUB_REPOSITORY}}-sidecar{{if not (hasPrefix "refs/tags/v" .GITHUB_REF)}}-testing{{end}}
|
||||||
# remove /merge suffix from the branch name. This is a workaround for the GitHub workflow on PRs,
|
# remove /merge suffix from the branch name. This is a workaround for the GitHub workflow on PRs,
|
||||||
# where the branch name is suffixed with /merge. Prepend pr- to the branch name on PRs.
|
# where the branch name is suffixed with /merge. Prepend pr- to the branch name on PRs.
|
||||||
IMAGE_VERSION: '{{regexReplaceAll "(\\d+)/merge" .GITHUB_REF_NAME "pr-${1}"}}'
|
# Any remaining "/" (e.g. from namespaced branches like "dev/foo") is replaced with "-" since
|
||||||
|
# "/" is not a valid character in a Docker tag.
|
||||||
|
IMAGE_VERSION: '{{replace "/" "-" (regexReplaceAll "(\\d+)/merge" .GITHUB_REF_NAME "pr-${1}")}}'
|
||||||
env:
|
env:
|
||||||
# renovate: datasource=git-refs depName=kustomize lookupName=https://github.com/sagikazarmark/daggerverse currentValue=main
|
# renovate: datasource=git-refs depName=kustomize lookupName=https://github.com/sagikazarmark/daggerverse currentValue=main
|
||||||
DAGGER_KUSTOMIZE_SHA: 5dcc7e4c4cd5ed230046955f42e27f2166545155
|
DAGGER_KUSTOMIZE_SHA: ff27cd50f6b4eed2e3753c520632cd6099e1ce52
|
||||||
cmds:
|
cmds:
|
||||||
- >
|
- >
|
||||||
dagger -s call -m https://github.com/sagikazarmark/daggerverse/kustomize@${DAGGER_KUSTOMIZE_SHA}
|
GITHUB_REF= dagger -s call -m https://github.com/sagikazarmark/daggerverse/kustomize@${DAGGER_KUSTOMIZE_SHA}
|
||||||
edit --source . --dir kubernetes
|
edit --source . --dir kubernetes
|
||||||
set image --image plugin-barman-cloud={{.PLUGIN_IMAGE_NAME}}:{{.IMAGE_VERSION}}
|
set image --image plugin-barman-cloud={{.PLUGIN_IMAGE_NAME}}:{{.IMAGE_VERSION}}
|
||||||
set secret --secret plugin-barman-cloud --from-literal SIDECAR_IMAGE={{.SIDECAR_IMAGE_NAME}}:{{.IMAGE_VERSION}}
|
set secret --secret plugin-barman-cloud --from-literal SIDECAR_IMAGE={{.SIDECAR_IMAGE_NAME}}:{{.IMAGE_VERSION}}
|
||||||
directory directory --path kubernetes export --path manifest-build
|
directory directory --path kubernetes export --path manifest-build
|
||||||
- >
|
- >
|
||||||
dagger -s call -m github.com/sagikazarmark/daggerverse/kustomize@${DAGGER_KUSTOMIZE_SHA}
|
GITHUB_REF= dagger -s call -m github.com/sagikazarmark/daggerverse/kustomize@${DAGGER_KUSTOMIZE_SHA}
|
||||||
build --source . --dir manifest-build export --path manifest.yaml
|
build --source . --dir manifest-build export --path manifest.yaml
|
||||||
sources:
|
sources:
|
||||||
- ./config/**/*.yaml
|
- ./config/**/*.yaml
|
||||||
@ -483,13 +487,13 @@ tasks:
|
|||||||
- GITHUB_TOKEN
|
- GITHUB_TOKEN
|
||||||
env:
|
env:
|
||||||
# renovate: datasource=git-refs depName=gh lookupName=https://github.com/sagikazarmark/daggerverse
|
# renovate: datasource=git-refs depName=gh lookupName=https://github.com/sagikazarmark/daggerverse
|
||||||
DAGGER_GH_SHA: 5dcc7e4c4cd5ed230046955f42e27f2166545155
|
DAGGER_GH_SHA: ff27cd50f6b4eed2e3753c520632cd6099e1ce52
|
||||||
preconditions:
|
preconditions:
|
||||||
- sh: "[[ {{.GITHUB_REF}} =~ 'refs/tags/v.*' ]]"
|
- sh: "[[ {{.GITHUB_REF}} =~ 'refs/tags/v.*' ]]"
|
||||||
msg: not a tag, failing
|
msg: not a tag, failing
|
||||||
cmds:
|
cmds:
|
||||||
- >
|
- >
|
||||||
dagger -s call -m github.com/sagikazarmark/daggerverse/gh@${DAGGER_GH_SHA}
|
GITHUB_REF= dagger -s call -m github.com/sagikazarmark/daggerverse/gh@${DAGGER_GH_SHA}
|
||||||
with-source --source .
|
with-source --source .
|
||||||
run --repo {{.GITHUB_REPOSITORY}} --token env:GITHUB_TOKEN
|
run --repo {{.GITHUB_REPOSITORY}} --token env:GITHUB_TOKEN
|
||||||
--cmd "release upload {{.GITHUB_REF_NAME}} manifest.yaml"
|
--cmd "release upload {{.GITHUB_REF_NAME}} manifest.yaml"
|
||||||
|
|||||||
@ -20,17 +20,19 @@ SPDX-License-Identifier: Apache-2.0
|
|||||||
package v1
|
package v1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"sigs.k8s.io/controller-runtime/pkg/scheme"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
// GroupVersion is group version used to register these objects.
|
// GroupVersion is group version used to register these objects.
|
||||||
GroupVersion = schema.GroupVersion{Group: "barmancloud.cnpg.io", Version: "v1"}
|
var GroupVersion = schema.GroupVersion{Group: "barmancloud.cnpg.io", Version: "v1"}
|
||||||
|
|
||||||
// SchemeBuilder is used to add go types to the GroupVersionKind scheme.
|
// AddKnownTypes add to the passed schema the Kubernetes types
|
||||||
SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}
|
// exposed by this package.
|
||||||
|
func AddKnownTypes(scheme *runtime.Scheme) {
|
||||||
|
scheme.AddKnownTypes(GroupVersion,
|
||||||
|
&ObjectStore{}, &ObjectStoreList{})
|
||||||
|
|
||||||
// AddToScheme adds the types in this group-version to the given scheme.
|
metav1.AddToGroupVersion(scheme, GroupVersion)
|
||||||
AddToScheme = SchemeBuilder.AddToScheme
|
}
|
||||||
)
|
|
||||||
|
|||||||
@ -124,7 +124,3 @@ type ObjectStoreList struct {
|
|||||||
metav1.ListMeta `json:"metadata,omitempty"`
|
metav1.ListMeta `json:"metadata,omitempty"`
|
||||||
Items []ObjectStore `json:"items"`
|
Items []ObjectStore `json:"items"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
|
||||||
SchemeBuilder.Register(&ObjectStore{}, &ObjectStoreList{})
|
|
||||||
}
|
|
||||||
|
|||||||
@ -25,7 +25,7 @@ package v1
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
|||||||
@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
|
|||||||
kind: CustomResourceDefinition
|
kind: CustomResourceDefinition
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
controller-gen.kubebuilder.io/version: v0.20.1
|
controller-gen.kubebuilder.io/version: v0.21.0
|
||||||
name: objectstores.barmancloud.cnpg.io
|
name: objectstores.barmancloud.cnpg.io
|
||||||
spec:
|
spec:
|
||||||
group: barmancloud.cnpg.io
|
group: barmancloud.cnpg.io
|
||||||
@ -176,6 +176,25 @@ spec:
|
|||||||
format: int32
|
format: int32
|
||||||
minimum: 1
|
minimum: 1
|
||||||
type: integer
|
type: integer
|
||||||
|
restoreAdditionalCommandArgs:
|
||||||
|
description: |-
|
||||||
|
Additional arguments that can be appended to the 'barman-cloud-restore'
|
||||||
|
command-line invocation. These arguments provide flexibility to customize
|
||||||
|
the data restore process further, according to specific requirements or
|
||||||
|
configurations.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
In a scenario where specialized restore options are required, such as setting
|
||||||
|
a specific read timeout or defining custom behavior, users can use this field
|
||||||
|
to specify additional command arguments.
|
||||||
|
|
||||||
|
Note:
|
||||||
|
It's essential to ensure that the provided arguments are valid and supported
|
||||||
|
by the 'barman-cloud-restore' command, to avoid potential errors or unintended
|
||||||
|
behavior during execution.
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
type: object
|
type: object
|
||||||
destinationPath:
|
destinationPath:
|
||||||
description: |-
|
description: |-
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
# Build the manager binary
|
# Build the manager binary
|
||||||
# GO_VERSION must be passed as a build arg (read from go.mod toolchain directive by Taskfile)
|
# GO_VERSION must be passed as a build arg (read from go.mod by Taskfile)
|
||||||
ARG GO_VERSION
|
ARG GO_VERSION
|
||||||
FROM --platform=$BUILDPLATFORM golang:${GO_VERSION} AS gobuilder
|
FROM --platform=$BUILDPLATFORM golang:${GO_VERSION} AS gobuilder
|
||||||
ARG TARGETOS
|
ARG TARGETOS
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
# Both components are built before going into a distroless container
|
# Both components are built before going into a distroless container
|
||||||
|
|
||||||
# Build the manager binary
|
# Build the manager binary
|
||||||
# GO_VERSION must be passed as a build arg (read from go.mod toolchain directive by Taskfile)
|
# GO_VERSION must be passed as a build arg (read from go.mod by Taskfile)
|
||||||
ARG GO_VERSION
|
ARG GO_VERSION
|
||||||
FROM --platform=$BUILDPLATFORM golang:${GO_VERSION} AS gobuilder
|
FROM --platform=$BUILDPLATFORM golang:${GO_VERSION} AS gobuilder
|
||||||
ARG TARGETOS
|
ARG TARGETOS
|
||||||
@ -55,7 +55,7 @@ COPY containers/sidecar-requirements.txt .
|
|||||||
|
|
||||||
# Create virtualenv and install dependencies
|
# Create virtualenv and install dependencies
|
||||||
RUN python3 -m venv /venv && \
|
RUN python3 -m venv /venv && \
|
||||||
/venv/bin/pip install --upgrade pip setuptools wheel && \
|
/venv/bin/pip install --upgrade pip wheel && \
|
||||||
/venv/bin/pip install --no-cache-dir -r sidecar-requirements.txt
|
/venv/bin/pip install --no-cache-dir -r sidecar-requirements.txt
|
||||||
|
|
||||||
# Download and extract runtime library packages and their dependencies
|
# Download and extract runtime library packages and their dependencies
|
||||||
|
|||||||
@ -1,3 +1,2 @@
|
|||||||
barman[azure,cloud,google,snappy,zstandard,lz4]==3.18.0
|
barman[azure,cloud,google,snappy,zstandard,lz4]==3.19.1
|
||||||
setuptools==82.0.1
|
|
||||||
zipp>=3.19.1 # not directly required, pinned by Snyk to avoid a vulnerability
|
zipp>=3.19.1 # not directly required, pinned by Snyk to avoid a vulnerability
|
||||||
|
|||||||
@ -4,9 +4,9 @@
|
|||||||
#
|
#
|
||||||
# pip-compile --allow-unsafe --generate-hashes --output-file=sidecar-requirements.txt --strip-extras sidecar-requirements.in
|
# pip-compile --allow-unsafe --generate-hashes --output-file=sidecar-requirements.txt --strip-extras sidecar-requirements.in
|
||||||
#
|
#
|
||||||
azure-core==1.39.0 \
|
azure-core==1.41.0 \
|
||||||
--hash=sha256:4ac7b70fab5438c3f68770649a78daf97833caa83827f91df9c14e0e0ea7d34f \
|
--hash=sha256:522b4011e8180b1a3dcd2024396a4e7fe9ac37fb8597db47163d230b5efe892d \
|
||||||
--hash=sha256:8a90a562998dd44ce84597590fff6249701b98c0e8797c95fcdd695b54c35d74
|
--hash=sha256:f46ff5dfcd230f25cf1c19e8a34b8dc08a337b2503e268bb600a16c00db8ad5a
|
||||||
# via
|
# via
|
||||||
# azure-identity
|
# azure-identity
|
||||||
# azure-storage-blob
|
# azure-storage-blob
|
||||||
@ -14,244 +14,224 @@ azure-identity==1.25.3 \
|
|||||||
--hash=sha256:ab23c0d63015f50b630ef6c6cf395e7262f439ce06e5d07a64e874c724f8d9e6 \
|
--hash=sha256:ab23c0d63015f50b630ef6c6cf395e7262f439ce06e5d07a64e874c724f8d9e6 \
|
||||||
--hash=sha256:f4d0b956a8146f30333e071374171f3cfa7bdb8073adb8c3814b65567aa7447c
|
--hash=sha256:f4d0b956a8146f30333e071374171f3cfa7bdb8073adb8c3814b65567aa7447c
|
||||||
# via barman
|
# via barman
|
||||||
azure-storage-blob==12.28.0 \
|
azure-storage-blob==12.30.0 \
|
||||||
--hash=sha256:00fb1db28bf6a7b7ecaa48e3b1d5c83bfadacc5a678b77826081304bd87d6461 \
|
--hash=sha256:2cd74d4d5731e5eb6b8d5c5056ee115a5e88f8fdf22517b739836fda685018be \
|
||||||
--hash=sha256:e7d98ea108258d29aa0efbfd591b2e2075fa1722a2fae8699f0b3c9de11eff41
|
--hash=sha256:d415ac50b67a8da6b3ae7e9f1014b1b55cd7aafa0b8d4ca9b380568dc7360423
|
||||||
# via barman
|
# via barman
|
||||||
barman==3.18.0 \
|
barman==3.19.1 \
|
||||||
--hash=sha256:8e752ac93d2f3a61e86b8374185209cae477a638ece7e6f540070f36d28d6997 \
|
--hash=sha256:0a6a9e1babf97687732d8b2a3eb79ea95d55246a5257b9433865cb6e755221c0 \
|
||||||
--hash=sha256:ff90c44dafa4107b7574142771cdc2611c4cf1af818d93d3e67440a0c81164b9
|
--hash=sha256:2f71c4a1f1ba53f694cbdf838bb9906d8ba02b97d1fd3041196e8999bec7a1ee
|
||||||
# via -r sidecar-requirements.in
|
# via -r sidecar-requirements.in
|
||||||
boto3==1.42.96 \
|
boto3==1.43.51 \
|
||||||
--hash=sha256:2f4566da2c209a98bdbfc874d813ef231c84ad24e4f815e9bc91de5f63351a24 \
|
--hash=sha256:a97057bb609fd38c80448db6a93db770786775dabd651401debf09816d4553d7 \
|
||||||
--hash=sha256:b38a9e4a3fbbee9017252576f1379780d0a5814768676c08df2f539d31fcdd68
|
--hash=sha256:b5a416cc703db73b69b22bef563c89c1fb14a4b10a93628d3c7abc4dd1aaf979
|
||||||
# via barman
|
# via barman
|
||||||
botocore==1.42.96 \
|
botocore==1.43.51 \
|
||||||
--hash=sha256:75b3b841ffacaa944f645196655a21ca777591dd8911e732bfb6614545af0250 \
|
--hash=sha256:7c2c538c932bddc95834e177ce6f91dcc388c6a7934b4f8d0db13caa30e3e543 \
|
||||||
--hash=sha256:db2c3e2006628be6fde81a24124a6563c363d6982fb92728837cf174bad9d98a
|
--hash=sha256:e0e5e88585fdb01dcb6b533ac2dd3f18d5d45092a14ccbfd330e3576a4152128
|
||||||
# via
|
# via
|
||||||
# boto3
|
# boto3
|
||||||
# s3transfer
|
# s3transfer
|
||||||
certifi==2026.4.22 \
|
certifi==2026.6.17 \
|
||||||
--hash=sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a \
|
--hash=sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432 \
|
||||||
--hash=sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580
|
--hash=sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db
|
||||||
# via requests
|
# via requests
|
||||||
cffi==2.0.0 \
|
cffi==2.1.0 \
|
||||||
--hash=sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb \
|
--hash=sha256:02cb7ff33ded4f1532476731f89ede53e2e488a8e6205515a82144246ffa7dcc \
|
||||||
--hash=sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b \
|
--hash=sha256:03e9810d18c646077e501f661b682fbf5dee4676048527ca3cffe66faa9960dd \
|
||||||
--hash=sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f \
|
--hash=sha256:0520e1f4c35f44e209cbbb421b67eec42e6a157f59444dfb6058874ff3610e5d \
|
||||||
--hash=sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9 \
|
--hash=sha256:0582a58f3051372229ca8e7f5f589f9e5632678208d8636fea3676711fdf7fe5 \
|
||||||
--hash=sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44 \
|
--hash=sha256:0611e7ebf90573a535ebdc33ae9da222d037853983e13359f580fab781ca017f \
|
||||||
--hash=sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2 \
|
--hash=sha256:0a42c688d19fca6e095a53c6a6e2295a5b050a8b289f109adab02a9e61a25de6 \
|
||||||
--hash=sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c \
|
--hash=sha256:0a96b74cda968eebbad56d973efe5098974f0a9fb323865bf99ea1fd24e3e64c \
|
||||||
--hash=sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75 \
|
--hash=sha256:10537b1df4967ca26d21e5072d7d54188354483b91dc75058968d3f0cf13fbda \
|
||||||
--hash=sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65 \
|
--hash=sha256:11b3fb55f4f8ad92274ed26705f65d8f91457de71f5380061eb6d125a768fecd \
|
||||||
--hash=sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e \
|
--hash=sha256:15faec4adfff450819f3aee0e2e02c812de6edb88203aa58807955db2003472a \
|
||||||
--hash=sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a \
|
--hash=sha256:164bff1657b2a74f0b6d54e11c9b375bc97b931f2ca9c43fcf875838da1570dd \
|
||||||
--hash=sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e \
|
--hash=sha256:1854b724d00f6654c742097d5387569021be12d3a0f770eae1df8f8acfcc6acd \
|
||||||
--hash=sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25 \
|
--hash=sha256:19c54ac121cad98450b4896fa9a43ee0180d57bc4bc911a33db6cab1efab6cd3 \
|
||||||
--hash=sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a \
|
--hash=sha256:1b96bfe2c4bd825681b7d311ad6d9b7280a091f43e8f63da5729638083cd3bfb \
|
||||||
--hash=sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe \
|
--hash=sha256:1e9f50d192a3e525b15a75ab5114e442d83d657b7ec29182a991bc9a88fd3a66 \
|
||||||
--hash=sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b \
|
--hash=sha256:1ff3456eab0d889592d1936d6125bbfbc7ae4d3354a700f8bd80450a66445d4d \
|
||||||
--hash=sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91 \
|
--hash=sha256:2282cd5e38aa8accd03e99d1256af8411c84cdbee6a89d841b563fdbd1f3e50f \
|
||||||
--hash=sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592 \
|
--hash=sha256:276f20fffd7b396e12516ba8edf9509210ac248cbbc5acbc39cd512f9f59ebe6 \
|
||||||
--hash=sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187 \
|
--hash=sha256:2b71d409cccee78310ab5dec549aed052aaea483346e282c7b02362596e01bb0 \
|
||||||
--hash=sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c \
|
--hash=sha256:2e9dabb9abcb7ad15938c7196ad5c1718a4e6d33cc79b4c0209bdb64c4a54a5c \
|
||||||
--hash=sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1 \
|
--hash=sha256:30b65779d598c370374fefabf138d456fd6f3216bfa7bedfab1ba82025b0cd93 \
|
||||||
--hash=sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94 \
|
--hash=sha256:33eb1ad83ebe8f313e0df035c406227d55a79456704a863fad9842136af5ad7d \
|
||||||
--hash=sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba \
|
--hash=sha256:35aaea0c7ee0e58a5cd8c2fd1a48fdf7ece0d2699b7ecdda08194e9ce5dd9b3d \
|
||||||
--hash=sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb \
|
--hash=sha256:3681e031db29958a7502f5c0c9d6bbc4c36cb20f7b104086fa642d1799631ff8 \
|
||||||
--hash=sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165 \
|
--hash=sha256:379de10ce1ba048b1448599d1b37b24caee16309d1ac98d3982fc997f768700b \
|
||||||
--hash=sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529 \
|
--hash=sha256:37f525a7e7e50c017fdebe58b787be310ad59357ae43a053943a6e1a6c526001 \
|
||||||
--hash=sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca \
|
--hash=sha256:3b926723c13eba9f81d2ef3820d63aeceec3b2d4639906047bf675cb8a7a500d \
|
||||||
--hash=sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c \
|
--hash=sha256:3d7f118b5adbfdfead90c25822690b02bc8074fba949bb7858bec4ebd55adb43 \
|
||||||
--hash=sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6 \
|
--hash=sha256:46b1c8db8f6122420f32d02fffb924c2fe9bc772d228c7c711748fff56aabb2b \
|
||||||
--hash=sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c \
|
--hash=sha256:47ff3a8bfd8cb9da1af7524b965127095055654c177fcfc7578debcb015eecd0 \
|
||||||
--hash=sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0 \
|
--hash=sha256:4d433a51f1870e43a13b6732f92aaf540ff77c2015097c78556f75a2d6c030e0 \
|
||||||
--hash=sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743 \
|
--hash=sha256:4f26194e3d95e06501b942642855aed4f953d55e95d7d01b7c4483db3ecff458 \
|
||||||
--hash=sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63 \
|
--hash=sha256:510aeeeac94811b138077451da1fb18b308a5feab47dd2b603af55804155e1c8 \
|
||||||
--hash=sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5 \
|
--hash=sha256:5972433ad71a9e46516584ef60a0fda12d9dc459938d1539c3ddecf9bdc1368d \
|
||||||
--hash=sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5 \
|
--hash=sha256:5ecbd0499275d57506d397eebe1981cee87b47fcd9ef5c22cab7ed7644a39a94 \
|
||||||
--hash=sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4 \
|
--hash=sha256:6274dcb2d15cef48daa73ed1be5a40d501d74dccd0cd6db364776d12cb6ba022 \
|
||||||
--hash=sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d \
|
--hash=sha256:63960549e4f8dc41e31accb97b975abaecfc44c03e396c093a6436763c2ea7db \
|
||||||
--hash=sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b \
|
--hash=sha256:64c753a0f87a256020004f37a1c8c02c480e725f910f0b2a0f3f07debd1b2479 \
|
||||||
--hash=sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93 \
|
--hash=sha256:6af371f3767faeffc6ac1ef57cdfd25844403e9d3f476c5537caee499de96376 \
|
||||||
--hash=sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205 \
|
--hash=sha256:6ca4919c6e4f89aa99c42510b42cf54596892c00b3f9077f6bdd1505e24b9c8d \
|
||||||
--hash=sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27 \
|
--hash=sha256:6d194185eabd279f1c05ebe3504265ddfc5ad2b58d0714f7db9f01da592e9eb6 \
|
||||||
--hash=sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512 \
|
--hash=sha256:702c436735fbe99d59ada02a1f65cfc0d31c0ee8b7290912f8fbc5cd1e4b16c3 \
|
||||||
--hash=sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d \
|
--hash=sha256:716ff8ec22f20b4d988b12884086bcef0fc99737043e503f7a3935a6be99b1ea \
|
||||||
--hash=sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c \
|
--hash=sha256:762f99479dcb369f60ab9017ad4ab97a36a1dd7c1ee5a3b15db0f4b8659120cd \
|
||||||
--hash=sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037 \
|
--hash=sha256:7762faa47e8ff7eb80bd261d9a7d8eea2d8baa69de5e95b70c1f338bbe712f02 \
|
||||||
--hash=sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26 \
|
--hash=sha256:78474632761faa0fb96f30b1c928c84ebcf68713cbb80d15bab09dfe61640fde \
|
||||||
--hash=sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322 \
|
--hash=sha256:799416bae98336e400981ff6e532d67d5c709cfb30afb79865a1315f94b0e224 \
|
||||||
--hash=sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb \
|
--hash=sha256:7d034dcffa09e9a46c93fa3a3be402096cb5354ac6e41ab8e5cc9cd8b642ad76 \
|
||||||
--hash=sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c \
|
--hash=sha256:7d28dff1db6764108bc30788d85d61c876beff416d9a49cb9dd7c5a9f34f5804 \
|
||||||
--hash=sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8 \
|
--hash=sha256:7d3538f9c0e50670f4deb93dbb696576e60590369cae2faf7de681e597a8a1f1 \
|
||||||
--hash=sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4 \
|
--hash=sha256:7d5980a3433d4b71a5e120f9dd551403d7824e31e2e67124fe2769c404c06913 \
|
||||||
--hash=sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414 \
|
--hash=sha256:7ea6b3e2c4250ff1de21c630fe72d0f63eb95c2c32ffbf64a358cf4a8836d714 \
|
||||||
--hash=sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9 \
|
--hash=sha256:86cf8755a791f72c85dc287128cc62d4f24d392e3f1e15837245623f4a33cccc \
|
||||||
--hash=sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664 \
|
--hash=sha256:88023dfe18799507b73f1dbb0d14326a17465de1bc9c9c7655c22845e9ddc3a2 \
|
||||||
--hash=sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9 \
|
--hash=sha256:89095c1968b4ba8285840e131bf2891b09ae137fe2146905acae0354fbce1b5e \
|
||||||
--hash=sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775 \
|
--hash=sha256:8d35c139744adb3e727cd51b1a18324bbe44b8bd41bf8322bca4d41289f48eda \
|
||||||
--hash=sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739 \
|
--hash=sha256:8e74a6135550c4748af665b1b1118b6aab33b1fc6a16f9aff630af107c3b4512 \
|
||||||
--hash=sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc \
|
--hash=sha256:8f9ec95b8a043d3dfbc74d9abc6f7baf524dd27a8dc160b0a32ff9cdab650c28 \
|
||||||
--hash=sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062 \
|
--hash=sha256:90bec57cf82089383bd06a605b3eb8daebf7e5a668520beaf6e327a83a947699 \
|
||||||
--hash=sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe \
|
--hash=sha256:95f2954c2c9473d892eca6e0409f3568b37ab62a8eedb122461f73cc273476e3 \
|
||||||
--hash=sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9 \
|
--hash=sha256:961be50688f7fba2fa65f63712d3b9b341a22311f5253460ce933f52f0de1c8c \
|
||||||
--hash=sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92 \
|
--hash=sha256:98fff996e983a36d3aa2eca83af40c5821202e7e6f32d13ae94e3d2286f10cfe \
|
||||||
--hash=sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5 \
|
--hash=sha256:9b8f0f26ca4e7513c534d351eca551947d053fac438f2a04ac96d882909b0d3a \
|
||||||
--hash=sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13 \
|
--hash=sha256:9d72af0cf10a76a600a9690078fe31c63b9588c8e86bf9fd353f713c84b5db0f \
|
||||||
--hash=sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d \
|
--hash=sha256:9d8272c0e483b024e1b9ad029821470ed8ec65631dbd90217469da0e7cd89f1c \
|
||||||
--hash=sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26 \
|
--hash=sha256:a016194dbe13d14ee9556e734b772d8d67b947092b268d757fd4290e3ba2dfc2 \
|
||||||
--hash=sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f \
|
--hash=sha256:a5781494d4d400a3f47f8f1da94b324f6e6b440a53387774002890a2a2f4b50f \
|
||||||
--hash=sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495 \
|
--hash=sha256:a95b05f9baf29b91171b3a8bd2020b028835243e7b0ff6bb23e2a3c228518b1b \
|
||||||
--hash=sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b \
|
--hash=sha256:aa7a1b53a2a4452ada2d1b5dade9960b2522f1e61293a811a077439e39029565 \
|
||||||
--hash=sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6 \
|
--hash=sha256:ac0f1a2d0cfa7eea3f2aaf006ab6e70e8feeb16b75d65b7e5939982ca2f11056 \
|
||||||
--hash=sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c \
|
--hash=sha256:af5e2915d41fe6c961694d7bfdc8562942638200f3ce2765dfb8b745cf997629 \
|
||||||
--hash=sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef \
|
--hash=sha256:b6422532152adf4e59b110cb2808cee7a033800952f5c036b4af047ee43199e7 \
|
||||||
--hash=sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5 \
|
--hash=sha256:b65f590ef2a44640f9a05dbb548a429b4ade77913ce683ac8b1480777658a6c0 \
|
||||||
--hash=sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18 \
|
--hash=sha256:ba00f661f8ba35d075c937174e27c2c421cec3942fd2e0ea3e66996757c0fdd9 \
|
||||||
--hash=sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad \
|
--hash=sha256:bccbbb5ee76a61f9d99b5bf3846a51d7fca4b6a732fe46f89295610edaf41853 \
|
||||||
--hash=sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3 \
|
--hash=sha256:bf01d8c84cbea96b944c73b22182e6c7c432b3475632b8111dbfdc95ddad6e13 \
|
||||||
--hash=sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7 \
|
--hash=sha256:bf5c6cf48238b0eb4c086978c492ad1cbc22373fc5b2d7353b3a598ce6db887a \
|
||||||
--hash=sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5 \
|
--hash=sha256:c16914df9fb7f500e440e6875fa23ff5e0b31db01fa9c06af98d59a91f0dc2e4 \
|
||||||
--hash=sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534 \
|
--hash=sha256:c351efb95e832a853a29361675f33a7ce53de1a109cd73fd47af0712213aa4ce \
|
||||||
--hash=sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49 \
|
--hash=sha256:c4165821e131d6d4ca444347c2b694e2311bcfa3fe5a861cc72968f28867beac \
|
||||||
--hash=sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2 \
|
--hash=sha256:c5f5df567f6eb216de69be06ce55c8b714090fae02b18a3b40da8163b8c5fa9c \
|
||||||
--hash=sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5 \
|
--hash=sha256:c941bb58d5a6e1c3892d86e42927ed6c180302f07e6d395d08c416e594b98b46 \
|
||||||
--hash=sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453 \
|
--hash=sha256:c97f080ea627e2863524c5af3836e2270b5f5dfff1f104392b959f8df0c5d384 \
|
||||||
--hash=sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf
|
--hash=sha256:cb96698e3c7413d906ce83f8ffd245ec1bd94707541f299d0ce4d6b0193e982b \
|
||||||
|
--hash=sha256:cbb7640ce37159548d2147b5b8c241f962143d4c71231431820783f4dc78f210 \
|
||||||
|
--hash=sha256:cdf2448aab5f661c9315308ec8b93f4e8a1a67a3c733f8631067a2b67d5913dc \
|
||||||
|
--hash=sha256:d2117334c3af3bdcb9a88522b844a2bdb5efdc4f71c6c822df55486ae1c3347a \
|
||||||
|
--hash=sha256:d53d10f7da99ae46f7373b9150393e9c5eab9b224909982b43832668de4779f5 \
|
||||||
|
--hash=sha256:d9fafc5aa2e2a39aaf7f8cc0c1f044a9b07fca12e558dca53a3cc5c654ad67a7 \
|
||||||
|
--hash=sha256:db3eb7d46527159a878ec3460e9d40615bc25ba337d477db681aea6e4f05c5d2 \
|
||||||
|
--hash=sha256:dbf7c7a88e2bac086f06d14577332760bdeecc42bdec8ac4077f6260557d9326 \
|
||||||
|
--hash=sha256:df2b82571a1b30f58a87bf4e5a9e78d2b1eff6c6ce8fd3aa3757221f93f0863f \
|
||||||
|
--hash=sha256:df92f2aba50eb4d96718b68ef76f2e57a57b54f2fa62333496d16c6d585a85ca \
|
||||||
|
--hash=sha256:eb4e8997a49aa2c08a3e43c9045d224448b8941d88e7ac163c7d383e560cbf98 \
|
||||||
|
--hash=sha256:efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9 \
|
||||||
|
--hash=sha256:f146d154428a2523f9cc7936c02353c2459b8f6cf07d3cd1ee1c0a611109c5d5 \
|
||||||
|
--hash=sha256:f5bce581e6b8c235e566a14768a943b172ada3ed73537bb0c0be1edee312d4e7 \
|
||||||
|
--hash=sha256:f9912624a0c0b834b7520d7769b3644453aabc0a7e1c839da7359f050750e9bc \
|
||||||
|
--hash=sha256:fb62edb5bb52cca65fab91a63afa7561607120d26090a7e8fda6fb9f064726da \
|
||||||
|
--hash=sha256:ff067a8d8d880e7809e4ac88eb009bb848870115317b306666502ccad30b147f
|
||||||
# via cryptography
|
# via cryptography
|
||||||
charset-normalizer==3.4.7 \
|
charset-normalizer==3.4.9 \
|
||||||
--hash=sha256:007d05ec7321d12a40227aae9e2bc6dca73f3cb21058999a1df9e193555a9dcc \
|
--hash=sha256:0327fcd59a935777d83410750c50600ee9571af2846f71ce40f25b13da1ef380 \
|
||||||
--hash=sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c \
|
--hash=sha256:03d07803992c6c7bbc976327f34b18b6160327fc81cb82c9d504720ac0be3b62 \
|
||||||
--hash=sha256:07d9e39b01743c3717745f4c530a6349eadbfa043c7577eef86c502c15df2c67 \
|
--hash=sha256:04ce310cb89c15df659582aee80a0603788732a5e017d5bd5c81158106ce249c \
|
||||||
--hash=sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4 \
|
--hash=sha256:0d861473f743244d349b50f850d10eb87aeb22bbdcc8e64f79273c94af5a8226 \
|
||||||
--hash=sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0 \
|
--hash=sha256:0e94703ec9684807f20cfb5eed95c70f67f2a8f21ad620146d7b5a13677b93e5 \
|
||||||
--hash=sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c \
|
--hash=sha256:0fa1aec2d32bcc03c8fa0f6f1712caad1adc38509f31142112e5c9daf5b9c833 \
|
||||||
--hash=sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5 \
|
--hash=sha256:16b65ea0f2465b6fb52aa22de5eca612aa964ddfec00a912e26f4656cbef890b \
|
||||||
--hash=sha256:12a6fff75f6bc66711b73a2f0addfc4c8c15a20e805146a02d147a318962c444 \
|
--hash=sha256:16d10d789dd9bcca1173c95af82c58433122564b7bc39385124be735a35cbe99 \
|
||||||
--hash=sha256:12d8baf840cc7889b37c7c770f478adea7adce3dcb3944d02ec87508e2dcf153 \
|
--hash=sha256:19ac87f93086ce37b86e098888555c4b4bc48102279bae3350098c0ed664b501 \
|
||||||
--hash=sha256:14265bfe1f09498b9d8ec91e9ec9fa52775edf90fcbde092b25f4a33d444fea9 \
|
--hash=sha256:1d22856ffbe153a602df38e4a5464f0b748a54002e0d69ac6d2ad0a197cc99ec \
|
||||||
--hash=sha256:16d971e29578a5e97d7117866d15889a4a07befe0e87e703ed63cd90cb348c01 \
|
--hash=sha256:21e764fd1e70b6a3e205a0e46f3051701f98a8cb3fad66eeb80e48bb502f8698 \
|
||||||
--hash=sha256:177a0ba5f0211d488e295aaf82707237e331c24788d8d76c96c5a41594723217 \
|
--hash=sha256:231ddcbb35e2ff8973e1365db41fe0572662893b99a05deb183b68ad4c0c8bd4 \
|
||||||
--hash=sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b \
|
--hash=sha256:253a4a220747e8b5faf57ec320c4f5efb0cef05f647420bf267143ec15dba10a \
|
||||||
--hash=sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c \
|
--hash=sha256:280081916dc341820640489a66e4696049401ef1cf6dd672f672e70ad915aca3 \
|
||||||
--hash=sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a \
|
--hash=sha256:2a441ea71902098ffe78c5abe6c494f44160b4af614ed16c3d9a3b1d17fd8ee2 \
|
||||||
--hash=sha256:1dc8b0ea451d6e69735094606991f32867807881400f808a106ee1d963c46a83 \
|
--hash=sha256:304b13570067b2547562e308af560b3963857b1fa90bd6afd978130130fe2d6a \
|
||||||
--hash=sha256:1efde3cae86c8c273f1eb3b287be7d8499420cf2fe7585c41d370d3e790054a5 \
|
--hash=sha256:32286a2c8d167e897177b673176c1e3e00d4057caf5d2b64eef9a3666b03018e \
|
||||||
--hash=sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7 \
|
--hash=sha256:33bdcc2a32c0a0e861f60841a512c8acc658c87c2ac59d89e3a46dacf7d866e4 \
|
||||||
--hash=sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb \
|
--hash=sha256:375b83ed0aecfce76c16d198fbc21f3b11b337d68662bea0a995046682a11419 \
|
||||||
--hash=sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c \
|
--hash=sha256:3c09a49d6cde137258beb3d551994a2927fd35ad5cf96aed573f61bbd67c5f84 \
|
||||||
--hash=sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1 \
|
--hash=sha256:3d92613ec25e43b05f042302531ec0f00b8445190e43325880cbd6ab7c2581da \
|
||||||
--hash=sha256:2cd4a60d0e2fb04537162c62bbbb4182f53541fe0ede35cdf270a1c1e723cc42 \
|
--hash=sha256:40a126142a56b2dfc0aacbad1de8310cbf60da7656db0e6b16eebd48e3e93519 \
|
||||||
--hash=sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab \
|
--hash=sha256:416c229f77e5ea25b3dfd4b582f8d73d7e43c22320302b9ab128a2d3a0b38efe \
|
||||||
--hash=sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df \
|
--hash=sha256:432786d3561e69aeeae6c7e8648964ce0ad05736120135601f87ac26b9c83381 \
|
||||||
--hash=sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e \
|
--hash=sha256:43b9e366a31fdd1c87d0eb08f579b4a82b723ea54338f040d6b4e518a026ea29 \
|
||||||
--hash=sha256:320ade88cfb846b8cd6b4ddf5ee9e80ee0c1f52401f2456b84ae1ae6a1a5f207 \
|
--hash=sha256:440eede837960000d74978f0eba527be106b5b9aee0daf779d395276ed0b0614 \
|
||||||
--hash=sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18 \
|
--hash=sha256:45b0cc4e3556cd875e09102988d1ab8356c998b596c9fced84547c8138b487a0 \
|
||||||
--hash=sha256:36836d6ff945a00b88ba1e4572d721e60b5b8c98c155d465f56ad19d68f23734 \
|
--hash=sha256:476743fe6dfe14a2da12e3ac79125dc84a3b2cf8094369a47a1529b0cd8549fe \
|
||||||
--hash=sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38 \
|
--hash=sha256:4773092f8019072343a7447203308b176e10199920eb02d6195e81bbb3274c29 \
|
||||||
--hash=sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110 \
|
--hash=sha256:4b3dac63058cc36820b0dd072f89898604e2d39686fe05321729d00d8ac185a0 \
|
||||||
--hash=sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18 \
|
--hash=sha256:4d1c96a7a18b9690a4d46df09e3e3382406ae3213727cd1019ebade1c4a81917 \
|
||||||
--hash=sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44 \
|
--hash=sha256:51307f5c71007673a2bf8232ad973483d281e74cb99c8c5a990af1eefa6277d9 \
|
||||||
--hash=sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d \
|
--hash=sha256:51447e9aa2684679af07ca5021c3db526e0284347ebf4ffcec1154c3350cfe32 \
|
||||||
--hash=sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48 \
|
--hash=sha256:58150c9f9b9a552505912d182ccdf26f6396fb6094816ceebcbb20eecabaed94 \
|
||||||
--hash=sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e \
|
--hash=sha256:5b10cd92fc5c498b35a8635df6d5a100207f88b63a4dc1de7ef9a548e1e2cd63 \
|
||||||
--hash=sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5 \
|
--hash=sha256:5e226f6218febc71f6c1fc2fafb91c226f75bdc1d8fb12d66823716e891608fd \
|
||||||
--hash=sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d \
|
--hash=sha256:609b3ba8fcc0fb5ab7af00719d0fb6ad0cb518e48e7712d12fd68f1327951198 \
|
||||||
--hash=sha256:4e5163c14bffd570ef2affbfdd77bba66383890797df43dc8b4cc7d6f500bf53 \
|
--hash=sha256:60f44ade2cf573dad7a277e6f8ca9a51a21dda572b13bd7d8539bb3cd5dbedde \
|
||||||
--hash=sha256:511ef87c8aec0783e08ac18565a16d435372bc1ac25a91e6ac7f5ef2b0bff790 \
|
--hash=sha256:611057cc5d5c0afc743ba8be6bd828c17e0aaa8643f9d0a9b9bb7dea80eb8012 \
|
||||||
--hash=sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c \
|
--hash=sha256:6366a16e1a25018694d6a5d784d09b046edc9eac40ea2b54065c3052672516a1 \
|
||||||
--hash=sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b \
|
--hash=sha256:65a7ff3f705e57d392f7261b6d0550fe137c3019477431f1c355e0db0a7d3e15 \
|
||||||
--hash=sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116 \
|
--hash=sha256:673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b \
|
||||||
--hash=sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d \
|
--hash=sha256:67830fc78e67501f47bb950471b2dcb9b35b140084429318e862895a8e89c993 \
|
||||||
--hash=sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10 \
|
--hash=sha256:68ce9f4d6b26d5ccbf7fd4459bf75f74a0a146677ebba80597df60cbdb20e6f4 \
|
||||||
--hash=sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6 \
|
--hash=sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5 \
|
||||||
--hash=sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2 \
|
--hash=sha256:69b157c5d3292bcd443faca052f3096f637f1e074b98212a933c074ae23dc3b8 \
|
||||||
--hash=sha256:6370e8686f662e6a3941ee48ed4742317cafbe5707e36406e9df792cdb535776 \
|
--hash=sha256:75286256590a6320cf106a0d28970d3560aad9ee09aa7b34fb40524792436d35 \
|
||||||
--hash=sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a \
|
--hash=sha256:78841cccf1af7b40f6f716338d50c0902dbe88d9f800b3c973b7a9a0a693a642 \
|
||||||
--hash=sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265 \
|
--hash=sha256:78fa18e436a1a0e58dbd7e02fc4473f3f32cceb12df9dfca542d075961c307d2 \
|
||||||
--hash=sha256:66671f93accb62ed07da56613636f3641f1a12c13046ce91ffc923721f23c008 \
|
--hash=sha256:79580094b00d1789d1f93ea55bc43cb2f611910c72235b7657f3482ddcc1b22d \
|
||||||
--hash=sha256:6696b7688f54f5af4462118f0bfa7c1621eeb87154f77fa04b9295ce7a8f2943 \
|
--hash=sha256:7b86a2b16095d250c6f58b3d9b2eee6f4147754344f3dab0922f7c9bf7d226c9 \
|
||||||
--hash=sha256:6785f414ae0f3c733c437e0f3929197934f526d19dfaa75e18fdb4f94c6fb374 \
|
--hash=sha256:83aed2c10721ddd90f68140685391b50811a880af20654c59af6b6c66c40513c \
|
||||||
--hash=sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246 \
|
--hash=sha256:84fd18bcc17526fc2b3c1af7d2b9217d32c9c04448c16ec693b9b4f1985c3d33 \
|
||||||
--hash=sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e \
|
--hash=sha256:871ff67ea1aad4dfd91736464934d56b32dac49f9fbe16cddba36198a7b3a0db \
|
||||||
--hash=sha256:6e0d51f618228538a3e8f46bd246f87a6cd030565e015803691603f55e12afb5 \
|
--hash=sha256:898f0e9068ca27d37f8e83a5b962821df851532e6c4a7d615c1c033f9da6eedf \
|
||||||
--hash=sha256:6ed74185b2db44f41ef35fd1617c5888e59792da9bbc9190d6c7300617182616 \
|
--hash=sha256:8a79d9f4d8001473a30c163556b3c3bfebec837495a412dde78b51672f6134f9 \
|
||||||
--hash=sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15 \
|
--hash=sha256:8c041122946b7ba21bb32c45b1aa57b1be35527690aeb3c5c234521085632eee \
|
||||||
--hash=sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41 \
|
--hash=sha256:90c44bc373b7687f6948b693cceaea1348ae0975d7474746559494468e3c1d84 \
|
||||||
--hash=sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960 \
|
--hash=sha256:9104ed0bd76a429d46f9ec0dbc9b08ad1d2dcdf2b00a5a0daa1c145329b35b44 \
|
||||||
--hash=sha256:750e02e074872a3fad7f233b47734166440af3cdea0add3e95163110816d6752 \
|
--hash=sha256:920079c3f7456fa213e0829ed2073aaa727fd39d889ead5b4f35d0de5460d04f \
|
||||||
--hash=sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e \
|
--hash=sha256:93d59d504b230e83c7a843251681959a0b6a9cd76f6e146ce1b8a80eb8739af9 \
|
||||||
--hash=sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72 \
|
--hash=sha256:9b2aff1c7b3884512b9512c3eaadd9bab39fb45042ffaaa1dd08ff2b9f8109d9 \
|
||||||
--hash=sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7 \
|
--hash=sha256:9b8e0f3107e2200b76f6054de99016eac3ee6762713587b36baaa7e4bd2ae177 \
|
||||||
--hash=sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8 \
|
--hash=sha256:9bb41182d93ea91f60b4bc8fbf4c820c69ef8a12ab2d917f3f1834f1acad07e8 \
|
||||||
--hash=sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b \
|
--hash=sha256:9cdef90ae47919cae358d8ab15797a800ed41da7aba5d72419fb510729e2ed4b \
|
||||||
--hash=sha256:813c0e0132266c08eb87469a642cb30aaff57c5f426255419572aaeceeaa7bf4 \
|
--hash=sha256:a1786910334ed46ab1dd73222f2cd1e05c2c3bb39f6dddb4f8b36fc382058a39 \
|
||||||
--hash=sha256:82b271f5137d07749f7bf32f70b17ab6eaabedd297e75dce75081a24f76eb545 \
|
--hash=sha256:a4cfde78a9f2880208d16a93b795726a3017d5977e08d1e162a7a31322479c41 \
|
||||||
--hash=sha256:84c018e49c3bf790f9c2771c45e9313a08c2c2a6342b162cd650258b57817706 \
|
--hash=sha256:a4fbdde9dd4a9ce5fd52c2b3a347bb50cc89483ef783f1cb00d408c13f7a96c0 \
|
||||||
--hash=sha256:8751d2787c9131302398b11e6c8068053dcb55d5a8964e114b6e196cf16cb366 \
|
--hash=sha256:aa99adc8f081b475a12843953db36831eaf83ec33eb46a90629ca6a5de45a616 \
|
||||||
--hash=sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb \
|
--hash=sha256:ac351b3b8014eead140e77e9717e2992c6bbe30b63bc3422422eb84865412e3d \
|
||||||
--hash=sha256:87fad7d9ba98c86bcb41b2dc8dbb326619be2562af1f8ff50776a39e55721c5a \
|
--hash=sha256:ad41ba96094304aa090f5a30cb6e4fb3b3f1c264c523394b4c39bbacc4dc92ba \
|
||||||
--hash=sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e \
|
--hash=sha256:b5314963fce9b0b12743891de876e724997864ee22aa496f903f426c7e2fa5b2 \
|
||||||
--hash=sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00 \
|
--hash=sha256:bcf74c1df76758a395bf0af608c04c82257523f55c9868b334f06270d0f2112b \
|
||||||
--hash=sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f \
|
--hash=sha256:bd47ba7fc3ca94896759ea0109775132d3e7ab921fbf54038e1bab2e46c313c9 \
|
||||||
--hash=sha256:94e1885b270625a9a828c9793b4d52a64445299baa1fea5a173bf1d3dd9a1a5a \
|
--hash=sha256:c0323c9daef75ef2e5083624b4585018a0c9d5e3b40f607eed81a311270b934b \
|
||||||
--hash=sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1 \
|
--hash=sha256:c1225416b463483160e4af85d5fc3a9690ccb53fd4b1865a6437825f5ede3209 \
|
||||||
--hash=sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66 \
|
--hash=sha256:c1c948747b03be832dceed96ca815cef7360de9aa19d37c730f8e3f6101aca48 \
|
||||||
--hash=sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356 \
|
--hash=sha256:c25fe15c70c59eb7c5ce8c06a1f3fa1da0ecc5ea1e7a5922c40fd2fa9b0d5046 \
|
||||||
--hash=sha256:a6c5863edfbe888d9eff9c8b8087354e27618d9da76425c119293f11712a6319 \
|
--hash=sha256:cc1b0fff8ead343dae06305f954eb8468ba0ec1a97881f42489d198e4ce3c632 \
|
||||||
--hash=sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4 \
|
--hash=sha256:cd6280cf040f233bd7d3407b743b4b4c74f70e8e1c4199cb112a62c941c0772a \
|
||||||
--hash=sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad \
|
--hash=sha256:cd6c3d4b783c556fa00bf540854e42f135e2f256abd29669fcd0da0f2dec79c2 \
|
||||||
--hash=sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d \
|
--hash=sha256:d4d6fcde76f94f5cb9e43e9e9a61f16dacefd228cbbf6f1a09bd9b219a92f1a1 \
|
||||||
--hash=sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5 \
|
--hash=sha256:ddf4af30b417d9fe16481e9b81c27ab2a7cde1ff7ba3e85653b02db7d145dc7b \
|
||||||
--hash=sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7 \
|
--hash=sha256:df115d4d83168fdf2cae48ef1ff6d1cb4c466364e30861b37121de0f3bf1b990 \
|
||||||
--hash=sha256:aef65cd602a6d0e0ff6f9930fcb1c8fec60dd2cfcb6facaf4bdb0e5873042db0 \
|
--hash=sha256:df7276909358e5635ae203673ab7e509ddd224225a8d6b0790bf13eb2bde1cc5 \
|
||||||
--hash=sha256:af21eb4409a119e365397b2adbaca4c9ccab56543a65d5dbd9f920d6ac29f686 \
|
--hash=sha256:e4fd89cc178bced6ad29cb3e6dd4aa63fa5017c3524dbd0b25998fb64a87cc8b \
|
||||||
--hash=sha256:b14b2d9dac08e28bb8046a1a0434b1750eb221c8f5b87a68f4fa11a6f97b5e34 \
|
--hash=sha256:e9701d0049d92c16703a42771b98d560b95248949f23f8cf7b4eddd201814fb9 \
|
||||||
--hash=sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49 \
|
--hash=sha256:ee2f2a527e3c1a6e6411eb4209642e138b544a2d72fe5d0d76daf77b24063534 \
|
||||||
--hash=sha256:bb8cc7534f51d9a017b93e3e85b260924f909601c3df002bcdb58ddb4dc41a5c \
|
--hash=sha256:f7fb7d750cfa0a070d2c24e831fd3481019a60dd317ea2b39acbcebc08b6ed81 \
|
||||||
--hash=sha256:bc17a677b21b3502a21f66a8cc64f5bfad4df8a0b8434d661666f8ce90ac3af1 \
|
--hash=sha256:f840ed6d8ecba8255df8c42b87fadeda98ddfc6eeec05e2dc66e26d46dd6f58a \
|
||||||
--hash=sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e \
|
--hash=sha256:f86c6358749bd4fda175388691e3ba8c46e24c5347d0afd20f9b7edfc9faf07d \
|
||||||
--hash=sha256:bd9b23791fe793e4968dba0c447e12f78e425c59fc0e3b97f6450f4781f3ee60 \
|
--hash=sha256:fa36ec09ef71d158186bc79e359ff5fdd6e7996fe8ab638f00d6b93139ba4fcf \
|
||||||
--hash=sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0 \
|
--hash=sha256:fe2c7201c642b7c308f1675355ad7ff7b66acfe3541625efe5a3ad38f29d6115
|
||||||
--hash=sha256:c0f081d69a6e58272819b70288d3221a6ee64b98df852631c80f293514d3b274 \
|
|
||||||
--hash=sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d \
|
|
||||||
--hash=sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0 \
|
|
||||||
--hash=sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae \
|
|
||||||
--hash=sha256:c593052c465475e64bbfe5dbd81680f64a67fdc752c56d7a0ae205dc8aeefe0f \
|
|
||||||
--hash=sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d \
|
|
||||||
--hash=sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe \
|
|
||||||
--hash=sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3 \
|
|
||||||
--hash=sha256:cf29836da5119f3c8a8a70667b0ef5fdca3bb12f80fd06487cfa575b3909b393 \
|
|
||||||
--hash=sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1 \
|
|
||||||
--hash=sha256:d560742f3c0d62afaccf9f41fe485ed69bd7661a241f86a3ef0f0fb8b1a397af \
|
|
||||||
--hash=sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44 \
|
|
||||||
--hash=sha256:d61f00a0869d77422d9b2aba989e2d24afa6ffd552af442e0e58de4f35ea6d00 \
|
|
||||||
--hash=sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c \
|
|
||||||
--hash=sha256:dca4bbc466a95ba9c0234ef56d7dd9509f63da22274589ebd4ed7f1f4d4c54e3 \
|
|
||||||
--hash=sha256:dd915403e231e6b1809fe9b6d9fc55cf8fb5e02765ac625d9cd623342a7905d7 \
|
|
||||||
--hash=sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd \
|
|
||||||
--hash=sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e \
|
|
||||||
--hash=sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b \
|
|
||||||
--hash=sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8 \
|
|
||||||
--hash=sha256:e5f4d355f0a2b1a31bc3edec6795b46324349c9cb25eed068049e4f472fb4259 \
|
|
||||||
--hash=sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859 \
|
|
||||||
--hash=sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46 \
|
|
||||||
--hash=sha256:e80c8378d8f3d83cd3164da1ad2df9e37a666cdde7b1cb2298ed0b558064be30 \
|
|
||||||
--hash=sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b \
|
|
||||||
--hash=sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46 \
|
|
||||||
--hash=sha256:ed065083d0898c9d5b4bbec7b026fd755ff7454e6e8b73a67f8c744b13986e24 \
|
|
||||||
--hash=sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a \
|
|
||||||
--hash=sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24 \
|
|
||||||
--hash=sha256:f22dec1690b584cea26fade98b2435c132c1b5f68e39f5a0b7627cd7ae31f1dc \
|
|
||||||
--hash=sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215 \
|
|
||||||
--hash=sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063 \
|
|
||||||
--hash=sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832 \
|
|
||||||
--hash=sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6 \
|
|
||||||
--hash=sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79 \
|
|
||||||
--hash=sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464
|
|
||||||
# via requests
|
# via requests
|
||||||
cramjam==2.11.0 \
|
cramjam==2.11.0 \
|
||||||
--hash=sha256:028400d699442d40dbda02f74158c73d05cb76587a12490d0bfedd958fd49188 \
|
--hash=sha256:028400d699442d40dbda02f74158c73d05cb76587a12490d0bfedd958fd49188 \
|
||||||
@ -390,82 +370,79 @@ cramjam==2.11.0 \
|
|||||||
# via
|
# via
|
||||||
# barman
|
# barman
|
||||||
# python-snappy
|
# python-snappy
|
||||||
cryptography==47.0.0 \
|
cryptography==49.0.0 \
|
||||||
--hash=sha256:0024b87d47ae2399165a6bfb20d24888881eeab83ae2566d62467c5ff0030ce7 \
|
--hash=sha256:026ac7423e6fa66872d3bf889be5974507da3944f866f704fa200eadacd00001 \
|
||||||
--hash=sha256:07efe86201817e7d3c18781ca9770bc0db04e1e48c994be384e4602bc38f8f27 \
|
--hash=sha256:07cab27cc7b7e0fd28e5e26bb9eeedde5c135c868b46de4a27845abe94af6122 \
|
||||||
--hash=sha256:09f6d7bf6724f8db8b32f11eccf23efc8e759924bc5603800335cf8859a3ddbd \
|
--hash=sha256:084ef1af862eb07ec46d25f68689f2102a9fc0e05ce7b80f14f5fe51e4eef0f6 \
|
||||||
--hash=sha256:11438c7518132d95f354fa01a4aa2f806d172a061a7bed18cf18cbdacdb204d7 \
|
--hash=sha256:0b82e28ee398a386f0807bba7884d30f25218855690f45115831bcce5d90822c \
|
||||||
--hash=sha256:11dbb9f50a0f1bb9757b3d8c27c1101780efb8f0bdecfb12439c22a74d64c001 \
|
--hash=sha256:0e959b578856a3924bc0cbb710fc12c387b9412a951389f3ca61704a9e25f325 \
|
||||||
--hash=sha256:14432c8a9bcb37009784f9594a62fae211a2ae9543e96c92b2a8e4c3cd5cd0c4 \
|
--hash=sha256:0f21641cf4b30fca7aee061ced0ec7ad7b073518088b7c9969a297c0ae796c69 \
|
||||||
--hash=sha256:1581aef4219f7ca2849d0250edaa3866212fb74bf5667284f46aa92f9e65c1ca \
|
--hash=sha256:196ecd6a36e4e9aa10270393bb98d8df88fccee0bf1e5128b91ae4eb4375896d \
|
||||||
--hash=sha256:160ad728f128972d362e714054f6ba0067cab7fb350c5202a9ae8ae4ce3ef1a0 \
|
--hash=sha256:2400ef9c9e2299a25614eb1dea3db54a69b1349efd043bfac9c67630d136df36 \
|
||||||
--hash=sha256:1a405c08857258c11016777e11c02bacbe7ef596faf259305d282272a3a05cbe \
|
--hash=sha256:28d8b15e6275f12c8a207dc309dfa957903c927d08d0cc937ee3f63f200693cc \
|
||||||
--hash=sha256:1e47422b5557bb82d3fff997e8d92cff4e28b9789576984f08c248d2b3535d93 \
|
--hash=sha256:2afe9051da7ae7bd5905da5a949280c7d2bb75682e188f650a9d0f2756b834c6 \
|
||||||
--hash=sha256:20fdbe3e38fb67c385d233c89371fa27f9909f6ebca1cecc20c13518dae65475 \
|
--hash=sha256:2eda353d8a27bcbcaa4cbed18994a74ab4d19a2ca897db188ea269ab9b71419b \
|
||||||
--hash=sha256:2207a498b03275d0051589e326b79d4cf59985c99031b05bb292ac52631c37fe \
|
--hash=sha256:32703d93296f5c1f4b53349ad3a250c2cae0fdecd3a3dd5d47e616d8d616af27 \
|
||||||
--hash=sha256:256d07c78a04d6b276f5df935a9923275f53bd1522f214447fdf365494e2d515 \
|
--hash=sha256:33cd0565932807baddb67b96dbee92f2c374b5c89dee09fd74079aeb8c8dba61 \
|
||||||
--hash=sha256:2b45761c6ec22b7c726d6a829558777e32d0f1c8be7c3f3480f9c912d5ee8a10 \
|
--hash=sha256:35b151772baff2c74cba7fa290ceaff4c3b11c0c881eb93eb5dbc05a7cfbba18 \
|
||||||
--hash=sha256:2ebd84adf0728c039a3be2700289378e1c164afc6748df1a5ed456767bef9ba7 \
|
--hash=sha256:36d1709f992593689b45bda411498d62c6e365f2ca00b84657d4dadd24de16db \
|
||||||
--hash=sha256:34b4358b925a5ea3e14384ca781a2c0ef7ac219b57bb9eacc4457078e2b19f92 \
|
--hash=sha256:42b0684e0e40cf26122427802486f6d93aea593612603a94fbf260c7eb1e9c1b \
|
||||||
--hash=sha256:3fb8fa48075fad7193f2e5496135c6a76ac4b2aa5a38433df0a539296b377829 \
|
--hash=sha256:4ae387c9cb68ea569ca17e490d66d8142b81c3cc814bf179974b7d146e490bbb \
|
||||||
--hash=sha256:4e1de79e047e25d6e9f8cea71c86b4a53aced64134f0f003bbcbf3655fd172c8 \
|
--hash=sha256:53ecee2e23f7169b6117e99fc8a944e5e50f79e69758a83b52a00cb98ab2b2d2 \
|
||||||
--hash=sha256:4f7722c97826770bab8ae92959a2e7b20a5e9e9bf4deae68fd86c3ca457bab52 \
|
--hash=sha256:66ec79c3904820572d7e987abdf304281f141d37ad9a489b8e97066e7b9b6459 \
|
||||||
--hash=sha256:51c9313e90bd1690ec5a75ed047c27c0b8e6c570029712943d6116ef9a90620b \
|
--hash=sha256:67e1d20ad9ef3a563c59ef22e7a8a0b8210bd26604369ea4a30a7c66aefe504e \
|
||||||
--hash=sha256:5d0e362ff51041b0c0d219cc7d6924d7b8996f57ce5712bdcef71eb3c65a59cc \
|
--hash=sha256:6f2debedf9ca60cf1d5bd466475638af5130f89965605cd818484d19987d3a21 \
|
||||||
--hash=sha256:6651d32eff255423503aa276739da98c30f26c40cbeffcc6048e0d54ef704c0c \
|
--hash=sha256:6fc361c34fb6aac015ce19435876635e5c6d21db31998b0920f675f131e043b8 \
|
||||||
--hash=sha256:6eebcaf0df1d21ce1f90605c9b432dd2c4f4ab665ac29a40d5e3fc68f51b5e63 \
|
--hash=sha256:73a205dce83953d131a4aa1e0fd917a2fd1c5b1eef251e9d7152efefcbf5caf7 \
|
||||||
--hash=sha256:6f29f36582e6151d9686235e586dd35bb67491f024767d10b842e520dc6a07ac \
|
--hash=sha256:7abcee80084cda3f7691f3eb1ce480d8df49cec637b429aa35986c1de71738aa \
|
||||||
--hash=sha256:7a02675e2fabd0c0fc04c868b8781863cbf1967691543c22f5470500ff840b31 \
|
--hash=sha256:8c25ceb16df5b9435f3f6a9829204985b0e0cbee3b48aacd432c7d2c850b44d9 \
|
||||||
--hash=sha256:7f1207974a904e005f762869996cf620e9bf79ecb4622f148550bb48e0eb35a7 \
|
--hash=sha256:966fe0e9c67490071f14c0d2b1cb2dfb3023c5ce39457343931415f08382f2db \
|
||||||
--hash=sha256:7f68d6fbc7fbbcfb0939fea72c3b96a9f9a6edfc0e1b1d29778a2066030418b1 \
|
--hash=sha256:9e82dcc8e56052715fb18b2429e3bca4823b1629136a2084fc45a9a5cecb9b64 \
|
||||||
--hash=sha256:7fda2f02c9015db3f42bb8a22324a454516ed10a8c29ca6ece6cdbb5efe2a203 \
|
--hash=sha256:b20133d204d2bb56ba047642199603876c872026ca53e79c35b83772ab2cc505 \
|
||||||
--hash=sha256:80887c5cbd1774683cb126f0ab4184567f080071d5acf62205acb354b4b753b7 \
|
--hash=sha256:b39efa323140595abd3ecca8529d321ae50f55f3aa3ba9cc81ea56a6011953d5 \
|
||||||
--hash=sha256:835d2d7f47cdc53b3224e90810fb1d36ca94ea29cc1801fb4c1bc43876735769 \
|
--hash=sha256:b47db11c2c3525083296069b98ac5221907455e989ae0c2e3008bde851921615 \
|
||||||
--hash=sha256:8c1a736bbb3288005796c3f7ccb9453360d7fed483b13b9f468aea5171432923 \
|
--hash=sha256:b87e65d263b3e5d3bb92a57e2a6638e2f31110fa7aa890c7b2dbba42248d0a3f \
|
||||||
--hash=sha256:9af828c0d5a65c70ec729cd7495a4bf1a67ecb66417b8f02ff125ab8a6326a74 \
|
--hash=sha256:b970c6da94d5bb18629db453d14f2a1300f6bf59b61e9b82377931ef95504866 \
|
||||||
--hash=sha256:9c59ab0e0fa3a180a5a9c59f3a5abe3ef90d474bc56d7fadfbe80359491b615b \
|
--hash=sha256:be9fcb48a55f023493482827d4f459bd263cc20efde64f204b97c123201850c6 \
|
||||||
--hash=sha256:9f8e55fe4e63613a5e1cc5819030f27b97742d720203a087802ce4ce9ceb52bb \
|
--hash=sha256:c2bc30226390d60ea19d9f82b19db005fe0452154a23c1c410c12ea801e43561 \
|
||||||
--hash=sha256:9fe6b7c64926c765f9dff301f9c1b867febcda5768868ca084e18589113732ab \
|
--hash=sha256:c83782480a4a9da4d0feb51950131ba32e12e70813848b3343f6e18c28a66838 \
|
||||||
--hash=sha256:a49a3eb5341b9503fa3000a9a0db033161db90d47285291f53c2a9d2cd1b7f76 \
|
--hash=sha256:cbc77da8c523d5abd028635ba850a6966fcee2c82e2bf65a41d1d8afe0f98be9 \
|
||||||
--hash=sha256:a9b761f012a943b7de0e828843c5688d0de94a0578d44d6c85a1bae32f87791f \
|
--hash=sha256:ccac2bfebc306b862133e3bb71f3f6ee8bb525240089b2d952e4144b3a6d5da7 \
|
||||||
--hash=sha256:b1c76fca783aa7698eb21eb14f9c4aa09452248ee54a627d125025a43f83e7a7 \
|
--hash=sha256:d0527ce944105f257f605a827d6ebead966c752038b6e8656abb9c5edee6fc68 \
|
||||||
--hash=sha256:b9a8943e359b7615db1a3ba587994618e094ff3d6fa5a390c73d079ce18b3973 \
|
--hash=sha256:d8ecde755e2e91bf773fc94e8c9d730cd7f2007004cb492263a794ec3899a1c8 \
|
||||||
--hash=sha256:be12cb6a204f77ed968bcefe68086eb061695b540a3dd05edac507a3111b25f0 \
|
--hash=sha256:e3fb64c420688e5319ae25113a354015abbd8dffbfbc41781a1ea66fc7622ac3 \
|
||||||
--hash=sha256:cffbba3392df0fa8629bb7f43454ee2925059ee158e23c54620b9063912b86c8 \
|
--hash=sha256:e5dfc1e64de5677cec922ffa8da89c546d0415bf6efdf081842e5d44c84e1f0e \
|
||||||
--hash=sha256:ed67ea4e0cfb5faa5bc7ecb6e2b8838f3807a03758eec239d6c21c8769355310 \
|
--hash=sha256:ec5e529fb80935c94fe7b729f9972b50e351a0e6b50aa294fd5cabb109fcc29a \
|
||||||
--hash=sha256:edd4da498015da5b9f26d38d3bfc2e90257bfa9cbed1f6767c282a0025ae649b \
|
--hash=sha256:f37d847238971164fdbc68ade6f6574aecc9c0af714190e2083429ff68f4ce9d \
|
||||||
--hash=sha256:ef6b3634087f18d2155b1e8ce264e5345a753da2c5fa9815e7d41315c90f8318 \
|
--hash=sha256:f78ff2c9ed8dc2d036b0f4d640e22522213d047c1b14e61205a7e55c80a494d4 \
|
||||||
--hash=sha256:f1557695e5c2b86e204f6ce9470497848634100787935ab7adc5397c54abd7ab \
|
--hash=sha256:f89660a348f4f78a92366240a61404e337586ef7f5909a2fef59ca88ef505493 \
|
||||||
--hash=sha256:f5c15764f261394b22aef6b00252f5195f46f2ca300bec57149474e2538b31f8 \
|
--hash=sha256:fc1e275c2f1d97b1a6450b8b0ea3ebfa6e087a611c2b26cb2404d48588abab7b
|
||||||
--hash=sha256:f5c3296dab66202f1b18a91fa266be93d6aa0c2806ea3d67762c69f60adc71aa \
|
|
||||||
--hash=sha256:f7db373287273d8af1414cf95dc4118b13ffdc62be521997b0f2b270771fef50 \
|
|
||||||
--hash=sha256:f9a034b642b960767fb343766ae5ba6ad653f2e890ddd82955aef288ffea8736
|
|
||||||
# via
|
# via
|
||||||
# azure-identity
|
# azure-identity
|
||||||
# azure-storage-blob
|
# azure-storage-blob
|
||||||
# google-auth
|
# google-auth
|
||||||
# msal
|
# msal
|
||||||
# pyjwt
|
# pyjwt
|
||||||
google-api-core==2.30.3 \
|
google-api-core==2.32.0 \
|
||||||
--hash=sha256:a85761ba72c444dad5d611c2220633480b2b6be2521eca69cca2dbb3ffd6bfe8 \
|
--hash=sha256:2b33aad226b19272458c46abfe5c5a38d9531ece0c44502129a1463ce83674ac \
|
||||||
--hash=sha256:e601a37f148585319b26db36e219df68c5d07b6382cff2d580e83404e44d641b
|
--hash=sha256:ae1f0d58a6c8869350bf469f8eb3092e7f8c494a942d9525494afb6c162b0904
|
||||||
# via
|
# via
|
||||||
# google-cloud-core
|
# google-cloud-core
|
||||||
# google-cloud-storage
|
# google-cloud-storage
|
||||||
google-auth==2.49.2 \
|
google-auth==2.56.0 \
|
||||||
--hash=sha256:c1ae38500e73065dcae57355adb6278cf8b5c8e391994ae9cbadbcb9631ab409 \
|
--hash=sha256:6e88c10217e07a92bfd01cac8ee99e32ccfb08414c3102e6c5b8d58f37a0d1e0 \
|
||||||
--hash=sha256:c2720924dfc82dedb962c9f52cabb2ab16714fd0a6a707e40561d217574ed6d5
|
--hash=sha256:f90fa030b569a92654b9d690665a073841df33d57487be53db583a9a0867a553
|
||||||
# via
|
# via
|
||||||
# google-api-core
|
# google-api-core
|
||||||
# google-cloud-core
|
# google-cloud-core
|
||||||
# google-cloud-storage
|
# google-cloud-storage
|
||||||
google-cloud-core==2.5.1 \
|
google-cloud-core==2.6.0 \
|
||||||
--hash=sha256:3dc94bdec9d05a31d9f355045ed0f369fbc0d8c665076c734f065d729800f811 \
|
--hash=sha256:6d63ac8e5eca6d9e4319d0a1e2265fadcd7f1049904378caecfa01cf52dd869e \
|
||||||
--hash=sha256:ea62cdf502c20e3e14be8a32c05ed02113d7bef454e40ff3fab6fe1ec9f1f4e7
|
--hash=sha256:e76149739f90fac1fc6757c09f47eaccb3145b54adbd7759b0f7c4b235f46c83
|
||||||
# via google-cloud-storage
|
# via google-cloud-storage
|
||||||
google-cloud-storage==3.10.1 \
|
google-cloud-storage==3.13.0 \
|
||||||
--hash=sha256:97db9aa4460727982040edd2bd13ff3d5e2260b5331ad22895802da1fc2a5286 \
|
--hash=sha256:648af3ef8a6acc674e1359d3c920c67eb89a7a5ab66b336bd3ac43fed6b5ab84 \
|
||||||
--hash=sha256:a72f656759b7b99bda700f901adcb3425a828d4a29f911bc26b3ea79c5b1217f
|
--hash=sha256:d11d8706ea1520fba0f21043bcb7897caf7015d76ce1ad9a4f60237e4d7a9f6c
|
||||||
# via barman
|
# via barman
|
||||||
google-crc32c==1.8.0 \
|
google-crc32c==1.8.0 \
|
||||||
--hash=sha256:014a7e68d623e9a4222d663931febc3033c5c7c9730785727de2a81f87d5bab8 \
|
--hash=sha256:014a7e68d623e9a4222d663931febc3033c5c7c9730785727de2a81f87d5bab8 \
|
||||||
@ -504,17 +481,17 @@ google-crc32c==1.8.0 \
|
|||||||
# via
|
# via
|
||||||
# google-cloud-storage
|
# google-cloud-storage
|
||||||
# google-resumable-media
|
# google-resumable-media
|
||||||
google-resumable-media==2.8.2 \
|
google-resumable-media==2.10.0 \
|
||||||
--hash=sha256:82b6d8ccd11765268cdd2a2123f417ec806b8eef3000a9a38dfe3033da5fb220 \
|
--hash=sha256:88152884bee37b2bf36a0ab81ad8c7fd12212c9803dd981d77c1b35b02d34e7c \
|
||||||
--hash=sha256:f3354a182ebd193ae3f42e3ef95e6c9b10f128320de23ac7637236713b1acd70
|
--hash=sha256:e324bc9d0fdae4c52a08ae90456edc4e71ece858399e1217ac0eb3a51d6bc6ee
|
||||||
# via google-cloud-storage
|
# via google-cloud-storage
|
||||||
googleapis-common-protos==1.74.0 \
|
googleapis-common-protos==1.75.0 \
|
||||||
--hash=sha256:57971e4eeeba6aad1163c1f0fc88543f965bb49129b8bb55b2b7b26ecab084f1 \
|
--hash=sha256:53a062ff3c32552fbd62c11fe23768b78e4ddf0494d5e5fd97d3f4689c75fbbd \
|
||||||
--hash=sha256:702216f78610bb510e3f12ac3cafd281b7ac45cc5d86e90ad87e4d301a3426b5
|
--hash=sha256:961ed60399c457ceb0ee8f285a84c870aabc9c6a832b9d37bb281b5bebde43ed
|
||||||
# via google-api-core
|
# via google-api-core
|
||||||
idna==3.13 \
|
idna==3.18 \
|
||||||
--hash=sha256:585ea8fe5d69b9181ec1afba340451fba6ba764af97026f92a91d4eef164a242 \
|
--hash=sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2 \
|
||||||
--hash=sha256:892ea0cde124a99ce773decba204c5552b69c3c67ffd5f232eb7696135bc8bb3
|
--hash=sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848
|
||||||
# via requests
|
# via requests
|
||||||
isodate==0.7.2 \
|
isodate==0.7.2 \
|
||||||
--hash=sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15 \
|
--hash=sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15 \
|
||||||
@ -585,9 +562,9 @@ lz4==4.4.5 \
|
|||||||
--hash=sha256:f9b8bde9909a010c75b3aea58ec3910393b758f3c219beed67063693df854db0 \
|
--hash=sha256:f9b8bde9909a010c75b3aea58ec3910393b758f3c219beed67063693df854db0 \
|
||||||
--hash=sha256:ff1b50aeeec64df5603f17984e4b5be6166058dcf8f1e26a3da40d7a0f6ab547
|
--hash=sha256:ff1b50aeeec64df5603f17984e4b5be6166058dcf8f1e26a3da40d7a0f6ab547
|
||||||
# via barman
|
# via barman
|
||||||
msal==1.36.0 \
|
msal==1.37.0 \
|
||||||
--hash=sha256:36ecac30e2ff4322d956029aabce3c82301c29f0acb1ad89b94edcabb0e58ec4 \
|
--hash=sha256:1b1672a33ee467c1d70b341bb16cafd51bb3c817147a95b93263794b03971bec \
|
||||||
--hash=sha256:3f6a4af2b036b476a4215111c4297b4e6e236ed186cd804faefba23e4990978b
|
--hash=sha256:dd17e95a7c71bce75e8108113438ba7c4a086b3bcad4f57a8c09b7af3d753c2d
|
||||||
# via
|
# via
|
||||||
# azure-identity
|
# azure-identity
|
||||||
# msal-extensions
|
# msal-extensions
|
||||||
@ -595,19 +572,19 @@ msal-extensions==1.3.1 \
|
|||||||
--hash=sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca \
|
--hash=sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca \
|
||||||
--hash=sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4
|
--hash=sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4
|
||||||
# via azure-identity
|
# via azure-identity
|
||||||
proto-plus==1.27.2 \
|
proto-plus==1.28.1 \
|
||||||
--hash=sha256:6432f75893d3b9e70b9c412f1d2f03f65b11fb164b793d14ae2ca01821d22718 \
|
--hash=sha256:6660f5f1970874bdcfc3088b435188a36a37bd3596668f7d726417c4ae8cfbed \
|
||||||
--hash=sha256:b2adde53adadf75737c44d3dcb0104fde65250dfc83ad59168b4aa3e574b6a24
|
--hash=sha256:832e68e7fe064cf90ab153b6e5eb935b27891bb89aaeb68b115e9b702f6cb168
|
||||||
# via google-api-core
|
# via google-api-core
|
||||||
protobuf==7.34.1 \
|
protobuf==7.35.1 \
|
||||||
--hash=sha256:34b84ce27680df7cca9f231043ada0daa55d0c44a2ddfaa58ec1d0d89d8bf60a \
|
--hash=sha256:11d6b0ec246892d85215b0a13ca6e0233cf5284b68f0ac02646427f4ff88a799 \
|
||||||
--hash=sha256:403b093a6e28a960372b44e5eb081775c9b056e816a8029c61231743d63f881a \
|
--hash=sha256:230a75ddfc2de4806e56696ce9640c1cdfdb6543b7cfce98d42a4c0a0e7bdb87 \
|
||||||
--hash=sha256:5185e0e948d07abe94bb76ec9b8416b604cfe5da6f871d67aad30cbf24c3110b \
|
--hash=sha256:24f857477359a85c0c235261b8ba905fd51b2562f4a64ca1df5473f29850cbf6 \
|
||||||
--hash=sha256:8ff40ce8cd688f7265326b38d5a1bed9bfdf5e6723d49961432f83e21d5713e4 \
|
--hash=sha256:353652e4efd0bca5b5fc2656abf8307ef351f0cf938c9eba09f0e09c20a25c30 \
|
||||||
--hash=sha256:9ce42245e704cc5027be797c1db1eb93184d44d1cdd71811fb2d9b25ad541280 \
|
--hash=sha256:4bc97768d8fe4ad6743c8a19403e314511ed9f6d13205b687e52421c023ac1b9 \
|
||||||
--hash=sha256:bb3812cd53aefea2b028ef42bd780f5b96407247f20c6ef7c679807e9d188f11 \
|
--hash=sha256:74758715c53d7158fb76caf4f0cfdacc5329a4b1bb994f865d6cf302d413a1c4 \
|
||||||
--hash=sha256:d8b2cc79c4d8f62b293ad9b11ec3aebce9af481fa73e64556969f7345ebf9fc7 \
|
--hash=sha256:b73f9489a4b8b1c9cb1f8ed951c736392592edb24b9d6819f36d2e10b171d5b4 \
|
||||||
--hash=sha256:e97b55646e6ce5cbb0954a8c28cd39a5869b59090dfaa7df4598a7fba869468c
|
--hash=sha256:ce115a26fe0c39a2c29973d914d327e516a6455464489fe3cd1e51a1b354f81a
|
||||||
# via
|
# via
|
||||||
# google-api-core
|
# google-api-core
|
||||||
# googleapis-common-protos
|
# googleapis-common-protos
|
||||||
@ -621,9 +598,9 @@ psycopg2==2.9.12 \
|
|||||||
--hash=sha256:a73d5513bfe929c56555006c7a9cc7ae6e4276aa99dd2b1e2544eb8bb54f8b23 \
|
--hash=sha256:a73d5513bfe929c56555006c7a9cc7ae6e4276aa99dd2b1e2544eb8bb54f8b23 \
|
||||||
--hash=sha256:d5fbe092315fb007c03544704e6d1e678a6c0378139d01cea433dc59edf041b4
|
--hash=sha256:d5fbe092315fb007c03544704e6d1e678a6c0378139d01cea433dc59edf041b4
|
||||||
# via barman
|
# via barman
|
||||||
pyasn1==0.6.3 \
|
pyasn1==0.6.4 \
|
||||||
--hash=sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf \
|
--hash=sha256:9c447d8431c947fe4c8febc4ed9e760bc29011a5b01e5c74b67025bd9fb8ce81 \
|
||||||
--hash=sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde
|
--hash=sha256:deda9277cfd454080ec40b207fb6df82206a3a2688735233cdcd8d3d565f088b
|
||||||
# via pyasn1-modules
|
# via pyasn1-modules
|
||||||
pyasn1-modules==0.4.2 \
|
pyasn1-modules==0.4.2 \
|
||||||
--hash=sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a \
|
--hash=sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a \
|
||||||
@ -633,9 +610,9 @@ pycparser==3.0 \
|
|||||||
--hash=sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29 \
|
--hash=sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29 \
|
||||||
--hash=sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992
|
--hash=sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992
|
||||||
# via cffi
|
# via cffi
|
||||||
pyjwt==2.12.1 \
|
pyjwt==2.13.0 \
|
||||||
--hash=sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c \
|
--hash=sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423 \
|
||||||
--hash=sha256:c74a7a2adf861c04d002db713dd85f84beb242228e671280bf709d765b03672b
|
--hash=sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728
|
||||||
# via
|
# via
|
||||||
# msal
|
# msal
|
||||||
# pyjwt
|
# pyjwt
|
||||||
@ -649,38 +626,38 @@ python-snappy==0.7.3 \
|
|||||||
--hash=sha256:074c0636cfcd97e7251330f428064050ac81a52c62ed884fc2ddebbb60ed7f50 \
|
--hash=sha256:074c0636cfcd97e7251330f428064050ac81a52c62ed884fc2ddebbb60ed7f50 \
|
||||||
--hash=sha256:40216c1badfb2d38ac781ecb162a1d0ec40f8ee9747e610bcfefdfa79486cee3
|
--hash=sha256:40216c1badfb2d38ac781ecb162a1d0ec40f8ee9747e610bcfefdfa79486cee3
|
||||||
# via barman
|
# via barman
|
||||||
requests==2.33.1 \
|
requests==2.34.2 \
|
||||||
--hash=sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517 \
|
--hash=sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0 \
|
||||||
--hash=sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a
|
--hash=sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed
|
||||||
# via
|
# via
|
||||||
# azure-core
|
# azure-core
|
||||||
# google-api-core
|
# google-api-core
|
||||||
# google-cloud-storage
|
# google-cloud-storage
|
||||||
# msal
|
# msal
|
||||||
s3transfer==0.16.1 \
|
s3transfer==0.19.1 \
|
||||||
--hash=sha256:61bcd00ccb83b21a0fe7e91a553fff9729d46c83b4e0106e7c314a733891f7c2 \
|
--hash=sha256:d3d6371dc3f1e5c5427b2b457bcf13bcf87bec334c95aed18642eae61f6926f3 \
|
||||||
--hash=sha256:8e424355754b9ccb32467bdc568edf55be82692ef2002d934b1311dbb3b9e524
|
--hash=sha256:d5fd7005ee39307455ad5f310b5ea67f4b1960d7fed5b3671ee50c249de675de
|
||||||
# via boto3
|
# via boto3
|
||||||
six==1.17.0 \
|
six==1.17.0 \
|
||||||
--hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \
|
--hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \
|
||||||
--hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81
|
--hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81
|
||||||
# via python-dateutil
|
# via python-dateutil
|
||||||
typing-extensions==4.15.0 \
|
typing-extensions==4.16.0 \
|
||||||
--hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \
|
--hash=sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8 \
|
||||||
--hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548
|
--hash=sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5
|
||||||
# via
|
# via
|
||||||
# azure-core
|
# azure-core
|
||||||
# azure-identity
|
# azure-identity
|
||||||
# azure-storage-blob
|
# azure-storage-blob
|
||||||
urllib3==2.6.3 \
|
urllib3==2.7.0 \
|
||||||
--hash=sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed \
|
--hash=sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c \
|
||||||
--hash=sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4
|
--hash=sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897
|
||||||
# via
|
# via
|
||||||
# botocore
|
# botocore
|
||||||
# requests
|
# requests
|
||||||
zipp==3.23.1 \
|
zipp==4.1.0 \
|
||||||
--hash=sha256:0b3596c50a5c700c9cb40ba8d86d9f2cc4807e9bedb06bcdf7fac85633e444dc \
|
--hash=sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f \
|
||||||
--hash=sha256:32120e378d32cd9714ad503c1d024619063ec28aad2248dc6672ad13edfa5110
|
--hash=sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602
|
||||||
# via -r sidecar-requirements.in
|
# via -r sidecar-requirements.in
|
||||||
zstandard==0.25.0 \
|
zstandard==0.25.0 \
|
||||||
--hash=sha256:011d388c76b11a0c165374ce660ce2c8efa8e5d87f34996aa80f9c0816698b64 \
|
--hash=sha256:011d388c76b11a0c165374ce660ce2c8efa8e5d87f34996aa80f9c0816698b64 \
|
||||||
@ -783,11 +760,3 @@ zstandard==0.25.0 \
|
|||||||
--hash=sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551 \
|
--hash=sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551 \
|
||||||
--hash=sha256:ffef5a74088f1e09947aecf91011136665152e0b4b359c42be3373897fb39b01
|
--hash=sha256:ffef5a74088f1e09947aecf91011136665152e0b4b359c42be3373897fb39b01
|
||||||
# via barman
|
# via barman
|
||||||
|
|
||||||
# The following packages are considered to be unsafe in a requirements file:
|
|
||||||
setuptools==82.0.1 \
|
|
||||||
--hash=sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9 \
|
|
||||||
--hash=sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb
|
|
||||||
# via
|
|
||||||
# -r sidecar-requirements.in
|
|
||||||
# barman
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "check-doc-version",
|
"name": "check-doc-version",
|
||||||
"engineVersion": "v0.20.6",
|
"engineVersion": "v0.21.7",
|
||||||
"sdk": {
|
"sdk": {
|
||||||
"source": "go"
|
"source": "go"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
module dagger/check-doc-version
|
module dagger/check-doc-version
|
||||||
|
|
||||||
go 1.25.0
|
go 1.26.1
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/Khan/genqlient v0.8.1
|
github.com/Khan/genqlient v0.8.1
|
||||||
@ -30,8 +30,8 @@ require (
|
|||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72
|
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||||
|
github.com/dagger/querybuilder v0.0.0-20260402040506-574a5e81cb59
|
||||||
github.com/go-logr/logr v1.4.3 // indirect
|
github.com/go-logr/logr v1.4.3 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/google/uuid v1.6.0 // indirect
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
@ -39,9 +39,9 @@ require (
|
|||||||
github.com/sosodev/duration v1.4.0 // indirect
|
github.com/sosodev/duration v1.4.0 // indirect
|
||||||
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
|
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect
|
||||||
golang.org/x/net v0.53.0 // indirect
|
golang.org/x/net v0.55.0 // indirect
|
||||||
golang.org/x/sys v0.43.0 // indirect
|
golang.org/x/sys v0.45.0 // indirect
|
||||||
golang.org/x/text v0.36.0 // indirect
|
golang.org/x/text v0.37.0 // indirect
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect
|
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect
|
||||||
google.golang.org/protobuf v1.36.11 // indirect
|
google.golang.org/protobuf v1.36.11 // indirect
|
||||||
|
|||||||
@ -1,5 +1,3 @@
|
|||||||
dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72 h1:s39e07WvaUU6tLhpojK8ZEIoIbOSn5hHOJra0waenxQ=
|
|
||||||
dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72/go.mod h1:ZXg8+pQZaZUC8rAw4V/gPP8aKvKARIJZ+pfcV+RC1es=
|
|
||||||
github.com/99designs/gqlgen v0.17.89 h1:KzEcxPiMgQoMw3m/E85atUEHyZyt0PbAflMia5Kw8z8=
|
github.com/99designs/gqlgen v0.17.89 h1:KzEcxPiMgQoMw3m/E85atUEHyZyt0PbAflMia5Kw8z8=
|
||||||
github.com/99designs/gqlgen v0.17.89/go.mod h1:GFqruTVGB7ZTdrf1uzOagpXbY7DrEt1pIxnTdhIbWvQ=
|
github.com/99designs/gqlgen v0.17.89/go.mod h1:GFqruTVGB7ZTdrf1uzOagpXbY7DrEt1pIxnTdhIbWvQ=
|
||||||
github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs=
|
github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs=
|
||||||
@ -14,6 +12,8 @@ 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/dagger/otel-go v1.43.0 h1:AYCnAamWmxtSxigWPTgC+8EWqiWPcDZEegh8y05gdJ8=
|
github.com/dagger/otel-go v1.43.0 h1:AYCnAamWmxtSxigWPTgC+8EWqiWPcDZEegh8y05gdJ8=
|
||||||
github.com/dagger/otel-go v1.43.0/go.mod h1:83CTuXi70zcx1kaym5buqmb7RNzg1E9dEiQSFyLbLdU=
|
github.com/dagger/otel-go v1.43.0/go.mod h1:83CTuXi70zcx1kaym5buqmb7RNzg1E9dEiQSFyLbLdU=
|
||||||
|
github.com/dagger/querybuilder v0.0.0-20260402040506-574a5e81cb59 h1:g6vfdGRyz6fAjfHz5FyYPZgHy8qcQ31fHrBl1iCOzxw=
|
||||||
|
github.com/dagger/querybuilder v0.0.0-20260402040506-574a5e81cb59/go.mod h1:jsdUJeYzcbyK1j/EqMGPrQgNYxl/Zfg06vvM9C/xXxs=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
@ -75,14 +75,14 @@ go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpu
|
|||||||
go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk=
|
go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk=
|
||||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||||
golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA=
|
golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8=
|
||||||
golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs=
|
golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww=
|
||||||
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
|
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
|
||||||
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
|
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
|
||||||
golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI=
|
golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY=
|
||||||
golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
|
golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
|
||||||
golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg=
|
golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
|
||||||
golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164=
|
golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
|
||||||
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
|
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
|
||||||
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
|
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec=
|
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec=
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "e2e",
|
"name": "e2e",
|
||||||
"engineVersion": "v0.20.6",
|
"engineVersion": "v0.21.7",
|
||||||
"sdk": {
|
"sdk": {
|
||||||
"source": "go"
|
"source": "go"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -1,37 +1,35 @@
|
|||||||
module dagger/e-2-e
|
module dagger/e-2-e
|
||||||
|
|
||||||
go 1.25.0
|
go 1.26.1
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/99designs/gqlgen v0.17.89
|
||||||
github.com/Khan/genqlient v0.8.1
|
github.com/Khan/genqlient v0.8.1
|
||||||
github.com/dagger/otel-go v1.43.0
|
github.com/dagger/otel-go v1.43.0
|
||||||
github.com/vektah/gqlparser/v2 v2.5.32
|
github.com/vektah/gqlparser/v2 v2.5.32
|
||||||
go.opentelemetry.io/otel v1.43.0
|
go.opentelemetry.io/otel v1.43.0
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.19.0
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.43.0
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0
|
||||||
|
go.opentelemetry.io/otel/log v0.19.0
|
||||||
|
go.opentelemetry.io/otel/metric v1.43.0
|
||||||
go.opentelemetry.io/otel/sdk v1.43.0
|
go.opentelemetry.io/otel/sdk v1.43.0
|
||||||
|
go.opentelemetry.io/otel/sdk/log v0.19.0
|
||||||
|
go.opentelemetry.io/otel/sdk/metric v1.43.0
|
||||||
go.opentelemetry.io/otel/trace v1.43.0
|
go.opentelemetry.io/otel/trace v1.43.0
|
||||||
|
go.opentelemetry.io/proto/otlp v1.10.0
|
||||||
|
golang.org/x/sync v0.20.0
|
||||||
|
google.golang.org/grpc v1.80.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require github.com/cenkalti/backoff/v5 v5.0.3 // indirect
|
||||||
github.com/99designs/gqlgen v0.17.89 // indirect
|
|
||||||
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
|
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0 // indirect
|
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.19.0 // indirect
|
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0 // indirect
|
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.43.0 // indirect
|
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 // indirect
|
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 // indirect
|
|
||||||
go.opentelemetry.io/otel/log v0.19.0 // indirect
|
|
||||||
go.opentelemetry.io/otel/metric v1.43.0 // indirect
|
|
||||||
go.opentelemetry.io/otel/sdk/log v0.19.0 // indirect
|
|
||||||
go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect
|
|
||||||
go.opentelemetry.io/proto/otlp v1.10.0 // indirect
|
|
||||||
golang.org/x/sync v0.20.0 // indirect
|
|
||||||
google.golang.org/grpc v1.80.0 // indirect
|
|
||||||
)
|
|
||||||
|
|
||||||
require (
|
require (
|
||||||
dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72
|
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||||
|
github.com/dagger/querybuilder v0.0.0-20260402040506-574a5e81cb59
|
||||||
github.com/go-logr/logr v1.4.3 // indirect
|
github.com/go-logr/logr v1.4.3 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/google/uuid v1.6.0 // indirect
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
@ -39,9 +37,9 @@ require (
|
|||||||
github.com/sosodev/duration v1.4.0 // indirect
|
github.com/sosodev/duration v1.4.0 // indirect
|
||||||
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
|
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect
|
||||||
golang.org/x/net v0.53.0 // indirect
|
golang.org/x/net v0.55.0 // indirect
|
||||||
golang.org/x/sys v0.43.0 // indirect
|
golang.org/x/sys v0.45.0 // indirect
|
||||||
golang.org/x/text v0.36.0 // indirect
|
golang.org/x/text v0.37.0 // indirect
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect
|
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect
|
||||||
google.golang.org/protobuf v1.36.11 // indirect
|
google.golang.org/protobuf v1.36.11 // indirect
|
||||||
|
|||||||
@ -1,5 +1,3 @@
|
|||||||
dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72 h1:s39e07WvaUU6tLhpojK8ZEIoIbOSn5hHOJra0waenxQ=
|
|
||||||
dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72/go.mod h1:ZXg8+pQZaZUC8rAw4V/gPP8aKvKARIJZ+pfcV+RC1es=
|
|
||||||
github.com/99designs/gqlgen v0.17.89 h1:KzEcxPiMgQoMw3m/E85atUEHyZyt0PbAflMia5Kw8z8=
|
github.com/99designs/gqlgen v0.17.89 h1:KzEcxPiMgQoMw3m/E85atUEHyZyt0PbAflMia5Kw8z8=
|
||||||
github.com/99designs/gqlgen v0.17.89/go.mod h1:GFqruTVGB7ZTdrf1uzOagpXbY7DrEt1pIxnTdhIbWvQ=
|
github.com/99designs/gqlgen v0.17.89/go.mod h1:GFqruTVGB7ZTdrf1uzOagpXbY7DrEt1pIxnTdhIbWvQ=
|
||||||
github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs=
|
github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs=
|
||||||
@ -14,6 +12,8 @@ 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/dagger/otel-go v1.43.0 h1:AYCnAamWmxtSxigWPTgC+8EWqiWPcDZEegh8y05gdJ8=
|
github.com/dagger/otel-go v1.43.0 h1:AYCnAamWmxtSxigWPTgC+8EWqiWPcDZEegh8y05gdJ8=
|
||||||
github.com/dagger/otel-go v1.43.0/go.mod h1:83CTuXi70zcx1kaym5buqmb7RNzg1E9dEiQSFyLbLdU=
|
github.com/dagger/otel-go v1.43.0/go.mod h1:83CTuXi70zcx1kaym5buqmb7RNzg1E9dEiQSFyLbLdU=
|
||||||
|
github.com/dagger/querybuilder v0.0.0-20260402040506-574a5e81cb59 h1:g6vfdGRyz6fAjfHz5FyYPZgHy8qcQ31fHrBl1iCOzxw=
|
||||||
|
github.com/dagger/querybuilder v0.0.0-20260402040506-574a5e81cb59/go.mod h1:jsdUJeYzcbyK1j/EqMGPrQgNYxl/Zfg06vvM9C/xXxs=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
@ -75,14 +75,14 @@ go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpu
|
|||||||
go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk=
|
go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk=
|
||||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||||
golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA=
|
golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8=
|
||||||
golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs=
|
golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww=
|
||||||
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
|
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
|
||||||
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
|
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
|
||||||
golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI=
|
golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY=
|
||||||
golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
|
golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
|
||||||
golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg=
|
golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
|
||||||
golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164=
|
golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
|
||||||
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
|
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
|
||||||
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
|
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec=
|
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec=
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "gotest",
|
"name": "gotest",
|
||||||
"engineVersion": "v0.20.6",
|
"engineVersion": "v0.21.7",
|
||||||
"sdk": {
|
"sdk": {
|
||||||
"source": "go"
|
"source": "go"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
module dagger/gotest
|
module dagger/gotest
|
||||||
|
|
||||||
go 1.25.0
|
go 1.26.1
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/Khan/genqlient v0.8.1
|
github.com/Khan/genqlient v0.8.1
|
||||||
@ -26,8 +26,8 @@ require (
|
|||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72
|
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||||
|
github.com/dagger/querybuilder v0.0.0-20260402040506-574a5e81cb59
|
||||||
github.com/go-logr/logr v1.4.3 // indirect
|
github.com/go-logr/logr v1.4.3 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/google/uuid v1.6.0 // indirect
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
@ -39,9 +39,9 @@ require (
|
|||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect
|
||||||
go.opentelemetry.io/otel/metric v1.43.0 // indirect
|
go.opentelemetry.io/otel/metric v1.43.0 // indirect
|
||||||
go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect
|
go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect
|
||||||
golang.org/x/net v0.53.0 // indirect
|
golang.org/x/net v0.55.0 // indirect
|
||||||
golang.org/x/sys v0.43.0 // indirect
|
golang.org/x/sys v0.45.0 // indirect
|
||||||
golang.org/x/text v0.36.0 // indirect
|
golang.org/x/text v0.37.0 // indirect
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect
|
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect
|
||||||
google.golang.org/protobuf v1.36.11 // indirect
|
google.golang.org/protobuf v1.36.11 // indirect
|
||||||
|
|||||||
@ -1,5 +1,3 @@
|
|||||||
dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72 h1:s39e07WvaUU6tLhpojK8ZEIoIbOSn5hHOJra0waenxQ=
|
|
||||||
dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72/go.mod h1:ZXg8+pQZaZUC8rAw4V/gPP8aKvKARIJZ+pfcV+RC1es=
|
|
||||||
github.com/99designs/gqlgen v0.17.89 h1:KzEcxPiMgQoMw3m/E85atUEHyZyt0PbAflMia5Kw8z8=
|
github.com/99designs/gqlgen v0.17.89 h1:KzEcxPiMgQoMw3m/E85atUEHyZyt0PbAflMia5Kw8z8=
|
||||||
github.com/99designs/gqlgen v0.17.89/go.mod h1:GFqruTVGB7ZTdrf1uzOagpXbY7DrEt1pIxnTdhIbWvQ=
|
github.com/99designs/gqlgen v0.17.89/go.mod h1:GFqruTVGB7ZTdrf1uzOagpXbY7DrEt1pIxnTdhIbWvQ=
|
||||||
github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs=
|
github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs=
|
||||||
@ -14,6 +12,8 @@ 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/dagger/otel-go v1.43.0 h1:AYCnAamWmxtSxigWPTgC+8EWqiWPcDZEegh8y05gdJ8=
|
github.com/dagger/otel-go v1.43.0 h1:AYCnAamWmxtSxigWPTgC+8EWqiWPcDZEegh8y05gdJ8=
|
||||||
github.com/dagger/otel-go v1.43.0/go.mod h1:83CTuXi70zcx1kaym5buqmb7RNzg1E9dEiQSFyLbLdU=
|
github.com/dagger/otel-go v1.43.0/go.mod h1:83CTuXi70zcx1kaym5buqmb7RNzg1E9dEiQSFyLbLdU=
|
||||||
|
github.com/dagger/querybuilder v0.0.0-20260402040506-574a5e81cb59 h1:g6vfdGRyz6fAjfHz5FyYPZgHy8qcQ31fHrBl1iCOzxw=
|
||||||
|
github.com/dagger/querybuilder v0.0.0-20260402040506-574a5e81cb59/go.mod h1:jsdUJeYzcbyK1j/EqMGPrQgNYxl/Zfg06vvM9C/xXxs=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
@ -75,14 +75,14 @@ go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpu
|
|||||||
go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk=
|
go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk=
|
||||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||||
golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA=
|
golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8=
|
||||||
golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs=
|
golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww=
|
||||||
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
|
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
|
||||||
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
|
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
|
||||||
golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI=
|
golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY=
|
||||||
golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
|
golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
|
||||||
golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg=
|
golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
|
||||||
golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164=
|
golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
|
||||||
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
|
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
|
||||||
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
|
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec=
|
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec=
|
||||||
|
|||||||
127
go.mod
127
go.mod
@ -1,36 +1,34 @@
|
|||||||
module github.com/cloudnative-pg/plugin-barman-cloud
|
module github.com/cloudnative-pg/plugin-barman-cloud
|
||||||
|
|
||||||
go 1.25.0
|
go 1.26.4
|
||||||
|
|
||||||
toolchain go1.26.2
|
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/cert-manager/cert-manager v1.20.2
|
github.com/cert-manager/cert-manager v1.21.0
|
||||||
github.com/cloudnative-pg/api v1.29.0
|
github.com/cloudnative-pg/api v1.30.0
|
||||||
github.com/cloudnative-pg/barman-cloud v0.5.1
|
github.com/cloudnative-pg/barman-cloud v0.5.2-0.20260720143032-950b0f57e122
|
||||||
github.com/cloudnative-pg/cloudnative-pg v1.29.0
|
github.com/cloudnative-pg/cloudnative-pg v1.30.0
|
||||||
github.com/cloudnative-pg/cnpg-i v0.5.0
|
github.com/cloudnative-pg/cnpg-i v0.6.0
|
||||||
github.com/cloudnative-pg/cnpg-i-machinery v0.4.2
|
github.com/cloudnative-pg/cnpg-i-machinery v0.4.2
|
||||||
github.com/cloudnative-pg/machinery v0.4.0
|
github.com/cloudnative-pg/machinery v0.5.0
|
||||||
github.com/onsi/ginkgo/v2 v2.28.3
|
github.com/onsi/ginkgo/v2 v2.32.0
|
||||||
github.com/onsi/gomega v1.40.0
|
github.com/onsi/gomega v1.42.1
|
||||||
github.com/spf13/cobra v1.10.2
|
github.com/spf13/cobra v1.10.2
|
||||||
github.com/spf13/viper v1.21.0
|
github.com/spf13/viper v1.21.0
|
||||||
google.golang.org/grpc v1.80.0
|
google.golang.org/grpc v1.82.1
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
k8s.io/api v0.35.4
|
k8s.io/api v0.36.2
|
||||||
k8s.io/apiextensions-apiserver v0.35.4
|
k8s.io/apiextensions-apiserver v0.36.2
|
||||||
k8s.io/apimachinery v0.35.4
|
k8s.io/apimachinery v0.36.2
|
||||||
k8s.io/client-go v0.35.4
|
k8s.io/client-go v0.36.2
|
||||||
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5
|
k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3
|
||||||
sigs.k8s.io/controller-runtime v0.23.3
|
sigs.k8s.io/controller-runtime v0.24.1
|
||||||
sigs.k8s.io/kustomize/api v0.21.1
|
sigs.k8s.io/kustomize/api v0.21.1
|
||||||
sigs.k8s.io/kustomize/kyaml v0.21.1
|
sigs.k8s.io/kustomize/kyaml v0.21.1
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
cel.dev/expr v0.25.1 // indirect
|
cel.dev/expr v0.25.1 // indirect
|
||||||
github.com/Masterminds/semver/v3 v3.4.0 // indirect
|
github.com/Masterminds/semver/v3 v3.5.0 // indirect
|
||||||
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
|
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
|
||||||
github.com/avast/retry-go/v5 v5.0.0 // indirect
|
github.com/avast/retry-go/v5 v5.0.0 // indirect
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
@ -42,28 +40,27 @@ require (
|
|||||||
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
|
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
|
||||||
github.com/felixge/httpsnoop v1.0.4 // indirect
|
github.com/felixge/httpsnoop v1.0.4 // indirect
|
||||||
github.com/fsnotify/fsnotify v1.9.0 // indirect
|
github.com/fsnotify/fsnotify v1.9.0 // indirect
|
||||||
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
|
github.com/fxamacker/cbor/v2 v2.9.2 // indirect
|
||||||
github.com/go-errors/errors v1.5.1 // indirect
|
github.com/go-errors/errors v1.5.1 // indirect
|
||||||
github.com/go-logr/logr v1.4.3 // indirect
|
github.com/go-logr/logr v1.4.3 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/go-logr/zapr v1.3.0 // indirect
|
github.com/go-logr/zapr v1.3.0 // indirect
|
||||||
github.com/go-openapi/jsonpointer v0.22.4 // indirect
|
github.com/go-openapi/jsonpointer v0.23.1 // indirect
|
||||||
github.com/go-openapi/jsonreference v0.21.4 // indirect
|
github.com/go-openapi/jsonreference v0.21.5 // indirect
|
||||||
github.com/go-openapi/swag v0.25.4 // indirect
|
github.com/go-openapi/swag v0.26.0 // indirect
|
||||||
github.com/go-openapi/swag/cmdutils v0.25.4 // indirect
|
github.com/go-openapi/swag/cmdutils v0.26.0 // indirect
|
||||||
github.com/go-openapi/swag/conv v0.25.4 // indirect
|
github.com/go-openapi/swag/conv v0.26.0 // indirect
|
||||||
github.com/go-openapi/swag/fileutils v0.25.4 // indirect
|
github.com/go-openapi/swag/fileutils v0.26.0 // indirect
|
||||||
github.com/go-openapi/swag/jsonname v0.25.4 // indirect
|
github.com/go-openapi/swag/jsonname v0.26.0 // indirect
|
||||||
github.com/go-openapi/swag/jsonutils v0.25.4 // indirect
|
github.com/go-openapi/swag/jsonutils v0.26.0 // indirect
|
||||||
github.com/go-openapi/swag/loading v0.25.4 // indirect
|
github.com/go-openapi/swag/loading v0.26.0 // indirect
|
||||||
github.com/go-openapi/swag/mangling v0.25.4 // indirect
|
github.com/go-openapi/swag/mangling v0.26.0 // indirect
|
||||||
github.com/go-openapi/swag/netutils v0.25.4 // indirect
|
github.com/go-openapi/swag/netutils v0.26.0 // indirect
|
||||||
github.com/go-openapi/swag/stringutils v0.25.4 // indirect
|
github.com/go-openapi/swag/stringutils v0.26.0 // indirect
|
||||||
github.com/go-openapi/swag/typeutils v0.25.4 // indirect
|
github.com/go-openapi/swag/typeutils v0.26.0 // indirect
|
||||||
github.com/go-openapi/swag/yamlutils v0.25.4 // indirect
|
github.com/go-openapi/swag/yamlutils v0.26.0 // indirect
|
||||||
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
|
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
|
||||||
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
|
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
|
||||||
github.com/google/btree v1.1.3 // indirect
|
|
||||||
github.com/google/cel-go v0.26.0 // indirect
|
github.com/google/cel-go v0.26.0 // indirect
|
||||||
github.com/google/gnostic-models v0.7.1 // indirect
|
github.com/google/gnostic-models v0.7.1 // indirect
|
||||||
github.com/google/go-cmp v0.7.0 // indirect
|
github.com/google/go-cmp v0.7.0 // indirect
|
||||||
@ -71,23 +68,22 @@ require (
|
|||||||
github.com/google/uuid v1.6.0 // indirect
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
|
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 // indirect
|
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 // indirect
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 // indirect
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/kubernetes-csi/external-snapshotter/client/v8 v8.4.0 // indirect
|
github.com/kubernetes-csi/external-snapshotter/client/v8 v8.6.0 // indirect
|
||||||
github.com/lib/pq v1.12.3 // indirect
|
github.com/lib/pq v1.12.3 // indirect
|
||||||
github.com/moby/spdystream v0.5.1 // indirect
|
github.com/moby/spdystream v0.5.1 // indirect
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
|
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
|
||||||
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
|
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||||
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
|
|
||||||
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
|
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||||
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.87.1 // indirect
|
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.92.0 // indirect
|
||||||
github.com/prometheus/client_golang v1.23.2 // indirect
|
github.com/prometheus/client_golang v1.23.2 // indirect
|
||||||
github.com/prometheus/client_model v0.6.2 // indirect
|
github.com/prometheus/client_model v0.6.2 // indirect
|
||||||
github.com/prometheus/common v0.67.4 // indirect
|
github.com/prometheus/common v0.67.5 // indirect
|
||||||
github.com/prometheus/procfs v0.19.2 // indirect
|
github.com/prometheus/procfs v0.19.2 // indirect
|
||||||
github.com/sagikazarmark/locafero v0.11.0 // indirect
|
github.com/sagikazarmark/locafero v0.11.0 // indirect
|
||||||
github.com/snorwin/jsonpatch v1.5.0 // indirect
|
github.com/snorwin/jsonpatch v1.5.0 // indirect
|
||||||
@ -101,42 +97,43 @@ require (
|
|||||||
github.com/x448/float16 v0.8.4 // indirect
|
github.com/x448/float16 v0.8.4 // indirect
|
||||||
github.com/xlab/treeprint v1.2.0 // indirect
|
github.com/xlab/treeprint v1.2.0 // indirect
|
||||||
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
|
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect
|
||||||
go.opentelemetry.io/otel v1.43.0 // indirect
|
go.opentelemetry.io/otel v1.43.0 // indirect
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 // indirect
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0 // indirect
|
||||||
go.opentelemetry.io/otel/metric v1.43.0 // indirect
|
go.opentelemetry.io/otel/metric v1.43.0 // indirect
|
||||||
go.opentelemetry.io/otel/sdk v1.43.0 // indirect
|
go.opentelemetry.io/otel/sdk v1.43.0 // indirect
|
||||||
go.opentelemetry.io/otel/trace v1.43.0 // indirect
|
go.opentelemetry.io/otel/trace v1.43.0 // indirect
|
||||||
go.opentelemetry.io/proto/otlp v1.7.0 // indirect
|
go.opentelemetry.io/proto/otlp v1.9.0 // indirect
|
||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
go.uber.org/zap v1.27.1 // indirect
|
go.uber.org/zap v1.28.0 // indirect
|
||||||
go.yaml.in/yaml/v2 v2.4.3 // indirect
|
go.yaml.in/yaml/v2 v2.4.4 // indirect
|
||||||
go.yaml.in/yaml/v3 v3.0.4 // indirect
|
go.yaml.in/yaml/v3 v3.0.4 // indirect
|
||||||
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect
|
golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 // indirect
|
||||||
golang.org/x/mod v0.35.0 // indirect
|
golang.org/x/mod v0.36.0 // indirect
|
||||||
golang.org/x/net v0.53.0 // indirect
|
golang.org/x/net v0.56.0 // indirect
|
||||||
golang.org/x/oauth2 v0.35.0 // indirect
|
golang.org/x/oauth2 v0.36.0 // indirect
|
||||||
golang.org/x/sync v0.20.0 // indirect
|
golang.org/x/sync v0.21.0 // indirect
|
||||||
golang.org/x/sys v0.43.0 // indirect
|
golang.org/x/sys v0.47.0 // indirect
|
||||||
golang.org/x/term v0.42.0 // indirect
|
golang.org/x/term v0.44.0 // indirect
|
||||||
golang.org/x/text v0.36.0 // indirect
|
golang.org/x/text v0.38.0 // indirect
|
||||||
golang.org/x/time v0.14.0 // indirect
|
golang.org/x/time v0.15.0 // indirect
|
||||||
golang.org/x/tools v0.44.0 // indirect
|
golang.org/x/tools v0.45.0 // indirect
|
||||||
gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect
|
gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409 // indirect
|
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20260319201613-d00831a3d3e7 // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad // indirect
|
||||||
google.golang.org/protobuf v1.36.11 // indirect
|
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect
|
||||||
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
|
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
|
||||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||||
k8s.io/apiserver v0.35.4 // indirect
|
k8s.io/apiserver v0.36.2 // indirect
|
||||||
k8s.io/component-base v0.35.4 // indirect
|
k8s.io/component-base v0.36.2 // indirect
|
||||||
k8s.io/klog/v2 v2.140.0 // indirect
|
k8s.io/klog/v2 v2.140.0 // indirect
|
||||||
k8s.io/kube-openapi v0.0.0-20260127142750-a19766b6e2d4 // indirect
|
k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 // indirect
|
||||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 // indirect
|
k8s.io/streaming v0.36.2 // indirect
|
||||||
sigs.k8s.io/gateway-api v1.5.0 // indirect
|
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 // indirect
|
||||||
|
sigs.k8s.io/gateway-api v1.6.0 // indirect
|
||||||
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
|
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
|
||||||
sigs.k8s.io/randfill v1.0.0 // indirect
|
sigs.k8s.io/randfill v1.0.0 // indirect
|
||||||
sigs.k8s.io/structured-merge-diff/v6 v6.3.2 // indirect
|
sigs.k8s.io/structured-merge-diff/v6 v6.4.0 // indirect
|
||||||
sigs.k8s.io/yaml v1.6.0 // indirect
|
sigs.k8s.io/yaml v1.6.0 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
258
go.sum
258
go.sum
@ -1,7 +1,7 @@
|
|||||||
cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4=
|
cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4=
|
||||||
cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4=
|
cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4=
|
||||||
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
|
github.com/Masterminds/semver/v3 v3.5.0 h1:kQceYJfbupGfZOKZQg0kou0DgAKhzDg2NZPAwZ/2OOE=
|
||||||
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
|
github.com/Masterminds/semver/v3 v3.5.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
|
||||||
github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ=
|
github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ=
|
||||||
github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw=
|
github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw=
|
||||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
|
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
|
||||||
@ -14,22 +14,22 @@ github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM
|
|||||||
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
|
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
|
||||||
github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM=
|
github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM=
|
||||||
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
|
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
|
||||||
github.com/cert-manager/cert-manager v1.20.2 h1:CimnY00nLqB2lmxhoSuEC4GDMFDK7JCXqyjwMM9ndIQ=
|
github.com/cert-manager/cert-manager v1.21.0 h1:BCoB2BxA1lbqPusZCqPLPn8Q9MhraL7RbZGHbBcm3W8=
|
||||||
github.com/cert-manager/cert-manager v1.20.2/go.mod h1:1g/+a/WK5zWH/dXPZa3dMD3aJQJNRXQu+PN17C6WrOw=
|
github.com/cert-manager/cert-manager v1.21.0/go.mod h1:V8iALETs2W428CjBZ4Ez3DftDeyu0f8PZnHDTcliS4I=
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||||
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/api v1.29.0 h1:mNx6yJ5qi+Xrjs0NYrUy6V4MlXBkVJxGKwvTJZIuTX4=
|
github.com/cloudnative-pg/api v1.30.0 h1:L8hnvV/tPEQA1xYEi41FUBFA7FUNVGju8+SlgFlDDjI=
|
||||||
github.com/cloudnative-pg/api v1.29.0/go.mod h1:bF3HI8UVVcllZ7M8CfBufnb+Us8FyQArhD+4qtX0qhM=
|
github.com/cloudnative-pg/api v1.30.0/go.mod h1:XrKBbOWObL33si0FNuwX4uHNf5JShiZyOUqd6LxbJQo=
|
||||||
github.com/cloudnative-pg/barman-cloud v0.5.1 h1:vjkXrrxo2DQXHT9u9usqhtaHiPZ/lTfDVs/pIWYTepQ=
|
github.com/cloudnative-pg/barman-cloud v0.5.2-0.20260720143032-950b0f57e122 h1:NuOztBdp+bUr/xYtaAw8o/x880hvWDRhJGl+R1YsZNw=
|
||||||
github.com/cloudnative-pg/barman-cloud v0.5.1/go.mod h1:XPc5IUFP1y4cZX1sg+Pd8j9V4tmUEVnv3BGCpfQOOg8=
|
github.com/cloudnative-pg/barman-cloud v0.5.2-0.20260720143032-950b0f57e122/go.mod h1:ZQLkdpk44FW5/BGWzABTOEcV9qPbwC+rbdscg2I8mBI=
|
||||||
github.com/cloudnative-pg/cloudnative-pg v1.29.0 h1:49Dm8+y4va7RODspJjeaK8uMWP3OGAD0gMsxhjm16Mo=
|
github.com/cloudnative-pg/cloudnative-pg v1.30.0 h1:fnhVq44xXx97MNiuvJsPrX1vSjYbgdyBK5MSGfdHdp0=
|
||||||
github.com/cloudnative-pg/cloudnative-pg v1.29.0/go.mod h1:0Sgb/50VyaCnQm3IbWqgnhQG8Kb6mgqo8Jo1J+KtkSI=
|
github.com/cloudnative-pg/cloudnative-pg v1.30.0/go.mod h1:QkolwBOWZ+GvAiJt6KpDSymwkpf0K19/p4Q6MQlTM8U=
|
||||||
github.com/cloudnative-pg/cnpg-i v0.5.0 h1:/TOzpNT6cwNgrpftTtrnLKdoHgMwd+88vZgXjlVgXeE=
|
github.com/cloudnative-pg/cnpg-i v0.6.0 h1:LA//DLkFOLIjU0ASOpFkydZhGir9IAIDfgSsTTX9IpU=
|
||||||
github.com/cloudnative-pg/cnpg-i v0.5.0/go.mod h1:7Gh4+UzhBpGhr4DreB1GN9wGYfvxwXCXZUyVt3zE/3I=
|
github.com/cloudnative-pg/cnpg-i v0.6.0/go.mod h1:4kcpLAj+feMTnh0TVadXRASdVnEhBytNSm/BvktLgmI=
|
||||||
github.com/cloudnative-pg/cnpg-i-machinery v0.4.2 h1:0reS9MtyLYINHXQ/MfxJ9jp39hhBf8e3Qdj+T5Nsq6I=
|
github.com/cloudnative-pg/cnpg-i-machinery v0.4.2 h1:0reS9MtyLYINHXQ/MfxJ9jp39hhBf8e3Qdj+T5Nsq6I=
|
||||||
github.com/cloudnative-pg/cnpg-i-machinery v0.4.2/go.mod h1:gvrKabgxXq0zGthXGucemDdsxakLEQDMxn43M4HLW30=
|
github.com/cloudnative-pg/cnpg-i-machinery v0.4.2/go.mod h1:gvrKabgxXq0zGthXGucemDdsxakLEQDMxn43M4HLW30=
|
||||||
github.com/cloudnative-pg/machinery v0.4.0 h1:3sfqrBptH4QQSVB4g10Z+7aiQRnh4g+6AsqsK0ibKaQ=
|
github.com/cloudnative-pg/machinery v0.5.0 h1:hhTnkzn+AiN3NmbjCQ6RXj5rfqV3K6arzq6kdXAzcnQ=
|
||||||
github.com/cloudnative-pg/machinery v0.4.0/go.mod h1:OIwaTYAnLv8PmBmBvEf0BvMK2JBX6J+naTMg9UgV1FQ=
|
github.com/cloudnative-pg/machinery v0.5.0/go.mod h1:uuFjqBUjWn0a9uvAk1ixTSzPM0PrjaS+QiKLOIBqLm4=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
@ -47,8 +47,8 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk
|
|||||||
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
||||||
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
||||||
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||||
github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
|
github.com/fxamacker/cbor/v2 v2.9.2 h1:X4Ksno9+x3cz0TZv69ec1hxP/+tymuR8PXQJyDwfh78=
|
||||||
github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
|
github.com/fxamacker/cbor/v2 v2.9.2/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
|
||||||
github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs=
|
github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs=
|
||||||
github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo=
|
github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo=
|
||||||
github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M=
|
github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M=
|
||||||
@ -66,40 +66,40 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
|||||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||||
github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
|
github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
|
||||||
github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg=
|
github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg=
|
||||||
github.com/go-openapi/jsonpointer v0.22.4 h1:dZtK82WlNpVLDW2jlA1YCiVJFVqkED1MegOUy9kR5T4=
|
github.com/go-openapi/jsonpointer v0.23.1 h1:1HBACs7XIwR2RcmItfdSFlALhGbe6S92p0ry4d1GWg4=
|
||||||
github.com/go-openapi/jsonpointer v0.22.4/go.mod h1:elX9+UgznpFhgBuaMQ7iu4lvvX1nvNsesQ3oxmYTw80=
|
github.com/go-openapi/jsonpointer v0.23.1/go.mod h1:iWRmZTrGn7XwYhtPt/fvdSFj1OfNBngqRT2UG3BxSqY=
|
||||||
github.com/go-openapi/jsonreference v0.21.4 h1:24qaE2y9bx/q3uRK/qN+TDwbok1NhbSmGjjySRCHtC8=
|
github.com/go-openapi/jsonreference v0.21.5 h1:6uCGVXU/aNF13AQNggxfysJ+5ZcU4nEAe+pJyVWRdiE=
|
||||||
github.com/go-openapi/jsonreference v0.21.4/go.mod h1:rIENPTjDbLpzQmQWCj5kKj3ZlmEh+EFVbz3RTUh30/4=
|
github.com/go-openapi/jsonreference v0.21.5/go.mod h1:u25Bw85sX4E2jzFodh1FOKMTZLcfifd1Q+iKKOUxExw=
|
||||||
github.com/go-openapi/swag v0.25.4 h1:OyUPUFYDPDBMkqyxOTkqDYFnrhuhi9NR6QVUvIochMU=
|
github.com/go-openapi/swag v0.26.0 h1:GVDXCmfvhfu1BxiHo8/FA+BbKmhecHnG3varjON5/RI=
|
||||||
github.com/go-openapi/swag v0.25.4/go.mod h1:zNfJ9WZABGHCFg2RnY0S4IOkAcVTzJ6z2Bi+Q4i6qFQ=
|
github.com/go-openapi/swag v0.26.0/go.mod h1:82g3193sZJRbocs7bNCqGfIgq8pkuwVwCfhKIRlEQF0=
|
||||||
github.com/go-openapi/swag/cmdutils v0.25.4 h1:8rYhB5n6WawR192/BfUu2iVlxqVR9aRgGJP6WaBoW+4=
|
github.com/go-openapi/swag/cmdutils v0.26.0 h1:iowihOcvq7y4egO8cOq0dmfohz6wfeQ63U1EnuhO2TU=
|
||||||
github.com/go-openapi/swag/cmdutils v0.25.4/go.mod h1:pdae/AFo6WxLl5L0rq87eRzVPm/XRHM3MoYgRMvG4A0=
|
github.com/go-openapi/swag/cmdutils v0.26.0/go.mod h1:Sm1MVFMkF6guJJ+pQqHnQA3N0j9qALV3NxzDSv6bETM=
|
||||||
github.com/go-openapi/swag/conv v0.25.4 h1:/Dd7p0LZXczgUcC/Ikm1+YqVzkEeCc9LnOWjfkpkfe4=
|
github.com/go-openapi/swag/conv v0.26.0 h1:5yGGsPYI1ZCva93U0AoKi/iZrNhaJEjr324YVsiD89I=
|
||||||
github.com/go-openapi/swag/conv v0.25.4/go.mod h1:3LXfie/lwoAv0NHoEuY1hjoFAYkvlqI/Bn5EQDD3PPU=
|
github.com/go-openapi/swag/conv v0.26.0/go.mod h1:tpAmIL7X58VPnHHiSO4uE3jBeRamGsFsfdDeDtb5ECE=
|
||||||
github.com/go-openapi/swag/fileutils v0.25.4 h1:2oI0XNW5y6UWZTC7vAxC8hmsK/tOkWXHJQH4lKjqw+Y=
|
github.com/go-openapi/swag/fileutils v0.26.0 h1:WJoPRvsA7QRiiWluowkLJa9jaYR7FCuxmDvnCgaRRxU=
|
||||||
github.com/go-openapi/swag/fileutils v0.25.4/go.mod h1:cdOT/PKbwcysVQ9Tpr0q20lQKH7MGhOEb6EwmHOirUk=
|
github.com/go-openapi/swag/fileutils v0.26.0/go.mod h1:0WDJ7lp67eNjPMO50wAWYlKvhOb6CQ37rzR7wrgI8Tc=
|
||||||
github.com/go-openapi/swag/jsonname v0.25.4 h1:bZH0+MsS03MbnwBXYhuTttMOqk+5KcQ9869Vye1bNHI=
|
github.com/go-openapi/swag/jsonname v0.26.0 h1:gV1NFX9M8avo0YSpmWogqfQISigCmpaiNci8cGECU5w=
|
||||||
github.com/go-openapi/swag/jsonname v0.25.4/go.mod h1:GPVEk9CWVhNvWhZgrnvRA6utbAltopbKwDu8mXNUMag=
|
github.com/go-openapi/swag/jsonname v0.26.0/go.mod h1:urBBR8bZNoDYGr653ynhIx+gTeIz0ARZxHkAPktJK2M=
|
||||||
github.com/go-openapi/swag/jsonutils v0.25.4 h1:VSchfbGhD4UTf4vCdR2F4TLBdLwHyUDTd1/q4i+jGZA=
|
github.com/go-openapi/swag/jsonutils v0.26.0 h1:FawFML2iAXsPqmERscuMPIHmFsoP1tOqWkxBaKNMsnA=
|
||||||
github.com/go-openapi/swag/jsonutils v0.25.4/go.mod h1:7OYGXpvVFPn4PpaSdPHJBtF0iGnbEaTk8AvBkoWnaAY=
|
github.com/go-openapi/swag/jsonutils v0.26.0/go.mod h1:2VmA0CJlyFqgawOaPI9psnjFDqzyivIqLYN34t9p91E=
|
||||||
github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4 h1:IACsSvBhiNJwlDix7wq39SS2Fh7lUOCJRmx/4SN4sVo=
|
github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.0 h1:apqeINu/ICHouqiRZbyFvuDge5jCmmLTqGQ9V95EaOM=
|
||||||
github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4/go.mod h1:Mt0Ost9l3cUzVv4OEZG+WSeoHwjWLnarzMePNDAOBiM=
|
github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.0/go.mod h1:AyM6QT8uz5IdKxk5akv0y6u4QvcL9GWERt0Jx/F/R8Y=
|
||||||
github.com/go-openapi/swag/loading v0.25.4 h1:jN4MvLj0X6yhCDduRsxDDw1aHe+ZWoLjW+9ZQWIKn2s=
|
github.com/go-openapi/swag/loading v0.26.0 h1:Apg6zaKhCJurpJer0DCxq99qwmhFddBhaMX7kilDcko=
|
||||||
github.com/go-openapi/swag/loading v0.25.4/go.mod h1:rpUM1ZiyEP9+mNLIQUdMiD7dCETXvkkC30z53i+ftTE=
|
github.com/go-openapi/swag/loading v0.26.0/go.mod h1:dBxQ/6V2uBaAQdevN18VELE6xSpJWZxLX4txe12JwDg=
|
||||||
github.com/go-openapi/swag/mangling v0.25.4 h1:2b9kBJk9JvPgxr36V23FxJLdwBrpijI26Bx5JH4Hp48=
|
github.com/go-openapi/swag/mangling v0.26.0 h1:Du2YC4YLA/Y5m/YKQd7AnY5qq0wRKSFZTTt8ktFaXcQ=
|
||||||
github.com/go-openapi/swag/mangling v0.25.4/go.mod h1:6dxwu6QyORHpIIApsdZgb6wBk/DPU15MdyYj/ikn0Hg=
|
github.com/go-openapi/swag/mangling v0.26.0/go.mod h1:jifS7W9vbg+pw63bT+GI53otluMQL3CeemuyCHKwVx0=
|
||||||
github.com/go-openapi/swag/netutils v0.25.4 h1:Gqe6K71bGRb3ZQLusdI8p/y1KLgV4M/k+/HzVSqT8H0=
|
github.com/go-openapi/swag/netutils v0.26.0 h1:CmZp+ZT7HrmFwrC3GdGsXBq2+42T1bjKBapcqVpIs3c=
|
||||||
github.com/go-openapi/swag/netutils v0.25.4/go.mod h1:m2W8dtdaoX7oj9rEttLyTeEFFEBvnAx9qHd5nJEBzYg=
|
github.com/go-openapi/swag/netutils v0.26.0/go.mod h1:5iK+Ok3ZohWWex1C50BFTPexi03UaPwjW4Oj8kgrpwo=
|
||||||
github.com/go-openapi/swag/stringutils v0.25.4 h1:O6dU1Rd8bej4HPA3/CLPciNBBDwZj9HiEpdVsb8B5A8=
|
github.com/go-openapi/swag/stringutils v0.26.0 h1:qZQngLxs5s7SLijc3N2ZO+fUq2o8LjuWAASSrJuh+xg=
|
||||||
github.com/go-openapi/swag/stringutils v0.25.4/go.mod h1:GTsRvhJW5xM5gkgiFe0fV3PUlFm0dr8vki6/VSRaZK0=
|
github.com/go-openapi/swag/stringutils v0.26.0/go.mod h1:sWn5uY+QIIspwPhvgnqJsH8xqFT2ZbYcvbcFanRyhFE=
|
||||||
github.com/go-openapi/swag/typeutils v0.25.4 h1:1/fbZOUN472NTc39zpa+YGHn3jzHWhv42wAJSN91wRw=
|
github.com/go-openapi/swag/typeutils v0.26.0 h1:2kdEwdiNWy+JJdOvu5MA2IIg2SylWAFuuyQIKYybfq4=
|
||||||
github.com/go-openapi/swag/typeutils v0.25.4/go.mod h1:Ou7g//Wx8tTLS9vG0UmzfCsjZjKhpjxayRKTHXf2pTE=
|
github.com/go-openapi/swag/typeutils v0.26.0/go.mod h1:oovDuIUvTrEHVMqWilQzKzV4YlSKgyZmFh7AlfABNVE=
|
||||||
github.com/go-openapi/swag/yamlutils v0.25.4 h1:6jdaeSItEUb7ioS9lFoCZ65Cne1/RZtPBZ9A56h92Sw=
|
github.com/go-openapi/swag/yamlutils v0.26.0 h1:H7O8l/8NJJQ/oiReEN+oMpnGMyt8G0hl460nRZxhLMQ=
|
||||||
github.com/go-openapi/swag/yamlutils v0.25.4/go.mod h1:MNzq1ulQu+yd8Kl7wPOut/YHAAU/H6hL91fF+E2RFwc=
|
github.com/go-openapi/swag/yamlutils v0.26.0/go.mod h1:1evKEGAtP37Pkwcc7EWMF0hedX0/x3Rkvei2wtG/TbU=
|
||||||
github.com/go-openapi/testify/enable/yaml/v2 v2.0.2 h1:0+Y41Pz1NkbTHz8NngxTuAXxEodtNSI1WG1c/m5Akw4=
|
github.com/go-openapi/testify/enable/yaml/v2 v2.4.2 h1:5zRca5jw7lzVREKCZVNBpysDNBjj74rBh0N2BGQbSR0=
|
||||||
github.com/go-openapi/testify/enable/yaml/v2 v2.0.2/go.mod h1:kme83333GCtJQHXQ8UKX3IBZu6z8T5Dvy5+CW3NLUUg=
|
github.com/go-openapi/testify/enable/yaml/v2 v2.4.2/go.mod h1:XVevPw5hUXuV+5AkI1u1PeAm27EQVrhXTTCPAF85LmE=
|
||||||
github.com/go-openapi/testify/v2 v2.0.2 h1:X999g3jeLcoY8qctY/c/Z8iBHTbwLz7R2WXd6Ub6wls=
|
github.com/go-openapi/testify/v2 v2.4.2 h1:tiByHpvE9uHrrKjOszax7ZvKB7QOgizBWGBLuq0ePx4=
|
||||||
github.com/go-openapi/testify/v2 v2.0.2/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54=
|
github.com/go-openapi/testify/v2 v2.4.2/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw=
|
||||||
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
|
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
|
||||||
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
|
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
|
||||||
github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
|
github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
|
||||||
@ -108,8 +108,6 @@ github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=
|
|||||||
github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
|
github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
|
||||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
||||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
||||||
github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
|
|
||||||
github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
|
|
||||||
github.com/google/cel-go v0.26.0 h1:DPGjXackMpJWH680oGY4lZhYjIameYmR+/6RBdDGmaI=
|
github.com/google/cel-go v0.26.0 h1:DPGjXackMpJWH680oGY4lZhYjIameYmR+/6RBdDGmaI=
|
||||||
github.com/google/cel-go v0.26.0/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM=
|
github.com/google/cel-go v0.26.0/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM=
|
||||||
github.com/google/gnostic-models v0.7.1 h1:SisTfuFKJSKM5CPZkffwi6coztzzeYUhc3v4yxLWH8c=
|
github.com/google/gnostic-models v0.7.1 h1:SisTfuFKJSKM5CPZkffwi6coztzzeYUhc3v4yxLWH8c=
|
||||||
@ -127,8 +125,8 @@ github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5T
|
|||||||
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA=
|
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA=
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 h1:B+8ClL/kCQkRiU82d9xajRPKYMrB7E0MbtzWVi1K4ns=
|
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 h1:B+8ClL/kCQkRiU82d9xajRPKYMrB7E0MbtzWVi1K4ns=
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3/go.mod h1:NbCUVmiS4foBGBHOYlCT25+YmGpJ32dZPi75pGEUpj4=
|
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3/go.mod h1:NbCUVmiS4foBGBHOYlCT25+YmGpJ32dZPi75pGEUpj4=
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww=
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 h1:X+2YciYSxvMQK0UZ7sg45ZVabVZBeBuvMkmuI2V3Fak=
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90=
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7/go.mod h1:lW34nIZuQ8UDPdkon5fmfp2l3+ZkQ2me/+oecHYLOII=
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||||
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||||
github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE=
|
github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE=
|
||||||
@ -141,8 +139,8 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
|||||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
github.com/kubernetes-csi/external-snapshotter/client/v8 v8.4.0 h1:bMqrb3UHgHbP+PW9VwiejfDJU1R0PpXVZNMdeH8WYKI=
|
github.com/kubernetes-csi/external-snapshotter/client/v8 v8.6.0 h1:FtGewu2k6HWw6evLGXY8JqUZ9eHpti1kd3e4amj+ilA=
|
||||||
github.com/kubernetes-csi/external-snapshotter/client/v8 v8.4.0/go.mod h1:E3vdYxHj2C2q6qo8/Da4g7P+IcwqRZyy3gJBzYybV9Y=
|
github.com/kubernetes-csi/external-snapshotter/client/v8 v8.6.0/go.mod h1:Vxl89NySJ45J+ah3NTMan/KJXW+NpcGHE2Tw0GSw53k=
|
||||||
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
|
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
|
||||||
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
||||||
github.com/lib/pq v1.12.3 h1:tTWxr2YLKwIvK90ZXEw8GP7UFHtcbTtty8zsI+YjrfQ=
|
github.com/lib/pq v1.12.3 h1:tTWxr2YLKwIvK90ZXEw8GP7UFHtcbTtty8zsI+YjrfQ=
|
||||||
@ -163,12 +161,10 @@ github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/
|
|||||||
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4=
|
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4=
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||||
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus=
|
github.com/onsi/ginkgo/v2 v2.32.0 h1:Hw7s2pVrQo/8Yz5N77qdnpHaoc+c6cC9WIV1Jce+J6E=
|
||||||
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
|
github.com/onsi/ginkgo/v2 v2.32.0/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44=
|
||||||
github.com/onsi/ginkgo/v2 v2.28.3 h1:4JvMdwtFU0imd8fHx25OJXoDMRexnf8v5NHKYSTTji4=
|
github.com/onsi/gomega v1.42.1 h1:iN1rCUX+44NZ1Dc97MPoeFYbFR0vh8zxoxMFwKdyZ6I=
|
||||||
github.com/onsi/ginkgo/v2 v2.28.3/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44=
|
github.com/onsi/gomega v1.42.1/go.mod h1:REff/hsDsodHoKlWsP2mAPhu1+5/6hVYNf9rIEBpeSg=
|
||||||
github.com/onsi/gomega v1.40.0 h1:Vtol0e1MghCD2ZVIilPDIg44XSL9l2QAn8ZNaljWcJc=
|
|
||||||
github.com/onsi/gomega v1.40.0/go.mod h1:M/Uqpu/8qTjtzCLUA2zJHX9Iilrau25x1PdoSRbWh5A=
|
|
||||||
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
|
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
|
||||||
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
|
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
@ -176,14 +172,14 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
|
|||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.87.1 h1:wyKanf+IFdbIqbDNYGt+f1dabLErLWtBaxd0KaAx4aM=
|
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.92.0 h1:cgcHnhpMbk86QzIe23vwUiIUNBB0kftdOA9JJA83ASA=
|
||||||
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.87.1/go.mod h1:WHiLZmOWVop/MoYvRD58LfnPeyE+dcITby/jQjg83Hw=
|
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.92.0/go.mod h1:eGo3VN8Kq5Fd0M7Cdx0oqbIxo753t99ojUZFVQkO1UM=
|
||||||
github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=
|
github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=
|
||||||
github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg=
|
github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg=
|
||||||
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
|
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
|
||||||
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
|
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
|
||||||
github.com/prometheus/common v0.67.4 h1:yR3NqWO1/UyO1w2PhUvXlGQs/PtFmoveVO0KZ4+Lvsc=
|
github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4=
|
||||||
github.com/prometheus/common v0.67.4/go.mod h1:gP0fq6YjjNCLssJCQp0yk4M8W6ikLURwkdd/YKtTbyI=
|
github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw=
|
||||||
github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws=
|
github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws=
|
||||||
github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw=
|
github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw=
|
||||||
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
|
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
|
||||||
@ -241,14 +237,14 @@ github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ=
|
|||||||
github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0=
|
github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0=
|
||||||
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
|
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
|
||||||
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
|
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg=
|
||||||
go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I=
|
go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I=
|
||||||
go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0=
|
go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 h1:QKdN8ly8zEMrByybbQgv8cWBcdAarwmIPZ6FThrWXJs=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0/go.mod h1:bTdK1nhqF76qiPoCCdyFIV+N/sRHYXYCTQc+3VCi3MI=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0 h1:DvJDOPmSWQHWywQS6lKL+pb8s3gBLOZUtw4N+mavW1I=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0/go.mod h1:EtekO9DEJb4/jRyN4v4Qjc2yA7AtfCBuz2FynRUWTXs=
|
||||||
go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM=
|
go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM=
|
||||||
go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY=
|
go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY=
|
||||||
go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg=
|
go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg=
|
||||||
@ -257,50 +253,50 @@ go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfC
|
|||||||
go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A=
|
go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A=
|
||||||
go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A=
|
go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A=
|
||||||
go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0=
|
go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0=
|
||||||
go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os=
|
go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A=
|
||||||
go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
|
go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4=
|
||||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||||
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
||||||
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
||||||
go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=
|
go.uber.org/zap v1.28.0 h1:IZzaP1Fv73/T/pBMLk4VutPl36uNC+OSUh3JLG3FIjo=
|
||||||
go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
|
go.uber.org/zap v1.28.0/go.mod h1:rDLpOi171uODNm/mxFcuYWxDsqWSAVkFdX4XojSKg/Q=
|
||||||
go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=
|
go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ=
|
||||||
go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8=
|
go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ=
|
||||||
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
|
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
|
||||||
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
|
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
|
||||||
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4=
|
golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 h1:fQsdNF2N+/YewlRZiricy4P1iimyPKZ/xwniHj8Q2a0=
|
||||||
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc=
|
golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU=
|
||||||
golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM=
|
golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4=
|
||||||
golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU=
|
golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ=
|
||||||
golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA=
|
golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o=
|
||||||
golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs=
|
golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec=
|
||||||
golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ=
|
golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs=
|
||||||
golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
|
golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q=
|
||||||
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
|
golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM=
|
||||||
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
|
golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
|
||||||
golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI=
|
golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs=
|
||||||
golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
|
golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
|
||||||
golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY=
|
golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc=
|
||||||
golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY=
|
golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y=
|
||||||
golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg=
|
golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE=
|
||||||
golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164=
|
golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4=
|
||||||
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
|
golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U=
|
||||||
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
|
golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno=
|
||||||
golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c=
|
golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8=
|
||||||
golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI=
|
golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0=
|
||||||
gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0=
|
gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0=
|
||||||
gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
|
gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
|
||||||
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
|
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
|
||||||
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
|
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409 h1:merA0rdPeUV3YIIfHHcH4qBkiQAc1nfCKSI7lB4cV2M=
|
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409/go.mod h1:fl8J1IvUjCilwZzQowmw2b7HQB2eAuYBabMXzWurF+I=
|
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478/go.mod h1:C6ADNqOxbgdUUeRTU+LCHDPB9ttAMCTff6auwCVa4uc=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20260319201613-d00831a3d3e7 h1:ndE4FoJqsIceKP2oYSnUZqhTdYufCYYkqwtFzfrhI7w=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad h1:45WmJvIV6C2+O/jjLkPUH+F3aOj/1miDoU2DD0+NWbg=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20260319201613-d00831a3d3e7/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
|
||||||
google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM=
|
google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE=
|
||||||
google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4=
|
google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA=
|
||||||
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
|
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI=
|
||||||
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
|
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
@ -312,30 +308,32 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
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.35.4 h1:P7nFYKl5vo9AGUp1Z+Pmd3p2tA7bX2wbFWCvDeRv988=
|
k8s.io/api v0.36.2 h1:TF6YDLIzKfccK7cq9YpTcGX8TJmEkHVRv78DM51fRYY=
|
||||||
k8s.io/api v0.35.4/go.mod h1:yl4lqySWOgYJJf9RERXKUwE9g2y+CkuwG+xmcOK8wXU=
|
k8s.io/api v0.36.2/go.mod h1:F4LbMO4brjZYh7yFkXWhynSvtB7YauxV4c+HHkNRGNg=
|
||||||
k8s.io/apiextensions-apiserver v0.35.4 h1:HeP+Upp7ItdvnyGmub0yoix+2z5+ev4M5cE5TCgtOUU=
|
k8s.io/apiextensions-apiserver v0.36.2 h1:3O5gqOj/dt2XWWbpMe+TXWpE9yU6pjM/tXxtHHJT/K4=
|
||||||
k8s.io/apiextensions-apiserver v0.35.4/go.mod h1:ogQlk+stIE8mnoRthSYCwlOS12fVqgWFiErMwPaXA7c=
|
k8s.io/apiextensions-apiserver v0.36.2/go.mod h1:cL1tBWe8XSaP1H30iWKGo7hf6iAUUUJPEU70dskmAnA=
|
||||||
k8s.io/apimachinery v0.35.4 h1:xtdom9RG7e+yDp71uoXoJDWEE2eOiHgeO4GdBzwWpds=
|
k8s.io/apimachinery v0.36.2 h1:0PE/W/WNy1UX61NLbXY5TMbJ6UwLL6E6lAPkYrKFxbQ=
|
||||||
k8s.io/apimachinery v0.35.4/go.mod h1:NNi1taPOpep0jOj+oRha3mBJPqvi0hGdaV8TCqGQ+cc=
|
k8s.io/apimachinery v0.36.2/go.mod h1:fvf/HOLXq9RId0rnDIbN1OEBvHXdQbLMM8nu0LcBUf4=
|
||||||
k8s.io/apiserver v0.35.4 h1:vtuFqNFmF9bPRdHDL2lpK6qCTPWDreZJL4LRPwVM6ho=
|
k8s.io/apiserver v0.36.2 h1:6vMnkmHZPeBloNkHUhmZYq7Ylv8WIB8xjyEl+eSt26E=
|
||||||
k8s.io/apiserver v0.35.4/go.mod h1:JnBcb+J8kFXKpZkgcbcUnPBBHi4qgBii1I7dLxFY/oo=
|
k8s.io/apiserver v0.36.2/go.mod h1:9PoQ2ikCytrZyZg11mGhLEF5m8Rgsb5FJmYJ4Wvnl1k=
|
||||||
k8s.io/client-go v0.35.4 h1:DN6fyaGuzK64UvnKO5fOA6ymSjvfGAnCAHAR0C66kD8=
|
k8s.io/client-go v0.36.2 h1:bfgxmFKc9CgqsgX4xKLAAdmTQlWee7Ob/HlDOrJ5TBI=
|
||||||
k8s.io/client-go v0.35.4/go.mod h1:2Pg9WpsS4NeOpoYTfHHfMxBG8zFMSAUi4O/qoiJC3nY=
|
k8s.io/client-go v0.36.2/go.mod h1:1vgO4OAlfPnoLcb+Rze2GF5rAr14w8qjrYMoyXJzQj0=
|
||||||
k8s.io/component-base v0.35.4 h1:6n1tNJ87johN0Hif0Fs8K2GMthsaUwMqCebUDLYyv7U=
|
k8s.io/component-base v0.36.2 h1:Z0VH80O7Ng0HDZnZj3WRR3urEGa0kTwmO8CwEwjVK1w=
|
||||||
k8s.io/component-base v0.35.4/go.mod h1:qaDJgz5c1KYKla9occFmlJEfPpkuA55s90G509R+PeY=
|
k8s.io/component-base v0.36.2/go.mod h1:mGfFOA7Gwpdm1VW2cwSQYbiDIlz8GD2WGwH88QSeCyA=
|
||||||
k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc=
|
k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc=
|
||||||
k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0=
|
k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0=
|
||||||
k8s.io/kube-openapi v0.0.0-20260127142750-a19766b6e2d4 h1:HhDfevmPS+OalTjQRKbTHppRIz01AWi8s45TMXStgYY=
|
k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 h1:mPMaPMpBij2V1Wv/fR+HW124vVGXXvOSS9ver/9yjWs=
|
||||||
k8s.io/kube-openapi v0.0.0-20260127142750-a19766b6e2d4/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ=
|
k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25/go.mod h1:V/QaCUYDa+0QpcHhVVc5l99Uz56wEMEXBSj9oCDkNDY=
|
||||||
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 h1:kBawHLSnx/mYHmRnNUf9d4CpjREbeZuxoSGOX/J+aYM=
|
k8s.io/streaming v0.36.2 h1:NSKthPPg9UFSKsRauVJUVGH2Dvn8fhKmY4qrMkw/p98=
|
||||||
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
|
k8s.io/streaming v0.36.2/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s=
|
||||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 h1:qPrZsv1cwQiFeieFlRqT627fVZ+tyfou/+S5S0H5ua0=
|
k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3 h1:jVkFFVfXdXP74B/zbO3hM3hpSFD0xvhQ5U686DPurkE=
|
||||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
|
k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3/go.mod h1:M2s5JB1lIYP3jzZdorPLHXIPJzt9vv2muW5a6L9DtNM=
|
||||||
sigs.k8s.io/controller-runtime v0.23.3 h1:VjB/vhoPoA9l1kEKZHBMnQF33tdCLQKJtydy4iqwZ80=
|
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 h1:hSfpvjjTQXQY2Fol2CS0QHMNs/WI1MOSGzCm1KhM5ec=
|
||||||
sigs.k8s.io/controller-runtime v0.23.3/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0=
|
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
|
||||||
sigs.k8s.io/gateway-api v1.5.0 h1:duoo14Ky/fJXpjpmyMISE2RTBGnfCg8zICfTYLTnBJA=
|
sigs.k8s.io/controller-runtime v0.24.1 h1:miPEwrmirImAvgME1L9qebGHrOnGJoVmVdtOU9fRfo4=
|
||||||
sigs.k8s.io/gateway-api v1.5.0/go.mod h1:GvCETiaMAlLym5CovLxGjS0NysqFk3+Yuq3/rh6QL2o=
|
sigs.k8s.io/controller-runtime v0.24.1/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw=
|
||||||
|
sigs.k8s.io/gateway-api v1.6.0 h1:735YBRj5NXFrOGX0GoSjwzUIzbz8kiEOfADsqHFmHgE=
|
||||||
|
sigs.k8s.io/gateway-api v1.6.0/go.mod h1:FVfx3t389ybeXOqvDghLbdvJdSCfI/PReqCUI3lu3mY=
|
||||||
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
|
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
|
||||||
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
|
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
|
||||||
sigs.k8s.io/kustomize/api v0.21.1 h1:lzqbzvz2CSvsjIUZUBNFKtIMsEw7hVLJp0JeSIVmuJs=
|
sigs.k8s.io/kustomize/api v0.21.1 h1:lzqbzvz2CSvsjIUZUBNFKtIMsEw7hVLJp0JeSIVmuJs=
|
||||||
@ -344,7 +342,7 @@ sigs.k8s.io/kustomize/kyaml v0.21.1 h1:IVlbmhC076nf6foyL6Taw4BkrLuEsXUXNpsE+ScX7
|
|||||||
sigs.k8s.io/kustomize/kyaml v0.21.1/go.mod h1:hmxADesM3yUN2vbA5z1/YTBnzLJ1dajdqpQonwBL1FQ=
|
sigs.k8s.io/kustomize/kyaml v0.21.1/go.mod h1:hmxADesM3yUN2vbA5z1/YTBnzLJ1dajdqpQonwBL1FQ=
|
||||||
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
|
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
|
||||||
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
|
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
|
||||||
sigs.k8s.io/structured-merge-diff/v6 v6.3.2 h1:kwVWMx5yS1CrnFWA/2QHyRVJ8jM6dBA80uLmm0wJkk8=
|
sigs.k8s.io/structured-merge-diff/v6 v6.4.0 h1:qmp2e3ZfFi1/jJbDGpD4mt3wyp6PE1NfKHCYLqgNQJo=
|
||||||
sigs.k8s.io/structured-merge-diff/v6 v6.3.2/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE=
|
sigs.k8s.io/structured-merge-diff/v6 v6.4.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE=
|
||||||
sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs=
|
sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs=
|
||||||
sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4=
|
sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4=
|
||||||
|
|||||||
36
hack/examples/cluster-replica-streaming.yaml
Normal file
36
hack/examples/cluster-replica-streaming.yaml
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: Cluster
|
||||||
|
metadata:
|
||||||
|
name: cluster-replica
|
||||||
|
spec:
|
||||||
|
instances: 3
|
||||||
|
bootstrap:
|
||||||
|
pg_basebackup:
|
||||||
|
source: source
|
||||||
|
replica:
|
||||||
|
enabled: true
|
||||||
|
source: source
|
||||||
|
externalClusters:
|
||||||
|
- name: source
|
||||||
|
connectionParameters:
|
||||||
|
host: cluster-example-rw.default.svc
|
||||||
|
user: streaming_replica
|
||||||
|
sslmode: verify-full
|
||||||
|
dbname: postgres
|
||||||
|
sslKey:
|
||||||
|
name: cluster-example-replication
|
||||||
|
key: tls.key
|
||||||
|
sslCert:
|
||||||
|
name: cluster-example-replication
|
||||||
|
key: tls.crt
|
||||||
|
sslRootCert:
|
||||||
|
name: cluster-example-ca
|
||||||
|
key: ca.crt
|
||||||
|
plugin:
|
||||||
|
name: barman-cloud.cloudnative-pg.io
|
||||||
|
parameters:
|
||||||
|
barmanObjectName: minio-store
|
||||||
|
serverName: cluster-example
|
||||||
|
storage:
|
||||||
|
size: 1Gi
|
||||||
|
|
||||||
@ -20,10 +20,38 @@ SPDX-License-Identifier: Apache-2.0
|
|||||||
package common
|
package common
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
barmanRestorer "github.com/cloudnative-pg/barman-cloud/pkg/restorer"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// classifyWALRestoreError maps an error returned by the WAL
|
||||||
|
// restorer to a gRPC-coded error so the caller can tell terminal
|
||||||
|
// failures apart from transient ones via the status code.
|
||||||
|
func classifyWALRestoreError(walName string, walErr error) error {
|
||||||
|
switch {
|
||||||
|
case errors.Is(walErr, barmanRestorer.ErrWALNotFound):
|
||||||
|
return newWALNotFoundError(walName)
|
||||||
|
case errors.Is(walErr, barmanRestorer.ErrInvalidWALName):
|
||||||
|
// A malformed WAL name will never become valid on retry.
|
||||||
|
return newInvalidWALNameError(walName, walErr)
|
||||||
|
case errors.Is(walErr, barmanRestorer.ErrConnectivity),
|
||||||
|
errors.Is(walErr, barmanRestorer.ErrGeneric):
|
||||||
|
// barman-cloud exit codes 2 (connectivity) and 4
|
||||||
|
// (generic) both surface conditions that are retryable
|
||||||
|
// in practice — barman uses the "generic" bucket for
|
||||||
|
// some connection-class failures too, not just exit 2.
|
||||||
|
return newUnavailableError(walName, walErr)
|
||||||
|
default:
|
||||||
|
// Unrecognized exit codes and unexpected failures (e.g.
|
||||||
|
// the barman-cloud command could not be executed). No
|
||||||
|
// positive signal that retry would help.
|
||||||
|
return newInternalWALRestoreError(walName, walErr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ErrEndOfWALStreamReached is returned when end of WAL is detected in the cloud archive.
|
// ErrEndOfWALStreamReached is returned when end of WAL is detected in the cloud archive.
|
||||||
var ErrEndOfWALStreamReached = status.Errorf(codes.OutOfRange, "end of WAL reached")
|
var ErrEndOfWALStreamReached = status.Errorf(codes.OutOfRange, "end of WAL reached")
|
||||||
|
|
||||||
@ -35,10 +63,48 @@ var ErrEndOfWALStreamReached = status.Errorf(codes.OutOfRange, "end of WAL reach
|
|||||||
var ErrMissingPermissions = status.Errorf(codes.FailedPrecondition,
|
var ErrMissingPermissions = status.Errorf(codes.FailedPrecondition,
|
||||||
"no permission to download the backup credentials, retrying")
|
"no permission to download the backup credentials, retrying")
|
||||||
|
|
||||||
// newWALNotFoundError returns a error that states that a
|
// newWALNotFoundError reports that the requested WAL file is not
|
||||||
// certain WAL file has not been found. This error is
|
// present in the object store. Emits codes.NotFound: this is a
|
||||||
// compatible with GRPC status codes, resulting in a 404
|
// terminal condition (the file won't appear on retry).
|
||||||
// being used as a response code.
|
|
||||||
func newWALNotFoundError(walName string) error {
|
func newWALNotFoundError(walName string) error {
|
||||||
return status.Errorf(codes.NotFound, "wal %q not found", walName)
|
return status.Errorf(codes.NotFound, "wal %q not found", walName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// newUnavailableError reports that downloading the WAL file failed
|
||||||
|
// for a reason expected to be transient (a barman-cloud connectivity
|
||||||
|
// blip, or a generic exit code that in practice covers retryable
|
||||||
|
// conditions too). Emits codes.Unavailable: per gRPC conventions,
|
||||||
|
// the canonical signal for "retry may succeed".
|
||||||
|
func newUnavailableError(walName string, err error) error {
|
||||||
|
return status.Errorf(
|
||||||
|
codes.Unavailable,
|
||||||
|
"transient error while downloading %q: %s",
|
||||||
|
walName,
|
||||||
|
err.Error(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// newInvalidWALNameError reports that the requested WAL name is
|
||||||
|
// not a valid name. Emits codes.InvalidArgument: this is a
|
||||||
|
// terminal condition (the same name won't become valid on retry).
|
||||||
|
func newInvalidWALNameError(walName string, err error) error {
|
||||||
|
return status.Errorf(
|
||||||
|
codes.InvalidArgument,
|
||||||
|
"invalid WAL name %q: %s",
|
||||||
|
walName,
|
||||||
|
err.Error(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// newInternalWALRestoreError reports that downloading the WAL
|
||||||
|
// file failed for an unclassified reason. Emits codes.Internal:
|
||||||
|
// we have no positive signal that retry would help, so by gRPC
|
||||||
|
// convention this is treated as terminal.
|
||||||
|
func newInternalWALRestoreError(walName string, err error) error {
|
||||||
|
return status.Errorf(
|
||||||
|
codes.Internal,
|
||||||
|
"internal error while downloading %q: %s",
|
||||||
|
walName,
|
||||||
|
err.Error(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|||||||
86
internal/cnpgi/common/errors_test.go
Normal file
86
internal/cnpgi/common/errors_test.go
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
Copyright © contributors to CloudNativePG, established as
|
||||||
|
CloudNativePG a Series of LF Projects, LLC.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package common
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
barmanRestorer "github.com/cloudnative-pg/barman-cloud/pkg/restorer"
|
||||||
|
. "github.com/onsi/ginkgo/v2"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
"google.golang.org/grpc/codes"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = Describe("classifyWALRestoreError", func() {
|
||||||
|
const walName = "000000010000000000000001"
|
||||||
|
|
||||||
|
DescribeTable(
|
||||||
|
"maps barman restorer sentinels to gRPC status codes",
|
||||||
|
func(walErr error, expectedCode codes.Code) {
|
||||||
|
got := classifyWALRestoreError(walName, walErr)
|
||||||
|
Expect(got).To(HaveOccurred())
|
||||||
|
|
||||||
|
st, ok := status.FromError(got)
|
||||||
|
Expect(ok).To(BeTrue(), "returned error must carry a gRPC status")
|
||||||
|
Expect(st.Code()).To(Equal(expectedCode))
|
||||||
|
Expect(st.Message()).To(ContainSubstring(walName))
|
||||||
|
},
|
||||||
|
Entry("ErrWALNotFound -> NotFound",
|
||||||
|
fmt.Errorf("object storage or file not found: %w", barmanRestorer.ErrWALNotFound),
|
||||||
|
codes.NotFound),
|
||||||
|
Entry("ErrInvalidWALName -> InvalidArgument",
|
||||||
|
fmt.Errorf("invalid name for a WAL file: %w", barmanRestorer.ErrInvalidWALName),
|
||||||
|
codes.InvalidArgument),
|
||||||
|
Entry("ErrConnectivity -> Unavailable",
|
||||||
|
fmt.Errorf("connectivity failure, retrying: %w", barmanRestorer.ErrConnectivity),
|
||||||
|
codes.Unavailable),
|
||||||
|
Entry("ErrGeneric -> Unavailable (barman uses exit 4 for some retryable cases too)",
|
||||||
|
fmt.Errorf("generic error: %w", barmanRestorer.ErrGeneric),
|
||||||
|
codes.Unavailable),
|
||||||
|
Entry("unknown error -> Internal",
|
||||||
|
errors.New("something we did not classify"),
|
||||||
|
codes.Internal),
|
||||||
|
)
|
||||||
|
|
||||||
|
It("matches the sentinel even through several wrapping layers", func() {
|
||||||
|
// The plugin wraps barman errors via fmt.Errorf("...: %w", ...);
|
||||||
|
// classification must keep working if more wraps appear above.
|
||||||
|
inner := fmt.Errorf("connectivity failure, retrying: %w", barmanRestorer.ErrConnectivity)
|
||||||
|
wrapped := fmt.Errorf("while restoring WAL %s: %w", walName, inner)
|
||||||
|
|
||||||
|
got := classifyWALRestoreError(walName, wrapped)
|
||||||
|
st, ok := status.FromError(got)
|
||||||
|
Expect(ok).To(BeTrue())
|
||||||
|
Expect(st.Code()).To(Equal(codes.Unavailable))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("treats ErrWALNotFound as terminal even when the error chain mentions other sentinels in its message", func() {
|
||||||
|
// Defensive: if the underlying error stringifies to something
|
||||||
|
// resembling another sentinel's message, the switch must still
|
||||||
|
// match by identity (errors.Is), not by substring.
|
||||||
|
walErr := fmt.Errorf("not found, looks like a connectivity failure: %w", barmanRestorer.ErrWALNotFound)
|
||||||
|
|
||||||
|
got := classifyWALRestoreError(walName, walErr)
|
||||||
|
st, _ := status.FromError(got)
|
||||||
|
Expect(st.Code()).To(Equal(codes.NotFound))
|
||||||
|
})
|
||||||
|
})
|
||||||
@ -25,11 +25,11 @@ import (
|
|||||||
cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1"
|
cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1"
|
||||||
"github.com/cloudnative-pg/machinery/pkg/log"
|
"github.com/cloudnative-pg/machinery/pkg/log"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||||
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
|
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
|
||||||
"sigs.k8s.io/controller-runtime/pkg/scheme"
|
|
||||||
|
|
||||||
barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1"
|
barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1"
|
||||||
)
|
)
|
||||||
@ -40,7 +40,7 @@ import (
|
|||||||
func GenerateScheme(ctx context.Context) *runtime.Scheme {
|
func GenerateScheme(ctx context.Context) *runtime.Scheme {
|
||||||
result := runtime.NewScheme()
|
result := runtime.NewScheme()
|
||||||
|
|
||||||
utilruntime.Must(barmancloudv1.AddToScheme(result))
|
barmancloudv1.AddKnownTypes(result)
|
||||||
utilruntime.Must(clientgoscheme.AddToScheme(result))
|
utilruntime.Must(clientgoscheme.AddToScheme(result))
|
||||||
|
|
||||||
cnpgGroup := viper.GetString("custom-cnpg-group")
|
cnpgGroup := viper.GetString("custom-cnpg-group")
|
||||||
@ -54,11 +54,12 @@ func GenerateScheme(ctx context.Context) *runtime.Scheme {
|
|||||||
|
|
||||||
// Proceed with custom registration of the CNPG scheme
|
// Proceed with custom registration of the CNPG scheme
|
||||||
schemeGroupVersion := schema.GroupVersion{Group: cnpgGroup, Version: cnpgVersion}
|
schemeGroupVersion := schema.GroupVersion{Group: cnpgGroup, Version: cnpgVersion}
|
||||||
schemeBuilder := &scheme.Builder{GroupVersion: schemeGroupVersion}
|
result.AddKnownTypes(schemeGroupVersion,
|
||||||
schemeBuilder.Register(&cnpgv1.Cluster{}, &cnpgv1.ClusterList{})
|
&cnpgv1.Cluster{}, &cnpgv1.ClusterList{},
|
||||||
schemeBuilder.Register(&cnpgv1.Backup{}, &cnpgv1.BackupList{})
|
&cnpgv1.Backup{}, &cnpgv1.BackupList{},
|
||||||
schemeBuilder.Register(&cnpgv1.ScheduledBackup{}, &cnpgv1.ScheduledBackupList{})
|
&cnpgv1.ScheduledBackup{}, &cnpgv1.ScheduledBackupList{},
|
||||||
utilruntime.Must(schemeBuilder.AddToScheme(result))
|
)
|
||||||
|
metav1.AddToGroupVersion(result, schemeGroupVersion)
|
||||||
|
|
||||||
schemeLog := log.FromContext(ctx)
|
schemeLog := log.FromContext(ctx)
|
||||||
schemeLog.Info("CNPG types registration", "schemeGroupVersion", schemeGroupVersion)
|
schemeLog.Info("CNPG types registration", "schemeGroupVersion", schemeGroupVersion)
|
||||||
|
|||||||
32
internal/cnpgi/common/suite_test.go
Normal file
32
internal/cnpgi/common/suite_test.go
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
Copyright © contributors to CloudNativePG, established as
|
||||||
|
CloudNativePG a Series of LF Projects, LLC.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package common
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
. "github.com/onsi/ginkgo/v2"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestCommon(t *testing.T) {
|
||||||
|
RegisterFailHandler(Fail)
|
||||||
|
RunSpecs(t, "Common Suite")
|
||||||
|
}
|
||||||
@ -27,6 +27,7 @@ import (
|
|||||||
"path"
|
"path"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
barmanapi "github.com/cloudnative-pg/barman-cloud/pkg/api"
|
||||||
"github.com/cloudnative-pg/barman-cloud/pkg/archiver"
|
"github.com/cloudnative-pg/barman-cloud/pkg/archiver"
|
||||||
barmanCommand "github.com/cloudnative-pg/barman-cloud/pkg/command"
|
barmanCommand "github.com/cloudnative-pg/barman-cloud/pkg/command"
|
||||||
barmanCredentials "github.com/cloudnative-pg/barman-cloud/pkg/credentials"
|
barmanCredentials "github.com/cloudnative-pg/barman-cloud/pkg/credentials"
|
||||||
@ -224,7 +225,6 @@ func (w WALServiceImplementation) Archive(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Restore implements the WALService interface
|
// Restore implements the WALService interface
|
||||||
// nolint: gocognit
|
|
||||||
func (w WALServiceImplementation) Restore(
|
func (w WALServiceImplementation) Restore(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
request *wal.WALRestoreRequest,
|
request *wal.WALRestoreRequest,
|
||||||
@ -239,36 +239,7 @@ func (w WALServiceImplementation) Restore(
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var serverName string
|
serverName, objectStoreKey := resolveRestoreObjectStore(configuration, w.InstanceName)
|
||||||
var objectStoreKey types.NamespacedName
|
|
||||||
|
|
||||||
var promotionToken string
|
|
||||||
if configuration.Cluster.Spec.ReplicaCluster != nil {
|
|
||||||
promotionToken = configuration.Cluster.Spec.ReplicaCluster.PromotionToken
|
|
||||||
}
|
|
||||||
|
|
||||||
switch {
|
|
||||||
case promotionToken != "" && configuration.Cluster.Status.LastPromotionToken != promotionToken:
|
|
||||||
// This is a replica cluster that is being promoted to a primary cluster
|
|
||||||
// Recover from the replica source object store
|
|
||||||
serverName = configuration.ReplicaSourceServerName
|
|
||||||
objectStoreKey = configuration.GetReplicaSourceBarmanObjectKey()
|
|
||||||
|
|
||||||
case configuration.Cluster.IsReplica() && configuration.Cluster.Status.CurrentPrimary == w.InstanceName:
|
|
||||||
// Designated primary on replica cluster, using replica source object store
|
|
||||||
serverName = configuration.ReplicaSourceServerName
|
|
||||||
objectStoreKey = configuration.GetReplicaSourceBarmanObjectKey()
|
|
||||||
|
|
||||||
case configuration.Cluster.Status.CurrentPrimary == "":
|
|
||||||
// Recovery from object store, using recovery object store
|
|
||||||
serverName = configuration.RecoveryServerName
|
|
||||||
objectStoreKey = configuration.GetRecoveryBarmanObjectKey()
|
|
||||||
|
|
||||||
default:
|
|
||||||
// Using cluster object store
|
|
||||||
serverName = configuration.ServerName
|
|
||||||
objectStoreKey = configuration.GetBarmanObjectKey()
|
|
||||||
}
|
|
||||||
|
|
||||||
var objectStore barmancloudv1.ObjectStore
|
var objectStore barmancloudv1.ObjectStore
|
||||||
if err := w.Client.Get(ctx, objectStoreKey, &objectStore); err != nil {
|
if err := w.Client.Get(ctx, objectStoreKey, &objectStore); err != nil {
|
||||||
@ -279,9 +250,38 @@ func (w WALServiceImplementation) Restore(
|
|||||||
"Restoring WAL file",
|
"Restoring WAL file",
|
||||||
"objectStore", objectStore.Name,
|
"objectStore", objectStore.Name,
|
||||||
"serverName", serverName,
|
"serverName", serverName,
|
||||||
"walName", walName)
|
"walName", walName,
|
||||||
|
"mode", request.GetMode())
|
||||||
return &wal.WALRestoreResult{}, w.restoreFromBarmanObjectStore(
|
return &wal.WALRestoreResult{}, w.restoreFromBarmanObjectStore(
|
||||||
ctx, configuration.Cluster, &objectStore, serverName, walName, destinationPath)
|
ctx, configuration.Cluster, &objectStore, serverName, walName, destinationPath,
|
||||||
|
request.GetMode() == wal.WALRestoreRequest_MODE_REWIND)
|
||||||
|
}
|
||||||
|
|
||||||
|
// resolveRestoreObjectStore selects the object store and server name to use when
|
||||||
|
// restoring a WAL file, based on the role this instance plays in the cluster.
|
||||||
|
func resolveRestoreObjectStore(
|
||||||
|
configuration *config.PluginConfiguration,
|
||||||
|
instanceName string,
|
||||||
|
) (serverName string, objectStoreKey types.NamespacedName) {
|
||||||
|
switch {
|
||||||
|
case configuration.Cluster.Status.CurrentPrimary == instanceName &&
|
||||||
|
len(configuration.ReplicaSourceBarmanObjectName) > 0:
|
||||||
|
// PostgreSQL never runs restore_command on a live primary; it runs only while
|
||||||
|
// the instance is in recovery (a genuine standby, restoring from a backup, or
|
||||||
|
// being rewound by pg_rewind). So a current primary that still has a replica
|
||||||
|
// source configured can only be a designated primary that has not finished
|
||||||
|
// promoting, and it must keep fetching WAL from the replica source.
|
||||||
|
// Token-agnostic: covers both switchover and failover.
|
||||||
|
return configuration.ReplicaSourceServerName, configuration.GetReplicaSourceBarmanObjectKey()
|
||||||
|
|
||||||
|
case configuration.Cluster.Status.CurrentPrimary == "":
|
||||||
|
// Recovery from object store, using recovery object store
|
||||||
|
return configuration.RecoveryServerName, configuration.GetRecoveryBarmanObjectKey()
|
||||||
|
|
||||||
|
default:
|
||||||
|
// Using cluster object store
|
||||||
|
return configuration.ServerName, configuration.GetBarmanObjectKey()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w WALServiceImplementation) restoreFromBarmanObjectStore(
|
func (w WALServiceImplementation) restoreFromBarmanObjectStore(
|
||||||
@ -291,6 +291,7 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore(
|
|||||||
serverName string,
|
serverName string,
|
||||||
walName string,
|
walName string,
|
||||||
destinationPath string,
|
destinationPath string,
|
||||||
|
rewindMode bool,
|
||||||
) error {
|
) error {
|
||||||
contextLogger := log.FromContext(ctx)
|
contextLogger := log.FromContext(ctx)
|
||||||
startTime := time.Now()
|
startTime := time.Now()
|
||||||
@ -322,6 +323,20 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore(
|
|||||||
return fmt.Errorf("while creating the restorer: %w", err)
|
return fmt.Errorf("while creating the restorer: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A flag left over from a normal-recovery invocation that ran before this pod
|
||||||
|
// was demoted must not survive into a pg_rewind restore: the flag machinery
|
||||||
|
// does not apply while restoring on behalf of pg_rewind (see
|
||||||
|
// shouldUseEndOfWALStreamFlag below), so it is never checked here, but left
|
||||||
|
// untouched it would resurface and wrongly abort the first normal-recovery
|
||||||
|
// invocation that runs once the rewind is done. This runs unconditionally,
|
||||||
|
// before the spool short-circuit in Step 1, so a request for a WAL file that
|
||||||
|
// happens to already be staged in the spool cannot skip the clear.
|
||||||
|
if rewindMode {
|
||||||
|
if err := clearEndOfWALStreamFlag(walRestorer); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Step 1: check if this WAL file is not already in the spool
|
// Step 1: check if this WAL file is not already in the spool
|
||||||
var wasInSpool bool
|
var wasInSpool bool
|
||||||
if wasInSpool, err = walRestorer.RestoreFromSpool(walName, destinationPath); err != nil {
|
if wasInSpool, err = walRestorer.RestoreFromSpool(walName, destinationPath); err != nil {
|
||||||
@ -334,8 +349,10 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore(
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// We skip this step if streaming connection is not available
|
// Step 2: return error if the end-of-wal-stream flag is set.
|
||||||
if isStreamingAvailable(cluster, w.InstanceName) {
|
// We skip this step if the flag machinery does not apply to this invocation
|
||||||
|
useEndOfWALStreamFlag := shouldUseEndOfWALStreamFlag(cluster, w.InstanceName, rewindMode)
|
||||||
|
if useEndOfWALStreamFlag {
|
||||||
if err := checkEndOfWALStreamFlag(walRestorer); err != nil {
|
if err := checkEndOfWALStreamFlag(walRestorer); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -343,10 +360,7 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore(
|
|||||||
|
|
||||||
// Step 3: gather the WAL files names to restore. If the required file isn't a regular WAL, we download it directly.
|
// Step 3: gather the WAL files names to restore. If the required file isn't a regular WAL, we download it directly.
|
||||||
var walFilesList []string
|
var walFilesList []string
|
||||||
maxParallel := 1
|
maxParallel := maxWALFilesPerInvocation(barmanConfiguration, rewindMode)
|
||||||
if barmanConfiguration.Wal != nil && barmanConfiguration.Wal.MaxParallel > 1 {
|
|
||||||
maxParallel = barmanConfiguration.Wal.MaxParallel
|
|
||||||
}
|
|
||||||
if IsWALFile(walName) {
|
if IsWALFile(walName) {
|
||||||
// If this is a regular WAL file, we try to prefetch
|
// If this is a regular WAL file, we try to prefetch
|
||||||
if walFilesList, err = gatherWALFilesToRestore(walName, maxParallel); err != nil {
|
if walFilesList, err = gatherWALFilesToRestore(walName, maxParallel); err != nil {
|
||||||
@ -365,16 +379,12 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore(
|
|||||||
// is the one that PostgreSQL has requested to restore.
|
// is the one that PostgreSQL has requested to restore.
|
||||||
// The failure has already been logged in walRestorer.RestoreList method
|
// The failure has already been logged in walRestorer.RestoreList method
|
||||||
if walStatus[0].Err != nil {
|
if walStatus[0].Err != nil {
|
||||||
if errors.Is(walStatus[0].Err, barmanRestorer.ErrWALNotFound) {
|
return classifyWALRestoreError(walStatus[0].WalName, walStatus[0].Err)
|
||||||
return newWALNotFoundError(walStatus[0].WalName)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return walStatus[0].Err
|
// We skip this step if the flag machinery does not apply to this invocation
|
||||||
}
|
|
||||||
|
|
||||||
// We skip this step if streaming connection is not available
|
|
||||||
endOfWALStream := isEndOfWALStream(walStatus)
|
endOfWALStream := isEndOfWALStream(walStatus)
|
||||||
if isStreamingAvailable(cluster, w.InstanceName) && endOfWALStream {
|
if useEndOfWALStreamFlag && endOfWALStream {
|
||||||
contextLogger.Info(
|
contextLogger.Info(
|
||||||
"Set end-of-wal-stream flag as one of the WAL files to be prefetched was not found")
|
"Set end-of-wal-stream flag as one of the WAL files to be prefetched was not found")
|
||||||
|
|
||||||
@ -422,6 +432,38 @@ func (w WALServiceImplementation) SetFirstRequired(
|
|||||||
panic("implement me")
|
panic("implement me")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// maxWALFilesPerInvocation returns how many WAL files a single restore
|
||||||
|
// invocation is allowed to fetch, the requested one included. Prefetching is
|
||||||
|
// disabled when restoring on behalf of pg_rewind, which walks the WAL
|
||||||
|
// backward: the following segments would never be requested, and past the end
|
||||||
|
// of the timeline they do not even exist
|
||||||
|
func maxWALFilesPerInvocation(barmanConfiguration *barmanapi.BarmanObjectStoreConfiguration, rewindMode bool) int {
|
||||||
|
if rewindMode {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if barmanConfiguration.Wal != nil && barmanConfiguration.Wal.MaxParallel > 1 {
|
||||||
|
return barmanConfiguration.Wal.MaxParallel
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// shouldUseEndOfWALStreamFlag returns true when the end-of-wal-stream flag
|
||||||
|
// machinery applies to the current invocation. The flag makes the following
|
||||||
|
// invocation fail, so that PostgreSQL stops polling the WAL archive and
|
||||||
|
// switches to streaming replication. It does not apply when no streaming
|
||||||
|
// connection is available, nor when restoring on behalf of pg_rewind:
|
||||||
|
// pg_rewind cannot fall back to streaming replication, and a stale flag would
|
||||||
|
// make it abort on a segment that is available in the archive
|
||||||
|
func shouldUseEndOfWALStreamFlag(cluster *cnpgv1.Cluster, podName string, rewindMode bool) bool {
|
||||||
|
if rewindMode {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return isStreamingAvailable(cluster, podName)
|
||||||
|
}
|
||||||
|
|
||||||
// isStreamingAvailable checks if this pod can replicate via streaming connection.
|
// isStreamingAvailable checks if this pod can replicate via streaming connection.
|
||||||
func isStreamingAvailable(cluster *cnpgv1.Cluster, podName string) bool {
|
func isStreamingAvailable(cluster *cnpgv1.Cluster, podName string) bool {
|
||||||
if cluster == nil {
|
if cluster == nil {
|
||||||
@ -498,6 +540,22 @@ func checkEndOfWALStreamFlag(walRestorer *barmanRestorer.WALRestorer) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// clearEndOfWALStreamFlag removes the end-of-wal-stream flag, if present, without
|
||||||
|
// treating it as an error. It is used instead of checkEndOfWALStreamFlag when
|
||||||
|
// restoring on behalf of pg_rewind, which must not abort on a flag it did not
|
||||||
|
// set itself.
|
||||||
|
func clearEndOfWALStreamFlag(walRestorer *barmanRestorer.WALRestorer) error {
|
||||||
|
contain, err := walRestorer.IsEndOfWALStream()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if contain {
|
||||||
|
return walRestorer.ResetEndOfWalStream()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// isEndOfWALStream returns true if one of the downloads has returned
|
// isEndOfWALStream returns true if one of the downloads has returned
|
||||||
// a file-not-found error.
|
// a file-not-found error.
|
||||||
func isEndOfWALStream(results []barmanRestorer.Result) bool {
|
func isEndOfWALStream(results []barmanRestorer.Result) bool {
|
||||||
|
|||||||
179
internal/cnpgi/common/wal_test.go
Normal file
179
internal/cnpgi/common/wal_test.go
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
/*
|
||||||
|
Copyright © contributors to CloudNativePG, established as
|
||||||
|
CloudNativePG a Series of LF Projects, LLC.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package common
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
barmanapi "github.com/cloudnative-pg/barman-cloud/pkg/api"
|
||||||
|
barmanRestorer "github.com/cloudnative-pg/barman-cloud/pkg/restorer"
|
||||||
|
cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1"
|
||||||
|
. "github.com/onsi/ginkgo/v2"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
|
||||||
|
"github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/operator/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = Describe("resolveRestoreObjectStore", func() {
|
||||||
|
const (
|
||||||
|
namespace = "test-ns"
|
||||||
|
instance = "cluster-1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// newConfig builds a PluginConfiguration with distinct, recognizable names
|
||||||
|
// for every candidate object store, so each test can assert exactly which
|
||||||
|
// one the routing selected.
|
||||||
|
newConfig := func(currentPrimary, replicaSourceObject string) *config.PluginConfiguration {
|
||||||
|
return &config.PluginConfiguration{
|
||||||
|
Cluster: &cnpgv1.Cluster{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Namespace: namespace},
|
||||||
|
Status: cnpgv1.ClusterStatus{CurrentPrimary: currentPrimary},
|
||||||
|
},
|
||||||
|
BarmanObjectName: "cluster-store",
|
||||||
|
ServerName: "cluster-server",
|
||||||
|
RecoveryBarmanObjectName: "recovery-store",
|
||||||
|
RecoveryServerName: "recovery-server",
|
||||||
|
ReplicaSourceBarmanObjectName: replicaSourceObject,
|
||||||
|
ReplicaSourceServerName: "replica-server",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DescribeTable(
|
||||||
|
"selects the correct object store for restoring WAL files",
|
||||||
|
func(cfg *config.PluginConfiguration, wantServer, wantObject string) {
|
||||||
|
gotServer, gotKey := resolveRestoreObjectStore(cfg, instance)
|
||||||
|
|
||||||
|
Expect(gotServer).To(Equal(wantServer))
|
||||||
|
Expect(gotKey.Name).To(Equal(wantObject))
|
||||||
|
Expect(gotKey.Namespace).To(Equal(namespace))
|
||||||
|
},
|
||||||
|
|
||||||
|
// The regression this guards: during a designated-primary promotion the
|
||||||
|
// instance is already the current primary while still in recovery, and it
|
||||||
|
// must pull remaining WALs from the replica source. The routing decision does
|
||||||
|
// not depend on the promotion token, so this single case covers both
|
||||||
|
// switchover and failover.
|
||||||
|
Entry("designated primary in promotion -> replica source",
|
||||||
|
newConfig(instance, "replica-store"),
|
||||||
|
"replica-server", "replica-store"),
|
||||||
|
|
||||||
|
// Guards the len(ReplicaSourceBarmanObjectName) > 0 gate: a current primary
|
||||||
|
// without a barman-backed replica source (plain HA primary, or a replica
|
||||||
|
// cluster whose source is streaming-only) must use the cluster store, not
|
||||||
|
// an empty-named replica source key.
|
||||||
|
Entry("current primary without a replica source -> cluster store",
|
||||||
|
newConfig(instance, ""),
|
||||||
|
"cluster-server", "cluster-store"),
|
||||||
|
|
||||||
|
// Bootstrap / PITR: no current primary yet. Recovery wins even if a replica
|
||||||
|
// source happens to be configured.
|
||||||
|
Entry("no current primary -> recovery store",
|
||||||
|
newConfig("", "replica-store"),
|
||||||
|
"recovery-server", "recovery-store"),
|
||||||
|
|
||||||
|
Entry("ordinary standby -> cluster store",
|
||||||
|
newConfig("cluster-2", ""),
|
||||||
|
"cluster-server", "cluster-store"),
|
||||||
|
|
||||||
|
// A non-primary instance must never route to the replica source, even when
|
||||||
|
// one is configured: only the designated primary catches up from the source.
|
||||||
|
Entry("standby in a replica cluster -> cluster store",
|
||||||
|
newConfig("cluster-2", "replica-store"),
|
||||||
|
"cluster-server", "cluster-store"),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
var _ = Describe("maxWALFilesPerInvocation", func() {
|
||||||
|
configWithMaxParallel := func(maxParallel int) *barmanapi.BarmanObjectStoreConfiguration {
|
||||||
|
return &barmanapi.BarmanObjectStoreConfiguration{
|
||||||
|
Wal: &barmanapi.WalBackupConfiguration{MaxParallel: maxParallel},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DescribeTable(
|
||||||
|
"computes how many WAL files a single invocation may fetch",
|
||||||
|
func(cfg *barmanapi.BarmanObjectStoreConfiguration, rewindMode bool, want int) {
|
||||||
|
Expect(maxWALFilesPerInvocation(cfg, rewindMode)).To(Equal(want))
|
||||||
|
},
|
||||||
|
|
||||||
|
Entry("no WAL configuration", &barmanapi.BarmanObjectStoreConfiguration{}, false, 1),
|
||||||
|
Entry("parallel restore configured", configWithMaxParallel(8), false, 8),
|
||||||
|
|
||||||
|
// pg_rewind walks the timeline backwards: prefetching must stay off no
|
||||||
|
// matter what the object store configuration asks for
|
||||||
|
Entry("rewind mode overrides the configured parallelism", configWithMaxParallel(8), true, 1),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
var _ = Describe("shouldUseEndOfWALStreamFlag", func() {
|
||||||
|
clusterWithPrimary := func(currentPrimary string) *cnpgv1.Cluster {
|
||||||
|
return &cnpgv1.Cluster{
|
||||||
|
Status: cnpgv1.ClusterStatus{CurrentPrimary: currentPrimary},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DescribeTable(
|
||||||
|
"decides whether the end-of-wal-stream flag machinery applies",
|
||||||
|
func(cluster *cnpgv1.Cluster, podName string, rewindMode bool, want bool) {
|
||||||
|
Expect(shouldUseEndOfWALStreamFlag(cluster, podName, rewindMode)).To(Equal(want))
|
||||||
|
},
|
||||||
|
|
||||||
|
Entry("replica with streaming available", clusterWithPrimary("cluster-1"), "cluster-2", false, true),
|
||||||
|
Entry("primary cannot stream from anyone", clusterWithPrimary("cluster-1"), "cluster-1", false, false),
|
||||||
|
|
||||||
|
// pg_rewind cannot fall back to streaming replication: the flag machinery
|
||||||
|
// must stay off even where a standby would use it
|
||||||
|
Entry("rewind mode wins over streaming availability", clusterWithPrimary("cluster-1"), "cluster-2", true, false),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
var _ = Describe("clearEndOfWALStreamFlag", func() {
|
||||||
|
newRestorer := func() *barmanRestorer.WALRestorer {
|
||||||
|
restorer, err := barmanRestorer.New(context.Background(), nil, GinkgoT().TempDir())
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
return restorer
|
||||||
|
}
|
||||||
|
|
||||||
|
It("is a no-op when the flag is not set", func() {
|
||||||
|
restorer := newRestorer()
|
||||||
|
|
||||||
|
Expect(clearEndOfWALStreamFlag(restorer)).To(Succeed())
|
||||||
|
|
||||||
|
isEOS, err := restorer.IsEndOfWALStream()
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(isEOS).To(BeFalse())
|
||||||
|
})
|
||||||
|
|
||||||
|
// Regression guard: a flag left over from a normal-recovery invocation that
|
||||||
|
// ran before this pod was demoted must not survive a pg_rewind restore, or
|
||||||
|
// it would resurface and wrongly abort the first normal-recovery invocation
|
||||||
|
// that runs once the rewind is done.
|
||||||
|
It("removes a pre-existing flag without returning an error", func() {
|
||||||
|
restorer := newRestorer()
|
||||||
|
Expect(restorer.SetEndOfWALStream()).To(Succeed())
|
||||||
|
|
||||||
|
Expect(clearEndOfWALStreamFlag(restorer)).To(Succeed())
|
||||||
|
|
||||||
|
isEOS, err := restorer.IsEndOfWALStream()
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(isEOS).To(BeFalse())
|
||||||
|
})
|
||||||
|
})
|
||||||
@ -39,7 +39,7 @@ var scheme = buildScheme()
|
|||||||
func buildScheme() *runtime.Scheme {
|
func buildScheme() *runtime.Scheme {
|
||||||
scheme := runtime.NewScheme()
|
scheme := runtime.NewScheme()
|
||||||
_ = corev1.AddToScheme(scheme)
|
_ = corev1.AddToScheme(scheme)
|
||||||
_ = barmancloudv1.AddToScheme(scheme)
|
barmancloudv1.AddKnownTypes(scheme)
|
||||||
|
|
||||||
return scheme
|
return scheme
|
||||||
}
|
}
|
||||||
|
|||||||
@ -55,7 +55,7 @@ var _ = Describe("Metrics Collect method", func() {
|
|||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
ctx = context.Background()
|
ctx = context.Background()
|
||||||
scheme := runtime.NewScheme()
|
scheme := runtime.NewScheme()
|
||||||
Expect(barmancloudv1.AddToScheme(scheme)).To(Succeed())
|
barmancloudv1.AddKnownTypes(scheme)
|
||||||
|
|
||||||
// Timestamps for the test
|
// Timestamps for the test
|
||||||
firstRecoverabilityPoint := metav1.NewTime(time.Now().Add(-24 * time.Hour))
|
firstRecoverabilityPoint := metav1.NewTime(time.Now().Add(-24 * time.Hour))
|
||||||
|
|||||||
@ -63,7 +63,7 @@ const (
|
|||||||
// Data is the metadata of this plugin.
|
// Data is the metadata of this plugin.
|
||||||
var Data = identity.GetPluginMetadataResponse{
|
var Data = identity.GetPluginMetadataResponse{
|
||||||
Name: PluginName,
|
Name: PluginName,
|
||||||
Version: "0.12.0", // x-release-please-version
|
Version: "0.13.0", // x-release-please-version
|
||||||
DisplayName: "BarmanCloudInstance",
|
DisplayName: "BarmanCloudInstance",
|
||||||
ProjectUrl: "https://github.com/cloudnative-pg/plugin-barman-cloud",
|
ProjectUrl: "https://github.com/cloudnative-pg/plugin-barman-cloud",
|
||||||
RepositoryUrl: "https://github.com/cloudnative-pg/plugin-barman-cloud",
|
RepositoryUrl: "https://github.com/cloudnative-pg/plugin-barman-cloud",
|
||||||
|
|||||||
@ -263,7 +263,9 @@ func getReplicaSourcePlugin(cluster *cnpgv1.Cluster) *cnpgv1.PluginConfiguration
|
|||||||
func (config *PluginConfiguration) Validate() error {
|
func (config *PluginConfiguration) Validate() error {
|
||||||
err := NewConfigurationError()
|
err := NewConfigurationError()
|
||||||
|
|
||||||
if len(config.BarmanObjectName) == 0 && len(config.RecoveryBarmanObjectName) == 0 {
|
if len(config.BarmanObjectName) == 0 &&
|
||||||
|
len(config.RecoveryBarmanObjectName) == 0 &&
|
||||||
|
len(config.ReplicaSourceBarmanObjectName) == 0 {
|
||||||
return err.WithMessage("no reference to barmanObjectName have been included")
|
return err.WithMessage("no reference to barmanObjectName have been included")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
126
internal/cnpgi/operator/config/config_test.go
Normal file
126
internal/cnpgi/operator/config/config_test.go
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
Copyright © contributors to CloudNativePG, established as
|
||||||
|
CloudNativePG a Series of LF Projects, LLC.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
|
||||||
|
. "github.com/onsi/ginkgo/v2"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
|
||||||
|
"github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/metadata"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = Describe("PluginConfiguration.Validate", func() {
|
||||||
|
It("fails when no barman object name is set", func() {
|
||||||
|
cfg := &PluginConfiguration{}
|
||||||
|
Expect(cfg.Validate()).To(HaveOccurred())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("passes when only BarmanObjectName is set (backup/archive)", func() {
|
||||||
|
cfg := &PluginConfiguration{BarmanObjectName: "my-store"}
|
||||||
|
Expect(cfg.Validate()).To(Succeed())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("passes when only RecoveryBarmanObjectName is set (recovery bootstrap)", func() {
|
||||||
|
cfg := &PluginConfiguration{RecoveryBarmanObjectName: "my-store"}
|
||||||
|
Expect(cfg.Validate()).To(Succeed())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("passes when only ReplicaSourceBarmanObjectName is set (pg_basebackup replica cluster)", func() {
|
||||||
|
cfg := &PluginConfiguration{ReplicaSourceBarmanObjectName: "my-store"}
|
||||||
|
Expect(cfg.Validate()).To(Succeed())
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
var _ = Describe("NewFromCluster", func() {
|
||||||
|
enabled := true
|
||||||
|
|
||||||
|
It("derives the replica source object store for a pg_basebackup replica cluster", func() {
|
||||||
|
cluster := &cnpgv1.Cluster{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "cluster-replica", Namespace: "test-ns"},
|
||||||
|
Spec: cnpgv1.ClusterSpec{
|
||||||
|
Bootstrap: &cnpgv1.BootstrapConfiguration{
|
||||||
|
PgBaseBackup: &cnpgv1.BootstrapPgBaseBackup{Source: "source"},
|
||||||
|
},
|
||||||
|
ReplicaCluster: &cnpgv1.ReplicaClusterConfiguration{
|
||||||
|
Enabled: &enabled,
|
||||||
|
Source: "source",
|
||||||
|
},
|
||||||
|
ExternalClusters: []cnpgv1.ExternalCluster{
|
||||||
|
{
|
||||||
|
Name: "source",
|
||||||
|
PluginConfiguration: &cnpgv1.PluginConfiguration{
|
||||||
|
Name: metadata.PluginName,
|
||||||
|
Parameters: map[string]string{
|
||||||
|
"barmanObjectName": "minio-store",
|
||||||
|
"serverName": "cluster-example",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := NewFromCluster(cluster)
|
||||||
|
|
||||||
|
// The replica source object store is derived from the external cluster plugin,
|
||||||
|
// while the backup/archive and recovery object stores remain empty: this is the
|
||||||
|
// distinguishing trait of a pg_basebackup replica cluster (a recovery-bootstrapped
|
||||||
|
// replica would also populate RecoveryBarmanObjectName).
|
||||||
|
Expect(cfg.ReplicaSourceBarmanObjectName).To(Equal("minio-store"))
|
||||||
|
Expect(cfg.ReplicaSourceServerName).To(Equal("cluster-example"))
|
||||||
|
Expect(cfg.BarmanObjectName).To(BeEmpty())
|
||||||
|
Expect(cfg.RecoveryBarmanObjectName).To(BeEmpty())
|
||||||
|
|
||||||
|
// Validate must accept it, otherwise the lifecycle hook skips sidecar injection.
|
||||||
|
Expect(cfg.Validate()).To(Succeed())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("ignores a replica source backed by a different plugin", func() {
|
||||||
|
cluster := &cnpgv1.Cluster{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "cluster-replica", Namespace: "test-ns"},
|
||||||
|
Spec: cnpgv1.ClusterSpec{
|
||||||
|
Bootstrap: &cnpgv1.BootstrapConfiguration{
|
||||||
|
PgBaseBackup: &cnpgv1.BootstrapPgBaseBackup{Source: "source"},
|
||||||
|
},
|
||||||
|
ReplicaCluster: &cnpgv1.ReplicaClusterConfiguration{
|
||||||
|
Enabled: &enabled,
|
||||||
|
Source: "source",
|
||||||
|
},
|
||||||
|
ExternalClusters: []cnpgv1.ExternalCluster{
|
||||||
|
{
|
||||||
|
Name: "source",
|
||||||
|
PluginConfiguration: &cnpgv1.PluginConfiguration{
|
||||||
|
Name: "some-other-plugin.cloudnative-pg.io",
|
||||||
|
Parameters: map[string]string{"barmanObjectName": "minio-store"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := NewFromCluster(cluster)
|
||||||
|
|
||||||
|
Expect(cfg.ReplicaSourceBarmanObjectName).To(BeEmpty())
|
||||||
|
Expect(cfg.Validate()).NotTo(Succeed())
|
||||||
|
})
|
||||||
|
})
|
||||||
32
internal/cnpgi/operator/config/suite_test.go
Normal file
32
internal/cnpgi/operator/config/suite_test.go
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
Copyright © contributors to CloudNativePG, established as
|
||||||
|
CloudNativePG a Series of LF Projects, LLC.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
. "github.com/onsi/ginkgo/v2"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestConfig(t *testing.T) {
|
||||||
|
RegisterFailHandler(Fail)
|
||||||
|
RunSpecs(t, "Config Suite")
|
||||||
|
}
|
||||||
@ -41,6 +41,9 @@ import (
|
|||||||
"github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/operator/config"
|
"github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/operator/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// fullRecoveryJobName is the name of the restore job.
|
||||||
|
const fullRecoveryJobName = "full-recovery"
|
||||||
|
|
||||||
// LifecycleImplementation is the implementation of the lifecycle handler
|
// LifecycleImplementation is the implementation of the lifecycle handler
|
||||||
type LifecycleImplementation struct {
|
type LifecycleImplementation struct {
|
||||||
lifecycle.UnimplementedOperatorLifecycleServer
|
lifecycle.UnimplementedOperatorLifecycleServer
|
||||||
@ -48,6 +51,8 @@ type LifecycleImplementation struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetCapabilities exposes the lifecycle capabilities
|
// GetCapabilities exposes the lifecycle capabilities
|
||||||
|
//
|
||||||
|
//nolint:goconst
|
||||||
func (impl LifecycleImplementation) GetCapabilities(
|
func (impl LifecycleImplementation) GetCapabilities(
|
||||||
_ context.Context,
|
_ context.Context,
|
||||||
_ *lifecycle.OperatorLifecycleCapabilitiesRequest,
|
_ *lifecycle.OperatorLifecycleCapabilitiesRequest,
|
||||||
@ -193,7 +198,7 @@ func reconcileJob(
|
|||||||
contextLogger.Debug("starting job reconciliation")
|
contextLogger.Debug("starting job reconciliation")
|
||||||
|
|
||||||
jobRole := getCNPGJobRole(&job)
|
jobRole := getCNPGJobRole(&job)
|
||||||
if jobRole != "full-recovery" &&
|
if jobRole != fullRecoveryJobName &&
|
||||||
jobRole != "snapshot-recovery" {
|
jobRole != "snapshot-recovery" {
|
||||||
contextLogger.Debug("job is not a recovery job, skipping")
|
contextLogger.Debug("job is not a recovery job, skipping")
|
||||||
return nil, nil
|
return nil, nil
|
||||||
@ -281,8 +286,10 @@ func (impl LifecycleImplementation) collectAdditionalInstanceArgs(
|
|||||||
return args
|
return args
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prefer the cluster object store (backup/archive). If not set, fallback to the recovery object store.
|
// Only one object store provides the sidecar arguments, with precedence:
|
||||||
// If neither is configured, no additional args are provided.
|
// BarmanObjectName (backup/archive) > RecoveryBarmanObjectName (recovery
|
||||||
|
// bootstrap) > ReplicaSourceBarmanObjectName (pg_basebackup replica).
|
||||||
|
// If none is configured, no additional args are provided.
|
||||||
if len(pluginConfiguration.BarmanObjectName) > 0 {
|
if len(pluginConfiguration.BarmanObjectName) > 0 {
|
||||||
var barmanObjectStore barmancloudv1.ObjectStore
|
var barmanObjectStore barmancloudv1.ObjectStore
|
||||||
if err := impl.Client.Get(ctx, pluginConfiguration.GetBarmanObjectKey(), &barmanObjectStore); err != nil {
|
if err := impl.Client.Get(ctx, pluginConfiguration.GetBarmanObjectKey(), &barmanObjectStore); err != nil {
|
||||||
@ -311,6 +318,20 @@ func (impl LifecycleImplementation) collectAdditionalInstanceArgs(
|
|||||||
return args, nil
|
return args, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(pluginConfiguration.ReplicaSourceBarmanObjectName) > 0 {
|
||||||
|
key := pluginConfiguration.GetReplicaSourceBarmanObjectKey()
|
||||||
|
var barmanObjectStore barmancloudv1.ObjectStore
|
||||||
|
if err := impl.Client.Get(ctx, key, &barmanObjectStore); err != nil {
|
||||||
|
return nil, fmt.Errorf("while getting replica source barman object store %s: %w", key.String(), err)
|
||||||
|
}
|
||||||
|
args := barmanObjectStore.Spec.InstanceSidecarConfiguration.AdditionalContainerArgs
|
||||||
|
args = append(
|
||||||
|
args,
|
||||||
|
collectTypedAdditionalArgs(&barmanObjectStore)...,
|
||||||
|
)
|
||||||
|
return args, nil
|
||||||
|
}
|
||||||
|
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -421,8 +442,9 @@ func reconcilePodSpec(
|
|||||||
envs = append(envs, config.env...)
|
envs = append(envs, config.env...)
|
||||||
|
|
||||||
baseProbe := &corev1.Probe{
|
baseProbe := &corev1.Probe{
|
||||||
FailureThreshold: 10,
|
PeriodSeconds: 1,
|
||||||
TimeoutSeconds: 10,
|
FailureThreshold: 30,
|
||||||
|
TimeoutSeconds: 5,
|
||||||
ProbeHandler: corev1.ProbeHandler{
|
ProbeHandler: corev1.ProbeHandler{
|
||||||
Exec: &corev1.ExecAction{
|
Exec: &corev1.ExecAction{
|
||||||
Command: []string{"/manager", "healthcheck", "unix"},
|
Command: []string{"/manager", "healthcheck", "unix"},
|
||||||
|
|||||||
@ -48,6 +48,9 @@ func (impl LifecycleImplementation) collectSidecarResourcesForPod(
|
|||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
configuration *config.PluginConfiguration,
|
configuration *config.PluginConfiguration,
|
||||||
) (corev1.ResourceRequirements, error) {
|
) (corev1.ResourceRequirements, error) {
|
||||||
|
// Only one object store provides the sidecar resources, with precedence:
|
||||||
|
// BarmanObjectName (backup/archive) > RecoveryBarmanObjectName (recovery
|
||||||
|
// bootstrap) > ReplicaSourceBarmanObjectName (pg_basebackup replica).
|
||||||
if len(configuration.BarmanObjectName) > 0 {
|
if len(configuration.BarmanObjectName) > 0 {
|
||||||
// On a replica cluster that also archives, the designated primary
|
// On a replica cluster that also archives, the designated primary
|
||||||
// will use both the replica source object store and the object store
|
// will use both the replica source object store and the object store
|
||||||
@ -64,10 +67,10 @@ func (impl LifecycleImplementation) collectSidecarResourcesForPod(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(configuration.RecoveryBarmanObjectName) > 0 {
|
if len(configuration.RecoveryBarmanObjectName) > 0 {
|
||||||
// On a replica cluster that doesn't archive, the designated primary
|
// On a cluster recovering from an object store (including log-shipping
|
||||||
// uses only the replica source object store.
|
// replica clusters, where the recovery and replica source object stores
|
||||||
// In this case, we use the replica source object store for configuring
|
// coincide), we use the recovery object store for configuring the
|
||||||
// the resources of the sidecar container.
|
// resources of the sidecar container.
|
||||||
var barmanObjectStore barmancloudv1.ObjectStore
|
var barmanObjectStore barmancloudv1.ObjectStore
|
||||||
if err := impl.Client.Get(ctx, configuration.GetRecoveryBarmanObjectKey(), &barmanObjectStore); err != nil {
|
if err := impl.Client.Get(ctx, configuration.GetRecoveryBarmanObjectKey(), &barmanObjectStore); err != nil {
|
||||||
return corev1.ResourceRequirements{}, err
|
return corev1.ResourceRequirements{}, err
|
||||||
@ -76,5 +79,18 @@ func (impl LifecycleImplementation) collectSidecarResourcesForPod(
|
|||||||
return barmanObjectStore.Spec.InstanceSidecarConfiguration.Resources, nil
|
return barmanObjectStore.Spec.InstanceSidecarConfiguration.Resources, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(configuration.ReplicaSourceBarmanObjectName) > 0 {
|
||||||
|
// On a replica cluster bootstrapped via pg_basebackup, the designated
|
||||||
|
// primary uses only the replica source object store.
|
||||||
|
// In this case, we use the replica source object store for configuring
|
||||||
|
// the resources of the sidecar container.
|
||||||
|
var barmanObjectStore barmancloudv1.ObjectStore
|
||||||
|
if err := impl.Client.Get(ctx, configuration.GetReplicaSourceBarmanObjectKey(), &barmanObjectStore); err != nil {
|
||||||
|
return corev1.ResourceRequirements{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return barmanObjectStore.Spec.InstanceSidecarConfiguration.Resources, nil
|
||||||
|
}
|
||||||
|
|
||||||
return corev1.ResourceRequirements{}, nil
|
return corev1.ResourceRequirements{}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,6 +29,7 @@ import (
|
|||||||
barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1"
|
barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1"
|
||||||
batchv1 "k8s.io/api/batch/v1"
|
batchv1 "k8s.io/api/batch/v1"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"sigs.k8s.io/controller-runtime/pkg/client/fake"
|
"sigs.k8s.io/controller-runtime/pkg/client/fake"
|
||||||
@ -56,7 +57,7 @@ var _ = Describe("LifecycleImplementation", func() {
|
|||||||
// helper to build a fake client with our scheme and optional objects
|
// helper to build a fake client with our scheme and optional objects
|
||||||
buildClientFunc := func(objs ...runtime.Object) *fake.ClientBuilder {
|
buildClientFunc := func(objs ...runtime.Object) *fake.ClientBuilder {
|
||||||
s := runtime.NewScheme()
|
s := runtime.NewScheme()
|
||||||
_ = barmancloudv1.AddToScheme(s)
|
barmancloudv1.AddKnownTypes(s)
|
||||||
return fake.NewClientBuilder().WithScheme(s).WithRuntimeObjects(objs...)
|
return fake.NewClientBuilder().WithScheme(s).WithRuntimeObjects(objs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -140,10 +141,10 @@ var _ = Describe("LifecycleImplementation", func() {
|
|||||||
Spec: batchv1.JobSpec{Template: corev1.PodTemplateSpec{
|
Spec: batchv1.JobSpec{Template: corev1.PodTemplateSpec{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Labels: map[string]string{
|
Labels: map[string]string{
|
||||||
utils.JobRoleLabelName: "full-recovery",
|
utils.JobRoleLabelName: fullRecoveryJobName,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "full-recovery"}}},
|
Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: fullRecoveryJobName}}},
|
||||||
}},
|
}},
|
||||||
}
|
}
|
||||||
jobJSON, _ := json.Marshal(job)
|
jobJSON, _ := json.Marshal(job)
|
||||||
@ -294,6 +295,24 @@ var _ = Describe("LifecycleImplementation", func() {
|
|||||||
Expect(args).To(Equal(recoveryArgs))
|
Expect(args).To(Equal(recoveryArgs))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("falls back to replica source object store when primary and recovery not set", func(ctx SpecContext) {
|
||||||
|
ns := "test-ns"
|
||||||
|
cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}}
|
||||||
|
pc := &config.PluginConfiguration{
|
||||||
|
Cluster: cluster,
|
||||||
|
ReplicaSourceBarmanObjectName: "replica-source-store",
|
||||||
|
}
|
||||||
|
replicaArgs := []string{"--replica-a", "--replica-b"}
|
||||||
|
cli := buildClientFunc(
|
||||||
|
makeStoreFunc(ns, pc.ReplicaSourceBarmanObjectName, replicaArgs),
|
||||||
|
).Build()
|
||||||
|
|
||||||
|
impl := LifecycleImplementation{Client: cli}
|
||||||
|
args, err := impl.collectAdditionalInstanceArgs(ctx, pc)
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Expect(args).To(Equal(replicaArgs))
|
||||||
|
})
|
||||||
|
|
||||||
It("returns nil when neither object name is configured", func(ctx SpecContext) {
|
It("returns nil when neither object name is configured", func(ctx SpecContext) {
|
||||||
ns := "test-ns"
|
ns := "test-ns"
|
||||||
cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}}
|
cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}}
|
||||||
@ -352,7 +371,7 @@ var _ = Describe("LifecycleImplementation", func() {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
s := runtime.NewScheme()
|
s := runtime.NewScheme()
|
||||||
_ = barmancloudv1.AddToScheme(s)
|
barmancloudv1.AddKnownTypes(s)
|
||||||
cli := fake.NewClientBuilder().WithScheme(s).WithRuntimeObjects(store).Build()
|
cli := fake.NewClientBuilder().WithScheme(s).WithRuntimeObjects(store).Build()
|
||||||
|
|
||||||
impl := LifecycleImplementation{Client: cli}
|
impl := LifecycleImplementation{Client: cli}
|
||||||
@ -379,7 +398,7 @@ var _ = Describe("LifecycleImplementation", func() {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
s := runtime.NewScheme()
|
s := runtime.NewScheme()
|
||||||
_ = barmancloudv1.AddToScheme(s)
|
barmancloudv1.AddKnownTypes(s)
|
||||||
cli := fake.NewClientBuilder().WithScheme(s).WithRuntimeObjects(store).Build()
|
cli := fake.NewClientBuilder().WithScheme(s).WithRuntimeObjects(store).Build()
|
||||||
|
|
||||||
impl := LifecycleImplementation{Client: cli}
|
impl := LifecycleImplementation{Client: cli}
|
||||||
@ -387,6 +406,117 @@ var _ = Describe("LifecycleImplementation", func() {
|
|||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(args).To(Equal([]string{"--log-level=info"}))
|
Expect(args).To(Equal([]string{"--log-level=info"}))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("includes --log-level from replica source object store when only replica source set", func(ctx SpecContext) {
|
||||||
|
ns := "test-ns"
|
||||||
|
cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}}
|
||||||
|
pc := &config.PluginConfiguration{
|
||||||
|
Cluster: cluster,
|
||||||
|
ReplicaSourceBarmanObjectName: "replica-source-store",
|
||||||
|
}
|
||||||
|
store := &barmancloudv1.ObjectStore{
|
||||||
|
TypeMeta: metav1.TypeMeta{Kind: "ObjectStore", APIVersion: barmancloudv1.GroupVersion.String()},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: pc.ReplicaSourceBarmanObjectName, Namespace: ns},
|
||||||
|
Spec: barmancloudv1.ObjectStoreSpec{
|
||||||
|
InstanceSidecarConfiguration: barmancloudv1.InstanceSidecarConfiguration{
|
||||||
|
LogLevel: "warning",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
s := runtime.NewScheme()
|
||||||
|
barmancloudv1.AddKnownTypes(s)
|
||||||
|
cli := fake.NewClientBuilder().WithScheme(s).WithRuntimeObjects(store).Build()
|
||||||
|
|
||||||
|
impl := LifecycleImplementation{Client: cli}
|
||||||
|
args, err := impl.collectAdditionalInstanceArgs(ctx, pc)
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Expect(args).To(Equal([]string{"--log-level=warning"}))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
Describe("collectSidecarResourcesForPod", func() {
|
||||||
|
makeStoreWithResourcesFunc := func(ns, name string, res corev1.ResourceRequirements) *barmancloudv1.ObjectStore {
|
||||||
|
return &barmancloudv1.ObjectStore{
|
||||||
|
TypeMeta: metav1.TypeMeta{Kind: "ObjectStore", APIVersion: barmancloudv1.GroupVersion.String()},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: ns},
|
||||||
|
Spec: barmancloudv1.ObjectStoreSpec{
|
||||||
|
InstanceSidecarConfiguration: barmancloudv1.InstanceSidecarConfiguration{
|
||||||
|
Resources: res,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
It("uses the cluster object store resources when set", func(ctx SpecContext) {
|
||||||
|
ns := "test-ns"
|
||||||
|
cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}}
|
||||||
|
pc := &config.PluginConfiguration{Cluster: cluster, BarmanObjectName: "primary-store"}
|
||||||
|
res := corev1.ResourceRequirements{
|
||||||
|
Requests: corev1.ResourceList{corev1.ResourceMemory: resource.MustParse("64Mi")},
|
||||||
|
}
|
||||||
|
cli := buildClientFunc(makeStoreWithResourcesFunc(ns, pc.BarmanObjectName, res)).Build()
|
||||||
|
|
||||||
|
impl := LifecycleImplementation{Client: cli}
|
||||||
|
got, err := impl.collectSidecarResourcesForPod(ctx, pc)
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
gotMem := got.Requests[corev1.ResourceMemory]
|
||||||
|
Expect(gotMem.String()).To(Equal("64Mi"))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("uses the recovery object store resources when only recovery is set", func(ctx SpecContext) {
|
||||||
|
ns := "test-ns"
|
||||||
|
cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}}
|
||||||
|
pc := &config.PluginConfiguration{Cluster: cluster, RecoveryBarmanObjectName: "recovery-store"}
|
||||||
|
res := corev1.ResourceRequirements{
|
||||||
|
Requests: corev1.ResourceList{corev1.ResourceMemory: resource.MustParse("128Mi")},
|
||||||
|
}
|
||||||
|
cli := buildClientFunc(makeStoreWithResourcesFunc(ns, pc.RecoveryBarmanObjectName, res)).Build()
|
||||||
|
|
||||||
|
impl := LifecycleImplementation{Client: cli}
|
||||||
|
got, err := impl.collectSidecarResourcesForPod(ctx, pc)
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
gotMem := got.Requests[corev1.ResourceMemory]
|
||||||
|
Expect(gotMem.String()).To(Equal("128Mi"))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("uses the replica source object store resources when only replica source is set", func(ctx SpecContext) {
|
||||||
|
ns := "test-ns"
|
||||||
|
cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}}
|
||||||
|
pc := &config.PluginConfiguration{Cluster: cluster, ReplicaSourceBarmanObjectName: "replica-source-store"}
|
||||||
|
res := corev1.ResourceRequirements{
|
||||||
|
Requests: corev1.ResourceList{corev1.ResourceMemory: resource.MustParse("256Mi")},
|
||||||
|
}
|
||||||
|
cli := buildClientFunc(makeStoreWithResourcesFunc(ns, pc.ReplicaSourceBarmanObjectName, res)).Build()
|
||||||
|
|
||||||
|
impl := LifecycleImplementation{Client: cli}
|
||||||
|
got, err := impl.collectSidecarResourcesForPod(ctx, pc)
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
gotMem := got.Requests[corev1.ResourceMemory]
|
||||||
|
Expect(gotMem.String()).To(Equal("256Mi"))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("returns empty resources when no object store is configured", func(ctx SpecContext) {
|
||||||
|
ns := "test-ns"
|
||||||
|
cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}}
|
||||||
|
pc := &config.PluginConfiguration{Cluster: cluster}
|
||||||
|
cli := buildClientFunc().Build()
|
||||||
|
|
||||||
|
impl := LifecycleImplementation{Client: cli}
|
||||||
|
got, err := impl.collectSidecarResourcesForPod(ctx, pc)
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Expect(got).To(Equal(corev1.ResourceRequirements{}))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("returns an error if the replica source object store cannot be retrieved", func(ctx SpecContext) {
|
||||||
|
ns := "test-ns"
|
||||||
|
cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}}
|
||||||
|
pc := &config.PluginConfiguration{Cluster: cluster, ReplicaSourceBarmanObjectName: "missing-store"}
|
||||||
|
cli := buildClientFunc().Build()
|
||||||
|
|
||||||
|
impl := LifecycleImplementation{Client: cli}
|
||||||
|
_, err := impl.collectSidecarResourcesForPod(ctx, pc)
|
||||||
|
Expect(err).To(HaveOccurred())
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
Describe("collectAzureWorkloadIdentityUsage", func() {
|
Describe("collectAzureWorkloadIdentityUsage", func() {
|
||||||
|
|||||||
@ -47,7 +47,7 @@ var scheme = runtime.NewScheme()
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
|
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
|
||||||
utilruntime.Must(barmancloudv1.AddToScheme(scheme))
|
barmancloudv1.AddKnownTypes(scheme)
|
||||||
// +kubebuilder:scaffold:scheme
|
// +kubebuilder:scaffold:scheme
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -83,7 +83,7 @@ func newScheme() *runtime.Scheme {
|
|||||||
s := runtime.NewScheme()
|
s := runtime.NewScheme()
|
||||||
utilruntime.Must(rbacv1.AddToScheme(s))
|
utilruntime.Must(rbacv1.AddToScheme(s))
|
||||||
utilruntime.Must(cnpgv1.AddToScheme(s))
|
utilruntime.Must(cnpgv1.AddToScheme(s))
|
||||||
utilruntime.Must(barmancloudv1.AddToScheme(s))
|
barmancloudv1.AddKnownTypes(s)
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -47,6 +47,8 @@ func BuildRole(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BuildRoleRules builds the RBAC PolicyRules for the given ObjectStores.
|
// BuildRoleRules builds the RBAC PolicyRules for the given ObjectStores.
|
||||||
|
//
|
||||||
|
//nolint:goconst
|
||||||
func BuildRoleRules(barmanObjects []barmancloudv1.ObjectStore) []rbacv1.PolicyRule {
|
func BuildRoleRules(barmanObjects []barmancloudv1.ObjectStore) []rbacv1.PolicyRule {
|
||||||
secretsSet := stringset.New()
|
secretsSet := stringset.New()
|
||||||
barmanObjectsSet := stringset.New()
|
barmanObjectsSet := stringset.New()
|
||||||
|
|||||||
@ -181,6 +181,9 @@ func (impl JobHookImpl) restoreDataDir(
|
|||||||
if backup.Status.EndpointURL != "" {
|
if backup.Status.EndpointURL != "" {
|
||||||
options = append(options, "--endpoint-url", backup.Status.EndpointURL)
|
options = append(options, "--endpoint-url", backup.Status.EndpointURL)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
options = barmanConfiguration.Data.AppendRestoreAdditionalCommandArgs(options)
|
||||||
|
|
||||||
options = append(options, backup.Status.DestinationPath)
|
options = append(options, backup.Status.DestinationPath)
|
||||||
options = append(options, backup.Status.ServerName)
|
options = append(options, backup.Status.ServerName)
|
||||||
options = append(options, backup.Status.BackupID)
|
options = append(options, backup.Status.BackupID)
|
||||||
|
|||||||
@ -46,7 +46,7 @@ import (
|
|||||||
func newFakeScheme() *runtime.Scheme {
|
func newFakeScheme() *runtime.Scheme {
|
||||||
s := runtime.NewScheme()
|
s := runtime.NewScheme()
|
||||||
utilruntime.Must(rbacv1.AddToScheme(s))
|
utilruntime.Must(rbacv1.AddToScheme(s))
|
||||||
utilruntime.Must(barmancloudv1.AddToScheme(s))
|
barmancloudv1.AddKnownTypes(s)
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -25,10 +25,9 @@ import (
|
|||||||
cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1"
|
cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1"
|
||||||
"github.com/cloudnative-pg/machinery/pkg/log"
|
"github.com/cloudnative-pg/machinery/pkg/log"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
|
||||||
crscheme "sigs.k8s.io/controller-runtime/pkg/scheme"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// AddCNPGToScheme registers CNPG types into the given scheme using
|
// AddCNPGToScheme registers CNPG types into the given scheme using
|
||||||
@ -46,11 +45,12 @@ func AddCNPGToScheme(ctx context.Context, s *runtime.Scheme) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
schemeGroupVersion := schema.GroupVersion{Group: cnpgGroup, Version: cnpgVersion}
|
schemeGroupVersion := schema.GroupVersion{Group: cnpgGroup, Version: cnpgVersion}
|
||||||
schemeBuilder := &crscheme.Builder{GroupVersion: schemeGroupVersion}
|
s.AddKnownTypes(schemeGroupVersion,
|
||||||
schemeBuilder.Register(&cnpgv1.Cluster{}, &cnpgv1.ClusterList{})
|
&cnpgv1.Cluster{}, &cnpgv1.ClusterList{},
|
||||||
schemeBuilder.Register(&cnpgv1.Backup{}, &cnpgv1.BackupList{})
|
&cnpgv1.Backup{}, &cnpgv1.BackupList{},
|
||||||
schemeBuilder.Register(&cnpgv1.ScheduledBackup{}, &cnpgv1.ScheduledBackupList{})
|
&cnpgv1.ScheduledBackup{}, &cnpgv1.ScheduledBackupList{},
|
||||||
utilruntime.Must(schemeBuilder.AddToScheme(s))
|
)
|
||||||
|
metav1.AddToGroupVersion(s, schemeGroupVersion)
|
||||||
|
|
||||||
log.FromContext(ctx).Info("CNPG types registration", "schemeGroupVersion", schemeGroupVersion)
|
log.FromContext(ctx).Info("CNPG types registration", "schemeGroupVersion", schemeGroupVersion)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1
|
|||||||
kind: CustomResourceDefinition
|
kind: CustomResourceDefinition
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
controller-gen.kubebuilder.io/version: v0.20.1
|
controller-gen.kubebuilder.io/version: v0.21.0
|
||||||
name: objectstores.barmancloud.cnpg.io
|
name: objectstores.barmancloud.cnpg.io
|
||||||
spec:
|
spec:
|
||||||
group: barmancloud.cnpg.io
|
group: barmancloud.cnpg.io
|
||||||
@ -175,6 +175,25 @@ spec:
|
|||||||
format: int32
|
format: int32
|
||||||
minimum: 1
|
minimum: 1
|
||||||
type: integer
|
type: integer
|
||||||
|
restoreAdditionalCommandArgs:
|
||||||
|
description: |-
|
||||||
|
Additional arguments that can be appended to the 'barman-cloud-restore'
|
||||||
|
command-line invocation. These arguments provide flexibility to customize
|
||||||
|
the data restore process further, according to specific requirements or
|
||||||
|
configurations.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
In a scenario where specialized restore options are required, such as setting
|
||||||
|
a specific read timeout or defining custom behavior, users can use this field
|
||||||
|
to specify additional command arguments.
|
||||||
|
|
||||||
|
Note:
|
||||||
|
It's essential to ensure that the provided arguments are valid and supported
|
||||||
|
by the 'barman-cloud-restore' command, to avoid potential errors or unintended
|
||||||
|
behavior during execution.
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
type: object
|
type: object
|
||||||
destinationPath:
|
destinationPath:
|
||||||
description: |-
|
description: |-
|
||||||
|
|||||||
@ -12,14 +12,14 @@
|
|||||||
rebaseWhen: 'never',
|
rebaseWhen: 'never',
|
||||||
prConcurrentLimit: 5,
|
prConcurrentLimit: 5,
|
||||||
// Override default ignorePaths to scan test/e2e for emulator image dependencies
|
// Override default ignorePaths to scan test/e2e for emulator image dependencies
|
||||||
// Removed: '**/test/**'
|
// Removed: '**/test/**', '**/tests/**' (this repo's e2e Ginkgo packages live
|
||||||
|
// under test/e2e/internal/tests/**, which the plural pattern was excluding)
|
||||||
ignorePaths: [
|
ignorePaths: [
|
||||||
'**/node_modules/**',
|
'**/node_modules/**',
|
||||||
'**/bower_components/**',
|
'**/bower_components/**',
|
||||||
'**/vendor/**',
|
'**/vendor/**',
|
||||||
'**/examples/**',
|
'**/examples/**',
|
||||||
'**/__tests__/**',
|
'**/__tests__/**',
|
||||||
'**/tests/**',
|
|
||||||
'**/__fixtures__/**',
|
'**/__fixtures__/**',
|
||||||
],
|
],
|
||||||
lockFileMaintenance: {
|
lockFileMaintenance: {
|
||||||
@ -53,6 +53,7 @@
|
|||||||
],
|
],
|
||||||
matchStrings: [
|
matchStrings: [
|
||||||
'//\\s*renovate:\\s*datasource=(?<datasource>[a-z-.]+?)\\s+depName=(?<depName>[^\\s]+?)(?:\\s+versioning=(?<versioning>[^\\s]+?))?\\s*\\n\\s*//\\s*Version:\\s*(?<currentValue>[^\\s]+?)\\s*\\n\\s*Image:\\s*"[^@]+@(?<currentDigest>sha256:[a-f0-9]+)"',
|
'//\\s*renovate:\\s*datasource=(?<datasource>[a-z-.]+?)\\s+depName=(?<depName>[^\\s]+?)(?:\\s+versioning=(?<versioning>[^\\s]+?))?\\s*\\n\\s*//\\s*Version:\\s*(?<currentValue>[^\\s]+?)\\s*\\n\\s*Image:\\s*"[^@]+@(?<currentDigest>sha256:[a-f0-9]+)"',
|
||||||
|
'//\\s*renovate:\\s*datasource=(?<datasource>[a-z-.]+?)\\s+depName=(?<depName>[^\\s]+?)(?:\\s+versioning=(?<versioning>[^\\s]+?))?\\s*\\n\\s*const\\s+\\w+\\s*=\\s*"(?<currentValue>[^"]+?)"',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@ -39,6 +39,7 @@ import (
|
|||||||
_ "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/tests/backup"
|
_ "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/tests/backup"
|
||||||
_ "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/tests/credentialrotation"
|
_ "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/tests/credentialrotation"
|
||||||
_ "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/tests/replicacluster"
|
_ "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/tests/replicacluster"
|
||||||
|
_ "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/tests/walrestore"
|
||||||
|
|
||||||
. "github.com/onsi/ginkgo/v2"
|
. "github.com/onsi/ginkgo/v2"
|
||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
|
|||||||
@ -55,10 +55,10 @@ func WithIgnoreExistingResources(ignore bool) InstallOption {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: renovate
|
|
||||||
|
|
||||||
// DefaultVersion is the default version of cert-manager to install.
|
// DefaultVersion is the default version of cert-manager to install.
|
||||||
const DefaultVersion = "v1.15.1"
|
//
|
||||||
|
// renovate: datasource=github-releases depName=cert-manager/cert-manager
|
||||||
|
const DefaultVersion = "v1.21.0"
|
||||||
|
|
||||||
// Install installs cert-manager using kubectl.
|
// Install installs cert-manager using kubectl.
|
||||||
func Install(ctx context.Context, cl client.Client, opts ...InstallOption) error {
|
func Install(ctx context.Context, cl client.Client, opts ...InstallOption) error {
|
||||||
|
|||||||
@ -91,12 +91,11 @@ func addScheme(cl client.Client) error {
|
|||||||
if err := certmanagerv1.AddToScheme(scheme); err != nil {
|
if err := certmanagerv1.AddToScheme(scheme); err != nil {
|
||||||
return fmt.Errorf("failed to add cert-manager/v1 to scheme: %w", err)
|
return fmt.Errorf("failed to add cert-manager/v1 to scheme: %w", err)
|
||||||
}
|
}
|
||||||
if err := pluginBarmanCloudV1.AddToScheme(scheme); err != nil {
|
|
||||||
return fmt.Errorf("failed to add plugin-barman-cloud/v1 to scheme: %w", err)
|
|
||||||
}
|
|
||||||
if err := cloudnativepgv1.AddToScheme(scheme); err != nil {
|
if err := cloudnativepgv1.AddToScheme(scheme); err != nil {
|
||||||
return fmt.Errorf("failed to add cloudnativepg/v1 to scheme: %w", err)
|
return fmt.Errorf("failed to add cloudnativepg/v1 to scheme: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pluginBarmanCloudV1.AddKnownTypes(scheme)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@ -97,9 +97,8 @@ func WithIgnoreExistingResources(ignore bool) SetupOption {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func defaultSetupOptions() SetupOptions {
|
func defaultSetupOptions() SetupOptions {
|
||||||
// TODO: renovate
|
|
||||||
return SetupOptions{
|
return SetupOptions{
|
||||||
CertManagerVersion: "v1.15.1",
|
CertManagerVersion: certmanager.DefaultVersion,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -72,8 +72,8 @@ func newAzuriteDeployment(namespace, name string) *appsv1.Deployment {
|
|||||||
{
|
{
|
||||||
Name: name,
|
Name: name,
|
||||||
// renovate: datasource=docker depName=mcr.microsoft.com/azure-storage/azurite versioning=docker
|
// renovate: datasource=docker depName=mcr.microsoft.com/azure-storage/azurite versioning=docker
|
||||||
// Version: 3.35.0
|
// Version: 3.36.0
|
||||||
Image: "mcr.microsoft.com/azure-storage/azurite@sha256:647c63a91102a9d8e8000aab803436e1fc85fbb285e7ce830a82ee5d6661cf37",
|
Image: "mcr.microsoft.com/azure-storage/azurite@sha256:37493d0f2e764467421ffe16eb3caa39277e5fa7f6adea18eb5bbfb3c5247f98",
|
||||||
Args: []string{
|
Args: []string{
|
||||||
"azurite-blob",
|
"azurite-blob",
|
||||||
"--blobHost",
|
"--blobHost",
|
||||||
|
|||||||
@ -72,8 +72,8 @@ func newGCSDeployment(namespace, name string) *appsv1.Deployment {
|
|||||||
{
|
{
|
||||||
Name: name,
|
Name: name,
|
||||||
// renovate: datasource=docker depName=fsouza/fake-gcs-server versioning=docker
|
// renovate: datasource=docker depName=fsouza/fake-gcs-server versioning=docker
|
||||||
// Version: 1.54.0
|
// Version: 1.55.1
|
||||||
Image: "fsouza/fake-gcs-server@sha256:3730da0e31f7e5186a90ec4899dc2c336104e7599df400411392ef17e684c31f",
|
Image: "fsouza/fake-gcs-server@sha256:91afded49de804aa61b5f3eb6c7cd65205acf9e5c5e047cf0ba7d9507af806c8",
|
||||||
Ports: []corev1.ContainerPort{
|
Ports: []corev1.ContainerPort{
|
||||||
{
|
{
|
||||||
ContainerPort: 4443,
|
ContainerPort: 4443,
|
||||||
|
|||||||
24
test/e2e/internal/tests/walrestore/doc.go
Normal file
24
test/e2e/internal/tests/walrestore/doc.go
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
Copyright © contributors to CloudNativePG, established as
|
||||||
|
CloudNativePG a Series of LF Projects, LLC.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Package walrestore contains the end-to-end test for the parallel WAL restore
|
||||||
|
// behaviour of the Barman Cloud Plugin: prefetching upcoming segments into the
|
||||||
|
// spool directory, serving later requests from the spool, and tracking the
|
||||||
|
// end-of-wal-stream sentinel.
|
||||||
|
package walrestore
|
||||||
178
test/e2e/internal/tests/walrestore/fixtures.go
Normal file
178
test/e2e/internal/tests/walrestore/fixtures.go
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
/*
|
||||||
|
Copyright © contributors to CloudNativePG, established as
|
||||||
|
CloudNativePG a Series of LF Projects, LLC.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package walrestore
|
||||||
|
|
||||||
|
import (
|
||||||
|
cloudnativepgv1 "github.com/cloudnative-pg/api/pkg/api/v1"
|
||||||
|
barmanapi "github.com/cloudnative-pg/barman-cloud/pkg/api"
|
||||||
|
appsv1 "k8s.io/api/apps/v1"
|
||||||
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/utils/ptr"
|
||||||
|
|
||||||
|
pluginBarmanCloudV1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1"
|
||||||
|
"github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/objectstore"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
minioName = "minio"
|
||||||
|
objectStoreName = "source"
|
||||||
|
clusterName = "source"
|
||||||
|
s3ClientName = "s3-client"
|
||||||
|
storageSize = "1Gi"
|
||||||
|
// walMaxParallel is the prefetch parallelism under test: for a regular WAL
|
||||||
|
// request the plugin restores the requested segment and prefetches the next
|
||||||
|
// ones, up to this many segments in total.
|
||||||
|
walMaxParallel = 3
|
||||||
|
)
|
||||||
|
|
||||||
|
// newObjectStoreResources returns the minio server Deployment/Service/Secret/PVC.
|
||||||
|
func newObjectStoreResources(namespace string) *objectstore.Resources {
|
||||||
|
return objectstore.NewMinioObjectStoreResources(namespace, minioName)
|
||||||
|
}
|
||||||
|
|
||||||
|
// newObjectStore returns a minio-backed ObjectStore configured with the WAL
|
||||||
|
// prefetch parallelism (maxParallel) under test. Archiving with gzip makes the
|
||||||
|
// archived segments carry the ".gz" suffix that forged segments are copied from.
|
||||||
|
func newObjectStore(namespace string) *pluginBarmanCloudV1.ObjectStore {
|
||||||
|
store := objectstore.NewMinioObjectStore(namespace, objectStoreName, minioName)
|
||||||
|
store.Spec.Configuration.Wal = &barmanapi.WalBackupConfiguration{
|
||||||
|
MaxParallel: walMaxParallel,
|
||||||
|
Compression: barmanapi.CompressionTypeGzip,
|
||||||
|
}
|
||||||
|
return store
|
||||||
|
}
|
||||||
|
|
||||||
|
// newCluster returns a 2-instance cluster that uses the plugin as its WAL
|
||||||
|
// archiver, so the standby drives WAL restore (and its prefetch/spool/
|
||||||
|
// end-of-wal-stream state machine) through the plugin.
|
||||||
|
func newCluster(namespace string) *cloudnativepgv1.Cluster {
|
||||||
|
return &cloudnativepgv1.Cluster{
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
Kind: "Cluster",
|
||||||
|
APIVersion: "postgresql.cnpg.io/v1",
|
||||||
|
},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: clusterName,
|
||||||
|
Namespace: namespace,
|
||||||
|
},
|
||||||
|
Spec: cloudnativepgv1.ClusterSpec{
|
||||||
|
Instances: 2,
|
||||||
|
ImagePullPolicy: corev1.PullAlways,
|
||||||
|
Plugins: []cloudnativepgv1.PluginConfiguration{
|
||||||
|
{
|
||||||
|
Name: "barman-cloud.cloudnative-pg.io",
|
||||||
|
Parameters: map[string]string{
|
||||||
|
"barmanObjectName": objectStoreName,
|
||||||
|
},
|
||||||
|
IsWALArchiver: ptr.To(true),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
PostgresConfiguration: cloudnativepgv1.PostgresConfiguration{
|
||||||
|
Parameters: map[string]string{
|
||||||
|
"log_min_messages": "DEBUG4",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
StorageConfiguration: cloudnativepgv1.StorageConfiguration{
|
||||||
|
Size: storageSize,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// newS3ClientDeployment returns a deployment running the AWS CLI configured to
|
||||||
|
// talk to the in-namespace minio service. The test execs `aws s3` commands in
|
||||||
|
// it to forge WAL segments on the object store and to check their presence.
|
||||||
|
func newS3ClientDeployment(namespace string) *appsv1.Deployment {
|
||||||
|
labels := map[string]string{"app": s3ClientName}
|
||||||
|
return &appsv1.Deployment{
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
Kind: "Deployment",
|
||||||
|
APIVersion: "apps/v1",
|
||||||
|
},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: s3ClientName,
|
||||||
|
Namespace: namespace,
|
||||||
|
},
|
||||||
|
Spec: appsv1.DeploymentSpec{
|
||||||
|
Replicas: ptr.To(int32(1)),
|
||||||
|
Selector: &metav1.LabelSelector{MatchLabels: labels},
|
||||||
|
Template: corev1.PodTemplateSpec{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Labels: labels},
|
||||||
|
Spec: corev1.PodSpec{
|
||||||
|
Containers: []corev1.Container{
|
||||||
|
{
|
||||||
|
Name: s3ClientName,
|
||||||
|
// renovate: datasource=docker depName=amazon/aws-cli versioning=docker
|
||||||
|
// Version: 2.36.3
|
||||||
|
Image: "docker.io/amazon/aws-cli@sha256:bdd02067a00c354684086071b475955c54caa7bd88b851aac99a51326fe19652",
|
||||||
|
Command: []string{"sleep", "infinity"},
|
||||||
|
Env: []corev1.EnvVar{
|
||||||
|
{
|
||||||
|
Name: "AWS_ENDPOINT_URL",
|
||||||
|
Value: "http://" + minioName + ":9000",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "AWS_ACCESS_KEY_ID",
|
||||||
|
ValueFrom: &corev1.EnvVarSource{
|
||||||
|
SecretKeyRef: &corev1.SecretKeySelector{
|
||||||
|
LocalObjectReference: corev1.LocalObjectReference{Name: minioName},
|
||||||
|
Key: "ACCESS_KEY_ID",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "AWS_SECRET_ACCESS_KEY",
|
||||||
|
ValueFrom: &corev1.EnvVarSource{
|
||||||
|
SecretKeyRef: &corev1.SecretKeySelector{
|
||||||
|
LocalObjectReference: corev1.LocalObjectReference{Name: minioName},
|
||||||
|
Key: "ACCESS_SECRET_KEY",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "AWS_DEFAULT_REGION",
|
||||||
|
Value: "us-east-1",
|
||||||
|
},
|
||||||
|
// The CRC-based default checksums introduced in AWS
|
||||||
|
// CLI 2.23 are not supported by every S3-compatible
|
||||||
|
// object store, minio included.
|
||||||
|
{
|
||||||
|
Name: "AWS_REQUEST_CHECKSUM_CALCULATION",
|
||||||
|
Value: "when_required",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "AWS_RESPONSE_CHECKSUM_VALIDATION",
|
||||||
|
Value: "when_required",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
SecurityContext: &corev1.SecurityContext{
|
||||||
|
AllowPrivilegeEscalation: ptr.To(false),
|
||||||
|
SeccompProfile: &corev1.SeccompProfile{
|
||||||
|
Type: corev1.SeccompProfileTypeRuntimeDefault,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
312
test/e2e/internal/tests/walrestore/walrestore.go
Normal file
312
test/e2e/internal/tests/walrestore/walrestore.go
Normal file
@ -0,0 +1,312 @@
|
|||||||
|
/*
|
||||||
|
Copyright © contributors to CloudNativePG, established as
|
||||||
|
CloudNativePG a Series of LF Projects, LLC.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package walrestore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
apitypes "k8s.io/apimachinery/pkg/types"
|
||||||
|
"k8s.io/client-go/kubernetes"
|
||||||
|
"k8s.io/client-go/rest"
|
||||||
|
executil "k8s.io/client-go/util/exec"
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||||
|
|
||||||
|
internalClient "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/client"
|
||||||
|
internalCluster "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/cluster"
|
||||||
|
"github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/command"
|
||||||
|
"github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/deployment"
|
||||||
|
nmsp "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/namespace"
|
||||||
|
|
||||||
|
. "github.com/onsi/ginkgo/v2"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// spoolDirectory is where the plugin sidecar prefetches WAL segments and
|
||||||
|
// records the end-of-wal-stream sentinel. It must match the SPOOL_DIRECTORY
|
||||||
|
// the operator injects on the sidecar (internal/cnpgi/operator/lifecycle.go),
|
||||||
|
// which lives on the CloudNativePG scratch-data volume shared with the
|
||||||
|
// postgres container, so the path is visible from the postgres container too.
|
||||||
|
spoolDirectory = "/controller/wal-restore-spool"
|
||||||
|
// pgWalPath is PgDataPath + "/pg_wal" in the CloudNativePG operand image.
|
||||||
|
pgWalPath = "/var/lib/postgresql/data/pgdata/pg_wal"
|
||||||
|
// endOfWALStreamFlag is the sentinel file the barman-cloud restorer writes in
|
||||||
|
// the spool to record that the archive ran out of segments.
|
||||||
|
endOfWALStreamFlag = "end-of-wal-stream"
|
||||||
|
// managerExecutable is the CloudNativePG instance manager. Its wal-restore
|
||||||
|
// subcommand delegates to the plugin when the cluster uses it as WAL archiver.
|
||||||
|
managerExecutable = "/controller/manager"
|
||||||
|
// postgresContainer is the container we exec into on instance pods.
|
||||||
|
postgresContainer = "postgres"
|
||||||
|
// walLogDir is the WALs subdirectory (timeline + log id) the forged segments
|
||||||
|
// live under; a freshly bootstrapped, idle cluster stays within it.
|
||||||
|
walLogDir = "0000000100000000"
|
||||||
|
// bucket is the destination bucket of the minio ObjectStore.
|
||||||
|
bucket = "backups"
|
||||||
|
)
|
||||||
|
|
||||||
|
// walFile returns the name of the n-th forged WAL segment (segment 0xF0+n on
|
||||||
|
// timeline 1, log 0, for n <= 15). The high segment number keeps it out of the
|
||||||
|
// range an idle PostgreSQL would archive on its own.
|
||||||
|
func walFile(n int) string {
|
||||||
|
return fmt.Sprintf("0000000100000000%08X", 0xF0+n)
|
||||||
|
}
|
||||||
|
|
||||||
|
// walObjectURI returns the s3 URI of a wals object (by file name) in the store.
|
||||||
|
func walObjectURI(name string) string {
|
||||||
|
return fmt.Sprintf("s3://%s/%s/wals/%s/%s", bucket, clusterName, walLogDir, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
// execInPod runs a command in the given container and returns stdout, stderr
|
||||||
|
// and the error (non-nil for a non-zero exit code).
|
||||||
|
func execInPod(
|
||||||
|
ctx context.Context,
|
||||||
|
clientSet *kubernetes.Clientset,
|
||||||
|
cfg *rest.Config,
|
||||||
|
namespace, pod, container string,
|
||||||
|
args ...string,
|
||||||
|
) (string, string, error) {
|
||||||
|
return command.ExecuteInContainer(
|
||||||
|
ctx,
|
||||||
|
*clientSet,
|
||||||
|
cfg,
|
||||||
|
command.ContainerLocator{
|
||||||
|
NamespaceName: namespace,
|
||||||
|
PodName: pod,
|
||||||
|
ContainerName: container,
|
||||||
|
},
|
||||||
|
nil,
|
||||||
|
args,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// This test drives the plugin's parallel WAL restore directly: it invokes the
|
||||||
|
// instance-manager wal-restore command on the standby (which delegates to the
|
||||||
|
// plugin) and asserts the prefetch/spool/end-of-wal-stream state machine with
|
||||||
|
// maxParallel = 3. To control the archive deterministically, it forges WAL
|
||||||
|
// segments on the object store by copying a real archived segment under new
|
||||||
|
// names.
|
||||||
|
var _ = Describe("Parallel WAL restore", func() {
|
||||||
|
var (
|
||||||
|
namespace *corev1.Namespace
|
||||||
|
cl client.Client
|
||||||
|
clientSet *kubernetes.Clientset
|
||||||
|
cfg *rest.Config
|
||||||
|
)
|
||||||
|
|
||||||
|
BeforeEach(func(ctx SpecContext) {
|
||||||
|
var err error
|
||||||
|
cl, _, err = internalClient.NewClient()
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
clientSet, cfg, err = internalClient.NewClientSet()
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
namespace, err = nmsp.CreateUniqueNamespace(ctx, cl, "wal-restore-parallel")
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
})
|
||||||
|
|
||||||
|
AfterEach(func(ctx SpecContext) {
|
||||||
|
Expect(cl.Delete(ctx, namespace)).To(Succeed())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("prefetches segments, serves them from the spool and tracks end-of-wal-stream",
|
||||||
|
func(ctx SpecContext) {
|
||||||
|
ns := namespace.Name
|
||||||
|
|
||||||
|
By("creating the object store backing resources")
|
||||||
|
Expect(newObjectStoreResources(ns).Create(ctx, cl)).To(Succeed())
|
||||||
|
|
||||||
|
By("creating the ObjectStore with WAL maxParallel")
|
||||||
|
Expect(cl.Create(ctx, newObjectStore(ns))).To(Succeed())
|
||||||
|
|
||||||
|
By("deploying the S3 client used to forge and inspect WAL segments")
|
||||||
|
Expect(cl.Create(ctx, newS3ClientDeployment(ns))).To(Succeed())
|
||||||
|
|
||||||
|
By("creating the cluster using the plugin as WAL archiver")
|
||||||
|
cluster := newCluster(ns)
|
||||||
|
Expect(cl.Create(ctx, cluster)).To(Succeed())
|
||||||
|
|
||||||
|
By("waiting for the cluster to become ready")
|
||||||
|
Eventually(func(g Gomega) {
|
||||||
|
g.Expect(cl.Get(ctx,
|
||||||
|
apitypes.NamespacedName{Name: clusterName, Namespace: ns},
|
||||||
|
cluster)).To(Succeed())
|
||||||
|
g.Expect(internalCluster.IsReady(*cluster)).To(BeTrue())
|
||||||
|
}).WithTimeout(10 * time.Minute).WithPolling(10 * time.Second).Should(Succeed())
|
||||||
|
|
||||||
|
By("waiting for the S3 client to become ready")
|
||||||
|
Eventually(func(g Gomega) {
|
||||||
|
ready, err := deployment.IsReady(ctx, cl,
|
||||||
|
apitypes.NamespacedName{Name: s3ClientName, Namespace: ns})
|
||||||
|
g.Expect(err).NotTo(HaveOccurred())
|
||||||
|
g.Expect(ready).To(BeTrue())
|
||||||
|
}).WithTimeout(2 * time.Minute).WithPolling(5 * time.Second).Should(Succeed())
|
||||||
|
|
||||||
|
primary := cluster.Status.CurrentPrimary
|
||||||
|
Expect(primary).NotTo(BeEmpty())
|
||||||
|
standby := clusterName + "-2"
|
||||||
|
|
||||||
|
var s3ClientPods corev1.PodList
|
||||||
|
Expect(cl.List(ctx, &s3ClientPods,
|
||||||
|
client.InNamespace(ns),
|
||||||
|
client.MatchingLabels{"app": s3ClientName})).To(Succeed())
|
||||||
|
Expect(s3ClientPods.Items).NotTo(BeEmpty())
|
||||||
|
s3Client := s3ClientPods.Items[0].Name
|
||||||
|
|
||||||
|
// Operations scoped to the fixed pods/clients, kept as closures so the
|
||||||
|
// step assertions below read like the original state-machine table.
|
||||||
|
restore := func(name string) error {
|
||||||
|
_, _, err := execInPod(ctx, clientSet, cfg, ns, standby, postgresContainer,
|
||||||
|
managerExecutable, "wal-restore", name, pgWalPath+"/"+name)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
existsIn := func(dir, name string) bool {
|
||||||
|
_, _, err := execInPod(ctx, clientSet, cfg, ns, standby, postgresContainer,
|
||||||
|
"test", "-f", dir+"/"+name)
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
flagSet := func() bool { return existsIn(spoolDirectory, endOfWALStreamFlag) }
|
||||||
|
spoolSegments := func() int {
|
||||||
|
out, _, _ := execInPod(ctx, clientSet, cfg, ns, standby, postgresContainer,
|
||||||
|
"sh", "-c",
|
||||||
|
"ls -1 "+spoolDirectory+" 2>/dev/null | grep -Ec '^[0-9A-F]{24}$' || true")
|
||||||
|
n, _ := strconv.Atoi(strings.TrimSpace(out))
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
purgeSpool := func() {
|
||||||
|
_, _, _ = execInPod(ctx, clientSet, cfg, ns, standby, postgresContainer,
|
||||||
|
"sh", "-c", "rm -f "+spoolDirectory+"/* 2>/dev/null; true")
|
||||||
|
}
|
||||||
|
forge := func(src, dst string) {
|
||||||
|
// ExecuteInContainer drops stdout/stderr on a non-zero exit, so on
|
||||||
|
// failure this only reports the exit code, not the aws CLI's error text.
|
||||||
|
_, _, err := execInPod(ctx, clientSet, cfg, ns, s3Client, s3ClientName,
|
||||||
|
"aws", "s3", "cp", walObjectURI(src), walObjectURI(dst))
|
||||||
|
Expect(err).NotTo(HaveOccurred(), "forging %s -> %s", src, dst)
|
||||||
|
}
|
||||||
|
objectExists := func(name string) bool {
|
||||||
|
out, _, err := execInPod(ctx, clientSet, cfg, ns, s3Client, s3ClientName,
|
||||||
|
"aws", "s3", "ls", walObjectURI(name))
|
||||||
|
return err == nil && strings.TrimSpace(out) != ""
|
||||||
|
}
|
||||||
|
|
||||||
|
By("archiving a real WAL on the primary and learning its name")
|
||||||
|
_, _, err := execInPod(ctx, clientSet, cfg, ns, primary, postgresContainer,
|
||||||
|
"psql", "-tAc", "CHECKPOINT")
|
||||||
|
Expect(err).NotTo(HaveOccurred(), "CHECKPOINT on the primary failed")
|
||||||
|
out, _, err := execInPod(ctx, clientSet, cfg, ns, primary, postgresContainer,
|
||||||
|
"psql", "-tAc", "SELECT pg_walfile_name(pg_switch_wal())")
|
||||||
|
Expect(err).NotTo(HaveOccurred(), "switching WAL on the primary failed")
|
||||||
|
latestWAL := strings.TrimSpace(out)
|
||||||
|
Expect(latestWAL).To(HavePrefix(walLogDir),
|
||||||
|
"the freshly bootstrapped cluster should still be on the first WAL log")
|
||||||
|
|
||||||
|
By("waiting for the archived WAL to land on the object store")
|
||||||
|
Eventually(func() bool {
|
||||||
|
return objectExists(latestWAL + ".gz")
|
||||||
|
}).WithTimeout(2 * time.Minute).WithPolling(5 * time.Second).Should(BeTrue())
|
||||||
|
|
||||||
|
By("forging WAL segments #1 to #5 from the archived WAL")
|
||||||
|
for n := 1; n <= 5; n++ {
|
||||||
|
forge(latestWAL+".gz", walFile(n))
|
||||||
|
}
|
||||||
|
|
||||||
|
By("ensuring the spool directory is empty on the standby")
|
||||||
|
purgeSpool()
|
||||||
|
|
||||||
|
// #1: served fresh; #2 and #3 prefetched into the spool; flag unset.
|
||||||
|
By("requesting WAL #1: #1 restored, #2 and #3 prefetched")
|
||||||
|
Expect(restore(walFile(1))).To(Succeed())
|
||||||
|
Eventually(func(g Gomega) {
|
||||||
|
g.Expect(existsIn(pgWalPath, walFile(1))).To(BeTrue(), "#1 in pg_wal")
|
||||||
|
g.Expect(existsIn(spoolDirectory, walFile(2))).To(BeTrue(), "#2 in spool")
|
||||||
|
g.Expect(existsIn(spoolDirectory, walFile(3))).To(BeTrue(), "#3 in spool")
|
||||||
|
g.Expect(flagSet()).To(BeFalse(), "end-of-wal-stream unset")
|
||||||
|
}).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed())
|
||||||
|
|
||||||
|
// #2: served from the spool; #3 stays prefetched; no new prefetch; flag unset.
|
||||||
|
By("requesting WAL #2: served from the spool, #3 still prefetched")
|
||||||
|
Expect(restore(walFile(2))).To(Succeed())
|
||||||
|
Eventually(func(g Gomega) {
|
||||||
|
g.Expect(existsIn(pgWalPath, walFile(2))).To(BeTrue(), "#2 in pg_wal")
|
||||||
|
g.Expect(existsIn(spoolDirectory, walFile(3))).To(BeTrue(), "#3 in spool")
|
||||||
|
g.Expect(flagSet()).To(BeFalse(), "end-of-wal-stream unset")
|
||||||
|
}).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed())
|
||||||
|
|
||||||
|
// #3: served from the spool; spool now empty; flag unset.
|
||||||
|
By("requesting WAL #3: served from the spool, spool now empty")
|
||||||
|
Expect(restore(walFile(3))).To(Succeed())
|
||||||
|
Eventually(func(g Gomega) {
|
||||||
|
g.Expect(existsIn(pgWalPath, walFile(3))).To(BeTrue(), "#3 in pg_wal")
|
||||||
|
g.Expect(spoolSegments()).To(Equal(0), "no WAL segments in spool")
|
||||||
|
g.Expect(flagSet()).To(BeFalse(), "end-of-wal-stream unset")
|
||||||
|
}).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed())
|
||||||
|
|
||||||
|
// #4: served fresh; #5 prefetched; #6 absent so end-of-wal-stream is set.
|
||||||
|
By("requesting WAL #4: #4 restored, #5 prefetched, end-of-wal-stream set")
|
||||||
|
Expect(restore(walFile(4))).To(Succeed())
|
||||||
|
Eventually(func(g Gomega) {
|
||||||
|
g.Expect(existsIn(pgWalPath, walFile(4))).To(BeTrue(), "#4 in pg_wal")
|
||||||
|
g.Expect(existsIn(spoolDirectory, walFile(5))).To(BeTrue(), "#5 in spool")
|
||||||
|
g.Expect(flagSet()).To(BeTrue(), "end-of-wal-stream set (#6 absent)")
|
||||||
|
}).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed())
|
||||||
|
|
||||||
|
By("forging WAL segment #6 on the object store")
|
||||||
|
forge(latestWAL+".gz", walFile(6))
|
||||||
|
|
||||||
|
// #5: served from the spool; flag untouched (served before it is checked).
|
||||||
|
By("requesting WAL #5: served from the spool, end-of-wal-stream still set")
|
||||||
|
Expect(restore(walFile(5))).To(Succeed())
|
||||||
|
Eventually(func(g Gomega) {
|
||||||
|
g.Expect(existsIn(pgWalPath, walFile(5))).To(BeTrue(), "#5 in pg_wal")
|
||||||
|
g.Expect(spoolSegments()).To(Equal(0), "no WAL segments in spool")
|
||||||
|
g.Expect(flagSet()).To(BeTrue(), "end-of-wal-stream still set")
|
||||||
|
}).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed())
|
||||||
|
|
||||||
|
// #6 (first): flag is set, so the request fails fast (exit 1) and the
|
||||||
|
// flag is consumed, leaving an empty spool.
|
||||||
|
By("requesting WAL #6: fails fast on the end-of-wal-stream flag, spool cleared")
|
||||||
|
restoreErr := restore(walFile(6))
|
||||||
|
var exitErr executil.CodeExitError
|
||||||
|
Expect(errors.As(restoreErr, &exitErr)).To(BeTrue(),
|
||||||
|
"expected a CodeExitError, got %T: %v", restoreErr, restoreErr)
|
||||||
|
Expect(exitErr.ExitStatus()).To(Equal(1), "exit code should be 1")
|
||||||
|
Eventually(func(g Gomega) {
|
||||||
|
g.Expect(existsIn(pgWalPath, walFile(6))).To(BeFalse(), "#6 not restored")
|
||||||
|
g.Expect(spoolSegments()).To(Equal(0), "no WAL segments in spool")
|
||||||
|
g.Expect(flagSet()).To(BeFalse(), "end-of-wal-stream consumed")
|
||||||
|
}).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed())
|
||||||
|
|
||||||
|
// #6 (second): now present, restored; #7 and #8 absent so the flag is
|
||||||
|
// set again.
|
||||||
|
By("requesting WAL #6 again: #6 restored, end-of-wal-stream set again")
|
||||||
|
Expect(restore(walFile(6))).To(Succeed())
|
||||||
|
Eventually(func(g Gomega) {
|
||||||
|
g.Expect(existsIn(pgWalPath, walFile(6))).To(BeTrue(), "#6 in pg_wal")
|
||||||
|
g.Expect(spoolSegments()).To(Equal(0), "no WAL segments in spool")
|
||||||
|
g.Expect(flagSet()).To(BeTrue(), "end-of-wal-stream set (#7/#8 absent)")
|
||||||
|
}).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed())
|
||||||
|
})
|
||||||
|
})
|
||||||
@ -43,7 +43,7 @@ as **tarballs** in the `base` directory, following the
|
|||||||
|
|
||||||
The plugin also offers advanced capabilities, including
|
The plugin also offers advanced capabilities, including
|
||||||
[backup tagging](misc.md#backup-object-tagging) and
|
[backup tagging](misc.md#backup-object-tagging) and
|
||||||
[extra options for backups and WAL archiving](misc.md#extra-options-for-backup-and-wal-archiving).
|
[extra options for backups and WAL archiving](misc.md#extra-options-for-backup-wal-archiving-and-restore).
|
||||||
|
|
||||||
:::tip
|
:::tip
|
||||||
For details, refer to the
|
For details, refer to the
|
||||||
|
|||||||
@ -32,17 +32,20 @@ spec:
|
|||||||
[...]
|
[...]
|
||||||
```
|
```
|
||||||
|
|
||||||
## Extra Options for Backup and WAL Archiving
|
## Extra Options for Backup, WAL Archiving, and Restore
|
||||||
|
|
||||||
You can pass additional command-line arguments to `barman-cloud-backup` and
|
You can pass additional command-line arguments to the underlying
|
||||||
`barman-cloud-wal-archive` using the `additionalCommandArgs` field in the
|
`barman-cloud-*` commands using the corresponding fields in the `ObjectStore`
|
||||||
`ObjectStore` configuration.
|
configuration.
|
||||||
|
|
||||||
- `.spec.configuration.data.additionalCommandArgs`: for `barman-cloud-backup`
|
- `.spec.configuration.data.additionalCommandArgs`: for `barman-cloud-backup`
|
||||||
|
- `.spec.configuration.data.restoreAdditionalCommandArgs`: for `barman-cloud-restore`
|
||||||
- `.spec.configuration.wal.archiveAdditionalCommandArgs`: for `barman-cloud-wal-archive`
|
- `.spec.configuration.wal.archiveAdditionalCommandArgs`: for `barman-cloud-wal-archive`
|
||||||
|
- `.spec.configuration.wal.restoreAdditionalCommandArgs`: for `barman-cloud-wal-restore`
|
||||||
|
|
||||||
Each field accepts a list of string arguments. If an argument is already
|
Each field accepts a list of string arguments. If an argument conflicts with
|
||||||
configured elsewhere in the plugin, the duplicate will be ignored.
|
one already set by the plugin, the user-provided value will be ignored. These
|
||||||
|
fields are intended to pass options the plugin does not configure automatically.
|
||||||
|
|
||||||
### Example: Extra Backup Options
|
### Example: Extra Backup Options
|
||||||
|
|
||||||
@ -58,6 +61,19 @@ spec:
|
|||||||
- "--read-timeout=60"
|
- "--read-timeout=60"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Example: Extra Restore Options
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: my-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
data:
|
||||||
|
restoreAdditionalCommandArgs:
|
||||||
|
- "--read-timeout=900"
|
||||||
|
```
|
||||||
|
|
||||||
### Example: Extra WAL Archive Options
|
### Example: Extra WAL Archive Options
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
@ -72,6 +88,19 @@ spec:
|
|||||||
- "--read-timeout=60"
|
- "--read-timeout=60"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Example: Extra WAL Restore Options
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: my-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
wal:
|
||||||
|
restoreAdditionalCommandArgs:
|
||||||
|
- "--read-timeout=60"
|
||||||
|
```
|
||||||
|
|
||||||
For a complete list of supported options, refer to the
|
For a complete list of supported options, refer to the
|
||||||
[official Barman Cloud documentation](https://docs.pgbarman.org/release/latest/).
|
[official Barman Cloud documentation](https://docs.pgbarman.org/release/latest/).
|
||||||
|
|
||||||
|
|||||||
@ -46,7 +46,7 @@ spec:
|
|||||||
|
|
||||||
The `.spec.configuration` schema follows the same format as the
|
The `.spec.configuration` schema follows the same format as the
|
||||||
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
||||||
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/preview/backup_barmanobjectstore/)
|
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/)
|
||||||
for additional details.
|
for additional details.
|
||||||
|
|
||||||
:::important
|
:::important
|
||||||
|
|||||||
@ -21,7 +21,12 @@ const config: Config = {
|
|||||||
deploymentBranch: 'gh-pages',
|
deploymentBranch: 'gh-pages',
|
||||||
|
|
||||||
onBrokenLinks: 'throw',
|
onBrokenLinks: 'throw',
|
||||||
|
|
||||||
|
markdown: {
|
||||||
|
hooks: {
|
||||||
onBrokenMarkdownLinks: 'throw',
|
onBrokenMarkdownLinks: 'throw',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
// Even if you don't use internationalization, you can use this field to set
|
// Even if you don't use internationalization, you can use this field to set
|
||||||
// useful metadata like html lang. For example, if your site is Chinese, you
|
// useful metadata like html lang. For example, if your site is Chinese, you
|
||||||
|
|||||||
@ -15,8 +15,8 @@
|
|||||||
"typecheck": "tsc"
|
"typecheck": "tsc"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@docusaurus/core": "3.10.0",
|
"@docusaurus/core": "3.10.2",
|
||||||
"@docusaurus/preset-classic": "3.10.0",
|
"@docusaurus/preset-classic": "3.10.2",
|
||||||
"@easyops-cn/docusaurus-search-local": "^0.55.0",
|
"@easyops-cn/docusaurus-search-local": "^0.55.0",
|
||||||
"@mdx-js/react": "^3.0.0",
|
"@mdx-js/react": "^3.0.0",
|
||||||
"clsx": "^2.0.0",
|
"clsx": "^2.0.0",
|
||||||
@ -25,10 +25,10 @@
|
|||||||
"react-dom": "^19.0.0"
|
"react-dom": "^19.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@docusaurus/module-type-aliases": "3.10.0",
|
"@docusaurus/module-type-aliases": "3.10.2",
|
||||||
"@docusaurus/tsconfig": "3.10.0",
|
"@docusaurus/tsconfig": "3.10.2",
|
||||||
"@docusaurus/types": "3.10.0",
|
"@docusaurus/types": "3.10.2",
|
||||||
"typescript": "~6.0.0"
|
"typescript": "~7.0.0"
|
||||||
},
|
},
|
||||||
"browserslist": {
|
"browserslist": {
|
||||||
"production": [
|
"production": [
|
||||||
@ -47,6 +47,7 @@
|
|||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"webpackbar": "^7.0.0",
|
"webpackbar": "^7.0.0",
|
||||||
"serialize-javascript": ">=7.0.5"
|
"serialize-javascript": ">=7.0.5",
|
||||||
|
"uuid": ">=11.1.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -46,7 +46,7 @@ spec:
|
|||||||
|
|
||||||
The `.spec.configuration` schema follows the same format as the
|
The `.spec.configuration` schema follows the same format as the
|
||||||
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
||||||
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/preview/backup_barmanobjectstore/)
|
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/)
|
||||||
for additional details.
|
for additional details.
|
||||||
|
|
||||||
:::important
|
:::important
|
||||||
|
|||||||
@ -46,7 +46,7 @@ spec:
|
|||||||
|
|
||||||
The `.spec.configuration` schema follows the same format as the
|
The `.spec.configuration` schema follows the same format as the
|
||||||
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
||||||
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/preview/backup_barmanobjectstore/)
|
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/)
|
||||||
for additional details.
|
for additional details.
|
||||||
|
|
||||||
:::important
|
:::important
|
||||||
|
|||||||
@ -46,7 +46,7 @@ spec:
|
|||||||
|
|
||||||
The `.spec.configuration` schema follows the same format as the
|
The `.spec.configuration` schema follows the same format as the
|
||||||
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
||||||
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/preview/backup_barmanobjectstore/)
|
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/)
|
||||||
for additional details.
|
for additional details.
|
||||||
|
|
||||||
:::important
|
:::important
|
||||||
|
|||||||
45
web/versioned_docs/version-0.13.0/compression.md
Normal file
45
web/versioned_docs/version-0.13.0/compression.md
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 80
|
||||||
|
---
|
||||||
|
|
||||||
|
# Compression
|
||||||
|
|
||||||
|
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
||||||
|
|
||||||
|
By default, backups and WAL files are archived **uncompressed**. However, the
|
||||||
|
Barman Cloud Plugin supports multiple compression algorithms via
|
||||||
|
`barman-cloud-backup` and `barman-cloud-wal-archive`, allowing you to optimize
|
||||||
|
for space, speed, or a balance of both.
|
||||||
|
|
||||||
|
### Supported Compression Algorithms
|
||||||
|
|
||||||
|
- `bzip2`
|
||||||
|
- `gzip`
|
||||||
|
- `lz4`
|
||||||
|
- `snappy`
|
||||||
|
- `xz` (WAL only)
|
||||||
|
- `zstd` (WAL only)
|
||||||
|
|
||||||
|
Compression settings for base backups and WAL archives are configured
|
||||||
|
independently. For implementation details, refer to the corresponding API
|
||||||
|
definitions:
|
||||||
|
|
||||||
|
- [`DataBackupConfiguration`](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#DataBackupConfiguration)
|
||||||
|
- [`WALBackupConfiguration`](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#WalBackupConfiguration)
|
||||||
|
|
||||||
|
:::important
|
||||||
|
Compression impacts both performance and storage efficiency. Choose the right
|
||||||
|
algorithm based on your recovery time objectives (RTO), storage capacity, and
|
||||||
|
network throughput.
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Compression Benchmark (on MinIO)
|
||||||
|
|
||||||
|
| Compression | Backup Time (ms) | Restore Time (ms) | Uncompressed Size (MB) | Compressed Size (MB) | Ratio |
|
||||||
|
| ----------- | ---------------- | ----------------- | ---------------------- | -------------------- | ----- |
|
||||||
|
| None | 10,927 | 7,553 | 395 | 395 | 1.0:1 |
|
||||||
|
| bzip2 | 25,404 | 13,886 | 395 | 67 | 5.9:1 |
|
||||||
|
| gzip | 116,281 | 3,077 | 395 | 91 | 4.3:1 |
|
||||||
|
| snappy | 8,134 | 8,341 | 395 | 166 | 2.4:1 |
|
||||||
|
|
||||||
|
Numbers come from a 2021 Barman proof of concept ([EnterpriseDB/barman#344](https://github.com/EnterpriseDB/barman/issues/344#issuecomment-992547396)), which predates `lz4` support for base backups. `lz4` is not yet benchmarked.
|
||||||
177
web/versioned_docs/version-0.13.0/concepts.md
Normal file
177
web/versioned_docs/version-0.13.0/concepts.md
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 10
|
||||||
|
---
|
||||||
|
|
||||||
|
# Main Concepts
|
||||||
|
|
||||||
|
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
||||||
|
|
||||||
|
:::important
|
||||||
|
Before proceeding, make sure to review the following sections of the
|
||||||
|
CloudNativePG documentation:
|
||||||
|
|
||||||
|
- [**Backup**](https://cloudnative-pg.io/documentation/current/backup/)
|
||||||
|
- [**WAL Archiving**](https://cloudnative-pg.io/documentation/current/wal_archiving/)
|
||||||
|
- [**Recovery**](https://cloudnative-pg.io/documentation/current/recovery/)
|
||||||
|
:::
|
||||||
|
|
||||||
|
The **Barman Cloud Plugin** enables **hot (online) backups** of PostgreSQL
|
||||||
|
clusters in CloudNativePG through [`barman-cloud`](https://pgbarman.org),
|
||||||
|
supporting continuous physical backups and WAL archiving to an **object
|
||||||
|
store**—without interrupting write operations.
|
||||||
|
|
||||||
|
It also supports both **full recovery** and **Point-in-Time Recovery (PITR)**
|
||||||
|
of a PostgreSQL cluster.
|
||||||
|
|
||||||
|
## The Object Store
|
||||||
|
|
||||||
|
At the core is the [`ObjectStore` custom resource (CRD)](plugin-barman-cloud.v1.md#objectstorespec),
|
||||||
|
which acts as the interface between the PostgreSQL cluster and the target
|
||||||
|
object storage system. It allows you to configure:
|
||||||
|
|
||||||
|
- **Authentication and bucket location** via the `.spec.configuration` section
|
||||||
|
- **WAL archiving** settings—such as compression type, parallelism, and
|
||||||
|
server-side encryption—under `.spec.configuration.wal`
|
||||||
|
- **Base backup options**—with similar settings for compression, concurrency,
|
||||||
|
and encryption—under `.spec.configuration.data`
|
||||||
|
- **Retention policies** to manage the life-cycle of archived WALs and backups
|
||||||
|
via `.spec.configuration.retentionPolicy`
|
||||||
|
|
||||||
|
WAL files are archived in the `wals` directory, while base backups are stored
|
||||||
|
as **tarballs** in the `base` directory, following the
|
||||||
|
[Barman Cloud convention](https://docs.pgbarman.org/cloud/latest/usage/#object-store-layout).
|
||||||
|
|
||||||
|
The plugin also offers advanced capabilities, including
|
||||||
|
[backup tagging](misc.md#backup-object-tagging) and
|
||||||
|
[extra options for backups and WAL archiving](misc.md#extra-options-for-backup-wal-archiving-and-restore).
|
||||||
|
|
||||||
|
:::tip
|
||||||
|
For details, refer to the
|
||||||
|
[API reference for the `ObjectStore` resource](plugin-barman-cloud.v1.md#objectstorespec).
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Integration with a CloudNativePG Cluster
|
||||||
|
|
||||||
|
CloudNativePG can delegate continuous backup and recovery responsibilities to
|
||||||
|
the **Barman Cloud Plugin** by configuring the `.spec.plugins` section of a
|
||||||
|
`Cluster` resource. This setup requires a corresponding `ObjectStore` resource
|
||||||
|
to be defined.
|
||||||
|
|
||||||
|
:::important
|
||||||
|
While it is technically possible to reuse the same `ObjectStore` for multiple
|
||||||
|
`Cluster` resources within the same namespace, it is strongly recommended to
|
||||||
|
dedicate one object store per PostgreSQL cluster to ensure data isolation and
|
||||||
|
operational clarity.
|
||||||
|
:::
|
||||||
|
|
||||||
|
The following example demonstrates how to configure a CloudNativePG cluster
|
||||||
|
named `cluster-example` to use a previously defined `ObjectStore` (also named
|
||||||
|
`cluster-example`) in the same namespace. Setting `isWALArchiver: true` enables
|
||||||
|
WAL archiving through the plugin:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: Cluster
|
||||||
|
metadata:
|
||||||
|
name: cluster-example
|
||||||
|
spec:
|
||||||
|
# Other cluster settings...
|
||||||
|
plugins:
|
||||||
|
- name: barman-cloud.cloudnative-pg.io
|
||||||
|
isWALArchiver: true
|
||||||
|
parameters:
|
||||||
|
barmanObjectName: cluster-example
|
||||||
|
```
|
||||||
|
|
||||||
|
## Backup of a Postgres Cluster
|
||||||
|
|
||||||
|
Once the object store is defined and the `Cluster` is configured to use the
|
||||||
|
Barman Cloud Plugin, **WAL archiving is activated immediately** on the
|
||||||
|
PostgreSQL primary.
|
||||||
|
|
||||||
|
Physical base backups are seamlessly managed by CloudNativePG using the
|
||||||
|
`Backup` and `ScheduledBackup` resources, respectively for
|
||||||
|
[on-demand](https://cloudnative-pg.io/documentation/current/backup/#on-demand-backups)
|
||||||
|
and
|
||||||
|
[scheduled](https://cloudnative-pg.io/documentation/current/backup/#scheduled-backups)
|
||||||
|
backups.
|
||||||
|
|
||||||
|
To use the Barman Cloud Plugin, you must set the `method` to `plugin` and
|
||||||
|
configure the `pluginConfiguration` section as shown:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
[...]
|
||||||
|
spec:
|
||||||
|
method: plugin
|
||||||
|
pluginConfiguration:
|
||||||
|
name: barman-cloud.cloudnative-pg.io
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
With this configuration, CloudNativePG supports:
|
||||||
|
|
||||||
|
- Backups from both **primary** and **standby** instances
|
||||||
|
- Backups from **designated primaries** in a distributed topology using
|
||||||
|
[replica clusters](https://cloudnative-pg.io/documentation/current/replica_cluster/)
|
||||||
|
|
||||||
|
:::tip
|
||||||
|
For details on how to back up from a standby, refer to the official documentation:
|
||||||
|
[Backup from a standby](https://cloudnative-pg.io/documentation/current/backup/#backup-from-a-standby).
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::important
|
||||||
|
Both backup and WAL archiving operations are executed by sidecar containers
|
||||||
|
running in the same pod as the PostgreSQL `Cluster` primary instance—except
|
||||||
|
when backups are taken from a standby, in which case the sidecar runs alongside
|
||||||
|
the standby pod.
|
||||||
|
The sidecar containers use a [dedicated container image](images.md) that
|
||||||
|
includes only the supported version of Barman Cloud.
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Recovery of a Postgres Cluster
|
||||||
|
|
||||||
|
In PostgreSQL, *recovery* refers to the process of starting a database instance
|
||||||
|
from an existing backup. The Barman Cloud Plugin integrates with CloudNativePG
|
||||||
|
to support both **full recovery** and **Point-in-Time Recovery (PITR)** from an
|
||||||
|
object store.
|
||||||
|
|
||||||
|
Recovery in this context is *not in-place*: it bootstraps a brand-new
|
||||||
|
PostgreSQL cluster from a backup and replays the necessary WAL files to reach
|
||||||
|
the desired recovery target.
|
||||||
|
|
||||||
|
To perform a recovery, define an *external cluster* that references the
|
||||||
|
appropriate `ObjectStore`, and use it as the source in the `bootstrap` section
|
||||||
|
of the target cluster:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
[...]
|
||||||
|
spec:
|
||||||
|
[...]
|
||||||
|
bootstrap:
|
||||||
|
recovery:
|
||||||
|
source: source
|
||||||
|
externalClusters:
|
||||||
|
- name: source
|
||||||
|
plugin:
|
||||||
|
name: barman-cloud.cloudnative-pg.io
|
||||||
|
parameters:
|
||||||
|
barmanObjectName: cluster-example
|
||||||
|
serverName: cluster-example
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
The critical element here is the `externalClusters` section of the `Cluster`
|
||||||
|
resource, where the `plugin` stanza instructs CloudNativePG to use the Barman
|
||||||
|
Cloud Plugin to access the object store for recovery.
|
||||||
|
|
||||||
|
This same mechanism can be used for a variety of scenarios enabled by the
|
||||||
|
CloudNativePG API, including:
|
||||||
|
|
||||||
|
* **Full cluster recovery** from the latest backup
|
||||||
|
* **Point-in-Time Recovery (PITR)**
|
||||||
|
* Bootstrapping **replica clusters** in a distributed topology
|
||||||
|
|
||||||
|
:::tip
|
||||||
|
For complete instructions and advanced use cases, refer to the official
|
||||||
|
[Recovery documentation](https://cloudnative-pg.io/documentation/current/recovery/).
|
||||||
|
:::
|
||||||
37
web/versioned_docs/version-0.13.0/images.md
Normal file
37
web/versioned_docs/version-0.13.0/images.md
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 99
|
||||||
|
---
|
||||||
|
|
||||||
|
# Container Images
|
||||||
|
|
||||||
|
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
||||||
|
|
||||||
|
The Barman Cloud Plugin is distributed using two container images:
|
||||||
|
|
||||||
|
- One for deploying the plugin components
|
||||||
|
- One for the sidecar that runs alongside each PostgreSQL instance in a
|
||||||
|
CloudNativePG `Cluster` using the plugin
|
||||||
|
|
||||||
|
## Plugin Container Image
|
||||||
|
|
||||||
|
The plugin image contains the logic required to operate the Barman Cloud Plugin
|
||||||
|
within your Kubernetes environment with CloudNativePG. It is published on the
|
||||||
|
GitHub Container Registry at `ghcr.io/cloudnative-pg/plugin-barman-cloud`.
|
||||||
|
|
||||||
|
This image is built from the
|
||||||
|
[`Dockerfile.plugin`](https://github.com/cloudnative-pg/plugin-barman-cloud/blob/main/containers/Dockerfile.plugin)
|
||||||
|
in the plugin repository.
|
||||||
|
|
||||||
|
## Sidecar Container Image
|
||||||
|
|
||||||
|
The sidecar image is used within each PostgreSQL pod in the cluster. It
|
||||||
|
includes the latest supported version of Barman Cloud and is responsible for
|
||||||
|
performing WAL archiving and backups on behalf of CloudNativePG.
|
||||||
|
|
||||||
|
It is available at `ghcr.io/cloudnative-pg/plugin-barman-cloud-sidecar` and is
|
||||||
|
built from the
|
||||||
|
[`Dockerfile.sidecar`](https://github.com/cloudnative-pg/plugin-barman-cloud/blob/main/containers/Dockerfile.sidecar).
|
||||||
|
|
||||||
|
These sidecar images are designed to work seamlessly with the
|
||||||
|
[`minimal` PostgreSQL container images](https://github.com/cloudnative-pg/postgres-containers?tab=readme-ov-file#minimal-images)
|
||||||
|
maintained by the CloudNativePG Community.
|
||||||
109
web/versioned_docs/version-0.13.0/installation.mdx
Normal file
109
web/versioned_docs/version-0.13.0/installation.mdx
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 20
|
||||||
|
---
|
||||||
|
|
||||||
|
# Installation
|
||||||
|
|
||||||
|
:::important
|
||||||
|
1. The plugin **must** be installed in the same namespace as the CloudNativePG
|
||||||
|
operator (typically `cnpg-system`).
|
||||||
|
|
||||||
|
2. Keep in mind that the operator's **listening namespaces** may differ from its
|
||||||
|
installation namespace. Double-check this to avoid configuration issues.
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Verifying the Requirements
|
||||||
|
|
||||||
|
Before installing the plugin, make sure the [requirements](intro.md#requirements) are met.
|
||||||
|
|
||||||
|
### CloudNativePG Version
|
||||||
|
|
||||||
|
Ensure you're running a version of CloudNativePG that is compatible with the
|
||||||
|
plugin. If installed in the default `cnpg-system` namespace, you can verify the
|
||||||
|
version with:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl get deployment -n cnpg-system cnpg-controller-manager \
|
||||||
|
-o jsonpath="{.spec.template.spec.containers[*].image}"
|
||||||
|
```
|
||||||
|
|
||||||
|
Example output:
|
||||||
|
|
||||||
|
```output
|
||||||
|
ghcr.io/cloudnative-pg/cloudnative-pg:1.26.0
|
||||||
|
```
|
||||||
|
|
||||||
|
The version **must be 1.26 or newer**.
|
||||||
|
|
||||||
|
### cert-manager
|
||||||
|
|
||||||
|
Use the [cmctl](https://cert-manager.io/docs/reference/cmctl/#installation)
|
||||||
|
tool to confirm that `cert-manager` is installed and available:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cmctl check api
|
||||||
|
```
|
||||||
|
|
||||||
|
Example output:
|
||||||
|
|
||||||
|
```output
|
||||||
|
The cert-manager API is ready
|
||||||
|
```
|
||||||
|
|
||||||
|
Both checks are required before proceeding with the installation.
|
||||||
|
|
||||||
|
## Installing the Barman Cloud Plugin
|
||||||
|
|
||||||
|
import { InstallationSnippet } from '@site/src/components/Installation';
|
||||||
|
|
||||||
|
Install the plugin using `kubectl` by applying the manifest for the latest
|
||||||
|
release:
|
||||||
|
|
||||||
|
<InstallationSnippet />
|
||||||
|
|
||||||
|
Example output:
|
||||||
|
|
||||||
|
```output
|
||||||
|
customresourcedefinition.apiextensions.k8s.io/objectstores.barmancloud.cnpg.io created
|
||||||
|
serviceaccount/plugin-barman-cloud created
|
||||||
|
role.rbac.authorization.k8s.io/leader-election-role created
|
||||||
|
clusterrole.rbac.authorization.k8s.io/metrics-auth-role created
|
||||||
|
clusterrole.rbac.authorization.k8s.io/metrics-reader created
|
||||||
|
clusterrole.rbac.authorization.k8s.io/objectstore-editor-role created
|
||||||
|
clusterrole.rbac.authorization.k8s.io/objectstore-viewer-role created
|
||||||
|
clusterrole.rbac.authorization.k8s.io/plugin-barman-cloud created
|
||||||
|
rolebinding.rbac.authorization.k8s.io/leader-election-rolebinding created
|
||||||
|
clusterrolebinding.rbac.authorization.k8s.io/metrics-auth-rolebinding created
|
||||||
|
clusterrolebinding.rbac.authorization.k8s.io/plugin-barman-cloud-binding created
|
||||||
|
secret/plugin-barman-cloud-8tfddg42gf created
|
||||||
|
service/barman-cloud created
|
||||||
|
deployment.apps/barman-cloud configured
|
||||||
|
certificate.cert-manager.io/barman-cloud-client created
|
||||||
|
certificate.cert-manager.io/barman-cloud-server created
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|
Example output:
|
||||||
|
|
||||||
|
```output
|
||||||
|
deployment "barman-cloud" successfully rolled out
|
||||||
|
```
|
||||||
|
|
||||||
|
This confirms that the plugin is deployed and ready to use.
|
||||||
|
|
||||||
|
## Testing the latest development snapshot
|
||||||
|
|
||||||
|
You can also test the latest development snapshot of the plugin with the
|
||||||
|
following command:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl apply -f \
|
||||||
|
https://raw.githubusercontent.com/cloudnative-pg/plugin-barman-cloud/refs/heads/main/manifest.yaml
|
||||||
|
```
|
||||||
86
web/versioned_docs/version-0.13.0/intro.md
Normal file
86
web/versioned_docs/version-0.13.0/intro.md
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 1
|
||||||
|
sidebar_label: "Introduction"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Barman Cloud Plugin
|
||||||
|
|
||||||
|
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
||||||
|
|
||||||
|
The **Barman Cloud Plugin** for [CloudNativePG](https://cloudnative-pg.io/)
|
||||||
|
enables online continuous physical backups of PostgreSQL clusters to object storage
|
||||||
|
using the `barman-cloud` suite from the [Barman](https://docs.pgbarman.org/release/latest/)
|
||||||
|
project.
|
||||||
|
|
||||||
|
:::important
|
||||||
|
If you plan to migrate your existing CloudNativePG cluster to the new
|
||||||
|
plugin-based approach using the Barman Cloud Plugin, see
|
||||||
|
["Migrating from Built-in CloudNativePG Backup"](migration.md)
|
||||||
|
for detailed instructions.
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
Before using the Barman Cloud Plugin, ensure that the following components are
|
||||||
|
installed and properly configured:
|
||||||
|
|
||||||
|
- [CloudNativePG](https://cloudnative-pg.io) version 1.26 or later
|
||||||
|
|
||||||
|
- We strongly recommend version 1.27.0 or later, which includes improved
|
||||||
|
error handling and status reporting for the plugin.
|
||||||
|
- If you are running an earlier release, refer to the
|
||||||
|
[upgrade guide](https://cloudnative-pg.io/documentation/current/installation_upgrade).
|
||||||
|
|
||||||
|
- [cert-manager](https://cert-manager.io/)
|
||||||
|
|
||||||
|
- The recommended way to enable secure TLS communication between the plugin
|
||||||
|
and the operator.
|
||||||
|
- Alternatively, you can provide your own certificate bundles. See the
|
||||||
|
[CloudNativePG documentation on TLS configuration](https://cloudnative-pg.io/documentation/current/cnpg_i/#configuring-tls-certificates).
|
||||||
|
|
||||||
|
- [`kubectl-cnpg`](https://cloudnative-pg.io/documentation/current/kubectl-plugin/)
|
||||||
|
plugin (optional but recommended)
|
||||||
|
|
||||||
|
- Simplifies debugging and monitoring with additional status and inspection
|
||||||
|
commands.
|
||||||
|
- Multiple installation options are available in the
|
||||||
|
[installation guide](https://cloudnative-pg.io/documentation/current/kubectl-plugin/#install).
|
||||||
|
|
||||||
|
## Key Features
|
||||||
|
|
||||||
|
This plugin provides the following capabilities:
|
||||||
|
|
||||||
|
- Physical online backup of the data directory
|
||||||
|
- Physical restore of the data directory
|
||||||
|
- Write-Ahead Log (WAL) archiving
|
||||||
|
- WAL restore
|
||||||
|
- Full cluster recovery
|
||||||
|
- Point-in-Time Recovery (PITR)
|
||||||
|
- Seamless integration with replica clusters for bootstrap and WAL restore from archive
|
||||||
|
|
||||||
|
:::important
|
||||||
|
The Barman Cloud Plugin is designed to **replace the in-tree object storage support**
|
||||||
|
previously provided via the `.spec.backup.barmanObjectStore` section in the
|
||||||
|
`Cluster` resource.
|
||||||
|
Backups created using the in-tree approach are fully supported and compatible
|
||||||
|
with this plugin.
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Supported Object Storage Providers
|
||||||
|
|
||||||
|
The plugin works with all storage backends supported by `barman-cloud`, including:
|
||||||
|
|
||||||
|
- **Amazon S3**
|
||||||
|
- **Google Cloud Storage**
|
||||||
|
- **Microsoft Azure Blob Storage**
|
||||||
|
|
||||||
|
In addition, the following S3-compatible and simulator solutions have been
|
||||||
|
tested and verified:
|
||||||
|
|
||||||
|
- [MinIO](https://min.io/) – An S3-compatible storage solution
|
||||||
|
- [Azurite](https://github.com/Azure/Azurite) – A simulator for Azure Blob Storage
|
||||||
|
- [fake-gcs-server](https://github.com/fsouza/fake-gcs-server) – A simulator for Google Cloud Storage
|
||||||
|
|
||||||
|
:::tip
|
||||||
|
For more details, refer to [Object Store Providers](object_stores.md).
|
||||||
|
:::
|
||||||
274
web/versioned_docs/version-0.13.0/migration.md
Normal file
274
web/versioned_docs/version-0.13.0/migration.md
Normal file
@ -0,0 +1,274 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 40
|
||||||
|
---
|
||||||
|
|
||||||
|
# Migrating from Built-in CloudNativePG Backup
|
||||||
|
|
||||||
|
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
||||||
|
|
||||||
|
The in-tree support for Barman Cloud in CloudNativePG is **deprecated starting
|
||||||
|
from version 1.26** and will be removed in a future release.
|
||||||
|
|
||||||
|
If you're currently relying on the built-in Barman Cloud integration, you can
|
||||||
|
migrate seamlessly to the new **plugin-based architecture** using the Barman
|
||||||
|
Cloud Plugin, without data loss. Follow these steps:
|
||||||
|
|
||||||
|
- [Install the Barman Cloud Plugin](installation.mdx)
|
||||||
|
- Create an `ObjectStore` resource by translating the contents of the
|
||||||
|
`.spec.backup.barmanObjectStore` section from your existing `Cluster`
|
||||||
|
definition
|
||||||
|
- Modify the `Cluster` resource in a single atomic change to switch from
|
||||||
|
in-tree backup to the plugin
|
||||||
|
- Update any `ScheduledBackup` resources to use the plugin
|
||||||
|
- Update the `externalClusters` configuration, where applicable
|
||||||
|
|
||||||
|
:::tip
|
||||||
|
For a working example, refer to [this commit](https://github.com/cloudnative-pg/cnpg-playground/commit/596f30e252896edf8f734991c3538df87630f6f7)
|
||||||
|
from the [CloudNativePG Playground project](https://github.com/cloudnative-pg/cnpg-playground),
|
||||||
|
which demonstrates a full migration.
|
||||||
|
:::
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Step 1: Define the `ObjectStore`
|
||||||
|
|
||||||
|
Begin by creating an `ObjectStore` resource in the same namespace as your
|
||||||
|
PostgreSQL `Cluster`.
|
||||||
|
|
||||||
|
There is a **direct mapping** between the `.spec.backup.barmanObjectStore`
|
||||||
|
section in CloudNativePG and the `.spec.configuration` field in the
|
||||||
|
`ObjectStore` CR. The conversion is mostly mechanical, with one key difference:
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
In the plugin architecture, retention policies are defined as part of the `ObjectStore`.
|
||||||
|
In contrast, the in-tree implementation defined them at the `Cluster` level.
|
||||||
|
:::
|
||||||
|
|
||||||
|
If your `Cluster` used `.spec.backup.retentionPolicy`, move that configuration
|
||||||
|
to `.spec.retentionPolicy` in the `ObjectStore`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
Here’s an excerpt from a traditional in-tree CloudNativePG backup configuration
|
||||||
|
taken from the CloudNativePG Playground project:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: Cluster
|
||||||
|
metadata:
|
||||||
|
name: pg-eu
|
||||||
|
spec:
|
||||||
|
# [...]
|
||||||
|
backup:
|
||||||
|
barmanObjectStore:
|
||||||
|
destinationPath: s3://backups/
|
||||||
|
endpointURL: http://minio-eu:9000
|
||||||
|
s3Credentials:
|
||||||
|
accessKeyId:
|
||||||
|
name: minio-eu
|
||||||
|
key: ACCESS_KEY_ID
|
||||||
|
secretAccessKey:
|
||||||
|
name: minio-eu
|
||||||
|
key: ACCESS_SECRET_KEY
|
||||||
|
wal:
|
||||||
|
compression: gzip
|
||||||
|
```
|
||||||
|
|
||||||
|
This configuration translates to the following `ObjectStore` resource for the
|
||||||
|
plugin:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: barmancloud.cnpg.io/v1
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: minio-eu
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
destinationPath: s3://backups/
|
||||||
|
endpointURL: http://minio-eu:9000
|
||||||
|
s3Credentials:
|
||||||
|
accessKeyId:
|
||||||
|
name: minio-eu
|
||||||
|
key: ACCESS_KEY_ID
|
||||||
|
secretAccessKey:
|
||||||
|
name: minio-eu
|
||||||
|
key: ACCESS_SECRET_KEY
|
||||||
|
wal:
|
||||||
|
compression: gzip
|
||||||
|
```
|
||||||
|
|
||||||
|
As you can see, the contents of `barmanObjectStore` have been copied directly
|
||||||
|
under the `configuration` field of the `ObjectStore` resource, using the same
|
||||||
|
secret references.
|
||||||
|
|
||||||
|
## Step 2: Update the `Cluster` for plugin WAL archiving
|
||||||
|
|
||||||
|
Once the `ObjectStore` resource is in place, update the `Cluster` resource as
|
||||||
|
follows in a single atomic change:
|
||||||
|
|
||||||
|
- Remove the `.spec.backup.barmanObjectStore` section
|
||||||
|
- Remove `.spec.backup.retentionPolicy` if it was defined (as it is now in the
|
||||||
|
`ObjectStore`)
|
||||||
|
- Remove the entire `spec.backup` section if it is now empty
|
||||||
|
- Add `barman-cloud.cloudnative-pg.io` to the `plugins` list, as described in
|
||||||
|
[Configuring WAL archiving](usage.md#configuring-wal-archiving)
|
||||||
|
|
||||||
|
This will trigger a rolling update of the `Cluster`, switching continuous
|
||||||
|
backup from the in-tree implementation to the plugin-based approach.
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
The updated `pg-eu` cluster will have this configuration instead of the
|
||||||
|
previous `backup` section:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
plugins:
|
||||||
|
- name: barman-cloud.cloudnative-pg.io
|
||||||
|
isWALArchiver: true
|
||||||
|
parameters:
|
||||||
|
barmanObjectName: minio-eu
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Step 3: Update the `ScheduledBackup`
|
||||||
|
|
||||||
|
After switching the `Cluster` to use the plugin, update your `ScheduledBackup`
|
||||||
|
resources to match.
|
||||||
|
|
||||||
|
Set the backup `method` to `plugin` and reference the plugin name via
|
||||||
|
`pluginConfiguration`, as shown in ["Performing a base backup"](usage.md#performing-a-base-backup).
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
Original in-tree `ScheduledBackup`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: ScheduledBackup
|
||||||
|
metadata:
|
||||||
|
name: pg-eu-backup
|
||||||
|
spec:
|
||||||
|
cluster:
|
||||||
|
name: pg-eu
|
||||||
|
schedule: '0 0 0 * * *'
|
||||||
|
backupOwnerReference: self
|
||||||
|
```
|
||||||
|
|
||||||
|
Updated version using the plugin:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: ScheduledBackup
|
||||||
|
metadata:
|
||||||
|
name: pg-eu-backup
|
||||||
|
spec:
|
||||||
|
cluster:
|
||||||
|
name: pg-eu
|
||||||
|
schedule: '0 0 0 * * *'
|
||||||
|
backupOwnerReference: self
|
||||||
|
method: plugin
|
||||||
|
pluginConfiguration:
|
||||||
|
name: barman-cloud.cloudnative-pg.io
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Step 4: Update the `externalClusters` configuration
|
||||||
|
|
||||||
|
If your `Cluster` relies on one or more external clusters that use the in-tree
|
||||||
|
Barman Cloud integration, you need to update those configurations to use the
|
||||||
|
plugin-based architecture.
|
||||||
|
|
||||||
|
When a replica cluster fetches WAL files or base backups from an external
|
||||||
|
source that used the built-in backup method, follow these steps:
|
||||||
|
|
||||||
|
1. Create a corresponding `ObjectStore` resource for the external cluster, as
|
||||||
|
shown in [Step 1](#step-1-define-the-objectstore)
|
||||||
|
2. Update the `externalClusters` section of your replica cluster to use the
|
||||||
|
plugin instead of the in-tree `barmanObjectStore` field
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
Consider the original configuration using in-tree Barman Cloud:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: Cluster
|
||||||
|
metadata:
|
||||||
|
name: pg-us
|
||||||
|
spec:
|
||||||
|
# [...]
|
||||||
|
externalClusters:
|
||||||
|
- name: pg-eu
|
||||||
|
barmanObjectStore:
|
||||||
|
destinationPath: s3://backups/
|
||||||
|
endpointURL: http://minio-eu:9000
|
||||||
|
serverName: pg-eu
|
||||||
|
s3Credentials:
|
||||||
|
accessKeyId:
|
||||||
|
name: minio-eu
|
||||||
|
key: ACCESS_KEY_ID
|
||||||
|
secretAccessKey:
|
||||||
|
name: minio-eu
|
||||||
|
key: ACCESS_SECRET_KEY
|
||||||
|
wal:
|
||||||
|
compression: gzip
|
||||||
|
```
|
||||||
|
|
||||||
|
Create the `ObjectStore` resource for the external cluster:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: barmancloud.cnpg.io/v1
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: minio-eu
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
destinationPath: s3://backups/
|
||||||
|
endpointURL: http://minio-eu:9000
|
||||||
|
s3Credentials:
|
||||||
|
accessKeyId:
|
||||||
|
name: minio-eu
|
||||||
|
key: ACCESS_KEY_ID
|
||||||
|
secretAccessKey:
|
||||||
|
name: minio-eu
|
||||||
|
key: ACCESS_SECRET_KEY
|
||||||
|
wal:
|
||||||
|
compression: gzip
|
||||||
|
```
|
||||||
|
|
||||||
|
Update the external cluster configuration to use the plugin:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: Cluster
|
||||||
|
metadata:
|
||||||
|
name: pg-us
|
||||||
|
spec:
|
||||||
|
# [...]
|
||||||
|
externalClusters:
|
||||||
|
- name: pg-eu
|
||||||
|
plugin:
|
||||||
|
name: barman-cloud.cloudnative-pg.io
|
||||||
|
parameters:
|
||||||
|
barmanObjectName: minio-eu
|
||||||
|
serverName: pg-eu
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 5: Verify your metrics
|
||||||
|
|
||||||
|
When migrating from the in-core solution to the plugin-based approach, you need
|
||||||
|
to monitor a different set of metrics, as described in the
|
||||||
|
["Observability"](observability.md) section.
|
||||||
|
|
||||||
|
The table below summarizes the name changes between the old in-core metrics and
|
||||||
|
the new plugin-based ones:
|
||||||
|
|
||||||
|
| Old metric name | New metric name |
|
||||||
|
| ------------------------------------------------ | ---------------------------------------------------------------- |
|
||||||
|
| `cnpg_collector_last_failed_backup_timestamp` | `barman_cloud_cloudnative_pg_io_last_failed_backup_timestamp` |
|
||||||
|
| `cnpg_collector_last_available_backup_timestamp` | `barman_cloud_cloudnative_pg_io_last_available_backup_timestamp` |
|
||||||
|
| `cnpg_collector_first_recoverability_point` | `barman_cloud_cloudnative_pg_io_first_recoverability_point` |
|
||||||
126
web/versioned_docs/version-0.13.0/misc.md
Normal file
126
web/versioned_docs/version-0.13.0/misc.md
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 90
|
||||||
|
---
|
||||||
|
|
||||||
|
# Miscellaneous
|
||||||
|
|
||||||
|
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
||||||
|
|
||||||
|
## Backup Object Tagging
|
||||||
|
|
||||||
|
You can attach key-value metadata tags to backup artifacts—such as base
|
||||||
|
backups, WAL files, and history files—via the `.spec.configuration` section of
|
||||||
|
the `ObjectStore` resource.
|
||||||
|
|
||||||
|
- `tags`: applied to base backups and WAL files
|
||||||
|
- `historyTags`: applied to history files only
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: barmancloud.cnpg.io/v1
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: my-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
[...]
|
||||||
|
tags:
|
||||||
|
backupRetentionPolicy: "expire"
|
||||||
|
historyTags:
|
||||||
|
backupRetentionPolicy: "keep"
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Extra Options for Backup, WAL Archiving, and Restore
|
||||||
|
|
||||||
|
You can pass additional command-line arguments to the underlying
|
||||||
|
`barman-cloud-*` commands using the corresponding fields in the `ObjectStore`
|
||||||
|
configuration.
|
||||||
|
|
||||||
|
- `.spec.configuration.data.additionalCommandArgs`: for `barman-cloud-backup`
|
||||||
|
- `.spec.configuration.data.restoreAdditionalCommandArgs`: for `barman-cloud-restore`
|
||||||
|
- `.spec.configuration.wal.archiveAdditionalCommandArgs`: for `barman-cloud-wal-archive`
|
||||||
|
- `.spec.configuration.wal.restoreAdditionalCommandArgs`: for `barman-cloud-wal-restore`
|
||||||
|
|
||||||
|
Each field accepts a list of string arguments. If an argument conflicts with
|
||||||
|
one already set by the plugin, the user-provided value will be ignored. These
|
||||||
|
fields are intended to pass options the plugin does not configure automatically.
|
||||||
|
|
||||||
|
### Example: Extra Backup Options
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: my-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
data:
|
||||||
|
additionalCommandArgs:
|
||||||
|
- "--min-chunk-size=5MB"
|
||||||
|
- "--read-timeout=60"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example: Extra Restore Options
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: my-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
data:
|
||||||
|
restoreAdditionalCommandArgs:
|
||||||
|
- "--read-timeout=900"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example: Extra WAL Archive Options
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: my-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
wal:
|
||||||
|
archiveAdditionalCommandArgs:
|
||||||
|
- "--max-concurrency=1"
|
||||||
|
- "--read-timeout=60"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example: Extra WAL Restore Options
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: my-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
wal:
|
||||||
|
restoreAdditionalCommandArgs:
|
||||||
|
- "--read-timeout=60"
|
||||||
|
```
|
||||||
|
|
||||||
|
For a complete list of supported options, refer to the
|
||||||
|
[official Barman Cloud documentation](https://docs.pgbarman.org/release/latest/).
|
||||||
|
|
||||||
|
## Enable the pprof debug server for the sidecar
|
||||||
|
|
||||||
|
You can enable the instance sidecar's pprof debug HTTP server by adding the `--pprof-server=<address>` flag to the container's
|
||||||
|
arguments via `.spec.instanceSidecarConfiguration.additionalContainerArgs`.
|
||||||
|
|
||||||
|
Pass a bind address in the form `<host>:<port>` (for example, `0.0.0.0:6061`).
|
||||||
|
An empty value disables the server (disabled by default).
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: barmancloud.cnpg.io/v1
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: my-store
|
||||||
|
spec:
|
||||||
|
instanceSidecarConfiguration:
|
||||||
|
additionalContainerArgs:
|
||||||
|
- "--pprof-server=0.0.0.0:6061"
|
||||||
|
```
|
||||||
497
web/versioned_docs/version-0.13.0/object_stores.md
Normal file
497
web/versioned_docs/version-0.13.0/object_stores.md
Normal file
@ -0,0 +1,497 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 50
|
||||||
|
---
|
||||||
|
|
||||||
|
# Object Store Providers
|
||||||
|
|
||||||
|
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
||||||
|
|
||||||
|
The Barman Cloud Plugin enables the storage of PostgreSQL cluster backup files
|
||||||
|
in any object storage service supported by the
|
||||||
|
[Barman Cloud infrastructure](https://docs.pgbarman.org/release/latest/).
|
||||||
|
|
||||||
|
Currently, Barman Cloud supports the following providers:
|
||||||
|
|
||||||
|
- [Amazon S3](#aws-s3)
|
||||||
|
- [Microsoft Azure Blob Storage](#azure-blob-storage)
|
||||||
|
- [Google Cloud Storage](#google-cloud-storage)
|
||||||
|
|
||||||
|
You may also use any S3- or Azure-compatible implementation of the above
|
||||||
|
services.
|
||||||
|
|
||||||
|
To configure object storage with Barman Cloud, you must define an
|
||||||
|
[`ObjectStore` object](plugin-barman-cloud.v1.md#objectstore), which
|
||||||
|
establishes the connection between your PostgreSQL cluster and the object
|
||||||
|
storage backend.
|
||||||
|
|
||||||
|
Configuration details — particularly around authentication — will vary depending on
|
||||||
|
the specific object storage provider you are using.
|
||||||
|
|
||||||
|
The following sections detail the setup for each.
|
||||||
|
|
||||||
|
:::note Authentication Methods
|
||||||
|
The Barman Cloud Plugin does not independently test all authentication methods
|
||||||
|
supported by `barman-cloud`. The plugin's responsibility is limited to passing
|
||||||
|
the provided credentials to `barman-cloud`, which then handles authentication
|
||||||
|
according to its own implementation. Users should refer to the
|
||||||
|
[Barman Cloud documentation](https://docs.pgbarman.org/release/latest/) to
|
||||||
|
verify that their chosen authentication method is supported and properly
|
||||||
|
configured.
|
||||||
|
:::
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## AWS S3
|
||||||
|
|
||||||
|
[AWS Simple Storage Service (S3)](https://aws.amazon.com/s3/) is one of the
|
||||||
|
most widely adopted object storage solutions.
|
||||||
|
|
||||||
|
The Barman Cloud plugin for CloudNativePG integrates with S3 through two
|
||||||
|
primary authentication mechanisms:
|
||||||
|
|
||||||
|
- [IAM Roles for Service Accounts (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) —
|
||||||
|
recommended for clusters running on EKS
|
||||||
|
- Access keys — using `ACCESS_KEY_ID` and `ACCESS_SECRET_KEY` credentials
|
||||||
|
|
||||||
|
### Access Keys
|
||||||
|
|
||||||
|
To authenticate using access keys, you’ll need:
|
||||||
|
|
||||||
|
- `ACCESS_KEY_ID`: the public key used to authenticate to S3
|
||||||
|
- `ACCESS_SECRET_KEY`: the corresponding secret key
|
||||||
|
- `ACCESS_SESSION_TOKEN`: (optional) a temporary session token, if required
|
||||||
|
|
||||||
|
These credentials must be stored securely in a Kubernetes secret:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl create secret generic aws-creds \
|
||||||
|
--from-literal=ACCESS_KEY_ID=<access key here> \
|
||||||
|
--from-literal=ACCESS_SECRET_KEY=<secret key here>
|
||||||
|
# --from-literal=ACCESS_SESSION_TOKEN=<session token here> # if required
|
||||||
|
```
|
||||||
|
|
||||||
|
The credentials will be encrypted at rest if your Kubernetes environment
|
||||||
|
supports it.
|
||||||
|
|
||||||
|
You can then reference the secret in your `ObjectStore` definition:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: barmancloud.cnpg.io/v1
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: aws-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
destinationPath: "s3://BUCKET_NAME/path/to/folder"
|
||||||
|
s3Credentials:
|
||||||
|
accessKeyId:
|
||||||
|
name: aws-creds
|
||||||
|
key: ACCESS_KEY_ID
|
||||||
|
secretAccessKey:
|
||||||
|
name: aws-creds
|
||||||
|
key: ACCESS_SECRET_KEY
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
### IAM Role for Service Account (IRSA)
|
||||||
|
|
||||||
|
To use IRSA with EKS, configure the service account of the PostgreSQL cluster
|
||||||
|
with the appropriate annotation:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: Cluster
|
||||||
|
metadata:
|
||||||
|
[...]
|
||||||
|
spec:
|
||||||
|
serviceAccountTemplate:
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
eks.amazonaws.com/role-arn: arn:[...]
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
### S3 Lifecycle Policy
|
||||||
|
|
||||||
|
Barman Cloud uploads backup files to S3 but does not modify them afterward.
|
||||||
|
To enhance data durability and protect against accidental or malicious loss,
|
||||||
|
it's recommended to implement the following best practices:
|
||||||
|
|
||||||
|
- Enable object versioning
|
||||||
|
- Enable object locking to prevent objects from being deleted or overwritten
|
||||||
|
for a defined period or indefinitely (this provides an additional layer of
|
||||||
|
protection against accidental deletion and ransomware attacks)
|
||||||
|
- Set lifecycle rules to expire current versions a few days after your Barman
|
||||||
|
retention window
|
||||||
|
- Expire non-current versions after a longer period
|
||||||
|
|
||||||
|
These strategies help you safeguard backups without requiring broad delete
|
||||||
|
permissions, ensuring both security and compliance with minimal operational
|
||||||
|
overhead.
|
||||||
|
|
||||||
|
### S3-Compatible Storage Providers
|
||||||
|
|
||||||
|
You can use S3-compatible services like **MinIO**, **Linode (Akamai) Object Storage**,
|
||||||
|
or **DigitalOcean Spaces** by specifying a custom `endpointURL`.
|
||||||
|
|
||||||
|
Example with Linode (Akamai) Object Storage (`us-east1`):
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: barmancloud.cnpg.io/v1
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: linode-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
destinationPath: "s3://BUCKET_NAME/"
|
||||||
|
endpointURL: "https://us-east1.linodeobjects.com"
|
||||||
|
s3Credentials:
|
||||||
|
[...]
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
Recent changes to the [boto3 implementation](https://github.com/boto/boto3/issues/4392)
|
||||||
|
of [Amazon S3 Data Integrity Protections](https://docs.aws.amazon.com/sdkref/latest/guide/feature-dataintegrity.html)
|
||||||
|
may lead to the `x-amz-content-sha256` error when using the Barman Cloud
|
||||||
|
Plugin.
|
||||||
|
|
||||||
|
If you encounter this issue (see [GitHub issue #393](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/393)),
|
||||||
|
you can apply the following workaround by setting specific environment
|
||||||
|
variables in the `ObjectStore` resource:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: barmancloud.cnpg.io/v1
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: linode-store
|
||||||
|
spec:
|
||||||
|
instanceSidecarConfiguration:
|
||||||
|
env:
|
||||||
|
- name: AWS_REQUEST_CHECKSUM_CALCULATION
|
||||||
|
value: when_required
|
||||||
|
- name: AWS_RESPONSE_CHECKSUM_VALIDATION
|
||||||
|
value: when_required
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
These settings ensure that checksum calculations and validations are only
|
||||||
|
applied when explicitly required, avoiding compatibility issues with certain
|
||||||
|
S3-compatible storage providers.
|
||||||
|
|
||||||
|
Example with DigitalOcean Spaces (SFO3, path-style):
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: barmancloud.cnpg.io/v1
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: digitalocean-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
destinationPath: "s3://BUCKET_NAME/path/to/folder"
|
||||||
|
endpointURL: "https://sfo3.digitaloceanspaces.com"
|
||||||
|
s3Credentials:
|
||||||
|
[...]
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using Object Storage with a Private CA
|
||||||
|
|
||||||
|
For object storage services (e.g., MinIO) that use HTTPS with certificates
|
||||||
|
signed by a private CA, set the `endpointCA` field in the `ObjectStore`
|
||||||
|
definition. Unless you already have it, create a Kubernetes `Secret` with the
|
||||||
|
CA bundle:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl create secret generic my-ca-secret --from-file=ca.crt
|
||||||
|
```
|
||||||
|
|
||||||
|
Then reference it:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: barmancloud.cnpg.io/v1
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: minio-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
endpointURL: <myEndpointURL>
|
||||||
|
endpointCA:
|
||||||
|
name: my-ca-secret
|
||||||
|
key: ca.crt
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- TODO: does this also apply to the plugin? -->
|
||||||
|
:::note
|
||||||
|
If you want `ConfigMaps` and `Secrets` to be **automatically** reloaded by
|
||||||
|
instances, you can add a label with the key `cnpg.io/reload` to the
|
||||||
|
`Secrets`/`ConfigMaps`. Otherwise, you will have to reload the instances using the
|
||||||
|
`kubectl cnpg reload` subcommand.
|
||||||
|
:::
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Azure Blob Storage
|
||||||
|
|
||||||
|
[Azure Blob Storage](https://azure.microsoft.com/en-us/services/storage/blobs/)
|
||||||
|
is Microsoft’s cloud-based object storage solution.
|
||||||
|
|
||||||
|
Barman Cloud supports the following authentication methods:
|
||||||
|
|
||||||
|
- [Connection String](https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string)
|
||||||
|
- Storage Account Name + [Storage Account Access Key](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-keys-manage)
|
||||||
|
- Storage Account Name + [Storage Account SAS Token](https://learn.microsoft.com/en-us/azure/storage/blobs/sas-service-create)
|
||||||
|
- [Azure AD Managed Identity](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview)
|
||||||
|
- [Default Azure Credentials](https://learn.microsoft.com/en-us/dotnet/api/azure.identity.defaultazurecredential?view=azure-dotnet)
|
||||||
|
|
||||||
|
### Azure AD Managed Identity
|
||||||
|
|
||||||
|
This method avoids storing credentials in Kubernetes by enabling the
|
||||||
|
usage of [Azure Managed Identities](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview) authentication mechanism.
|
||||||
|
This can be enabled by setting the `inheritFromAzureAD` option to `true`.
|
||||||
|
Managed Identity can be configured for the AKS Cluster by following
|
||||||
|
the [Azure documentation](https://learn.microsoft.com/en-us/azure/aks/use-managed-identity?pivots=system-assigned).
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: barmancloud.cnpg.io/v1
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: azure-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
destinationPath: "<destination path here>"
|
||||||
|
azureCredentials:
|
||||||
|
inheritFromAzureAD: true
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Default Azure Credentials
|
||||||
|
|
||||||
|
The `useDefaultAzureCredentials` option enables the default Azure credentials
|
||||||
|
flow, which uses [`DefaultAzureCredential`](https://learn.microsoft.com/en-us/python/api/azure-identity/azure.identity.defaultazurecredential)
|
||||||
|
to automatically discover and use available credentials in the following order:
|
||||||
|
|
||||||
|
1. **Environment Variables** — `AZURE_CLIENT_ID`, `AZURE_CLIENT_SECRET`, and `AZURE_TENANT_ID` for Service Principal authentication
|
||||||
|
2. **Managed Identity** — Uses the managed identity assigned to the pod
|
||||||
|
3. **Azure CLI** — Uses credentials from the Azure CLI if available
|
||||||
|
4. **Azure PowerShell** — Uses credentials from Azure PowerShell if available
|
||||||
|
|
||||||
|
This approach is particularly useful for getting started with development and testing; it allows
|
||||||
|
the SDK to attempt multiple authentication mechanisms seamlessly across different environments.
|
||||||
|
However, this is not recommended for production. Please refer to the
|
||||||
|
[official Azure guidance](https://learn.microsoft.com/en-us/dotnet/azure/sdk/authentication/credential-chains?tabs=dac#usage-guidance-for-defaultazurecredential)
|
||||||
|
for a comprehensive understanding of `DefaultAzureCredential`.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: barmancloud.cnpg.io/v1
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: azure-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
destinationPath: "<destination path here>"
|
||||||
|
azureCredentials:
|
||||||
|
useDefaultAzureCredentials: true
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Access Key, SAS Token, or Connection String
|
||||||
|
|
||||||
|
Store credentials in a Kubernetes secret:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl create secret generic azure-creds \
|
||||||
|
--from-literal=AZURE_STORAGE_ACCOUNT=<storage account name> \
|
||||||
|
--from-literal=AZURE_STORAGE_KEY=<storage account key> \
|
||||||
|
--from-literal=AZURE_STORAGE_SAS_TOKEN=<SAS token> \
|
||||||
|
--from-literal=AZURE_STORAGE_CONNECTION_STRING=<connection string>
|
||||||
|
```
|
||||||
|
|
||||||
|
Then reference the required keys in your `ObjectStore`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: barmancloud.cnpg.io/v1
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: azure-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
destinationPath: "<destination path here>"
|
||||||
|
azureCredentials:
|
||||||
|
connectionString:
|
||||||
|
name: azure-creds
|
||||||
|
key: AZURE_CONNECTION_STRING
|
||||||
|
storageAccount:
|
||||||
|
name: azure-creds
|
||||||
|
key: AZURE_STORAGE_ACCOUNT
|
||||||
|
storageKey:
|
||||||
|
name: azure-creds
|
||||||
|
key: AZURE_STORAGE_KEY
|
||||||
|
storageSasToken:
|
||||||
|
name: azure-creds
|
||||||
|
key: AZURE_STORAGE_SAS_TOKEN
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
For Azure Blob, the destination path format is:
|
||||||
|
|
||||||
|
```
|
||||||
|
<http|https>://<account-name>.<service-name>.core.windows.net/<container>/<blob>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Azure-Compatible Providers
|
||||||
|
|
||||||
|
If you're using a different implementation (e.g., Azurite or emulator):
|
||||||
|
|
||||||
|
```
|
||||||
|
<http|https>://<local-machine-address>:<port>/<account-name>/<container>/<blob>
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Google Cloud Storage
|
||||||
|
|
||||||
|
[Google Cloud Storage](https://cloud.google.com/storage/) is supported with two
|
||||||
|
authentication modes:
|
||||||
|
|
||||||
|
- **GKE Workload Identity** (recommended inside Google Kubernetes Engine)
|
||||||
|
- **Service Account JSON key** via the `GOOGLE_APPLICATION_CREDENTIALS` environment variable
|
||||||
|
|
||||||
|
### GKE Workload Identity
|
||||||
|
|
||||||
|
Use the [Workload Identity authentication](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity)
|
||||||
|
when running in GKE:
|
||||||
|
|
||||||
|
1. Set `googleCredentials.gkeEnvironment` to `true` in the `ObjectStore`
|
||||||
|
resource
|
||||||
|
2. Annotate the `serviceAccountTemplate` in the `Cluster` resource with the GCP
|
||||||
|
service account
|
||||||
|
|
||||||
|
For example, in the `ObjectStore` resource:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: barmancloud.cnpg.io/v1
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: google-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
destinationPath: "gs://<bucket>/<folder>"
|
||||||
|
googleCredentials:
|
||||||
|
gkeEnvironment: true
|
||||||
|
```
|
||||||
|
|
||||||
|
And in the `Cluster` resource:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: Cluster
|
||||||
|
spec:
|
||||||
|
serviceAccountTemplate:
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
iam.gke.io/gcp-service-account: [...].iam.gserviceaccount.com
|
||||||
|
```
|
||||||
|
|
||||||
|
### Service Account JSON Key
|
||||||
|
|
||||||
|
Follow Google’s [authentication setup](https://cloud.google.com/docs/authentication/getting-started),
|
||||||
|
then:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl create secret generic backup-creds --from-file=gcsCredentials=gcs_credentials_file.json
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: barmancloud.cnpg.io/v1
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: google-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
destinationPath: "gs://<bucket>/<folder>"
|
||||||
|
googleCredentials:
|
||||||
|
applicationCredentials:
|
||||||
|
name: backup-creds
|
||||||
|
key: gcsCredentials
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
:::important
|
||||||
|
This authentication method generates a JSON file within the container
|
||||||
|
with all the credentials required to access your Google Cloud Storage
|
||||||
|
bucket. As a result, if someone gains access to the `Pod`, they will also have
|
||||||
|
write permissions to the bucket.
|
||||||
|
:::
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
## MinIO Object Store
|
||||||
|
|
||||||
|
In order to use the Tenant resource you first need to deploy the
|
||||||
|
[MinIO operator](https://docs.min.io/community/minio-object-store/operations/deployments/installation.html).
|
||||||
|
For the latest documentation of MinIO, please refer to the
|
||||||
|
[MinIO official documentation](https://docs.min.io/community/minio-object-store/).
|
||||||
|
|
||||||
|
MinIO Object Store's API is compatible with S3, and the default configuration of the Tenant
|
||||||
|
will create these services:
|
||||||
|
- `<tenant>-console` on port 9090 (with autocert) or 9443 (without autocert)
|
||||||
|
- `<tenant>-hl` on port 9000
|
||||||
|
Where `<tenant>` is the `metadata.name` you assigned to your Tenant resource.
|
||||||
|
|
||||||
|
:::note
|
||||||
|
The `<tenant>-console` service will only be available if you have enabled the
|
||||||
|
[MinIO Console](https://docs.min.io/community/minio-object-store/administration/minio-console.html).
|
||||||
|
|
||||||
|
For example, the following Tenant:
|
||||||
|
```yml
|
||||||
|
apiVersion: minio.min.io/v2
|
||||||
|
kind: Tenant
|
||||||
|
metadata:
|
||||||
|
name: cnpg-backups
|
||||||
|
spec:
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
would have services called `cnpg-backups-console` and `cnpg-backups-hl` respectively.
|
||||||
|
|
||||||
|
The `console` service is for managing the tenant, while the `hl` service exposes the S3
|
||||||
|
compatible API. If your tenant is configured with `requestAutoCert` you will communicate
|
||||||
|
to these services over HTTPS, if not you will use HTTP.
|
||||||
|
|
||||||
|
For authentication you can use your username and password, or create an access key.
|
||||||
|
Whichever method you choose, it has to be stored as a secret.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl create secret generic minio-creds \
|
||||||
|
--from-literal=MINIO_ACCESS_KEY=<minio access key or username> \
|
||||||
|
--from-literal=MINIO_SECRET_KEY=<minio secret key or password>
|
||||||
|
```
|
||||||
|
|
||||||
|
Finally, create the Barman ObjectStore:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: barmancloud.cnpg.io/v1
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: minio-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
destinationPath: s3://BUCKET_NAME/
|
||||||
|
endpointURL: http://<tenant>-hl:9000
|
||||||
|
s3Credentials:
|
||||||
|
accessKeyId:
|
||||||
|
name: minio-creds
|
||||||
|
key: MINIO_ACCESS_KEY
|
||||||
|
secretAccessKey:
|
||||||
|
name: minio-creds
|
||||||
|
key: MINIO_SECRET_KEY
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
:::important
|
||||||
|
Verify on `s3://BUCKET_NAME/` the presence of archived WAL files before
|
||||||
|
proceeding with a backup.
|
||||||
|
:::
|
||||||
|
|
||||||
|
---
|
||||||
24
web/versioned_docs/version-0.13.0/observability.md
Normal file
24
web/versioned_docs/version-0.13.0/observability.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 55
|
||||||
|
---
|
||||||
|
|
||||||
|
# Observability
|
||||||
|
|
||||||
|
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
||||||
|
|
||||||
|
The Barman Cloud Plugin exposes the following metrics through the native
|
||||||
|
Prometheus exporter of the instance manager:
|
||||||
|
|
||||||
|
- `barman_cloud_cloudnative_pg_io_last_failed_backup_timestamp`:
|
||||||
|
the UNIX timestamp of the most recent failed backup.
|
||||||
|
|
||||||
|
- `barman_cloud_cloudnative_pg_io_last_available_backup_timestamp`:
|
||||||
|
the UNIX timestamp of the most recent successfully available backup.
|
||||||
|
|
||||||
|
- `barman_cloud_cloudnative_pg_io_first_recoverability_point`:
|
||||||
|
the UNIX timestamp representing the earliest point in time from which the
|
||||||
|
cluster can be recovered.
|
||||||
|
|
||||||
|
These metrics supersede the previously available in-core metrics that used the
|
||||||
|
`cnpg_collector` prefix. The new metrics are exposed under the
|
||||||
|
`barman_cloud_cloudnative_pg_io` prefix instead.
|
||||||
19
web/versioned_docs/version-0.13.0/parameters.md
Normal file
19
web/versioned_docs/version-0.13.0/parameters.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 100
|
||||||
|
---
|
||||||
|
|
||||||
|
# Parameters
|
||||||
|
|
||||||
|
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
||||||
|
|
||||||
|
The following parameters are available for the Barman Cloud Plugin:
|
||||||
|
|
||||||
|
- `barmanObjectName`: references the `ObjectStore` resource to be used by the
|
||||||
|
plugin.
|
||||||
|
- `serverName`: Specifies the server name in the object store.
|
||||||
|
|
||||||
|
:::important
|
||||||
|
The `serverName` parameter in the `ObjectStore` resource is retained solely for
|
||||||
|
API compatibility with the in-tree `barmanObjectStore` and must always be left empty.
|
||||||
|
When needed, use the `serverName` plugin parameter in the Cluster configuration instead.
|
||||||
|
:::
|
||||||
108
web/versioned_docs/version-0.13.0/plugin-barman-cloud.v1.md
Normal file
108
web/versioned_docs/version-0.13.0/plugin-barman-cloud.v1.md
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
# API Reference
|
||||||
|
|
||||||
|
## Packages
|
||||||
|
- [barmancloud.cnpg.io/v1](#barmancloudcnpgiov1)
|
||||||
|
|
||||||
|
|
||||||
|
## barmancloud.cnpg.io/v1
|
||||||
|
|
||||||
|
Package v1 contains API Schema definitions for the barmancloud v1 API group
|
||||||
|
|
||||||
|
### Resource Types
|
||||||
|
- [ObjectStore](#objectstore)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### InstanceSidecarConfiguration
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
InstanceSidecarConfiguration defines the configuration for the sidecar that runs in the instance pods.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_Appears in:_
|
||||||
|
- [ObjectStoreSpec](#objectstorespec)
|
||||||
|
|
||||||
|
| Field | Description | Required | Default | Validation |
|
||||||
|
| --- | --- | --- | --- | --- |
|
||||||
|
| `env` _[EnvVar](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#envvar-v1-core) array_ | The environment to be explicitly passed to the sidecar | | | |
|
||||||
|
| `retentionPolicyIntervalSeconds` _integer_ | The retentionCheckInterval defines the frequency at which the<br />system checks and enforces retention policies. | | 1800 | |
|
||||||
|
| `resources` _[ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#resourcerequirements-v1-core)_ | Resources define cpu/memory requests and limits for the sidecar that runs in the instance pods. | | | |
|
||||||
|
| `additionalContainerArgs` _string array_ | AdditionalContainerArgs is an optional list of command-line arguments<br />to be passed to the sidecar container when it starts.<br />The provided arguments are appended to the container’s default arguments. | | | |
|
||||||
|
| `logLevel` _string_ | The log level for PostgreSQL instances. Valid values are: `error`, `warning`, `info` (default), `debug`, `trace` | | info | Enum: [error warning info debug trace] <br /> |
|
||||||
|
|
||||||
|
|
||||||
|
#### ObjectStore
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ObjectStore is the Schema for the objectstores API.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
| Field | Description | Required | Default | Validation |
|
||||||
|
| --- | --- | --- | --- | --- |
|
||||||
|
| `apiVersion` _string_ | `barmancloud.cnpg.io/v1` | True | | |
|
||||||
|
| `kind` _string_ | `ObjectStore` | True | | |
|
||||||
|
| `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | True | | |
|
||||||
|
| `spec` _[ObjectStoreSpec](#objectstorespec)_ | Specification of the desired behavior of the ObjectStore.<br />More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status | True | | |
|
||||||
|
| `status` _[ObjectStoreStatus](#objectstorestatus)_ | Most recently observed status of the ObjectStore. This data may not be up to<br />date. Populated by the system. Read-only.<br />More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status | | | |
|
||||||
|
|
||||||
|
|
||||||
|
#### ObjectStoreSpec
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ObjectStoreSpec defines the desired state of ObjectStore.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_Appears in:_
|
||||||
|
- [ObjectStore](#objectstore)
|
||||||
|
|
||||||
|
| Field | Description | Required | Default | Validation |
|
||||||
|
| --- | --- | --- | --- | --- |
|
||||||
|
| `configuration` _[BarmanObjectStoreConfiguration](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration)_ | The configuration for the barman-cloud tool suite | True | | |
|
||||||
|
| `retentionPolicy` _string_ | RetentionPolicy is the retention policy to be used for backups<br />and WALs (i.e. '60d'). The retention policy is expressed in the form<br />of `XXu` where `XX` is a positive integer and `u` is in `[dwm]` -<br />days, weeks, months. | | | Pattern: `^[1-9][0-9]*[dwm]$` <br /> |
|
||||||
|
| `instanceSidecarConfiguration` _[InstanceSidecarConfiguration](#instancesidecarconfiguration)_ | The configuration for the sidecar that runs in the instance pods | | | |
|
||||||
|
|
||||||
|
|
||||||
|
#### ObjectStoreStatus
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ObjectStoreStatus defines the observed state of ObjectStore.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_Appears in:_
|
||||||
|
- [ObjectStore](#objectstore)
|
||||||
|
|
||||||
|
| Field | Description | Required | Default | Validation |
|
||||||
|
| --- | --- | --- | --- | --- |
|
||||||
|
| `serverRecoveryWindow` _object (keys:string, values:[RecoveryWindow](#recoverywindow))_ | ServerRecoveryWindow maps each server to its recovery window | True | | |
|
||||||
|
|
||||||
|
|
||||||
|
#### RecoveryWindow
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
RecoveryWindow represents the time span between the first
|
||||||
|
recoverability point and the last successful backup of a PostgreSQL
|
||||||
|
server, defining the period during which data can be restored.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_Appears in:_
|
||||||
|
- [ObjectStoreStatus](#objectstorestatus)
|
||||||
|
|
||||||
|
| Field | Description | Required | Default | Validation |
|
||||||
|
| --- | --- | --- | --- | --- |
|
||||||
|
| `firstRecoverabilityPoint` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The first recoverability point in a PostgreSQL server refers to<br />the earliest point in time to which the database can be<br />restored. | True | | |
|
||||||
|
| `lastSuccessfulBackupTime` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The last successful backup time | True | | |
|
||||||
|
| `lastFailedBackupTime` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The last failed backup time | True | | |
|
||||||
|
|
||||||
|
|
||||||
219
web/versioned_docs/version-0.13.0/resource-name-migration.md
Normal file
219
web/versioned_docs/version-0.13.0/resource-name-migration.md
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 90
|
||||||
|
---
|
||||||
|
|
||||||
|
# Resource name migration guide
|
||||||
|
|
||||||
|
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
Before proceeding with the migration process, please:
|
||||||
|
1. **Read this guide in its entirety** to understand what changes will be made
|
||||||
|
2. **Test in a non-production environment** first if possible
|
||||||
|
3. **Ensure you have proper backups** of your cluster configuration
|
||||||
|
|
||||||
|
This migration will delete old RBAC resources only after the
|
||||||
|
`plugin-barman-cloud` upgrade. While the operation is designed to be safe, you
|
||||||
|
should review and understand the changes before proceeding. The maintainers of
|
||||||
|
this project are not responsible for any issues that may arise during
|
||||||
|
migration.
|
||||||
|
|
||||||
|
**Note:** This guide assumes you are using the default `cnpg-system` namespace.
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Starting from version **0.8.0**, the `plugin-barman-cloud` deployment manifests
|
||||||
|
use more specific, prefixed resource names to avoid conflicts with other
|
||||||
|
components deployed in the same Kubernetes cluster.
|
||||||
|
|
||||||
|
## What Changed
|
||||||
|
|
||||||
|
The following resources have been renamed to use proper prefixes.
|
||||||
|
|
||||||
|
### Cluster-scoped Resources
|
||||||
|
|
||||||
|
| Old Name | New Name |
|
||||||
|
|----------------------------|------------------------------------------|
|
||||||
|
| `metrics-auth-role` | `barman-plugin-metrics-auth-role` |
|
||||||
|
| `metrics-auth-rolebinding` | `barman-plugin-metrics-auth-rolebinding` |
|
||||||
|
| `metrics-reader` | `barman-plugin-metrics-reader` |
|
||||||
|
| `objectstore-viewer-role` | `barman-plugin-objectstore-viewer-role` |
|
||||||
|
| `objectstore-editor-role` | `barman-plugin-objectstore-editor-role` |
|
||||||
|
|
||||||
|
### Namespace-scoped Resources
|
||||||
|
|
||||||
|
| Old Name | New Name | Namespace |
|
||||||
|
|-------------------------------|---------------------------------------------|---------------|
|
||||||
|
| `leader-election-role` | `barman-plugin-leader-election-role` | `cnpg-system` |
|
||||||
|
| `leader-election-rolebinding` | `barman-plugin-leader-election-rolebinding` | `cnpg-system` |
|
||||||
|
|
||||||
|
## Why This Change?
|
||||||
|
|
||||||
|
Using generic names for cluster-wide resources is discouraged as they may
|
||||||
|
conflict with other components deployed in the same cluster. The new names make
|
||||||
|
it clear that these resources belong to the Barman Cloud plugin and help avoid
|
||||||
|
naming collisions.
|
||||||
|
|
||||||
|
## Migration Instructions
|
||||||
|
|
||||||
|
This three steps migration process is straightforward and can be completed with
|
||||||
|
a few `kubectl` commands.
|
||||||
|
|
||||||
|
### Step 1: Upgrade plugin-barman-cloud
|
||||||
|
|
||||||
|
Please refer to the [Installation](installation.mdx) section to deploy the new
|
||||||
|
`plugin-barman-cloud` release.
|
||||||
|
|
||||||
|
### Step 2: Delete Old Cluster-scoped Resources
|
||||||
|
|
||||||
|
:::danger Verify Resources Before Deletion
|
||||||
|
**IMPORTANT**: The old resource names are generic and could potentially belong
|
||||||
|
to other components in your cluster.
|
||||||
|
|
||||||
|
**Before deleting each resource, verify it belongs to the Barman Cloud plugin
|
||||||
|
by checking:**
|
||||||
|
- For `objectstore-*` roles: Look for `barmancloud.cnpg.io` in the API groups
|
||||||
|
- For `metrics-*` roles: Check if they reference the `plugin-barman-cloud`
|
||||||
|
ServiceAccount in `cnpg-system` namespace
|
||||||
|
- For other roles: Look for labels like `app.kubernetes.io/name: plugin-barman-cloud`
|
||||||
|
|
||||||
|
If a resource doesn't have these indicators, **DO NOT DELETE IT** as it may
|
||||||
|
belong to another application.
|
||||||
|
|
||||||
|
Carefully review the output of each verification command before proceeding with
|
||||||
|
the `delete`.
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::tip Dry Run First
|
||||||
|
You can add `--dry-run=client` to any `kubectl delete` command to preview what
|
||||||
|
would be deleted without actually removing anything.
|
||||||
|
:::
|
||||||
|
|
||||||
|
**Only proceed if you've verified these resources belong to the Barman Cloud
|
||||||
|
plugin (see warning above).**
|
||||||
|
|
||||||
|
For each resource below, first verify it belongs to Barman Cloud, then delete
|
||||||
|
it:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Check metrics-auth-rolebinding FIRST (we'll check the role after)
|
||||||
|
# Look for references to plugin-barman-cloud ServiceAccount
|
||||||
|
kubectl describe clusterrolebinding metrics-auth-rolebinding
|
||||||
|
# If it references plugin-barman-cloud ServiceAccount in cnpg-system namespace,
|
||||||
|
# delete it:
|
||||||
|
kubectl delete clusterrolebinding metrics-auth-rolebinding
|
||||||
|
|
||||||
|
# 2. Check metrics-auth-role
|
||||||
|
# Look for references to authentication.k8s.io and authorization.k8s.io
|
||||||
|
kubectl describe clusterrole metrics-auth-role
|
||||||
|
# Verify it's not being used by any other rolebindings:
|
||||||
|
kubectl get clusterrolebinding -o json \
|
||||||
|
| jq -r '.items[] | select(.roleRef.name=="metrics-auth-role") \
|
||||||
|
| .metadata.name'
|
||||||
|
# If the above returns nothing (role is not in use) and the role looks like the
|
||||||
|
# Barman Cloud one, delete it (see warnings section):
|
||||||
|
kubectl delete clusterrole metrics-auth-role
|
||||||
|
|
||||||
|
# 3. Check objectstore-viewer-role
|
||||||
|
# Look for barmancloud.cnpg.io API group or
|
||||||
|
# for `app.kubernetes.io/name: plugin-barman-cloud` label
|
||||||
|
kubectl describe clusterrole objectstore-viewer-role
|
||||||
|
# If it shows barmancloud.cnpg.io in API groups, delete it:
|
||||||
|
kubectl delete clusterrole objectstore-viewer-role
|
||||||
|
|
||||||
|
# 4. Check objectstore-editor-role
|
||||||
|
# Look for barmancloud.cnpg.io API group or
|
||||||
|
# for `app.kubernetes.io/name: plugin-barman-cloud` label
|
||||||
|
kubectl describe clusterrole objectstore-editor-role
|
||||||
|
# If it shows barmancloud.cnpg.io in API groups, delete it:
|
||||||
|
kubectl delete clusterrole objectstore-editor-role
|
||||||
|
|
||||||
|
# 5. Check metrics-reader (MOST DANGEROUS - very generic name)
|
||||||
|
# First, check if it's being used by any rolebindings OTHER than barman's:
|
||||||
|
kubectl get clusterrolebinding -o json | jq -r '.items[] \
|
||||||
|
| select(.roleRef.name=="metrics-reader") \
|
||||||
|
| "\(.metadata.name) -> \(.subjects[0].name) in \(.subjects[0].namespace)"'
|
||||||
|
# If this shows ANY rolebindings, review them carefully. Only proceed if
|
||||||
|
# they're all Barman-related. Then check the role itself:
|
||||||
|
kubectl describe clusterrole metrics-reader
|
||||||
|
# If it ONLY has nonResourceURLs: /metrics and NO other rolebindings use it,
|
||||||
|
# delete it:
|
||||||
|
kubectl delete clusterrole metrics-reader
|
||||||
|
```
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
The `metrics-reader` role is particularly dangerous to delete blindly. Many
|
||||||
|
monitoring systems use this exact name. Only delete it if:
|
||||||
|
|
||||||
|
1. You've verified it ONLY grants access to `/metrics`
|
||||||
|
2. No other rolebindings reference it (checked with the jq command above)
|
||||||
|
3. You're certain it was created by the Barman Cloud plugin
|
||||||
|
|
||||||
|
If you're unsure, it's safer to leave it and let the new
|
||||||
|
`barman-plugin-metrics-reader` role coexist with it.
|
||||||
|
:::
|
||||||
|
|
||||||
|
If any resource is not found during the `describe` command, that's okay - it
|
||||||
|
means it was never created or already deleted. Simply skip the delete command
|
||||||
|
for that resource.
|
||||||
|
|
||||||
|
### Step 3: Delete Old Namespace-scoped Resources
|
||||||
|
|
||||||
|
Delete the old namespace-scoped resources in the `cnpg-system` namespace:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Delete the old leader-election resources
|
||||||
|
kubectl delete role leader-election-role -n cnpg-system
|
||||||
|
kubectl delete rolebinding leader-election-rolebinding -n cnpg-system
|
||||||
|
```
|
||||||
|
|
||||||
|
If any resource is not found, that's okay - it means it was never created or
|
||||||
|
already deleted.
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
- **Permissions:** If you have custom RBAC rules or tools that reference the
|
||||||
|
old resource names, they will need to be updated.
|
||||||
|
- **External Users:** If end users have been granted the
|
||||||
|
`objectstore-viewer-role` or `objectstore-editor-role`, they will need to be
|
||||||
|
re-granted the new role names (`barman-plugin-objectstore-viewer-role` and
|
||||||
|
`barman-plugin-objectstore-editor-role`).
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
After migration, verify that the new resources are created:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check cluster-scoped resources
|
||||||
|
kubectl get clusterrole | grep barman
|
||||||
|
kubectl get clusterrolebinding | grep barman
|
||||||
|
|
||||||
|
# Check namespace-scoped resources
|
||||||
|
kubectl get role,rolebinding -n cnpg-system | grep barman
|
||||||
|
```
|
||||||
|
|
||||||
|
You should see the new prefixed resource names.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Plugin Not Starting After Migration
|
||||||
|
|
||||||
|
If the plugin fails to start after migration, check:
|
||||||
|
|
||||||
|
1. **ServiceAccount permissions:** Ensure the `plugin-barman-cloud` ServiceAccount is bound to the new roles:
|
||||||
|
```bash
|
||||||
|
kubectl get clusterrolebinding barman-plugin-metrics-auth-rolebinding -o yaml
|
||||||
|
kubectl get rolebinding barman-plugin-leader-election-rolebinding -n cnpg-system -o yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Role references:** Verify that the rolebindings reference the correct role names:
|
||||||
|
```bash
|
||||||
|
kubectl describe rolebinding barman-plugin-leader-election-rolebinding -n cnpg-system
|
||||||
|
kubectl describe clusterrolebinding barman-plugin-metrics-auth-rolebinding
|
||||||
|
```
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
If you encounter issues during migration, please open an issue on the [GitHub
|
||||||
|
repository](https://github.com/cloudnative-pg/plugin-barman-cloud/issues).
|
||||||
38
web/versioned_docs/version-0.13.0/retention.md
Normal file
38
web/versioned_docs/version-0.13.0/retention.md
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 60
|
||||||
|
---
|
||||||
|
|
||||||
|
# Retention Policies
|
||||||
|
|
||||||
|
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
||||||
|
|
||||||
|
The Barman Cloud Plugin supports **automated cleanup of obsolete backups** via
|
||||||
|
retention policies, configured in the `.spec.retentionPolicy` field of the
|
||||||
|
`ObjectStore` resource.
|
||||||
|
|
||||||
|
:::note
|
||||||
|
This feature uses the `barman-cloud-backup-delete` command with the
|
||||||
|
`--retention-policy "RECOVERY WINDOW OF {{ value }} {{ unit }}"` syntax.
|
||||||
|
:::
|
||||||
|
|
||||||
|
#### Example: 30-Day Retention Policy
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: barmancloud.cnpg.io/v1
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: my-store
|
||||||
|
spec:
|
||||||
|
[...]
|
||||||
|
retentionPolicy: "30d"
|
||||||
|
````
|
||||||
|
|
||||||
|
:::note
|
||||||
|
A **recovery window retention policy** ensures the cluster can be restored to
|
||||||
|
any point in time between the calculated *Point of Recoverability* (PoR) and
|
||||||
|
the latest WAL archive. The PoR is defined as `current time - recovery window`.
|
||||||
|
The **first valid backup** is the most recent backup completed before the PoR.
|
||||||
|
Backups older than that are marked as *obsolete* and deleted after the next
|
||||||
|
backup completes.
|
||||||
|
:::
|
||||||
|
|
||||||
591
web/versioned_docs/version-0.13.0/troubleshooting.md
Normal file
591
web/versioned_docs/version-0.13.0/troubleshooting.md
Normal file
@ -0,0 +1,591 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 90
|
||||||
|
---
|
||||||
|
|
||||||
|
# Troubleshooting
|
||||||
|
|
||||||
|
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
||||||
|
|
||||||
|
This guide helps you diagnose and resolve common issues with the Barman Cloud
|
||||||
|
plugin.
|
||||||
|
|
||||||
|
:::important
|
||||||
|
We are continuously improving the integration between CloudNativePG and the
|
||||||
|
Barman Cloud plugin as it moves toward greater stability and maturity. For this
|
||||||
|
reason, we recommend using the latest available version of both components.
|
||||||
|
See the [*Requirements* section](intro.md#requirements) for details.
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::note
|
||||||
|
The following commands assume you installed the CloudNativePG operator in
|
||||||
|
the default `cnpg-system` namespace. If you installed it in a different
|
||||||
|
namespace, adjust the commands accordingly.
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Viewing Logs
|
||||||
|
|
||||||
|
To troubleshoot effectively, you’ll often need to review logs from multiple
|
||||||
|
sources:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# View operator logs (includes plugin interaction logs)
|
||||||
|
kubectl logs -n cnpg-system deployment/cnpg-controller-manager -f
|
||||||
|
|
||||||
|
# View plugin manager logs
|
||||||
|
kubectl logs -n cnpg-system deployment/barman-cloud -f
|
||||||
|
|
||||||
|
# View sidecar container logs (Barman Cloud operations)
|
||||||
|
kubectl logs -n <namespace> <cluster-pod-name> -c plugin-barman-cloud -f
|
||||||
|
|
||||||
|
# View all containers in a pod
|
||||||
|
kubectl logs -n <namespace> <cluster-pod-name> --all-containers=true
|
||||||
|
|
||||||
|
# View previous container logs (if container restarted)
|
||||||
|
kubectl logs -n <namespace> <cluster-pod-name> -c plugin-barman-cloud --previous
|
||||||
|
```
|
||||||
|
|
||||||
|
## Common Issues
|
||||||
|
|
||||||
|
### Plugin Installation Issues
|
||||||
|
|
||||||
|
#### Plugin pods not starting
|
||||||
|
|
||||||
|
**Symptoms:**
|
||||||
|
|
||||||
|
- Plugin pods stuck in `CrashLoopBackOff` or `Error`
|
||||||
|
- Plugin deployment not ready
|
||||||
|
|
||||||
|
**Possible causes and solutions:**
|
||||||
|
|
||||||
|
1. **Certificate issues**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Check if cert-manager is installed and running
|
||||||
|
kubectl get pods -n cert-manager
|
||||||
|
|
||||||
|
# Check if the plugin certificate is created
|
||||||
|
kubectl get certificates -n cnpg-system
|
||||||
|
```
|
||||||
|
|
||||||
|
If cert-manager is not installed, install it first:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Note: other installation methods for cert-manager are available
|
||||||
|
kubectl apply -f \
|
||||||
|
https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
If you are using your own certificates without cert-manager, you will need
|
||||||
|
to verify the entire certificate chain yourself.
|
||||||
|
|
||||||
|
|
||||||
|
2. **Image pull errors**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Check pod events for image pull errors
|
||||||
|
kubectl describe pod -n cnpg-system -l app=barman-cloud
|
||||||
|
```
|
||||||
|
|
||||||
|
Verify the image exists and you have proper credentials if using a private
|
||||||
|
registry.
|
||||||
|
|
||||||
|
|
||||||
|
3. **Resource constraints**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Check node resources
|
||||||
|
kubectl top nodes
|
||||||
|
kubectl describe nodes
|
||||||
|
```
|
||||||
|
|
||||||
|
Make sure your cluster has sufficient CPU and memory resources.
|
||||||
|
|
||||||
|
### Backup Failures
|
||||||
|
|
||||||
|
#### Quick Backup Troubleshooting Checklist
|
||||||
|
|
||||||
|
When a backup fails, follow these steps in order:
|
||||||
|
|
||||||
|
1. **Check backup status**:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl get backups.postgresql.cnpg.io -n <namespace>
|
||||||
|
```
|
||||||
|
2. **Get error details and target pod**:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl describe backups.postgresql.cnpg.io \
|
||||||
|
-n <namespace> <backup-name>
|
||||||
|
|
||||||
|
kubectl get backups.postgresql.cnpg.io \
|
||||||
|
-n <namespace> <backup-name> \
|
||||||
|
-o jsonpath='{.status.instanceID.podName}'
|
||||||
|
```
|
||||||
|
3. **Check the target pod’s sidecar logs**:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
TARGET_POD=$(kubectl get backups.postgresql.cnpg.io \
|
||||||
|
-n <namespace> <backup-name> \
|
||||||
|
-o jsonpath='{.status.instanceID.podName}')
|
||||||
|
|
||||||
|
kubectl logs \
|
||||||
|
-n <namespace> $TARGET_POD -c plugin-barman-cloud \
|
||||||
|
--tail=100 | grep -E "ERROR|FATAL|panic"
|
||||||
|
```
|
||||||
|
4. **Check cluster events**:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl get events -n <namespace> \
|
||||||
|
--field-selector involvedObject.name=<cluster-name> \
|
||||||
|
--sort-by='.lastTimestamp'
|
||||||
|
```
|
||||||
|
5. **Verify plugin is running**:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl get pods \
|
||||||
|
-n cnpg-system -l app=barman-cloud
|
||||||
|
```
|
||||||
|
6. **Check operator logs**:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl logs \
|
||||||
|
-n cnpg-system deployment/cnpg-controller-manager \
|
||||||
|
--tail=100 | grep -i "backup\|plugin"
|
||||||
|
```
|
||||||
|
7. **Check plugin manager logs**:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl logs \
|
||||||
|
-n cnpg-system deployment/barman-cloud --tail=100
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Backup job fails immediately
|
||||||
|
|
||||||
|
**Symptoms:**
|
||||||
|
|
||||||
|
- Backup pods terminate with error
|
||||||
|
- No backup files appear in object storage
|
||||||
|
- Backup shows `failed` phase with various error messages
|
||||||
|
|
||||||
|
**Common failure modes and solutions:**
|
||||||
|
|
||||||
|
1. **"requested plugin is not available" errors**
|
||||||
|
|
||||||
|
```
|
||||||
|
requested plugin is not available: barman
|
||||||
|
requested plugin is not available: barman-cloud
|
||||||
|
requested plugin is not available: barman-cloud.cloudnative-pg.io
|
||||||
|
```
|
||||||
|
|
||||||
|
**Cause:** The plugin name in the Cluster configuration doesn’t match the
|
||||||
|
deployed plugin, or the plugin isn’t registered.
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
|
||||||
|
a. **Check plugin registration:**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# If you have the `cnpg` plugin installed (v1.27.0+)
|
||||||
|
kubectl cnpg status -n <namespace> <cluster-name>
|
||||||
|
```
|
||||||
|
|
||||||
|
Look for the "Plugins status" section:
|
||||||
|
```
|
||||||
|
Plugins status
|
||||||
|
Name Version Status Reported Operator Capabilities
|
||||||
|
---- ------- ------ ------------------------------
|
||||||
|
barman-cloud.cloudnative-pg.io 0.6.0 N/A Reconciler Hooks, Lifecycle Service
|
||||||
|
```
|
||||||
|
|
||||||
|
b. **Verify plugin name in `Cluster` spec**:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: Cluster
|
||||||
|
spec:
|
||||||
|
plugins:
|
||||||
|
- name: barman-cloud.cloudnative-pg.io
|
||||||
|
parameters:
|
||||||
|
barmanObjectName: <your-objectstore-name>
|
||||||
|
```
|
||||||
|
|
||||||
|
c. **Check plugin deployment is running**:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl get deployment -n cnpg-system barman-cloud
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **"rpc error: code = Unknown desc = panic caught: assignment to entry in nil map" errors**
|
||||||
|
|
||||||
|
**Cause:** Misconfiguration in the `ObjectStore` (e.g., typo or missing field).
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
|
||||||
|
- Review sidecar logs for details
|
||||||
|
- Verify `ObjectStore` configuration and secrets
|
||||||
|
- Common issues include:
|
||||||
|
- Missing or incorrect secret references
|
||||||
|
- Typos in configuration parameters
|
||||||
|
- Missing required environment variables in secrets
|
||||||
|
|
||||||
|
#### Backup performance issues
|
||||||
|
|
||||||
|
**Symptoms:**
|
||||||
|
|
||||||
|
- Backups take extremely long
|
||||||
|
- Backups timeout
|
||||||
|
|
||||||
|
**Plugin-specific considerations:**
|
||||||
|
|
||||||
|
1. **Check `ObjectStore` parallelism settings**
|
||||||
|
- Adjust `maxParallel` in `ObjectStore` configuration
|
||||||
|
- Monitor sidecar container resource usage during backups
|
||||||
|
|
||||||
|
2. **Verify plugin resource allocation**
|
||||||
|
- Check if the sidecar container has sufficient CPU/memory
|
||||||
|
- Review plugin container logs for resource-related warnings
|
||||||
|
|
||||||
|
:::tip
|
||||||
|
For Barman-specific features like compression, encryption, and performance
|
||||||
|
tuning, refer to the [Barman documentation](https://docs.pgbarman.org/latest/).
|
||||||
|
:::
|
||||||
|
|
||||||
|
### WAL Archiving Issues
|
||||||
|
|
||||||
|
#### WAL archiving stops
|
||||||
|
|
||||||
|
**Symptoms:**
|
||||||
|
|
||||||
|
- WAL files accumulate on the primary
|
||||||
|
- Cluster shows WAL archiving warnings
|
||||||
|
- Sidecar logs show WAL errors
|
||||||
|
|
||||||
|
**Debugging steps:**
|
||||||
|
|
||||||
|
1. **Check plugin sidecar logs for WAL archiving errors**
|
||||||
|
```sh
|
||||||
|
# Check recent WAL archive operations in sidecar
|
||||||
|
kubectl logs -n <namespace> <primary-pod> -c plugin-barman-cloud \
|
||||||
|
--tail=50 | grep -i wal
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Check ObjectStore configuration for WAL settings**
|
||||||
|
- Ensure ObjectStore has proper WAL retention settings
|
||||||
|
- Verify credentials have permissions for WAL operations
|
||||||
|
|
||||||
|
### Restore Issues
|
||||||
|
|
||||||
|
#### Restore fails during recovery
|
||||||
|
|
||||||
|
**Symptoms:**
|
||||||
|
|
||||||
|
- New cluster stuck in recovery
|
||||||
|
- Plugin sidecar shows restore errors
|
||||||
|
- PostgreSQL won’t start
|
||||||
|
|
||||||
|
**Debugging steps:**
|
||||||
|
|
||||||
|
1. **Check plugin sidecar logs during restore**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Check the sidecar logs on the recovering cluster pods
|
||||||
|
kubectl logs -n <namespace> <cluster-pod-name> \
|
||||||
|
-c plugin-barman-cloud --tail=100
|
||||||
|
|
||||||
|
# Look for restore-related errors
|
||||||
|
kubectl logs -n <namespace> <cluster-pod-name> \
|
||||||
|
-c plugin-barman-cloud | grep -E "restore|recovery|ERROR"
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Verify plugin can access backups**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Check if `ObjectStore` is properly configured for restore
|
||||||
|
kubectl get objectstores.barmancloud.cnpg.io \
|
||||||
|
-n <namespace> <objectstore-name> -o yaml
|
||||||
|
|
||||||
|
# Check PostgreSQL recovery logs
|
||||||
|
kubectl logs -n <namespace> <cluster-pod> \
|
||||||
|
-c postgres | grep -i recovery
|
||||||
|
```
|
||||||
|
|
||||||
|
:::tip
|
||||||
|
For detailed Barman restore operations and troubleshooting, refer to the
|
||||||
|
[Barman documentation](https://docs.pgbarman.org/latest/barman-cloud-restore.html).
|
||||||
|
:::
|
||||||
|
|
||||||
|
#### Point-in-time recovery (PITR) configuration issues
|
||||||
|
|
||||||
|
**Symptoms:**
|
||||||
|
|
||||||
|
- PITR doesn’t reach target time
|
||||||
|
- WAL access errors
|
||||||
|
- Recovery halts early
|
||||||
|
|
||||||
|
**Debugging steps:**
|
||||||
|
|
||||||
|
1. **Verify PITR configuration in the `Cluster` spec**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: Cluster
|
||||||
|
metadata:
|
||||||
|
name: <cluster-restore-name>
|
||||||
|
spec:
|
||||||
|
storage:
|
||||||
|
size: 1Gi
|
||||||
|
|
||||||
|
bootstrap:
|
||||||
|
recovery:
|
||||||
|
source: origin
|
||||||
|
recoveryTarget:
|
||||||
|
targetTime: "2024-01-15T10:30:00Z"
|
||||||
|
|
||||||
|
externalClusters:
|
||||||
|
- name: origin
|
||||||
|
plugin:
|
||||||
|
enabled: true
|
||||||
|
name: barman-cloud.cloudnative-pg.io
|
||||||
|
parameters:
|
||||||
|
barmanObjectName: <object-store-name>
|
||||||
|
serverName: <source-cluster-name>
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Check sidecar logs for WAL-related errors**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl logs -n <namespace> <cluster-pod> \
|
||||||
|
-c plugin-barman-cloud | grep -i wal
|
||||||
|
```
|
||||||
|
|
||||||
|
:::note
|
||||||
|
Timestamps without an explicit timezone suffix
|
||||||
|
(e.g., `2024-01-15 10:30:00`) are interpreted as UTC.
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
Always specify an explicit timezone in your timestamp to avoid ambiguity.
|
||||||
|
For example, use `2024-01-15T10:30:00Z` or `2024-01-15T10:30:00+02:00`
|
||||||
|
instead of `2024-01-15 10:30:00`.
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::note
|
||||||
|
For detailed PITR configuration and WAL management, see the
|
||||||
|
[Barman PITR documentation](https://docs.pgbarman.org/latest/).
|
||||||
|
:::
|
||||||
|
|
||||||
|
### Plugin Configuration Issues
|
||||||
|
|
||||||
|
#### Plugin cannot connect to object storage
|
||||||
|
|
||||||
|
**Symptoms:**
|
||||||
|
|
||||||
|
- Sidecar logs show connection errors
|
||||||
|
- Backups fail with authentication or network errors
|
||||||
|
- `ObjectStore` resource reports errors
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
|
||||||
|
1. **Verify `ObjectStore` CRD configuration and secrets**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Check ObjectStore resource status
|
||||||
|
kubectl get objectstores.barmancloud.cnpg.io \
|
||||||
|
-n <namespace> <objectstore-name> -o yaml
|
||||||
|
|
||||||
|
# Verify the secret exists and has correct keys for your provider
|
||||||
|
kubectl get secret -n <namespace> <secret-name> \
|
||||||
|
-o jsonpath='{.data}' | jq 'keys'
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Check sidecar logs for connectivity issues**
|
||||||
|
```sh
|
||||||
|
kubectl logs -n <namespace> <cluster-pod> \
|
||||||
|
-c plugin-barman-cloud | grep -E "connect|timeout|SSL|cert"
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Adjust provider-specific settings (endpoint, path style, etc.)**
|
||||||
|
- See [Object Store Configuration](object_stores.md) for provider-specific settings
|
||||||
|
- Ensure `endpointURL` is set correctly for your storage provider
|
||||||
|
- Verify network policies allow egress to your storage provider
|
||||||
|
|
||||||
|
## Diagnostic Commands
|
||||||
|
|
||||||
|
### Using the `cnpg` plugin for `kubectl`
|
||||||
|
|
||||||
|
The `cnpg` plugin for `kubectl` provides extended debugging capabilities.
|
||||||
|
Keep it updated:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Install or update the `cnpg` plugin
|
||||||
|
kubectl krew install cnpg
|
||||||
|
# Or using an alternative method: https://cloudnative-pg.io/documentation/current/kubectl-plugin/#install
|
||||||
|
|
||||||
|
# Check plugin status (requires CNPG 1.27.0+)
|
||||||
|
kubectl cnpg status <cluster-name> -n <namespace>
|
||||||
|
|
||||||
|
# View cluster status in detail
|
||||||
|
kubectl cnpg status <cluster-name> -n <namespace> --verbose
|
||||||
|
```
|
||||||
|
|
||||||
|
## Getting Help
|
||||||
|
|
||||||
|
If problems persist:
|
||||||
|
|
||||||
|
1. **Check the documentation**
|
||||||
|
|
||||||
|
- [Installation Guide](installation.mdx)
|
||||||
|
- [Object Store Configuration](object_stores.md) (for provider-specific settings)
|
||||||
|
- [Usage Examples](usage.md)
|
||||||
|
|
||||||
|
|
||||||
|
2. **Gather diagnostic information**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Create a diagnostic bundle (⚠️ sanitize these before sharing!)
|
||||||
|
kubectl get objectstores.barmancloud.cnpg.io -A -o yaml > /tmp/objectstores.yaml
|
||||||
|
kubectl get clusters.postgresql.cnpg.io -A -o yaml > /tmp/clusters.yaml
|
||||||
|
kubectl logs -n cnpg-system deployment/barman-cloud --tail=1000 > /tmp/plugin.log
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
3. **Community support**
|
||||||
|
|
||||||
|
- CloudNativePG Slack: [#cloudnativepg-users](https://cloud-native.slack.com/messages/cloudnativepg-users)
|
||||||
|
- GitHub Issues: [plugin-barman-cloud](https://github.com/cloudnative-pg/plugin-barman-cloud/issues)
|
||||||
|
|
||||||
|
|
||||||
|
4. **Include when reporting**
|
||||||
|
|
||||||
|
- CloudNativePG version
|
||||||
|
- Plugin version
|
||||||
|
- Kubernetes version
|
||||||
|
- Cloud provider and region
|
||||||
|
- Relevant configuration (⚠️ sanitize/redact sensitive information)
|
||||||
|
- Error messages and logs
|
||||||
|
- Steps to reproduce
|
||||||
|
|
||||||
|
## Known Issues and Limitations
|
||||||
|
|
||||||
|
### Current Known Issues
|
||||||
|
|
||||||
|
1. **Migration compatibility**: After migrating from in-tree backup to the
|
||||||
|
plugin, the `kubectl cnpg backup` command syntax has changed
|
||||||
|
([#353](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/353)):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Old command (in-tree, no longer works after migration)
|
||||||
|
kubectl cnpg backup -n <namespace> <cluster-name> \
|
||||||
|
--method=barmanObjectStore
|
||||||
|
|
||||||
|
# New command (plugin-based)
|
||||||
|
kubectl cnpg backup -n <namespace> <cluster-name> \
|
||||||
|
--method=plugin --plugin-name=barman-cloud.cloudnative-pg.io
|
||||||
|
```
|
||||||
|
|
||||||
|
### 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
|
||||||
|
resources with PostgreSQL
|
||||||
|
|
||||||
|
3. **Plugin restart behavior**: Restarting the sidecar container requires
|
||||||
|
restarting the entire PostgreSQL pod
|
||||||
|
|
||||||
|
## Recap of General Debugging Steps
|
||||||
|
|
||||||
|
### Check Backup Status and Identify the Target Instance
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# List all backups and their status
|
||||||
|
kubectl get backups.postgresql.cnpg.io -n <namespace>
|
||||||
|
|
||||||
|
# Get detailed backup information including error messages and target instance
|
||||||
|
kubectl describe backups.postgresql.cnpg.io \
|
||||||
|
-n <namespace> <backup-name>
|
||||||
|
|
||||||
|
# Extract the target pod name from a failed backup
|
||||||
|
kubectl get backups.postgresql.cnpg.io \
|
||||||
|
-n <namespace> <backup-name> \
|
||||||
|
-o jsonpath='{.status.instanceID.podName}'
|
||||||
|
|
||||||
|
# Get more details including the target pod, method, phase, and error
|
||||||
|
kubectl get backups.postgresql.cnpg.io \
|
||||||
|
-n <namespace> <backup-name> \
|
||||||
|
-o jsonpath='Pod: {.status.instanceID.podName}{"\n"}Method: {.status.method}{"\n"}Phase: {.status.phase}{"\n"}Error: {.status.error}{"\n"}'
|
||||||
|
|
||||||
|
# Check the cluster status for backup-related information
|
||||||
|
kubectl cnpg status <cluster-name> -n <namespace> --verbose
|
||||||
|
```
|
||||||
|
|
||||||
|
### Check Sidecar Logs on the Backup Target Pod
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Identify which pod was the backup target (from the previous step)
|
||||||
|
TARGET_POD=$(kubectl get backups.postgresql.cnpg.io \
|
||||||
|
-n <namespace> <backup-name> \
|
||||||
|
-o jsonpath='{.status.instanceID.podName}')
|
||||||
|
echo "Backup target pod: $TARGET_POD"
|
||||||
|
|
||||||
|
# Check the sidecar logs on the specific target pod
|
||||||
|
kubectl logs -n <namespace> $TARGET_POD \
|
||||||
|
-c plugin-barman-cloud --tail=100
|
||||||
|
|
||||||
|
# Follow the logs in real time
|
||||||
|
kubectl logs -n <namespace> $TARGET_POD \
|
||||||
|
-c plugin-barman-cloud -f
|
||||||
|
|
||||||
|
# Check for specific errors in the target pod around the backup time
|
||||||
|
kubectl logs -n <namespace> $TARGET_POD \
|
||||||
|
-c plugin-barman-cloud --since=10m | grep -E "ERROR|FATAL|panic|failed"
|
||||||
|
|
||||||
|
# Alternative: List all cluster pods and their roles
|
||||||
|
kubectl get pods -n <namespace> -l cnpg.io/cluster=<cluster-name> \
|
||||||
|
-o custom-columns=NAME:.metadata.name,ROLE:.metadata.labels.cnpg\\.io/instanceRole,INSTANCE:.metadata.labels.cnpg\\.io/instanceName
|
||||||
|
|
||||||
|
# Check sidecar logs on ALL cluster pods (if the target is unclear)
|
||||||
|
for pod in $(kubectl get pods -n <namespace> -l cnpg.io/cluster=<cluster-name> -o name); do
|
||||||
|
echo "=== Checking $pod ==="
|
||||||
|
kubectl logs -n <namespace> $pod -c plugin-barman-cloud \
|
||||||
|
--tail=20 | grep -i error || echo "No errors found"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
### Check Events for Backup-Related Issues
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Check events for the cluster
|
||||||
|
kubectl get events -n <namespace> \
|
||||||
|
--field-selector involvedObject.name=<cluster-name>
|
||||||
|
|
||||||
|
# Check events for failed backups
|
||||||
|
kubectl get events -n <namespace> \
|
||||||
|
--field-selector involvedObject.kind=Backup
|
||||||
|
|
||||||
|
# Get all recent events in the namespace
|
||||||
|
kubectl get events -n <namespace> --sort-by='.lastTimestamp' | tail -20
|
||||||
|
```
|
||||||
|
|
||||||
|
### Verify `ObjectStore` Configuration
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Check the ObjectStore resource
|
||||||
|
kubectl get objectstores.barmancloud.cnpg.io \
|
||||||
|
-n <namespace> <objectstore-name> -o yaml
|
||||||
|
|
||||||
|
# Verify the secret exists and has the correct keys
|
||||||
|
kubectl get secret -n <namespace> <secret-name> -o yaml
|
||||||
|
# Alternatively
|
||||||
|
kubectl get secret -n <namespace> <secret-name> -o jsonpath='{.data}' | jq 'keys'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Common Error Messages and Solutions
|
||||||
|
|
||||||
|
* **"AccessDenied" or "403 Forbidden"** — Check cloud credentials and bucket permissions.
|
||||||
|
* **"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.
|
||||||
|
|
||||||
16
web/versioned_docs/version-0.13.0/upgrades.mdx
Normal file
16
web/versioned_docs/version-0.13.0/upgrades.mdx
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 25
|
||||||
|
---
|
||||||
|
|
||||||
|
# Upgrades
|
||||||
|
|
||||||
|
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
||||||
|
|
||||||
|
You can upgrade the plugin simply by installing the new version. Unless
|
||||||
|
explicitly stated below or in the release notes, no special steps are required.
|
||||||
|
|
||||||
|
## Upgrading to version 0.8.x from previous versions
|
||||||
|
|
||||||
|
Version **0.8.0** introduces breaking changes to resource naming.
|
||||||
|
To complete the upgrade successfully, follow the instructions in the
|
||||||
|
["Resource name migration guide"](resource-name-migration.md).
|
||||||
283
web/versioned_docs/version-0.13.0/usage.md
Normal file
283
web/versioned_docs/version-0.13.0/usage.md
Normal file
@ -0,0 +1,283 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 30
|
||||||
|
---
|
||||||
|
|
||||||
|
# Using the Barman Cloud Plugin
|
||||||
|
|
||||||
|
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
||||||
|
|
||||||
|
After [installing the plugin](installation.mdx) in the same namespace as the
|
||||||
|
CloudNativePG operator, enabling your PostgreSQL cluster to use the Barman
|
||||||
|
Cloud Plugin involves just a few steps:
|
||||||
|
|
||||||
|
- Defining the object store containing your WAL archive and base backups, using
|
||||||
|
your preferred [provider](object_stores.md)
|
||||||
|
- Instructing the Postgres cluster to use the Barman Cloud Plugin
|
||||||
|
|
||||||
|
From that moment, you’ll be able to issue on-demand backups or define a backup
|
||||||
|
schedule, as well as rely on the object store for recovery operations.
|
||||||
|
|
||||||
|
The rest of this page details each step, using MinIO as object store provider.
|
||||||
|
|
||||||
|
## Defining the `ObjectStore`
|
||||||
|
|
||||||
|
An `ObjectStore` resource must be created for each object store used in your
|
||||||
|
PostgreSQL architecture. Here's an example configuration using MinIO:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: barmancloud.cnpg.io/v1
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: minio-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
destinationPath: s3://backups/
|
||||||
|
endpointURL: http://minio:9000
|
||||||
|
s3Credentials:
|
||||||
|
accessKeyId:
|
||||||
|
name: minio
|
||||||
|
key: ACCESS_KEY_ID
|
||||||
|
secretAccessKey:
|
||||||
|
name: minio
|
||||||
|
key: ACCESS_SECRET_KEY
|
||||||
|
wal:
|
||||||
|
compression: gzip
|
||||||
|
```
|
||||||
|
|
||||||
|
The `.spec.configuration` schema follows the same format as the
|
||||||
|
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
||||||
|
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/)
|
||||||
|
for additional details.
|
||||||
|
|
||||||
|
:::important
|
||||||
|
The `serverName` parameter in the `ObjectStore` resource is retained solely for
|
||||||
|
API compatibility with the in-tree `barmanObjectStore` and must always be left empty.
|
||||||
|
When needed, use the `serverName` plugin parameter in the Cluster configuration instead.
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Configuring WAL Archiving
|
||||||
|
|
||||||
|
Once the `ObjectStore` is defined, you can configure your PostgreSQL cluster
|
||||||
|
to archive WALs by referencing the store in the `.spec.plugins` section:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: Cluster
|
||||||
|
metadata:
|
||||||
|
name: cluster-example
|
||||||
|
spec:
|
||||||
|
instances: 3
|
||||||
|
imagePullPolicy: Always
|
||||||
|
plugins:
|
||||||
|
- name: barman-cloud.cloudnative-pg.io
|
||||||
|
isWALArchiver: true
|
||||||
|
parameters:
|
||||||
|
barmanObjectName: minio-store
|
||||||
|
storage:
|
||||||
|
size: 1Gi
|
||||||
|
```
|
||||||
|
|
||||||
|
This configuration enables both WAL archiving and data directory backups.
|
||||||
|
|
||||||
|
## Performing a Base Backup
|
||||||
|
|
||||||
|
Once WAL archiving is enabled, the cluster is ready for backups. Backups can be
|
||||||
|
created either declaratively (with YAML manifests) or imperatively (with the
|
||||||
|
`cnpg` plugin).
|
||||||
|
|
||||||
|
### Declarative approach (YAML manifest)
|
||||||
|
|
||||||
|
Create a backup resource by applying a YAML manifest:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: Backup
|
||||||
|
metadata:
|
||||||
|
name: backup-example
|
||||||
|
spec:
|
||||||
|
cluster:
|
||||||
|
name: cluster-example
|
||||||
|
method: plugin
|
||||||
|
pluginConfiguration:
|
||||||
|
name: barman-cloud.cloudnative-pg.io
|
||||||
|
```
|
||||||
|
|
||||||
|
### Imperative approach (using the `cnpg` plugin)
|
||||||
|
|
||||||
|
The quickest way to trigger an on-demand backup is with the `cnpg` plugin:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl cnpg backup -n <namespace> <cluster-name> \
|
||||||
|
--method=plugin \
|
||||||
|
--plugin-name=barman-cloud.cloudnative-pg.io
|
||||||
|
```
|
||||||
|
|
||||||
|
:::note Migration from in-tree backups
|
||||||
|
If you are migrating from the in-tree backup system, note the change in syntax:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Old command (in-tree backup)
|
||||||
|
kubectl cnpg backup -n <namespace> <cluster-name> --method=barmanObjectStore
|
||||||
|
|
||||||
|
# New command (plugin-based backup)
|
||||||
|
kubectl cnpg backup -n <namespace> <cluster-name> \
|
||||||
|
--method=plugin \
|
||||||
|
--plugin-name=barman-cloud.cloudnative-pg.io
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Restoring a Cluster
|
||||||
|
|
||||||
|
To restore a cluster from an object store, create a new `Cluster` resource that
|
||||||
|
references the store containing the backup. Below is an example configuration:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: Cluster
|
||||||
|
metadata:
|
||||||
|
name: cluster-restore
|
||||||
|
spec:
|
||||||
|
instances: 3
|
||||||
|
imagePullPolicy: IfNotPresent
|
||||||
|
bootstrap:
|
||||||
|
recovery:
|
||||||
|
source: source
|
||||||
|
externalClusters:
|
||||||
|
- name: source
|
||||||
|
plugin:
|
||||||
|
name: barman-cloud.cloudnative-pg.io
|
||||||
|
parameters:
|
||||||
|
barmanObjectName: minio-store
|
||||||
|
serverName: cluster-example
|
||||||
|
storage:
|
||||||
|
size: 1Gi
|
||||||
|
```
|
||||||
|
|
||||||
|
:::important
|
||||||
|
The above configuration does **not** enable WAL archiving for the restored cluster.
|
||||||
|
:::
|
||||||
|
|
||||||
|
To enable WAL archiving for the restored cluster, include the `.spec.plugins`
|
||||||
|
section alongside the `externalClusters.plugin` section, as shown below:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: Cluster
|
||||||
|
metadata:
|
||||||
|
name: cluster-restore
|
||||||
|
spec:
|
||||||
|
instances: 3
|
||||||
|
imagePullPolicy: IfNotPresent
|
||||||
|
bootstrap:
|
||||||
|
recovery:
|
||||||
|
source: source
|
||||||
|
plugins:
|
||||||
|
- name: barman-cloud.cloudnative-pg.io
|
||||||
|
isWALArchiver: true
|
||||||
|
parameters:
|
||||||
|
# Backup Object Store (push, read-write)
|
||||||
|
barmanObjectName: minio-store-bis
|
||||||
|
externalClusters:
|
||||||
|
- name: source
|
||||||
|
plugin:
|
||||||
|
name: barman-cloud.cloudnative-pg.io
|
||||||
|
parameters:
|
||||||
|
# Recovery Object Store (pull, read-only)
|
||||||
|
barmanObjectName: minio-store
|
||||||
|
serverName: cluster-example
|
||||||
|
storage:
|
||||||
|
size: 1Gi
|
||||||
|
```
|
||||||
|
|
||||||
|
The same object store may be used for both transaction log archiving and
|
||||||
|
restoring a cluster, or you can configure separate stores for these purposes.
|
||||||
|
|
||||||
|
## Configuring Replica Clusters
|
||||||
|
|
||||||
|
You can set up a distributed topology by combining the previously defined
|
||||||
|
configurations with the `.spec.replica` section. Below is an example of how to
|
||||||
|
define a replica cluster:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: Cluster
|
||||||
|
metadata:
|
||||||
|
name: cluster-dc-a
|
||||||
|
spec:
|
||||||
|
instances: 3
|
||||||
|
primaryUpdateStrategy: unsupervised
|
||||||
|
|
||||||
|
storage:
|
||||||
|
storageClass: csi-hostpath-sc
|
||||||
|
size: 1Gi
|
||||||
|
|
||||||
|
plugins:
|
||||||
|
- name: barman-cloud.cloudnative-pg.io
|
||||||
|
isWALArchiver: true
|
||||||
|
parameters:
|
||||||
|
barmanObjectName: minio-store-a
|
||||||
|
|
||||||
|
replica:
|
||||||
|
self: cluster-dc-a
|
||||||
|
primary: cluster-dc-a
|
||||||
|
source: cluster-dc-b
|
||||||
|
|
||||||
|
externalClusters:
|
||||||
|
- name: cluster-dc-a
|
||||||
|
plugin:
|
||||||
|
name: barman-cloud.cloudnative-pg.io
|
||||||
|
parameters:
|
||||||
|
barmanObjectName: minio-store-a
|
||||||
|
|
||||||
|
- name: cluster-dc-b
|
||||||
|
plugin:
|
||||||
|
name: barman-cloud.cloudnative-pg.io
|
||||||
|
parameters:
|
||||||
|
barmanObjectName: minio-store-b
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuring the plugin instance sidecar
|
||||||
|
|
||||||
|
The Barman Cloud Plugin runs as a sidecar container next to each PostgreSQL
|
||||||
|
instance pod. It manages backup, WAL archiving, and restore processes.
|
||||||
|
|
||||||
|
Configuration comes from multiple `ObjectStore` resources:
|
||||||
|
|
||||||
|
1. The one referenced in the
|
||||||
|
`.spec.plugins` section of the `Cluster`. This is the
|
||||||
|
object store used for WAL archiving and base backups.
|
||||||
|
2. The one referenced in the external cluster
|
||||||
|
used in the `.spec.replica.source` section of the `Cluster`. This is
|
||||||
|
used by the log-shipping designated primary to get the WAL files.
|
||||||
|
3. The one referenced in the
|
||||||
|
`.spec.bootstrap.recovery.source` section of the `Cluster`. Used by
|
||||||
|
the initial recovery job to create the cluster from an existing backup.
|
||||||
|
|
||||||
|
You can fine-tune sidecar behavior in the `.spec.instanceSidecarConfiguration`
|
||||||
|
of your ObjectStore. These settings apply to all PostgreSQL instances that use
|
||||||
|
this object store. Any updates take effect at the next `Cluster` reconciliation,
|
||||||
|
and could generate a rollout of the `Cluster`.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: barmancloud.cnpg.io/v1
|
||||||
|
kind: ObjectStore
|
||||||
|
metadata:
|
||||||
|
name: minio-store
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
# [...]
|
||||||
|
instanceSidecarConfiguration:
|
||||||
|
retentionPolicyIntervalSeconds: 1800
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: "XXX"
|
||||||
|
cpu: "YYY"
|
||||||
|
limits:
|
||||||
|
memory: "XXX"
|
||||||
|
cpu: "YYY"
|
||||||
|
```
|
||||||
|
|
||||||
|
:::note
|
||||||
|
If more than one `ObjectStore` applies, the `instanceSidecarConfiguration` of
|
||||||
|
the one set in `.spec.plugins` has priority.
|
||||||
|
:::
|
||||||
@ -46,7 +46,7 @@ spec:
|
|||||||
|
|
||||||
The `.spec.configuration` schema follows the same format as the
|
The `.spec.configuration` schema follows the same format as the
|
||||||
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
||||||
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/preview/backup_barmanobjectstore/)
|
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/)
|
||||||
for additional details.
|
for additional details.
|
||||||
|
|
||||||
:::important
|
:::important
|
||||||
|
|||||||
@ -46,7 +46,7 @@ spec:
|
|||||||
|
|
||||||
The `.spec.configuration` schema follows the same format as the
|
The `.spec.configuration` schema follows the same format as the
|
||||||
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
||||||
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/preview/backup_barmanobjectstore/)
|
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/)
|
||||||
for additional details.
|
for additional details.
|
||||||
|
|
||||||
:::important
|
:::important
|
||||||
|
|||||||
@ -46,7 +46,7 @@ spec:
|
|||||||
|
|
||||||
The `.spec.configuration` schema follows the same format as the
|
The `.spec.configuration` schema follows the same format as the
|
||||||
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
||||||
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/preview/backup_barmanobjectstore/)
|
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/)
|
||||||
for additional details.
|
for additional details.
|
||||||
|
|
||||||
:::important
|
:::important
|
||||||
|
|||||||
@ -46,7 +46,7 @@ spec:
|
|||||||
|
|
||||||
The `.spec.configuration` schema follows the same format as the
|
The `.spec.configuration` schema follows the same format as the
|
||||||
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
||||||
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/preview/backup_barmanobjectstore/)
|
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/)
|
||||||
for additional details.
|
for additional details.
|
||||||
|
|
||||||
:::important
|
:::important
|
||||||
|
|||||||
@ -46,7 +46,7 @@ spec:
|
|||||||
|
|
||||||
The `.spec.configuration` schema follows the same format as the
|
The `.spec.configuration` schema follows the same format as the
|
||||||
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
||||||
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/preview/backup_barmanobjectstore/)
|
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/)
|
||||||
for additional details.
|
for additional details.
|
||||||
|
|
||||||
:::important
|
:::important
|
||||||
|
|||||||
@ -46,7 +46,7 @@ spec:
|
|||||||
|
|
||||||
The `.spec.configuration` schema follows the same format as the
|
The `.spec.configuration` schema follows the same format as the
|
||||||
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
||||||
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/preview/backup_barmanobjectstore/)
|
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/)
|
||||||
for additional details.
|
for additional details.
|
||||||
|
|
||||||
:::important
|
:::important
|
||||||
|
|||||||
@ -46,7 +46,7 @@ spec:
|
|||||||
|
|
||||||
The `.spec.configuration` schema follows the same format as the
|
The `.spec.configuration` schema follows the same format as the
|
||||||
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration).
|
||||||
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/preview/backup_barmanobjectstore/)
|
Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/)
|
||||||
for additional details.
|
for additional details.
|
||||||
|
|
||||||
:::important
|
:::important
|
||||||
|
|||||||
8
web/versioned_sidebars/version-0.13.0-sidebars.json
Normal file
8
web/versioned_sidebars/version-0.13.0-sidebars.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"docs": [
|
||||||
|
{
|
||||||
|
"type": "autogenerated",
|
||||||
|
"dirName": "."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -1,4 +1,5 @@
|
|||||||
[
|
[
|
||||||
|
"0.13.0",
|
||||||
"0.12.0",
|
"0.12.0",
|
||||||
"0.11.0",
|
"0.11.0",
|
||||||
"0.10.0",
|
"0.10.0",
|
||||||
|
|||||||
3033
web/yarn.lock
3033
web/yarn.lock
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user