diff --git a/e2e-tests/tests/backup-enable-disable/01-create-cluster.yaml b/e2e-tests/tests/backup-enable-disable/01-create-cluster.yaml index 16352f5a55..08a3d610a5 100644 --- a/e2e-tests/tests/backup-enable-disable/01-create-cluster.yaml +++ b/e2e-tests/tests/backup-enable-disable/01-create-cluster.yaml @@ -8,5 +8,5 @@ commands: source ../../functions get_cr "some-name" ${RANDOM} \ - | yq '.spec.backups.enabled=false' \ + | yq '.spec.backups.enabled=false | del(.spec.backups.pgbackrest)' \ | kubectl -n "${NAMESPACE}" apply -f - diff --git a/internal/config/config.go b/internal/config/config.go index 6b4d6b8991..c16c3a43ec 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -135,8 +135,10 @@ func PGONamespace() string { func VerifyImageValues(cluster *v1beta1.PostgresCluster) error { var images []string + backupsEnabled := cluster.Spec.Backups.Enabled == nil || *cluster.Spec.Backups.Enabled + dataSourceRestore := cluster.Spec.DataSource != nil && cluster.Spec.DataSource.PostgresCluster != nil // K8SPG-710: Image check will fail without a backup section in PostgresCluster - if cluster.BackupSpecFound() && PGBackRestContainerImage(cluster) == "" { + if (cluster.BackupSpecFound() && backupsEnabled || dataSourceRestore) && PGBackRestContainerImage(cluster) == "" { images = append(images, "crunchy-pgbackrest") } if PGAdminContainerImage(cluster) == "" && diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 12c80d65ce..e779476d24 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -6,6 +6,7 @@ package config import ( "os" + "strings" "testing" "gotest.tools/v3/assert" @@ -201,57 +202,142 @@ func TestPostgresContainerImage(t *testing.T) { } func TestVerifyImageValues(t *testing.T) { - cluster := &v1beta1.PostgresCluster{} - - verifyImageCheck := func(t *testing.T, envVar, errString string, cluster *v1beta1.PostgresCluster) { - t.Setenv(envVar, "") - os.Unsetenv(envVar) - err := VerifyImageValues(cluster) - assert.ErrorContains(t, err, errString) - } - t.Run("crunchy-postgres", func(t *testing.T) { + cluster := &v1beta1.PostgresCluster{} cluster.Spec.PostgresVersion = 14 - verifyImageCheck(t, "RELATED_IMAGE_POSTGRES_14", "crunchy-postgres", cluster) + t.Setenv("RELATED_IMAGE_POSTGRES_14", "") + os.Unsetenv("RELATED_IMAGE_POSTGRES_14") + + err := VerifyImageValues(cluster) + assert.ErrorContains(t, err, "crunchy-postgres") }) t.Run("crunchy-postgres-gis", func(t *testing.T) { + cluster := &v1beta1.PostgresCluster{} + cluster.Spec.PostgresVersion = 14 cluster.Spec.PostGISVersion = "3.3" - verifyImageCheck(t, "RELATED_IMAGE_POSTGRES_14_GIS_3.3", "crunchy-postgres-gis", cluster) + t.Setenv("RELATED_IMAGE_POSTGRES_14_GIS_3.3", "") + os.Unsetenv("RELATED_IMAGE_POSTGRES_14_GIS_3.3") + + err := VerifyImageValues(cluster) + assert.ErrorContains(t, err, "crunchy-postgres-gis") }) - // K8SPG-710: Image check will fail without a backup section in PostgresCluster - // t.Run("crunchy-pgbackrest", func(t *testing.T) { - // verifyImageCheck(t, "RELATED_IMAGE_PGBACKREST", "crunchy-pgbackrest", cluster) - // }) + t.Run("crunchy-pgbackrest-enabled", func(t *testing.T) { + cluster := &v1beta1.PostgresCluster{} + cluster.Spec.PostgresVersion = 14 + enabled := true + cluster.Spec.Backups.Enabled = &enabled + t.Setenv("RELATED_IMAGE_PGBACKREST", "") + os.Unsetenv("RELATED_IMAGE_PGBACKREST") + + err := VerifyImageValues(cluster) + assert.ErrorContains(t, err, "crunchy-pgbackrest") + }) + + t.Run("crunchy-pgbackrest-disabled", func(t *testing.T) { + cluster := &v1beta1.PostgresCluster{} + cluster.Spec.PostgresVersion = 14 + enabled := false + cluster.Spec.Backups.Enabled = &enabled + t.Setenv("RELATED_IMAGE_PGBACKREST", "") + os.Unsetenv("RELATED_IMAGE_PGBACKREST") + + err := VerifyImageValues(cluster) + assert.Assert(t, !strings.Contains(err.Error(), "crunchy-pgbackrest")) + }) t.Run("crunchy-pgbouncer", func(t *testing.T) { - cluster.Spec.Proxy = new(v1beta1.PostgresProxySpec) - cluster.Spec.Proxy.PGBouncer = new(v1beta1.PGBouncerPodSpec) - verifyImageCheck(t, "RELATED_IMAGE_PGBOUNCER", "crunchy-pgbouncer", cluster) + cluster := &v1beta1.PostgresCluster{} + cluster.Spec.PostgresVersion = 14 + cluster.Spec.Proxy = &v1beta1.PostgresProxySpec{ + PGBouncer: &v1beta1.PGBouncerPodSpec{}, + } + t.Setenv("RELATED_IMAGE_PGBOUNCER", "") + os.Unsetenv("RELATED_IMAGE_PGBOUNCER") + + err := VerifyImageValues(cluster) + assert.ErrorContains(t, err, "crunchy-pgbouncer") }) t.Run("crunchy-pgadmin4", func(t *testing.T) { - cluster.Spec.UserInterface = new(v1beta1.UserInterfaceSpec) - cluster.Spec.UserInterface.PGAdmin = new(v1beta1.PGAdminPodSpec) - verifyImageCheck(t, "RELATED_IMAGE_PGADMIN", "crunchy-pgadmin4", cluster) + cluster := &v1beta1.PostgresCluster{} + cluster.Spec.PostgresVersion = 14 + cluster.Spec.UserInterface = &v1beta1.UserInterfaceSpec{ + PGAdmin: &v1beta1.PGAdminPodSpec{}, + } + t.Setenv("RELATED_IMAGE_PGADMIN", "") + os.Unsetenv("RELATED_IMAGE_PGADMIN") + + err := VerifyImageValues(cluster) + assert.ErrorContains(t, err, "crunchy-pgadmin4") }) t.Run("crunchy-postgres-exporter", func(t *testing.T) { - cluster.Spec.Monitoring = new(v1beta1.MonitoringSpec) - cluster.Spec.Monitoring.PGMonitor = new(v1beta1.PGMonitorSpec) - cluster.Spec.Monitoring.PGMonitor.Exporter = new(v1beta1.ExporterSpec) - verifyImageCheck(t, "RELATED_IMAGE_PGEXPORTER", "crunchy-postgres-exporter", cluster) + cluster := &v1beta1.PostgresCluster{} + cluster.Spec.PostgresVersion = 14 + cluster.Spec.Monitoring = &v1beta1.MonitoringSpec{ + PGMonitor: &v1beta1.PGMonitorSpec{ + Exporter: &v1beta1.ExporterSpec{}, + }, + } + t.Setenv("RELATED_IMAGE_PGEXPORTER", "") + os.Unsetenv("RELATED_IMAGE_PGEXPORTER") + + err := VerifyImageValues(cluster) + assert.ErrorContains(t, err, "crunchy-postgres-exporter") }) - t.Run("multiple images", func(t *testing.T) { + t.Run("multiple missing images", func(t *testing.T) { + enabled := true + cluster := &v1beta1.PostgresCluster{} + cluster.Spec.PostgresVersion = 14 + cluster.Spec.PostGISVersion = "3.3" + cluster.Spec.Backups.Enabled = &enabled + cluster.Spec.Proxy = &v1beta1.PostgresProxySpec{ + PGBouncer: &v1beta1.PGBouncerPodSpec{}, + } + cluster.Spec.UserInterface = &v1beta1.UserInterfaceSpec{ + PGAdmin: &v1beta1.PGAdminPodSpec{}, + } + cluster.Spec.Monitoring = &v1beta1.MonitoringSpec{ + PGMonitor: &v1beta1.PGMonitorSpec{ + Exporter: &v1beta1.ExporterSpec{}, + }, + } + err := VerifyImageValues(cluster) assert.ErrorContains(t, err, "crunchy-postgres-gis") - // K8SPG-710: Image check will fail without a backup section in PostgresCluster - // assert.ErrorContains(t, err, "crunchy-pgbackrest") + assert.ErrorContains(t, err, "crunchy-pgbackrest") assert.ErrorContains(t, err, "crunchy-pgbouncer") assert.ErrorContains(t, err, "crunchy-pgadmin4") assert.ErrorContains(t, err, "crunchy-postgres-exporter") }) + t.Run("all images set", func(t *testing.T) { + enabled := true + cluster := &v1beta1.PostgresCluster{} + cluster.Spec.PostgresVersion = 14 + cluster.Spec.PostGISVersion = "3.3" + cluster.Spec.Backups.Enabled = &enabled + cluster.Spec.Proxy = &v1beta1.PostgresProxySpec{ + PGBouncer: &v1beta1.PGBouncerPodSpec{}, + } + cluster.Spec.UserInterface = &v1beta1.UserInterfaceSpec{ + PGAdmin: &v1beta1.PGAdminPodSpec{}, + } + cluster.Spec.Monitoring = &v1beta1.MonitoringSpec{ + PGMonitor: &v1beta1.PGMonitorSpec{ + Exporter: &v1beta1.ExporterSpec{}, + }, + } + + t.Setenv("RELATED_IMAGE_POSTGRES_14_GIS_3.3", "img") + t.Setenv("RELATED_IMAGE_PGBACKREST", "img") + t.Setenv("RELATED_IMAGE_PGBOUNCER", "img") + t.Setenv("RELATED_IMAGE_PGADMIN", "img") + t.Setenv("RELATED_IMAGE_PGEXPORTER", "img") + + assert.NilError(t, VerifyImageValues(cluster)) + }) } diff --git a/internal/controller/postgrescluster/pki.go b/internal/controller/postgrescluster/pki.go index ba742cf815..1b02fcb772 100644 --- a/internal/controller/postgrescluster/pki.go +++ b/internal/controller/postgrescluster/pki.go @@ -372,7 +372,8 @@ func (r *Reconciler) isCertManagerInstalled(ctx context.Context, ns string) (boo case errors.Is(err, certmanager.ErrCertManagerNotFound): return false, nil case errors.Is(err, certmanager.ErrCertManagerNotReady): - return true, nil + logging.FromContext(ctx).Info("cert-manager is not ready, falling back to internal PKI") + return false, nil } return false, err } diff --git a/percona/certmanager/certmanager.go b/percona/certmanager/certmanager.go index f2a36e1677..32da04857e 100644 --- a/percona/certmanager/certmanager.go +++ b/percona/certmanager/certmanager.go @@ -83,7 +83,7 @@ func (c *controller) Check(ctx context.Context, config *rest.Config, ns string) case errors.Is(err, cmapichecker.ErrCertManagerCRDsNotFound): return ErrCertManagerNotFound case errors.Is(err, cmapichecker.ErrWebhookCertificateFailure), errors.Is(err, cmapichecker.ErrWebhookServiceFailure), errors.Is(err, cmapichecker.ErrWebhookDeploymentFailure): - log.Error(cmapichecker.TranslateToSimpleError(err), "cert-manager is not ready") + log.Info("cert-manager is not ready", "reason", cmapichecker.TranslateToSimpleError(err)) return ErrCertManagerNotReady } return err