mirror of
https://github.com/cloudnative-pg/plugin-barman-cloud.git
synced 2026-09-06 15:02:21 +02:00
Compare commits
6 Commits
1bcf222b14
...
bb0d217941
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bb0d217941 | ||
|
|
4c089ce55f | ||
|
|
ee97d63a2c | ||
|
|
76d4f22aa3 | ||
|
|
ce8a3db8c5 | ||
|
|
fcb0d1eaf4 |
@ -22,19 +22,19 @@ barman==3.19.1 \
|
|||||||
--hash=sha256:0a6a9e1babf97687732d8b2a3eb79ea95d55246a5257b9433865cb6e755221c0 \
|
--hash=sha256:0a6a9e1babf97687732d8b2a3eb79ea95d55246a5257b9433865cb6e755221c0 \
|
||||||
--hash=sha256:2f71c4a1f1ba53f694cbdf838bb9906d8ba02b97d1fd3041196e8999bec7a1ee
|
--hash=sha256:2f71c4a1f1ba53f694cbdf838bb9906d8ba02b97d1fd3041196e8999bec7a1ee
|
||||||
# via -r sidecar-requirements.in
|
# via -r sidecar-requirements.in
|
||||||
boto3==1.43.51 \
|
boto3==1.43.56 \
|
||||||
--hash=sha256:a97057bb609fd38c80448db6a93db770786775dabd651401debf09816d4553d7 \
|
--hash=sha256:57c90df9fb026f2e6ae22530861198130203733c5c9ec4e5cca3a4037f5a8db4 \
|
||||||
--hash=sha256:b5a416cc703db73b69b22bef563c89c1fb14a4b10a93628d3c7abc4dd1aaf979
|
--hash=sha256:feb699d4ab241ef5c1b80bb58277be2aaad365cd4b672d7817e0bc59ee45131b
|
||||||
# via barman
|
# via barman
|
||||||
botocore==1.43.51 \
|
botocore==1.43.56 \
|
||||||
--hash=sha256:7c2c538c932bddc95834e177ce6f91dcc388c6a7934b4f8d0db13caa30e3e543 \
|
--hash=sha256:6c01f85f0ff9863076f4c761e74ee3aa96c5ccc1ad09fc1efd62ef8f2d22bf57 \
|
||||||
--hash=sha256:e0e5e88585fdb01dcb6b533ac2dd3f18d5d45092a14ccbfd330e3576a4152128
|
--hash=sha256:aafc741f1b10f6fd63253eaf6ea029680c1ff436d87e1b8969d62aefa0c76976
|
||||||
# via
|
# via
|
||||||
# boto3
|
# boto3
|
||||||
# s3transfer
|
# s3transfer
|
||||||
certifi==2026.6.17 \
|
certifi==2026.7.22 \
|
||||||
--hash=sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432 \
|
--hash=sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775 \
|
||||||
--hash=sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db
|
--hash=sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55
|
||||||
# via requests
|
# via requests
|
||||||
cffi==2.1.0 \
|
cffi==2.1.0 \
|
||||||
--hash=sha256:02cb7ff33ded4f1532476731f89ede53e2e488a8e6205515a82144246ffa7dcc \
|
--hash=sha256:02cb7ff33ded4f1532476731f89ede53e2e488a8e6205515a82144246ffa7dcc \
|
||||||
@ -423,15 +423,15 @@ cryptography==49.0.0 \
|
|||||||
# google-auth
|
# google-auth
|
||||||
# msal
|
# msal
|
||||||
# pyjwt
|
# pyjwt
|
||||||
google-api-core==2.32.0 \
|
google-api-core==2.33.0 \
|
||||||
--hash=sha256:2b33aad226b19272458c46abfe5c5a38d9531ece0c44502129a1463ce83674ac \
|
--hash=sha256:3a36bcc3e319783f4c97da41f6f45ea6ffcaa55848e341de16e09cb70243c2bb \
|
||||||
--hash=sha256:ae1f0d58a6c8869350bf469f8eb3092e7f8c494a942d9525494afb6c162b0904
|
--hash=sha256:a2e22a0c1d0f03eafff1858b38cf46f832d5902b0c052235bf0ab8402929fbdc
|
||||||
# via
|
# via
|
||||||
# google-cloud-core
|
# google-cloud-core
|
||||||
# google-cloud-storage
|
# google-cloud-storage
|
||||||
google-auth==2.56.0 \
|
google-auth==2.56.2 \
|
||||||
--hash=sha256:6e88c10217e07a92bfd01cac8ee99e32ccfb08414c3102e6c5b8d58f37a0d1e0 \
|
--hash=sha256:c8270ea95b2697b74e3d8438ae9c5b898e38b623b915c7b5c5635921e7de68a6 \
|
||||||
--hash=sha256:f90fa030b569a92654b9d690665a073841df33d57487be53db583a9a0867a553
|
--hash=sha256:e28f103ca8091fb7012b99c44243d7366c29863713b8e34a220c3322b7a07051
|
||||||
# via
|
# via
|
||||||
# google-api-core
|
# google-api-core
|
||||||
# google-cloud-core
|
# google-cloud-core
|
||||||
@ -572,9 +572,9 @@ msal-extensions==1.3.1 \
|
|||||||
--hash=sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca \
|
--hash=sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca \
|
||||||
--hash=sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4
|
--hash=sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4
|
||||||
# via azure-identity
|
# via azure-identity
|
||||||
proto-plus==1.28.1 \
|
proto-plus==1.28.2 \
|
||||||
--hash=sha256:6660f5f1970874bdcfc3088b435188a36a37bd3596668f7d726417c4ae8cfbed \
|
--hash=sha256:26d843eb99c1e32fdf1d20ff0faae56607f7748fe774acf9ecd5cfe6c6472501 \
|
||||||
--hash=sha256:832e68e7fe064cf90ab153b6e5eb935b27891bb89aaeb68b115e9b702f6cb168
|
--hash=sha256:b874236fcac2358f601e4330bcb76cb8b89c851303ccf4078408b3d4774d1c52
|
||||||
# via google-api-core
|
# via google-api-core
|
||||||
protobuf==7.35.1 \
|
protobuf==7.35.1 \
|
||||||
--hash=sha256:11d6b0ec246892d85215b0a13ca6e0233cf5284b68f0ac02646427f4ff88a799 \
|
--hash=sha256:11d6b0ec246892d85215b0a13ca6e0233cf5284b68f0ac02646427f4ff88a799 \
|
||||||
@ -634,9 +634,9 @@ requests==2.34.2 \
|
|||||||
# google-api-core
|
# google-api-core
|
||||||
# google-cloud-storage
|
# google-cloud-storage
|
||||||
# msal
|
# msal
|
||||||
s3transfer==0.19.1 \
|
s3transfer==0.19.2 \
|
||||||
--hash=sha256:d3d6371dc3f1e5c5427b2b457bcf13bcf87bec334c95aed18642eae61f6926f3 \
|
--hash=sha256:ba0309fd86be3c27dbf78cdd813c13c5e1df16e5874b99d2535ebbdfb9892993 \
|
||||||
--hash=sha256:d5fd7005ee39307455ad5f310b5ea67f4b1960d7fed5b3671ee50c249de675de
|
--hash=sha256:d8168eccca828cbb2cd573675333f3bddd254313a9c42494b84c76b539e8ba25
|
||||||
# via boto3
|
# via boto3
|
||||||
six==1.17.0 \
|
six==1.17.0 \
|
||||||
--hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \
|
--hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \
|
||||||
|
|||||||
@ -52,6 +52,11 @@ const (
|
|||||||
// BarmanEndpointCACertificateFileName is the name of the file in which the barman endpoint
|
// BarmanEndpointCACertificateFileName is the name of the file in which the barman endpoint
|
||||||
// CA certificate is stored.
|
// CA certificate is stored.
|
||||||
BarmanEndpointCACertificateFileName = "barman-ca.crt"
|
BarmanEndpointCACertificateFileName = "barman-ca.crt"
|
||||||
|
|
||||||
|
// PgWalVolumePgWalPath is the path of the pg_wal directory inside the WAL volume,
|
||||||
|
// used when a separate WAL storage is configured. During a restore the pg_wal
|
||||||
|
// directory is moved here and symlinked back into PGDATA.
|
||||||
|
PgWalVolumePgWalPath = "/var/lib/postgresql/wal/pg_wal"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetRestoreCABundleEnv gets the enveronment variables to be used when custom
|
// GetRestoreCABundleEnv gets the enveronment variables to be used when custom
|
||||||
|
|||||||
@ -70,6 +70,13 @@ func (i IdentityImplementation) GetPluginCapabilities(
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Type: &identity.PluginCapability_Service_{
|
||||||
|
Service: &identity.PluginCapability_Service{
|
||||||
|
Type: identity.PluginCapability_Service_TYPE_RESTORE_JOB,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
52
internal/cnpgi/instance/identity_test.go
Normal file
52
internal/cnpgi/instance/identity_test.go
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
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 instance
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/cloudnative-pg/cnpg-i/pkg/identity"
|
||||||
|
|
||||||
|
. "github.com/onsi/ginkgo/v2"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = Describe("IdentityImplementation", func() {
|
||||||
|
Describe("GetPluginCapabilities", func() {
|
||||||
|
It("declares the WAL, backup, metrics and restore-job services", func(ctx SpecContext) {
|
||||||
|
impl := IdentityImplementation{}
|
||||||
|
response, err := impl.GetPluginCapabilities(ctx, &identity.GetPluginCapabilitiesRequest{})
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Expect(response).NotTo(BeNil())
|
||||||
|
|
||||||
|
var serviceTypes []identity.PluginCapability_Service_Type
|
||||||
|
for _, capability := range response.GetCapabilities() {
|
||||||
|
serviceTypes = append(serviceTypes, capability.GetService().GetType())
|
||||||
|
}
|
||||||
|
|
||||||
|
// The instance sidecar now runs the phase-0 restore in-process, so it must
|
||||||
|
// advertise TYPE_RESTORE_JOB alongside the services it already served.
|
||||||
|
Expect(serviceTypes).To(ConsistOf(
|
||||||
|
identity.PluginCapability_Service_TYPE_WAL_SERVICE,
|
||||||
|
identity.PluginCapability_Service_TYPE_BACKUP_SERVICE,
|
||||||
|
identity.PluginCapability_Service_TYPE_METRICS,
|
||||||
|
identity.PluginCapability_Service_TYPE_RESTORE_JOB,
|
||||||
|
))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
@ -25,11 +25,13 @@ import (
|
|||||||
"github.com/cloudnative-pg/cnpg-i-machinery/pkg/pluginhelper/http"
|
"github.com/cloudnative-pg/cnpg-i-machinery/pkg/pluginhelper/http"
|
||||||
"github.com/cloudnative-pg/cnpg-i/pkg/backup"
|
"github.com/cloudnative-pg/cnpg-i/pkg/backup"
|
||||||
"github.com/cloudnative-pg/cnpg-i/pkg/metrics"
|
"github.com/cloudnative-pg/cnpg-i/pkg/metrics"
|
||||||
|
restore "github.com/cloudnative-pg/cnpg-i/pkg/restore/job"
|
||||||
"github.com/cloudnative-pg/cnpg-i/pkg/wal"
|
"github.com/cloudnative-pg/cnpg-i/pkg/wal"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||||
|
|
||||||
"github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/common"
|
"github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/common"
|
||||||
|
barmanrestore "github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/restore"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CNPGI is the implementation of the PostgreSQL sidecar
|
// CNPGI is the implementation of the PostgreSQL sidecar
|
||||||
@ -60,6 +62,15 @@ func (c *CNPGI) Start(ctx context.Context) error {
|
|||||||
metrics.RegisterMetricsServer(server, &metricsImpl{
|
metrics.RegisterMetricsServer(server, &metricsImpl{
|
||||||
Client: c.Client,
|
Client: c.Client,
|
||||||
})
|
})
|
||||||
|
// The instance pod runs the phase-0 bootstrap in-process (no separate
|
||||||
|
// recovery Job), so the same sidecar must answer the Restore RPC that
|
||||||
|
// initializes PGDATA from the object store before PostgreSQL starts.
|
||||||
|
restore.RegisterRestoreJobHooksServer(server, &barmanrestore.JobHookImpl{
|
||||||
|
Client: c.Client,
|
||||||
|
SpoolDirectory: c.SpoolDirectory,
|
||||||
|
PgDataPath: c.PGDataPath,
|
||||||
|
PgWalFolderToSymlink: common.PgWalVolumePgWalPath,
|
||||||
|
})
|
||||||
common.AddHealthCheck(server)
|
common.AddHealthCheck(server)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@ -102,6 +102,15 @@ func (config *PluginConfiguration) GetReplicaSourceBarmanObjectKey() types.Names
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HasAnyBarmanObjectStore returns true if the configuration references at least
|
||||||
|
// one barman object store, be it for backup/archiving, recovery, or as a
|
||||||
|
// replica source.
|
||||||
|
func (config *PluginConfiguration) HasAnyBarmanObjectStore() bool {
|
||||||
|
return len(config.BarmanObjectName) > 0 ||
|
||||||
|
len(config.RecoveryBarmanObjectName) > 0 ||
|
||||||
|
len(config.ReplicaSourceBarmanObjectName) > 0
|
||||||
|
}
|
||||||
|
|
||||||
// GetReferredBarmanObjectsKey gets the list of barman objects referred by this
|
// GetReferredBarmanObjectsKey gets the list of barman objects referred by this
|
||||||
// plugin configuration
|
// plugin configuration
|
||||||
func (config *PluginConfiguration) GetReferredBarmanObjectsKey() []types.NamespacedName {
|
func (config *PluginConfiguration) GetReferredBarmanObjectsKey() []types.NamespacedName {
|
||||||
@ -263,9 +272,7 @@ func getReplicaSourcePlugin(cluster *cnpgv1.Cluster) *cnpgv1.PluginConfiguration
|
|||||||
func (config *PluginConfiguration) Validate() error {
|
func (config *PluginConfiguration) Validate() error {
|
||||||
err := NewConfigurationError()
|
err := NewConfigurationError()
|
||||||
|
|
||||||
if len(config.BarmanObjectName) == 0 &&
|
if !config.HasAnyBarmanObjectStore() {
|
||||||
len(config.RecoveryBarmanObjectName) == 0 &&
|
|
||||||
len(config.ReplicaSourceBarmanObjectName) == 0 {
|
|
||||||
return err.WithMessage("no reference to barmanObjectName have been included")
|
return err.WithMessage("no reference to barmanObjectName have been included")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -322,6 +322,50 @@ func (impl LifecycleImplementation) collectAdditionalInstanceArgs(
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// shouldInjectBarmanSidecar decides whether an instance pod needs the
|
||||||
|
// plugin-barman-cloud sidecar.
|
||||||
|
//
|
||||||
|
// A cluster doing backup/archiving or serving as a replica source needs the
|
||||||
|
// sidecar in every instance pod for as long as the cluster exists, so those
|
||||||
|
// two cases always inject it. A recovery-only cluster (only
|
||||||
|
// RecoveryBarmanObjectName set, mirroring what pluginConfiguration.Validate()
|
||||||
|
// accepts) only ever needs the sidecar for its one-time bootstrap restore, so
|
||||||
|
// once the cluster has completed that initial bootstrap there's no reason to
|
||||||
|
// keep carrying it on every future pod.
|
||||||
|
//
|
||||||
|
// That said, the two operation types this hook is invoked with can't be
|
||||||
|
// treated the same way here. TYPE_CREATE fires only when a Pod is actually
|
||||||
|
// about to be persisted (the bootstrap pod itself, a later replica, or any
|
||||||
|
// pod recreated for an unrelated reason), so it's safe to gate it on
|
||||||
|
// cluster.IsInitialized(): a pod created after bootstrap simply won't carry
|
||||||
|
// the sidecar. TYPE_EVALUATE, however, is also used by the operator's
|
||||||
|
// checkPodSpecIsOutdated to re-evaluate an already-running pod's spec for
|
||||||
|
// drift on every reconcile; gating that the same way would make an
|
||||||
|
// already-initialized cluster's freshly re-evaluated spec disagree with the
|
||||||
|
// spec stored at the pod's creation, and the operator would roll out the
|
||||||
|
// primary purely to strip the sidecar right after it finished bootstrapping.
|
||||||
|
// So EVALUATE always keeps the sidecar for a recovery-only cluster, and only
|
||||||
|
// CREATE actually stops adding it to pods created after initialization.
|
||||||
|
func shouldInjectBarmanSidecar(
|
||||||
|
cluster *cnpgv1.Cluster,
|
||||||
|
pluginConfiguration *config.PluginConfiguration,
|
||||||
|
request *lifecycle.OperatorLifecycleRequest,
|
||||||
|
) bool {
|
||||||
|
if len(pluginConfiguration.BarmanObjectName) != 0 || len(pluginConfiguration.ReplicaSourceBarmanObjectName) != 0 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(pluginConfiguration.RecoveryBarmanObjectName) == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if request.GetOperationType().GetType() == lifecycle.OperatorOperationType_TYPE_CREATE {
|
||||||
|
return !cluster.IsInitialized()
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func reconcileInstancePod(
|
func reconcileInstancePod(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
cluster *cnpgv1.Cluster,
|
cluster *cnpgv1.Cluster,
|
||||||
@ -339,8 +383,7 @@ func reconcileInstancePod(
|
|||||||
|
|
||||||
mutatedPod := pod.DeepCopy()
|
mutatedPod := pod.DeepCopy()
|
||||||
|
|
||||||
if len(pluginConfiguration.BarmanObjectName) != 0 ||
|
if shouldInjectBarmanSidecar(cluster, pluginConfiguration, request) {
|
||||||
len(pluginConfiguration.ReplicaSourceBarmanObjectName) != 0 {
|
|
||||||
if err := reconcilePodSpec(
|
if err := reconcilePodSpec(
|
||||||
cluster,
|
cluster,
|
||||||
&mutatedPod.Spec,
|
&mutatedPod.Spec,
|
||||||
@ -353,7 +396,7 @@ func reconcileInstancePod(
|
|||||||
return nil, fmt.Errorf("while reconciling pod spec for pod: %w", err)
|
return nil, fmt.Errorf("while reconciling pod spec for pod: %w", err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
contextLogger.Debug("No need to mutate instance with no backup & archiving configuration")
|
contextLogger.Debug("No need to mutate instance, sidecar not required for this configuration and pod")
|
||||||
}
|
}
|
||||||
|
|
||||||
patch, err := object.CreatePatch(mutatedPod, pod)
|
patch, err := object.CreatePatch(mutatedPod, pod)
|
||||||
|
|||||||
@ -242,6 +242,102 @@ var _ = Describe("LifecycleImplementation", func() {
|
|||||||
HaveKey("value")))
|
HaveKey("value")))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("injects the sidecar for a recovery-only cluster", func(ctx SpecContext) {
|
||||||
|
recoveryOnlyConfig := &config.PluginConfiguration{
|
||||||
|
RecoveryBarmanObjectName: "minio-store-recovery",
|
||||||
|
}
|
||||||
|
pod := &corev1.Pod{
|
||||||
|
TypeMeta: podTypeMeta,
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "test-pod"},
|
||||||
|
Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "postgres"}}},
|
||||||
|
}
|
||||||
|
podJSON, _ := json.Marshal(pod)
|
||||||
|
request := &lifecycle.OperatorLifecycleRequest{
|
||||||
|
ObjectDefinition: podJSON,
|
||||||
|
}
|
||||||
|
|
||||||
|
response, err := reconcileInstancePod(ctx, cluster, request, recoveryOnlyConfig, sidecarConfiguration{})
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Expect(response).NotTo(BeNil())
|
||||||
|
Expect(response.JsonPatch).NotTo(BeEmpty())
|
||||||
|
var patch []map[string]interface{}
|
||||||
|
Expect(json.Unmarshal(response.JsonPatch, &patch)).To(Succeed())
|
||||||
|
Expect(patch).To(ContainElement(HaveKeyWithValue("path", "/spec/initContainers")))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("does not inject the sidecar into a new pod of a recovery-only cluster "+
|
||||||
|
"that has already completed its initial bootstrap", func(ctx SpecContext) {
|
||||||
|
recoveryOnlyConfig := &config.PluginConfiguration{
|
||||||
|
RecoveryBarmanObjectName: "minio-store-recovery",
|
||||||
|
}
|
||||||
|
cluster.Status.LatestGeneratedNode = 1
|
||||||
|
pod := &corev1.Pod{
|
||||||
|
TypeMeta: podTypeMeta,
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "test-pod"},
|
||||||
|
Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "postgres"}}},
|
||||||
|
}
|
||||||
|
podJSON, _ := json.Marshal(pod)
|
||||||
|
request := &lifecycle.OperatorLifecycleRequest{
|
||||||
|
ObjectDefinition: podJSON,
|
||||||
|
OperationType: &lifecycle.OperatorOperationType{
|
||||||
|
Type: lifecycle.OperatorOperationType_TYPE_CREATE,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
response, err := reconcileInstancePod(ctx, cluster, request, recoveryOnlyConfig, sidecarConfiguration{})
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Expect(response).NotTo(BeNil())
|
||||||
|
Expect(response.JsonPatch).To(BeEmpty())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("keeps injecting the sidecar on EVALUATE for an already-bootstrapped recovery-only "+
|
||||||
|
"cluster, so the operator never sees drift against the pod's stored spec and rolls "+
|
||||||
|
"it out just to strip the sidecar", func(ctx SpecContext) {
|
||||||
|
recoveryOnlyConfig := &config.PluginConfiguration{
|
||||||
|
RecoveryBarmanObjectName: "minio-store-recovery",
|
||||||
|
}
|
||||||
|
cluster.Status.LatestGeneratedNode = 1
|
||||||
|
pod := &corev1.Pod{
|
||||||
|
TypeMeta: podTypeMeta,
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "test-pod"},
|
||||||
|
Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "postgres"}}},
|
||||||
|
}
|
||||||
|
podJSON, _ := json.Marshal(pod)
|
||||||
|
request := &lifecycle.OperatorLifecycleRequest{
|
||||||
|
ObjectDefinition: podJSON,
|
||||||
|
OperationType: &lifecycle.OperatorOperationType{
|
||||||
|
Type: lifecycle.OperatorOperationType_TYPE_EVALUATE,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
response, err := reconcileInstancePod(ctx, cluster, request, recoveryOnlyConfig, sidecarConfiguration{})
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Expect(response).NotTo(BeNil())
|
||||||
|
Expect(response.JsonPatch).NotTo(BeEmpty())
|
||||||
|
var patch []map[string]interface{}
|
||||||
|
Expect(json.Unmarshal(response.JsonPatch, &patch)).To(Succeed())
|
||||||
|
Expect(patch).To(ContainElement(HaveKeyWithValue("path", "/spec/initContainers")))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("does not mutate the pod when no object store is configured", func(ctx SpecContext) {
|
||||||
|
emptyConfig := &config.PluginConfiguration{}
|
||||||
|
pod := &corev1.Pod{
|
||||||
|
TypeMeta: podTypeMeta,
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "test-pod"},
|
||||||
|
Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "postgres"}}},
|
||||||
|
}
|
||||||
|
podJSON, _ := json.Marshal(pod)
|
||||||
|
request := &lifecycle.OperatorLifecycleRequest{
|
||||||
|
ObjectDefinition: podJSON,
|
||||||
|
}
|
||||||
|
|
||||||
|
response, err := reconcileInstancePod(ctx, cluster, request, emptyConfig, sidecarConfiguration{})
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Expect(response).NotTo(BeNil())
|
||||||
|
// An empty patch means the pod was left untouched: no sidecar injected.
|
||||||
|
Expect(response.JsonPatch).To(BeEmpty())
|
||||||
|
})
|
||||||
|
|
||||||
It("returns an error for invalid pod definition", func(ctx SpecContext) {
|
It("returns an error for invalid pod definition", func(ctx SpecContext) {
|
||||||
request := &lifecycle.OperatorLifecycleRequest{
|
request := &lifecycle.OperatorLifecycleRequest{
|
||||||
ObjectDefinition: []byte("invalid-json"),
|
ObjectDefinition: []byte("invalid-json"),
|
||||||
|
|||||||
@ -44,9 +44,6 @@ type CNPGI struct {
|
|||||||
|
|
||||||
// Start starts the GRPC service
|
// Start starts the GRPC service
|
||||||
func (c *CNPGI) Start(ctx context.Context) error {
|
func (c *CNPGI) Start(ctx context.Context) error {
|
||||||
// PgWalVolumePgWalPath is the path of pg_wal directory inside the WAL volume when present
|
|
||||||
const PgWalVolumePgWalPath = "/var/lib/postgresql/wal/pg_wal"
|
|
||||||
|
|
||||||
enrich := func(server *grpc.Server) error {
|
enrich := func(server *grpc.Server) error {
|
||||||
wal.RegisterWALServer(server, common.WALServiceImplementation{
|
wal.RegisterWALServer(server, common.WALServiceImplementation{
|
||||||
InstanceName: c.InstanceName,
|
InstanceName: c.InstanceName,
|
||||||
@ -60,7 +57,7 @@ func (c *CNPGI) Start(ctx context.Context) error {
|
|||||||
Client: c.Client,
|
Client: c.Client,
|
||||||
SpoolDirectory: c.SpoolDirectory,
|
SpoolDirectory: c.SpoolDirectory,
|
||||||
PgDataPath: c.PGDataPath,
|
PgDataPath: c.PGDataPath,
|
||||||
PgWalFolderToSymlink: PgWalVolumePgWalPath,
|
PgWalFolderToSymlink: common.PgWalVolumePgWalPath,
|
||||||
})
|
})
|
||||||
|
|
||||||
common.AddHealthCheck(server)
|
common.AddHealthCheck(server)
|
||||||
|
|||||||
@ -121,8 +121,8 @@ func newS3ClientDeployment(namespace string) *appsv1.Deployment {
|
|||||||
{
|
{
|
||||||
Name: s3ClientName,
|
Name: s3ClientName,
|
||||||
// renovate: datasource=docker depName=amazon/aws-cli versioning=docker
|
// renovate: datasource=docker depName=amazon/aws-cli versioning=docker
|
||||||
// Version: 2.36.7
|
// Version: 2.36.8
|
||||||
Image: "docker.io/amazon/aws-cli@sha256:5b76c069e37cfa091ec6398dc683c09e0c9ef8ae2e557b0a36d931df34011227",
|
Image: "docker.io/amazon/aws-cli@sha256:7e1b11a3c93bc5af81f496de0662f666b2352a4a6666e8ebae904fe102b131b6",
|
||||||
Command: []string{"sleep", "infinity"},
|
Command: []string{"sleep", "infinity"},
|
||||||
Env: []corev1.EnvVar{
|
Env: []corev1.EnvVar{
|
||||||
{
|
{
|
||||||
|
|||||||
120
web/yarn.lock
120
web/yarn.lock
@ -2017,24 +2017,24 @@
|
|||||||
tslib "^2.4.0"
|
tslib "^2.4.0"
|
||||||
|
|
||||||
"@emnapi/core@^1.4.3":
|
"@emnapi/core@^1.4.3":
|
||||||
version "1.11.2"
|
version "1.11.3"
|
||||||
resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.11.2.tgz#fab0a0f3c492d11f5a9ac9065d0d73955ee1c1c9"
|
resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.11.3.tgz#5e95348a42cd1e06f0b9aa380cd74091daa4d520"
|
||||||
integrity sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==
|
integrity sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@emnapi/wasi-threads" "1.2.2"
|
"@emnapi/wasi-threads" "1.2.3"
|
||||||
tslib "^2.4.0"
|
tslib "^2.4.0"
|
||||||
|
|
||||||
"@emnapi/runtime@^1.4.3":
|
"@emnapi/runtime@^1.4.3":
|
||||||
version "1.11.2"
|
version "1.11.3"
|
||||||
resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.11.2.tgz#eb22f04d76febfdf4f87fdaff54c8a53f6bf0dbd"
|
resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.11.3.tgz#84257ae3b0531eb2aec1ffa23d70700da007ba95"
|
||||||
integrity sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==
|
integrity sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib "^2.4.0"
|
tslib "^2.4.0"
|
||||||
|
|
||||||
"@emnapi/wasi-threads@1.2.2":
|
"@emnapi/wasi-threads@1.2.3":
|
||||||
version "1.2.2"
|
version "1.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz#4c93becf5bfa3b13d1bbdcc06aee38321ad8139a"
|
resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz#c9bf72fd4be5b928aee894820e8d814ed73916e9"
|
||||||
integrity sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==
|
integrity sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib "^2.4.0"
|
tslib "^2.4.0"
|
||||||
|
|
||||||
@ -3318,11 +3318,6 @@ accepts@~1.3.8:
|
|||||||
mime-types "~2.1.34"
|
mime-types "~2.1.34"
|
||||||
negotiator "0.6.3"
|
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:
|
acorn-jsx@^5.0.0:
|
||||||
version "5.3.2"
|
version "5.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
|
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"
|
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
|
||||||
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
|
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
|
||||||
|
|
||||||
baseline-browser-mapping@^2.10.42:
|
baseline-browser-mapping@^2.10.44:
|
||||||
version "2.10.43"
|
version "2.11.4"
|
||||||
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.43.tgz#7b5d11590ce5acdbe4859443e3c940e81ce8c02d"
|
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.4.tgz#3da1a877a8be2ec06495123ce994b43af58cc55e"
|
||||||
integrity sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==
|
integrity sha512-s4+sLr9mZ/CyqeRritFeYV/Zx73OAtmaHn6kkBS1XRoJn1hrg3xIDUcpicAEX68tkcIN0iBCgti31C8zxtkhsQ==
|
||||||
|
|
||||||
batch@0.6.1:
|
batch@0.6.1:
|
||||||
version "0.6.1"
|
version "0.6.1"
|
||||||
@ -3663,13 +3658,13 @@ braces@^3.0.3, braces@~3.0.2:
|
|||||||
fill-range "^7.1.1"
|
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:
|
browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.28.1, browserslist@^4.28.6:
|
||||||
version "4.28.6"
|
version "4.28.7"
|
||||||
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.6.tgz#7cf83afcd69c55fde6fb2dcc5039ff0f4ba42610"
|
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.7.tgz#409046517fccd2e51cdc20f077454b7141184028"
|
||||||
integrity sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==
|
integrity sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==
|
||||||
dependencies:
|
dependencies:
|
||||||
baseline-browser-mapping "^2.10.42"
|
baseline-browser-mapping "^2.10.44"
|
||||||
caniuse-lite "^1.0.30001803"
|
caniuse-lite "^1.0.30001806"
|
||||||
electron-to-chromium "^1.5.389"
|
electron-to-chromium "^1.5.393"
|
||||||
node-releases "^2.0.51"
|
node-releases "^2.0.51"
|
||||||
update-browserslist-db "^1.2.3"
|
update-browserslist-db "^1.2.3"
|
||||||
|
|
||||||
@ -3777,7 +3772,7 @@ caniuse-api@^3.0.0:
|
|||||||
lodash.memoize "^4.1.2"
|
lodash.memoize "^4.1.2"
|
||||||
lodash.uniq "^4.5.0"
|
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"
|
version "1.0.30001806"
|
||||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz#1bc8e502b723fa393455dfbedd5ccec0c29bb74e"
|
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz#1bc8e502b723fa393455dfbedd5ccec0c29bb74e"
|
||||||
integrity sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==
|
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"
|
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
|
||||||
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
|
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
|
||||||
|
|
||||||
electron-to-chromium@^1.5.389:
|
electron-to-chromium@^1.5.393:
|
||||||
version "1.5.393"
|
version "1.5.396"
|
||||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.393.tgz#aec971df2a6f4f7e51fbacb200d66cebfc7d3c17"
|
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.396.tgz#4aa96428486c8d1c9c8aeb205b2d6e04928ca046"
|
||||||
integrity sha512-kiDJdIUawuEIcp9XoICKp1iTYDEbgguIPq526N1Q7jIQDeQ3CqoMx71025PI/7E48Ddtw2HuWsVjY7afEgNxmg==
|
integrity sha512-yHiw2Y3C3H9U6TMbOfoWK/BPreiOPXRfTWPBwQBoZG6/8TB6eOPnsy5oaRYuatR7Fw2SJ4kKforgufeo7fq0EQ==
|
||||||
|
|
||||||
emoji-regex@^8.0.0:
|
emoji-regex@^8.0.0:
|
||||||
version "8.0.0"
|
version "8.0.0"
|
||||||
@ -4615,10 +4610,10 @@ encoding-sniffer@^0.2.1:
|
|||||||
iconv-lite "^0.6.3"
|
iconv-lite "^0.6.3"
|
||||||
whatwg-encoding "^3.1.1"
|
whatwg-encoding "^3.1.1"
|
||||||
|
|
||||||
enhanced-resolve@^5.22.2:
|
enhanced-resolve@^5.24.2:
|
||||||
version "5.24.2"
|
version "5.24.3"
|
||||||
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.24.2.tgz#f25d703a24431cb1e02f944adb74aefa4fcb8d7e"
|
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.24.3.tgz#406bbf1ec20971265a30254f08030fce6a8207fe"
|
||||||
integrity sha512-rpsZEGT1jFuve6QlpyRp9ckQ+kN61hvF9BzCPyMdaKTm8UJce96KBn3sorXOFXlzjPrs3Vc4T1NsSroZ3PxlFw==
|
integrity sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
graceful-fs "^4.2.4"
|
graceful-fs "^4.2.4"
|
||||||
tapable "^2.3.3"
|
tapable "^2.3.3"
|
||||||
@ -5043,9 +5038,9 @@ fs-extra@^10.0.0:
|
|||||||
universalify "^2.0.0"
|
universalify "^2.0.0"
|
||||||
|
|
||||||
fs-extra@^11.1.1, fs-extra@^11.2.0:
|
fs-extra@^11.1.1, fs-extra@^11.2.0:
|
||||||
version "11.3.6"
|
version "11.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.6.tgz#f7cb80e9df550cd1db6f537fa5cdd568d3e70d10"
|
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.4.0.tgz#f88ed6d180ac9e14b61b08e679468f0b1b6b4730"
|
||||||
integrity sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==
|
integrity sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==
|
||||||
dependencies:
|
dependencies:
|
||||||
graceful-fs "^4.2.0"
|
graceful-fs "^4.2.0"
|
||||||
jsonfile "^6.0.1"
|
jsonfile "^6.0.1"
|
||||||
@ -5417,9 +5412,9 @@ html-void-elements@^3.0.0:
|
|||||||
integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==
|
integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==
|
||||||
|
|
||||||
html-webpack-plugin@^5.6.0:
|
html-webpack-plugin@^5.6.0:
|
||||||
version "5.6.7"
|
version "5.6.8"
|
||||||
resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz#429bab4e12abf3c07e1c608886608e2df2c06b11"
|
resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.8.tgz#5425dbc63eb533ffa59e92342be94894a125fc23"
|
||||||
integrity sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==
|
integrity sha512-MZmKQcTnhEh1SPSyMiEytIeDZDUoBZVorNHivQGXMASHf/BSGGOrKa2xQ5bGx3TCe1n109ecCt+cpww7wwWhKA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/html-minifier-terser" "^6.0.0"
|
"@types/html-minifier-terser" "^6.0.0"
|
||||||
html-minifier-terser "^6.0.2"
|
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"
|
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
|
||||||
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
|
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:
|
loader-utils@^2.0.0:
|
||||||
version "2.0.4"
|
version "2.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c"
|
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==
|
integrity sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==
|
||||||
|
|
||||||
postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.33, postcss@^8.5.4:
|
postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.33, postcss@^8.5.4:
|
||||||
version "8.5.20"
|
version "8.5.23"
|
||||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.20.tgz#316a139da79484ce55969fa7bb6f2f1abcc14060"
|
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.23.tgz#3493550116f478487298301d2c2e8dc5a56e6594"
|
||||||
integrity sha512-lW616l85ucIQL+FocMmL7pQFPqBmwejrCMg+iPxyImlrANNJG9NHq/RkyCZopDhd8C3LA03PHRJDjkbGu8vvug==
|
integrity sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==
|
||||||
dependencies:
|
dependencies:
|
||||||
nanoid "^3.3.16"
|
nanoid "^3.3.16"
|
||||||
picocolors "^1.1.1"
|
picocolors "^1.1.1"
|
||||||
@ -8390,9 +8380,9 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1:
|
|||||||
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
|
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
|
||||||
|
|
||||||
sax@^1.2.4, sax@^1.5.0:
|
sax@^1.2.4, sax@^1.5.0:
|
||||||
version "1.6.0"
|
version "1.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.0.tgz#da59637629307b97e7c4cb28e080a7bc38560d5b"
|
resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.1.tgz#4c23cf608c0b693ab54b4b5888e92cfe977b9843"
|
||||||
integrity sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==
|
integrity sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==
|
||||||
|
|
||||||
scheduler@^0.27.0:
|
scheduler@^0.27.0:
|
||||||
version "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"
|
source-map-support "~0.5.20"
|
||||||
|
|
||||||
thingies@^2.5.0:
|
thingies@^2.5.0:
|
||||||
version "2.6.0"
|
version "2.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.6.0.tgz#e09b98b9e6f6caf8a759eca8481fea1de974d2b1"
|
resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.6.1.tgz#4eb28e2585a75288f1765a0b08f1dfa020357a6f"
|
||||||
integrity sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==
|
integrity sha512-cV/CMGTK3M4MlnJ/0At6ismOw/A0EEniDNScajjz/Br3c1sqE72YD01rGpPTKwd27wAxI5Pr+6+0w8yofzFRYw==
|
||||||
|
|
||||||
thunky@^1.0.2:
|
thunky@^1.0.2:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
@ -9044,9 +9034,9 @@ undici-types@~8.3.0:
|
|||||||
integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==
|
integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==
|
||||||
|
|
||||||
undici@^7.19.0:
|
undici@^7.19.0:
|
||||||
version "7.28.0"
|
version "7.29.0"
|
||||||
resolved "https://registry.yarnpkg.com/undici/-/undici-7.28.0.tgz#97d64564198b285bc281f0e8e29597e3d11fe7ec"
|
resolved "https://registry.yarnpkg.com/undici/-/undici-7.29.0.tgz#ae0f6f62e06e057a9cbb7b2b5fde2bb74f791b8f"
|
||||||
integrity sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==
|
integrity sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==
|
||||||
|
|
||||||
unicode-canonical-property-names-ecmascript@^2.0.0:
|
unicode-canonical-property-names-ecmascript@^2.0.0:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
@ -9355,15 +9345,15 @@ webpack-merge@^6.0.1:
|
|||||||
flat "^5.0.2"
|
flat "^5.0.2"
|
||||||
wildcard "^2.0.1"
|
wildcard "^2.0.1"
|
||||||
|
|
||||||
webpack-sources@^3.5.0:
|
webpack-sources@^3.5.1:
|
||||||
version "3.5.1"
|
version "3.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.5.1.tgz#76c2418486dcc02b2aa0694c104176c2858fe84a"
|
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.5.1.tgz#76c2418486dcc02b2aa0694c104176c2858fe84a"
|
||||||
integrity sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==
|
integrity sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==
|
||||||
|
|
||||||
webpack@^5.88.1, webpack@^5.95.0:
|
webpack@^5.88.1, webpack@^5.95.0:
|
||||||
version "5.108.4"
|
version "5.109.0"
|
||||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.108.4.tgz#141818a411662773a0bb32dc5536acc5409943b7"
|
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.109.0.tgz#871d8eee5e2d5e6eaf5ec8d1a6db74ea65491030"
|
||||||
integrity sha512-yur8LyJoeiWh47dErD+Ok7vlbmDsJ3UbbRPAoxbGJ54WpE2y5yVo5G/inUzujnYgw3tPmBRdn+G7PoxXaYC33w==
|
integrity sha512-vomrngskVVXEZF9sMZfYAd4pXZUnfaWdJGlF+BTNF+gJBCKYCQBnOeVPlrh39Ewl7nlCsirDplMy6o5g9xJHBg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/estree" "^1.0.8"
|
"@types/estree" "^1.0.8"
|
||||||
"@types/json-schema" "^7.0.15"
|
"@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-edit" "^1.14.1"
|
||||||
"@webassemblyjs/wasm-parser" "^1.14.1"
|
"@webassemblyjs/wasm-parser" "^1.14.1"
|
||||||
acorn "^8.16.0"
|
acorn "^8.16.0"
|
||||||
acorn-import-phases "^1.0.3"
|
|
||||||
browserslist "^4.28.1"
|
browserslist "^4.28.1"
|
||||||
chrome-trace-event "^1.0.2"
|
chrome-trace-event "^1.0.2"
|
||||||
enhanced-resolve "^5.22.2"
|
enhanced-resolve "^5.24.2"
|
||||||
es-module-lexer "^2.1.0"
|
es-module-lexer "^2.1.0"
|
||||||
eslint-scope "5.1.1"
|
eslint-scope "5.1.1"
|
||||||
events "^3.2.0"
|
events "^3.2.0"
|
||||||
graceful-fs "^4.2.11"
|
graceful-fs "^4.2.11"
|
||||||
loader-runner "^4.3.2"
|
|
||||||
mime-db "^1.54.0"
|
mime-db "^1.54.0"
|
||||||
minimizer-webpack-plugin "^5.6.1"
|
minimizer-webpack-plugin "^5.6.1"
|
||||||
neo-async "^2.6.2"
|
neo-async "^2.6.2"
|
||||||
schema-utils "^4.3.3"
|
schema-utils "^4.3.3"
|
||||||
tapable "^2.3.0"
|
tapable "^2.3.0"
|
||||||
watchpack "^2.5.2"
|
watchpack "^2.5.2"
|
||||||
webpack-sources "^3.5.0"
|
webpack-sources "^3.5.1"
|
||||||
|
|
||||||
webpackbar@^7.0.0:
|
webpackbar@^7.0.0:
|
||||||
version "7.0.0"
|
version "7.0.0"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user