mirror of
https://github.com/cloudnative-pg/plugin-barman-cloud.git
synced 2026-09-06 23:12:21 +02:00
Compare commits
14 Commits
65472273da
...
5f20cc983d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5f20cc983d | ||
|
|
f38a3e3a08 | ||
|
|
5ff12acda0 | ||
|
|
76d4f22aa3 | ||
|
|
ce8a3db8c5 | ||
|
|
fcb0d1eaf4 | ||
|
|
6d0aeec367 | ||
|
|
ce8179442b | ||
|
|
65b028003e | ||
|
|
7bcb74b987 | ||
|
|
1d777435d0 | ||
|
|
fb3f0f9dab | ||
|
|
fe82a311ec | ||
|
|
5e62b7ef88 |
30
.github/workflows/ci.yml
vendored
30
.github/workflows/ci.yml
vendored
@ -6,12 +6,15 @@ on:
|
||||
|
||||
permissions: read-all
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||
|
||||
jobs:
|
||||
ci:
|
||||
runs-on: ${{ vars.CI_RUNNERS || 'ubuntu-latest' }}
|
||||
permissions:
|
||||
packages: write
|
||||
contents: write
|
||||
contents: read
|
||||
steps:
|
||||
- name: Cleanup Disk
|
||||
if: vars.CI_RUNNERS == '' || vars.CI_RUNNERS == 'ubuntu-latest'
|
||||
@ -39,8 +42,6 @@ jobs:
|
||||
with:
|
||||
fetch-depth: 0
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
- name: Install QEMU static binaries
|
||||
uses: docker/setup-qemu-action@v4
|
||||
- name: Install Task
|
||||
uses: arduino/setup-task@v3.0.0
|
||||
- name: Install Dagger
|
||||
@ -52,6 +53,27 @@ jobs:
|
||||
- name: Run CI task
|
||||
run: |
|
||||
task ci
|
||||
|
||||
publish:
|
||||
runs-on: ${{ vars.CI_RUNNERS || 'ubuntu-latest' }}
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v7.0.1
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
- name: Install QEMU static binaries
|
||||
uses: docker/setup-qemu-action@v4
|
||||
- name: Install Task
|
||||
uses: arduino/setup-task@v3.0.0
|
||||
- name: Install Dagger
|
||||
env:
|
||||
# renovate: datasource=github-tags depName=dagger/dagger versioning=semver
|
||||
DAGGER_VERSION: 0.21.7
|
||||
run: |
|
||||
curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh
|
||||
- name: Write manifest
|
||||
run: |
|
||||
task manifest
|
||||
|
||||
10
Taskfile.yml
10
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: 7431c24907de3c6b1516114c8990d4f8d23d92cd
|
||||
DAGGER_SPELLCHECK_SHA: f7187c307f2ba79290efbfff5ce436b956162c53
|
||||
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: 7431c24907de3c6b1516114c8990d4f8d23d92cd
|
||||
DAGGER_COMMITLINT_SHA: f7187c307f2ba79290efbfff5ce436b956162c53
|
||||
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: 7431c24907de3c6b1516114c8990d4f8d23d92cd
|
||||
DAGGER_UNCOMMITTED_SHA: f7187c307f2ba79290efbfff5ce436b956162c53
|
||||
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: 7431c24907de3c6b1516114c8990d4f8d23d92cd
|
||||
DAGGER_CRDGENREF_SHA: f7187c307f2ba79290efbfff5ce436b956162c53
|
||||
# renovate: datasource=go depName=github.com/elastic/crd-ref-docs
|
||||
CRDREFDOCS_VERSION: v0.3.0
|
||||
cmds:
|
||||
@ -383,7 +383,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: 7431c24907de3c6b1516114c8990d4f8d23d92cd
|
||||
DAGGER_CONTROLLER_GEN_SHA: f7187c307f2ba79290efbfff5ce436b956162c53
|
||||
cmds:
|
||||
- >
|
||||
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/controller-gen@${DAGGER_CONTROLLER_GEN_SHA}
|
||||
|
||||
@ -22,19 +22,19 @@ barman==3.19.1 \
|
||||
--hash=sha256:0a6a9e1babf97687732d8b2a3eb79ea95d55246a5257b9433865cb6e755221c0 \
|
||||
--hash=sha256:2f71c4a1f1ba53f694cbdf838bb9906d8ba02b97d1fd3041196e8999bec7a1ee
|
||||
# via -r sidecar-requirements.in
|
||||
boto3==1.43.51 \
|
||||
--hash=sha256:a97057bb609fd38c80448db6a93db770786775dabd651401debf09816d4553d7 \
|
||||
--hash=sha256:b5a416cc703db73b69b22bef563c89c1fb14a4b10a93628d3c7abc4dd1aaf979
|
||||
boto3==1.43.56 \
|
||||
--hash=sha256:57c90df9fb026f2e6ae22530861198130203733c5c9ec4e5cca3a4037f5a8db4 \
|
||||
--hash=sha256:feb699d4ab241ef5c1b80bb58277be2aaad365cd4b672d7817e0bc59ee45131b
|
||||
# via barman
|
||||
botocore==1.43.51 \
|
||||
--hash=sha256:7c2c538c932bddc95834e177ce6f91dcc388c6a7934b4f8d0db13caa30e3e543 \
|
||||
--hash=sha256:e0e5e88585fdb01dcb6b533ac2dd3f18d5d45092a14ccbfd330e3576a4152128
|
||||
botocore==1.43.56 \
|
||||
--hash=sha256:6c01f85f0ff9863076f4c761e74ee3aa96c5ccc1ad09fc1efd62ef8f2d22bf57 \
|
||||
--hash=sha256:aafc741f1b10f6fd63253eaf6ea029680c1ff436d87e1b8969d62aefa0c76976
|
||||
# via
|
||||
# boto3
|
||||
# s3transfer
|
||||
certifi==2026.6.17 \
|
||||
--hash=sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432 \
|
||||
--hash=sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db
|
||||
certifi==2026.7.22 \
|
||||
--hash=sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775 \
|
||||
--hash=sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55
|
||||
# via requests
|
||||
cffi==2.1.0 \
|
||||
--hash=sha256:02cb7ff33ded4f1532476731f89ede53e2e488a8e6205515a82144246ffa7dcc \
|
||||
@ -423,15 +423,15 @@ cryptography==49.0.0 \
|
||||
# google-auth
|
||||
# msal
|
||||
# pyjwt
|
||||
google-api-core==2.32.0 \
|
||||
--hash=sha256:2b33aad226b19272458c46abfe5c5a38d9531ece0c44502129a1463ce83674ac \
|
||||
--hash=sha256:ae1f0d58a6c8869350bf469f8eb3092e7f8c494a942d9525494afb6c162b0904
|
||||
google-api-core==2.33.0 \
|
||||
--hash=sha256:3a36bcc3e319783f4c97da41f6f45ea6ffcaa55848e341de16e09cb70243c2bb \
|
||||
--hash=sha256:a2e22a0c1d0f03eafff1858b38cf46f832d5902b0c052235bf0ab8402929fbdc
|
||||
# via
|
||||
# google-cloud-core
|
||||
# google-cloud-storage
|
||||
google-auth==2.56.0 \
|
||||
--hash=sha256:6e88c10217e07a92bfd01cac8ee99e32ccfb08414c3102e6c5b8d58f37a0d1e0 \
|
||||
--hash=sha256:f90fa030b569a92654b9d690665a073841df33d57487be53db583a9a0867a553
|
||||
google-auth==2.56.2 \
|
||||
--hash=sha256:c8270ea95b2697b74e3d8438ae9c5b898e38b623b915c7b5c5635921e7de68a6 \
|
||||
--hash=sha256:e28f103ca8091fb7012b99c44243d7366c29863713b8e34a220c3322b7a07051
|
||||
# via
|
||||
# google-api-core
|
||||
# google-cloud-core
|
||||
@ -572,9 +572,9 @@ msal-extensions==1.3.1 \
|
||||
--hash=sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca \
|
||||
--hash=sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4
|
||||
# via azure-identity
|
||||
proto-plus==1.28.1 \
|
||||
--hash=sha256:6660f5f1970874bdcfc3088b435188a36a37bd3596668f7d726417c4ae8cfbed \
|
||||
--hash=sha256:832e68e7fe064cf90ab153b6e5eb935b27891bb89aaeb68b115e9b702f6cb168
|
||||
proto-plus==1.28.2 \
|
||||
--hash=sha256:26d843eb99c1e32fdf1d20ff0faae56607f7748fe774acf9ecd5cfe6c6472501 \
|
||||
--hash=sha256:b874236fcac2358f601e4330bcb76cb8b89c851303ccf4078408b3d4774d1c52
|
||||
# via google-api-core
|
||||
protobuf==7.35.1 \
|
||||
--hash=sha256:11d6b0ec246892d85215b0a13ca6e0233cf5284b68f0ac02646427f4ff88a799 \
|
||||
@ -634,9 +634,9 @@ requests==2.34.2 \
|
||||
# google-api-core
|
||||
# google-cloud-storage
|
||||
# msal
|
||||
s3transfer==0.19.1 \
|
||||
--hash=sha256:d3d6371dc3f1e5c5427b2b457bcf13bcf87bec334c95aed18642eae61f6926f3 \
|
||||
--hash=sha256:d5fd7005ee39307455ad5f310b5ea67f4b1960d7fed5b3671ee50c249de675de
|
||||
s3transfer==0.19.2 \
|
||||
--hash=sha256:ba0309fd86be3c27dbf78cdd813c13c5e1df16e5874b99d2535ebbdfb9892993 \
|
||||
--hash=sha256:d8168eccca828cbb2cd573675333f3bddd254313a9c42494b84c76b539e8ba25
|
||||
# via boto3
|
||||
six==1.17.0 \
|
||||
--hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \
|
||||
|
||||
14
go.mod
14
go.mod
@ -16,10 +16,10 @@ require (
|
||||
github.com/spf13/viper v1.21.0
|
||||
google.golang.org/grpc v1.82.1
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
k8s.io/api v0.36.2
|
||||
k8s.io/apiextensions-apiserver v0.36.2
|
||||
k8s.io/apimachinery v0.36.2
|
||||
k8s.io/client-go v0.36.2
|
||||
k8s.io/api v0.36.3
|
||||
k8s.io/apiextensions-apiserver v0.36.3
|
||||
k8s.io/apimachinery v0.36.3
|
||||
k8s.io/client-go v0.36.3
|
||||
k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3
|
||||
sigs.k8s.io/controller-runtime v0.24.1
|
||||
sigs.k8s.io/kustomize/api v0.21.1
|
||||
@ -125,11 +125,11 @@ require (
|
||||
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect
|
||||
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
|
||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||
k8s.io/apiserver v0.36.2 // indirect
|
||||
k8s.io/component-base v0.36.2 // indirect
|
||||
k8s.io/apiserver v0.36.3 // indirect
|
||||
k8s.io/component-base v0.36.3 // indirect
|
||||
k8s.io/klog/v2 v2.140.0 // indirect
|
||||
k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 // indirect
|
||||
k8s.io/streaming v0.36.2 // indirect
|
||||
k8s.io/streaming v0.36.3 // 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
|
||||
|
||||
28
go.sum
28
go.sum
@ -308,24 +308,24 @@ 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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
k8s.io/api v0.36.2 h1:TF6YDLIzKfccK7cq9YpTcGX8TJmEkHVRv78DM51fRYY=
|
||||
k8s.io/api v0.36.2/go.mod h1:F4LbMO4brjZYh7yFkXWhynSvtB7YauxV4c+HHkNRGNg=
|
||||
k8s.io/apiextensions-apiserver v0.36.2 h1:3O5gqOj/dt2XWWbpMe+TXWpE9yU6pjM/tXxtHHJT/K4=
|
||||
k8s.io/apiextensions-apiserver v0.36.2/go.mod h1:cL1tBWe8XSaP1H30iWKGo7hf6iAUUUJPEU70dskmAnA=
|
||||
k8s.io/apimachinery v0.36.2 h1:0PE/W/WNy1UX61NLbXY5TMbJ6UwLL6E6lAPkYrKFxbQ=
|
||||
k8s.io/apimachinery v0.36.2/go.mod h1:fvf/HOLXq9RId0rnDIbN1OEBvHXdQbLMM8nu0LcBUf4=
|
||||
k8s.io/apiserver v0.36.2 h1:6vMnkmHZPeBloNkHUhmZYq7Ylv8WIB8xjyEl+eSt26E=
|
||||
k8s.io/apiserver v0.36.2/go.mod h1:9PoQ2ikCytrZyZg11mGhLEF5m8Rgsb5FJmYJ4Wvnl1k=
|
||||
k8s.io/client-go v0.36.2 h1:bfgxmFKc9CgqsgX4xKLAAdmTQlWee7Ob/HlDOrJ5TBI=
|
||||
k8s.io/client-go v0.36.2/go.mod h1:1vgO4OAlfPnoLcb+Rze2GF5rAr14w8qjrYMoyXJzQj0=
|
||||
k8s.io/component-base v0.36.2 h1:Z0VH80O7Ng0HDZnZj3WRR3urEGa0kTwmO8CwEwjVK1w=
|
||||
k8s.io/component-base v0.36.2/go.mod h1:mGfFOA7Gwpdm1VW2cwSQYbiDIlz8GD2WGwH88QSeCyA=
|
||||
k8s.io/api v0.36.3 h1:NxB+05W2UGqXWFXcLO0RB5cnqnUPP5v5sVlaOH0Iz4w=
|
||||
k8s.io/api v0.36.3/go.mod h1:JzLQKqRHC5+I8RVj/lS3lCg0mg6nWI9Fo/Sk3ElxHzg=
|
||||
k8s.io/apiextensions-apiserver v0.36.3 h1:dPmOAPhwTtqb1bTxbFPsy18KHPhktQeO3WUPXunZIB0=
|
||||
k8s.io/apiextensions-apiserver v0.36.3/go.mod h1:KTXFqgXiuw2pRoL+Wpmttqc+up9Xt/GohadPWeLLOa4=
|
||||
k8s.io/apimachinery v0.36.3 h1:PkzMRBRG8joFD8EhCuQAtNPvJlxb82FwplP26HIzvAM=
|
||||
k8s.io/apimachinery v0.36.3/go.mod h1:cTSjBWgPe/6CQyBKzY/hDIRWCQQQeK0mfLbml0UYFHE=
|
||||
k8s.io/apiserver v0.36.3 h1:MGSg2SkdfuytiDEcRylT5mQFmmSsbx90XFUO67Y4bsQ=
|
||||
k8s.io/apiserver v0.36.3/go.mod h1:fVH7zv9EUNUA7Fl7LtDKh8aB9W7u1VQPSGtWV5SjUxg=
|
||||
k8s.io/client-go v0.36.3 h1:M4JdVzXxYcZk4fGpfDdYnxSwhLKWCFoQsHW6t+z8Hfg=
|
||||
k8s.io/client-go v0.36.3/go.mod h1:gcPwr0c87vjjG6HB6pWEqOeuYVoXSsREjzux2j6GF30=
|
||||
k8s.io/component-base v0.36.3 h1:vc/UFvPCkW0irPz84LAodAL1j3f4xktPM6dDJIEheAY=
|
||||
k8s.io/component-base v0.36.3/go.mod h1:hZbNFG+gCMl9EbykDGEu73feKP9/Cq6JsV4pTo9GTO8=
|
||||
k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc=
|
||||
k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0=
|
||||
k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 h1:mPMaPMpBij2V1Wv/fR+HW124vVGXXvOSS9ver/9yjWs=
|
||||
k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25/go.mod h1:V/QaCUYDa+0QpcHhVVc5l99Uz56wEMEXBSj9oCDkNDY=
|
||||
k8s.io/streaming v0.36.2 h1:NSKthPPg9UFSKsRauVJUVGH2Dvn8fhKmY4qrMkw/p98=
|
||||
k8s.io/streaming v0.36.2/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s=
|
||||
k8s.io/streaming v0.36.3 h1:9rAaqBk0C0Pc7+/fqGekj07NV+/Xrew58p647A0JT8w=
|
||||
k8s.io/streaming v0.36.3/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s=
|
||||
k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3 h1:jVkFFVfXdXP74B/zbO3hM3hpSFD0xvhQ5U686DPurkE=
|
||||
k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3/go.mod h1:M2s5JB1lIYP3jzZdorPLHXIPJzt9vv2muW5a6L9DtNM=
|
||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 h1:hSfpvjjTQXQY2Fol2CS0QHMNs/WI1MOSGzCm1KhM5ec=
|
||||
|
||||
@ -27,6 +27,7 @@ import (
|
||||
"path"
|
||||
"time"
|
||||
|
||||
barmanapi "github.com/cloudnative-pg/barman-cloud/pkg/api"
|
||||
"github.com/cloudnative-pg/barman-cloud/pkg/archiver"
|
||||
barmanCommand "github.com/cloudnative-pg/barman-cloud/pkg/command"
|
||||
barmanCredentials "github.com/cloudnative-pg/barman-cloud/pkg/credentials"
|
||||
@ -155,13 +156,17 @@ func (w WALServiceImplementation) Archive(
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Step 2: Check if the archive location is safe to perform archiving
|
||||
checkFileExisting, err := fileutils.FileExists(emptyWalArchiveFile)
|
||||
// Step 2: Check if the archive location is safe to perform archiving.
|
||||
checkEmptyWalArchive, err := resolveArchiveEmptyWalArchiveCheck(
|
||||
request.CheckEmptyWalArchive,
|
||||
configuration.Cluster,
|
||||
emptyWalArchiveFile,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("while checking for empty wal archive check file %q: %w", emptyWalArchiveFile, err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if utils.IsEmptyWalArchiveCheckEnabled(&configuration.Cluster.ObjectMeta) && checkFileExisting {
|
||||
if checkEmptyWalArchive {
|
||||
if err := CheckBackupDestination(
|
||||
ctx,
|
||||
&objectStore.Spec.Configuration,
|
||||
@ -223,6 +228,31 @@ func (w WALServiceImplementation) Archive(
|
||||
return &wal.WALArchiveResult{}, nil
|
||||
}
|
||||
|
||||
// resolveArchiveEmptyWalArchiveCheck reports whether the WAL archive
|
||||
// destination must be verified before archiving this segment.
|
||||
//
|
||||
// The operator owns the marker file's lifecycle, so when it sets the decision
|
||||
// (non-nil) that value already accounts for the marker and is obeyed as-is. A
|
||||
// nil value comes from an operator that predates this field, so we fall back to
|
||||
// the previous logic: the Cluster annotation combined with the on-disk marker
|
||||
// file.
|
||||
func resolveArchiveEmptyWalArchiveCheck(
|
||||
operatorDecision *bool,
|
||||
cluster *cnpgv1.Cluster,
|
||||
markerFilePath string,
|
||||
) (bool, error) {
|
||||
if operatorDecision != nil {
|
||||
return *operatorDecision, nil
|
||||
}
|
||||
|
||||
markerFilePresent, err := fileutils.FileExists(markerFilePath)
|
||||
if err != nil {
|
||||
return false, fmt.Errorf("while checking for empty wal archive check file %q: %w", markerFilePath, err)
|
||||
}
|
||||
|
||||
return utils.IsEmptyWalArchiveCheckEnabled(&cluster.ObjectMeta) && markerFilePresent, nil
|
||||
}
|
||||
|
||||
// Restore implements the WALService interface
|
||||
func (w WALServiceImplementation) Restore(
|
||||
ctx context.Context,
|
||||
@ -249,9 +279,11 @@ func (w WALServiceImplementation) Restore(
|
||||
"Restoring WAL file",
|
||||
"objectStore", objectStore.Name,
|
||||
"serverName", serverName,
|
||||
"walName", walName)
|
||||
"walName", walName,
|
||||
"mode", request.GetMode())
|
||||
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
|
||||
@ -288,6 +320,7 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore(
|
||||
serverName string,
|
||||
walName string,
|
||||
destinationPath string,
|
||||
rewindMode bool,
|
||||
) error {
|
||||
contextLogger := log.FromContext(ctx)
|
||||
startTime := time.Now()
|
||||
@ -319,6 +352,20 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore(
|
||||
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
|
||||
var wasInSpool bool
|
||||
if wasInSpool, err = walRestorer.RestoreFromSpool(walName, destinationPath); err != nil {
|
||||
@ -331,8 +378,10 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore(
|
||||
return nil
|
||||
}
|
||||
|
||||
// We skip this step if streaming connection is not available
|
||||
if isStreamingAvailable(cluster, w.InstanceName) {
|
||||
// Step 2: return error if the end-of-wal-stream flag is set.
|
||||
// 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 {
|
||||
return err
|
||||
}
|
||||
@ -340,10 +389,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.
|
||||
var walFilesList []string
|
||||
maxParallel := 1
|
||||
if barmanConfiguration.Wal != nil && barmanConfiguration.Wal.MaxParallel > 1 {
|
||||
maxParallel = barmanConfiguration.Wal.MaxParallel
|
||||
}
|
||||
maxParallel := maxWALFilesPerInvocation(barmanConfiguration, rewindMode)
|
||||
if IsWALFile(walName) {
|
||||
// If this is a regular WAL file, we try to prefetch
|
||||
if walFilesList, err = gatherWALFilesToRestore(walName, maxParallel); err != nil {
|
||||
@ -365,9 +411,9 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore(
|
||||
return classifyWALRestoreError(walStatus[0].WalName, walStatus[0].Err)
|
||||
}
|
||||
|
||||
// We skip this step if streaming connection is not available
|
||||
// We skip this step if the flag machinery does not apply to this invocation
|
||||
endOfWALStream := isEndOfWALStream(walStatus)
|
||||
if isStreamingAvailable(cluster, w.InstanceName) && endOfWALStream {
|
||||
if useEndOfWALStreamFlag && endOfWALStream {
|
||||
contextLogger.Info(
|
||||
"Set end-of-wal-stream flag as one of the WAL files to be prefetched was not found")
|
||||
|
||||
@ -415,6 +461,38 @@ func (w WALServiceImplementation) SetFirstRequired(
|
||||
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.
|
||||
func isStreamingAvailable(cluster *cnpgv1.Cluster, podName string) bool {
|
||||
if cluster == nil {
|
||||
@ -491,6 +569,22 @@ func checkEndOfWALStreamFlag(walRestorer *barmanRestorer.WALRestorer) error {
|
||||
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
|
||||
// a file-not-found error.
|
||||
func isEndOfWALStream(results []barmanRestorer.Result) bool {
|
||||
|
||||
@ -20,12 +20,21 @@ SPDX-License-Identifier: Apache-2.0
|
||||
package common
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
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"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/utils/ptr"
|
||||
|
||||
"github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/metadata"
|
||||
"github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/operator/config"
|
||||
|
||||
. "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() {
|
||||
@ -96,3 +105,142 @@ var _ = Describe("resolveRestoreObjectStore", func() {
|
||||
"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())
|
||||
})
|
||||
})
|
||||
|
||||
var _ = Describe("resolveArchiveEmptyWalArchiveCheck", func() {
|
||||
// skipAnnotation mirrors the unexported constant in cloudnative-pg's
|
||||
// pkg/utils; hard-coding the literal makes a divergence surface as a
|
||||
// failing test rather than silently disabling the check.
|
||||
const skipAnnotation = "cnpg.io/skipEmptyWalArchiveCheck"
|
||||
|
||||
clusterWith := func(annotationValue *string) *cnpgv1.Cluster {
|
||||
cluster := &cnpgv1.Cluster{}
|
||||
if annotationValue != nil {
|
||||
cluster.Annotations = map[string]string{skipAnnotation: *annotationValue}
|
||||
}
|
||||
return cluster
|
||||
}
|
||||
|
||||
// markerPath returns the marker file path inside a fresh temp dir,
|
||||
// creating the file there when present is true.
|
||||
markerPath := func(present bool) string {
|
||||
filePath := filepath.Join(GinkgoT().TempDir(), metadata.CheckEmptyWalArchiveFile)
|
||||
if present {
|
||||
Expect(os.WriteFile(filePath, []byte{}, 0o600)).To(Succeed())
|
||||
}
|
||||
return filePath
|
||||
}
|
||||
|
||||
When("the operator sets the decision", func() {
|
||||
It("obeys true, ignoring the annotation and the marker file", func() {
|
||||
// annotation would skip the check and the marker is absent, yet the
|
||||
// operator's explicit true must still win.
|
||||
got, err := resolveArchiveEmptyWalArchiveCheck(
|
||||
ptr.To(true), clusterWith(ptr.To("enabled")), markerPath(false))
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(got).To(BeTrue())
|
||||
})
|
||||
|
||||
It("obeys false, ignoring the annotation and the marker file", func() {
|
||||
// annotation would keep the check on and the marker is present, yet the
|
||||
// operator's explicit false must still win.
|
||||
got, err := resolveArchiveEmptyWalArchiveCheck(
|
||||
ptr.To(false), clusterWith(nil), markerPath(true))
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(got).To(BeFalse())
|
||||
})
|
||||
})
|
||||
|
||||
When("the operator predates the field (nil decision)", func() {
|
||||
DescribeTable(
|
||||
"falls back to the annotation combined with the marker file",
|
||||
func(annotationValue *string, markerPresent bool, expected bool) {
|
||||
got, err := resolveArchiveEmptyWalArchiveCheck(
|
||||
nil, clusterWith(annotationValue), markerPath(markerPresent))
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(got).To(Equal(expected))
|
||||
},
|
||||
Entry("no annotation and marker present: check runs", nil, true, true),
|
||||
Entry("no annotation and marker absent: check skipped", nil, false, false),
|
||||
Entry("opt-out annotation and marker present: check skipped", ptr.To("enabled"), true, false),
|
||||
Entry("unrelated annotation value and marker present: check runs", ptr.To("something-else"), true, true),
|
||||
Entry("empty annotation value and marker present: check runs", ptr.To(""), true, true),
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
@ -113,6 +113,7 @@ func (impl JobHookImpl) Restore(
|
||||
configuration.Cluster,
|
||||
&targetObjectStore.Spec.Configuration,
|
||||
targetObjectStore.Name,
|
||||
req.CheckEmptyWalArchive,
|
||||
); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -250,6 +251,7 @@ func (impl *JobHookImpl) checkBackupDestination(
|
||||
cluster *cnpgv1.Cluster,
|
||||
barmanConfiguration *cnpgv1.BarmanObjectStoreConfiguration,
|
||||
objectStoreName string,
|
||||
operatorCheckEmptyWalArchive *bool,
|
||||
) error {
|
||||
// Get environment from cache
|
||||
env, err := barmanCredentials.EnvSetCloudCredentialsAndCertificates(ctx,
|
||||
@ -288,14 +290,26 @@ func (impl *JobHookImpl) checkBackupDestination(
|
||||
}
|
||||
}
|
||||
|
||||
// Check if we're ok to archive in the desired destination
|
||||
if utils.IsEmptyWalArchiveCheckEnabled(&cluster.ObjectMeta) {
|
||||
if resolveRestoreEmptyWalArchiveCheck(operatorCheckEmptyWalArchive, cluster) {
|
||||
return common.CheckBackupDestination(ctx, barmanConfiguration, walArchiver, serverName)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// resolveRestoreEmptyWalArchiveCheck reports whether the destination must be
|
||||
// verified before restoring. When the operator sets the decision (non-nil) it
|
||||
// is obeyed as-is; a nil value comes from an operator that predates this field,
|
||||
// so we fall back to the Cluster annotation. Unlike archiving, restore is a
|
||||
// one-shot operation that has never been gated on the first-archive marker
|
||||
// file, so the annotation is the only fallback needed.
|
||||
func resolveRestoreEmptyWalArchiveCheck(operatorDecision *bool, cluster *cnpgv1.Cluster) bool {
|
||||
if operatorDecision != nil {
|
||||
return *operatorDecision
|
||||
}
|
||||
return utils.IsEmptyWalArchiveCheckEnabled(&cluster.ObjectMeta)
|
||||
}
|
||||
|
||||
// restoreCustomWalDir moves the current pg_wal data to the specified custom wal dir and applies the symlink
|
||||
// returns indicating if any changes were made and any error encountered in the process
|
||||
func (impl JobHookImpl) restoreCustomWalDir(ctx context.Context) (bool, error) {
|
||||
|
||||
66
internal/cnpgi/restore/restore_test.go
Normal file
66
internal/cnpgi/restore/restore_test.go
Normal file
@ -0,0 +1,66 @@
|
||||
/*
|
||||
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 restore
|
||||
|
||||
import (
|
||||
cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1"
|
||||
"k8s.io/utils/ptr"
|
||||
|
||||
. "github.com/onsi/ginkgo/v2"
|
||||
. "github.com/onsi/gomega"
|
||||
)
|
||||
|
||||
var _ = Describe("resolveRestoreEmptyWalArchiveCheck", func() {
|
||||
// skipAnnotation mirrors the unexported constant in cloudnative-pg's
|
||||
// pkg/utils; hard-coding the literal makes a divergence surface as a
|
||||
// failing test rather than silently disabling the check.
|
||||
const skipAnnotation = "cnpg.io/skipEmptyWalArchiveCheck"
|
||||
|
||||
clusterWith := func(annotationValue *string) *cnpgv1.Cluster {
|
||||
cluster := &cnpgv1.Cluster{}
|
||||
if annotationValue != nil {
|
||||
cluster.Annotations = map[string]string{skipAnnotation: *annotationValue}
|
||||
}
|
||||
return cluster
|
||||
}
|
||||
|
||||
When("the operator sets the decision", func() {
|
||||
It("obeys true even when the annotation would skip the check", func() {
|
||||
Expect(resolveRestoreEmptyWalArchiveCheck(ptr.To(true), clusterWith(ptr.To("enabled")))).To(BeTrue())
|
||||
})
|
||||
|
||||
It("obeys false even when the annotation would keep the check on", func() {
|
||||
Expect(resolveRestoreEmptyWalArchiveCheck(ptr.To(false), clusterWith(nil))).To(BeFalse())
|
||||
})
|
||||
})
|
||||
|
||||
When("the operator predates the field (nil decision)", func() {
|
||||
DescribeTable(
|
||||
"falls back to the Cluster annotation, never to a marker file",
|
||||
func(annotationValue *string, expected bool) {
|
||||
Expect(resolveRestoreEmptyWalArchiveCheck(nil, clusterWith(annotationValue))).To(Equal(expected))
|
||||
},
|
||||
Entry("no annotation: check runs", nil, true),
|
||||
Entry("opt-out annotation: check skipped", ptr.To("enabled"), false),
|
||||
Entry("unrelated annotation value: check runs", ptr.To("something-else"), true),
|
||||
Entry("empty annotation value: check runs", ptr.To(""), true),
|
||||
)
|
||||
})
|
||||
})
|
||||
32
internal/cnpgi/restore/suite_test.go
Normal file
32
internal/cnpgi/restore/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 restore
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
. "github.com/onsi/ginkgo/v2"
|
||||
. "github.com/onsi/gomega"
|
||||
)
|
||||
|
||||
func TestRestore(t *testing.T) {
|
||||
RegisterFailHandler(Fail)
|
||||
RunSpecs(t, "Restore job hook test suite")
|
||||
}
|
||||
@ -73,7 +73,7 @@ func newAzuriteDeployment(namespace, name string) *appsv1.Deployment {
|
||||
Name: name,
|
||||
// renovate: datasource=docker depName=mcr.microsoft.com/azure-storage/azurite versioning=docker
|
||||
// Version: 3.36.0
|
||||
Image: "mcr.microsoft.com/azure-storage/azurite@sha256:37493d0f2e764467421ffe16eb3caa39277e5fa7f6adea18eb5bbfb3c5247f98",
|
||||
Image: "mcr.microsoft.com/azure-storage/azurite@sha256:76b8127d608fab8287a14a4bfeb9a5502cdcffb4bf1e86f09f324ebb0e70edba",
|
||||
Args: []string{
|
||||
"azurite-blob",
|
||||
"--blobHost",
|
||||
|
||||
@ -121,8 +121,8 @@ func newS3ClientDeployment(namespace string) *appsv1.Deployment {
|
||||
{
|
||||
Name: s3ClientName,
|
||||
// renovate: datasource=docker depName=amazon/aws-cli versioning=docker
|
||||
// Version: 2.36.2
|
||||
Image: "docker.io/amazon/aws-cli@sha256:964336bffb17b82d2e84a2526b0672e70a2c881544e1a281acaca1d9aa41b536",
|
||||
// Version: 2.36.9
|
||||
Image: "docker.io/amazon/aws-cli@sha256:00dee8ccaf669721f8163944ea9e6ac13183851b23d5b7a9868a608bc932cfdb",
|
||||
Command: []string{"sleep", "infinity"},
|
||||
Env: []corev1.EnvVar{
|
||||
{
|
||||
|
||||
132
web/yarn.lock
132
web/yarn.lock
@ -2017,24 +2017,24 @@
|
||||
tslib "^2.4.0"
|
||||
|
||||
"@emnapi/core@^1.4.3":
|
||||
version "1.11.2"
|
||||
resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.11.2.tgz#fab0a0f3c492d11f5a9ac9065d0d73955ee1c1c9"
|
||||
integrity sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==
|
||||
version "1.11.3"
|
||||
resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.11.3.tgz#5e95348a42cd1e06f0b9aa380cd74091daa4d520"
|
||||
integrity sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==
|
||||
dependencies:
|
||||
"@emnapi/wasi-threads" "1.2.2"
|
||||
"@emnapi/wasi-threads" "1.2.3"
|
||||
tslib "^2.4.0"
|
||||
|
||||
"@emnapi/runtime@^1.4.3":
|
||||
version "1.11.2"
|
||||
resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.11.2.tgz#eb22f04d76febfdf4f87fdaff54c8a53f6bf0dbd"
|
||||
integrity sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==
|
||||
version "1.11.3"
|
||||
resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.11.3.tgz#84257ae3b0531eb2aec1ffa23d70700da007ba95"
|
||||
integrity sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==
|
||||
dependencies:
|
||||
tslib "^2.4.0"
|
||||
|
||||
"@emnapi/wasi-threads@1.2.2":
|
||||
version "1.2.2"
|
||||
resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz#4c93becf5bfa3b13d1bbdcc06aee38321ad8139a"
|
||||
integrity sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==
|
||||
"@emnapi/wasi-threads@1.2.3":
|
||||
version "1.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz#c9bf72fd4be5b928aee894820e8d814ed73916e9"
|
||||
integrity sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==
|
||||
dependencies:
|
||||
tslib "^2.4.0"
|
||||
|
||||
@ -3318,11 +3318,6 @@ accepts@~1.3.8:
|
||||
mime-types "~2.1.34"
|
||||
negotiator "0.6.3"
|
||||
|
||||
acorn-import-phases@^1.0.3:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz#16eb850ba99a056cb7cbfe872ffb8972e18c8bd7"
|
||||
integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==
|
||||
|
||||
acorn-jsx@^5.0.0:
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
|
||||
@ -3568,10 +3563,10 @@ balanced-match@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
|
||||
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
|
||||
|
||||
baseline-browser-mapping@^2.10.42:
|
||||
version "2.10.43"
|
||||
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.43.tgz#7b5d11590ce5acdbe4859443e3c940e81ce8c02d"
|
||||
integrity sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==
|
||||
baseline-browser-mapping@^2.10.44:
|
||||
version "2.11.4"
|
||||
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.4.tgz#3da1a877a8be2ec06495123ce994b43af58cc55e"
|
||||
integrity sha512-s4+sLr9mZ/CyqeRritFeYV/Zx73OAtmaHn6kkBS1XRoJn1hrg3xIDUcpicAEX68tkcIN0iBCgti31C8zxtkhsQ==
|
||||
|
||||
batch@0.6.1:
|
||||
version "0.6.1"
|
||||
@ -3663,13 +3658,13 @@ braces@^3.0.3, braces@~3.0.2:
|
||||
fill-range "^7.1.1"
|
||||
|
||||
browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.28.1, browserslist@^4.28.6:
|
||||
version "4.28.6"
|
||||
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.6.tgz#7cf83afcd69c55fde6fb2dcc5039ff0f4ba42610"
|
||||
integrity sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==
|
||||
version "4.28.7"
|
||||
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.7.tgz#409046517fccd2e51cdc20f077454b7141184028"
|
||||
integrity sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==
|
||||
dependencies:
|
||||
baseline-browser-mapping "^2.10.42"
|
||||
caniuse-lite "^1.0.30001803"
|
||||
electron-to-chromium "^1.5.389"
|
||||
baseline-browser-mapping "^2.10.44"
|
||||
caniuse-lite "^1.0.30001806"
|
||||
electron-to-chromium "^1.5.393"
|
||||
node-releases "^2.0.51"
|
||||
update-browserslist-db "^1.2.3"
|
||||
|
||||
@ -3777,7 +3772,7 @@ caniuse-api@^3.0.0:
|
||||
lodash.memoize "^4.1.2"
|
||||
lodash.uniq "^4.5.0"
|
||||
|
||||
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001803, caniuse-lite@^1.0.30001806:
|
||||
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001806:
|
||||
version "1.0.30001806"
|
||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz#1bc8e502b723fa393455dfbedd5ccec0c29bb74e"
|
||||
integrity sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==
|
||||
@ -4572,10 +4567,10 @@ ee-first@1.1.1:
|
||||
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
|
||||
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
|
||||
|
||||
electron-to-chromium@^1.5.389:
|
||||
version "1.5.393"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.393.tgz#aec971df2a6f4f7e51fbacb200d66cebfc7d3c17"
|
||||
integrity sha512-kiDJdIUawuEIcp9XoICKp1iTYDEbgguIPq526N1Q7jIQDeQ3CqoMx71025PI/7E48Ddtw2HuWsVjY7afEgNxmg==
|
||||
electron-to-chromium@^1.5.393:
|
||||
version "1.5.396"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.396.tgz#4aa96428486c8d1c9c8aeb205b2d6e04928ca046"
|
||||
integrity sha512-yHiw2Y3C3H9U6TMbOfoWK/BPreiOPXRfTWPBwQBoZG6/8TB6eOPnsy5oaRYuatR7Fw2SJ4kKforgufeo7fq0EQ==
|
||||
|
||||
emoji-regex@^8.0.0:
|
||||
version "8.0.0"
|
||||
@ -4615,10 +4610,10 @@ encoding-sniffer@^0.2.1:
|
||||
iconv-lite "^0.6.3"
|
||||
whatwg-encoding "^3.1.1"
|
||||
|
||||
enhanced-resolve@^5.22.2:
|
||||
version "5.24.2"
|
||||
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.24.2.tgz#f25d703a24431cb1e02f944adb74aefa4fcb8d7e"
|
||||
integrity sha512-rpsZEGT1jFuve6QlpyRp9ckQ+kN61hvF9BzCPyMdaKTm8UJce96KBn3sorXOFXlzjPrs3Vc4T1NsSroZ3PxlFw==
|
||||
enhanced-resolve@^5.24.2:
|
||||
version "5.24.3"
|
||||
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.24.3.tgz#406bbf1ec20971265a30254f08030fce6a8207fe"
|
||||
integrity sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==
|
||||
dependencies:
|
||||
graceful-fs "^4.2.4"
|
||||
tapable "^2.3.3"
|
||||
@ -5043,9 +5038,9 @@ fs-extra@^10.0.0:
|
||||
universalify "^2.0.0"
|
||||
|
||||
fs-extra@^11.1.1, fs-extra@^11.2.0:
|
||||
version "11.3.6"
|
||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.6.tgz#f7cb80e9df550cd1db6f537fa5cdd568d3e70d10"
|
||||
integrity sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==
|
||||
version "11.4.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.4.0.tgz#f88ed6d180ac9e14b61b08e679468f0b1b6b4730"
|
||||
integrity sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==
|
||||
dependencies:
|
||||
graceful-fs "^4.2.0"
|
||||
jsonfile "^6.0.1"
|
||||
@ -5417,9 +5412,9 @@ html-void-elements@^3.0.0:
|
||||
integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==
|
||||
|
||||
html-webpack-plugin@^5.6.0:
|
||||
version "5.6.7"
|
||||
resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz#429bab4e12abf3c07e1c608886608e2df2c06b11"
|
||||
integrity sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==
|
||||
version "5.6.8"
|
||||
resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.8.tgz#5425dbc63eb533ffa59e92342be94894a125fc23"
|
||||
integrity sha512-MZmKQcTnhEh1SPSyMiEytIeDZDUoBZVorNHivQGXMASHf/BSGGOrKa2xQ5bGx3TCe1n109ecCt+cpww7wwWhKA==
|
||||
dependencies:
|
||||
"@types/html-minifier-terser" "^6.0.0"
|
||||
html-minifier-terser "^6.0.2"
|
||||
@ -5980,11 +5975,6 @@ lines-and-columns@^1.1.6:
|
||||
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
|
||||
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
|
||||
|
||||
loader-runner@^4.3.2:
|
||||
version "4.3.2"
|
||||
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.2.tgz#9913d3a15971f8f635915e601fb5c9d495d918e9"
|
||||
integrity sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==
|
||||
|
||||
loader-utils@^2.0.0:
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c"
|
||||
@ -7818,9 +7808,9 @@ postcss-zindex@^6.0.2:
|
||||
integrity sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==
|
||||
|
||||
postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.33, postcss@^8.5.4:
|
||||
version "8.5.20"
|
||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.20.tgz#316a139da79484ce55969fa7bb6f2f1abcc14060"
|
||||
integrity sha512-lW616l85ucIQL+FocMmL7pQFPqBmwejrCMg+iPxyImlrANNJG9NHq/RkyCZopDhd8C3LA03PHRJDjkbGu8vvug==
|
||||
version "8.5.23"
|
||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.23.tgz#3493550116f478487298301d2c2e8dc5a56e6594"
|
||||
integrity sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==
|
||||
dependencies:
|
||||
nanoid "^3.3.16"
|
||||
picocolors "^1.1.1"
|
||||
@ -7970,9 +7960,9 @@ rc@1.2.8:
|
||||
strip-json-comments "~2.0.1"
|
||||
|
||||
react-dom@^19.0.0:
|
||||
version "19.2.7"
|
||||
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.7.tgz#0450dc9ae9ddbff76ef196401cd8b8c7fb466ccc"
|
||||
integrity sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==
|
||||
version "19.2.8"
|
||||
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.8.tgz#3b46b9eeda877cdff2cf13d2770fff4ae36c2ec2"
|
||||
integrity sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==
|
||||
dependencies:
|
||||
scheduler "^0.27.0"
|
||||
|
||||
@ -8052,9 +8042,9 @@ react-router@5.3.4, react-router@^5.3.4:
|
||||
tiny-warning "^1.0.0"
|
||||
|
||||
react@^19.0.0:
|
||||
version "19.2.7"
|
||||
resolved "https://registry.yarnpkg.com/react/-/react-19.2.7.tgz#1f47a1bfc06f8ec885752c6f4af14369a9f8260b"
|
||||
integrity sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==
|
||||
version "19.2.8"
|
||||
resolved "https://registry.yarnpkg.com/react/-/react-19.2.8.tgz#a80663dbb58d69c6fe3fd291d3cb324e8a7dff2d"
|
||||
integrity sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==
|
||||
|
||||
readable-stream@^2.0.1:
|
||||
version "2.3.8"
|
||||
@ -8390,9 +8380,9 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1:
|
||||
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
|
||||
|
||||
sax@^1.2.4, sax@^1.5.0:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.0.tgz#da59637629307b97e7c4cb28e080a7bc38560d5b"
|
||||
integrity sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==
|
||||
version "1.6.1"
|
||||
resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.1.tgz#4c23cf608c0b693ab54b4b5888e92cfe977b9843"
|
||||
integrity sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==
|
||||
|
||||
scheduler@^0.27.0:
|
||||
version "0.27.0"
|
||||
@ -8914,9 +8904,9 @@ terser@^5.10.0, terser@^5.15.1, terser@^5.31.1:
|
||||
source-map-support "~0.5.20"
|
||||
|
||||
thingies@^2.5.0:
|
||||
version "2.6.0"
|
||||
resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.6.0.tgz#e09b98b9e6f6caf8a759eca8481fea1de974d2b1"
|
||||
integrity sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==
|
||||
version "2.6.1"
|
||||
resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.6.1.tgz#4eb28e2585a75288f1765a0b08f1dfa020357a6f"
|
||||
integrity sha512-cV/CMGTK3M4MlnJ/0At6ismOw/A0EEniDNScajjz/Br3c1sqE72YD01rGpPTKwd27wAxI5Pr+6+0w8yofzFRYw==
|
||||
|
||||
thunky@^1.0.2:
|
||||
version "1.1.0"
|
||||
@ -9044,9 +9034,9 @@ undici-types@~8.3.0:
|
||||
integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==
|
||||
|
||||
undici@^7.19.0:
|
||||
version "7.28.0"
|
||||
resolved "https://registry.yarnpkg.com/undici/-/undici-7.28.0.tgz#97d64564198b285bc281f0e8e29597e3d11fe7ec"
|
||||
integrity sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==
|
||||
version "7.29.0"
|
||||
resolved "https://registry.yarnpkg.com/undici/-/undici-7.29.0.tgz#ae0f6f62e06e057a9cbb7b2b5fde2bb74f791b8f"
|
||||
integrity sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==
|
||||
|
||||
unicode-canonical-property-names-ecmascript@^2.0.0:
|
||||
version "2.0.1"
|
||||
@ -9355,15 +9345,15 @@ webpack-merge@^6.0.1:
|
||||
flat "^5.0.2"
|
||||
wildcard "^2.0.1"
|
||||
|
||||
webpack-sources@^3.5.0:
|
||||
webpack-sources@^3.5.1:
|
||||
version "3.5.1"
|
||||
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.5.1.tgz#76c2418486dcc02b2aa0694c104176c2858fe84a"
|
||||
integrity sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==
|
||||
|
||||
webpack@^5.88.1, webpack@^5.95.0:
|
||||
version "5.108.4"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.108.4.tgz#141818a411662773a0bb32dc5536acc5409943b7"
|
||||
integrity sha512-yur8LyJoeiWh47dErD+Ok7vlbmDsJ3UbbRPAoxbGJ54WpE2y5yVo5G/inUzujnYgw3tPmBRdn+G7PoxXaYC33w==
|
||||
version "5.109.0"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.109.0.tgz#871d8eee5e2d5e6eaf5ec8d1a6db74ea65491030"
|
||||
integrity sha512-vomrngskVVXEZF9sMZfYAd4pXZUnfaWdJGlF+BTNF+gJBCKYCQBnOeVPlrh39Ewl7nlCsirDplMy6o5g9xJHBg==
|
||||
dependencies:
|
||||
"@types/estree" "^1.0.8"
|
||||
"@types/json-schema" "^7.0.15"
|
||||
@ -9371,22 +9361,20 @@ webpack@^5.88.1, webpack@^5.95.0:
|
||||
"@webassemblyjs/wasm-edit" "^1.14.1"
|
||||
"@webassemblyjs/wasm-parser" "^1.14.1"
|
||||
acorn "^8.16.0"
|
||||
acorn-import-phases "^1.0.3"
|
||||
browserslist "^4.28.1"
|
||||
chrome-trace-event "^1.0.2"
|
||||
enhanced-resolve "^5.22.2"
|
||||
enhanced-resolve "^5.24.2"
|
||||
es-module-lexer "^2.1.0"
|
||||
eslint-scope "5.1.1"
|
||||
events "^3.2.0"
|
||||
graceful-fs "^4.2.11"
|
||||
loader-runner "^4.3.2"
|
||||
mime-db "^1.54.0"
|
||||
minimizer-webpack-plugin "^5.6.1"
|
||||
neo-async "^2.6.2"
|
||||
schema-utils "^4.3.3"
|
||||
tapable "^2.3.0"
|
||||
watchpack "^2.5.2"
|
||||
webpack-sources "^3.5.0"
|
||||
webpack-sources "^3.5.1"
|
||||
|
||||
webpackbar@^7.0.0:
|
||||
version "7.0.0"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user