mirror of
https://github.com/cloudnative-pg/plugin-barman-cloud.git
synced 2026-07-06 17:52:21 +02:00
Compare commits
15 Commits
5d390d108e
...
a926622d77
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a926622d77 | ||
|
|
0c687cbbf1 | ||
|
|
5a17340088 | ||
|
|
d55942a67f | ||
|
|
a45459582f | ||
|
|
eb5e860775 | ||
|
|
c34b2329ea | ||
|
|
f7f0136520 | ||
|
|
7190349470 | ||
|
|
2fa63c4bc2 | ||
|
|
007cf8a892 | ||
|
|
f4326b50c4 | ||
|
|
9fbbcf2a84 | ||
|
|
55ee7448a6 | ||
|
|
8fe9b47ae1 |
4
.github/workflows/ci.yml
vendored
4
.github/workflows/ci.yml
vendored
@ -32,7 +32,7 @@ jobs:
|
||||
df -h
|
||||
echo "-----------------------------------------------------"
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7.0.0
|
||||
# We need the full history for the commitlint task
|
||||
with:
|
||||
fetch-depth: 0
|
||||
@ -44,7 +44,7 @@ jobs:
|
||||
- name: Install Dagger
|
||||
env:
|
||||
# renovate: datasource=github-tags depName=dagger/dagger versioning=semver
|
||||
DAGGER_VERSION: 0.21.6
|
||||
DAGGER_VERSION: 0.21.7
|
||||
run: |
|
||||
curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh
|
||||
- name: Run CI task
|
||||
|
||||
2
.github/workflows/publish-docs.yml
vendored
2
.github/workflows/publish-docs.yml
vendored
@ -25,7 +25,7 @@ jobs:
|
||||
contents: read
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7.0.0
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v6
|
||||
|
||||
4
.github/workflows/release-please.yml
vendored
4
.github/workflows/release-please.yml
vendored
@ -19,7 +19,7 @@ jobs:
|
||||
# We'll use the cli until there's a fix for
|
||||
# https://github.com/googleapis/release-please/issues/2280.
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7.0.0
|
||||
- name: Install node
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
@ -31,7 +31,7 @@ jobs:
|
||||
- name: Install Dagger
|
||||
env:
|
||||
# renovate: datasource=github-tags depName=dagger/dagger versioning=semver
|
||||
DAGGER_VERSION: 0.21.6
|
||||
DAGGER_VERSION: 0.21.7
|
||||
run: |
|
||||
curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh
|
||||
- name: Create image and manifest
|
||||
|
||||
4
.github/workflows/release-publish.yml
vendored
4
.github/workflows/release-publish.yml
vendored
@ -13,7 +13,7 @@ jobs:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7.0.0
|
||||
- name: Install QEMU static binaries
|
||||
uses: docker/setup-qemu-action@v4
|
||||
- name: Install Task
|
||||
@ -21,7 +21,7 @@ jobs:
|
||||
- name: Install Dagger
|
||||
env:
|
||||
# renovate: datasource=github-tags depName=dagger/dagger versioning=semver
|
||||
DAGGER_VERSION: 0.21.6
|
||||
DAGGER_VERSION: 0.21.7
|
||||
run: |
|
||||
curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh
|
||||
- name: Create image and manifest
|
||||
|
||||
12
Taskfile.yml
12
Taskfile.yml
@ -46,7 +46,7 @@ tasks:
|
||||
- wordlist-ordered
|
||||
env:
|
||||
# renovate: datasource=git-refs depName=spellcheck lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||
DAGGER_SPELLCHECK_SHA: e7f11923ad316021146ee34e3db9dc2d66cbb2d1
|
||||
DAGGER_SPELLCHECK_SHA: 679d5056358d3cd838ec226333decff673602937
|
||||
cmds:
|
||||
- >
|
||||
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
|
||||
env:
|
||||
# renovate: datasource=git-refs depName=commitlint lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||
DAGGER_COMMITLINT_SHA: e7f11923ad316021146ee34e3db9dc2d66cbb2d1
|
||||
DAGGER_COMMITLINT_SHA: 679d5056358d3cd838ec226333decff673602937
|
||||
cmds:
|
||||
- >
|
||||
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/commitlint@${DAGGER_COMMITLINT_SHA}
|
||||
@ -74,7 +74,7 @@ tasks:
|
||||
- wordlist-ordered
|
||||
env:
|
||||
# renovate: datasource=git-refs depName=uncommitted lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||
DAGGER_UNCOMMITTED_SHA: e7f11923ad316021146ee34e3db9dc2d66cbb2d1
|
||||
DAGGER_UNCOMMITTED_SHA: 679d5056358d3cd838ec226333decff673602937
|
||||
cmds:
|
||||
- GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/uncommitted@${DAGGER_UNCOMMITTED_SHA} check-uncommitted --source . stdout
|
||||
sources:
|
||||
@ -86,7 +86,7 @@ tasks:
|
||||
- controller-gen
|
||||
env:
|
||||
# renovate: datasource=git-refs depName=crd-gen-refs lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||
DAGGER_CRDGENREF_SHA: e7f11923ad316021146ee34e3db9dc2d66cbb2d1
|
||||
DAGGER_CRDGENREF_SHA: 679d5056358d3cd838ec226333decff673602937
|
||||
# renovate: datasource=go depName=github.com/elastic/crd-ref-docs
|
||||
CRDREFDOCS_VERSION: v0.3.0
|
||||
cmds:
|
||||
@ -206,7 +206,7 @@ tasks:
|
||||
- start-build-network
|
||||
vars:
|
||||
# renovate: datasource=github-tags depName=dagger/dagger versioning=semver
|
||||
DAGGER_VERSION: 0.21.6
|
||||
DAGGER_VERSION: 0.21.7
|
||||
DAGGER_ENGINE_IMAGE: registry.dagger.io/engine:v{{ .DAGGER_VERSION }}
|
||||
cmds:
|
||||
- >
|
||||
@ -381,7 +381,7 @@ tasks:
|
||||
run: once
|
||||
env:
|
||||
# renovate: datasource=git-refs depName=controller-gen lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||
DAGGER_CONTROLLER_GEN_SHA: e7f11923ad316021146ee34e3db9dc2d66cbb2d1
|
||||
DAGGER_CONTROLLER_GEN_SHA: 679d5056358d3cd838ec226333decff673602937
|
||||
cmds:
|
||||
- >
|
||||
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/controller-gen@${DAGGER_CONTROLLER_GEN_SHA}
|
||||
|
||||
@ -22,13 +22,13 @@ barman==3.19.1 \
|
||||
--hash=sha256:0a6a9e1babf97687732d8b2a3eb79ea95d55246a5257b9433865cb6e755221c0 \
|
||||
--hash=sha256:2f71c4a1f1ba53f694cbdf838bb9906d8ba02b97d1fd3041196e8999bec7a1ee
|
||||
# via -r sidecar-requirements.in
|
||||
boto3==1.43.26 \
|
||||
--hash=sha256:33f027b7911dffe84f4896b66024c228eb856f4cf8c1ff3465be0eae1f413731 \
|
||||
--hash=sha256:7c88bfbde6abcf062d04ac410a1cf4eaf8675f025f35f3ad9accc9b0224ce6b9
|
||||
boto3==1.43.30 \
|
||||
--hash=sha256:6b1ee360f363a457f67a8f5702f522043d8a32d67a97c362ad12075d8b5b531e \
|
||||
--hash=sha256:89e982463d94773136ccf69be77cccd54ff1ce351a6aadd1d3437fcb693681b5
|
||||
# via barman
|
||||
botocore==1.43.26 \
|
||||
--hash=sha256:eeb92265bae289555182a46341c998a656ab49c0dbdb762c65b30fe354fcc9e8 \
|
||||
--hash=sha256:fd9280ac868194afcee59c7def62e0031fb4b599f7ef85360d30c7e42357c1dc
|
||||
botocore==1.43.30 \
|
||||
--hash=sha256:19ed560cb35ae43bf010d37da429a553c07063bf7efea0f2cb53be8a78d3e3d5 \
|
||||
--hash=sha256:26b1dded84d89b396180916f56900bd2ab1c0d545a66d1d2c3eeb40f772935b2
|
||||
# via
|
||||
# boto3
|
||||
# s3transfer
|
||||
@ -390,56 +390,53 @@ cramjam==2.11.0 \
|
||||
# via
|
||||
# barman
|
||||
# python-snappy
|
||||
cryptography==48.0.1 \
|
||||
--hash=sha256:08a597acce1ff37f347400087776599e2348a3a8bc53b44120e463cd274efe4a \
|
||||
--hash=sha256:09f73a725d582cef64b91281a322cd798d14a33b2b6f2b7ad9531dc336d84c02 \
|
||||
--hash=sha256:0df56b056bc17c1b7d6821dfa65216e62bd232d8ab05eb3db44e71d235651471 \
|
||||
--hash=sha256:0ee6ea481db1ab889cba043ec1eda17bb9c1ea79db6722f779c3667f9f70322f \
|
||||
--hash=sha256:15254441469dd6bf027039453288e2072124f8b6603563f5d759e1c9b69273fa \
|
||||
--hash=sha256:266f4ee051abb2f725b74ef8072b521ce1feacf685a3364fa6a6b45548db791a \
|
||||
--hash=sha256:2c37f2461406063b417837f5f3daab668652acd82423efcd7f0a9f04be972de1 \
|
||||
--hash=sha256:32143b24adb918f078134e1e230f1eb8cc04886b92c28b5f0041aaf3e5699225 \
|
||||
--hash=sha256:33842cf0888951cef5bc7ac724ab844a42044c1727b967b7f8997289a0464f92 \
|
||||
--hash=sha256:3752f2dbc8f07a30aad2932c986cea495b03bb554887828225da104f732852b6 \
|
||||
--hash=sha256:39489bfca54c7a1f6b297efcd8bc608ab92d16c4ca631b0cad4da46724588b24 \
|
||||
--hash=sha256:3e4a1a3232eef2e6c732827d5722db29a0cc8b27af2a4d865b094cf954be9ca1 \
|
||||
--hash=sha256:3fd2ca57062b241c856670b073487d2e86c4637937ca5601e48f97bf8e11fc8f \
|
||||
--hash=sha256:42fcd8e26fe555d9b3577a135f5091fefa0aa4e99129c23fb56787a1bd4ada72 \
|
||||
--hash=sha256:43c5835e2cb98c8733d86f57d6fc879b613f5c3478607281c3e36daffc6dd8a6 \
|
||||
--hash=sha256:48fe40804d4caa2288f24e70ca8c64c42dd826da0ad7e4f1b41b2128d679e6c8 \
|
||||
--hash=sha256:4ab0a343c807bbcd90c971cd1ecf072937cd01847a9e002bef88fb47ac6be577 \
|
||||
--hash=sha256:4fdc69f8e4316bcf0c8c8ec1f26f285d12e8142d88d96c876a59a03be3f6ae67 \
|
||||
--hash=sha256:6184ca7b174f28d7c703f1290d4b297217c45355f77a98f67e9b7f14549ac54a \
|
||||
--hash=sha256:66fd0771e7b9c6dcd44cf1120690d2338d16d72795cf40cae2786a39eba65429 \
|
||||
--hash=sha256:6b2c0c3e6ccf3ade7750f836ef3ee36eea250cc467d45c256895573ac08cc6f1 \
|
||||
--hash=sha256:735824ec41b7f74a7c45fb1591349333e4c696cb6c044e5f46356e560143e4cd \
|
||||
--hash=sha256:7e234ac052af99f2700826a5c29ea99d9c1b1f80341cde62d11c8154dc8e0bd9 \
|
||||
--hash=sha256:869c3b8a53bfe27147832df48b32adadf558249d50e76cb3769d40e986b13265 \
|
||||
--hash=sha256:86be3b1b0b6bf09482fb50a979c508d2950ed95f5621ec77f4e385962006b83a \
|
||||
--hash=sha256:86fe77abb1bd87afb251d4d02ada7ecf53a32cee9b67d976abb2e45a13297475 \
|
||||
--hash=sha256:88c852a0ae366e262e5a1744b685e6a433dc8788dd2a277e418bf4904203609d \
|
||||
--hash=sha256:8ace4507d1e6533c125f4fac754f8bb8b6a74c08e92179dabd7e16571a3efbf3 \
|
||||
--hash=sha256:92a46e1d638daa264ba2971c0b0489c9409787943efae4d60ffda3d091ef832c \
|
||||
--hash=sha256:9621de99d2da096006b629979efd8ae7eb2d8b822488d0c89ee4000c306c59b1 \
|
||||
--hash=sha256:9a49ca6c81417f6a5edb50375a60cccdd70fa0a91a5211829dbea74eba94d2ac \
|
||||
--hash=sha256:9bd3f92d76217892b15df84ca256c2c113d386fdda7a7d8691aeeced976507c6 \
|
||||
--hash=sha256:9de21387aa95e2a895823d0745b430bed4f33503ba9ab5e0b5311f33e37d66d2 \
|
||||
--hash=sha256:b024e784ad6c077ee0147b35ea9cbfc1e34e1fd4c1dcca214c2794d73a12df08 \
|
||||
--hash=sha256:b4e391975f038e66432328639620a4aff2d307513b004f1ca06d6225bced815c \
|
||||
--hash=sha256:b74ca3b8e5ecdd833bf6a002ca41b4793bb27fb8f1c06ffaf2643c9e9140e31b \
|
||||
--hash=sha256:b7a2d1a937a738a881737cec135a38bb61470589b17515b9f73f571d0ae10401 \
|
||||
--hash=sha256:b9a32b876490d66c8bcc9963ef220199569748434ab01a9d6aaeabf88e7f5158 \
|
||||
--hash=sha256:bd81490cd5801d755cf97bb68ac191f14b708470b1c7cf4580f669b9c9264cd8 \
|
||||
--hash=sha256:c1400da5e32a43253392277eac7490a60e497d810a63dd5608d71bbd7af507c9 \
|
||||
--hash=sha256:d069066deead00ac7f090be101be875a06855908f7ec004c27b8fefb4acfb411 \
|
||||
--hash=sha256:d5d30989c6917b478b5817902e85fddaea2261efa8648383d965381ccb9e1ac4 \
|
||||
--hash=sha256:df637c05205ea7c1d7fbcbe54bbfea648a52951155f997af13d895d0ecc96991 \
|
||||
--hash=sha256:e361afba8918070d376df76f408a4f67fec0ee9cff81a99e48fe9a233ef59e17 \
|
||||
--hash=sha256:eb86ce1af36fe65041b6db9a8bb064ee621a7e5fded0f80d475ec243477cd242 \
|
||||
--hash=sha256:f0d27a5696721ef7a672b8c810f6aded391058e0b9486e63e6d93baf765da691 \
|
||||
--hash=sha256:f2ceef93cb096aa3c4cc4b5c94ca6131f9196d28c64d6111533402a9b2054d41 \
|
||||
--hash=sha256:f817adc181390bd54f2f700107a7419040fb7c1bdf2fc26f36551a06a68c3345 \
|
||||
--hash=sha256:fe0180af5bf9236518a087e35bf2d9a347d5f5f51e63c579d683ddff424e3d46
|
||||
cryptography==49.0.0 \
|
||||
--hash=sha256:026ac7423e6fa66872d3bf889be5974507da3944f866f704fa200eadacd00001 \
|
||||
--hash=sha256:07cab27cc7b7e0fd28e5e26bb9eeedde5c135c868b46de4a27845abe94af6122 \
|
||||
--hash=sha256:084ef1af862eb07ec46d25f68689f2102a9fc0e05ce7b80f14f5fe51e4eef0f6 \
|
||||
--hash=sha256:0b82e28ee398a386f0807bba7884d30f25218855690f45115831bcce5d90822c \
|
||||
--hash=sha256:0e959b578856a3924bc0cbb710fc12c387b9412a951389f3ca61704a9e25f325 \
|
||||
--hash=sha256:0f21641cf4b30fca7aee061ced0ec7ad7b073518088b7c9969a297c0ae796c69 \
|
||||
--hash=sha256:196ecd6a36e4e9aa10270393bb98d8df88fccee0bf1e5128b91ae4eb4375896d \
|
||||
--hash=sha256:2400ef9c9e2299a25614eb1dea3db54a69b1349efd043bfac9c67630d136df36 \
|
||||
--hash=sha256:28d8b15e6275f12c8a207dc309dfa957903c927d08d0cc937ee3f63f200693cc \
|
||||
--hash=sha256:2afe9051da7ae7bd5905da5a949280c7d2bb75682e188f650a9d0f2756b834c6 \
|
||||
--hash=sha256:2eda353d8a27bcbcaa4cbed18994a74ab4d19a2ca897db188ea269ab9b71419b \
|
||||
--hash=sha256:32703d93296f5c1f4b53349ad3a250c2cae0fdecd3a3dd5d47e616d8d616af27 \
|
||||
--hash=sha256:33cd0565932807baddb67b96dbee92f2c374b5c89dee09fd74079aeb8c8dba61 \
|
||||
--hash=sha256:35b151772baff2c74cba7fa290ceaff4c3b11c0c881eb93eb5dbc05a7cfbba18 \
|
||||
--hash=sha256:36d1709f992593689b45bda411498d62c6e365f2ca00b84657d4dadd24de16db \
|
||||
--hash=sha256:42b0684e0e40cf26122427802486f6d93aea593612603a94fbf260c7eb1e9c1b \
|
||||
--hash=sha256:4ae387c9cb68ea569ca17e490d66d8142b81c3cc814bf179974b7d146e490bbb \
|
||||
--hash=sha256:53ecee2e23f7169b6117e99fc8a944e5e50f79e69758a83b52a00cb98ab2b2d2 \
|
||||
--hash=sha256:66ec79c3904820572d7e987abdf304281f141d37ad9a489b8e97066e7b9b6459 \
|
||||
--hash=sha256:67e1d20ad9ef3a563c59ef22e7a8a0b8210bd26604369ea4a30a7c66aefe504e \
|
||||
--hash=sha256:6f2debedf9ca60cf1d5bd466475638af5130f89965605cd818484d19987d3a21 \
|
||||
--hash=sha256:6fc361c34fb6aac015ce19435876635e5c6d21db31998b0920f675f131e043b8 \
|
||||
--hash=sha256:73a205dce83953d131a4aa1e0fd917a2fd1c5b1eef251e9d7152efefcbf5caf7 \
|
||||
--hash=sha256:7abcee80084cda3f7691f3eb1ce480d8df49cec637b429aa35986c1de71738aa \
|
||||
--hash=sha256:8c25ceb16df5b9435f3f6a9829204985b0e0cbee3b48aacd432c7d2c850b44d9 \
|
||||
--hash=sha256:966fe0e9c67490071f14c0d2b1cb2dfb3023c5ce39457343931415f08382f2db \
|
||||
--hash=sha256:9e82dcc8e56052715fb18b2429e3bca4823b1629136a2084fc45a9a5cecb9b64 \
|
||||
--hash=sha256:b20133d204d2bb56ba047642199603876c872026ca53e79c35b83772ab2cc505 \
|
||||
--hash=sha256:b39efa323140595abd3ecca8529d321ae50f55f3aa3ba9cc81ea56a6011953d5 \
|
||||
--hash=sha256:b47db11c2c3525083296069b98ac5221907455e989ae0c2e3008bde851921615 \
|
||||
--hash=sha256:b87e65d263b3e5d3bb92a57e2a6638e2f31110fa7aa890c7b2dbba42248d0a3f \
|
||||
--hash=sha256:b970c6da94d5bb18629db453d14f2a1300f6bf59b61e9b82377931ef95504866 \
|
||||
--hash=sha256:be9fcb48a55f023493482827d4f459bd263cc20efde64f204b97c123201850c6 \
|
||||
--hash=sha256:c2bc30226390d60ea19d9f82b19db005fe0452154a23c1c410c12ea801e43561 \
|
||||
--hash=sha256:c83782480a4a9da4d0feb51950131ba32e12e70813848b3343f6e18c28a66838 \
|
||||
--hash=sha256:cbc77da8c523d5abd028635ba850a6966fcee2c82e2bf65a41d1d8afe0f98be9 \
|
||||
--hash=sha256:ccac2bfebc306b862133e3bb71f3f6ee8bb525240089b2d952e4144b3a6d5da7 \
|
||||
--hash=sha256:d0527ce944105f257f605a827d6ebead966c752038b6e8656abb9c5edee6fc68 \
|
||||
--hash=sha256:d8ecde755e2e91bf773fc94e8c9d730cd7f2007004cb492263a794ec3899a1c8 \
|
||||
--hash=sha256:e3fb64c420688e5319ae25113a354015abbd8dffbfbc41781a1ea66fc7622ac3 \
|
||||
--hash=sha256:e5dfc1e64de5677cec922ffa8da89c546d0415bf6efdf081842e5d44c84e1f0e \
|
||||
--hash=sha256:ec5e529fb80935c94fe7b729f9972b50e351a0e6b50aa294fd5cabb109fcc29a \
|
||||
--hash=sha256:f37d847238971164fdbc68ade6f6574aecc9c0af714190e2083429ff68f4ce9d \
|
||||
--hash=sha256:f78ff2c9ed8dc2d036b0f4d640e22522213d047c1b14e61205a7e55c80a494d4 \
|
||||
--hash=sha256:f89660a348f4f78a92366240a61404e337586ef7f5909a2fef59ca88ef505493 \
|
||||
--hash=sha256:fc1e275c2f1d97b1a6450b8b0ea3ebfa6e087a611c2b26cb2404d48588abab7b
|
||||
# via
|
||||
# azure-identity
|
||||
# azure-storage-blob
|
||||
@ -452,9 +449,9 @@ google-api-core==2.31.0 \
|
||||
# via
|
||||
# google-cloud-core
|
||||
# google-cloud-storage
|
||||
google-auth==2.53.0 \
|
||||
--hash=sha256:6e7449917c599b35126a99ec268ec6880301f2fea41dce198fe8fd83ff642b68 \
|
||||
--hash=sha256:e7e6aa16f6bee7b2b264830fd04f08087a1d5a836df516251a5d15327b246c9c
|
||||
google-auth==2.55.0 \
|
||||
--hash=sha256:a17cef9dedf98c4ebae2fb0c48c8f75952c877cbc2efe09f329ef16c2783d88a \
|
||||
--hash=sha256:fcd3a130f575fa36403d38774af1c64a4fbfbca09215f0589d2372b5119697cb
|
||||
# via
|
||||
# google-api-core
|
||||
# google-cloud-core
|
||||
@ -463,9 +460,9 @@ google-cloud-core==2.6.0 \
|
||||
--hash=sha256:6d63ac8e5eca6d9e4319d0a1e2265fadcd7f1049904378caecfa01cf52dd869e \
|
||||
--hash=sha256:e76149739f90fac1fc6757c09f47eaccb3145b54adbd7759b0f7c4b235f46c83
|
||||
# via google-cloud-storage
|
||||
google-cloud-storage==3.11.0 \
|
||||
--hash=sha256:498bf37c999028f69a245f586b5e50d89f59df1fafc0e3a93783ac56be2a456b \
|
||||
--hash=sha256:cfcc33aa6b899ec9dd1771286f8e79fbed5c35c1c174718071b079aa827f37c2
|
||||
google-cloud-storage==3.12.0 \
|
||||
--hash=sha256:03ae9847c6babb368f35f054126b8a08cbc0e3266efb990eb17b9926a45cf3be \
|
||||
--hash=sha256:3880773754ddf7c27567b04e2a4d193950b6b99429f37b9097d873686e95b09c
|
||||
# via barman
|
||||
google-crc32c==1.8.0 \
|
||||
--hash=sha256:014a7e68d623e9a4222d663931febc3033c5c7c9730785727de2a81f87d5bab8 \
|
||||
@ -599,15 +596,15 @@ proto-plus==1.28.0 \
|
||||
--hash=sha256:38e5696342835b08fc116f30a25665b29531cda9d5d5643e9b81fc312385abd9 \
|
||||
--hash=sha256:a630604310899e73c59ec302e5765c058d412b2f090b9c79c8822589f14955b8
|
||||
# via google-api-core
|
||||
protobuf==7.35.0 \
|
||||
--hash=sha256:4c4617b83ade0e279d1d2bfe04025a1adb87f9ed657de038620dc0ff959357f6 \
|
||||
--hash=sha256:4cbf5cc286130e06a6c9bbefac442431173906dfcc979712183d4adcc01b37ee \
|
||||
--hash=sha256:66be6c513931c794fa92c080ffee41671390da3d79da219cf9c0c0907f035dda \
|
||||
--hash=sha256:6c0f98f10c8a05ea30f8993dfef2de093d27b490fdae78bb60c8343795d55011 \
|
||||
--hash=sha256:a2efd84605f41e559f1881b0912b44099d0a2ac9bf46b3474823f10fb393b0e6 \
|
||||
--hash=sha256:c13f325cf242bad135c350629eeb5d54b24228eb472fb3e2e9ebbd4c5dc20ca0 \
|
||||
--hash=sha256:f05bcadf9a2a6b8dda047007075135fb7d08c73d9177aabc067e1be46881a201 \
|
||||
--hash=sha256:fcbe42a4ac09d3ec9c987ddfcd956afd0b15f1ff613bd8371bde9405ffd5c8e5
|
||||
protobuf==7.35.1 \
|
||||
--hash=sha256:11d6b0ec246892d85215b0a13ca6e0233cf5284b68f0ac02646427f4ff88a799 \
|
||||
--hash=sha256:230a75ddfc2de4806e56696ce9640c1cdfdb6543b7cfce98d42a4c0a0e7bdb87 \
|
||||
--hash=sha256:24f857477359a85c0c235261b8ba905fd51b2562f4a64ca1df5473f29850cbf6 \
|
||||
--hash=sha256:353652e4efd0bca5b5fc2656abf8307ef351f0cf938c9eba09f0e09c20a25c30 \
|
||||
--hash=sha256:4bc97768d8fe4ad6743c8a19403e314511ed9f6d13205b687e52421c023ac1b9 \
|
||||
--hash=sha256:74758715c53d7158fb76caf4f0cfdacc5329a4b1bb994f865d6cf302d413a1c4 \
|
||||
--hash=sha256:b73f9489a4b8b1c9cb1f8ed951c736392592edb24b9d6819f36d2e10b171d5b4 \
|
||||
--hash=sha256:ce115a26fe0c39a2c29973d914d327e516a6455464489fe3cd1e51a1b354f81a
|
||||
# via
|
||||
# google-api-core
|
||||
# googleapis-common-protos
|
||||
|
||||
4
go.mod
4
go.mod
@ -5,7 +5,7 @@ go 1.26.3
|
||||
require (
|
||||
github.com/cert-manager/cert-manager v1.20.2
|
||||
github.com/cloudnative-pg/api v1.29.1
|
||||
github.com/cloudnative-pg/barman-cloud v0.5.2-0.20260616073548-263818883a1c
|
||||
github.com/cloudnative-pg/barman-cloud v0.5.2-0.20260619084538-8d9302e232e7
|
||||
github.com/cloudnative-pg/cloudnative-pg v1.29.1
|
||||
github.com/cloudnative-pg/cnpg-i v0.5.0
|
||||
github.com/cloudnative-pg/cnpg-i-machinery v0.4.2
|
||||
@ -20,7 +20,7 @@ require (
|
||||
k8s.io/apiextensions-apiserver v0.36.2
|
||||
k8s.io/apimachinery v0.36.2
|
||||
k8s.io/client-go v0.36.2
|
||||
k8s.io/utils v0.0.0-20260507154919-ff6756f316d2
|
||||
k8s.io/utils v0.0.0-20260617174310-a95e086a2553
|
||||
sigs.k8s.io/controller-runtime v0.24.1
|
||||
sigs.k8s.io/kustomize/api v0.21.1
|
||||
sigs.k8s.io/kustomize/kyaml v0.21.1
|
||||
|
||||
8
go.sum
8
go.sum
@ -20,8 +20,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/cloudnative-pg/api v1.29.1 h1:FWr8S7EQeOfdhYXyr2cof8wUXLARZiiQt5Qa6ltED7w=
|
||||
github.com/cloudnative-pg/api v1.29.1/go.mod h1:QtWF3yzSvIfORMHaSkPAk/o3bhCJwEHJgN3riyRiz3o=
|
||||
github.com/cloudnative-pg/barman-cloud v0.5.2-0.20260616073548-263818883a1c h1:5ILvYitKJ3+yT+bDGQM+21QOpa/a8ayCdTqtbWpYJtk=
|
||||
github.com/cloudnative-pg/barman-cloud v0.5.2-0.20260616073548-263818883a1c/go.mod h1:vmW7blcg0BECd/9YKqn7NdiF7jz9BlXCWJcGJpzzBCg=
|
||||
github.com/cloudnative-pg/barman-cloud v0.5.2-0.20260619084538-8d9302e232e7 h1:lNWqibnwlJesDrwAukg8gQF4Hpys3jx31LaXZFoP9vA=
|
||||
github.com/cloudnative-pg/barman-cloud v0.5.2-0.20260619084538-8d9302e232e7/go.mod h1:vmW7blcg0BECd/9YKqn7NdiF7jz9BlXCWJcGJpzzBCg=
|
||||
github.com/cloudnative-pg/cloudnative-pg v1.29.1 h1:ZNEt1TMlnQKXI1kho2UqQuqdfvIvjGln4kN7C1lsmGA=
|
||||
github.com/cloudnative-pg/cloudnative-pg v1.29.1/go.mod h1:Sbgx9jVmkle4/gR2U5JHrzDd74sRPOBHDtPkvncg5v8=
|
||||
github.com/cloudnative-pg/cnpg-i v0.5.0 h1:/TOzpNT6cwNgrpftTtrnLKdoHgMwd+88vZgXjlVgXeE=
|
||||
@ -326,8 +326,8 @@ k8s.io/kube-openapi v0.0.0-20260502001324-b7f5293f4787 h1:kHv8PETbPIVHfqKBYwTNNS
|
||||
k8s.io/kube-openapi v0.0.0-20260502001324-b7f5293f4787/go.mod h1:Cyq7UE0QtGe+Zo+/6XFrxiS4Mq0tLyQEONkFzSkfp9o=
|
||||
k8s.io/streaming v0.36.2 h1:NSKthPPg9UFSKsRauVJUVGH2Dvn8fhKmY4qrMkw/p98=
|
||||
k8s.io/streaming v0.36.2/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s=
|
||||
k8s.io/utils v0.0.0-20260507154919-ff6756f316d2 h1:wU4tMEhLGgIbLvXQb1cfN+EcM0wf7zC6CPF+C79jroc=
|
||||
k8s.io/utils v0.0.0-20260507154919-ff6756f316d2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
|
||||
k8s.io/utils v0.0.0-20260617174310-a95e086a2553 h1:hmGqDecjc8d7HVzWzRFl0QD9bYuYKbBEG7t8xwnVxfI=
|
||||
k8s.io/utils v0.0.0-20260617174310-a95e086a2553/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
|
||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 h1:hSfpvjjTQXQY2Fol2CS0QHMNs/WI1MOSGzCm1KhM5ec=
|
||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
|
||||
sigs.k8s.io/controller-runtime v0.24.1 h1:miPEwrmirImAvgME1L9qebGHrOnGJoVmVdtOU9fRfo4=
|
||||
|
||||
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
|
||||
|
||||
@ -224,7 +224,6 @@ func (w WALServiceImplementation) Archive(
|
||||
}
|
||||
|
||||
// Restore implements the WALService interface
|
||||
// nolint: gocognit
|
||||
func (w WALServiceImplementation) Restore(
|
||||
ctx context.Context,
|
||||
request *wal.WALRestoreRequest,
|
||||
@ -239,36 +238,7 @@ func (w WALServiceImplementation) Restore(
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var serverName string
|
||||
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()
|
||||
}
|
||||
serverName, objectStoreKey := resolveRestoreObjectStore(configuration, w.InstanceName)
|
||||
|
||||
var objectStore barmancloudv1.ObjectStore
|
||||
if err := w.Client.Get(ctx, objectStoreKey, &objectStore); err != nil {
|
||||
@ -284,6 +254,33 @@ func (w WALServiceImplementation) Restore(
|
||||
ctx, configuration.Cluster, &objectStore, serverName, walName, destinationPath)
|
||||
}
|
||||
|
||||
// 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(
|
||||
ctx context.Context,
|
||||
cluster *cnpgv1.Cluster,
|
||||
|
||||
98
internal/cnpgi/common/wal_test.go
Normal file
98
internal/cnpgi/common/wal_test.go
Normal file
@ -0,0 +1,98 @@
|
||||
/*
|
||||
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 (
|
||||
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"),
|
||||
)
|
||||
})
|
||||
@ -263,7 +263,9 @@ func getReplicaSourcePlugin(cluster *cnpgv1.Cluster) *cnpgv1.PluginConfiguration
|
||||
func (config *PluginConfiguration) Validate() error {
|
||||
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")
|
||||
}
|
||||
|
||||
|
||||
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")
|
||||
}
|
||||
@ -273,8 +273,10 @@ func (impl LifecycleImplementation) collectAdditionalInstanceArgs(
|
||||
return args
|
||||
}
|
||||
|
||||
// Prefer the cluster object store (backup/archive). If not set, fallback to the recovery object store.
|
||||
// If neither is configured, no additional args are provided.
|
||||
// Only one object store provides the sidecar arguments, with precedence:
|
||||
// BarmanObjectName (backup/archive) > RecoveryBarmanObjectName (recovery
|
||||
// bootstrap) > ReplicaSourceBarmanObjectName (pg_basebackup replica).
|
||||
// If none is configured, no additional args are provided.
|
||||
if len(pluginConfiguration.BarmanObjectName) > 0 {
|
||||
var barmanObjectStore barmancloudv1.ObjectStore
|
||||
if err := impl.Client.Get(ctx, pluginConfiguration.GetBarmanObjectKey(), &barmanObjectStore); err != nil {
|
||||
@ -303,6 +305,20 @@ func (impl LifecycleImplementation) collectAdditionalInstanceArgs(
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
@ -48,6 +48,9 @@ func (impl LifecycleImplementation) collectSidecarResourcesForPod(
|
||||
ctx context.Context,
|
||||
configuration *config.PluginConfiguration,
|
||||
) (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 {
|
||||
// On a replica cluster that also archives, the designated primary
|
||||
// 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 {
|
||||
// On a replica cluster that doesn't archive, 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.
|
||||
// On a cluster recovering from an object store (including log-shipping
|
||||
// replica clusters, where the recovery and replica source object stores
|
||||
// coincide), we use the recovery object store for configuring the
|
||||
// resources of the sidecar container.
|
||||
var barmanObjectStore barmancloudv1.ObjectStore
|
||||
if err := impl.Client.Get(ctx, configuration.GetRecoveryBarmanObjectKey(), &barmanObjectStore); err != nil {
|
||||
return corev1.ResourceRequirements{}, err
|
||||
@ -76,5 +79,18 @@ func (impl LifecycleImplementation) collectSidecarResourcesForPod(
|
||||
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
|
||||
}
|
||||
|
||||
@ -28,6 +28,7 @@ import (
|
||||
barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1"
|
||||
batchv1 "k8s.io/api/batch/v1"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/api/resource"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client/fake"
|
||||
@ -293,6 +294,24 @@ var _ = Describe("LifecycleImplementation", func() {
|
||||
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) {
|
||||
ns := "test-ns"
|
||||
cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}}
|
||||
@ -386,6 +405,117 @@ var _ = Describe("LifecycleImplementation", func() {
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
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())
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@ -53,6 +53,7 @@
|
||||
],
|
||||
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*const\\s+\\w+\\s*=\\s*"(?<currentValue>[^"]+?)"',
|
||||
],
|
||||
},
|
||||
{
|
||||
|
||||
@ -55,10 +55,10 @@ func WithIgnoreExistingResources(ignore bool) InstallOption {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: renovate
|
||||
|
||||
// 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.20.2"
|
||||
|
||||
// Install installs cert-manager using kubectl.
|
||||
func Install(ctx context.Context, cl client.Client, opts ...InstallOption) error {
|
||||
|
||||
@ -97,9 +97,8 @@ func WithIgnoreExistingResources(ignore bool) SetupOption {
|
||||
}
|
||||
|
||||
func defaultSetupOptions() SetupOptions {
|
||||
// TODO: renovate
|
||||
return SetupOptions{
|
||||
CertManagerVersion: "v1.15.1",
|
||||
CertManagerVersion: certmanager.DefaultVersion,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -8396,9 +8396,9 @@ send@~0.19.0, send@~0.19.1:
|
||||
statuses "~2.0.2"
|
||||
|
||||
serialize-javascript@>=7.0.5, serialize-javascript@^6.0.0, serialize-javascript@^6.0.1:
|
||||
version "7.0.5"
|
||||
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-7.0.5.tgz#c798cc0552ffbb08981914a42a8756e339d0d5b1"
|
||||
integrity sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==
|
||||
version "7.0.6"
|
||||
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-7.0.6.tgz#f2f20c8af0757e4d8fa329d0210636da0682ddef"
|
||||
integrity sha512-ATTK5Q4gFVg0YDp1my2vqygyvhcklD/UV5GIlYHooGTn/NogJqIzpetkD6E5kmuVULqz/S9inUL25XcAgDRJQg==
|
||||
|
||||
serve-handler@^6.1.7:
|
||||
version "6.1.7"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user